Browse Source

Merge pull request #956 from MediaBrowser/dev

3.0.5464.40000
Luke 10 years ago
parent
commit
a7f2bc5fda
69 changed files with 571 additions and 270 deletions
  1. 1 1
      MediaBrowser.Api/PackageReviewService.cs
  2. 92 21
      MediaBrowser.Api/Sync/SyncService.cs
  3. 17 16
      MediaBrowser.Common.Implementations/BaseApplicationHost.cs
  4. 12 1
      MediaBrowser.Common.Implementations/Logging/NLogger.cs
  5. 7 1
      MediaBrowser.Common.Implementations/Logging/NlogManager.cs
  6. 1 0
      MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj
  7. 13 0
      MediaBrowser.Common.Implementations/Security/MbAdmin.cs
  8. 2 4
      MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
  9. 3 4
      MediaBrowser.Common.Implementations/Updates/InstallationManager.cs
  10. 0 15
      MediaBrowser.Controller/Entities/BaseItem.cs
  11. 5 1
      MediaBrowser.Controller/Entities/Video.cs
  12. 21 0
      MediaBrowser.Controller/Sync/ISyncManager.cs
  13. 12 11
      MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
  14. 6 0
      MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
  15. 6 0
      MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
  16. 29 0
      MediaBrowser.Model/ApiClient/IApiClient.cs
  17. 6 0
      MediaBrowser.Model/Logging/ILogManager.cs
  18. 1 0
      MediaBrowser.Model/MediaBrowser.Model.csproj
  19. 24 0
      MediaBrowser.Model/Sync/SyncDialogOptions.cs
  20. 10 1
      MediaBrowser.Model/Sync/SyncHelper.cs
  21. 10 0
      MediaBrowser.Model/Sync/SyncJobItemQuery.cs
  22. 5 0
      MediaBrowser.Model/Sync/SyncJobQuery.cs
  23. 1 1
      MediaBrowser.Server.Implementations/EntryPoints/UsageReporter.cs
  24. 16 16
      MediaBrowser.Server.Implementations/Localization/JavaScript/de.json
  25. 4 4
      MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json
  26. 8 8
      MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json
  27. 3 1
      MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
  28. 16 16
      MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json
  29. 15 15
      MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json
  30. 7 7
      MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json
  31. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/ar.json
  32. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/ca.json
  33. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/cs.json
  34. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/da.json
  35. 5 5
      MediaBrowser.Server.Implementations/Localization/Server/de.json
  36. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/el.json
  37. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/en_GB.json
  38. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/en_US.json
  39. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/es.json
  40. 6 6
      MediaBrowser.Server.Implementations/Localization/Server/es_MX.json
  41. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/fi.json
  42. 8 8
      MediaBrowser.Server.Implementations/Localization/Server/fr.json
  43. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/he.json
  44. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/hr.json
  45. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/it.json
  46. 5 5
      MediaBrowser.Server.Implementations/Localization/Server/kk.json
  47. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/ko.json
  48. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/ms.json
  49. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/nb.json
  50. 5 5
      MediaBrowser.Server.Implementations/Localization/Server/nl.json
  51. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/pl.json
  52. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json
  53. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json
  54. 11 11
      MediaBrowser.Server.Implementations/Localization/Server/ru.json
  55. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/sv.json
  56. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/tr.json
  57. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/vi.json
  58. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json
  59. 3 3
      MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json
  60. 42 7
      MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
  61. 25 1
      MediaBrowser.Server.Implementations/Sync/SyncManager.cs
  62. 15 0
      MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
  63. 19 0
      MediaBrowser.Server.Startup.Common/ApplicationHost.cs
  64. 1 2
      MediaBrowser.ServerApplication/MainStartup.cs
  65. 2 2
      Nuget/MediaBrowser.Common.Internal.nuspec
  66. 1 1
      Nuget/MediaBrowser.Common.nuspec
  67. 1 1
      Nuget/MediaBrowser.Model.Signed.nuspec
  68. 2 2
      Nuget/MediaBrowser.Server.Core.nuspec
  69. 1 1
      SharedVersion.cs

+ 1 - 1
MediaBrowser.Api/PackageReviewService.cs

@@ -102,7 +102,7 @@ namespace MediaBrowser.Api
         private readonly IHttpClient _httpClient;
         private readonly INetworkManager _netManager;
         private readonly IJsonSerializer _serializer;
-        private const string MbAdminUrl = "https://www.mb3admin.com/admin/";
+        private const string MbAdminUrl = "http://www.mb3admin.com/admin/";
 
         public PackageReviewService(IHttpClient client, INetworkManager net, IJsonSerializer serializer)
         {

+ 92 - 21
MediaBrowser.Api/Sync/SyncService.cs

@@ -1,9 +1,14 @@
-using MediaBrowser.Controller.Net;
+using MediaBrowser.Controller.Dto;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Sync;
+using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Sync;
 using ServiceStack;
+using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Threading.Tasks;
 
 namespace MediaBrowser.Api.Sync
@@ -22,22 +27,14 @@ namespace MediaBrowser.Api.Sync
         public string Id { get; set; }
     }
 
+    [Route("/Sync/JobItems", "GET", Summary = "Gets sync job items.")]
+    public class GetSyncJobItems : SyncJobItemQuery, IReturn<QueryResult<SyncJobItem>>
+    {
+    }
+
     [Route("/Sync/Jobs", "GET", Summary = "Gets sync jobs.")]
-    public class GetSyncJobs : IReturn<QueryResult<SyncJob>>
+    public class GetSyncJobs : SyncJobQuery, IReturn<QueryResult<SyncJob>>
     {
-        /// <summary>
-        /// Skips over a given number of items within the results. Use for paging.
-        /// </summary>
-        /// <value>The start index.</value>
-        [ApiMember(Name = "StartIndex", Description = "Optional. The record index to start at. All items with a lower index will be dropped from the results.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
-        public int? StartIndex { get; set; }
-
-        /// <summary>
-        /// The maximum number of items to return
-        /// </summary>
-        /// <value>The limit.</value>
-        [ApiMember(Name = "Limit", Description = "Optional. The maximum number of records to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
-        public int? Limit { get; set; }
     }
 
     [Route("/Sync/Jobs", "POST", Summary = "Gets sync jobs.")]
@@ -52,14 +49,42 @@ namespace MediaBrowser.Api.Sync
         public string UserId { get; set; }
     }
 
+    [Route("/Sync/Options", "GET", Summary = "Gets a list of available sync targets.")]
+    public class GetSyncDialogOptions : IReturn<SyncDialogOptions>
+    {
+        [ApiMember(Name = "UserId", Description = "UserId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public string UserId { get; set; }
+
+        [ApiMember(Name = "ItemIds", Description = "ItemIds", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public string ItemIds { get; set; }
+    }
+
+    [Route("/Sync/JobItems/{Id}/Transferred", "POST", Summary = "Reports that a sync job item has successfully been transferred.")]
+    public class ReportSyncJobItemTransferred : IReturnVoid
+    {
+        [ApiMember(Name = "Id", Description = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
+        public string Id { get; set; }
+    }
+
+    [Route("/Sync/JobItems/{Id}/File", "GET", Summary = "Gets a sync job item file")]
+    public class GetSyncJobItemFile
+    {
+        [ApiMember(Name = "Id", Description = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+        public string Id { get; set; }
+    }
+
     [Authenticated]
     public class SyncService : BaseApiService
     {
         private readonly ISyncManager _syncManager;
+        private readonly IDtoService _dtoService;
+        private readonly ILibraryManager _libraryManager;
 
-        public SyncService(ISyncManager syncManager)
+        public SyncService(ISyncManager syncManager, IDtoService dtoService, ILibraryManager libraryManager)
         {
             _syncManager = syncManager;
+            _dtoService = dtoService;
+            _libraryManager = libraryManager;
         }
 
         public object Get(GetSyncTargets request)
@@ -71,11 +96,14 @@ namespace MediaBrowser.Api.Sync
 
         public object Get(GetSyncJobs request)
         {
-            var result = _syncManager.GetJobs(new SyncJobQuery
-            {
-                 StartIndex = request.StartIndex,
-                 Limit = request.Limit
-            });
+            var result = _syncManager.GetJobs(request);
+
+            return ToOptimizedResult(result);
+        }
+
+        public object Get(GetSyncJobItems request)
+        {
+            var result = _syncManager.GetJobItems(request);
 
             return ToOptimizedResult(result);
         }
@@ -100,5 +128,48 @@ namespace MediaBrowser.Api.Sync
 
             return ToOptimizedResult(result);
         }
+
+        public void Post(ReportSyncJobItemTransferred request)
+        {
+            var task = _syncManager.ReportSyncJobItemTransferred(request.Id);
+
+            Task.WaitAll(task);
+        }
+
+        public object Get(GetSyncJobItemFile request)
+        {
+            var jobItem = _syncManager.GetJobItem(request.Id);
+
+            if (jobItem.Status != SyncJobItemStatus.Transferring)
+            {
+                throw new ArgumentException("The job item is not yet ready for transfer.");
+            }
+
+            return ToStaticFileResult(jobItem.OutputPath);
+        }
+
+        public object Get(GetSyncDialogOptions request)
+        {
+            var result = new SyncDialogOptions();
+
+            result.Targets = _syncManager.GetSyncTargets(request.UserId)
+                .ToList();
+
+            var dtos = request.ItemIds.Split(',')
+                .Select(_libraryManager.GetItemById)
+                .Where(i => i != null)
+                .Select(i => _dtoService.GetBaseItemDto(i, new DtoOptions
+                {
+                    Fields = new List<ItemFields>
+                    {
+                        ItemFields.SyncInfo
+                    }
+                }))
+                .ToList();
+
+            result.Options = SyncHelper.GetSyncOptions(dtos);
+
+            return ToOptimizedResult(result);
+        }
     }
 }

+ 17 - 16
MediaBrowser.Common.Implementations/BaseApplicationHost.cs

@@ -294,19 +294,20 @@ namespace MediaBrowser.Common.Implementations
 
         public static void LogEnvironmentInfo(ILogger logger, IApplicationPaths appPaths, bool isStartup)
         {
-            if (isStartup)
-            {
-                logger.Info("Media Browser Server started");
-            }
+            logger.LogMultiline("Media Browser", LogSeverity.Info, GetBaseExceptionMessage(appPaths));
+        }
 
-            logger.Info("Command line: {0}", string.Join(" ", Environment.GetCommandLineArgs()));
+        protected static StringBuilder GetBaseExceptionMessage(IApplicationPaths appPaths)
+        {
+            var builder = new StringBuilder();
 
-            logger.Info("Server: {0}", Environment.MachineName);
-            logger.Info("Operating system: {0}", Environment.OSVersion.ToString());
-            logger.Info("Processor count: {0}", Environment.ProcessorCount);
-            logger.Info("64-Bit OS: {0}", Environment.Is64BitOperatingSystem);
-            logger.Info("64-Bit Process: {0}", Environment.Is64BitProcess);
-            logger.Info("Program data path: {0}", appPaths.ProgramDataPath);
+            builder.AppendLine(string.Format("Command line: {0}", string.Join(" ", Environment.GetCommandLineArgs())));
+
+            builder.AppendLine(string.Format("Operating system: {0}", Environment.OSVersion));
+            builder.AppendLine(string.Format("Processor count: {0}", Environment.ProcessorCount));
+            builder.AppendLine(string.Format("64-Bit OS: {0}", Environment.Is64BitOperatingSystem));
+            builder.AppendLine(string.Format("64-Bit Process: {0}", Environment.Is64BitProcess));
+            builder.AppendLine(string.Format("Program data path: {0}", appPaths.ProgramDataPath));
 
             Type type = Type.GetType("Mono.Runtime");
             if (type != null)
@@ -314,13 +315,13 @@ namespace MediaBrowser.Common.Implementations
                 MethodInfo displayName = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
                 if (displayName != null)
                 {
-                    logger.Info("Mono: " + displayName.Invoke(null, null));
+                    builder.AppendLine("Mono: " + displayName.Invoke(null, null));
                 }
-            } 
-            
-            logger.Info("Application Path: {0}", appPaths.ApplicationPath);
+            }
+
+            builder.AppendLine(string.Format("Application Path: {0}", appPaths.ApplicationPath));
 
-            logger.Info("*** When reporting issues please include the entire log file. ***".ToUpper());
+            return builder;
         }
 
         protected virtual IJsonSerializer CreateJsonSerializer()

+ 12 - 1
MediaBrowser.Common.Implementations/Logging/NLogger.cs

@@ -14,6 +14,8 @@ namespace MediaBrowser.Common.Implementations.Logging
         /// </summary>
         private readonly NLog.Logger _logger;
 
+        private readonly ILogManager _logManager;
+
         /// <summary>
         /// The _lock object
         /// </summary>
@@ -23,8 +25,10 @@ namespace MediaBrowser.Common.Implementations.Logging
         /// Initializes a new instance of the <see cref="NLogger" /> class.
         /// </summary>
         /// <param name="name">The name.</param>
-        public NLogger(string name)
+        /// <param name="logManager">The log manager.</param>
+        public NLogger(string name, ILogManager logManager)
         {
+            _logManager = logManager;
             lock (LockObject)
             {
                 _logger = NLog.LogManager.GetLogger(name);
@@ -96,6 +100,13 @@ namespace MediaBrowser.Common.Implementations.Logging
 
             var messageText = LogHelper.GetLogMessage(exception);
 
+            var prefix = _logManager.ExceptionMessagePrefix;
+
+            if (!string.IsNullOrWhiteSpace(prefix))
+            {
+                messageText.Insert(0, prefix);
+            }
+
             LogMultiline(message, level, messageText);
         }
 

+ 7 - 1
MediaBrowser.Common.Implementations/Logging/NlogManager.cs

@@ -34,6 +34,12 @@ namespace MediaBrowser.Common.Implementations.Logging
         /// <value>The log file path.</value>
         public string LogFilePath { get; private set; }
 
+        /// <summary>
+        /// Gets or sets the exception message prefix.
+        /// </summary>
+        /// <value>The exception message prefix.</value>
+        public string ExceptionMessagePrefix { get; set; }
+
         /// <summary>
         /// Initializes a new instance of the <see cref="NlogManager" /> class.
         /// </summary>
@@ -159,7 +165,7 @@ namespace MediaBrowser.Common.Implementations.Logging
         /// <returns>ILogger.</returns>
         public ILogger GetLogger(string name)
         {
-            return new NLogger(name);
+            return new NLogger(name, this);
         }
 
         /// <summary>

+ 1 - 0
MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj

@@ -95,6 +95,7 @@
     <Compile Include="ScheduledTasks\Tasks\DeleteCacheFileTask.cs" />
     <Compile Include="ScheduledTasks\Tasks\DeleteLogFileTask.cs" />
     <Compile Include="ScheduledTasks\Tasks\ReloadLoggerFileTask.cs" />
+    <Compile Include="Security\MbAdmin.cs" />
     <Compile Include="Security\MBLicenseFile.cs" />
     <Compile Include="Security\PluginSecurityManager.cs" />
     <Compile Include="Security\RegRecord.cs" />

+ 13 - 0
MediaBrowser.Common.Implementations/Security/MbAdmin.cs

@@ -0,0 +1,13 @@
+
+namespace MediaBrowser.Common.Implementations.Security
+{
+    public class MbAdmin
+    {
+        public const string HttpUrl = "http://www.mb3admin.com/admin/";
+        
+        /// <summary>
+        /// Leaving as http for now until we get it squared away
+        /// </summary>
+        public const string HttpsUrl = "http://www.mb3admin.com/admin/";
+    }
+}

+ 2 - 4
MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs

@@ -17,9 +17,7 @@ namespace MediaBrowser.Common.Implementations.Security
     /// </summary>
     public class PluginSecurityManager : ISecurityManager
     {
-        private const string MbAdminUrl = "https://www.mb3admin.com/admin/";
-        
-        private const string MBValidateUrl = MbAdminUrl + "service/registration/validate";
+        private const string MBValidateUrl = MbAdmin.HttpsUrl + "service/registration/validate";
 
         /// <summary>
         /// The _is MB supporter
@@ -162,7 +160,7 @@ namespace MediaBrowser.Common.Implementations.Security
                 return new SupporterInfo();
             }
 
-            var url = MbAdminUrl + "/service/supporter/retrieve?key=" + key;
+            var url = MbAdmin.HttpsUrl + "/service/supporter/retrieve?key=" + key;
 
             using (var stream = await _httpClient.Get(url, CancellationToken.None).ConfigureAwait(false))
             {

+ 3 - 4
MediaBrowser.Common.Implementations/Updates/InstallationManager.cs

@@ -1,5 +1,6 @@
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Events;
+using MediaBrowser.Common.Implementations.Security;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Plugins;
 using MediaBrowser.Common.Progress;
@@ -161,7 +162,7 @@ namespace MediaBrowser.Common.Implementations.Updates
                 { "systemid", _applicationHost.SystemId }
             };
 
-            using (var json = await _httpClient.Post(MbAdminUrlHttps + "service/package/retrieveall", data, cancellationToken).ConfigureAwait(false))
+            using (var json = await _httpClient.Post(MbAdmin.HttpsUrl + "service/package/retrieveall", data, cancellationToken).ConfigureAwait(false))
             {
                 cancellationToken.ThrowIfCancellationRequested();
 
@@ -172,8 +173,6 @@ namespace MediaBrowser.Common.Implementations.Updates
         }
 
         private Tuple<List<PackageInfo>, DateTime> _lastPackageListResult;
-        private const string MbAdminUrlHttp = "http://www.mb3admin.com/admin/";
-        private const string MbAdminUrlHttps = "https://www.mb3admin.com/admin/";
 
         /// <summary>
         /// Gets all available packages.
@@ -205,7 +204,7 @@ namespace MediaBrowser.Common.Implementations.Updates
                 }
             }
 
-            using (var json = await _httpClient.Get(MbAdminUrlHttp + "service/MB3Packages.json", cancellationToken).ConfigureAwait(false))
+            using (var json = await _httpClient.Get(MbAdmin.HttpUrl + "service/MB3Packages.json", cancellationToken).ConfigureAwait(false))
             {
                 cancellationToken.ThrowIfCancellationRequested();
 

+ 0 - 15
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -899,21 +899,6 @@ namespace MediaBrowser.Controller.Entities
         {
             var current = this;
 
-            var currentAsPlaceHolder = current as ISupportsPlaceHolders;
-
-            if (currentAsPlaceHolder != null)
-            {
-                var newHasPlaceHolder = newItem as ISupportsPlaceHolders;
-
-                if (newHasPlaceHolder != null)
-                {
-                    if (currentAsPlaceHolder.IsPlaceHolder != newHasPlaceHolder.IsPlaceHolder)
-                    {
-                        return false;
-                    }
-                }
-            }
-
             return current.IsInMixedFolder == newItem.IsInMixedFolder;
         }
 

+ 5 - 1
MediaBrowser.Controller/Entities/Video.cs

@@ -363,7 +363,11 @@ namespace MediaBrowser.Controller.Entities
         {
             await base.UpdateToRepository(updateReason, cancellationToken).ConfigureAwait(false);
 
-            foreach (var item in GetLocalAlternateVersionIds().Select(i => LibraryManager.GetItemById(i)))
+            var localAlternates = GetLocalAlternateVersionIds()
+                .Select(i => LibraryManager.GetItemById(i))
+                .Where(i => i != null);
+
+            foreach (var item in localAlternates)
             {
                 item.ImageInfos = ImageInfos;
                 item.Overview = Overview;

+ 21 - 0
MediaBrowser.Controller/Sync/ISyncManager.cs

@@ -22,6 +22,13 @@ namespace MediaBrowser.Controller.Sync
         /// <returns>QueryResult&lt;SyncJob&gt;.</returns>
         QueryResult<SyncJob> GetJobs(SyncJobQuery query);
 
+        /// <summary>
+        /// Gets the job items.
+        /// </summary>
+        /// <param name="query">The query.</param>
+        /// <returns>QueryResult&lt;SyncJobItem&gt;.</returns>
+        QueryResult<SyncJobItem> GetJobItems(SyncJobItemQuery query);
+        
         /// <summary>
         /// Gets the job.
         /// </summary>
@@ -59,5 +66,19 @@ namespace MediaBrowser.Controller.Sync
         /// <param name="targetId">The target identifier.</param>
         /// <returns>DeviceProfile.</returns>
         DeviceProfile GetDeviceProfile(string targetId);
+
+        /// <summary>
+        /// Reports the synchronize job item transferred.
+        /// </summary>
+        /// <param name="id">The identifier.</param>
+        /// <returns>Task.</returns>
+        Task ReportSyncJobItemTransferred(string id);
+
+        /// <summary>
+        /// Gets the job item.
+        /// </summary>
+        /// <param name="id">The identifier.</param>
+        /// <returns>SyncJobItem.</returns>
+        SyncJobItem GetJobItem(string id);
     }
 }

+ 12 - 11
MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs

@@ -550,7 +550,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
                 }
             };
 
-            _logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
+            _logger.Info("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 
             var logFilePath = Path.Combine(_appPaths.LogDirectoryPath, "ffmpeg-sub-extract-" + Guid.NewGuid() + ".txt");
             Directory.CreateDirectory(Path.GetDirectoryName(logFilePath));
@@ -604,17 +604,18 @@ namespace MediaBrowser.MediaEncoding.Subtitles
             {
                 failed = true;
 
-                if (File.Exists(outputPath))
+                try
                 {
-                    try
-                    {
-                        _logger.Info("Deleting extracted subtitle due to failure: ", outputPath);
-                        File.Delete(outputPath);
-                    }
-                    catch (IOException ex)
-                    {
-                        _logger.ErrorException("Error deleting extracted subtitle {0}", ex, outputPath);
-                    }
+                    _logger.Info("Deleting extracted subtitle due to failure: {0}", outputPath);
+                    File.Delete(outputPath);
+                }
+                catch (FileNotFoundException)
+                {
+                    
+                }
+                catch (IOException ex)
+                {
+                    _logger.ErrorException("Error deleting extracted subtitle {0}", ex, outputPath);
                 }
             }
             else if (!File.Exists(outputPath))

+ 6 - 0
MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj

@@ -1031,6 +1031,9 @@
     <Compile Include="..\MediaBrowser.Model\Sync\SyncCategory.cs">
       <Link>Sync\SyncCategory.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Sync\SyncDialogOptions.cs">
+      <Link>Sync\SyncDialogOptions.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Sync\SyncJob.cs">
       <Link>Sync\SyncJob.cs</Link>
     </Compile>
@@ -1055,6 +1058,9 @@
     <Compile Include="..\MediaBrowser.Model\Sync\SyncJobStatus.cs">
       <Link>Sync\SyncJobStatus.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Sync\SyncOptions.cs">
+      <Link>Sync\SyncOptions.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Sync\SyncQuality.cs">
       <Link>Sync\SyncQuality.cs</Link>
     </Compile>

+ 6 - 0
MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj

@@ -990,6 +990,9 @@
     <Compile Include="..\MediaBrowser.Model\Sync\SyncCategory.cs">
       <Link>Sync\SyncCategory.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Sync\SyncDialogOptions.cs">
+      <Link>Sync\SyncDialogOptions.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Sync\SyncJob.cs">
       <Link>Sync\SyncJob.cs</Link>
     </Compile>
@@ -1014,6 +1017,9 @@
     <Compile Include="..\MediaBrowser.Model\Sync\SyncJobStatus.cs">
       <Link>Sync\SyncJobStatus.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Sync\SyncOptions.cs">
+      <Link>Sync\SyncOptions.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Sync\SyncQuality.cs">
       <Link>Sync\SyncQuality.cs</Link>
     </Compile>

+ 29 - 0
MediaBrowser.Model/ApiClient/IApiClient.cs

@@ -1386,6 +1386,35 @@ namespace MediaBrowser.Model.ApiClient
         /// <returns>Task&lt;SyncJob&gt;.</returns>
         Task<SyncJob> CreateSyncJob(SyncJobRequest request);
 
+        /// <summary>
+        /// Gets the synchronize jobs.
+        /// </summary>
+        /// <param name="query">The query.</param>
+        /// <returns>Task&lt;QueryResult&lt;SyncJob&gt;&gt;.</returns>
+        Task<QueryResult<SyncJob>> GetSyncJobs(SyncJobQuery query);
+
+        /// <summary>
+        /// Gets the synchronize job items.
+        /// </summary>
+        /// <param name="query">The query.</param>
+        /// <returns>Task&lt;QueryResult&lt;SyncJobItem&gt;&gt;.</returns>
+        Task<QueryResult<SyncJobItem>> GetSyncJobItems(SyncJobItemQuery query);
+
+        /// <summary>
+        /// Reports the synchronize job item transferred.
+        /// </summary>
+        /// <param name="id">The identifier.</param>
+        /// <returns>Task.</returns>
+        Task ReportSyncJobItemTransferred(string id);
+
+        /// <summary>
+        /// Gets the synchronize job item file.
+        /// </summary>
+        /// <param name="id">The identifier.</param>
+        /// <param name="cancellationToken">The cancellation token.</param>
+        /// <returns>Task&lt;Stream&gt;.</returns>
+        Task<Stream> GetSyncJobItemFile(string id, CancellationToken cancellationToken);
+
         /// <summary>
         /// Opens the web socket.
         /// </summary>

+ 6 - 0
MediaBrowser.Model/Logging/ILogManager.cs

@@ -13,6 +13,12 @@ namespace MediaBrowser.Model.Logging
         /// <value>The log level.</value>
         LogSeverity LogSeverity { get; set; }
 
+        /// <summary>
+        /// Gets or sets the exception message prefix.
+        /// </summary>
+        /// <value>The exception message prefix.</value>
+        string ExceptionMessagePrefix { get; set; }
+
         /// <summary>
         /// Gets the logger.
         /// </summary>

+ 1 - 0
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -364,6 +364,7 @@
     <Compile Include="Session\UserDataChangeInfo.cs" />
     <Compile Include="Devices\ContentUploadHistory.cs" />
     <Compile Include="Sync\SyncCategory.cs" />
+    <Compile Include="Sync\SyncDialogOptions.cs" />
     <Compile Include="Sync\SyncHelper.cs" />
     <Compile Include="Sync\SyncJob.cs" />
     <Compile Include="Sync\SyncJobCreationResult.cs" />

+ 24 - 0
MediaBrowser.Model/Sync/SyncDialogOptions.cs

@@ -0,0 +1,24 @@
+using System.Collections.Generic;
+
+namespace MediaBrowser.Model.Sync
+{
+    public class SyncDialogOptions
+    {
+        /// <summary>
+        /// Gets or sets the targets.
+        /// </summary>
+        /// <value>The targets.</value>
+        public List<SyncTarget> Targets { get; set; }
+        /// <summary>
+        /// Gets or sets the options.
+        /// </summary>
+        /// <value>The options.</value>
+        public List<SyncOptions> Options { get; set; }
+
+        public SyncDialogOptions()
+        {
+            Targets = new List<SyncTarget>();
+            Options = new List<SyncOptions>();
+        }
+    }
+}

+ 10 - 1
MediaBrowser.Model/Sync/SyncHelper.cs

@@ -21,7 +21,10 @@ namespace MediaBrowser.Model.Sync
                     if (item.IsVideo)
                     {
                         options.Add(SyncOptions.Quality);
-                        options.Add(SyncOptions.UnwatchedOnly);
+                        if (items.Count > 1)
+                        {
+                            options.Add(SyncOptions.UnwatchedOnly);
+                        }
                         break;
                     }
                     if (item.IsFolder && !item.IsMusicGenre && !item.IsArtist && !item.IsType("musicalbum") && !item.IsGameGenre)
@@ -30,6 +33,12 @@ namespace MediaBrowser.Model.Sync
                         options.Add(SyncOptions.UnwatchedOnly);
                         break;
                     }
+                    if (item.IsGenre)
+                    {
+                        options.Add(SyncOptions.SyncNewContent);
+                        options.Add(SyncOptions.ItemLimit);
+                        break;
+                    }
                 }
             }
 

+ 10 - 0
MediaBrowser.Model/Sync/SyncJobItemQuery.cs

@@ -19,6 +19,16 @@ namespace MediaBrowser.Model.Sync
         /// <value>The job identifier.</value>
         public string JobId { get; set; }
         /// <summary>
+        /// Gets or sets the target identifier.
+        /// </summary>
+        /// <value>The target identifier.</value>
+        public string TargetId { get; set; }
+        /// <summary>
+        /// Gets or sets the status.
+        /// </summary>
+        /// <value>The status.</value>
+        public SyncJobItemStatus? Status { get; set; }
+        /// <summary>
         /// Gets or sets a value indicating whether this instance is completed.
         /// </summary>
         /// <value><c>null</c> if [is completed] contains no value, <c>true</c> if [is completed]; otherwise, <c>false</c>.</value>

+ 5 - 0
MediaBrowser.Model/Sync/SyncJobQuery.cs

@@ -18,5 +18,10 @@ namespace MediaBrowser.Model.Sync
         /// </summary>
         /// <value><c>null</c> if [is completed] contains no value, <c>true</c> if [is completed]; otherwise, <c>false</c>.</value>
         public bool? IsCompleted { get; set; }
+        /// <summary>
+        /// Gets or sets the target identifier.
+        /// </summary>
+        /// <value>The target identifier.</value>
+        public string TargetId { get; set; }
     }
 }

+ 1 - 1
MediaBrowser.Server.Implementations/EntryPoints/UsageReporter.cs

@@ -12,7 +12,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
         private readonly IApplicationHost _applicationHost;
         private readonly INetworkManager _networkManager;
         private readonly IHttpClient _httpClient;
-        private const string MbAdminUrl = "https://www.mb3admin.com/admin/";
+        private const string MbAdminUrl = "http://www.mb3admin.com/admin/";
 
         public UsageReporter(IApplicationHost applicationHost, INetworkManager networkManager, IHttpClient httpClient)
         {

+ 16 - 16
MediaBrowser.Server.Implementations/Localization/JavaScript/de.json

@@ -628,21 +628,21 @@
     "ButtonLinkMyMediaBrowserAccount": "Verkn\u00fcpfe jetzt meinen Account",
     "MessageConnectAccountRequiredToInviteGuest": "Um G\u00e4ste einladen zu k\u00f6nnen, musst du zuerst deinen Media Browser Account auf diesem Server verkn\u00fcpfen.",
     "ButtonSync": "Synchronisieren",
-    "SyncMedia": "Sync Media",
-    "HeaderCancelSyncJob": "Cancel Sync",
-    "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+    "SyncMedia": "Synchronisiere Medien",
+    "HeaderCancelSyncJob": "Synchronisierung abbrechen",
+    "CancelSyncJobConfirmation": "M\u00f6chten Sie die Synchronisations-Aufgabe wirklich abbrechen?",
     "TabSync": "Synchronisieren",
-    "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
-    "MessageSyncJobCreated": "Sync job created.",
-    "LabelSyncTo": "Sync to:",
-    "LabelSyncJobName": "Sync job name:",
-    "LabelQuality": "Quality:",
-    "OptionHigh": "High",
-    "OptionMedium": "Medium",
-    "OptionLow": "Low",
-    "HeaderSettings": "Settings",
-    "OptionAutomaticallySyncNewContent": "Automatically sync new content",
-    "OptionAutomaticallySyncNewContentHelp": "New content added to these folders 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."
+    "MessagePleaseSelectDeviceToSyncTo": "Bitte w\u00e4hlen Sie ein zu synchronisierendes Ger\u00e4t.",
+    "MessageSyncJobCreated": "Synchronisations-Aufgabe erstellt.",
+    "LabelSyncTo": "Synchronisiere mit:",
+    "LabelSyncJobName": "Synchronisations-Aufgabe:",
+    "LabelQuality": "Qualit\u00e4t:",
+    "OptionHigh": "Hoch",
+    "OptionMedium": "Mittel",
+    "OptionLow": "Niedrig",
+    "HeaderSettings": "Einstellungen",
+    "OptionAutomaticallySyncNewContent": "Synchronisiere neue Inhalte automatisch",
+    "OptionAutomaticallySyncNewContentHelp": "Neu hinzugef\u00fcgte Inhalte zu diesen Verzeichnissen werden automatisch zum Ger\u00e4t synchronisiert.",
+    "OptionSyncUnwatchedVideosOnly": "Synchronisiere nur ungesehene Videos.",
+    "OptionSyncUnwatchedVideosOnlyHelp": "Nur ungesehene Video werden synchronisiert. Videos werden entfernt sobald diese auf dem Ger\u00e4t angeschaut wurden."
 }

+ 4 - 4
MediaBrowser.Server.Implementations/Localization/JavaScript/es_MX.json

@@ -627,15 +627,15 @@
     "HeaderInviteGuest": "Agregar un Invitado",
     "ButtonLinkMyMediaBrowserAccount": "Enlazar mi cuenta ahora",
     "MessageConnectAccountRequiredToInviteGuest": "Para poder agregar invitados primero necesitas vincular tu cuenta de Media Browser a este servidor.",
-    "ButtonSync": "Sinc",
+    "ButtonSync": "SInc",
     "SyncMedia": "Sincronizar Medios",
-    "HeaderCancelSyncJob": "Cancelar Sincronizaci\u00f3n",
+    "HeaderCancelSyncJob": "Cancelar Sinc",
     "CancelSyncJobConfirmation": "\u00bfEsta seguro de querer cancelar este trabajo de sincronizaci\u00f3n?",
     "TabSync": "Sinc",
     "MessagePleaseSelectDeviceToSyncTo": "Por favor seleccione un dispositivo con el que desea sincronizar.",
-    "MessageSyncJobCreated": "Trabajo de sincornizaci\u00f3n creado.",
+    "MessageSyncJobCreated": "Trabajo de sinc creado.",
     "LabelSyncTo": "Sincronizar con:",
-    "LabelSyncJobName": "Nombre del trabajo de sincronizaci\u00f3n:",
+    "LabelSyncJobName": "Nombre del trabajo de sinc:",
     "LabelQuality": "Calidad:",
     "OptionHigh": "Alta",
     "OptionMedium": "Media",

+ 8 - 8
MediaBrowser.Server.Implementations/Localization/JavaScript/fr.json

@@ -628,18 +628,18 @@
     "ButtonLinkMyMediaBrowserAccount": "Lier \u00e0 mon compte maintenant",
     "MessageConnectAccountRequiredToInviteGuest": "Pour inviter des personnes vous devez d'abord lier votre compte Media Browser \u00e0 ce serveur.",
     "ButtonSync": "Sync",
-    "SyncMedia": "Sync Media",
-    "HeaderCancelSyncJob": "Cancel Sync",
-    "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+    "SyncMedia": "Sync. les m\u00e9dias",
+    "HeaderCancelSyncJob": "Annuler la sync.",
+    "CancelSyncJobConfirmation": "\u00cates vous sure de vouloir annuler cette synchronisation?",
     "TabSync": "Sync",
-    "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
-    "MessageSyncJobCreated": "Sync job created.",
-    "LabelSyncTo": "Sync to:",
-    "LabelSyncJobName": "Sync job name:",
+    "MessagePleaseSelectDeviceToSyncTo": "Veuillez s\u00e9lectionner un p\u00e9riph\u00e9rique avec lequel se synchroniser.",
+    "MessageSyncJobCreated": "Job de synchronisation cr\u00e9\u00e9.",
+    "LabelSyncTo": "Synchronis\u00e9 avec:",
+    "LabelSyncJobName": "Nom du job de synchronisation:",
     "LabelQuality": "Quality:",
     "OptionHigh": "High",
     "OptionMedium": "Medium",
-    "OptionLow": "Low",
+    "OptionLow": "Basse",
     "HeaderSettings": "Param\u00e8tres",
     "OptionAutomaticallySyncNewContent": "Synchroniser automatiquement le nouveau contenu",
     "OptionAutomaticallySyncNewContentHelp": "Le nouveau contenu ajout\u00e9 \u00e0 ces r\u00e9pertoires sera automatiquement synchronis\u00e9 \u00e0 votre p\u00e9riph\u00e9rique.",

+ 3 - 1
MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json

@@ -652,5 +652,7 @@
     "OptionAutomaticallySyncNewContent": "Automatically sync new content",
     "OptionAutomaticallySyncNewContentHelp": "New content added to these folders 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."
+    "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."
 }

+ 16 - 16
MediaBrowser.Server.Implementations/Localization/JavaScript/kk.json

@@ -628,21 +628,21 @@
     "ButtonLinkMyMediaBrowserAccount": "\u0422\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u043c\u0434\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u0443",
     "MessageConnectAccountRequiredToInviteGuest": "\u049a\u043e\u043d\u0430\u049b\u0442\u0430\u0440\u0434\u044b \u0448\u0430\u049b\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u0435\u04a3 \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u043e\u0441\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0433\u0435 Media Browser \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u04a3\u0456\u0437\u0434\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u0440\u0443\u044b\u04a3\u044b\u0437 \u049b\u0430\u0436\u0435\u0442.",
     "ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e",
-    "SyncMedia": "Sync Media",
-    "HeaderCancelSyncJob": "Cancel Sync",
-    "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+    "SyncMedia": "\u0422\u0430\u0441\u0443\u0448\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443",
+    "HeaderCancelSyncJob": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443\u0434\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443",
+    "CancelSyncJobConfirmation": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d \u043e\u0441\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443 \u0436\u04b1\u043c\u044b\u0441\u0442\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?",
     "TabSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443",
-    "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
-    "MessageSyncJobCreated": "Sync job created.",
-    "LabelSyncTo": "Sync to:",
-    "LabelSyncJobName": "Sync job name:",
-    "LabelQuality": "Quality:",
-    "OptionHigh": "High",
-    "OptionMedium": "Medium",
-    "OptionLow": "Low",
-    "HeaderSettings": "Settings",
-    "OptionAutomaticallySyncNewContent": "Automatically sync new content",
-    "OptionAutomaticallySyncNewContentHelp": "New content added to these folders 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."
+    "MessagePleaseSelectDeviceToSyncTo": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0439\u0442\u044b\u043d \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b \u0442\u0430\u04a3\u0434\u0430\u04a3\u044b\u0437.",
+    "MessageSyncJobCreated": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443 \u0436\u04b1\u043c\u044b\u0441\u044b \u0436\u0430\u0441\u0430\u043b\u0434\u044b.",
+    "LabelSyncTo": "\u041c\u044b\u043d\u0430\u0493\u0430\u043d \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443:",
+    "LabelSyncJobName": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443 \u0436\u04b1\u043c\u044b\u0441\u044b\u043d\u044b\u04a3 \u0430\u0442\u044b:",
+    "LabelQuality": "\u0421\u0430\u043f\u0430\u0441\u044b:",
+    "OptionHigh": "\u0416\u043e\u0493\u0430\u0440\u044b",
+    "OptionMedium": "\u041e\u0440\u0442\u0430\u0448\u0430",
+    "OptionLow": "\u0422\u04e9\u043c\u0435\u043d",
+    "HeaderSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440",
+    "OptionAutomaticallySyncNewContent": "\u0416\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443",
+    "OptionAutomaticallySyncNewContentHelp": "\u041e\u0441\u044b \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u0493\u0430 \u04af\u0441\u0442\u0435\u043b\u0456\u043d\u0433\u0435\u043d \u0436\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043c\u0435\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u043b\u0430\u0434\u044b.",
+    "OptionSyncUnwatchedVideosOnly": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u043a\u04e9\u0440\u0456\u043b\u043c\u0435\u0433\u0435\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0434\u0456 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443",
+    "OptionSyncUnwatchedVideosOnlyHelp": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u049b\u0430\u0440\u0430\u0440\u043c\u0430\u0493\u0430\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u043b\u0430\u0434\u044b, \u0436\u04d9\u043d\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440 \u049b\u0430\u0440\u0430\u043b\u0493\u0430\u043d\u043d\u0430\u043d \u043a\u0435\u0439\u0456\u043d \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u043b\u0430\u0434\u044b."
 }

+ 15 - 15
MediaBrowser.Server.Implementations/Localization/JavaScript/nl.json

@@ -628,21 +628,21 @@
     "ButtonLinkMyMediaBrowserAccount": "Koppel mijn account nu",
     "MessageConnectAccountRequiredToInviteGuest": "Om gasten uit te kunnen nodigen moet je Media Browser account aan deze server gekoppeld worden.",
     "ButtonSync": "Synchronisatie",
-    "SyncMedia": "Sync Media",
-    "HeaderCancelSyncJob": "Cancel Sync",
-    "CancelSyncJobConfirmation": "Are you sure you wish to cancel this sync job?",
+    "SyncMedia": "Synchroniseer media",
+    "HeaderCancelSyncJob": "Annuleer synchronisatie",
+    "CancelSyncJobConfirmation": "Weet je zeker dat je het synchroniseren wilt afbreken?",
     "TabSync": "Synchronisatie",
-    "MessagePleaseSelectDeviceToSyncTo": "Please select a device to sync to.",
-    "MessageSyncJobCreated": "Sync job created.",
-    "LabelSyncTo": "Sync to:",
-    "LabelSyncJobName": "Sync job name:",
-    "LabelQuality": "Quality:",
-    "OptionHigh": "High",
+    "MessagePleaseSelectDeviceToSyncTo": "Selecteer een apparaat om mee te synchroniseren.",
+    "MessageSyncJobCreated": "Synchroniseer taak gemaakt.",
+    "LabelSyncTo": "Synchroniseer naar:",
+    "LabelSyncJobName": "Naam synchroniseer taak:",
+    "LabelQuality": "Kwaliteit",
+    "OptionHigh": "Hoog",
     "OptionMedium": "Medium",
-    "OptionLow": "Low",
-    "HeaderSettings": "Settings",
-    "OptionAutomaticallySyncNewContent": "Automatically sync new content",
-    "OptionAutomaticallySyncNewContentHelp": "New content added to these folders 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."
+    "OptionLow": "Laag",
+    "HeaderSettings": "Instellingen",
+    "OptionAutomaticallySyncNewContent": "Nieuwe inhoud automatisch synchroniseren",
+    "OptionAutomaticallySyncNewContentHelp": "Nieuwe inhoud in deze mappen zal automatisch gesynchroniseerd worden met het apparaat.",
+    "OptionSyncUnwatchedVideosOnly": "Synchroniseer alleen ongeziene video's",
+    "OptionSyncUnwatchedVideosOnlyHelp": "Alleen ongeziene video's zulle gesynchroniseerd worden en van het apparaat verwijderd worden als ze gezien zijn."
 }

+ 7 - 7
MediaBrowser.Server.Implementations/Localization/JavaScript/ru.json

@@ -228,8 +228,8 @@
     "OptionBlockMovies": "\u0424\u0438\u043b\u044c\u043c\u044b",
     "OptionBlockBooks": "\u041a\u043d\u0438\u0433\u0438",
     "OptionBlockGames": "\u0418\u0433\u0440\u044b",
-    "OptionBlockLiveTvPrograms": "\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0422\u0412",
-    "OptionBlockLiveTvChannels": "\u041a\u0430\u043d\u0430\u043b\u044b \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0422\u0412",
+    "OptionBlockLiveTvPrograms": "\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0422\u0412-\u044d\u0444\u0438\u0440\u0430",
+    "OptionBlockLiveTvChannels": "\u041a\u0430\u043d\u0430\u043b\u044b \u0422\u0412-\u044d\u0444\u0438\u0440\u0430",
     "OptionBlockChannelContent": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043a\u0430\u043d\u0430\u043b\u0430",
     "ButtonRevoke": "\u041e\u0442\u043e\u0437\u0432\u0430\u0442\u044c",
     "MessageConfirmRevokeApiKey": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043e\u0437\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 API-\u043a\u043b\u044e\u0447?  \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a Media Browser \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0437\u043a\u043e \u043e\u0431\u043e\u0440\u0432\u0430\u043d\u043e.",
@@ -259,7 +259,7 @@
     "OptionOn": "\u0412\u043a\u043b",
     "HeaderFields": "\u041f\u043e\u043b\u044f",
     "HeaderFieldsHelp": "\u0421\u0434\u0432\u0438\u043d\u044c\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u043a \u00ab\u0412\u042b\u041a\u041b\u00bb, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f.",
-    "HeaderLiveTV": "\u042d\u0444\u0438\u0440\u043d\u043e\u0435 \u0422\u0412",
+    "HeaderLiveTV": "\u0422\u0412-\u044d\u0444\u0438\u0440",
     "MissingLocalTrailer": "\u041d\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u0430.",
     "MissingPrimaryImage": "\u041d\u0435\u0442 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0438\u0441\u0443\u043d\u043a\u0430.",
     "MissingBackdropImage": "\u041d\u0435\u0442 \u0440\u0438\u0441\u0443\u043d\u043a\u0430 \u0437\u0430\u0434\u043d\u0438\u043a\u0430.",
@@ -305,7 +305,7 @@
     "TabLibrary": "\u041c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430",
     "TabMetadata": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435",
     "TabDLNA": "DLNA",
-    "TabLiveTV": "\u042d\u0444\u0438\u0440\u043d\u043e\u0435 \u0422\u0412",
+    "TabLiveTV": "\u0422\u0412-\u044d\u0444\u0438\u0440",
     "TabAutoOrganize": "\u0410\u0432\u0442\u043e\u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f",
     "TabPlugins": "\u041f\u043b\u0430\u0433\u0438\u043d\u044b",
     "TabAdvanced": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",
@@ -591,7 +591,7 @@
     "DashboardTourCinemaMode": "\u0420\u0435\u0436\u0438\u043c \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0438\u043d\u043e\u0437\u0430\u043b\u0430 \u043f\u0440\u044f\u043c\u0438\u043a\u043e\u043c \u0432 \u0432\u0430\u0448\u0443 \u0433\u043e\u0441\u0442\u0438\u043d\u0443\u044e, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u044b \u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c.",
     "DashboardTourChapters": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0441\u0446\u0435\u043d \u043a \u0432\u0438\u0434\u0435\u043e, \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430.",
     "DashboardTourSubtitles": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0439\u0442\u0435 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u0434\u043b\u044f \u0432\u0438\u0434\u0435\u043e \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435.",
-    "DashboardTourPlugins": "\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0439\u0442\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0432\u0438\u0434\u0435\u043e, \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0442\u0432, \u0441\u043a\u0430\u043d\u043d\u0435\u0440\u043e\u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442.\u043f.",
+    "DashboardTourPlugins": "\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0439\u0442\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0432\u0438\u0434\u0435\u043e, \u0422\u0412-\u044d\u0444\u0438\u0440\u0430, \u0441\u043a\u0430\u043d\u043d\u0435\u0440\u043e\u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442.\u043f.",
     "DashboardTourNotifications": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u043d\u0430 \u0432\u0430\u0448\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u044d-\u043f\u043e\u0447\u0442\u0443 \u0438 \u0442.\u043f.",
     "DashboardTourScheduledTasks": "\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0434\u043e\u043b\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0439\u0442\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f, \u0438 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u043e.",
     "DashboardTourMobile": "\u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u044c Media Browser \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430\u0445 \u0438 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0430\u0445. \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441 \u0432\u0430\u0448\u0435\u0439 \u043b\u0430\u0434\u043e\u043d\u0438 \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435.",
@@ -627,11 +627,11 @@
     "HeaderInviteGuest": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0433\u043e\u0441\u0442\u044f",
     "ButtonLinkMyMediaBrowserAccount": "\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u043c\u043e\u044e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c",
     "MessageConnectAccountRequiredToInviteGuest": "\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0439, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c Media Browser \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c.",
-    "ButtonSync": "Sync",
+    "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 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445",
     "HeaderCancelSyncJob": "\u041e\u0442\u043c\u0435\u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438",
     "CancelSyncJobConfirmation": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438?",
-    "TabSync": "Sync",
+    "TabSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f",
     "MessagePleaseSelectDeviceToSyncTo": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.",
     "MessageSyncJobCreated": "\u0417\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043e.",
     "LabelSyncTo": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441:",

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

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Feature Access",
     "OptionAllowMediaPlayback": "Allow media playback",
     "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
-    "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
-    "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",

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

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Feature Access",
     "OptionAllowMediaPlayback": "Allow media playback",
     "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
-    "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
-    "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",

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

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "P\u0159\u00edstup k funkc\u00edm",
     "OptionAllowMediaPlayback": "Povolit p\u0159ehr\u00e1v\u00e1n\u00ed medi\u00ed",
     "OptionAllowBrowsingLiveTv": "Provolit \u017eiv\u00e9 vys\u00edl\u00e1n\u00ed",
-    "OptionAllowDeleteLibraryContent": "Povolit tomuto u\u017eivateli odstra\u0148ovat obsah z knihovny m\u00e9di\u00ed",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Povolit spr\u00e1vu nahr\u00e1vek \u017eiv\u00e9ho vys\u00edl\u00e1n\u00ed",
-    "OptionAllowRemoteControlOthers": "Povolit tomuto u\u017eivateli vzd\u00e1lenou kontrolu ostatn\u00edch u\u017eivatel\u016f",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Chyb\u011bj\u00edc\u00ed Tmdb Id",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/da.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Funktion Adgang",
     "OptionAllowMediaPlayback": "Tillad medie afspilning",
     "OptionAllowBrowsingLiveTv": "Tillad gennemsyn af direkte tv",
-    "OptionAllowDeleteLibraryContent": "Tillad denne bruger at slette biblioteks indhold",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Tillad administration af direkte tv optagelser",
-    "OptionAllowRemoteControlOthers": "Tillad denne bruger af fjern kontrollerer andre brugere",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Manglende Tmdb Id",

+ 5 - 5
MediaBrowser.Server.Implementations/Localization/Server/de.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Funktionszugriff",
     "OptionAllowMediaPlayback": "Erlaube das Abspielen von Medien",
     "OptionAllowBrowsingLiveTv": "Erlaube das durchsuchen von Live-TV",
-    "OptionAllowDeleteLibraryContent": "Erlaube diesem Benutzer das L\u00f6schen von Bibliothelkeninhalten",
+    "OptionAllowDeleteLibraryContent": "Erlaube L\u00f6schen von Bibliotheken-Inhalten.",
     "OptionAllowManageLiveTv": "Erlaube die Verwaltung von Live-TV Aufnahmen",
-    "OptionAllowRemoteControlOthers": "Erlaube diesem Benutzer, andere Benutzer fernzusteuern",
-    "OptionAllowRemoteSharedDevices": "Erlaube diesem Benutzer geteilte Ger\u00e4te fernzusteuern",
+    "OptionAllowRemoteControlOthers": "Erlaube Fernsteuerung anderer Benutzer",
+    "OptionAllowRemoteSharedDevices": "Erlaube Fernsteuerung geteilter Ger\u00e4te",
     "OptionAllowRemoteSharedDevicesHelp": "DLNA-Ger\u00e4te werden gemeinsam genutzt, bis ein Benutzer die Steuerung \u00fcbernimmt.",
     "HeaderRemoteControl": "Fernsteuerung",
     "OptionMissingTmdbId": "Fehlende Tmdb Id",
@@ -1278,6 +1278,6 @@
     "LabelTag": "Tag:",
     "LabelEnableSingleImageInDidlLimit": "Begrenze auf ein eingebundenes Bild",
     "LabelEnableSingleImageInDidlLimitHelp": "Einige Ger\u00e4te zeigen m\u00f6glicherweise Darstellungsfehler wenn mehrere Bilder mit Didl eingebunden wurden.",
-    "TabActivity": "Activity",
-    "TitleSync": "Sync"
+    "TabActivity": "Aktivit\u00e4t",
+    "TitleSync": "Synchronisation"
 }

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

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Feature Access",
     "OptionAllowMediaPlayback": "Allow media playback",
     "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
-    "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
-    "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/en_GB.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Feature Access",
     "OptionAllowMediaPlayback": "Allow media playback",
     "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
-    "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
-    "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/en_US.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Feature Access",
     "OptionAllowMediaPlayback": "Allow media playback",
     "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
-    "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
-    "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/es.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Permisos de acceso",
     "OptionAllowMediaPlayback": "Permitir reproducci\u00f3n de medios",
     "OptionAllowBrowsingLiveTv": "Acceso a TV en vivo",
-    "OptionAllowDeleteLibraryContent": "Permitir a este usuario eliminar contenido de la biblioteca",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Permitir la gesti\u00f3n de las grabaciones de TV en vivo",
-    "OptionAllowRemoteControlOthers": "Permitir a este usuario controlar rem\u00f3tamente a otros usuarios",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Falta Tmdb Id",

+ 6 - 6
MediaBrowser.Server.Implementations/Localization/Server/es_MX.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Permisos de acceso",
     "OptionAllowMediaPlayback": "Permitir reproducci\u00f3n de medios",
     "OptionAllowBrowsingLiveTv": "Permitir acceder a TV en vivo",
-    "OptionAllowDeleteLibraryContent": "Permitir a este usuario eliminar contenido de la librer\u00eda",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Permitir administrar grabaciones de TV en vivo",
-    "OptionAllowRemoteControlOthers": "Permitir a este usuario controlar remotamente a otros usuarios",
-    "OptionAllowRemoteSharedDevices": "Permitir a este usuario controlar dispositivos remotamente",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Los dispositivos dnla son considerados como compartidos hasta que alg\u00fan usuario comienza a controlarlo.",
     "HeaderRemoteControl": "Control Remoto",
     "OptionMissingTmdbId": "Falta Id de Tmdb",
@@ -714,7 +714,7 @@
     "LabelMaxStreamingBitrate": "Tasa de bits m\u00e1xima para transmisi\u00f3n:",
     "LabelMaxStreamingBitrateHelp": "Especifique una tasa de bits m\u00e1xima al transferir en tiempo real.",
     "LabelMaxStaticBitrate": "Tasa m\u00e1xima de bits de sinc",
-    "LabelMaxStaticBitrateHelp": "Especifique una tasa de bits cuando se sincronice contenido en alta calidad.",
+    "LabelMaxStaticBitrateHelp": "Especifique una tasa de bits cuando al sincronizar contenido en alta calidad.",
     "LabelMusicStaticBitrate": "Tasa de bits de sinc de m\u00fascia",
     "LabelMusicStaticBitrateHelp": "Especifique la tasa de bits m\u00e1xima al sincronizar m\u00fasica",
     "LabelMusicStreamingTranscodingBitrate": "Tasa de transcodificaci\u00f3n de m\u00fasica:",
@@ -952,7 +952,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",
@@ -1279,5 +1279,5 @@
     "LabelEnableSingleImageInDidlLimit": "Limitar a una sola imagen incrustada.",
     "LabelEnableSingleImageInDidlLimitHelp": "Algunos dispositivos no renderisaran apropiadamente si hay m\u00faltiples im\u00e1genes incrustadas en el Didl",
     "TabActivity": "Actividad",
-    "TitleSync": "Sincronizando"
+    "TitleSync": "Sinc"
 }

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

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Feature Access",
     "OptionAllowMediaPlayback": "Allow media playback",
     "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
-    "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
-    "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",

+ 8 - 8
MediaBrowser.Server.Implementations/Localization/Server/fr.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Acc\u00e8s aux  caract\u00e9ristiques",
     "OptionAllowMediaPlayback": "Autoriser la lecture du m\u00e9dia",
     "OptionAllowBrowsingLiveTv": "Autoriser la TV en direct",
-    "OptionAllowDeleteLibraryContent": "Autoriser cet utilisateur \u00e0 supprimer du contenu de la biblioth\u00e8que",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Autoriser la gestion des enregistrements de la TV en direct",
-    "OptionAllowRemoteControlOthers": "Autoriser cet utilisateur \u00e0 cont\u00f4ler \u00e0 distance d'autres utilisateurs",
-    "OptionAllowRemoteSharedDevices": "Permettre \u00e0 cet utilisateur de contr\u00f4ler \u00e0 distance les p\u00e9riph\u00e9riques partag\u00e9s",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Les p\u00e9riph\u00e9riques Dlna sont consid\u00e9r\u00e9s comme partag\u00e9s tant qu'un utilisateur ne commence pas \u00e0 le contr\u00f4ler.",
     "HeaderRemoteControl": "Contr\u00f4le \u00e0 distance",
     "OptionMissingTmdbId": "ID TMDb manquant",
@@ -539,7 +539,7 @@
     "HeaderRunningTasks": "T\u00e2ches en ex\u00e9cution",
     "HeaderActiveDevices": "P\u00e9riph\u00e9riques actifs",
     "HeaderPendingInstallations": "Installations en suspens",
-    "HeaderServerInformation": "Server Information",
+    "HeaderServerInformation": "Information du serveur",
     "ButtonRestartNow": "Red\u00e9marrer maintenant",
     "ButtonRestart": "Red\u00e9marrer",
     "ButtonShutdown": "\u00c9teindre",
@@ -1276,8 +1276,8 @@
     "HeaderAddTag": "Ajouter un tag",
     "LabelBlockItemsWithTags": "Bloquer les \u00e9l\u00e9ments contenant les tags:",
     "LabelTag": "Tag:",
-    "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
-    "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
-    "TabActivity": "Activity",
-    "TitleSync": "Sync"
+    "LabelEnableSingleImageInDidlLimit": "Limiter \u00e0 une seule image int\u00e9gr\u00e9e",
+    "LabelEnableSingleImageInDidlLimitHelp": "Quelques p\u00e9riph\u00e9riques ne fourniront pas un rendu correct si plusieurs images sont int\u00e9gr\u00e9es dans Didl",
+    "TabActivity": "Activit\u00e9",
+    "TitleSync": "Sync."
 }

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

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "\u05d2\u05d9\u05e9\u05d4 \u05dc\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd",
     "OptionAllowMediaPlayback": "\u05d0\u05e4\u05e9\u05e8 \u05e0\u05d9\u05d2\u05d5\u05df \u05de\u05d3\u05d9\u05d4",
     "OptionAllowBrowsingLiveTv": "\u05d0\u05e4\u05e9\u05e8 \u05d3\u05e4\u05d3\u05d5\u05e3 \u05d1\u05d8\u05dc\u05d5\u05d5\u05d9\u05d6\u05d9\u05d4 \u05d7\u05d9\u05d4",
-    "OptionAllowDeleteLibraryContent": "\u05d0\u05e4\u05e9\u05e8 \u05dc\u05de\u05e9\u05ea\u05de\u05e9 \u05d6\u05d4 \u05dc\u05de\u05d7\u05d5\u05e7 \u05e1\u05e4\u05e8\u05d9\u05d5\u05ea \u05ea\u05d5\u05db\u05df",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "\u05d0\u05e4\u05e9\u05e8 \u05e0\u05d9\u05d4\u05d5\u05dc \u05e9\u05dc \u05d4\u05e7\u05dc\u05d8\u05d5\u05ea \u05d8\u05dc\u05d5\u05d5\u05d9\u05d6\u05d9\u05d4 \u05d7\u05d9\u05d4",
-    "OptionAllowRemoteControlOthers": "\u05d0\u05e4\u05e9\u05e8 \u05dc\u05de\u05e9\u05ea\u05de\u05e9 \u05d6\u05d4 \u05dc\u05e9\u05dc\u05d5\u05d8 \u05de\u05e8\u05d7\u05d5\u05e7 \u05d1\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d0\u05d7\u05e8\u05d9\u05dd",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "\u05d7\u05d6\u05e8 \u05de\u05d6\u05d4\u05d4 Tmdb",

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

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Pristup opcijama",
     "OptionAllowMediaPlayback": "Dopusti reprodukciju medijskog sadr\u017eaja",
     "OptionAllowBrowsingLiveTv": "Omogu\u0107i pregled TV programa",
-    "OptionAllowDeleteLibraryContent": "Omogu\u0107i ovom korisniku da mo\u017ee brisati sadr\u017eaj biblioteke",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Dopusti upravljanje snimljenim TV sadr\u017eajem",
-    "OptionAllowRemoteControlOthers": "Omogu\u0107i ovom korisniku da upravlja na daljinu, sa drugim korisnicima",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Nedostaje Tmdb Id",

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

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Caratteristiche di accesso",
     "OptionAllowMediaPlayback": "Consenti la riproduzione",
     "OptionAllowBrowsingLiveTv": "Consenti la navigazione sulla Tv indiretta",
-    "OptionAllowDeleteLibraryContent": "Consenti a questo utente di eliminare il contenuti della libreria",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Consenti la modifica delle operazioni pianificate della TV",
-    "OptionAllowRemoteControlOthers": "Consenti a questo utente di controllare in remoto altri utenti",
-    "OptionAllowRemoteSharedDevices": "Consenti a questo utente di dispositivi di controllo remoto condivisi",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dispositivi DLNA sono considerati condivisa fino a quando un utente inizia controllarlo.",
     "HeaderRemoteControl": "telecomando",
     "OptionMissingTmdbId": "Tmdb Id mancante",

+ 5 - 5
MediaBrowser.Server.Implementations/Localization/Server/kk.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "\u041c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a\u0442\u0435\u0440\u0433\u0435 \u049b\u0430\u0442\u044b\u043d\u0430\u0441",
     "OptionAllowMediaPlayback": "\u0422\u0430\u0441\u0443\u0448\u044b\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u043e\u0439\u043d\u0430\u0442\u0443\u044b\u043d\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
     "OptionAllowBrowsingLiveTv": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u0448\u043e\u043b\u0443\u044b\u043d\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
-    "OptionAllowDeleteLibraryContent": "\u0411\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u0442\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0436\u043e\u044e \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
+    "OptionAllowDeleteLibraryContent": "\u0422\u0430\u0441\u0443\u0448\u044b\u0445\u0430\u043d\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d\u044b\u043d \u0436\u043e\u044e \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
     "OptionAllowManageLiveTv": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u0436\u0430\u0437\u0443\u0434\u044b \u0431\u0430\u0441\u049b\u0430\u0440\u0443\u044b\u043d\u0430 \u0440\u0443\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
-    "OptionAllowRemoteControlOthers": "\u0411\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u0431\u0430\u0441\u049b\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u049b\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
-    "OptionAllowRemoteSharedDevices": "\u0411\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u0493\u0430 \u043e\u0440\u0442\u0430\u049b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u044b \u049b\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
+    "OptionAllowRemoteControlOthers": "\u0411\u0430\u0441\u049b\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u049b\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
+    "OptionAllowRemoteSharedDevices": "\u041e\u0440\u0442\u0430\u049b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u044b \u049b\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443 \u04af\u0448\u0456\u043d \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0443",
     "OptionAllowRemoteSharedDevicesHelp": "DLNA-\u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0431\u0430\u0441\u049b\u0430\u0440\u0493\u0430\u043d\u0448\u0430 \u0434\u0435\u0439\u0456\u043d \u043e\u0440\u0442\u0430\u049b \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0435\u0441\u0435\u043f\u0442\u0435\u043b\u0456\u043d\u0435\u0434\u0456.",
     "HeaderRemoteControl": "\u049a\u0430\u0448\u044b\u049b\u0442\u0430\u043d \u0431\u0430\u0441\u049b\u0430\u0440\u0443",
     "OptionMissingTmdbId": "TMDb Id \u0436\u043e\u049b",
@@ -1278,6 +1278,6 @@
     "LabelTag": "\u0422\u0435\u0433:",
     "LabelEnableSingleImageInDidlLimit": "\u0416\u0430\u043b\u0493\u044b\u0437 \u043a\u0456\u0440\u0456\u0441\u0442\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u0441\u0443\u0440\u0435\u0442\u043a\u0435 \u0448\u0435\u043a\u0442\u0435\u0443",
     "LabelEnableSingleImageInDidlLimitHelp": "\u0415\u0433\u0435\u0440 \u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0443\u0440\u0435\u0442 Didl \u0456\u0448\u0456\u043d\u0435 \u043a\u0456\u0440\u0456\u0441\u0442\u0456\u0440\u0456\u043b\u0441\u0435, \u043a\u0435\u0439\u0431\u0456\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u0430 \u0442\u0438\u0456\u0441\u0442\u0456 \u0442\u04af\u0440\u0434\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0431\u0435\u0439\u0434\u0456.",
-    "TabActivity": "Activity",
-    "TitleSync": "Sync"
+    "TabActivity": "\u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u0440",
+    "TitleSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443"
 }

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

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Feature Access",
     "OptionAllowMediaPlayback": "Allow media playback",
     "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
-    "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
-    "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/ms.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Feature Access",
     "OptionAllowMediaPlayback": "Allow media playback",
     "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
-    "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
-    "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/nb.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Funksjon Tilgang",
     "OptionAllowMediaPlayback": "Tillatt medieavspilling",
     "OptionAllowBrowsingLiveTv": "Tillat surfing av Live TV",
-    "OptionAllowDeleteLibraryContent": "Tillatt denne brukeren \u00e5 slette bibliotek-elementer",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Tillat styring av Live TV opptak",
-    "OptionAllowRemoteControlOthers": "Tillatt denne brukeren \u00e5 fjernstyre andre",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Mangler Tmdb id",

+ 5 - 5
MediaBrowser.Server.Implementations/Localization/Server/nl.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Functie toegang",
     "OptionAllowMediaPlayback": "Afspelen van media toestaan",
     "OptionAllowBrowsingLiveTv": "Bladeren door live tv toestaan",
-    "OptionAllowDeleteLibraryContent": "Deze gebruiker kan inhoud uit de bibliotheek verwijderen",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Beheer van live tv-opnames toestaan",
-    "OptionAllowRemoteControlOthers": "Deze gebruiker kan andere gebruikers op afstand besturen",
-    "OptionAllowRemoteSharedDevices": "Sta deze gebruiker toe om gedeelde apparaten te gebruiken",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna apparaten worden als gedeeld apparaat gezien totdat een gebruiker deze gaat gebruiken.",
     "HeaderRemoteControl": "Gebruik op afstand",
     "OptionMissingTmdbId": "TMDB Id ontbreekt",
@@ -1278,6 +1278,6 @@
     "LabelTag": "Tag:",
     "LabelEnableSingleImageInDidlLimit": "Beperk tot \u00e9\u00e9n enkele ingesloten afbeelding",
     "LabelEnableSingleImageInDidlLimitHelp": "Sommige apparaten zullen niet goed weergeven als er meerdere afbeeldingen ingesloten zijn in Didl.",
-    "TabActivity": "Activity",
-    "TitleSync": "Sync"
+    "TabActivity": "Activiteit",
+    "TitleSync": "Synchroniseer"
 }

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/pl.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Feature Access",
     "OptionAllowMediaPlayback": "Allow media playback",
     "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
-    "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
-    "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/pt_BR.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Acesso aos Recursos",
     "OptionAllowMediaPlayback": "Permitir reprodu\u00e7\u00e3o de m\u00eddia",
     "OptionAllowBrowsingLiveTv": "Permitir navega\u00e7\u00e3o na tv ao vivo",
-    "OptionAllowDeleteLibraryContent": "Permitir a este usu\u00e1rio excluir conte\u00fado da biblioteca",
+    "OptionAllowDeleteLibraryContent": "Permitir que conte\u00fado da biblioteca seja apagado",
     "OptionAllowManageLiveTv": "Permitir a administra\u00e7\u00e3o de grava\u00e7\u00f5es da tv ao vivo",
-    "OptionAllowRemoteControlOthers": "Permitir a este usu\u00e1rio controlar remotamente outros usu\u00e1rios",
-    "OptionAllowRemoteSharedDevices": "Permitir a este usu\u00e1rio controlar dispositivos compartilhados",
+    "OptionAllowRemoteControlOthers": "Permitir controle remoto de outros usu\u00e1rios",
+    "OptionAllowRemoteSharedDevices": "Permitir controle remoto de dispositivos compartilhados",
     "OptionAllowRemoteSharedDevicesHelp": "Dispositivos dlna s\u00e3o considerados compartilhados at\u00e9 que um usu\u00e1rio comece a control\u00e1-lo.",
     "HeaderRemoteControl": "Controle Remoto",
     "OptionMissingTmdbId": "Faltando Id Tmdb",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/pt_PT.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Acesso a Caracter\u00edsticas",
     "OptionAllowMediaPlayback": "Permitir reprodu\u00e7\u00e3o de multim\u00e9dia",
     "OptionAllowBrowsingLiveTv": "Permitir navega\u00e7\u00e3o da tv ao vivo",
-    "OptionAllowDeleteLibraryContent": "Permitir a este utilizador remover conte\u00fados da biblioteca",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Permitir gest\u00e3o das grava\u00e7\u00f5es da tv ao vivo",
-    "OptionAllowRemoteControlOthers": "Permitir a este utilizador controlar remotamente outros utilizadores",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Id Tmdb em falta",

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

@@ -231,11 +231,11 @@
     "OptionAllowUserToManageServer": "\u042d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c",
     "HeaderFeatureAccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438",
     "OptionAllowMediaPlayback": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445",
-    "OptionAllowBrowsingLiveTv": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0442\u0432",
-    "OptionAllowDeleteLibraryContent": "\u042d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438",
-    "OptionAllowManageLiveTv": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0442\u0432",
-    "OptionAllowRemoteControlOthers": "\u042d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438",
-    "OptionAllowRemoteSharedDevices": "\u042d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438",
+    "OptionAllowBrowsingLiveTv": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0422\u0412-\u044d\u0444\u0438\u0440\u0430",
+    "OptionAllowDeleteLibraryContent": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438",
+    "OptionAllowManageLiveTv": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u0441 \u0422\u0412-\u044d\u0444\u0438\u0440\u0430",
+    "OptionAllowRemoteControlOthers": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438",
+    "OptionAllowRemoteSharedDevices": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438",
     "OptionAllowRemoteSharedDevicesHelp": "DLNA-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u043c\u0438, \u043f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438.",
     "HeaderRemoteControl": "\u0423\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",
     "OptionMissingTmdbId": "\u041d\u0435\u0442 TMDb Id",
@@ -340,13 +340,13 @@
     "ButtonRemove": "\u0418\u0437\u044a\u044f\u0442\u044c",
     "OptionRecordSeries": "\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b",
     "HeaderDetails": "\u0414\u0435\u0442\u0430\u043b\u0438",
-    "TitleLiveTV": "\u0422\u0412 \u044d\u0444\u0438\u0440",
+    "TitleLiveTV": "\u0422\u0412-\u044d\u0444\u0438\u0440",
     "LabelNumberOfGuideDays": "\u0427\u0438\u0441\u043b\u043e \u0434\u043d\u0435\u0439 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u0438\u0434\u0430:",
     "LabelNumberOfGuideDaysHelp": "\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0445 \u0434\u043d\u0435\u0439, \u0442\u0435\u043c \u0446\u0435\u043d\u043d\u0435\u0435 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u0438\u0434\u0430, \u0434\u0430\u0432\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u043d\u043d\u0435\u0433\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043e\u0431\u044a\u0451\u043c\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447, \u043d\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0434\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041f\u0440\u0438 \u0440\u0435\u0436\u0438\u043c\u0435 \u00ab\u0410\u0432\u0442\u043e\u00bb \u0432\u044b\u0431\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u0430\u043d\u0430\u043b\u043e\u0432.",
     "LabelActiveService": "\u0410\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430:",
     "LabelActiveServiceHelp": "\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0442\u0432, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445.",
     "OptionAutomatic": "\u0410\u0432\u0442\u043e",
-    "LiveTvPluginRequired": "\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d-\u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a \u0443\u0441\u043b\u0443\u0433 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0422\u0412.",
+    "LiveTvPluginRequired": "\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d-\u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a \u0443\u0441\u043b\u0443\u0433 \u0422\u0412-\u044d\u0444\u0438\u0440\u0430.",
     "LiveTvPluginRequiredHelp": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, NextPVR \u0438\u043b\u0438 ServerWMC.",
     "LabelCustomizeOptionsPerMediaType": "\u041f\u043e\u0434\u0433\u043e\u043d\u043a\u0430 \u043f\u043e \u0442\u0438\u043f\u0443 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445:",
     "OptionDownloadThumbImage": "\u0411\u0435\u0433\u0443\u043d\u043e\u043a",
@@ -810,7 +810,7 @@
     "OptionLatestChannelMedia": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u043e\u0432",
     "HeaderLatestChannelItems": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u043e\u0432",
     "OptionNone": "\u041d\u0438\u0447\u0435\u0433\u043e",
-    "HeaderLiveTv": "\u0422\u0412 \u044d\u0444\u0438\u0440",
+    "HeaderLiveTv": "\u0422\u0412-\u044d\u0444\u0438\u0440",
     "HeaderReports": "\u041e\u0442\u0447\u0451\u0442\u044b",
     "HeaderMetadataManager": "\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445",
     "HeaderPreferences": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
@@ -848,7 +848,7 @@
     "ViewTypeMusicArtists": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438",
     "ViewTypeBoxSets": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438",
     "ViewTypeChannels": "\u041a\u0430\u043d\u0430\u043b\u044b",
-    "ViewTypeLiveTV": "\u0422\u0412 \u044d\u0444\u0438\u0440",
+    "ViewTypeLiveTV": "\u0422\u0412-\u044d\u0444\u0438\u0440",
     "ViewTypeLiveTvNowPlaying": "\u0412 \u044d\u0444\u0438\u0440\u0435",
     "ViewTypeLatestGames": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0438\u0433\u0440\u044b",
     "ViewTypeRecentlyPlayedGames": "C\u044b\u0433\u0440\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u043e",
@@ -952,11 +952,11 @@
     "LabelDateAdded": "\u0414\u0430\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f:",
     "HeaderFeatures": "\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b",
     "HeaderAdvanced": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",
-    "ButtonSync": "Sync",
+    "ButtonSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c",
     "TabScheduledTasks": "\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a",
     "HeaderChapters": "\u0421\u0446\u0435\u043d\u044b",
     "HeaderResumeSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f",
-    "TabSync": "Sync",
+    "TabSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f",
     "TitleUsers": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438",
     "LabelProtocol": "\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b:",
     "OptionProtocolHttp": "HTTP",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/sv.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Tillg\u00e5ng till funktioner",
     "OptionAllowMediaPlayback": "Till\u00e5t mediauppspelning",
     "OptionAllowBrowsingLiveTv": "Till\u00e5t bl\u00e4ddring i live-TV",
-    "OptionAllowDeleteLibraryContent": "Till\u00e5t denna anv\u00e4ndare att ta bort objekt fr\u00e5n biblioteket",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Till\u00e5t denna anv\u00e4ndare att administrera TV-inspelningar",
-    "OptionAllowRemoteControlOthers": "Till\u00e5t denna anv\u00e4ndare att fj\u00e4rrstyra andra anv\u00e4ndare",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "TMDB-ID saknas",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/tr.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Feature Access",
     "OptionAllowMediaPlayback": "Allow media playback",
     "OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
-    "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
-    "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/vi.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "Truy c\u1eadp t\u00ednh n\u0103ng",
     "OptionAllowMediaPlayback": "Cho ph\u00e9p ch\u1ea1y media",
     "OptionAllowBrowsingLiveTv": "Cho ph\u00e9p duy\u1ec7t ch\u01b0\u01a1ng tr\u00ecnh truy\u1ec1n h\u00ecnh tr\u1ef1c ti\u1ebfp",
-    "OptionAllowDeleteLibraryContent": "Cho ph\u00e9p ng\u01b0\u1eddi d\u00f9ng n\u00e0y x\u00f3a n\u1ed9i dung th\u01b0 vi\u1ec7n",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "Cho ph\u00e9p qu\u1ea3n l\u00fd b\u1ea3n ghi c\u1ee7a truy\u1ec1n h\u00ecnh tr\u1ef1c ti\u1ebfp",
-    "OptionAllowRemoteControlOthers": "Cho ph\u00e9p ng\u01b0\u1eddi d\u00f9ng n\u00e0y ki\u1ec3m so\u00e1t t\u1eeb xa c\u00e1c ng\u01b0\u1eddi d\u00f9ng kh\u00e1c",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Thi\u1ebfu Tmdb ID",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/zh_CN.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "\u53ef\u4f7f\u7528\u7684\u529f\u80fd",
     "OptionAllowMediaPlayback": "\u5141\u8bb8\u5a92\u4f53\u64ad\u653e",
     "OptionAllowBrowsingLiveTv": "\u5141\u8bb8\u4f7f\u7528\u7535\u89c6\u76f4\u64ad",
-    "OptionAllowDeleteLibraryContent": "\u5141\u8bb8\u8be5\u7528\u6237\u5220\u9664\u5a92\u4f53\u5e93\u5185\u5bb9",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "\u5141\u8bb8\u7ba1\u7406\u7535\u89c6\u8282\u76ee\u5f55\u5236",
-    "OptionAllowRemoteControlOthers": "\u5141\u8bb8\u6b64\u7528\u6237\u8fdc\u7a0b\u63a7\u5236\u5176\u4ed6\u7528\u6237",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "\u7f3a\u5c11Tmdb \u7f16\u53f7",

+ 3 - 3
MediaBrowser.Server.Implementations/Localization/Server/zh_TW.json

@@ -232,10 +232,10 @@
     "HeaderFeatureAccess": "\u53ef\u4ee5\u4f7f\u7528\u7684\u529f\u80fd",
     "OptionAllowMediaPlayback": "\u5141\u8a31\u5a92\u9ad4\u64ad\u653e",
     "OptionAllowBrowsingLiveTv": "\u5141\u8a31\u4f7f\u7528\u96fb\u8996\u529f\u80fd",
-    "OptionAllowDeleteLibraryContent": "\u5141\u8a31\u9019\u7528\u6236\u522a\u9664\u5a92\u9ad4\u5eab\u7684\u5167\u5bb9",
+    "OptionAllowDeleteLibraryContent": "Allow deletion of library content",
     "OptionAllowManageLiveTv": "\u5141\u8a31\u7ba1\u7406\u96fb\u8996\u7bc0\u76ee\u9304\u5f71",
-    "OptionAllowRemoteControlOthers": "\u5141\u8a31\u9019\u7528\u6236\u9060\u7a0b\u63a7\u5236\u5176\u4ed6\u7528\u6236",
-    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteControlOthers": "Allow remote control of other users",
+    "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
     "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
     "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "\u7f3a\u5c11TMDB\u7de8\u865f",

+ 42 - 7
MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs

@@ -48,7 +48,7 @@ namespace MediaBrowser.Server.Implementations.Sync
                 throw new InvalidOperationException("Cannot proceed with sync because user no longer exists.");
             }
 
-            var items = GetItemsForSync(job.RequestedItemIds, user)
+            var items = GetItemsForSync(job.RequestedItemIds, user, job.UnwatchedOnly)
                 .ToList();
 
             var jobItems = _syncRepo.GetJobItems(new SyncJobItemQuery
@@ -59,6 +59,15 @@ namespace MediaBrowser.Server.Implementations.Sync
 
             foreach (var item in items)
             {
+                // Respect ItemLimit, if set
+                if (job.ItemLimit.HasValue)
+                {
+                    if (jobItems.Count >= job.ItemLimit.Value)
+                    {
+                        break;
+                    }
+                }
+
                 var itemId = item.Id.ToString("N");
 
                 var jobItem = jobItems.FirstOrDefault(i => string.Equals(i.ItemId, itemId, StringComparison.OrdinalIgnoreCase));
@@ -89,6 +98,13 @@ namespace MediaBrowser.Server.Implementations.Sync
             await UpdateJobStatus(job, jobItems).ConfigureAwait(false);
         }
 
+        public Task UpdateJobStatus(string id)
+        {
+            var job = _syncRepo.GetJob(id);
+
+            return UpdateJobStatus(job);
+        }
+
         private Task UpdateJobStatus(SyncJob job)
         {
             if (job == null)
@@ -155,12 +171,31 @@ namespace MediaBrowser.Server.Implementations.Sync
             return _syncRepo.Update(job);
         }
 
-        public IEnumerable<BaseItem> GetItemsForSync(IEnumerable<string> itemIds, User user)
+        public IEnumerable<BaseItem> GetItemsForSync(IEnumerable<string> itemIds, User user, bool unwatchedOnly)
         {
-            return itemIds
+            var items = itemIds
                 .SelectMany(i => GetItemsForSync(i, user))
-                .Where(_syncManager.SupportsSync)
-                .DistinctBy(i => i.Id);
+                .Where(_syncManager.SupportsSync);
+
+            if (unwatchedOnly)
+            {
+                // Avoid implicitly captured closure
+                var currentUser = user;
+
+                items = items.Where(i =>
+                {
+                    var video = i as Video;
+
+                    if (video != null)
+                    {
+                        return !video.IsPlayed(currentUser);
+                    }
+
+                    return true;
+                });
+            }
+
+            return items.DistinctBy(i => i.Id);
         }
 
         private IEnumerable<BaseItem> GetItemsForSync(string id, User user)
@@ -184,8 +219,8 @@ namespace MediaBrowser.Server.Implementations.Sync
                     .GetRecursiveChildren(user);
 
                 return itemByName.GetTaggedItems(items);
-            } 
-            
+            }
+
             if (item.IsFolder)
             {
                 var folder = (Folder)item;

+ 25 - 1
MediaBrowser.Server.Implementations/Sync/SyncManager.cs

@@ -49,7 +49,7 @@ namespace MediaBrowser.Server.Implementations.Sync
             var user = _userManager.GetUserById(request.UserId);
 
             var items = processor
-                .GetItemsForSync(request.ItemIds, user)
+                .GetItemsForSync(request.ItemIds, user, request.UnwatchedOnly)
                 .ToList();
 
             if (items.Any(i => !SupportsSync(i)))
@@ -265,5 +265,29 @@ namespace MediaBrowser.Server.Implementations.Sync
 
             return null;
         }
+
+        public async Task ReportSyncJobItemTransferred(string id)
+        {
+            var jobItem = _repo.GetJobItem(id);
+
+            jobItem.Status = SyncJobItemStatus.Completed;
+            jobItem.Progress = 100;
+
+            await _repo.Update(jobItem).ConfigureAwait(false);
+
+            var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager);
+
+            await processor.UpdateJobStatus(jobItem.JobId).ConfigureAwait(false);
+        }
+
+        public SyncJobItem GetJobItem(string id)
+        {
+            return _repo.GetJobItem(id);
+        }
+
+        public QueryResult<SyncJobItem> GetJobItems(SyncJobItemQuery query)
+        {
+            return _repo.GetJobItems(query);
+        }
     }
 }

+ 15 - 0
MediaBrowser.Server.Implementations/Sync/SyncRepository.cs

@@ -352,6 +352,11 @@ namespace MediaBrowser.Server.Implementations.Sync
                     }
                     cmd.Parameters.Add(cmd, "@Status", DbType.String).Value = SyncJobStatus.Completed.ToString();
                 }
+                if (!string.IsNullOrWhiteSpace(query.TargetId))
+                {
+                    whereClauses.Add("TargetId=@TargetId");
+                    cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
+                }
 
                 var whereTextWithoutPaging = whereClauses.Count == 0 ?
                     string.Empty :
@@ -447,6 +452,16 @@ namespace MediaBrowser.Server.Implementations.Sync
                     whereClauses.Add("JobId=@JobId");
                     cmd.Parameters.Add(cmd, "@JobId", DbType.String).Value = query.JobId;
                 }
+                if (!string.IsNullOrWhiteSpace(query.TargetId))
+                {
+                    whereClauses.Add("TargetId=@TargetId");
+                    cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
+                }
+                if (query.Status.HasValue)
+                {
+                    whereClauses.Add("Status=@Status");
+                    cmd.Parameters.Add(cmd, "@Status", DbType.String).Value = query.Status.Value.ToString();
+                }
 
                 if (query.IsCompleted.HasValue)
                 {

+ 19 - 0
MediaBrowser.Server.Startup.Common/ApplicationHost.cs

@@ -251,6 +251,8 @@ namespace MediaBrowser.Server.Startup.Common
             _remotePackageName = remotePackageName;
             _supportsNativeWebSocket = supportsNativeWebSocket;
             NativeApp = nativeApp;
+
+            SetBaseExceptionMessage();
         }
 
         private Version _version;
@@ -307,6 +309,23 @@ namespace MediaBrowser.Server.Startup.Common
             get { return NativeApp.SupportsAutoRunAtStartup; }
         }
 
+        private void SetBaseExceptionMessage()
+        {
+            var builder = GetBaseExceptionMessage(ApplicationPaths);
+
+            // Skip if plugins haven't been loaded yet
+            //if (Plugins != null)
+            //{
+            //    var pluginString = string.Join("|", Plugins.Select(i => i.Name + "-" + i.Version.ToString()).ToArray());
+            //    builder.Insert(0, string.Format("Plugins: {0}{1}", pluginString, Environment.NewLine));
+            //}
+
+            builder.Insert(0, string.Format("Version: {0}{1}", ApplicationVersion, Environment.NewLine));
+            builder.Insert(0, "*** Error Report ***" + Environment.NewLine);
+
+            LogManager.ExceptionMessagePrefix = builder.ToString();
+        }
+
         /// <summary>
         /// Runs the startup tasks.
         /// </summary>

+ 1 - 2
MediaBrowser.ServerApplication/MainStartup.cs

@@ -1,5 +1,4 @@
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Implementations.Logging;
+using MediaBrowser.Common.Implementations.Logging;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Server.Implementations;
 using MediaBrowser.Server.Startup.Common;

+ 2 - 2
Nuget/MediaBrowser.Common.Internal.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common.Internal</id>
-        <version>3.0.520</version>
+        <version>3.0.521</version>
         <title>MediaBrowser.Common.Internal</title>
         <authors>Luke</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.520" />
+            <dependency id="MediaBrowser.Common" version="3.0.521" />
             <dependency id="NLog" version="3.1.0.0" />
             <dependency id="SimpleInjector" version="2.6.1" />
             <dependency id="sharpcompress" version="0.10.2" />

+ 1 - 1
Nuget/MediaBrowser.Common.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common</id>
-        <version>3.0.520</version>
+        <version>3.0.521</version>
         <title>MediaBrowser.Common</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 1 - 1
Nuget/MediaBrowser.Model.Signed.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Model.Signed</id>
-        <version>3.0.520</version>
+        <version>3.0.521</version>
         <title>MediaBrowser.Model - Signed Edition</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 2 - 2
Nuget/MediaBrowser.Server.Core.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Server.Core</id>
-        <version>3.0.520</version>
+        <version>3.0.521</version>
         <title>Media Browser.Server.Core</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains core components required to build plugins for Media Browser Server.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.520" />
+            <dependency id="MediaBrowser.Common" version="3.0.521" />
         </dependencies>
     </metadata>
     <files>

+ 1 - 1
SharedVersion.cs

@@ -1,4 +1,4 @@
 using System.Reflection;
 
 //[assembly: AssemblyVersion("3.0.*")]
-[assembly: AssemblyVersion("3.0.5463.3000")]
+[assembly: AssemblyVersion("3.0.5464.40000")]