diff --git a/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs b/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs index 2b421794ab..61501635fa 100644 --- a/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs +++ b/Emby.Dlna/ContentDirectory/ContentDirectoryBrowser.cs @@ -33,7 +33,7 @@ namespace Emby.Dlna.ContentDirectory { CancellationToken = cancellationToken, UserAgent = "Emby", - RequestContentType = "text/xml; charset=\"utf-8\"", + RequestContentType = "text/xml", LogErrorResponseBody = true, Url = request.ContentDirectoryUrl, BufferContent = false @@ -43,37 +43,38 @@ namespace Emby.Dlna.ContentDirectory options.RequestContent = GetRequestBody(request); - var response = await _httpClient.SendAsync(options, "POST"); - - using (var reader = new StreamReader(response.Content)) + using (var response = await _httpClient.SendAsync(options, "POST")) { - var doc = XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); - - var queryResult = new QueryResult(); - - if (doc.Document == null) - return queryResult; - - var responseElement = doc.Document.Descendants(UNamespace + "BrowseResponse").ToList(); - - var countElement = responseElement.Select(i => i.Element("TotalMatches")).FirstOrDefault(i => i != null); - var countValue = countElement == null ? null : countElement.Value; - - int count; - if (!string.IsNullOrWhiteSpace(countValue) && int.TryParse(countValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out count)) + using (var reader = new StreamReader(response.Content)) { - queryResult.TotalRecordCount = count; + var doc = XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); - var resultElement = responseElement.Select(i => i.Element("Result")).FirstOrDefault(i => i != null); - var resultString = (string)resultElement; + var queryResult = new QueryResult(); - if (resultElement != null) + if (doc.Document == null) + return queryResult; + + var responseElement = doc.Document.Descendants(UNamespace + "BrowseResponse").ToList(); + + var countElement = responseElement.Select(i => i.Element("TotalMatches")).FirstOrDefault(i => i != null); + var countValue = countElement == null ? null : countElement.Value; + + int count; + if (!string.IsNullOrWhiteSpace(countValue) && int.TryParse(countValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out count)) { - var xElement = XElement.Parse(resultString); - } - } + queryResult.TotalRecordCount = count; - return queryResult; + var resultElement = responseElement.Select(i => i.Element("Result")).FirstOrDefault(i => i != null); + var resultString = (string)resultElement; + + if (resultElement != null) + { + var xElement = XElement.Parse(resultString); + } + } + + return queryResult; + } } } diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs index 5e200428a7..5b18a2b7c2 100644 --- a/Emby.Dlna/Didl/DidlBuilder.cs +++ b/Emby.Dlna/Didl/DidlBuilder.cs @@ -393,75 +393,75 @@ namespace Emby.Dlna.Didl { if (itemStubType.HasValue && itemStubType.Value == StubType.Latest) { - return _localization.GetLocalizedString("ViewTypeMusicLatest"); + return _localization.GetLocalizedString("Latest"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Playlists) { - return _localization.GetLocalizedString("ViewTypeMusicPlaylists"); + return _localization.GetLocalizedString("Playlists"); } if (itemStubType.HasValue && itemStubType.Value == StubType.AlbumArtists) { - return _localization.GetLocalizedString("ViewTypeMusicAlbumArtists"); + return _localization.GetLocalizedString("HeaderAlbumArtists"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Albums) { - return _localization.GetLocalizedString("ViewTypeMusicAlbums"); + return _localization.GetLocalizedString("Albums"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Artists) { - return _localization.GetLocalizedString("ViewTypeMusicArtists"); + return _localization.GetLocalizedString("Artists"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Songs) { - return _localization.GetLocalizedString("ViewTypeMusicSongs"); + return _localization.GetLocalizedString("Songs"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Genres) { - return _localization.GetLocalizedString("ViewTypeTvGenres"); + return _localization.GetLocalizedString("Genres"); } if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteAlbums) { - return _localization.GetLocalizedString("ViewTypeMusicFavoriteAlbums"); + return _localization.GetLocalizedString("HeaderFavoriteAlbums"); } if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteArtists) { - return _localization.GetLocalizedString("ViewTypeMusicFavoriteArtists"); + return _localization.GetLocalizedString("HeaderFavoriteArtists"); } if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteSongs) { - return _localization.GetLocalizedString("ViewTypeMusicFavoriteSongs"); + return _localization.GetLocalizedString("HeaderFavoriteSongs"); } if (itemStubType.HasValue && itemStubType.Value == StubType.ContinueWatching) { - return _localization.GetLocalizedString("ViewTypeMovieResume"); + return _localization.GetLocalizedString("HeaderContinueWatching"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Movies) { - return _localization.GetLocalizedString("ViewTypeMovieMovies"); + return _localization.GetLocalizedString("Movies"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Collections) { - return _localization.GetLocalizedString("ViewTypeMovieCollections"); + return _localization.GetLocalizedString("Collections"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Favorites) { - return _localization.GetLocalizedString("ViewTypeMovieFavorites"); + return _localization.GetLocalizedString("Favorites"); } if (itemStubType.HasValue && itemStubType.Value == StubType.NextUp) { - return _localization.GetLocalizedString("ViewTypeTvNextUp"); + return _localization.GetLocalizedString("HeaderNextUp"); } if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteSeries) { - return _localization.GetLocalizedString("ViewTypeTvFavoriteSeries"); + return _localization.GetLocalizedString("HeaderFavoriteShows"); } if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteEpisodes) { - return _localization.GetLocalizedString("ViewTypeTvFavoriteEpisodes"); + return _localization.GetLocalizedString("HeaderFavoriteEpisodes"); } if (itemStubType.HasValue && itemStubType.Value == StubType.Series) { - return _localization.GetLocalizedString("ViewTypeTvShowSeries"); + return _localization.GetLocalizedString("Shows"); } var episode = item as Episode; @@ -1071,8 +1071,10 @@ namespace Emby.Dlna.Didl writer.WriteStartElement(string.Empty, "res", NS_DIDL); - var width = albumartUrlInfo.Width; - var height = albumartUrlInfo.Height; + // Images must have a reported size or many clients (Bubble upnp), will only use the first thumbnail + // rather than using a larger one when available + var width = albumartUrlInfo.Width ?? maxWidth; + var height = albumartUrlInfo.Height ?? maxHeight; var contentFeatures = new ContentFeatureBuilder(_profile) .BuildImageHeader(format, width, height, imageInfo.IsDirectStream, org_Pn); @@ -1083,10 +1085,7 @@ namespace Emby.Dlna.Didl contentFeatures )); - if (width.HasValue && height.HasValue) - { - writer.WriteAttributeString("resolution", string.Format("{0}x{1}", width.Value, height.Value)); - } + writer.WriteAttributeString("resolution", string.Format("{0}x{1}", width, height)); writer.WriteString(albumartUrlInfo.Url); @@ -1138,8 +1137,21 @@ namespace Emby.Dlna.Didl } - int? width = null; - int? height = null; + int? width = imageInfo.Width; + int? height = imageInfo.Height; + + if (width == 0 || height == 0) + { + //_imageProcessor.GetImageSize(item, imageInfo); + width = null; + height = null; + } + + else if (width == -1 || height == -1) + { + width = null; + height = null; + } //try //{ diff --git a/Emby.Dlna/Eventing/EventManager.cs b/Emby.Dlna/Eventing/EventManager.cs index 0516585ae0..67eac640e1 100644 --- a/Emby.Dlna/Eventing/EventManager.cs +++ b/Emby.Dlna/Eventing/EventManager.cs @@ -26,9 +26,11 @@ namespace Emby.Dlna.Eventing _logger = logger; } - public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string requestedTimeoutString) + public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string notificationType, string requestedTimeoutString, string callbackUrl) { - var subscription = GetSubscription(subscriptionId, true); + var subscription = GetSubscription(subscriptionId, false); + + int timeoutSeconds; // Remove logging for now because some devices are sending this very frequently // TODO re-enable with dlna debug logging setting @@ -37,10 +39,18 @@ namespace Emby.Dlna.Eventing // timeout, // subscription.CallbackUrl); - subscription.TimeoutSeconds = ParseTimeout(requestedTimeoutString) ?? 300; - subscription.SubscriptionTime = DateTime.UtcNow; + if (subscription != null) + { + subscription.TimeoutSeconds = ParseTimeout(requestedTimeoutString) ?? 300; + timeoutSeconds = subscription.TimeoutSeconds; + subscription.SubscriptionTime = DateTime.UtcNow; + } + else + { + timeoutSeconds = 300; + } - return GetEventSubscriptionResponse(subscriptionId, requestedTimeoutString, subscription.TimeoutSeconds); + return GetEventSubscriptionResponse(subscriptionId, requestedTimeoutString, timeoutSeconds); } public EventSubscriptionResponse CreateEventSubscription(string notificationType, string requestedTimeoutString, string callbackUrl) @@ -172,7 +182,10 @@ namespace Emby.Dlna.Eventing try { - await _httpClient.SendAsync(options, "NOTIFY").ConfigureAwait(false); + using (await _httpClient.SendAsync(options, "NOTIFY").ConfigureAwait(false)) + { + + } } catch (OperationCanceledException) { diff --git a/Emby.Dlna/PlayTo/SsdpHttpClient.cs b/Emby.Dlna/PlayTo/SsdpHttpClient.cs index 1aa671b8ff..78b688d92a 100644 --- a/Emby.Dlna/PlayTo/SsdpHttpClient.cs +++ b/Emby.Dlna/PlayTo/SsdpHttpClient.cs @@ -31,14 +31,15 @@ namespace Emby.Dlna.PlayTo bool logRequest = true, string header = null) { - var response = await PostSoapDataAsync(NormalizeServiceUrl(baseUrl, service.ControlUrl), "\"" + service.ServiceType + "#" + command + "\"", postData, header, logRequest) - .ConfigureAwait(false); - - using (var stream = response.Content) + using (var response = await PostSoapDataAsync(NormalizeServiceUrl(baseUrl, service.ControlUrl), "\"" + service.ServiceType + "#" + command + "\"", postData, header, logRequest) + .ConfigureAwait(false)) { - using (var reader = new StreamReader(stream, Encoding.UTF8)) + using (var stream = response.Content) { - return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); + using (var reader = new StreamReader(stream, Encoding.UTF8)) + { + return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); + } } } } @@ -71,7 +72,10 @@ namespace Emby.Dlna.PlayTo Url = url, UserAgent = USERAGENT, LogErrorResponseBody = true, - BufferContent = false + BufferContent = false, + + // The periodic requests may keep some devices awake + LogRequestAsDebug = true }; options.RequestHeaders["HOST"] = ip + ":" + port.ToString(_usCulture); @@ -79,7 +83,10 @@ namespace Emby.Dlna.PlayTo options.RequestHeaders["NT"] = "upnp:event"; options.RequestHeaders["TIMEOUT"] = "Second-" + timeOut.ToString(_usCulture); - await _httpClient.SendAsync(options, "SUBSCRIBE").ConfigureAwait(false); + using (await _httpClient.SendAsync(options, "SUBSCRIBE").ConfigureAwait(false)) + { + + } } public async Task GetDataAsync(string url) @@ -89,16 +96,22 @@ namespace Emby.Dlna.PlayTo Url = url, UserAgent = USERAGENT, LogErrorResponseBody = true, - BufferContent = false + BufferContent = false, + + // The periodic requests may keep some devices awake + LogRequestAsDebug = true }; options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName; - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(options, "GET").ConfigureAwait(false)) { - using (var reader = new StreamReader(stream, Encoding.UTF8)) + using (var stream = response.Content) { - return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); + using (var reader = new StreamReader(stream, Encoding.UTF8)) + { + return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace); + } } } } @@ -118,7 +131,10 @@ namespace Emby.Dlna.PlayTo UserAgent = USERAGENT, LogRequest = logRequest || _config.GetDlnaConfiguration().EnableDebugLog, LogErrorResponseBody = true, - BufferContent = false + BufferContent = false, + + // The periodic requests may keep some devices awake + LogRequestAsDebug = true }; options.RequestHeaders["SOAPAction"] = soapAction; @@ -130,7 +146,8 @@ namespace Emby.Dlna.PlayTo options.RequestHeaders["contentFeatures.dlna.org"] = header; } - options.RequestContentType = "text/xml; charset=\"utf-8\""; + options.RequestContentType = "text/xml"; + options.AppendCharsetToMimeType = true; options.RequestContent = postData; return _httpClient.Post(options); diff --git a/Emby.Dlna/Service/BaseService.cs b/Emby.Dlna/Service/BaseService.cs index ddc37da095..bc7f01d974 100644 --- a/Emby.Dlna/Service/BaseService.cs +++ b/Emby.Dlna/Service/BaseService.cs @@ -24,9 +24,9 @@ namespace Emby.Dlna.Service return EventManager.CancelEventSubscription(subscriptionId); } - public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string timeoutString) + public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string notificationType, string timeoutString, string callbackUrl) { - return EventManager.RenewEventSubscription(subscriptionId, timeoutString); + return EventManager.RenewEventSubscription(subscriptionId, notificationType, timeoutString, callbackUrl); } public EventSubscriptionResponse CreateEventSubscription(string notificationType, string timeoutString, string callbackUrl) diff --git a/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs b/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs index 04f916eb1b..38e2879ea8 100644 --- a/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs +++ b/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs @@ -149,7 +149,7 @@ namespace Emby.Drawing.ImageMagick var originalImageSize = new ImageSize(originalImage.CurrentImage.Width, originalImage.CurrentImage.Height); - if (!options.CropWhiteSpace && options.HasDefaultOptions(inputPath, originalImageSize)) + if (!options.CropWhiteSpace && options.HasDefaultOptions(inputPath, originalImageSize) && !autoOrient) { // Just spit out the original file if all the options are default return inputPath; diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs index 8314549725..e28d22cf7b 100644 --- a/Emby.Drawing/ImageProcessor.cs +++ b/Emby.Drawing/ImageProcessor.cs @@ -442,19 +442,44 @@ namespace Emby.Drawing return GetCachePath(ResizedImageCachePath, filename, "." + format.ToString().ToLower()); } - public ImageSize GetImageSize(ItemImageInfo info, bool allowSlowMethods) + public ImageSize GetImageSize(BaseItem item, ItemImageInfo info) { - return GetImageSize(info.Path, allowSlowMethods); + return GetImageSize(item, info, false, true); } - public ImageSize GetImageSize(ItemImageInfo info) + public ImageSize GetImageSize(BaseItem item, ItemImageInfo info, bool allowSlowMethods, bool updateItem) { - return GetImageSize(info.Path, false); + var width = info.Width; + var height = info.Height; + + if (height > 0 && width > 0) + { + return new ImageSize + { + Width = width, + Height = height + }; + } + + var path = info.Path; + _logger.Info("Getting image size for item {0} {1}", item.GetType().Name, path); + + var size = GetImageSize(path, allowSlowMethods); + + info.Height = Convert.ToInt32(size.Height); + info.Width = Convert.ToInt32(size.Width); + + if (updateItem) + { + _libraryManager().UpdateImages(item); + } + + return size; } public ImageSize GetImageSize(string path) { - return GetImageSize(path, false); + return GetImageSize(path, true); } /// diff --git a/Emby.Photos/PhotoProvider.cs b/Emby.Photos/PhotoProvider.cs index fe77cff694..11a7db47d3 100644 --- a/Emby.Photos/PhotoProvider.cs +++ b/Emby.Photos/PhotoProvider.cs @@ -17,7 +17,7 @@ using TagLib.IFD.Tags; namespace Emby.Photos { - public class PhotoProvider : ICustomMetadataProvider, IHasItemChangeMonitor, IForcedProvider + public class PhotoProvider : ICustomMetadataProvider, IForcedProvider { private readonly ILogger _logger; private readonly IFileSystem _fileSystem; @@ -31,14 +31,14 @@ namespace Emby.Photos } // These are causing taglib to hang - private string[] _excludeExtensions = new string[] { ".dng" }; + private string[] _includextensions = new string[] { ".jpg", ".jpeg", ".png", ".tiff" }; public Task FetchAsync(Photo item, MetadataRefreshOptions options, CancellationToken cancellationToken) { item.SetImagePath(ImageType.Primary, item.Path); // Examples: https://github.com/mono/taglib-sharp/blob/a5f6949a53d09ce63ee7495580d6802921a21f14/tests/fixtures/TagLib.Tests.Images/NullOrientationTest.cs - if (!_excludeExtensions.Contains(Path.GetExtension(item.Path) ?? string.Empty, StringComparer.OrdinalIgnoreCase)) + if (_includextensions.Contains(Path.GetExtension(item.Path) ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { try { @@ -163,10 +163,14 @@ namespace Emby.Photos if (!item.Width.HasValue || !item.Height.HasValue) { - var size = _imageProcessor.GetImageSize(item.Path); + var img = item.GetImageInfo(ImageType.Primary, 0); + var size = _imageProcessor.GetImageSize(item, img, false, false); - item.Width = Convert.ToInt32(size.Width); - item.Height = Convert.ToInt32(size.Height); + if (size.Width > 0 && size.Height > 0) + { + item.Width = Convert.ToInt32(size.Width); + item.Height = Convert.ToInt32(size.Height); + } } const ItemUpdateType result = ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataImport; @@ -177,19 +181,5 @@ namespace Emby.Photos { get { return "Embedded Information"; } } - - public bool HasChanged(IHasMetadata item, IDirectoryService directoryService) - { - if (item.EnableRefreshOnDateModifiedChange && !string.IsNullOrWhiteSpace(item.Path) && item.LocationType == LocationType.FileSystem) - { - var file = directoryService.GetFile(item.Path); - if (file != null && file.LastWriteTimeUtc != item.DateModified) - { - return true; - } - } - - return false; - } } } diff --git a/Emby.Server.Implementations/Activity/ActivityRepository.cs b/Emby.Server.Implementations/Activity/ActivityRepository.cs index 1ae8e5e667..6293cc69fa 100644 --- a/Emby.Server.Implementations/Activity/ActivityRepository.cs +++ b/Emby.Server.Implementations/Activity/ActivityRepository.cs @@ -49,7 +49,7 @@ namespace Emby.Server.Implementations.Activity RunDefaultInitialization(connection); string[] queries = { - "create table if not exists ActivityLogEntries (Id GUID PRIMARY KEY, Name TEXT, Overview TEXT, ShortOverview TEXT, Type TEXT, ItemId TEXT, UserId TEXT, DateCreated DATETIME, LogSeverity TEXT)", + "create table if not exists ActivityLogEntries (Id GUID PRIMARY KEY NOT NULL, Name TEXT NOT NULL, Overview TEXT, ShortOverview TEXT, Type TEXT NOT NULL, ItemId TEXT, UserId TEXT, DateCreated DATETIME NOT NULL, LogSeverity TEXT NOT NULL)", "create index if not exists idx_ActivityLogEntries on ActivityLogEntries(Id)" }; diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs index 57c509923a..c1ab9ec222 100644 --- a/Emby.Server.Implementations/ApplicationHost.cs +++ b/Emby.Server.Implementations/ApplicationHost.cs @@ -775,7 +775,14 @@ namespace Emby.Server.Implementations } // Put the app config in the log for troubleshooting purposes - Logger.LogMultiline("Application configuration:", LogSeverity.Info, new StringBuilder(JsonSerializer.SerializeToString(ConfigurationManager.CommonConfiguration))); + var configJson = new StringBuilder(JsonSerializer.SerializeToString(ConfigurationManager.CommonConfiguration)); + + if (!string.IsNullOrWhiteSpace(ServerConfigurationManager.Configuration.CertificatePassword)) + { + configJson = configJson.Replace(ServerConfigurationManager.Configuration.CertificatePassword, "####"); + } + + Logger.LogMultiline("Application configuration:", LogSeverity.Info, configJson); if (Plugins != null) { @@ -792,6 +799,11 @@ namespace Emby.Server.Implementations protected abstract IConnectManager CreateConnectManager(); protected abstract ISyncManager CreateSyncManager(); + + protected virtual IHttpClient CreateHttpClient() + { + return new HttpClientManager.HttpClientManager(ApplicationPaths, LogManager.GetLogger("HttpClient"), FileSystemManager, MemoryStreamFactory, GetDefaultUserAgent); + } /// /// Registers resources that classes will depend on @@ -814,7 +826,7 @@ namespace Emby.Server.Implementations RegisterSingleInstance(FileSystemManager); - HttpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, LogManager.GetLogger("HttpClient"), FileSystemManager, MemoryStreamFactory, GetDefaultUserAgent); + HttpClient = CreateHttpClient(); RegisterSingleInstance(HttpClient); RegisterSingleInstance(NetworkManager); @@ -938,7 +950,9 @@ namespace Emby.Server.Implementations ConnectManager = CreateConnectManager(); RegisterSingleInstance(ConnectManager); - DeviceManager = new DeviceManager(new DeviceRepository(ApplicationPaths, JsonSerializer, LogManager.GetLogger("DeviceManager"), FileSystemManager), UserManager, FileSystemManager, LibraryMonitor, ServerConfigurationManager, LogManager.GetLogger("DeviceManager"), NetworkManager); + var deviceRepo = new SqliteDeviceRepository(LogManager.GetLogger("DeviceManager"), ServerConfigurationManager, FileSystemManager, JsonSerializer); + deviceRepo.Initialize(); + DeviceManager = new DeviceManager(deviceRepo, UserManager, FileSystemManager, LibraryMonitor, ServerConfigurationManager, LogManager.GetLogger("DeviceManager"), NetworkManager); RegisterSingleInstance(DeviceManager); var newsService = new Emby.Server.Implementations.News.NewsService(ApplicationPaths, JsonSerializer); @@ -1116,7 +1130,7 @@ namespace Emby.Server.Implementations IsoManager.AddParts(list); } - private string GetDefaultUserAgent() + protected string GetDefaultUserAgent() { var name = FormatAttribute(Name); diff --git a/Emby.Server.Implementations/Channels/ChannelManager.cs b/Emby.Server.Implementations/Channels/ChannelManager.cs index d3950929d4..c42f22804b 100644 --- a/Emby.Server.Implementations/Channels/ChannelManager.cs +++ b/Emby.Server.Implementations/Channels/ChannelManager.cs @@ -373,7 +373,7 @@ namespace Emby.Server.Implementations.Channels private async Task GetChannel(IChannel channelInfo, CancellationToken cancellationToken) { - var parentFolder = await GetInternalChannelFolder(cancellationToken).ConfigureAwait(false); + var parentFolder = GetInternalChannelFolder(cancellationToken); var parentFolderId = parentFolder.Id; var id = GetInternalChannelId(channelInfo.Name); @@ -434,7 +434,7 @@ namespace Emby.Server.Implementations.Channels } else if (forceUpdate) { - await item.UpdateToRepository(ItemUpdateType.None, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.None, cancellationToken); } await item.RefreshMetadata(new MetadataRefreshOptions(_fileSystem), cancellationToken); @@ -655,14 +655,12 @@ namespace Emby.Server.Implementations.Channels // Avoid implicitly captured closure var token = cancellationToken; - var itemTasks = items.Select(i => + var internalItems = items.Select(i => { var channelProvider = i.Item1; var internalChannelId = GetInternalChannelId(channelProvider.Name); return GetChannelItemEntity(i.Item2, channelProvider, internalChannelId, token); - }); - - var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false); + }).ToArray(); internalItems = ApplyFilters(internalItems, query.Filters, user).ToArray(); RefreshIfNeeded(internalItems); @@ -802,14 +800,12 @@ namespace Emby.Server.Implementations.Channels // Avoid implicitly captured closure var token = cancellationToken; - var itemTasks = items.Select(i => + var internalItems = items.Select(i => { var channelProvider = i.Item1; var internalChannelId = GetInternalChannelId(channelProvider.Name); return GetChannelItemEntity(i.Item2, channelProvider, internalChannelId, token); - }); - - var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false); + }).ToArray(); return new QueryResult { @@ -955,9 +951,7 @@ namespace Emby.Server.Implementations.Channels var providerTotalRecordCount = providerLimit.HasValue ? itemsResult.TotalRecordCount : null; - var tasks = itemsResult.Items.Select(i => GetChannelItemEntity(i, channelProvider, channel.Id, cancellationToken)); - - var internalItems = await Task.WhenAll(tasks).ConfigureAwait(false); + var internalItems = itemsResult.Items.Select(i => GetChannelItemEntity(i, channelProvider, channel.Id, cancellationToken)).ToArray(); if (user != null) { @@ -1234,7 +1228,7 @@ namespace Emby.Server.Implementations.Channels return item; } - private async Task GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Guid internalChannelId, CancellationToken cancellationToken) + private BaseItem GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Guid internalChannelId, CancellationToken cancellationToken) { BaseItem item; bool isNew; @@ -1399,7 +1393,7 @@ namespace Emby.Server.Implementations.Channels } else if (forceUpdate) { - await item.UpdateToRepository(ItemUpdateType.None, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.None, cancellationToken); } SaveMediaSources(item, info.MediaSources); @@ -1542,20 +1536,20 @@ namespace Emby.Server.Implementations.Channels return items; } - public async Task GetChannelFolder(string userId, CancellationToken cancellationToken) + public BaseItemDto GetChannelFolder(string userId, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(userId) ? null : _userManager.GetUserById(userId); - var folder = await GetInternalChannelFolder(cancellationToken).ConfigureAwait(false); + var folder = GetInternalChannelFolder(cancellationToken); return _dtoService.GetBaseItemDto(folder, new DtoOptions(), user); } - public async Task GetInternalChannelFolder(CancellationToken cancellationToken) + public Folder GetInternalChannelFolder(CancellationToken cancellationToken) { - var name = _localization.GetLocalizedString("ViewTypeChannels"); + var name = _localization.GetLocalizedString("Channels"); - return await _libraryManager.GetNamedView(name, "channels", "zz_" + name, cancellationToken).ConfigureAwait(false); + return _libraryManager.GetNamedView(name, "channels", "zz_" + name, cancellationToken); } } diff --git a/Emby.Server.Implementations/Collections/CollectionManager.cs b/Emby.Server.Implementations/Collections/CollectionManager.cs index 2e884e729c..c8e947fd7d 100644 --- a/Emby.Server.Implementations/Collections/CollectionManager.cs +++ b/Emby.Server.Implementations/Collections/CollectionManager.cs @@ -203,7 +203,7 @@ namespace Emby.Server.Implementations.Collections collection.UpdateRatingToContent(); - await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(collection.Id, refreshOptions, RefreshPriority.High); @@ -262,7 +262,7 @@ namespace Emby.Server.Implementations.Collections collection.UpdateRatingToContent(); - await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(_fileSystem), RefreshPriority.High); EventHelper.FireEventIfNotNull(ItemsRemovedFromCollection, this, new CollectionModifiedEventArgs diff --git a/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs b/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs index 1901ce848a..e6afcd4102 100644 --- a/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs @@ -75,7 +75,7 @@ namespace Emby.Server.Implementations.Data string[] queries = { - "create table if not exists userdisplaypreferences (id GUID, userId GUID, client text, data BLOB)", + "create table if not exists userdisplaypreferences (id GUID NOT NULL, userId GUID NOT NULL, client text NOT NULL, data BLOB NOT NULL)", "create unique index if not exists userdisplaypreferencesindex on userdisplaypreferences (id, userId, client)" }; diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index bc4ab8315f..01416a3079 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -146,11 +146,11 @@ namespace Emby.Server.Implementations.Data "create table if not exists TypedBaseItems (guid GUID primary key NOT NULL, type TEXT NOT NULL, data BLOB NULL, ParentId GUID NULL, Path TEXT NULL)", - "create table if not exists AncestorIds (ItemId GUID, AncestorId GUID, AncestorIdText TEXT, PRIMARY KEY (ItemId, AncestorId))", + "create table if not exists AncestorIds (ItemId GUID NOT NULL, AncestorId GUID NOT NULL, AncestorIdText TEXT NOT NULL, PRIMARY KEY (ItemId, AncestorId))", "create index if not exists idx_AncestorIds1 on AncestorIds(AncestorId)", "create index if not exists idx_AncestorIds5 on AncestorIds(AncestorIdText,ItemId)", - "create table if not exists ItemValues (ItemId GUID, Type INT, Value TEXT, CleanValue TEXT)", + "create table if not exists ItemValues (ItemId GUID NOT NULL, Type INT NOT NULL, Value TEXT NOT NULL, CleanValue TEXT NOT NULL)", "create table if not exists People (ItemId GUID, Name TEXT NOT NULL, Role TEXT, PersonType TEXT, SortOrder int, ListOrder int)", @@ -158,7 +158,7 @@ namespace Emby.Server.Implementations.Data "create index if not exists idxPeopleItemId1 on People(ItemId,ListOrder)", "create index if not exists idxPeopleName on People(Name)", - "create table if not exists "+ChaptersTableName+" (ItemId GUID, ChapterIndex INT, StartPositionTicks BIGINT, Name TEXT, ImagePath TEXT, PRIMARY KEY (ItemId, ChapterIndex))", + "create table if not exists "+ChaptersTableName+" (ItemId GUID, ChapterIndex INT NOT NULL, StartPositionTicks BIGINT NOT NULL, Name TEXT, ImagePath TEXT, PRIMARY KEY (ItemId, ChapterIndex))", createMediaStreamsTableCommand, @@ -616,6 +616,33 @@ namespace Emby.Server.Implementations.Data SaveItems(new List { item }, cancellationToken); } + public void SaveImages(BaseItem item) + { + if (item == null) + { + throw new ArgumentNullException("item"); + } + + CheckDisposed(); + + using (WriteLock.Write()) + { + using (var connection = CreateConnection()) + { + connection.RunInTransaction(db => + { + using (var saveImagesStatement = PrepareStatement(db, "Update TypedBaseItems set Images=@Images where guid=@Id")) + { + saveImagesStatement.TryBind("@Id", item.Id.ToGuidBlob()); + saveImagesStatement.TryBind("@Images", SerializeImages(item)); + + saveImagesStatement.MoveNext(); + } + }, TransactionMode); + } + } + } + /// /// Saves the items. /// @@ -1170,7 +1197,11 @@ namespace Emby.Server.Implementations.Data delimeter + image.DateModified.Ticks.ToString(CultureInfo.InvariantCulture) + delimeter + - image.Type; + image.Type + + delimeter + + image.Width.ToString(CultureInfo.InvariantCulture) + + delimeter + + image.Height.ToString(CultureInfo.InvariantCulture); } public ItemImageInfo ItemImageInfoFromValueString(string value) @@ -1198,6 +1229,20 @@ namespace Emby.Server.Implementations.Data image.Type = type; } + if (parts.Length >= 5) + { + int width; + int height; + if (int.TryParse(parts[3], NumberStyles.Integer, CultureInfo.InvariantCulture, out width)) + { + if (int.TryParse(parts[4], NumberStyles.Integer, CultureInfo.InvariantCulture, out height)) + { + image.Width = width; + image.Height = height; + } + } + } + return image; } @@ -3038,8 +3083,8 @@ namespace Emby.Server.Implementations.Data { if (orderBy.Count == 0) { - orderBy.Add(new Tuple(ItemSortBy.Random, SortOrder.Ascending)); orderBy.Add(new Tuple("SimilarityScore", SortOrder.Descending)); + orderBy.Add(new Tuple(ItemSortBy.Random, SortOrder.Ascending)); //orderBy.Add(new Tuple(ItemSortBy.Random, SortOrder.Ascending)); } } diff --git a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs index ef1d7ba445..ad5c60edeb 100644 --- a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs @@ -52,7 +52,7 @@ namespace Emby.Server.Implementations.Data { string[] queries = { - "create table if not exists userdata (key nvarchar, userId GUID, rating float null, played bit, playCount int, isFavorite bit, playbackPositionTicks bigint, lastPlayedDate datetime null)", + "create table if not exists userdata (key nvarchar not null, userId GUID not null, rating float null, played bit not null, playCount int not null, isFavorite bit not null, playbackPositionTicks bigint not null, lastPlayedDate datetime null)", "create table if not exists DataSettings (IsUserDataImported bit)", diff --git a/Emby.Server.Implementations/Data/SqliteUserRepository.cs b/Emby.Server.Implementations/Data/SqliteUserRepository.cs index b65996e405..e89de11c6d 100644 --- a/Emby.Server.Implementations/Data/SqliteUserRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteUserRepository.cs @@ -53,9 +53,8 @@ namespace Emby.Server.Implementations.Data string[] queries = { - "create table if not exists users (guid GUID primary key, data BLOB)", + "create table if not exists users (guid GUID primary key NOT NULL, data BLOB NOT NULL)", "create index if not exists idx_users on users(guid)", - "create table if not exists schema_version (table_name primary key, version)", "pragma shrink_memory" }; diff --git a/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs b/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs index 55063872c1..5c205dd199 100644 --- a/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs +++ b/Emby.Server.Implementations/Devices/CameraUploadsFolder.cs @@ -28,7 +28,7 @@ namespace Emby.Server.Implementations.Devices [IgnoreDataMember] public override string CollectionType { - get { return MediaBrowser.Model.Entities.CollectionType.Photos; } + get { return MediaBrowser.Model.Entities.CollectionType.HomeVideos; } } [IgnoreDataMember] diff --git a/Emby.Server.Implementations/Devices/DeviceManager.cs b/Emby.Server.Implementations/Devices/DeviceManager.cs index 027a55516c..ee4c4bb265 100644 --- a/Emby.Server.Implementations/Devices/DeviceManager.cs +++ b/Emby.Server.Implementations/Devices/DeviceManager.cs @@ -50,7 +50,7 @@ namespace Emby.Server.Implementations.Devices _network = network; } - public async Task RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId) + public DeviceInfo RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId) { if (string.IsNullOrWhiteSpace(reportedId)) { @@ -76,14 +76,16 @@ namespace Emby.Server.Implementations.Devices device.DateLastModified = DateTime.UtcNow; - await _repo.SaveDevice(device).ConfigureAwait(false); + device.Name = string.IsNullOrWhiteSpace(device.CustomName) ? device.ReportedName : device.CustomName; + + _repo.SaveDevice(device); return device; } - public Task SaveCapabilities(string reportedId, ClientCapabilities capabilities) + public void SaveCapabilities(string reportedId, ClientCapabilities capabilities) { - return _repo.SaveCapabilities(reportedId, capabilities); + _repo.SaveCapabilities(reportedId, capabilities); } public ClientCapabilities GetCapabilities(string reportedId) @@ -98,13 +100,13 @@ namespace Emby.Server.Implementations.Devices public QueryResult GetDevices(DeviceQuery query) { - IEnumerable devices = _repo.GetDevices().OrderByDescending(i => i.DateLastModified); + IEnumerable devices = _repo.GetDevices(); if (query.SupportsSync.HasValue) { var val = query.SupportsSync.Value; - devices = devices.Where(i => GetCapabilities(i.Id).SupportsSync == val); + devices = devices.Where(i => i.Capabilities.SupportsSync == val); } if (query.SupportsPersistentIdentifier.HasValue) @@ -113,8 +115,7 @@ namespace Emby.Server.Implementations.Devices devices = devices.Where(i => { - var caps = GetCapabilities(i.Id); - var deviceVal = caps.SupportsPersistentIdentifier; + var deviceVal = i.Capabilities.SupportsPersistentIdentifier; return deviceVal == val; }); } @@ -132,9 +133,9 @@ namespace Emby.Server.Implementations.Devices }; } - public Task DeleteDevice(string id) + public void DeleteDevice(string id) { - return _repo.DeleteDevice(id); + _repo.DeleteDevice(id); } public ContentUploadHistory GetCameraUploadHistory(string deviceId) @@ -213,14 +214,16 @@ namespace Emby.Server.Implementations.Devices get { return Path.Combine(_config.CommonApplicationPaths.DataPath, "camerauploads"); } } - public async Task UpdateDeviceInfo(string id, DeviceOptions options) + public void UpdateDeviceInfo(string id, DeviceOptions options) { var device = GetDevice(id); device.CustomName = options.CustomName; device.CameraUploadPath = options.CameraUploadPath; - await _repo.SaveDevice(device).ConfigureAwait(false); + device.Name = string.IsNullOrWhiteSpace(device.CustomName) ? device.ReportedName : device.CustomName; + + _repo.SaveDevice(device); EventHelper.FireEventIfNotNull(DeviceOptionsUpdated, this, new GenericEventArgs(device), _logger); } diff --git a/Emby.Server.Implementations/Devices/DeviceRepository.cs b/Emby.Server.Implementations/Devices/DeviceRepository.cs deleted file mode 100644 index b286a3bb07..0000000000 --- a/Emby.Server.Implementations/Devices/DeviceRepository.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using MediaBrowser.Common.Configuration; -using MediaBrowser.Common.Extensions; -using MediaBrowser.Controller.Devices; -using MediaBrowser.Model.Devices; -using MediaBrowser.Model.IO; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Serialization; -using MediaBrowser.Model.Session; -using MediaBrowser.Model.Extensions; - -namespace Emby.Server.Implementations.Devices -{ - public class DeviceRepository : IDeviceRepository - { - private readonly object _syncLock = new object(); - - private readonly IApplicationPaths _appPaths; - private readonly IJsonSerializer _json; - private readonly ILogger _logger; - private readonly IFileSystem _fileSystem; - - private Dictionary _devices; - - public DeviceRepository(IApplicationPaths appPaths, IJsonSerializer json, ILogger logger, IFileSystem fileSystem) - { - _appPaths = appPaths; - _json = json; - _logger = logger; - _fileSystem = fileSystem; - } - - private string GetDevicesPath() - { - return Path.Combine(_appPaths.DataPath, "devices"); - } - - private string GetDevicePath(string id) - { - return Path.Combine(GetDevicesPath(), id.GetMD5().ToString("N")); - } - - public Task SaveDevice(DeviceInfo device) - { - var path = Path.Combine(GetDevicePath(device.Id), "device.json"); - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); - - lock (_syncLock) - { - _json.SerializeToFile(device, path); - _devices[device.Id] = device; - } - return Task.FromResult(true); - } - - public Task SaveCapabilities(string reportedId, ClientCapabilities capabilities) - { - var device = GetDevice(reportedId); - - if (device == null) - { - throw new ArgumentException("No device has been registed with id " + reportedId); - } - - device.Capabilities = capabilities; - SaveDevice(device); - - return Task.FromResult(true); - } - - public ClientCapabilities GetCapabilities(string reportedId) - { - var device = GetDevice(reportedId); - - return device == null ? null : device.Capabilities; - } - - public DeviceInfo GetDevice(string id) - { - if (string.IsNullOrWhiteSpace(id)) - { - throw new ArgumentNullException("id"); - } - - return GetDevices() - .FirstOrDefault(i => string.Equals(i.Id, id, StringComparison.OrdinalIgnoreCase)); - } - - public IEnumerable GetDevices() - { - lock (_syncLock) - { - if (_devices == null) - { - _devices = new Dictionary(StringComparer.OrdinalIgnoreCase); - - var devices = LoadDevices().ToList(); - foreach (var device in devices) - { - _devices[device.Id] = device; - } - } - return _devices.Values.ToList(); - } - } - - private IEnumerable LoadDevices() - { - var path = GetDevicesPath(); - - try - { - return _fileSystem - .GetFilePaths(path, true) - .Where(i => string.Equals(Path.GetFileName(i), "device.json", StringComparison.OrdinalIgnoreCase)) - .ToList() - .Select(i => - { - try - { - return _json.DeserializeFromFile(i); - } - catch (Exception ex) - { - _logger.ErrorException("Error reading {0}", ex, i); - return null; - } - }) - .Where(i => i != null); - } - catch (IOException) - { - return new List(); - } - } - - public Task DeleteDevice(string id) - { - var path = GetDevicePath(id); - - lock (_syncLock) - { - try - { - _fileSystem.DeleteDirectory(path, true); - } - catch (IOException) - { - } - - _devices = null; - } - - return Task.FromResult(true); - } - - public ContentUploadHistory GetCameraUploadHistory(string deviceId) - { - var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json"); - - lock (_syncLock) - { - try - { - return _json.DeserializeFromFile(path); - } - catch (IOException) - { - return new ContentUploadHistory - { - DeviceId = deviceId - }; - } - } - } - - public void AddCameraUpload(string deviceId, LocalFileInfo file) - { - var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json"); - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); - - lock (_syncLock) - { - ContentUploadHistory history; - - try - { - history = _json.DeserializeFromFile(path); - } - catch (IOException) - { - history = new ContentUploadHistory - { - DeviceId = deviceId - }; - } - - history.DeviceId = deviceId; - - var list = history.FilesUploaded.ToList(); - list.Add(file); - history.FilesUploaded = list.ToArray(list.Count); - - _json.SerializeToFile(history, path); - } - } - } -} diff --git a/Emby.Server.Implementations/Devices/SqliteDeviceRepository.cs b/Emby.Server.Implementations/Devices/SqliteDeviceRepository.cs new file mode 100644 index 0000000000..d7817b17ab --- /dev/null +++ b/Emby.Server.Implementations/Devices/SqliteDeviceRepository.cs @@ -0,0 +1,451 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using Emby.Server.Implementations.Data; +using MediaBrowser.Controller; +using MediaBrowser.Model.Logging; +using SQLitePCL.pretty; +using MediaBrowser.Model.Extensions; +using MediaBrowser.Model.IO; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Devices; +using MediaBrowser.Model.Devices; +using MediaBrowser.Model.Serialization; +using MediaBrowser.Model.Session; +using MediaBrowser.Controller.Configuration; + +namespace Emby.Server.Implementations.Devices +{ + public class SqliteDeviceRepository : BaseSqliteRepository, IDeviceRepository + { + private readonly CultureInfo _usCulture = new CultureInfo("en-US"); + protected IFileSystem FileSystem { get; private set; } + private readonly object _syncLock = new object(); + private readonly IJsonSerializer _json; + private IServerApplicationPaths _appPaths; + + public SqliteDeviceRepository(ILogger logger, IServerConfigurationManager config, IFileSystem fileSystem, IJsonSerializer json) + : base(logger) + { + var appPaths = config.ApplicationPaths; + + DbFilePath = Path.Combine(appPaths.DataPath, "devices.db"); + FileSystem = fileSystem; + _json = json; + _appPaths = appPaths; + } + + public void Initialize() + { + try + { + InitializeInternal(); + } + catch (Exception ex) + { + Logger.ErrorException("Error loading database file. Will reset and retry.", ex); + + FileSystem.DeleteFile(DbFilePath); + + InitializeInternal(); + } + } + + private void InitializeInternal() + { + using (var connection = CreateConnection()) + { + RunDefaultInitialization(connection); + + string[] queries = { + "create table if not exists Devices (Id TEXT PRIMARY KEY, Name TEXT NOT NULL, ReportedName TEXT NOT NULL, CustomName TEXT, CameraUploadPath TEXT, LastUserName TEXT, AppName TEXT NOT NULL, AppVersion TEXT NOT NULL, LastUserId TEXT, DateLastModified DATETIME NOT NULL, Capabilities TEXT NOT NULL)", + "create index if not exists idx_id on Devices(Id)" + }; + + connection.RunQueries(queries); + + MigrateDevices(); + } + } + + private void MigrateDevices() + { + List files; + try + { + files = FileSystem + .GetFilePaths(GetDevicesPath(), true) + .Where(i => string.Equals(Path.GetFileName(i), "device.json", StringComparison.OrdinalIgnoreCase)) + .ToList(); + } + catch (IOException) + { + return; + } + + foreach (var file in files) + { + try + { + var device = _json.DeserializeFromFile(file); + + device.Name = string.IsNullOrWhiteSpace(device.CustomName) ? device.ReportedName : device.CustomName; + + SaveDevice(device); + } + catch (Exception ex) + { + Logger.ErrorException("Error reading {0}", ex, file); + } + finally + { + try + { + FileSystem.DeleteFile(file); + } + catch (IOException) + { + try + { + FileSystem.MoveFile(file, Path.ChangeExtension(file, ".old")); + } + catch (IOException) + { + } + } + } + } + } + + private const string BaseSelectText = "select Id, Name, ReportedName, CustomName, CameraUploadPath, LastUserName, AppName, AppVersion, LastUserId, DateLastModified, Capabilities from Devices"; + + public void SaveCapabilities(string deviceId, ClientCapabilities capabilities) + { + using (WriteLock.Write()) + { + using (var connection = CreateConnection()) + { + connection.RunInTransaction(db => + { + using (var statement = db.PrepareStatement("update devices set Capabilities=@Capabilities where Id=@Id")) + { + statement.TryBind("@Id", deviceId); + + if (capabilities == null) + { + statement.TryBindNull("@Capabilities"); + } + else + { + statement.TryBind("@Capabilities", _json.SerializeToString(capabilities)); + } + + statement.MoveNext(); + } + }, TransactionMode); + } + } + } + + public void SaveDevice(DeviceInfo entry) + { + if (entry == null) + { + throw new ArgumentNullException("entry"); + } + + using (WriteLock.Write()) + { + using (var connection = CreateConnection()) + { + connection.RunInTransaction(db => + { + using (var statement = db.PrepareStatement("replace into Devices (Id, Name, ReportedName, CustomName, CameraUploadPath, LastUserName, AppName, AppVersion, LastUserId, DateLastModified, Capabilities) values (@Id, @Name, @ReportedName, @CustomName, @CameraUploadPath, @LastUserName, @AppName, @AppVersion, @LastUserId, @DateLastModified, @Capabilities)")) + { + statement.TryBind("@Id", entry.Id); + statement.TryBind("@Name", entry.Name); + statement.TryBind("@ReportedName", entry.ReportedName); + statement.TryBind("@CustomName", entry.CustomName); + statement.TryBind("@CameraUploadPath", entry.CameraUploadPath); + statement.TryBind("@LastUserName", entry.LastUserName); + statement.TryBind("@AppName", entry.AppName); + statement.TryBind("@AppVersion", entry.AppVersion); + statement.TryBind("@DateLastModified", entry.DateLastModified); + + if (entry.Capabilities == null) + { + statement.TryBindNull("@Capabilities"); + } + else + { + statement.TryBind("@Capabilities", _json.SerializeToString(entry.Capabilities)); + } + + statement.MoveNext(); + } + }, TransactionMode); + } + } + } + + public DeviceInfo GetDevice(string id) + { + using (WriteLock.Read()) + { + using (var connection = CreateConnection(true)) + { + var statementTexts = new List(); + statementTexts.Add(BaseSelectText + " where Id=@Id"); + + return connection.RunInTransaction(db => + { + var statements = PrepareAllSafe(db, statementTexts).ToList(); + + using (var statement = statements[0]) + { + statement.TryBind("@Id", id); + + foreach (var row in statement.ExecuteQuery()) + { + return GetEntry(row); + } + } + + return null; + + }, ReadTransactionMode); + } + } + } + + public List GetDevices() + { + using (WriteLock.Read()) + { + using (var connection = CreateConnection(true)) + { + var statementTexts = new List(); + statementTexts.Add(BaseSelectText + " order by DateLastModified desc"); + + return connection.RunInTransaction(db => + { + var list = new List(); + + var statements = PrepareAllSafe(db, statementTexts).ToList(); + + using (var statement = statements[0]) + { + foreach (var row in statement.ExecuteQuery()) + { + list.Add(GetEntry(row)); + } + } + + return list; + + }, ReadTransactionMode); + } + } + } + + public ClientCapabilities GetCapabilities(string id) + { + using (WriteLock.Read()) + { + using (var connection = CreateConnection(true)) + { + var statementTexts = new List(); + statementTexts.Add("Select Capabilities from Devices where Id=@Id"); + + return connection.RunInTransaction(db => + { + var statements = PrepareAllSafe(db, statementTexts).ToList(); + + using (var statement = statements[0]) + { + statement.TryBind("@Id", id); + + foreach (var row in statement.ExecuteQuery()) + { + if (row[0].SQLiteType != SQLiteType.Null) + { + return _json.DeserializeFromString(row.GetString(0)); + } + } + } + + return null; + + }, ReadTransactionMode); + } + } + } + + private DeviceInfo GetEntry(IReadOnlyList reader) + { + var index = 0; + + var info = new DeviceInfo + { + Id = reader.GetString(index) + }; + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.Name = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.ReportedName = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.CustomName = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.CameraUploadPath = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.LastUserName = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.AppName = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.AppVersion = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.LastUserId = reader.GetString(index); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.DateLastModified = reader[index].ReadDateTime(); + } + + index++; + if (reader[index].SQLiteType != SQLiteType.Null) + { + info.Capabilities = _json.DeserializeFromString(reader.GetString(index)); + } + + return info; + } + + private string GetDevicesPath() + { + return Path.Combine(_appPaths.DataPath, "devices"); + } + + private string GetDevicePath(string id) + { + return Path.Combine(GetDevicesPath(), id.GetMD5().ToString("N")); + } + + public ContentUploadHistory GetCameraUploadHistory(string deviceId) + { + var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json"); + + lock (_syncLock) + { + try + { + return _json.DeserializeFromFile(path); + } + catch (IOException) + { + return new ContentUploadHistory + { + DeviceId = deviceId + }; + } + } + } + + public void AddCameraUpload(string deviceId, LocalFileInfo file) + { + var path = Path.Combine(GetDevicePath(deviceId), "camerauploads.json"); + FileSystem.CreateDirectory(FileSystem.GetDirectoryName(path)); + + lock (_syncLock) + { + ContentUploadHistory history; + + try + { + history = _json.DeserializeFromFile(path); + } + catch (IOException) + { + history = new ContentUploadHistory + { + DeviceId = deviceId + }; + } + + history.DeviceId = deviceId; + + var list = history.FilesUploaded.ToList(); + list.Add(file); + history.FilesUploaded = list.ToArray(list.Count); + + _json.SerializeToFile(history, path); + } + } + + public void DeleteDevice(string id) + { + using (WriteLock.Write()) + { + using (var connection = CreateConnection()) + { + connection.RunInTransaction(db => + { + using (var statement = db.PrepareStatement("delete from devices where Id=@Id")) + { + statement.TryBind("@Id", id); + + statement.MoveNext(); + } + }, TransactionMode); + } + } + + var path = GetDevicePath(id); + + lock (_syncLock) + { + try + { + FileSystem.DeleteDirectory(path, true); + } + catch (IOException) + { + } + } + } + } +} diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index 9f08c6462d..0a316fcf1a 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -116,9 +116,11 @@ namespace Emby.Server.Implementations.Dto var channelTuples = new List>(); var index = 0; + var allCollectionFolders = _libraryManager.GetUserRootFolder().Children.OfType().ToList(); + foreach (var item in items) { - var dto = GetBaseItemDtoInternal(item, options, user, owner); + var dto = GetBaseItemDtoInternal(item, options, allCollectionFolders, user, owner); var tvChannel = item as LiveTvChannel; if (tvChannel != null) @@ -173,7 +175,8 @@ namespace Emby.Server.Implementations.Dto { var syncDictionary = GetSyncedItemProgress(options); - var dto = GetBaseItemDtoInternal(item, options, user, owner); + var allCollectionFolders = _libraryManager.GetUserRootFolder().Children.OfType().ToList(); + var dto = GetBaseItemDtoInternal(item, options, allCollectionFolders, user, owner); var tvChannel = item as LiveTvChannel; if (tvChannel != null) { @@ -303,7 +306,7 @@ namespace Emby.Server.Implementations.Dto } } - private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null) + private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, List allCollectionFolders, User user = null, BaseItem owner = null) { var fields = options.Fields; @@ -472,7 +475,8 @@ namespace Emby.Server.Implementations.Dto public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List taggedItems, Dictionary syncProgress, User user = null) { - var dto = GetBaseItemDtoInternal(item, options, user); + var allCollectionFolders = _libraryManager.GetUserRootFolder().Children.OfType().ToList(); + var dto = GetBaseItemDtoInternal(item, options, allCollectionFolders, user); if (taggedItems != null && options.Fields.Contains(ItemFields.ItemCounts)) { @@ -1604,12 +1608,12 @@ namespace Emby.Server.Implementations.Dto /// The dto. /// The item. /// Task. - public void AttachPrimaryImageAspectRatio(IItemDto dto, IHasMetadata item) + public void AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item) { dto.PrimaryImageAspectRatio = GetPrimaryImageAspectRatio(item); } - public double? GetPrimaryImageAspectRatio(IHasMetadata item) + public double? GetPrimaryImageAspectRatio(BaseItem item) { var imageInfo = item.GetImageInfo(ImageType.Primary, 0); @@ -1642,16 +1646,18 @@ namespace Emby.Server.Implementations.Dto return null; } - return null; - _logger.Info("Getting image size for item type {0}", item.GetType().Name); - try { - size = _imageProcessor.GetImageSize(imageInfo); + size = _imageProcessor.GetImageSize(item, imageInfo); + + if (size.Width <= 0 || size.Height <= 0) + { + return null; + } } - catch + catch (Exception ex) { - //_logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path); + //_logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, imageInfo.Path); return null; } } diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj index 518fa0d38d..1ecbabf2f4 100644 --- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj +++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj @@ -67,7 +67,7 @@ - + @@ -435,7 +435,6 @@ - @@ -573,6 +572,7 @@ + @@ -675,46 +675,40 @@ + - - - - - + - + - - - - + diff --git a/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs b/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs index e266ea21b8..9f4cd05fa9 100644 --- a/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs +++ b/Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs @@ -49,18 +49,20 @@ namespace Emby.Server.Implementations.FFMpeg var downloadInfo = _ffmpegInstallInfo; - var version = downloadInfo.Version; - - if (string.Equals(version, "path", StringComparison.OrdinalIgnoreCase)) + var prebuiltffmpeg = Path.Combine(_appPaths.ProgramSystemPath, downloadInfo.FFMpegFilename); + var prebuiltffprobe = Path.Combine(_appPaths.ProgramSystemPath, downloadInfo.FFProbeFilename); + if (_fileSystem.FileExists(prebuiltffmpeg) && _fileSystem.FileExists(prebuiltffprobe)) { return new FFMpegInfo { - ProbePath = downloadInfo.FFProbeFilename, - EncoderPath = downloadInfo.FFMpegFilename, - Version = version + ProbePath = prebuiltffprobe, + EncoderPath = prebuiltffmpeg, + Version = "external" }; } + var version = downloadInfo.Version; + if (string.Equals(version, "0", StringComparison.OrdinalIgnoreCase)) { return new FFMpegInfo(); diff --git a/Emby.Server.Implementations/HttpClientManager/HttpClientInfo.cs b/Emby.Server.Implementations/HttpClientManager/HttpClientInfo.cs index 6d17bf94de..21cec9d2be 100644 --- a/Emby.Server.Implementations/HttpClientManager/HttpClientInfo.cs +++ b/Emby.Server.Implementations/HttpClientManager/HttpClientInfo.cs @@ -1,4 +1,5 @@ using System; +using System.Net.Http; namespace Emby.Server.Implementations.HttpClientManager { @@ -12,5 +13,6 @@ namespace Emby.Server.Implementations.HttpClientManager /// /// The last timeout. public DateTime LastTimeout { get; set; } + public HttpClient HttpClient { get; set; } } } diff --git a/Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs b/Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs index fe545ecffd..ef95b47c38 100644 --- a/Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs +++ b/Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs @@ -279,39 +279,9 @@ namespace Emby.Server.Implementations.HttpClientManager public async Task Get(HttpRequestOptions options) { var response = await GetResponse(options).ConfigureAwait(false); - return response.Content; } - /// - /// Performs a GET request and returns the resulting stream - /// - /// The URL. - /// The resource pool. - /// The cancellation token. - /// Task{Stream}. - public Task Get(string url, SemaphoreSlim resourcePool, CancellationToken cancellationToken) - { - return Get(new HttpRequestOptions - { - Url = url, - ResourcePool = resourcePool, - CancellationToken = cancellationToken, - BufferContent = resourcePool != null - }); - } - - /// - /// Gets the specified URL. - /// - /// The URL. - /// The cancellation token. - /// Task{Stream}. - public Task Get(string url, CancellationToken cancellationToken) - { - return Get(url, null, cancellationToken); - } - /// /// send as an asynchronous operation. /// @@ -350,8 +320,6 @@ namespace Emby.Server.Implementations.HttpClientManager private async Task GetCachedResponse(string responseCachePath, TimeSpan cacheLength, string url) { - _logger.Info("Checking for cache file {0}", responseCachePath); - try { if (_fileSystem.GetLastWriteTimeUtc(responseCachePath).Add(cacheLength) > DateTime.UtcNow) @@ -429,10 +397,19 @@ namespace Emby.Server.Implementations.HttpClientManager { try { - var bytes = options.RequestContentBytes ?? - Encoding.UTF8.GetBytes(options.RequestContent ?? string.Empty); + // TODO: We can always put this in the options object if needed + var requestEncoding = Encoding.UTF8; - httpWebRequest.ContentType = options.RequestContentType ?? "application/x-www-form-urlencoded"; + var bytes = options.RequestContentBytes ?? requestEncoding.GetBytes(options.RequestContent ?? string.Empty); + + var contentType = options.RequestContentType ?? "application/x-www-form-urlencoded"; + + if (options.AppendCharsetToMimeType) + { + contentType = contentType.TrimEnd(';') + "; charset=\"utf-8\""; + } + + httpWebRequest.ContentType = contentType; httpWebRequest.ContentLength = bytes.Length; (await httpWebRequest.GetRequestStreamAsync().ConfigureAwait(false)).Write(bytes, 0, bytes.Length); @@ -460,7 +437,14 @@ namespace Emby.Server.Implementations.HttpClientManager if (options.LogRequest) { - _logger.Info("HttpClientManager {0}: {1}", httpMethod.ToUpper(), options.Url); + if (options.LogRequestAsDebug) + { + _logger.Debug("HttpClientManager {0}: {1}", httpMethod.ToUpper(), options.Url); + } + else + { + _logger.Info("HttpClientManager {0}: {1}", httpMethod.ToUpper(), options.Url); + } } try @@ -589,26 +573,6 @@ namespace Emby.Server.Implementations.HttpClientManager return response.Content; } - /// - /// Performs a POST request - /// - /// The URL. - /// Params to add to the POST data. - /// The resource pool. - /// The cancellation token. - /// stream on success, null on failure - public Task Post(string url, Dictionary postData, SemaphoreSlim resourcePool, CancellationToken cancellationToken) - { - return Post(new HttpRequestOptions - { - Url = url, - ResourcePool = resourcePool, - CancellationToken = cancellationToken, - BufferContent = resourcePool != null - - }, postData); - } - /// /// Downloads the contents of a given url into a temporary location /// @@ -647,7 +611,14 @@ namespace Emby.Server.Implementations.HttpClientManager if (options.LogRequest) { - _logger.Info("HttpClientManager.GetTempFileResponse url: {0}", options.Url); + if (options.LogRequestAsDebug) + { + _logger.Debug("HttpClientManager.GetTempFileResponse url: {0}", options.Url); + } + else + { + _logger.Info("HttpClientManager.GetTempFileResponse url: {0}", options.Url); + } } var client = GetHttpClient(GetHostFromUrl(options.Url), options.EnableHttpCompression); @@ -891,18 +862,6 @@ namespace Emby.Server.Implementations.HttpClientManager } } - /// - /// Posts the specified URL. - /// - /// The URL. - /// The post data. - /// The cancellation token. - /// Task{Stream}. - public Task Post(string url, Dictionary postData, CancellationToken cancellationToken) - { - return Post(url, postData, null, cancellationToken); - } - private Task GetResponseAsync(WebRequest request, TimeSpan timeout) { var taskCompletion = new TaskCompletionSource(); diff --git a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs index 737d4ceea0..937eb80293 100644 --- a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -411,8 +411,6 @@ namespace Emby.Server.Implementations.HttpServer host = host ?? string.Empty; - _logger.Debug("Validating host {0}", host); - if (_networkManager.IsInPrivateAddressSpace(host)) { hosts.Add("localhost"); @@ -725,12 +723,13 @@ namespace Emby.Server.Implementations.HttpServer Summary = route.Summary }); - //routes.Add(new RouteAttribute(DoubleNormalizeEmbyRoutePath(route.Path), route.Verbs) - //{ - // Notes = route.Notes, - // Priority = route.Priority, - // Summary = route.Summary - //}); + // needed because apps add /emby, and some users also add /emby, thereby double prefixing + routes.Add(new RouteAttribute(DoubleNormalizeEmbyRoutePath(route.Path), route.Verbs) + { + Notes = route.Notes, + Priority = route.Priority, + Summary = route.Summary + }); } return routes.ToArray(routes.Count); diff --git a/Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs b/Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs index c9d5ed0071..a41c51d1a8 100644 --- a/Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs +++ b/Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using MediaBrowser.Model.Services; using System.Linq; +using System.Threading; namespace Emby.Server.Implementations.HttpServer.Security { @@ -95,23 +96,44 @@ namespace Emby.Server.Implementations.HttpServer.Security { info.UserId = tokenInfo.UserId; + var updateToken = false; + // TODO: Remove these checks for IsNullOrWhiteSpace if (string.IsNullOrWhiteSpace(info.Client)) { info.Client = tokenInfo.AppName; } - if (string.IsNullOrWhiteSpace(info.Device)) - { - info.Device = tokenInfo.DeviceName; - } + if (string.IsNullOrWhiteSpace(info.DeviceId)) { info.DeviceId = tokenInfo.DeviceId; } + + + if (string.IsNullOrWhiteSpace(info.Device)) + { + info.Device = tokenInfo.DeviceName; + } + else if (!string.Equals(info.Device, tokenInfo.DeviceName, StringComparison.OrdinalIgnoreCase)) + { + updateToken = true; + tokenInfo.DeviceName = info.Device; + } + if (string.IsNullOrWhiteSpace(info.Version)) { info.Version = tokenInfo.AppVersion; } + else if (!string.Equals(info.Version, tokenInfo.AppVersion, StringComparison.OrdinalIgnoreCase)) + { + updateToken = true; + tokenInfo.AppVersion = info.Version; + } + + if (updateToken) + { + _authRepo.Update(tokenInfo, CancellationToken.None); + } } else { diff --git a/Emby.Server.Implementations/HttpServer/Security/SessionContext.cs b/Emby.Server.Implementations/HttpServer/Security/SessionContext.cs index dd5d64bf65..9826a0d564 100644 --- a/Emby.Server.Implementations/HttpServer/Security/SessionContext.cs +++ b/Emby.Server.Implementations/HttpServer/Security/SessionContext.cs @@ -25,15 +25,6 @@ namespace Emby.Server.Implementations.HttpServer.Security { var authorization = _authContext.GetAuthorizationInfo(requestContext); - //if (!string.IsNullOrWhiteSpace(authorization.Token)) - //{ - // var auth = GetTokenInfo(requestContext); - // if (auth != null) - // { - // return _sessionManager.GetSessionByAuthenticationToken(auth, authorization.DeviceId, requestContext.RemoteIp, authorization.Version); - // } - //} - var user = string.IsNullOrWhiteSpace(authorization.UserId) ? null : _userManager.GetUserById(authorization.UserId); return _sessionManager.LogSessionActivity(authorization.Client, authorization.Version, authorization.DeviceId, authorization.Device, requestContext.RemoteIp, user); } diff --git a/Emby.Server.Implementations/IO/FileRefresher.cs b/Emby.Server.Implementations/IO/FileRefresher.cs index 315bee103e..85b8bddd28 100644 --- a/Emby.Server.Implementations/IO/FileRefresher.cs +++ b/Emby.Server.Implementations/IO/FileRefresher.cs @@ -154,20 +154,13 @@ namespace Emby.Server.Implementations.IO .DistinctBy(i => i.Id) .ToList(); - //foreach (var p in paths) - //{ - // Logger.Info(p + " reports change."); - //} - - // If the root folder changed, run the library task so the user can see it - if (itemsToRefresh.Any(i => i is AggregateFolder)) - { - LibraryManager.ValidateMediaLibrary(new SimpleProgress(), CancellationToken.None); - return; - } - foreach (var item in itemsToRefresh) { + if (item is AggregateFolder) + { + continue; + } + Logger.Info(item.Name + " (" + item.Path + ") will be refreshed."); try diff --git a/Emby.Server.Implementations/IO/ManagedFileSystem.cs b/Emby.Server.Implementations/IO/ManagedFileSystem.cs index 0d85a977c5..125d9e980f 100644 --- a/Emby.Server.Implementations/IO/ManagedFileSystem.cs +++ b/Emby.Server.Implementations/IO/ManagedFileSystem.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Text; @@ -24,12 +25,14 @@ namespace Emby.Server.Implementations.IO private string _tempPath; private SharpCifsFileSystem _sharpCifsFileSystem; + private IEnvironmentInfo _environmentInfo; public ManagedFileSystem(ILogger logger, IEnvironmentInfo environmentInfo, string tempPath) { Logger = logger; _supportsAsyncFileStreams = true; _tempPath = tempPath; + _environmentInfo = environmentInfo; // On Linux, this needs to be true or symbolic links are ignored EnableFileSystemRequestConcat = environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows && @@ -1051,7 +1054,25 @@ namespace Emby.Server.Implementations.IO public virtual void SetExecutable(string path) { + if (_environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.OSX) + { + RunProcess("chmod", "+x \"" + path + "\"", GetDirectoryName(path)); + } + } + private void RunProcess(string path, string args, string workingDirectory) + { + using (var process = Process.Start(new ProcessStartInfo + { + Arguments = args, + FileName = path, + CreateNoWindow = true, + WorkingDirectory = workingDirectory, + WindowStyle = ProcessWindowStyle.Normal + })) + { + process.WaitForExit(); + } } } } diff --git a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs index 3f9ea79c6a..5cd7e4262e 100644 --- a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs +++ b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs @@ -42,23 +42,14 @@ namespace Emby.Server.Implementations.Images return true; } - public virtual IEnumerable GetSupportedImages(IHasMetadata item) + public virtual ImageType[] GetSupportedImages(IHasMetadata item) { - return new List + return new ImageType[] { - ImageType.Primary, - ImageType.Thumb + ImageType.Primary }; } - private IEnumerable GetEnabledImages(IHasMetadata item) - { - //var options = ProviderManager.GetMetadataOptions(item); - - return GetSupportedImages(item); - //return GetSupportedImages(item).Where(i => IsEnabled(options, i, item)).ToList(); - } - public async Task FetchAsync(T item, MetadataRefreshOptions options, CancellationToken cancellationToken) { if (!Supports(item)) @@ -67,7 +58,7 @@ namespace Emby.Server.Implementations.Images } var updateType = ItemUpdateType.None; - var supportedImages = GetEnabledImages(item).ToList(); + var supportedImages = GetSupportedImages(item); if (supportedImages.Contains(ImageType.Primary)) { @@ -253,7 +244,7 @@ namespace Emby.Server.Implementations.Images return false; } - var supportedImages = GetEnabledImages(item).ToList(); + var supportedImages = GetSupportedImages(item); if (supportedImages.Contains(ImageType.Primary) && HasChanged(item, ImageType.Primary)) { @@ -283,8 +274,7 @@ namespace Emby.Server.Implementations.Images return false; } - var age = DateTime.UtcNow - image.DateModified; - if (age.TotalDays <= MaxImageAgeDays) + if (!HasChangedByDate(item, image)) { return false; } @@ -293,6 +283,16 @@ namespace Emby.Server.Implementations.Images return true; } + protected virtual bool HasChangedByDate(IHasMetadata item, ItemImageInfo image) + { + var age = DateTime.UtcNow - image.DateModified; + if (age.TotalDays <= MaxImageAgeDays) + { + return false; + } + return true; + } + protected List GetFinalItems(IEnumerable items) { return GetFinalItems(items, 4); diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 85b91ac25a..cac1cb3b4b 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -738,8 +738,7 @@ namespace Emby.Server.Implementations.Library if (folder.ParentId != rootFolder.Id) { folder.ParentId = rootFolder.Id; - var task = folder.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); - Task.WaitAll(task); + folder.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); } rootFolder.AddVirtualChild(folder); @@ -1827,6 +1826,13 @@ namespace Emby.Server.Implementations.Library } } + public void UpdateImages(BaseItem item) + { + ItemRepository.SaveImages(item); + + RegisterItem(item); + } + /// /// Updates the item. /// @@ -1834,12 +1840,12 @@ namespace Emby.Server.Implementations.Library /// The update reason. /// The cancellation token. /// Task. - public async Task UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken) + public void UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken) { var locationType = item.LocationType; if (locationType != LocationType.Remote && locationType != LocationType.Virtual) { - await _providerManagerFactory().SaveMetadata(item, updateReason).ConfigureAwait(false); + _providerManagerFactory().SaveMetadata(item, updateReason); } item.DateLastSaved = DateTime.UtcNow; @@ -2053,7 +2059,7 @@ namespace Emby.Server.Implementations.Library return GetNamedView(user, name, null, viewType, sortName, cancellationToken); } - public async Task GetNamedView(string name, + public UserView GetNamedView(string name, string viewType, string sortName, CancellationToken cancellationToken) @@ -2100,7 +2106,7 @@ namespace Emby.Server.Implementations.Library if (refresh) { - await item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); _providerManagerFactory().QueueRefresh(item.Id, new MetadataRefreshOptions(_fileSystem) { // Not sure why this is necessary but need to figure it out @@ -2241,7 +2247,7 @@ namespace Emby.Server.Implementations.Library return item; } - public async Task GetNamedView(string name, + public UserView GetNamedView(string name, string parentId, string viewType, string sortName, @@ -2294,7 +2300,7 @@ namespace Emby.Server.Implementations.Library if (!string.Equals(viewType, item.ViewType, StringComparison.OrdinalIgnoreCase)) { item.ViewType = viewType; - await item.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken); } var refresh = isNew || DateTime.UtcNow - item.DateLastRefreshed >= _viewRefreshInterval; @@ -2822,7 +2828,7 @@ namespace Emby.Server.Implementations.Library await _providerManagerFactory().SaveImage(item, url, image.Type, imageIndex, CancellationToken.None).ConfigureAwait(false); - await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); return item.GetImageInfo(image.Type, imageIndex); } @@ -2838,7 +2844,7 @@ namespace Emby.Server.Implementations.Library // Remove this image to prevent it from retrying over and over item.RemoveImage(image); - await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); throw new InvalidOperationException(); } diff --git a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs index 757e67eb49..4830da8fcf 100644 --- a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs +++ b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs @@ -54,7 +54,7 @@ namespace Emby.Server.Implementations.Library { cancellationToken.ThrowIfCancellationRequested(); - await AssignTrailers(item, trailers).ConfigureAwait(false); + AssignTrailers(item, trailers); numComplete++; double percent = numComplete; @@ -65,7 +65,7 @@ namespace Emby.Server.Implementations.Library progress.Report(100); } - private async Task AssignTrailers(IHasTrailers item, IEnumerable channelTrailers) + private void AssignTrailers(IHasTrailers item, IEnumerable channelTrailers) { if (item is Game) { @@ -98,8 +98,7 @@ namespace Emby.Server.Implementations.Library item.RemoteTrailerIds = trailerIds; var baseItem = (BaseItem)item; - await baseItem.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None) - .ConfigureAwait(false); + baseItem.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); } } } diff --git a/Emby.Server.Implementations/Library/MediaSourceManager.cs b/Emby.Server.Implementations/Library/MediaSourceManager.cs index d60a043533..688da57649 100644 --- a/Emby.Server.Implementations/Library/MediaSourceManager.cs +++ b/Emby.Server.Implementations/Library/MediaSourceManager.cs @@ -96,23 +96,17 @@ namespace Emby.Server.Implementations.Library return GetMediaStreamsForItem(list); } - private List GetMediaStreamsForItem(IEnumerable streams) + private List GetMediaStreamsForItem(List streams) { - var list = streams.ToList(); - - var subtitleStreams = list - .Where(i => i.Type == MediaStreamType.Subtitle) - .ToList(); - - if (subtitleStreams.Count > 0) + foreach (var stream in streams) { - foreach (var subStream in subtitleStreams) + if (stream.Type == MediaStreamType.Subtitle) { - subStream.SupportsExternalStream = StreamSupportsExternalStream(subStream); + stream.SupportsExternalStream = StreamSupportsExternalStream(stream); } } - return list; + return streams; } public async Task> GetPlayackMediaSources(string id, string userId, bool enablePathSubstitution, string[] supportedLiveMediaTypes, CancellationToken cancellationToken) diff --git a/Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs index 4852c3c6ae..7aa4c299ff 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs @@ -12,7 +12,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Books /// public class BookResolver : MediaBrowser.Controller.Resolvers.ItemResolver { - private readonly string[] _validExtensions = {".pdf", ".epub", ".mobi", ".cbr", ".cbz"}; + private readonly string[] _validExtensions = { ".pdf", ".epub", ".mobi", ".cbr", ".cbz", ".azw3" }; /// /// @@ -26,7 +26,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Books // Only process items that are in a collection folder containing books if (!string.Equals(collectionType, CollectionType.Books, StringComparison.OrdinalIgnoreCase)) return null; - + if (args.IsDirectory) { return GetBook(args); @@ -69,9 +69,9 @@ namespace Emby.Server.Implementations.Library.Resolvers.Books return null; return new Book - { - Path = bookFiles[0].FullName - }; + { + Path = bookFiles[0].FullName + }; } } } diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index cd12647540..94cafa3e2d 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -11,7 +11,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; - +using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; @@ -69,13 +69,13 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)) { - return ResolveVideos(parent, files, directoryService, true, collectionType); + return ResolveVideos(parent, files, directoryService, true, collectionType, false); } if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) || string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) { - return ResolveVideos /// /// Movie. - private T FindMovie(string path, Folder parent, List fileSystemEntries, IDirectoryService directoryService, string collectionType, bool allowFilesAsFolders) + private T FindMovie(ItemResolveArgs args, string path, Folder parent, List fileSystemEntries, IDirectoryService directoryService, string collectionType, bool parseName) where T : Video, new() { var multiDiscFolders = new List(); + var libraryOptions = args.GetLibraryOptions(); + var supportPhotos = string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && libraryOptions.EnablePhotos; + var photos = new List(); + // Search for a folder rip foreach (var child in fileSystemEntries) { @@ -404,30 +410,37 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies Set3DFormat(movie); return movie; } + else if (supportPhotos && !child.IsHidden && PhotoResolver.IsImageFile(child.FullName, _imageProcessor)) + { + photos.Add(child); + } } - if (allowFilesAsFolders) + // TODO: Allow GetMultiDiscMovie in here + var supportsMultiVersion = !string.Equals(collectionType, CollectionType.HomeVideos) && + !string.Equals(collectionType, CollectionType.Photos) && + !string.Equals(collectionType, CollectionType.MusicVideos); + + var result = ResolveVideos(parent, fileSystemEntries, directoryService, supportsMultiVersion, collectionType, parseName) ?? + new MultiItemResolverResult(); + + if (result.Items.Count == 1) { - // TODO: Allow GetMultiDiscMovie in here - var supportsMultiVersion = !string.Equals(collectionType, CollectionType.HomeVideos) && - !string.Equals(collectionType, CollectionType.Photos) && - !string.Equals(collectionType, CollectionType.MusicVideos); + var videoPath = result.Items[0].Path; + var hasPhotos = photos.Any(i => !PhotoResolver.IsOwnedByResolvedMedia(LibraryManager, libraryOptions, videoPath, i.Name)); - var result = ResolveVideos(parent, fileSystemEntries, directoryService, supportsMultiVersion, collectionType) ?? - new MultiItemResolverResult(); - - if (result.Items.Count == 1) + if (!hasPhotos) { var movie = (T)result.Items[0]; movie.IsInMixedFolder = false; movie.Name = Path.GetFileName(movie.ContainingFolderPath); return movie; } + } - if (result.Items.Count == 0 && multiDiscFolders.Count > 0) - { - return GetMultiDiscMovie(multiDiscFolders, directoryService); - } + if (result.Items.Count == 0 && multiDiscFolders.Count > 0) + { + return GetMultiDiscMovie(multiDiscFolders, directoryService); } return null; @@ -542,8 +555,11 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies return !validCollectionTypes.Contains(collectionType, StringComparer.OrdinalIgnoreCase); } - public MovieResolver(ILibraryManager libraryManager, IFileSystem fileSystem) : base(libraryManager, fileSystem) + private IImageProcessor _imageProcessor; + + public MovieResolver(ILibraryManager libraryManager, IFileSystem fileSystem, IImageProcessor imageProcessor) : base(libraryManager, fileSystem) { + _imageProcessor = imageProcessor; } } } diff --git a/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs b/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs index 3d7ede879f..311abf14e3 100644 --- a/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs @@ -12,9 +12,12 @@ namespace Emby.Server.Implementations.Library.Resolvers public class PhotoAlbumResolver : FolderResolver { private readonly IImageProcessor _imageProcessor; - public PhotoAlbumResolver(IImageProcessor imageProcessor) + private ILibraryManager _libraryManager; + + public PhotoAlbumResolver(IImageProcessor imageProcessor, ILibraryManager libraryManager) { _imageProcessor = imageProcessor; + _libraryManager = libraryManager; } /// @@ -25,14 +28,21 @@ namespace Emby.Server.Implementations.Library.Resolvers protected override PhotoAlbum Resolve(ItemResolveArgs args) { // Must be an image file within a photo collection - if (args.IsDirectory && string.Equals(args.GetCollectionType(), CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) + if (args.IsDirectory) { - if (HasPhotos(args)) + // Must be an image file within a photo collection + var collectionType = args.GetCollectionType(); + + if (string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase) || + (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && args.GetLibraryOptions().EnablePhotos)) { - return new PhotoAlbum + if (HasPhotos(args)) { - Path = args.Path - }; + return new PhotoAlbum + { + Path = args.Path + }; + } } } @@ -41,7 +51,32 @@ namespace Emby.Server.Implementations.Library.Resolvers private bool HasPhotos(ItemResolveArgs args) { - return args.FileSystemChildren.Any(i => (!i.IsDirectory) && PhotoResolver.IsImageFile(i.FullName, _imageProcessor)); + var files = args.FileSystemChildren; + + foreach (var file in files) + { + if (!file.IsDirectory && PhotoResolver.IsImageFile(file.FullName, _imageProcessor)) + { + var libraryOptions = args.GetLibraryOptions(); + var filename = file.Name; + var ownedByMedia = false; + + foreach (var siblingFile in files) + { + if (PhotoResolver.IsOwnedByMedia(_libraryManager, libraryOptions, siblingFile.FullName, filename)) + { + ownedByMedia = true; + break; + } + } + + if (!ownedByMedia) + { + return true; + } + } + } + return false; } public override ResolverPriority Priority diff --git a/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs b/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs index 04312f277c..48f5802a92 100644 --- a/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs @@ -35,7 +35,6 @@ namespace Emby.Server.Implementations.Library.Resolvers // Must be an image file within a photo collection var collectionType = args.GetCollectionType(); - if (string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase) || (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && args.GetLibraryOptions().EnablePhotos)) { @@ -44,9 +43,15 @@ namespace Emby.Server.Implementations.Library.Resolvers var filename = Path.GetFileNameWithoutExtension(args.Path); // Make sure the image doesn't belong to a video file - if (_fileSystem.GetFilePaths(_fileSystem.GetDirectoryName(args.Path)).Any(i => IsOwnedByMedia(args.GetLibraryOptions(), i, filename))) + var files = args.DirectoryService.GetFiles(_fileSystem.GetDirectoryName(args.Path)); + var libraryOptions = args.GetLibraryOptions(); + + foreach (var file in files) { - return null; + if (IsOwnedByMedia(_libraryManager, libraryOptions, file.FullName, filename)) + { + return null; + } } return new Photo @@ -60,14 +65,21 @@ namespace Emby.Server.Implementations.Library.Resolvers return null; } - private bool IsOwnedByMedia(LibraryOptions libraryOptions, string file, string imageFilename) + internal static bool IsOwnedByMedia(ILibraryManager libraryManager, LibraryOptions libraryOptions, string file, string imageFilename) { - if (_libraryManager.IsVideoFile(file, libraryOptions)) + if (libraryManager.IsVideoFile(file, libraryOptions)) { - if (imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file), StringComparison.OrdinalIgnoreCase)) - { - return true; - } + return IsOwnedByResolvedMedia(libraryManager, libraryOptions, file, imageFilename); + } + + return false; + } + + internal static bool IsOwnedByResolvedMedia(ILibraryManager libraryManager, LibraryOptions libraryOptions, string file, string imageFilename) + { + if (imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file), StringComparison.OrdinalIgnoreCase)) + { + return true; } return false; @@ -81,7 +93,8 @@ namespace Emby.Server.Implementations.Library.Resolvers "fanart", "backdrop", "poster", - "cover" + "cover", + "logo" }; internal static bool IsImageFile(string path, IImageProcessor imageProcessor) diff --git a/Emby.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs b/Emby.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs index a859d8ec82..a0ff294829 100644 --- a/Emby.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs @@ -55,10 +55,10 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV if (season.IndexNumber.HasValue) { var seasonNumber = season.IndexNumber.Value; - + season.Name = seasonNumber == 0 ? args.LibraryOptions.SeasonZeroDisplayName : - string.Format(_localization.GetLocalizedString("NameSeasonNumber"), seasonNumber.ToString(UsCulture)); + string.Format(_localization.GetLocalizedString("NameSeasonNumber"), seasonNumber.ToString(UsCulture), args.GetLibraryOptions().PreferredMetadataLanguage); } return season; diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs index 8c93772915..e97bf11c3b 100644 --- a/Emby.Server.Implementations/Library/UserViewManager.cs +++ b/Emby.Server.Implementations/Library/UserViewManager.cs @@ -95,14 +95,18 @@ namespace Emby.Server.Implementations.Library if (parents.Count > 0) { - list.Add(GetUserView(parents, viewType, string.Empty, user, query.PresetViews, cancellationToken)); + var localizationKey = string.Equals(viewType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase) ? + "TvShows" : + "Movies"; + + list.Add(GetUserView(parents, viewType, localizationKey, string.Empty, user, query.PresetViews, cancellationToken)); } } if (_config.Configuration.EnableFolderView) { - var name = _localizationManager.GetLocalizedString("ViewType" + CollectionType.Folders); - list.Add(await _libraryManager.GetNamedView(name, CollectionType.Folders, string.Empty, cancellationToken).ConfigureAwait(false)); + var name = _localizationManager.GetLocalizedString("Folders"); + list.Add(_libraryManager.GetNamedView(name, CollectionType.Folders, string.Empty, cancellationToken)); } if (query.IncludeExternalContent) @@ -117,7 +121,7 @@ namespace Emby.Server.Implementations.Library if (_config.Configuration.EnableChannelView && channels.Length > 0) { - list.Add(await _channelManager.GetInternalChannelFolder(cancellationToken).ConfigureAwait(false)); + list.Add(_channelManager.GetInternalChannelFolder(cancellationToken)); } else { @@ -126,7 +130,7 @@ namespace Emby.Server.Implementations.Library if (_liveTvManager.GetEnabledUsers().Select(i => i.Id.ToString("N")).Contains(query.UserId)) { - list.Add(await _liveTvManager.GetInternalLiveTvFolder(CancellationToken.None).ConfigureAwait(false)); + list.Add(_liveTvManager.GetInternalLiveTvFolder(CancellationToken.None)); } } @@ -158,21 +162,21 @@ namespace Emby.Server.Implementations.Library .ToArray(); } - public Task GetUserSubView(string name, string parentId, string type, string sortName, CancellationToken cancellationToken) + public UserView GetUserSubViewWithName(string name, string parentId, string type, string sortName, CancellationToken cancellationToken) { var uniqueId = parentId + "subview" + type; return _libraryManager.GetNamedView(name, parentId, type, sortName, uniqueId, cancellationToken); } - public Task GetUserSubView(string parentId, string type, string sortName, CancellationToken cancellationToken) + public UserView GetUserSubView(string parentId, string type, string localizationKey, string sortName, CancellationToken cancellationToken) { - var name = _localizationManager.GetLocalizedString("ViewType" + type); + var name = _localizationManager.GetLocalizedString(localizationKey); - return GetUserSubView(name, parentId, type, sortName, cancellationToken); + return GetUserSubViewWithName(name, parentId, type, sortName, cancellationToken); } - private Folder GetUserView(List parents, string viewType, string sortName, User user, string[] presetViews, CancellationToken cancellationToken) + private Folder GetUserView(List parents, string viewType, string localizationKey, string sortName, User user, string[] presetViews, CancellationToken cancellationToken) { if (parents.Count == 1 && parents.All(i => string.Equals(i.CollectionType, viewType, StringComparison.OrdinalIgnoreCase))) { @@ -184,7 +188,7 @@ namespace Emby.Server.Implementations.Library return GetUserView((Folder)parents[0], viewType, string.Empty, cancellationToken); } - var name = _localizationManager.GetLocalizedString("ViewType" + viewType); + var name = _localizationManager.GetLocalizedString(localizationKey); return _libraryManager.GetNamedView(user, name, viewType, sortName, cancellationToken); } diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs index 4a2836d597..be5e57539b 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs @@ -1222,7 +1222,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV _logger.Info("Closing live stream {0}", id); - await stream.Close().ConfigureAwait(false); + stream.Close(); _logger.Info("Live stream {0} closed successfully", id); } } @@ -1286,9 +1286,9 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV Id = timer.Id }; - if (_activeRecordings.TryAdd(timer.Id, activeRecordingInfo)) + if (!_activeRecordings.ContainsKey(timer.Id)) { - await RecordStream(timer, recordingEndDate, activeRecordingInfo, activeRecordingInfo.CancellationTokenSource.Token).ConfigureAwait(false); + await RecordStream(timer, recordingEndDate, activeRecordingInfo).ConfigureAwait(false); } else { @@ -1397,8 +1397,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV return Path.Combine(recordPath, recordingFileName); } - private async Task RecordStream(TimerInfo timer, DateTime recordingEndDate, - ActiveRecordingInfo activeRecordingInfo, CancellationToken cancellationToken) + private async Task RecordStream(TimerInfo timer, DateTime recordingEndDate, ActiveRecordingInfo activeRecordingInfo) { if (timer == null) { @@ -1420,19 +1419,18 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV if (programInfo != null) { CopyProgramInfoToTimerInfo(programInfo, timer); - //activeRecordingInfo.Program = programInfo; } string seriesPath = null; var recordPath = GetRecordingPath(timer, out seriesPath); var recordingStatus = RecordingStatus.New; + var recorder = await GetRecorder().ConfigureAwait(false); + string liveStreamId = null; try { - var recorder = await GetRecorder().ConfigureAwait(false); - var allMediaSources = await GetChannelStreamMediaSources(timer.ChannelId, CancellationToken.None).ConfigureAwait(false); _logger.Info("Opening recording stream from tuner provider"); @@ -1442,14 +1440,10 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV var mediaStreamInfo = liveStreamInfo.Item2; liveStreamId = mediaStreamInfo.Id; - // HDHR doesn't seem to release the tuner right away after first probing with ffmpeg - //await Task.Delay(3000, cancellationToken).ConfigureAwait(false); - recordPath = recorder.GetOutputPath(mediaStreamInfo, recordPath); recordPath = EnsureFileUnique(recordPath, timer.Id); _libraryMonitor.ReportFileSystemChangeBeginning(recordPath); - activeRecordingInfo.Path = recordPath; var duration = recordingEndDate - DateTime.UtcNow; @@ -1459,15 +1453,22 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV Action onStarted = async () => { + activeRecordingInfo.Path = recordPath; + + _activeRecordings.TryAdd(timer.Id, activeRecordingInfo); + timer.Status = RecordingStatus.InProgress; _timerProvider.AddOrUpdate(timer, false); await SaveRecordingMetadata(timer, recordPath, seriesPath).ConfigureAwait(false); + + CreateRecordingFolders(); + TriggerRefresh(recordPath); EnforceKeepUpTo(timer, seriesPath); }; - await recorder.Record(liveStreamInfo.Item1 as IDirectStreamProvider, mediaStreamInfo, recordPath, duration, onStarted, cancellationToken).ConfigureAwait(false); + await recorder.Record(liveStreamInfo.Item1 as IDirectStreamProvider, mediaStreamInfo, recordPath, duration, onStarted, activeRecordingInfo.CancellationTokenSource.Token).ConfigureAwait(false); recordingStatus = RecordingStatus.Completed; _logger.Info("Recording completed: {0}", recordPath); @@ -1507,6 +1508,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV _logger.Info("Retrying recording in {0} seconds.", retryIntervalSeconds); timer.Status = RecordingStatus.New; + timer.PrePaddingSeconds = 0; timer.StartDate = DateTime.UtcNow.AddSeconds(retryIntervalSeconds); timer.RetryCount++; _timerProvider.AddOrUpdate(timer); @@ -1526,13 +1528,13 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV private void TriggerRefresh(string path) { - _logger.Debug("Triggering refresh on {0}", path); + _logger.Info("Triggering refresh on {0}", path); var item = GetAffectedBaseItem(_fileSystem.GetDirectoryName(path)); if (item != null) { - _logger.Debug("Refreshing recording parent {0}", item.Path); + _logger.Info("Refreshing recording parent {0}", item.Path); _providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions(_fileSystem) { diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs index 149f69e5b3..d6f5e0d9fe 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs @@ -272,11 +272,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV private bool EncodeVideo(MediaSourceInfo mediaSource) { - if (string.Equals(_liveTvOptions.RecordedVideoCodec, "copy", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - var mediaStreams = mediaSource.MediaStreams ?? new List(); return !mediaStreams.Any(i => i.Type == MediaStreamType.Video && string.Equals(i.Codec, "h264", StringComparison.OrdinalIgnoreCase) && !i.IsInterlaced); } diff --git a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs index b7cfdea1b5..b3c7ecc9f3 100644 --- a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs +++ b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs @@ -541,27 +541,30 @@ namespace Emby.Server.Implementations.LiveTv.Listings try { - using (Stream responce = await Get(options, false, info).ConfigureAwait(false)) + using (var httpResponse = await Get(options, false, info).ConfigureAwait(false)) { - var root = _jsonSerializer.DeserializeFromStream>(responce); - - if (root != null) + using (Stream responce = httpResponse.Content) { - foreach (ScheduleDirect.Headends headend in root) + var root = _jsonSerializer.DeserializeFromStream>(responce); + + if (root != null) { - foreach (ScheduleDirect.Lineup lineup in headend.lineups) + foreach (ScheduleDirect.Headends headend in root) { - lineups.Add(new NameIdPair + foreach (ScheduleDirect.Lineup lineup in headend.lineups) { - Name = string.IsNullOrWhiteSpace(lineup.name) ? lineup.lineup : lineup.name, - Id = lineup.uri.Substring(18) - }); + lineups.Add(new NameIdPair + { + Name = string.IsNullOrWhiteSpace(lineup.name) ? lineup.lineup : lineup.name, + Id = lineup.uri.Substring(18) + }); + } } } - } - else - { - _logger.Info("No lineups available"); + else + { + _logger.Info("No lineups available"); + } } } } @@ -647,6 +650,9 @@ namespace Emby.Server.Implementations.LiveTv.Listings bool enableRetry, ListingsProviderInfo providerInfo) { + // Schedules direct requires that the client support compression and will return a 400 response without it + options.EnableHttpCompression = true; + try { return await _httpClient.Post(options).ConfigureAwait(false); @@ -671,13 +677,16 @@ namespace Emby.Server.Implementations.LiveTv.Listings return await Post(options, false, providerInfo).ConfigureAwait(false); } - private async Task Get(HttpRequestOptions options, + private async Task Get(HttpRequestOptions options, bool enableRetry, ListingsProviderInfo providerInfo) { + // Schedules direct requires that the client support compression and will return a 400 response without it + options.EnableHttpCompression = true; + try { - return await _httpClient.Get(options).ConfigureAwait(false); + return await _httpClient.SendAsync(options, "GET").ConfigureAwait(false); } catch (HttpException ex) { @@ -797,11 +806,14 @@ namespace Emby.Server.Implementations.LiveTv.Listings try { - using (var response = await Get(options, false, null).ConfigureAwait(false)) + using (var httpResponse = await Get(options, false, null).ConfigureAwait(false)) { - var root = _jsonSerializer.DeserializeFromStream(response); + using (var response = httpResponse.Content) + { + var root = _jsonSerializer.DeserializeFromStream(response); - return root.lineups.Any(i => string.Equals(info.ListingsId, i.lineup, StringComparison.OrdinalIgnoreCase)); + return root.lineups.Any(i => string.Equals(info.ListingsId, i.lineup, StringComparison.OrdinalIgnoreCase)); + } } } catch (HttpException ex) @@ -879,53 +891,56 @@ namespace Emby.Server.Implementations.LiveTv.Listings var list = new List(); - using (var response = await Get(httpOptions, true, info).ConfigureAwait(false)) + using (var httpResponse = await Get(httpOptions, true, info).ConfigureAwait(false)) { - var root = _jsonSerializer.DeserializeFromStream(response); - _logger.Info("Found " + root.map.Count + " channels on the lineup on ScheduleDirect"); - _logger.Info("Mapping Stations to Channel"); - - var allStations = root.stations ?? new List(); - - foreach (ScheduleDirect.Map map in root.map) + using (var response = httpResponse.Content) { - var channelNumber = GetChannelNumber(map); + var root = _jsonSerializer.DeserializeFromStream(response); + _logger.Info("Found " + root.map.Count + " channels on the lineup on ScheduleDirect"); + _logger.Info("Mapping Stations to Channel"); - var station = allStations.FirstOrDefault(item => string.Equals(item.stationID, map.stationID, StringComparison.OrdinalIgnoreCase)); - if (station == null) + var allStations = root.stations ?? new List(); + + foreach (ScheduleDirect.Map map in root.map) { - station = new ScheduleDirect.Station + var channelNumber = GetChannelNumber(map); + + var station = allStations.FirstOrDefault(item => string.Equals(item.stationID, map.stationID, StringComparison.OrdinalIgnoreCase)); + if (station == null) { - stationID = map.stationID + station = new ScheduleDirect.Station + { + stationID = map.stationID + }; + } + + var name = channelNumber; + + var channelInfo = new ChannelInfo + { + Number = channelNumber, + Name = name }; - } - var name = channelNumber; - - var channelInfo = new ChannelInfo - { - Number = channelNumber, - Name = name - }; - - if (station != null) - { - if (!string.IsNullOrWhiteSpace(station.name)) + if (station != null) { - channelInfo.Name = station.name; + if (!string.IsNullOrWhiteSpace(station.name)) + { + channelInfo.Name = station.name; + } + + channelInfo.Id = station.stationID; + channelInfo.CallSign = station.callsign; + + if (station.logo != null) + { + channelInfo.ImageUrl = station.logo.URL; + channelInfo.HasImage = true; + } } - channelInfo.Id = station.stationID; - channelInfo.CallSign = station.callsign; - - if (station.logo != null) - { - channelInfo.ImageUrl = station.logo.URL; - channelInfo.HasImage = true; - } + list.Add(channelInfo); } - - list.Add(channelInfo); } } diff --git a/Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs b/Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs index 8ea98879a6..95ec1dee0d 100644 --- a/Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs +++ b/Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs @@ -110,7 +110,15 @@ namespace Emby.Server.Implementations.LiveTv.Listings var tempFolder = Path.Combine(_config.ApplicationPaths.TempDirectory, Guid.NewGuid().ToString()); _fileSystem.CreateDirectory(tempFolder); - _zipClient.ExtractAllFromGz(stream, tempFolder, true); + try + { + _zipClient.ExtractAllFromGz(stream, tempFolder, true); + } + catch + { + // If the extraction fails just return the original file, it could be a gz + return file; + } return _fileSystem.GetFiles(tempFolder, true) .Where(i => string.Equals(i.Extension, ".xml", StringComparison.OrdinalIgnoreCase)) diff --git a/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs b/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs index e6479feaa8..15bbca136a 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs @@ -89,6 +89,11 @@ namespace Emby.Server.Implementations.LiveTv if (channel != null) { dto.ChannelName = channel.Name; + + if (channel.HasImage(ImageType.Primary)) + { + dto.ChannelPrimaryImageTag = GetImageTag(channel); + } } return dto; diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs index 857afa3781..718620ab57 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs @@ -173,11 +173,11 @@ namespace Emby.Server.Implementations.LiveTv } } - public async Task> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken) + public QueryResult GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); - var topFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var topFolder = GetInternalLiveTvFolder(cancellationToken); var internalQuery = new InternalItemsQuery(user) { @@ -527,18 +527,18 @@ namespace Emby.Server.Implementations.LiveTv item.ChannelType = channelInfo.ChannelType; item.ServiceName = serviceName; + + if (!string.Equals(channelInfo.Number, item.Number, StringComparison.Ordinal)) + { + forceUpdate = true; + } item.Number = channelInfo.Number; - //if (!string.Equals(item.ProviderImageUrl, channelInfo.ImageUrl, StringComparison.OrdinalIgnoreCase)) - //{ - // isNew = true; - // replaceImages.Add(ImageType.Primary); - //} - //if (!string.Equals(item.ProviderImagePath, channelInfo.ImagePath, StringComparison.OrdinalIgnoreCase)) - //{ - // isNew = true; - // replaceImages.Add(ImageType.Primary); - //} + if (!string.Equals(channelInfo.Name, item.Name, StringComparison.Ordinal)) + { + forceUpdate = true; + } + item.Name = channelInfo.Name; if (!item.HasImage(ImageType.Primary)) { @@ -554,18 +554,13 @@ namespace Emby.Server.Implementations.LiveTv } } - if (string.IsNullOrEmpty(item.Name)) - { - item.Name = channelInfo.Name; - } - if (isNew) { _libraryManager.CreateItem(item, cancellationToken); } else if (forceUpdate) { - await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken); } await item.RefreshMetadata(new MetadataRefreshOptions(_fileSystem) @@ -760,7 +755,7 @@ namespace Emby.Server.Implementations.LiveTv return new Tuple(item, isNew, isUpdated); } - private async Task CreateRecordingRecord(RecordingInfo info, string serviceName, Guid parentFolderId, CancellationToken cancellationToken) + private Guid CreateRecordingRecord(RecordingInfo info, string serviceName, Guid parentFolderId, CancellationToken cancellationToken) { var isNew = false; @@ -892,7 +887,7 @@ namespace Emby.Server.Implementations.LiveTv else if (dataChanged || info.DateLastUpdated > recording.DateLastSaved || statusChanged) { metadataRefreshMode = MetadataRefreshMode.FullRefresh; - await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken); } if (info.Status != RecordingStatus.InProgress) @@ -928,7 +923,7 @@ namespace Emby.Server.Implementations.LiveTv { var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); - var topFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var topFolder = GetInternalLiveTvFolder(cancellationToken); if (query.OrderBy.Length == 0) { @@ -1007,11 +1002,11 @@ namespace Emby.Server.Implementations.LiveTv return result; } - public async Task> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) + public QueryResult GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) { var user = _userManager.GetUserById(query.UserId); - var topFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var topFolder = GetInternalLiveTvFolder(cancellationToken); var internalQuery = new InternalItemsQuery(user) { @@ -1072,11 +1067,11 @@ namespace Emby.Server.Implementations.LiveTv return result; } - public async Task> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) + public QueryResult GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) { RemoveFields(options); - var internalResult = await GetRecommendedProgramsInternal(query, options, cancellationToken).ConfigureAwait(false); + var internalResult = GetRecommendedProgramsInternal(query, options, cancellationToken); var user = _userManager.GetUserById(query.UserId); @@ -1302,7 +1297,7 @@ namespace Emby.Server.Implementations.LiveTv var list = new List(); var numComplete = 0; - var parentFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var parentFolder = GetInternalLiveTvFolder(cancellationToken); var parentFolderId = parentFolder.Id; foreach (var channelInfo in allChannelsList) @@ -1425,7 +1420,7 @@ namespace Emby.Server.Implementations.LiveTv // TODO: Do this in bulk foreach (var program in updatedPrograms) { - await _libraryManager.UpdateItem(program, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + _libraryManager.UpdateItem(program, ItemUpdateType.MetadataImport, cancellationToken); } currentChannel.IsMovie = isMovie; @@ -1434,7 +1429,7 @@ namespace Emby.Server.Implementations.LiveTv currentChannel.IsKids = isKids; currentChannel.IsSeries = iSSeries; - await currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken); } catch (OperationCanceledException) { @@ -1549,9 +1544,8 @@ namespace Emby.Server.Implementations.LiveTv var results = await Task.WhenAll(tasks).ConfigureAwait(false); - var recordingTasks = results.SelectMany(i => i.ToList()).Select(i => CreateRecordingRecord(i.Item1, i.Item2.Name, internalLiveTvFolderId, cancellationToken)); - - var idList = await Task.WhenAll(recordingTasks).ConfigureAwait(false); + var idList = results.SelectMany(i => i.ToList()).Select(i => CreateRecordingRecord(i.Item1, i.Item2.Name, internalLiveTvFolderId, cancellationToken)) + .ToArray(); await CleanDatabaseInternal(idList, new[] { typeof(LiveTvVideoRecording).Name, typeof(LiveTvAudioRecording).Name }, new SimpleProgress(), cancellationToken).ConfigureAwait(false); @@ -1726,7 +1720,7 @@ namespace Emby.Server.Implementations.LiveTv return new QueryResult(); } - var folder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var folder = GetInternalLiveTvFolder(cancellationToken); // TODO: Figure out how to merge emby recordings + service recordings if (_services.Length == 1) @@ -2143,18 +2137,6 @@ namespace Emby.Server.Implementations.LiveTv }; } - public Task OnRecordingFileDeleted(BaseItem recording) - { - var service = GetService(recording); - - if (service is EmbyTV.EmbyTV) - { - return service.DeleteRecordingAsync(GetItemExternalId(recording), CancellationToken.None); - } - - return Task.FromResult(true); - } - public async Task DeleteRecording(string recordingId) { var recording = await GetInternalRecording(recordingId, CancellationToken.None).ConfigureAwait(false); @@ -2171,13 +2153,17 @@ namespace Emby.Server.Implementations.LiveTv { var service = GetService(recording.ServiceName); - try - { - await service.DeleteRecordingAsync(GetItemExternalId(recording), CancellationToken.None).ConfigureAwait(false); - } - catch (ResourceNotFoundException) + if (service != null) { + // handle the service being uninstalled and the item hanging around in the database + try + { + await service.DeleteRecordingAsync(GetItemExternalId(recording), CancellationToken.None).ConfigureAwait(false); + } + catch (ResourceNotFoundException) + { + } } _lastRecordingRefreshTime = DateTime.MinValue; @@ -2387,7 +2373,7 @@ namespace Emby.Server.Implementations.LiveTv MinEndDate = now, Limit = channelIds.Length, OrderBy = new[] { new Tuple(ItemSortBy.StartDate, SortOrder.Ascending) }, - TopParentIds = new[] { GetInternalLiveTvFolder(CancellationToken.None).Result.Id.ToString("N") }, + TopParentIds = new[] { GetInternalLiveTvFolder(CancellationToken.None).Id.ToString("N") }, DtoOptions = options }) : new List(); @@ -2910,11 +2896,11 @@ namespace Emby.Server.Implementations.LiveTv return service.ResetTuner(parts[1], cancellationToken); } - public async Task GetLiveTvFolder(string userId, CancellationToken cancellationToken) + public BaseItemDto GetLiveTvFolder(string userId, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(userId) ? null : _userManager.GetUserById(userId); - var folder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var folder = GetInternalLiveTvFolder(cancellationToken); return _dtoService.GetBaseItemDto(folder, new DtoOptions(), user); } @@ -2930,10 +2916,10 @@ namespace Emby.Server.Implementations.LiveTv options.Fields = fields.ToArray(fields.Count); } - public async Task GetInternalLiveTvFolder(CancellationToken cancellationToken) + public Folder GetInternalLiveTvFolder(CancellationToken cancellationToken) { - var name = _localization.GetLocalizedString("ViewTypeLiveTV"); - return await _libraryManager.GetNamedView(name, CollectionType.LiveTv, name, cancellationToken).ConfigureAwait(false); + var name = _localization.GetLocalizedString("HeaderLiveTV"); + return _libraryManager.GetNamedView(name, CollectionType.LiveTv, name, cancellationToken); } public async Task SaveTunerHost(TunerHostInfo info, bool dataSourceChanged = true) diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs index bb11dac5f1..59346cdec2 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs @@ -86,16 +86,19 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun CancellationToken = cancellationToken, BufferContent = false }; - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(options, "GET").ConfigureAwait(false)) { - var lineup = JsonSerializer.DeserializeFromStream>(stream) ?? new List(); - - if (info.ImportFavoritesOnly) + using (var stream = response.Content) { - lineup = lineup.Where(i => i.Favorite).ToList(); - } + var lineup = JsonSerializer.DeserializeFromStream>(stream) ?? new List(); - return lineup.Where(i => !i.DRM).ToList(); + if (info.ImportFavoritesOnly) + { + lineup = lineup.Where(i => i.Favorite).ToList(); + } + + return lineup.Where(i => !i.DRM).ToList(); + } } } @@ -143,26 +146,29 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun try { - using (var stream = await _httpClient.Get(new HttpRequestOptions() + using (var response = await _httpClient.SendAsync(new HttpRequestOptions() { Url = string.Format("{0}/discover.json", GetApiUrl(info, false)), CancellationToken = cancellationToken, TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds), BufferContent = false - }).ConfigureAwait(false)) + }, "GET").ConfigureAwait(false)) { - var response = JsonSerializer.DeserializeFromStream(stream); - - if (!string.IsNullOrWhiteSpace(info.Id)) + using (var stream = response.Content) { - lock (_modelCache) - { - _modelCache[info.Id] = response; - } - } + var discoverResponse = JsonSerializer.DeserializeFromStream(stream); - return response; + if (!string.IsNullOrWhiteSpace(info.Id)) + { + lock (_modelCache) + { + _modelCache[info.Id] = discoverResponse; + } + } + + return discoverResponse; + } } } catch (HttpException ex) @@ -197,7 +203,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun var uri = new Uri(GetApiUrl(info, false)); - using (var manager = new HdHomerunManager(_socketFactory)) + using (var manager = new HdHomerunManager(_socketFactory, Logger)) { // Legacy HdHomeruns are IPv4 only var ipInfo = _networkManager.ParseIpAddress(uri.Host); @@ -299,6 +305,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun int? videoBitrate = null; int? audioBitrate = null; + var isHd = channelInfo.IsHD ?? true; + if (string.Equals(profile, "mobile", StringComparison.OrdinalIgnoreCase)) { width = 1280; @@ -350,7 +358,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun else { // This is for android tv's 1200 condition. Remove once not needed anymore so that we can avoid possible side effects of dummying up this data - if ((channelInfo.IsHD ?? true)) + if (isHd) { width = 1920; height = 1080; @@ -367,9 +375,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun if (!videoBitrate.HasValue) { - videoBitrate = (channelInfo.IsHD ?? true) ? 15000000 : 2000000; + videoBitrate = isHd ? 15000000 : 2000000; } - audioBitrate = (channelInfo.IsHD ?? true) ? 448000 : 192000; + audioBitrate = isHd ? 448000 : 192000; } // normalize diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs index 604aa74f06..7e0e5fc5c9 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs @@ -22,9 +22,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun private readonly IHttpClient _httpClient; private readonly IServerApplicationHost _appHost; - private readonly CancellationTokenSource _liveStreamCancellationTokenSource = new CancellationTokenSource(); - private readonly TaskCompletionSource _liveStreamTaskCompletionSource = new TaskCompletionSource(); - public HdHomerunHttpStream(MediaSourceInfo mediaSource, string originalStreamId, IFileSystem fileSystem, IHttpClient httpClient, ILogger logger, IServerApplicationPaths appPaths, IServerApplicationHost appHost, IEnvironmentInfo environment) : base(mediaSource, environment, fileSystem, logger, appPaths) { @@ -33,19 +30,34 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun OriginalStreamId = originalStreamId; } - protected override Task OpenInternal(CancellationToken openCancellationToken) + public override async Task Open(CancellationToken openCancellationToken) { - _liveStreamCancellationTokenSource.Token.ThrowIfCancellationRequested(); + LiveStreamCancellationTokenSource.Token.ThrowIfCancellationRequested(); var mediaSource = OriginalMediaSource; var url = mediaSource.Path; + FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath)); + Logger.Info("Opening HDHR Live stream from {0}", url); - var taskCompletionSource = new TaskCompletionSource(); + var response = await _httpClient.SendAsync(new HttpRequestOptions + { + Url = url, + CancellationToken = CancellationToken.None, + BufferContent = false, - StartStreaming(url, taskCompletionSource, _liveStreamCancellationTokenSource.Token); + // Increase a little bit + TimeoutMs = 30000, + + EnableHttpCompression = false + + }, "GET").ConfigureAwait(false); + + Logger.Info("Opened HDHR stream from {0}", url); + + StartStreaming(response, LiveStreamCancellationTokenSource.Token); //OpenedMediaSource.Protocol = MediaProtocol.File; //OpenedMediaSource.Path = tempFile; @@ -59,77 +71,42 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun //OpenedMediaSource.SupportsDirectPlay = false; //OpenedMediaSource.SupportsDirectStream = true; //OpenedMediaSource.SupportsTranscoding = true; - - return taskCompletionSource.Task; - - //await Task.Delay(5000).ConfigureAwait(false); } - public override Task Close() + public override void Close() { Logger.Info("Closing HDHR live stream"); - _liveStreamCancellationTokenSource.Cancel(); - - return _liveStreamTaskCompletionSource.Task; + LiveStreamCancellationTokenSource.Cancel(); } - private Task StartStreaming(string url, TaskCompletionSource openTaskCompletionSource, CancellationToken cancellationToken) + private Task StartStreaming(HttpResponseInfo response, CancellationToken cancellationToken) { return Task.Run(async () => { - var isFirstAttempt = true; - - while (!cancellationToken.IsCancellationRequested) + try { - try + using (response) { - using (var response = await _httpClient.SendAsync(new HttpRequestOptions + using (var stream = response.Content) { - Url = url, - CancellationToken = cancellationToken, - BufferContent = false, + Logger.Info("Beginning HdHomerunHttpStream stream to file"); - // Increase a little bit - TimeoutMs = 30000, - - EnableHttpCompression = false - - }, "GET").ConfigureAwait(false)) - { - Logger.Info("Opened HDHR stream from {0}", url); - - if (!cancellationToken.IsCancellationRequested) + FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath)); + using (var fileStream = FileSystem.GetFileStream(TempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.None)) { - Logger.Info("Beginning multicastStream.CopyUntilCancelled"); - - FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath)); - using (var fileStream = FileSystem.GetFileStream(TempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.None)) - { - StreamHelper.CopyTo(response.Content, fileStream, 81920, () => Resolve(openTaskCompletionSource), cancellationToken); - } + StreamHelper.CopyTo(stream, fileStream, 81920, null, cancellationToken); } } } - catch (OperationCanceledException) - { - break; - } - catch (Exception ex) - { - if (isFirstAttempt) - { - Logger.ErrorException("Error opening live stream:", ex); - openTaskCompletionSource.TrySetException(ex); - break; - } - - Logger.ErrorException("Error copying live stream, will reopen", ex); - } - - isFirstAttempt = false; + } + catch (OperationCanceledException) + { + } + catch (Exception ex) + { + Logger.ErrorException("Error copying live stream.", ex); } - _liveStreamTaskCompletionSource.TrySetResult(true); await DeleteTempFile(TempFilePath).ConfigureAwait(false); }); } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs index c737c4cbae..5156f1744b 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs @@ -6,6 +6,7 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.Net; +using MediaBrowser.Model.Logging; namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun { @@ -89,9 +90,12 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun private readonly ISocketFactory _socketFactory; private IpAddressInfo _remoteIp; - public HdHomerunManager(ISocketFactory socketFactory) + private ILogger _logger; + + public HdHomerunManager(ISocketFactory socketFactory, ILogger logger) { _socketFactory = socketFactory; + _logger = logger; } public void Dispose() @@ -140,6 +144,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun _lockkey = (uint)rand.Next(); } + var lockKeyValue = _lockkey.Value; + var ipEndPoint = new IpEndPointInfo(_remoteIp, HdHomeRunPort); for (int i = 0; i < numTuners; ++i) @@ -148,7 +154,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun continue; _activeTuner = i; - var lockKeyString = String.Format("{0:d}", _lockkey.Value); + var lockKeyString = String.Format("{0:d}", lockKeyValue); var lockkeyMsg = CreateSetMessage(i, "lockkey", lockKeyString, null); await tcpClient.SendToAsync(lockkeyMsg, 0, lockkeyMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false); var response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false); @@ -160,27 +166,27 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun var commandList = commands.GetCommands(); foreach(Tuple command in commandList) { - var channelMsg = CreateSetMessage(i, command.Item1, command.Item2, _lockkey.Value); + var channelMsg = CreateSetMessage(i, command.Item1, command.Item2, lockKeyValue); await tcpClient.SendToAsync(channelMsg, 0, channelMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false); response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false); // parse response to make sure it worked if (!ParseReturnMessage(response.Buffer, response.ReceivedBytes, out returnVal)) { - await ReleaseLockkey(tcpClient).ConfigureAwait(false); + await ReleaseLockkey(tcpClient, lockKeyValue).ConfigureAwait(false); continue; } } var targetValue = String.Format("rtp://{0}:{1}", localIp, localPort); - var targetMsg = CreateSetMessage(i, "target", targetValue, _lockkey.Value); + var targetMsg = CreateSetMessage(i, "target", targetValue, lockKeyValue); await tcpClient.SendToAsync(targetMsg, 0, targetMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false); response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false); // parse response to make sure it worked if (!ParseReturnMessage(response.Buffer, response.ReceivedBytes, out returnVal)) { - await ReleaseLockkey(tcpClient).ConfigureAwait(false); + await ReleaseLockkey(tcpClient, lockKeyValue).ConfigureAwait(false); continue; } @@ -201,7 +207,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun foreach (Tuple command in commandList) { - var channelMsg = CreateSetMessage(_activeTuner, command.Item1, command.Item2, _lockkey.Value); + var channelMsg = CreateSetMessage(_activeTuner, command.Item1, command.Item2, _lockkey); await tcpClient.SendToAsync(channelMsg, 0, channelMsg.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), cancellationToken).ConfigureAwait(false); var response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false); // parse response to make sure it worked @@ -216,24 +222,28 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun public async Task StopStreaming() { - if (!_lockkey.HasValue) + var lockKey = _lockkey; + + if (!lockKey.HasValue) return; using (var socket = _socketFactory.CreateTcpSocket(_remoteIp, HdHomeRunPort)) { - await ReleaseLockkey(socket).ConfigureAwait(false); + await ReleaseLockkey(socket, lockKey.Value).ConfigureAwait(false); } } - private async Task ReleaseLockkey(ISocket tcpClient) + private async Task ReleaseLockkey(ISocket tcpClient, uint lockKeyValue) { - var releaseTarget = CreateSetMessage(_activeTuner, "target", "none", _lockkey); + _logger.Info("HdHomerunManager.ReleaseLockkey {0}", lockKeyValue); + + var releaseTarget = CreateSetMessage(_activeTuner, "target", "none", lockKeyValue); await tcpClient.SendToAsync(releaseTarget, 0, releaseTarget.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), CancellationToken.None).ConfigureAwait(false); var receiveBuffer = new byte[8192]; await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, CancellationToken.None).ConfigureAwait(false); - var releaseKeyMsg = CreateSetMessage(_activeTuner, "lockkey", "none", _lockkey); + var releaseKeyMsg = CreateSetMessage(_activeTuner, "lockkey", "none", lockKeyValue); _lockkey = null; await tcpClient.SendToAsync(releaseKeyMsg, 0, releaseKeyMsg.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), CancellationToken.None).ConfigureAwait(false); await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, CancellationToken.None).ConfigureAwait(false); diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs index ff8fd1bc4b..06326d26c6 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs @@ -1,23 +1,16 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; -using Emby.Server.Implementations.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.LiveTv; using MediaBrowser.Model.Dto; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Net; using MediaBrowser.Model.System; -using System.Globalization; -using MediaBrowser.Controller.IO; namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun { @@ -26,8 +19,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun private readonly IServerApplicationHost _appHost; private readonly ISocketFactory _socketFactory; - private readonly CancellationTokenSource _liveStreamCancellationTokenSource = new CancellationTokenSource(); - private readonly TaskCompletionSource _liveStreamTaskCompletionSource = new TaskCompletionSource(); private readonly IHdHomerunChannelCommands _channelCommands; private readonly int _numTuners; private readonly INetworkManager _networkManager; @@ -43,20 +34,62 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun _numTuners = numTuners; } - protected override Task OpenInternal(CancellationToken openCancellationToken) + public override async Task Open(CancellationToken openCancellationToken) { - _liveStreamCancellationTokenSource.Token.ThrowIfCancellationRequested(); + LiveStreamCancellationTokenSource.Token.ThrowIfCancellationRequested(); var mediaSource = OriginalMediaSource; var uri = new Uri(mediaSource.Path); var localPort = _networkManager.GetRandomUnusedUdpPort(); + FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath)); + Logger.Info("Opening HDHR UDP Live stream from {0}", uri.Host); + var remoteAddress = _networkManager.ParseIpAddress(uri.Host); + IpAddressInfo localAddress = null; + using (var tcpSocket = _socketFactory.CreateSocket(remoteAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp, false)) + { + try + { + tcpSocket.Connect(new IpEndPointInfo(remoteAddress, HdHomerunManager.HdHomeRunPort)); + localAddress = tcpSocket.LocalEndPoint.IpAddress; + tcpSocket.Close(); + } + catch (Exception) + { + Logger.Error("Unable to determine local ip address for Legacy HDHomerun stream."); + return; + } + } + + var udpClient = _socketFactory.CreateUdpSocket(localPort); + var hdHomerunManager = new HdHomerunManager(_socketFactory, Logger); + + try + { + // send url to start streaming + await hdHomerunManager.StartStreaming(remoteAddress, localAddress, localPort, _channelCommands, _numTuners, openCancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + using (udpClient) + { + using (hdHomerunManager) + { + if (!(ex is OperationCanceledException)) + { + Logger.ErrorException("Error opening live stream:", ex); + } + throw; + } + } + } + var taskCompletionSource = new TaskCompletionSource(); - StartStreaming(uri.Host, localPort, taskCompletionSource, _liveStreamCancellationTokenSource.Token); + StartStreaming(udpClient, hdHomerunManager, remoteAddress, localAddress, localPort, taskCompletionSource, LiveStreamCancellationTokenSource.Token); //OpenedMediaSource.Protocol = MediaProtocol.File; //OpenedMediaSource.Path = tempFile; @@ -68,86 +101,47 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun //OpenedMediaSource.SupportsDirectStream = true; //OpenedMediaSource.SupportsTranscoding = true; - return taskCompletionSource.Task; - //await Task.Delay(5000).ConfigureAwait(false); + await taskCompletionSource.Task.ConfigureAwait(false); } - public override Task Close() + public override void Close() { Logger.Info("Closing HDHR UDP live stream"); - _liveStreamCancellationTokenSource.Cancel(); - - return _liveStreamTaskCompletionSource.Task; + LiveStreamCancellationTokenSource.Cancel(); } - private Task StartStreaming(string remoteIp, int localPort, TaskCompletionSource openTaskCompletionSource, CancellationToken cancellationToken) + private Task StartStreaming(ISocket udpClient, HdHomerunManager hdHomerunManager, IpAddressInfo remoteAddress, IpAddressInfo localAddress, int localPort, TaskCompletionSource openTaskCompletionSource, CancellationToken cancellationToken) { return Task.Run(async () => { - var isFirstAttempt = true; - using (var udpClient = _socketFactory.CreateUdpSocket(localPort)) + using (udpClient) { - using (var hdHomerunManager = new HdHomerunManager(_socketFactory)) + using (hdHomerunManager) { - var remoteAddress = _networkManager.ParseIpAddress(remoteIp); - IpAddressInfo localAddress = null; - using (var tcpSocket = _socketFactory.CreateSocket(remoteAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp, false)) + try { - try - { - tcpSocket.Connect(new IpEndPointInfo(remoteAddress, HdHomerunManager.HdHomeRunPort)); - localAddress = tcpSocket.LocalEndPoint.IpAddress; - tcpSocket.Close(); - } - catch (Exception) - { - Logger.Error("Unable to determine local ip address for Legacy HDHomerun stream."); - return; - } + await CopyTo(udpClient, TempFilePath, openTaskCompletionSource, cancellationToken).ConfigureAwait(false); + } + catch (OperationCanceledException ex) + { + Logger.Info("HDHR UDP stream cancelled or timed out from {0}", remoteAddress); + openTaskCompletionSource.TrySetException(ex); + } + catch (Exception ex) + { + Logger.ErrorException("Error opening live stream:", ex); + openTaskCompletionSource.TrySetException(ex); } - while (!cancellationToken.IsCancellationRequested) + try { - try - { - // send url to start streaming - await hdHomerunManager.StartStreaming(remoteAddress, localAddress, localPort, _channelCommands, _numTuners, cancellationToken).ConfigureAwait(false); - - Logger.Info("Opened HDHR UDP stream from {0}", remoteAddress); - - if (!cancellationToken.IsCancellationRequested) - { - FileSystem.CreateDirectory(FileSystem.GetDirectoryName(TempFilePath)); - using (var fileStream = FileSystem.GetFileStream(TempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.None)) - { - CopyTo(udpClient, fileStream, openTaskCompletionSource, cancellationToken); - } - } - } - catch (OperationCanceledException ex) - { - Logger.Info("HDHR UDP stream cancelled or timed out from {0}", remoteAddress); - openTaskCompletionSource.TrySetException(ex); - break; - } - catch (Exception ex) - { - if (isFirstAttempt) - { - Logger.ErrorException("Error opening live stream:", ex); - openTaskCompletionSource.TrySetException(ex); - break; - } - - Logger.ErrorException("Error copying live stream, will reopen", ex); - } - - isFirstAttempt = false; + await hdHomerunManager.StopStreaming().ConfigureAwait(false); } + catch + { - await hdHomerunManager.StopStreaming().ConfigureAwait(false); - _liveStreamTaskCompletionSource.TrySetResult(true); + } } } @@ -158,36 +152,45 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun private void Resolve(TaskCompletionSource openTaskCompletionSource) { Task.Run(() => - { - openTaskCompletionSource.TrySetResult(true); - }); + { + openTaskCompletionSource.TrySetResult(true); + }); } private static int RtpHeaderBytes = 12; - private void CopyTo(ISocket udpClient, Stream target, TaskCompletionSource openTaskCompletionSource, CancellationToken cancellationToken) + private async Task CopyTo(ISocket udpClient, string file, TaskCompletionSource openTaskCompletionSource, CancellationToken cancellationToken) { - var source = _socketFactory.CreateNetworkStream(udpClient, false); var bufferSize = 81920; byte[] buffer = new byte[bufferSize]; int read; var resolved = false; - while ((read = source.Read(buffer, 0, buffer.Length)) != 0) + using (var source = _socketFactory.CreateNetworkStream(udpClient, false)) { - cancellationToken.ThrowIfCancellationRequested(); - - read -= RtpHeaderBytes; - - if (read > 0) + using (var fileStream = FileSystem.GetFileStream(file, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.None)) { - target.Write(buffer, RtpHeaderBytes, read); - } + var currentCancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, new CancellationTokenSource(TimeSpan.FromSeconds(30)).Token).Token; - if (!resolved) - { - resolved = true; - Resolve(openTaskCompletionSource); + while ((read = await source.ReadAsync(buffer, 0, buffer.Length, currentCancellationToken).ConfigureAwait(false)) != 0) + { + cancellationToken.ThrowIfCancellationRequested(); + + currentCancellationToken = cancellationToken; + + read -= RtpHeaderBytes; + + if (read > 0) + { + fileStream.Write(buffer, RtpHeaderBytes, read); + } + + if (!resolved) + { + resolved = true; + Resolve(openTaskCompletionSource); + } + } } } } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs index 4641a1c91f..12695cd8e7 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs @@ -32,6 +32,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts protected readonly string TempFilePath; protected readonly ILogger Logger; + protected readonly CancellationTokenSource LiveStreamCancellationTokenSource = new CancellationTokenSource(); public LiveStream(MediaSourceInfo mediaSource, IEnvironmentInfo environment, IFileSystem fileSystem, ILogger logger, IServerApplicationPaths appPaths) { @@ -46,19 +47,13 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts TempFilePath = Path.Combine(appPaths.TranscodingTempPath, UniqueId + ".ts"); } - public Task Open(CancellationToken cancellationToken) - { - return OpenInternal(cancellationToken); - } - - protected virtual Task OpenInternal(CancellationToken cancellationToken) + public virtual Task Open(CancellationToken openCancellationToken) { return Task.FromResult(true); } - public virtual Task Close() + public virtual void Close() { - return Task.FromResult(true); } protected Stream GetInputStream(string path, bool allowAsyncFileRead) @@ -75,11 +70,24 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts protected async Task DeleteTempFile(string path, int retryCount = 0) { + if (retryCount == 0) + { + Logger.Info("Deleting temp file {0}", path); + } + try { FileSystem.DeleteFile(path); return; } + catch (DirectoryNotFoundException) + { + return; + } + catch (FileNotFoundException) + { + return; + } catch { @@ -96,6 +104,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts public async Task CopyToAsync(Stream stream, CancellationToken cancellationToken) { + cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, LiveStreamCancellationTokenSource.Token).Token; + var allowAsync = false;//Environment.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows; // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039 @@ -110,16 +120,27 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts private static async Task CopyTo(Stream source, Stream destination, int bufferSize, Action onStarted, CancellationToken cancellationToken) { byte[] buffer = new byte[bufferSize]; - while (true) + + var eofCount = 0; + var emptyReadLimit = 1000; + + while (eofCount < emptyReadLimit) { cancellationToken.ThrowIfCancellationRequested(); - var read = source.Read(buffer, 0, buffer.Length); + var bytesRead = source.Read(buffer, 0, buffer.Length); - if (read > 0) + if (bytesRead == 0) { + eofCount++; + await Task.Delay(10, cancellationToken).ConfigureAwait(false); + } + else + { + eofCount = 0; + //await destination.WriteAsync(buffer, 0, read).ConfigureAwait(false); - destination.Write(buffer, 0, read); + destination.Write(buffer, 0, bytesRead); if (onStarted != null) { @@ -127,10 +148,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts onStarted = null; } } - else - { - await Task.Delay(10).ConfigureAwait(false); - } } } @@ -139,6 +156,10 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts try { stream.Seek(offset, SeekOrigin.End); + } + catch (IOException) + { + } catch (ArgumentException) { diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs index 8d1854f4b2..9fc6687d14 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs @@ -93,13 +93,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts protected override async Task> GetChannelStreamMediaSources(TunerHostInfo info, string channelId, CancellationToken cancellationToken) { - var channelIdPrefix = GetFullChannelIdPrefix(info); - - if (!channelId.StartsWith(channelIdPrefix, StringComparison.OrdinalIgnoreCase)) - { - return null; - } - var channels = await GetChannels(info, true, cancellationToken).ConfigureAwait(false); var channel = channels.FirstOrDefault(c => string.Equals(c.Id, channelId, StringComparison.OrdinalIgnoreCase)); if (channel != null) @@ -165,7 +158,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts RequiresOpening = true, RequiresClosing = true, RequiresLooping = info.EnableStreamLooping, - EnableMpDecimate = info.EnableMpDecimate, ReadAtNativeFramerate = false, diff --git a/Emby.Server.Implementations/Localization/Core/ar.json b/Emby.Server.Implementations/Localization/Core/ar.json index 28977c4f92..0c2ab1f6d8 100644 --- a/Emby.Server.Implementations/Localization/Core/ar.json +++ b/Emby.Server.Implementations/Localization/Core/ar.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", + "Latest": "\u0627\u0644\u0623\u062d\u062f\u062b", + "ValueSpecialEpisodeName": "\u062e\u0627\u0635 - {0}", + "Inherit": "\u062a\u0648\u0631\u064a\u062b", + "Books": "\u0627\u0644\u0643\u062a\u0628", + "Music": "\u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0649", + "Games": "\u0627\u0644\u0623\u0644\u0639\u0627\u0628", + "Photos": "\u0627\u0644\u0635\u0648\u0631", + "MixedContent": "\u0645\u062d\u062a\u0648\u0649 \u0645\u062e\u0644\u0648\u0637", + "MusicVideos": "\u0627\u0644\u0641\u064a\u062f\u064a\u0648\u0647\u0627\u062a \u0627\u0644\u0645\u0648\u0633\u064a\u0642\u064a\u0629", + "HomeVideos": "\u0627\u0644\u0641\u064a\u062f\u064a\u0648\u0647\u0627\u062a \u0627\u0644\u0645\u0646\u0632\u0644\u064a\u0629", + "Playlists": "\u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u062a\u0634\u063a\u064a\u0644", + "HeaderRecordingGroups": "\u0645\u062c\u0645\u0648\u0639\u0627\u062a \u0627\u0644\u062a\u0633\u062c\u064a\u0644", + "HeaderContinueWatching": "\u0627\u0633\u062a\u0626\u0646\u0627\u0641 \u0627\u0644\u0645\u0634\u0627\u0647\u062f\u0629", + "HeaderFavoriteArtists": "\u0627\u0644\u0641\u0646\u0627\u0646\u0648\u0646 \u0627\u0644\u0645\u0641\u0636\u0644\u0648\u0646", + "HeaderFavoriteSongs": "\u0627\u0644\u0623\u063a\u0627\u0646\u064a \u0627\u0644\u0645\u0641\u0636\u0644\u0629", + "HeaderAlbumArtists": "\u0641\u0646\u0627\u0646\u0648 \u0627\u0644\u0623\u0644\u0628\u0648\u0645\u0627\u062a", + "HeaderFavoriteAlbums": "\u0627\u0644\u0623\u0644\u0628\u0648\u0645\u0627\u062a \u0627\u0644\u0645\u0641\u0636\u0644\u0629", + "HeaderFavoriteEpisodes": "\u0627\u0644\u062d\u0644\u0642\u0627\u062a \u0627\u0644\u0645\u0641\u0636\u0644\u0629", + "HeaderFavoriteShows": "\u0627\u0644\u0645\u0633\u0644\u0633\u0644\u0627\u062a \u0627\u0644\u0645\u0641\u0636\u0644\u0629", + "HeaderNextUp": "\u0627\u0644\u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062a\u0627\u0644\u064a", + "Favorites": "\u0627\u0644\u0645\u0641\u0636\u0644\u0627\u062a", + "Collections": "\u0627\u0644\u0645\u062c\u0627\u0645\u064a\u0639", + "Channels": "\u0627\u0644\u0642\u0646\u0648\u0627\u062a", + "Movies": "\u0627\u0644\u0623\u0641\u0644\u0627\u0645", + "Albums": "\u0627\u0644\u0623\u0644\u0628\u0648\u0645\u0627\u062a", + "Artists": "\u0627\u0644\u0641\u0646\u0627\u0646\u0648\u0646", + "Folders": "\u0627\u0644\u0645\u062c\u0644\u062f\u0627\u062a", + "Songs": "\u0627\u0644\u0623\u063a\u0627\u0646\u064a", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "\u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0623\u0641\u0644\u0627\u0645", + "NameSeasonNumber": "\u0627\u0644\u0645\u0648\u0633\u0645 {0}", + "AppDeviceValues": "\u0627\u0644\u062a\u0637\u0628\u064a\u0642: {0}. \u0627\u0644\u062c\u0647\u0627\u0632: {1}.", + "UserDownloadingItemWithValues": "{0} \u064a\u0642\u0648\u0645 \u0628\u0625\u0646\u0632\u0627\u0644 {1}", + "HeaderLiveTV": "\u0627\u0644\u062a\u0644\u0641\u0627\u0632 \u0627\u0644\u0645\u0628\u0627\u0634\u0631", + "ChapterNameValue": "\u0627\u0644\u0628\u0627\u0628 {0}", + "ScheduledTaskFailedWithName": "\u0627\u0644\u0639\u0645\u0644\u064a\u0629 {0} \u0641\u0634\u0644\u062a", + "LabelRunningTimeValue": "\u0648\u0642\u062a \u0627\u0644\u062a\u0634\u063a\u064a\u0644: {0}", + "ScheduledTaskStartedWithName": "\u062a\u0645 \u0628\u062f\u0621 {0}", + "VersionNumber": "\u0627\u0644\u0625\u0635\u062f\u0627\u0631 \u0631\u0642\u0645 {0}", + "PluginInstalledWithName": "\u062a\u0645 \u062a\u062b\u0628\u064a\u062a {0}", + "StartupEmbyServerIsLoading": "\u062e\u0627\u062f\u0645 \u0623\u0645\u0628\u064a \u0642\u064a\u062f \u0627\u0644\u062a\u062d\u0645\u064a\u0644. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u0645\u062d\u0627\u0648\u064a\u0629 \u0628\u0639\u062f \u062d\u064a\u0646", + "PluginUpdatedWithName": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b {0}", + "PluginUninstalledWithName": "\u062a\u0645\u062a \u0625\u0632\u0627\u0644\u0629 {0}", + "ItemAddedWithName": "\u062a\u0645 \u0625\u0636\u0627\u0641\u0629 {0} \u0644\u0644\u0645\u0643\u062a\u0628\u0629", + "ItemRemovedWithName": "\u062a\u0645 \u0625\u0632\u0627\u0644\u0629 {0} \u0645\u0646 \u0627\u0644\u0645\u0643\u062a\u0628\u0629", + "LabelIpAddressValue": "\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0622\u064a \u0628\u064a: {0}", + "DeviceOnlineWithName": "{0} \u0645\u062a\u0635\u0644", + "UserOnlineFromDevice": "{0} \u0645\u062a\u0635\u0644\u0629 \u0639\u0628\u0631 {1}", + "ProviderValue": "\u0627\u0644\u0645\u0632\u0648\u062f: {0}", + "SubtitlesDownloadedForItem": "\u062a\u0645 \u0625\u0646\u0632\u0627\u0644 \u0627\u0644\u062a\u0631\u062c\u0645\u0627\u062a \u0644\u0640 {0}", + "UserCreatedWithName": "\u062a\u0645 \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 {0}", + "UserPasswordChangedWithName": "\u062a\u0645 \u062a\u063a\u064a\u064a\u0631 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 {0}", + "UserDeletedWithName": "\u062a\u0645 \u062d\u0630\u0641 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 {0}", + "UserConfigurationUpdatedWithName": "\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u062a\u0645 \u062a\u062d\u062f\u064a\u062b\u0647\u0627 \u0644\u0640 {0}", + "MessageServerConfigurationUpdated": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u062e\u0627\u062f\u0645", + "MessageNamedServerConfigurationUpdatedWithValue": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u062e\u0627\u062f\u0645 \u0641\u064a \u0642\u0633\u0645 {0}", + "MessageApplicationUpdated": "\u0644\u0642\u062f \u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u062e\u0627\u062f\u0645 \u0623\u0645\u0628\u064a", + "FailedLoginAttemptWithUserName": "\u0639\u0645\u0644\u064a\u0629 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0641\u0634\u0644\u062a \u0645\u0646 {0}", + "AuthenticationSucceededWithUserName": "\u062a\u0645 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 {0} \u0628\u0646\u062c\u0627\u062d", + "UserOfflineFromDevice": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u062a\u0635\u0627\u0644 {0} \u0645\u0646 {1}", + "DeviceOfflineWithName": "\u062a\u0645 \u0642\u0637\u0639 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0640{0}", + "UserStartedPlayingItemWithValues": "\u0642\u0627\u0645 {0} \u0628\u0628\u062f\u0621 \u062a\u0634\u063a\u064a\u0644 {1}", + "UserStoppedPlayingItemWithValues": "\u0642\u0627\u0645 {0} \u0628\u0625\u064a\u0642\u0627\u0641 \u062a\u0634\u063a\u064a\u0644 {1}", + "NotificationOptionPluginError": "\u0641\u0634\u0644 \u0641\u064a \u0627\u0644\u0645\u0644\u062d\u0642", + "NotificationOptionApplicationUpdateAvailable": "\u064a\u0648\u062c\u062f \u062a\u062d\u062f\u064a\u062b \u0644\u0644\u062a\u0637\u0628\u064a\u0642", + "NotificationOptionApplicationUpdateInstalled": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u062a\u0637\u0628\u064a\u0642", + "NotificationOptionPluginUpdateInstalled": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0645\u0644\u062d\u0642", + "NotificationOptionPluginInstalled": "\u062a\u0645 \u062a\u062b\u0628\u064a\u062a \u0627\u0644\u0645\u0644\u062d\u0642", + "NotificationOptionPluginUninstalled": "\u062a\u0645\u062a \u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0645\u0644\u062d\u0642", + "NotificationOptionVideoPlayback": "\u0628\u062f\u0623 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", + "NotificationOptionAudioPlayback": "\u0628\u062f\u0623 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0645\u0642\u0637\u0639 \u0627\u0644\u0635\u0648\u062a\u064a", + "NotificationOptionGamePlayback": "\u062a\u0645 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0644\u0639\u0628\u0629", + "NotificationOptionVideoPlaybackStopped": "\u062a\u0645 \u0625\u064a\u0642\u0627\u0641 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", + "NotificationOptionAudioPlaybackStopped": "\u062a\u0645 \u0625\u064a\u0642\u0627\u0641 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0645\u0642\u0637\u0639 \u0627\u0644\u0635\u0648\u062a\u064a", + "NotificationOptionGamePlaybackStopped": "\u062a\u0645 \u0625\u064a\u0642\u0627\u0641 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0644\u0639\u0628\u0629", + "NotificationOptionTaskFailed": "\u0641\u0634\u0644 \u0641\u064a \u0627\u0644\u0645\u0647\u0645\u0629 \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629", + "NotificationOptionInstallationFailed": "\u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u062a\u0646\u0635\u064a\u0628 \u0641\u0634\u0644\u062a", + "NotificationOptionNewLibraryContent": "\u062a\u0645 \u0625\u0636\u0627\u0641\u0629 \u0645\u062d\u062a\u0648\u0649 \u062c\u062f\u064a\u062f", + "NotificationOptionCameraImageUploaded": "\u062a\u0645 \u0631\u0642\u0639 \u0635\u0648\u0631\u0629 \u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0627", + "NotificationOptionUserLockedOut": "\u062a\u0645 \u0625\u0642\u0641\u0627\u0644 \u062d\u0633\u0627\u0628 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645", + "NotificationOptionServerRestartRequired": "\u064a\u062c\u0628 \u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062e\u0627\u062f\u0645", + "UserLockedOutWithName": "\u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 {0} \u062a\u0645 \u0645\u0646\u0639\u0647 \u0645\u0646 \u0627\u0644\u062f\u062e\u0648\u0644", + "SubtitleDownloadFailureForItem": "\u0639\u0645\u0644\u064a\u0629 \u0625\u0646\u0632\u0627\u0644 \u0627\u0644\u062a\u0631\u062c\u0645\u0629 \u0641\u0634\u0644\u062a \u0644\u0640{0}", + "Sync": "\u0645\u0632\u0627\u0645\u0646\u0629", + "User": "\u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645", + "System": "\u0627\u0644\u0646\u0638\u0627\u0645", + "Application": "\u0627\u0644\u062a\u0637\u0628\u064a\u0642", + "Plugin": "\u0627\u0644\u0645\u0644\u062d\u0642", "LabelExit": "\u062e\u0631\u0648\u062c", "LabelVisitCommunity": "\u0632\u064a\u0627\u0631\u0629 \u0627\u0644\u0645\u062c\u062a\u0645\u0639", - "LabelGithub": "\u062c\u064a\u062a \u0647\u0628", - "LabelApiDocumentation": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0645\u062f\u062e\u0644 \u0628\u0631\u0645\u062c\u0629 \u0627\u0644\u062a\u0637\u0628\u064a\u0642", - "LabelDeveloperResources": "\u0645\u0643\u062a\u0628\u0629 \u0627\u0644\u0645\u0628\u0631\u0645\u062c", "LabelBrowseLibrary": "\u062a\u0635\u0641\u062d \u0627\u0644\u0645\u0643\u062a\u0628\u0629", - "LabelConfigureServer": "\u0625\u0639\u062f\u0627\u062f \u0625\u0645\u0628\u064a", - "LabelRestartServer": "\u0627\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062e\u0627\u062f\u0645", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "LabelConfigureServer": "\u0636\u0628\u0637 \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0623\u0645\u0628\u064a", + "LabelRestartServer": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u062e\u0627\u062f\u0645" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/bg-BG.json b/Emby.Server.Implementations/Localization/Core/bg-BG.json index 22b99408df..40899caabf 100644 --- a/Emby.Server.Implementations/Localization/Core/bg-BG.json +++ b/Emby.Server.Implementations/Localization/Core/bg-BG.json @@ -1,42 +1,74 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438", + "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u043d\u0438 - {0}", + "Inherit": "Inherit", + "Books": "\u041a\u043d\u0438\u0433\u0438", + "Music": "\u041c\u0443\u0437\u0438\u043a\u0430", + "Games": "\u0418\u0433\u0440\u0438", + "Photos": "\u0421\u043d\u0438\u043c\u043a\u0438", + "MixedContent": "Mixed content", + "MusicVideos": "\u041c\u0443\u0437\u0438\u043a\u0430\u043b\u043d\u0438 \u043a\u043b\u0438\u043f\u043e\u0432\u0435", + "HomeVideos": "\u0414\u043e\u043c\u0430\u0448\u043d\u0438 \u043a\u043b\u0438\u043f\u043e\u0432\u0435", + "Playlists": "\u0421\u043f\u0438\u0441\u044a\u0446\u0438", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "\u041f\u0440\u043e\u0434\u044a\u043b\u0436\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 \u0433\u043b\u0435\u0434\u0430\u043d\u0435\u0442\u043e", + "HeaderFavoriteArtists": "\u041b\u044e\u0431\u0438\u043c\u0438 \u0438\u0437\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u0438", + "HeaderFavoriteSongs": "\u041b\u044e\u0431\u0438\u043c\u0438 \u043f\u0435\u0441\u043d\u0438", + "HeaderAlbumArtists": "\u0418\u0437\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u0438 \u043d\u0430 \u0430\u043b\u0431\u0443\u043c\u0438", + "HeaderFavoriteAlbums": "\u041b\u044e\u0431\u0438\u043c\u0438 \u0430\u043b\u0431\u0443\u043c\u0438", + "HeaderFavoriteEpisodes": "\u041b\u044e\u0431\u0438\u043c\u0438 \u0435\u043f\u0438\u0437\u043e\u0434\u0438", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "\u041b\u044e\u0431\u0438\u043c\u0438", + "Collections": "\u041a\u043e\u043b\u0435\u043a\u0446\u0438\u0438", + "Channels": "\u041a\u0430\u043d\u0430\u043b\u0438", + "Movies": "\u0424\u0438\u043b\u043c\u0438", + "Albums": "\u0410\u043b\u0431\u0443\u043c\u0438", + "Artists": "\u0418\u0437\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u0438", + "Folders": "\u041f\u0430\u043f\u043a\u0438", + "Songs": "\u041f\u0435\u0441\u043d\u0438", + "TvShows": "TV Shows", + "Shows": "\u0421\u0435\u0440\u0438\u0430\u043b\u0438", + "Genres": "\u0416\u0430\u043d\u0440\u043e\u0432\u0435", + "NameSeasonNumber": "\u0421\u0435\u0437\u043e\u043d {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\u0421\u043c\u0435\u0441\u0435\u043d\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435", - "FolderTypeMovies": "\u0424\u0438\u043b\u043c\u0438", - "FolderTypeMusic": "\u041c\u0443\u0437\u0438\u043a\u0430", - "FolderTypeAdultVideos": "\u041a\u043b\u0438\u043f\u043e\u0432\u0435 \u0437\u0430 \u0432\u044a\u0437\u0440\u0430\u0441\u0442\u043d\u0438", - "FolderTypePhotos": "\u0421\u043d\u0438\u043c\u043a\u0438", - "FolderTypeMusicVideos": "\u041c\u0443\u0437\u0438\u043a\u0430\u043b\u043d\u0438 \u043a\u043b\u0438\u043f\u043e\u0432\u0435", - "FolderTypeHomeVideos": "\u0414\u043e\u043c\u0430\u0448\u043d\u0438 \u043a\u043b\u0438\u043f\u043e\u0432\u0435", - "FolderTypeGames": "\u0418\u0433\u0440\u0438", - "FolderTypeBooks": "\u041a\u043d\u0438\u0433\u0438", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "\u041d\u0430\u0441\u043b\u0435\u0434\u0438", - "HeaderCastCrew": "\u0415\u043a\u0438\u043f", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "\u0418\u0437\u0445\u043e\u0434", - "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0442\u0438 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u0442\u043e", - "LabelGithub": "Github", - "LabelApiDocumentation": "API \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f", - "LabelDeveloperResources": "\u0420\u0435\u0441\u0443\u0440\u0441\u0438 \u0437\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u0446\u0438", - "LabelBrowseLibrary": "\u0420\u0430\u0437\u0433\u043b\u0435\u0434\u0430\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0442\u0430", - "LabelConfigureServer": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0439 Emby", - "LabelRestartServer": "\u0420\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0439 \u0441\u044a\u0440\u0432\u044a\u0440\u0430", - "CategorySync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437.", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} \u0437\u0430\u043f\u043e\u0447\u043d\u0430", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} \u0435 \u0434\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u043e", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "NotificationOptionPluginError": "Plugin failure", "NotificationOptionApplicationUpdateAvailable": "Application update available", "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionPluginUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u0442\u043e \u043d\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u043e", + "NotificationOptionPluginInstalled": "\u041f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0430", + "NotificationOptionPluginUninstalled": "\u041f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0435 \u0434\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0430", "NotificationOptionVideoPlayback": "Video playback started", "NotificationOptionAudioPlayback": "Audio playback started", "NotificationOptionGamePlayback": "Game playback started", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "NotificationOptionCameraImageUploaded": "Camera image uploaded", "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "\u0412\u0435\u0440\u0441\u0438\u044f {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby \u0441\u044a\u0440\u0432\u044a\u0440\u044a\u0442 \u0431\u0435 \u043e\u0431\u043d\u043e\u0432\u0435\u043d.", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", + "NotificationOptionServerRestartRequired": "\u041d\u0443\u0436\u043d\u043e \u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u0443\u0441\u043a\u0430\u043d\u0435 \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430", "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "\u0410\u0443\u0434\u0438\u043e", - "HeaderVideo": "\u0412\u0438\u0434\u0435\u043e", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "\u0421\u044a\u0441\u0442\u043e\u044f\u043d\u0438\u0435:", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0430\u043d\u0435", + "User": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b", + "System": "\u0421\u0438\u0441\u0442\u0435\u043c\u0430", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0442\u0435\u0442\u0435 \u043e\u0431\u0449\u043d\u043e\u0441\u0442\u0442\u0430", + "LabelBrowseLibrary": "\u0420\u0430\u0437\u0433\u043b\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0442\u0430", + "LabelConfigureServer": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0415\u043c\u0431\u0438", + "LabelRestartServer": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u0443\u0441\u043a\u0430\u043d\u0435 \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/ca.json b/Emby.Server.Implementations/Localization/Core/ca.json index 7ca8e1553d..cc2c00234f 100644 --- a/Emby.Server.Implementations/Localization/Core/ca.json +++ b/Emby.Server.Implementations/Localization/Core/ca.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Si et plau espera mentre la teva base de dades del Servidor Emby \u00e9s actualitzada. {0}% completat.", - "AppDeviceValues": "App: {0}, Dispositiu: {1}", - "UserDownloadingItemWithValues": "{0} est\u00e0 descarregant {1}", - "FolderTypeMixed": "Contingut barrejat", - "FolderTypeMovies": "Pel\u00b7l\u00edcules", - "FolderTypeMusic": "M\u00fasica", - "FolderTypeAdultVideos": "V\u00eddeos per adults", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "V\u00eddeos musicals", - "FolderTypeHomeVideos": "V\u00eddeos dom\u00e8stics", - "FolderTypeGames": "Jocs", - "FolderTypeBooks": "Llibres", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Heretat", - "HeaderCastCrew": "Repartiment i Equip", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Cap\u00edtol {0}", - "NameSeasonNumber": "Temporada {0}", - "LabelExit": "Sortir", - "LabelVisitCommunity": "Visita la Comunitat", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentaci\u00f3 de l'API", - "LabelDeveloperResources": "Recursos per a Desenvolupadors", - "LabelBrowseLibrary": "Examina la Biblioteca", - "LabelConfigureServer": "Configura Emby", - "LabelRestartServer": "Reiniciar Servidor", - "CategorySync": "Sync", - "CategoryUser": "Usuari", - "CategorySystem": "Sistema", - "CategoryApplication": "Aplicaci\u00f3", - "CategoryPlugin": "Complement", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Actualitzaci\u00f3 d'aplicaci\u00f3 disponible", - "NotificationOptionApplicationUpdateInstalled": "Actualitzaci\u00f3 d'aplicaci\u00f3 instal\u00b7lada", - "NotificationOptionPluginUpdateInstalled": "Actualitzaci\u00f3 de complement instal\u00b7lada", - "NotificationOptionPluginInstalled": "Complement instal\u00b7lat", - "NotificationOptionPluginUninstalled": "Complement desinstal\u00b7lat", - "NotificationOptionVideoPlayback": "Reproducci\u00f3 de v\u00eddeo iniciada", - "NotificationOptionAudioPlayback": "Reproducci\u00f3 d'\u00e0udio iniciada", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3 de v\u00eddeo aturada", - "NotificationOptionAudioPlaybackStopped": "Reproducci\u00f3 d'\u00e0udio aturada", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Tasca programada fallida", - "NotificationOptionInstallationFailed": "Instal\u00b7laci\u00f3 fallida", - "NotificationOptionNewLibraryContent": "Nou contingut afegit", - "NotificationOptionNewLibraryContentMultiple": "Nous continguts afegits", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "Usuari blocat", - "NotificationOptionServerRestartRequired": "Cal reiniciar el servidor", - "ViewTypePlaylists": "Llistes de reproducci\u00f3", - "ViewTypeMovies": "Pel\u00b7l\u00edcules", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Jocs", - "ViewTypeMusic": "M\u00fasica", - "ViewTypeMusicGenres": "G\u00e8neres", - "ViewTypeMusicArtists": "Artistes", - "ViewTypeBoxSets": "Col\u00b7leccions", - "ViewTypeChannels": "Canals", - "ViewTypeLiveTV": "TV en Directe", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Darrers Jocs", - "ViewTypeRecentlyPlayedGames": "Reprodu\u00eft Recentment", - "ViewTypeGameFavorites": "Preferits", - "ViewTypeGameSystems": "Sistemes de Jocs", - "ViewTypeGameGenres": "G\u00e8neres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "A Continuaci\u00f3", - "ViewTypeTvLatest": "Darrers", - "ViewTypeTvShowSeries": "S\u00e8ries:", - "ViewTypeTvGenres": "G\u00e8neres", - "ViewTypeTvFavoriteSeries": "S\u00e8ries Preferides", - "ViewTypeTvFavoriteEpisodes": "Episodis Preferits", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Darrers", - "ViewTypeMovieMovies": "Pel\u00b7l\u00edcules", - "ViewTypeMovieCollections": "Col\u00b7leccions", - "ViewTypeMovieFavorites": "Preferides", - "ViewTypeMovieGenres": "G\u00e8neres", - "ViewTypeMusicLatest": "Novetats", - "ViewTypeMusicPlaylists": "Llistes de reproducci\u00f3", - "ViewTypeMusicAlbums": "\u00c0lbums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Prefer\u00e8ncies de Visualitzaci\u00f3", - "ViewTypeMusicSongs": "Can\u00e7ons", - "ViewTypeMusicFavorites": "Preferides", - "ViewTypeMusicFavoriteAlbums": "\u00c0lbums Preferits", - "ViewTypeMusicFavoriteArtists": "Artistes Preferits", - "ViewTypeMusicFavoriteSongs": "Can\u00e7ons Preferides", - "ViewTypeFolders": "Directoris", - "ViewTypeLiveTvRecordingGroups": "Enregistraments", - "ViewTypeLiveTvChannels": "Canals", + "Latest": "Darreres", + "ValueSpecialEpisodeName": "Especial - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continua Veient", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Programes Preferits", + "HeaderNextUp": "A continuaci\u00f3", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "G\u00e8neres", + "NameSeasonNumber": "Season {0}", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Versi\u00f3 {0}", + "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} afegit a la biblioteca", - "ItemRemovedWithName": "{0} eliminat de la biblioteca", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", "LabelIpAddressValue": "Ip address: {0}", "DeviceOnlineWithName": "{0} is connected", "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Prove\u00efdor: {0}", + "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "L'usuari {0} ha estat eliminat", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} autenticat correctament", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "L'usuari {0} ha estat blocat", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} ha comen\u00e7at a reproduir {1}", - "UserStoppedPlayingItemWithValues": "{0} ha parat de reproduir {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "Usuari", - "HeaderName": "Nom", - "HeaderDate": "Data", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Data afegida", - "HeaderReleaseDate": "Data de publicaci\u00f3", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Temporada", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "S\u00e8ries:", - "HeaderNetwork": "Network", - "HeaderYear": "Any:", - "HeaderYears": "Anys:", - "HeaderParentalRating": "Valoraci\u00f3 Parental", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Tr\u00e0ilers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Sistemes de Jocs", - "HeaderPlayers": "Jugadors:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "\u00c0udio", - "HeaderVideo": "V\u00eddeo", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subt\u00edtols", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Estat", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "M\u00fasic", - "HeaderLocked": "Blocat", - "HeaderStudios": "Estudis", - "HeaderActor": "Actors", - "HeaderComposer": "Compositors", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Artista convidat", - "HeaderProducer": "Productors", - "HeaderWriter": "Escriptors", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Qualificacions de la comunitat", - "StartupEmbyServerIsLoading": "El servidor d'Emby s'està carregant. Si et plau, tornau-ho a provar de nou en breu." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/cs.json b/Emby.Server.Implementations/Localization/Core/cs.json index e3055f5bac..abbfde3800 100644 --- a/Emby.Server.Implementations/Localization/Core/cs.json +++ b/Emby.Server.Implementations/Localization/Core/cs.json @@ -1,39 +1,71 @@ { - "DbUpgradeMessage": "Po\u010dkejte pros\u00edm, datab\u00e1ze Emby Serveru je aktualizov\u00e1na na novou verzi. Hotovo {0}%.", - "AppDeviceValues": "Aplikace: {0}, Za\u0159\u00edzen\u00ed: {1}", - "UserDownloadingItemWithValues": "{0} pr\u00e1v\u011b stahuje {1}", - "FolderTypeMixed": "Sm\u00ed\u0161en\u00fd obsah", - "FolderTypeMovies": "Filmy", - "FolderTypeMusic": "Hudba", - "FolderTypeAdultVideos": "Filmy pro dosp\u011bl\u00e9", - "FolderTypePhotos": "Fotky", - "FolderTypeMusicVideos": "Hudebn\u00ed klipy", - "FolderTypeHomeVideos": "Dom\u00e1c\u00ed video", - "FolderTypeGames": "Hry", - "FolderTypeBooks": "Knihy", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Zd\u011bdit", - "HeaderCastCrew": "Herci a obsazen\u00ed", - "HeaderPeople": "Lid\u00e9", + "Latest": "Nejnov\u011bj\u0161\u00ed", "ValueSpecialEpisodeName": "Speci\u00e1l - {0}", - "LabelChapterName": "Kapitola {0}", + "Inherit": "Zd\u011bdit", + "Books": "Knihy", + "Music": "Hudba", + "Games": "Hry", + "Photos": "Fotky", + "MixedContent": "Sm\u00ed\u0161en\u00fd obsah", + "MusicVideos": "Hudebn\u00ed klipy", + "HomeVideos": "Dom\u00e1ci videa", + "Playlists": "Seznamy skladeb", + "HeaderRecordingGroups": "Skupiny nahr\u00e1vek", + "HeaderContinueWatching": "Pokra\u010dovat ve sledov\u00e1n\u00ed", + "HeaderFavoriteArtists": "Obl\u00edben\u00ed um\u011blci", + "HeaderFavoriteSongs": "Obl\u00edben\u00e9 p\u00edsn\u011b", + "HeaderAlbumArtists": "Um\u011blci alba", + "HeaderFavoriteAlbums": "Obl\u00edben\u00e1 alba", + "HeaderFavoriteEpisodes": "Obl\u00edben\u00e9 epizody", + "HeaderFavoriteShows": "Obl\u00edben\u00e9 seri\u00e1ly", + "HeaderNextUp": "Nadch\u00e1zej\u00edc\u00ed", + "Favorites": "Obl\u00edben\u00e9", + "Collections": "Kolekce", + "Channels": "Kan\u00e1ly", + "Movies": "Filmy", + "Albums": "Alba", + "Artists": "Um\u011blci", + "Folders": "Slo\u017eky", + "Songs": "Skladby", + "TvShows": "TV Shows", + "Shows": "Seri\u00e1ly", + "Genres": "\u017d\u00e1nry", "NameSeasonNumber": "Sez\u00f3na {0}", - "LabelExit": "Zav\u0159\u00edt", - "LabelVisitCommunity": "Nav\u0161t\u00edvit komunitu", - "LabelGithub": "Github", - "LabelApiDocumentation": "Dokumentace API", - "LabelDeveloperResources": "Zdroje v\u00fdvoj\u00e1\u0159\u016f", - "LabelBrowseLibrary": "Proch\u00e1zet knihovnu", - "LabelConfigureServer": "Konfigurovat Emby", - "LabelRestartServer": "Restartovat server", - "CategorySync": "Synchronizace", - "CategoryUser": "U\u017eivatel:", - "CategorySystem": "Syst\u00e9m", - "CategoryApplication": "Aplikace", - "CategoryPlugin": "Z\u00e1suvn\u00fd modul", + "AppDeviceValues": "Aplikace: {0}, Za\u0159\u00edzen\u00ed: {1}", + "UserDownloadingItemWithValues": "{0} stahuje {1}", + "HeaderLiveTV": "\u017div\u00e1 TV", + "ChapterNameValue": "Kapitola {0}", + "ScheduledTaskFailedWithName": "{0} selhalo", + "LabelRunningTimeValue": "D\u00e9lka m\u00e9dia: {0}", + "ScheduledTaskStartedWithName": "{0} zah\u00e1jeno", + "VersionNumber": "Verze {0}", + "PluginInstalledWithName": "{0} byl nainstalov\u00e1n", + "StartupEmbyServerIsLoading": "Emby Server je spou\u0161t\u011bn. Zkuste to pros\u00edm v brzk\u00e9 dob\u011b znovu.", + "PluginUpdatedWithName": "{0} byl aktualizov\u00e1n", + "PluginUninstalledWithName": "{0} byl odinstalov\u00e1n", + "ItemAddedWithName": "{0} byl p\u0159id\u00e1n do knihovny", + "ItemRemovedWithName": "{0} byl odstran\u011bn z knihovny", + "LabelIpAddressValue": "IP adresa: {0}", + "DeviceOnlineWithName": "{0} je p\u0159ipojen", + "UserOnlineFromDevice": "{0} se p\u0159ipojil z {1}", + "ProviderValue": "Poskytl: {0}", + "SubtitlesDownloadedForItem": "Sta\u017eeny titulky pro {0}", + "UserCreatedWithName": "U\u017eivatel {0} byl vytvo\u0159en", + "UserPasswordChangedWithName": "Provedena zm\u011bna hesla pro u\u017eivatele {0}", + "UserDeletedWithName": "U\u017eivatel {0} byl smaz\u00e1n", + "UserConfigurationUpdatedWithName": "Konfigurace u\u017eivatele byla aktualizov\u00e1na pro {0}", + "MessageServerConfigurationUpdated": "Konfigurace serveru aktualizov\u00e1na", + "MessageNamedServerConfigurationUpdatedWithValue": "Konfigurace sekce {0} na serveru byla aktualizov\u00e1na", + "MessageApplicationUpdated": "Emby Server byl aktualizov\u00e1n", + "FailedLoginAttemptWithUserName": "Ne\u00fasp\u011b\u0161n\u00fd pokus o p\u0159ihl\u00e1\u0161en\u00ed z {0}", + "AuthenticationSucceededWithUserName": "{0} \u00fasp\u011b\u0161n\u011b ov\u011b\u0159en", + "UserOfflineFromDevice": "{0} se odpojil od {1}", + "DeviceOfflineWithName": "{0} se odpojil", + "UserStartedPlayingItemWithValues": "{0} spustil p\u0159ehr\u00e1v\u00e1n\u00ed {1}", + "UserStoppedPlayingItemWithValues": "{0} zastavil p\u0159ehr\u00e1v\u00e1n\u00ed {1}", "NotificationOptionPluginError": "Chyba z\u00e1suvn\u00e9ho modulu", - "NotificationOptionApplicationUpdateAvailable": "Dostupnost aktualizace aplikace", - "NotificationOptionApplicationUpdateInstalled": "Instalace aktualizace aplikace", + "NotificationOptionApplicationUpdateAvailable": "Dostupn\u00e1 aktualizace aplikace", + "NotificationOptionApplicationUpdateInstalled": "Aktualizace aplikace instalov\u00e1na", "NotificationOptionPluginUpdateInstalled": "Aktualizace z\u00e1suvn\u00e9ho modulu instalov\u00e1na", "NotificationOptionPluginInstalled": "Z\u00e1suvn\u00fd modul instalov\u00e1n", "NotificationOptionPluginUninstalled": "Z\u00e1suvn\u00fd modul odstran\u011bn", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "Chyba napl\u00e1novan\u00e9 \u00falohy", "NotificationOptionInstallationFailed": "Chyba instalace", "NotificationOptionNewLibraryContent": "P\u0159id\u00e1n nov\u00fd obsah", - "NotificationOptionNewLibraryContentMultiple": "P\u0159id\u00e1n nov\u00fd obsah (v\u00edcen\u00e1sobn\u00fd)", "NotificationOptionCameraImageUploaded": "Kamerov\u00fd z\u00e1znam nahr\u00e1n", "NotificationOptionUserLockedOut": "U\u017eivatel uzam\u010den", "NotificationOptionServerRestartRequired": "Je vy\u017eadov\u00e1n restart serveru", - "ViewTypePlaylists": "Playlisty", - "ViewTypeMovies": "Filmy", - "ViewTypeTvShows": "Televize", - "ViewTypeGames": "Hry", - "ViewTypeMusic": "Hudba", - "ViewTypeMusicGenres": "\u017d\u00e1nry", - "ViewTypeMusicArtists": "\u00dam\u011blci", - "ViewTypeBoxSets": "Kolekce", - "ViewTypeChannels": "Kan\u00e1ly", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Vys\u00edl\u00e1no nyn\u00ed", - "ViewTypeLatestGames": "Nejnov\u011bj\u0161\u00ed hry", - "ViewTypeRecentlyPlayedGames": "Ned\u00e1vno p\u0159ehr\u00e1no", - "ViewTypeGameFavorites": "Obl\u00edben\u00e9", - "ViewTypeGameSystems": "Syst\u00e9my hry", - "ViewTypeGameGenres": "\u017d\u00e1nry", - "ViewTypeTvResume": "Obnovit", - "ViewTypeTvNextUp": "O\u010dek\u00e1van\u00e9", - "ViewTypeTvLatest": "Nejnov\u011bj\u0161\u00ed", - "ViewTypeTvShowSeries": "Seri\u00e1l", - "ViewTypeTvGenres": "\u017d\u00e1nry", - "ViewTypeTvFavoriteSeries": "Obl\u00edben\u00e9 seri\u00e1ly", - "ViewTypeTvFavoriteEpisodes": "Obl\u00edben\u00e9 epizody", - "ViewTypeMovieResume": "Obnovit", - "ViewTypeMovieLatest": "Nejnov\u011bj\u0161\u00ed", - "ViewTypeMovieMovies": "Filmy", - "ViewTypeMovieCollections": "Kolekce", - "ViewTypeMovieFavorites": "Obl\u00edben\u00e9", - "ViewTypeMovieGenres": "\u017d\u00e1nry", - "ViewTypeMusicLatest": "Nejnov\u011bj\u0161\u00ed", - "ViewTypeMusicPlaylists": "Playlisty", - "ViewTypeMusicAlbums": "Alba", - "ViewTypeMusicAlbumArtists": "Alba \u00fam\u011blc\u016f", - "HeaderOtherDisplaySettings": "Nastaven\u00ed zobrazen\u00ed", - "ViewTypeMusicSongs": "Songy", - "ViewTypeMusicFavorites": "Obl\u00edben\u00e9", - "ViewTypeMusicFavoriteAlbums": "Obl\u00edben\u00e1 alba", - "ViewTypeMusicFavoriteArtists": "Obl\u00edben\u00ed \u00fam\u011blci", - "ViewTypeMusicFavoriteSongs": "Obl\u00edben\u00e9 songy", - "ViewTypeFolders": "Slo\u017eky", - "ViewTypeLiveTvRecordingGroups": "Nahr\u00e1vky", - "ViewTypeLiveTvChannels": "Kan\u00e1ly", - "ScheduledTaskFailedWithName": "{0} selhalo", - "LabelRunningTimeValue": "D\u00e9lka m\u00e9dia: {0}", - "ScheduledTaskStartedWithName": "{0} zah\u00e1jeno", - "VersionNumber": "Verze {0}", - "PluginInstalledWithName": "{0} byl nainstalov\u00e1n", - "PluginUpdatedWithName": "{0} byl aktualizov\u00e1n", - "PluginUninstalledWithName": "{0} byl odinstalov\u00e1n", - "ItemAddedWithName": "{0} byl p\u0159id\u00e1n do knihovny", - "ItemRemovedWithName": "{0} byl odstran\u011bn z knihovny", - "LabelIpAddressValue": "IP adresa: {0}", - "DeviceOnlineWithName": "{0} je p\u0159ipojen", - "UserOnlineFromDevice": "{0} se p\u0159ipojil z {1}", - "ProviderValue": "Poskytl: {0}", - "SubtitlesDownloadedForItem": "Sta\u017eeny titulky pro {0}", - "UserConfigurationUpdatedWithName": "Konfigurace u\u017eivatele byla aktualizov\u00e1na pro {0}", - "UserCreatedWithName": "U\u017eivatel {0} byl vytvo\u0159en", - "UserPasswordChangedWithName": "Pro u\u017eivatele {0} byla provedena zm\u011bna hesla", - "UserDeletedWithName": "U\u017eivatel {0} byl smaz\u00e1n", - "MessageServerConfigurationUpdated": "Konfigurace serveru byla aktualizov\u00e1na", - "MessageNamedServerConfigurationUpdatedWithValue": "Konfigurace sekce {0} na serveru byla aktualizov\u00e1na", - "MessageApplicationUpdated": "Emby Server byl aktualizov\u00e1n", - "FailedLoginAttemptWithUserName": "Ne\u00fasp\u011b\u0161n\u00fd pokus o p\u0159ihl\u00e1\u0161en\u00ed z {0}", - "AuthenticationSucceededWithUserName": "{0} \u00fasp\u011b\u0161n\u011b ov\u011b\u0159en", - "DeviceOfflineWithName": "{0} se odpojil", "UserLockedOutWithName": "U\u017eivatel {0} byl odem\u010den", - "UserOfflineFromDevice": "{0} se odpojil od {1}", - "UserStartedPlayingItemWithValues": "{0} spustil p\u0159ehr\u00e1v\u00e1n\u00ed {1}", - "UserStoppedPlayingItemWithValues": "{0} zastavil p\u0159ehr\u00e1v\u00e1n\u00ed {1}", "SubtitleDownloadFailureForItem": "Stahov\u00e1n\u00ed titulk\u016f selhalo pro {0}", - "HeaderUnidentified": "Neidentifikov\u00e1n", - "HeaderImagePrimary": "Prim\u00e1rn\u00ed", - "HeaderImageBackdrop": "Pozad\u00ed", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Avatar u\u017eivatele", - "HeaderOverview": "P\u0159ehled", - "HeaderShortOverview": "Stru\u010dn\u00fd p\u0159ehled", - "HeaderType": "Typ", - "HeaderSeverity": "Z\u00e1va\u017enost", - "HeaderUser": "U\u017eivatel", - "HeaderName": "N\u00e1zev", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premi\u00e9ra", - "HeaderDateAdded": "P\u0159id\u00e1no", - "HeaderReleaseDate": "Datum vyd\u00e1n\u00ed", - "HeaderRuntime": "D\u00e9lka", - "HeaderPlayCount": "P\u0159ehr\u00e1no (po\u010det)", - "HeaderSeason": "Sez\u00f3na", - "HeaderSeasonNumber": "\u010c\u00edslo sez\u00f3ny", - "HeaderSeries": "Seri\u00e1l:", - "HeaderNetwork": "S\u00ed\u0165", - "HeaderYear": "Rok:", - "HeaderYears": "V letech:", - "HeaderParentalRating": "Rodi\u010dovsk\u00e9 hodnocen\u00ed", - "HeaderCommunityRating": "Hodnocen\u00ed komunity", - "HeaderTrailers": "Trailery", - "HeaderSpecials": "Speci\u00e1ly", - "HeaderGameSystems": "Syst\u00e9m hry", - "HeaderPlayers": "Hr\u00e1\u010di:", - "HeaderAlbumArtists": "\u00dam\u011blci alba", - "HeaderAlbums": "Alba", - "HeaderDisc": "Disk", - "HeaderTrack": "Stopa", - "HeaderAudio": "Zvuk", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Vlo\u017een\u00fd obr\u00e1zek", - "HeaderResolution": "Rozli\u0161en\u00ed", - "HeaderSubtitles": "Titulky", - "HeaderGenres": "\u017d\u00e1nry", - "HeaderCountries": "Zem\u011b", - "HeaderStatus": "Stav", - "HeaderTracks": "Stopy", - "HeaderMusicArtist": "Hudebn\u00ed \u00fam\u011blec", - "HeaderLocked": "Uzam\u010deno", - "HeaderStudios": "Studia", - "HeaderActor": "Herci", - "HeaderComposer": "Skladatel\u00e9", - "HeaderDirector": "Re\u017eis\u00e9\u0159i", - "HeaderGuestStar": "Hostuj\u00edc\u00ed hv\u011bzda", - "HeaderProducer": "Producenti", - "HeaderWriter": "Spisovatel\u00e9", - "HeaderParentalRatings": "Rodi\u010dovsk\u00e1 hodnocen\u00ed", - "HeaderCommunityRatings": "Hodnocen\u00ed komunity", - "StartupEmbyServerIsLoading": "Emby Server je na\u010d\u00edt\u00e1n. Zkuste to pros\u00edm znovu v brzk\u00e9 dob\u011b." + "Sync": "Synchronizace", + "User": "U\u017eivatel", + "System": "Syst\u00e9m", + "Application": "Aplikace", + "Plugin": "Z\u00e1suvn\u00fd modul", + "LabelExit": "Uko\u010dit", + "LabelVisitCommunity": "Nav\u0161t\u00edvit komunitu", + "LabelBrowseLibrary": "Proch\u00e1zet knihovnu", + "LabelConfigureServer": "Konfigurovat Emby", + "LabelRestartServer": "Restartovat Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/da.json b/Emby.Server.Implementations/Localization/Core/da.json index d2a628a809..ed9652c33d 100644 --- a/Emby.Server.Implementations/Localization/Core/da.json +++ b/Emby.Server.Implementations/Localization/Core/da.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Enhed: {1}", - "UserDownloadingItemWithValues": "{0} henter {1}", - "FolderTypeMixed": "Blandet indhold", - "FolderTypeMovies": "FIlm", - "FolderTypeMusic": "Musik", - "FolderTypeAdultVideos": "Voksenfilm", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "Musikvideoer", - "FolderTypeHomeVideos": "Hjemmevideoer", - "FolderTypeGames": "Spil", - "FolderTypeBooks": "B\u00f8ger", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Nedarv", - "HeaderCastCrew": "Medvirkende", - "HeaderPeople": "Mennesker", + "Latest": "Seneste", "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Kapitel {0}", + "Inherit": "Arv", + "Books": "B\u00f8ger", + "Music": "Musik", + "Games": "Spil", + "Photos": "Fotos", + "MixedContent": "Blandet indhold", + "MusicVideos": "Musikvideoer", + "HomeVideos": "Hjemmevideoer", + "Playlists": "Spillelister", + "HeaderRecordingGroups": "Optagegrupper", + "HeaderContinueWatching": "Forts\u00e6t Afspilning", + "HeaderFavoriteArtists": "Favoritkunstnere", + "HeaderFavoriteSongs": "Favoritsange", + "HeaderAlbumArtists": "Albumkunstnere", + "HeaderFavoriteAlbums": "Favoritalbum", + "HeaderFavoriteEpisodes": "Favoritepisoder", + "HeaderFavoriteShows": "Favorit serier", + "HeaderNextUp": "N\u00e6ste", + "Favorites": "Favoritter", + "Collections": "Samlinger", + "Channels": "Kanaler", + "Movies": "Film", + "Albums": "Album", + "Artists": "Kunstner", + "Folders": "Mapper", + "Songs": "Sange", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genre", "NameSeasonNumber": "S\u00e6son {0}", - "LabelExit": "Afslut", - "LabelVisitCommunity": "Bes\u00f8g F\u00e6lleskab", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api dokumentation", - "LabelDeveloperResources": "Udviklerressourcer", - "LabelBrowseLibrary": "Gennemse bibliotek", - "LabelConfigureServer": "Konfigurer Emby", - "LabelRestartServer": "Genstart Server", - "CategorySync": "Sync", - "CategoryUser": "Bruger", - "CategorySystem": "System", - "CategoryApplication": "Program", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin fejl", - "NotificationOptionApplicationUpdateAvailable": "Programopdatering tilg\u00e6ngelig", - "NotificationOptionApplicationUpdateInstalled": "Programopdatering installeret", - "NotificationOptionPluginUpdateInstalled": "Opdatering til plugin installeret", - "NotificationOptionPluginInstalled": "Plugin installeret", - "NotificationOptionPluginUninstalled": "Plugin afinstalleret", - "NotificationOptionVideoPlayback": "Videoafspilning startet", - "NotificationOptionAudioPlayback": "Lydafspilning startet", - "NotificationOptionGamePlayback": "Spilafspilning startet", - "NotificationOptionVideoPlaybackStopped": "Videoafspilning stoppet", - "NotificationOptionAudioPlaybackStopped": "Lydafspilning stoppet", - "NotificationOptionGamePlaybackStopped": "Spilafspilning stoppet", - "NotificationOptionTaskFailed": "Fejl i planlagt opgave", - "NotificationOptionInstallationFailed": "Fejl ved installation", - "NotificationOptionNewLibraryContent": "Nyt indhold tilf\u00f8jet", - "NotificationOptionNewLibraryContentMultiple": "Nyt indhold tilf\u00f8jet (flere)", - "NotificationOptionCameraImageUploaded": "Kamerabillede tilf\u00f8jet", - "NotificationOptionUserLockedOut": "Bruger l\u00e5st", - "NotificationOptionServerRestartRequired": "Genstart af serveren p\u00e5kr\u00e6vet", - "ViewTypePlaylists": "Afspilningslister", - "ViewTypeMovies": "Film", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Spil", - "ViewTypeMusic": "Musik", - "ViewTypeMusicGenres": "Genrer", - "ViewTypeMusicArtists": "Artister", - "ViewTypeBoxSets": "Samlinger", - "ViewTypeChannels": "Kanaler", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Vises nu", - "ViewTypeLatestGames": "Seneste spil", - "ViewTypeRecentlyPlayedGames": "Afspillet for nylig", - "ViewTypeGameFavorites": "Favoritter", - "ViewTypeGameSystems": "Spilsystemer", - "ViewTypeGameGenres": "Genrer", - "ViewTypeTvResume": "Forts\u00e6t", - "ViewTypeTvNextUp": "N\u00e6ste", - "ViewTypeTvLatest": "Seneste", - "ViewTypeTvShowSeries": "Serier", - "ViewTypeTvGenres": "Genrer", - "ViewTypeTvFavoriteSeries": "Favoritserier", - "ViewTypeTvFavoriteEpisodes": "Favoritepisoder", - "ViewTypeMovieResume": "Forts\u00e6t", - "ViewTypeMovieLatest": "Seneste", - "ViewTypeMovieMovies": "Film", - "ViewTypeMovieCollections": "Samlinger", - "ViewTypeMovieFavorites": "Favoritter", - "ViewTypeMovieGenres": "Genrer", - "ViewTypeMusicLatest": "Seneste", - "ViewTypeMusicPlaylists": "Afspilningslister", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Albumartister", - "HeaderOtherDisplaySettings": "Indstillinger for visning", - "ViewTypeMusicSongs": "Sange", - "ViewTypeMusicFavorites": "Favoritter", - "ViewTypeMusicFavoriteAlbums": "Favoritalbums", - "ViewTypeMusicFavoriteArtists": "Favoritartister", - "ViewTypeMusicFavoriteSongs": "Favoritsange", - "ViewTypeFolders": "Mapper", - "ViewTypeLiveTvRecordingGroups": "Optagelser", - "ViewTypeLiveTvChannels": "Kanaler", - "ScheduledTaskFailedWithName": "{0} fejlede", - "LabelRunningTimeValue": "K\u00f8rselstid: {0}", - "ScheduledTaskStartedWithName": "{0} startet", + "AppDeviceValues": "App: {0}, Enhed: {1}", + "UserDownloadingItemWithValues": "{0} downloader {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Kapitel {0}", + "ScheduledTaskFailedWithName": "{0} fejlet", + "LabelRunningTimeValue": "Spilletid: {0}", + "ScheduledTaskStartedWithName": "{0} p\u00e5begyndt", "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} blev installeret", + "StartupEmbyServerIsLoading": "Emby Server indl\u00e6ser. Pr\u00f8v venligst igen om kort tid.", "PluginUpdatedWithName": "{0} blev opdateret", "PluginUninstalledWithName": "{0} blev afinstalleret", "ItemAddedWithName": "{0} blev tilf\u00f8jet til biblioteket", @@ -105,74 +49,48 @@ "DeviceOnlineWithName": "{0} er forbundet", "UserOnlineFromDevice": "{0} er online fra {1}", "ProviderValue": "Udbyder: {0}", - "SubtitlesDownloadedForItem": "Undertekster hentet til {0}", - "UserConfigurationUpdatedWithName": "Brugerkonfigurationen for {0} er blevet opdateret", - "UserCreatedWithName": "Bruger {0} er skabt", - "UserPasswordChangedWithName": "Adgangskoden for {0} er blevet \u00e6ndret", - "UserDeletedWithName": "Bruger {0} er slettet", - "MessageServerConfigurationUpdated": "Serverkonfigurationen er opdateret", - "MessageNamedServerConfigurationUpdatedWithValue": "Serverkonfiguration sektion {0} er opdateret", - "MessageApplicationUpdated": "Emby er blevet opdateret", - "FailedLoginAttemptWithUserName": "Fejlslagent loginfors\u00f8g fra {0}", - "AuthenticationSucceededWithUserName": "{0} autentificeret", + "SubtitlesDownloadedForItem": "Undertekster downloadet for {0}", + "UserCreatedWithName": "Bruger {0} er blevet oprettet", + "UserPasswordChangedWithName": "Adgangskode er \u00e6ndret for bruger {0}", + "UserDeletedWithName": "Brugeren {0} er blevet slettet", + "UserConfigurationUpdatedWithName": "Brugerkonfiguration er blevet opdateret for {0}", + "MessageServerConfigurationUpdated": "Serverkonfiguration er blevet opdateret", + "MessageNamedServerConfigurationUpdatedWithValue": "Server konfigurationssektion {0} er blevet opdateret", + "MessageApplicationUpdated": "Emby Server er blevet opdateret", + "FailedLoginAttemptWithUserName": "Fejlet loginfors\u00f8g fra {0}", + "AuthenticationSucceededWithUserName": "{0} bekr\u00e6ftet med succes", + "UserOfflineFromDevice": "{0} har afbrudt fra {1}", "DeviceOfflineWithName": "{0} har afbrudt forbindelsen", - "UserLockedOutWithName": "Bruger {0} er blevet l\u00e5st", - "UserOfflineFromDevice": "{0} har afbrudt forbindelsen fra {1}", - "UserStartedPlayingItemWithValues": "{0} afspiller {1}", - "UserStoppedPlayingItemWithValues": "{0} har stoppet afpilningen af {1}", - "SubtitleDownloadFailureForItem": "Hentning af undertekster til {0} fejlede", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "Bruger", - "HeaderName": "Navn", - "HeaderDate": "Dato", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Udgivelsesdato", - "HeaderRuntime": "Varighed", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "S\u00e6son", - "HeaderSeasonNumber": "S\u00e6sonnummer", - "HeaderSeries": "Series:", - "HeaderNetwork": "Netv\u00e6rk", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "F\u00e6llesskabsvurdering", - "HeaderTrailers": "Trailere", - "HeaderSpecials": "S\u00e6rudsendelser", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disk", - "HeaderTrack": "Spor", - "HeaderAudio": "Lyd", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Indlejret billede", - "HeaderResolution": "Opl\u00f8sning", - "HeaderSubtitles": "Undertekster", - "HeaderGenres": "Genrer", - "HeaderCountries": "Lande", - "HeaderStatus": "Status", - "HeaderTracks": "Spor", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studier", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Aldersgr\u00e6nser", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "UserStartedPlayingItemWithValues": "{0} har p\u00e5begyndt afspilning af {1}", + "UserStoppedPlayingItemWithValues": "{0} har afsluttet afspilning af {1}", + "NotificationOptionPluginError": "Pluginfejl", + "NotificationOptionApplicationUpdateAvailable": "Opdatering til applikation tilg\u00e6ngelig", + "NotificationOptionApplicationUpdateInstalled": "Opdatering til applikation installeret", + "NotificationOptionPluginUpdateInstalled": "Opdatering til plugin installeret", + "NotificationOptionPluginInstalled": "Plugin installeret", + "NotificationOptionPluginUninstalled": "Plugin afinstalleret", + "NotificationOptionVideoPlayback": "Videoafspilning p\u00e5begyndt", + "NotificationOptionAudioPlayback": "Audioafspilning p\u00e5begyndt", + "NotificationOptionGamePlayback": "Afspilning af Spil p\u00e5begyndt", + "NotificationOptionVideoPlaybackStopped": "Videoafspilning stoppet", + "NotificationOptionAudioPlaybackStopped": "Audioafspilning stoppet", + "NotificationOptionGamePlaybackStopped": "Afspilning af Spil stoppet", + "NotificationOptionTaskFailed": "Planlagt opgave fejlet", + "NotificationOptionInstallationFailed": "Installationsfejl", + "NotificationOptionNewLibraryContent": "Nyt indhold tilf\u00f8jet", + "NotificationOptionCameraImageUploaded": "Kamerabillede uploadet", + "NotificationOptionUserLockedOut": "Bruger l\u00e5st ude", + "NotificationOptionServerRestartRequired": "Genstart af server p\u00e5kr\u00e6vet", + "UserLockedOutWithName": "Brugeren {0} er blevet l\u00e5st ude", + "SubtitleDownloadFailureForItem": "Fejlet i download af undertekster for {0}", + "Sync": "Synk", + "User": "Bruger", + "System": "System", + "Application": "Applikation", + "Plugin": "Plugin", + "LabelExit": "Afslut", + "LabelVisitCommunity": "Bes\u00f8g F\u00e6llesskab", + "LabelBrowseLibrary": "Gennemse Bibliotek", + "LabelConfigureServer": "Konfigurer Emby", + "LabelRestartServer": "Genstart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/de.json b/Emby.Server.Implementations/Localization/Core/de.json index 30e3d9215e..183b4aaf8a 100644 --- a/Emby.Server.Implementations/Localization/Core/de.json +++ b/Emby.Server.Implementations/Localization/Core/de.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "Bitte warten Sie w\u00e4hrend die Emby Datenbank aktualisiert wird. {0}% verarbeitet.", + "Latest": "Neueste", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "\u00dcbernehmen", + "Books": "B\u00fccher", + "Music": "Musik", + "Games": "Spiele", + "Photos": "Fotos", + "MixedContent": "Gemischte Inhalte", + "MusicVideos": "Musik-Videos", + "HomeVideos": "Heimvideos", + "Playlists": "Wiedergabelisten", + "HeaderRecordingGroups": "Aufnahme-Gruppen", + "HeaderContinueWatching": "Weiterschauen", + "HeaderFavoriteArtists": "Interpreten Favoriten", + "HeaderFavoriteSongs": "Lieder Favoriten", + "HeaderAlbumArtists": "Album-K\u00fcnstler", + "HeaderFavoriteAlbums": "Lieblingsalben", + "HeaderFavoriteEpisodes": "Lieblingsepisoden", + "HeaderFavoriteShows": "Lieblingsserien", + "HeaderNextUp": "Als N\u00e4chstes", + "Favorites": "Favoriten", + "Collections": "Sammlungen", + "Channels": "Kan\u00e4le", + "Movies": "Filme", + "Albums": "Alben", + "Artists": "Interpreten", + "Folders": "Verzeichnisse", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Serien", + "Genres": "Genres", + "NameSeasonNumber": "Staffel {0}", "AppDeviceValues": "App: {0}, Ger\u00e4t: {1}", "UserDownloadingItemWithValues": "{0} l\u00e4dt {1} herunter", - "FolderTypeMixed": "Gemischte Inhalte", - "FolderTypeMovies": "Filme", - "FolderTypeMusic": "Musik", - "FolderTypeAdultVideos": "Videos f\u00fcr Erwachsene", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "Musikvideos", - "FolderTypeHomeVideos": "Heimvideos", - "FolderTypeGames": "Spiele", - "FolderTypeBooks": "B\u00fccher", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "\u00dcbernehmen", - "HeaderCastCrew": "Besetzung & Crew", - "HeaderPeople": "Personen", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Kapitel {0}", - "NameSeasonNumber": "Staffel {0}", - "LabelExit": "Beenden", - "LabelVisitCommunity": "Besuche die Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Dokumentation", - "LabelDeveloperResources": "Entwickler Ressourcen", - "LabelBrowseLibrary": "Bibliothek durchsuchen", - "LabelConfigureServer": "Konfiguriere Emby", - "LabelRestartServer": "Server neustarten", - "CategorySync": "Sync", - "CategoryUser": "Benutzer", - "CategorySystem": "System", - "CategoryApplication": "Anwendung", - "CategoryPlugin": "Plugin", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Kapitel {0}", + "ScheduledTaskFailedWithName": "{0} fehlgeschlagen", + "LabelRunningTimeValue": "Laufzeit: {0}", + "ScheduledTaskStartedWithName": "{0} gestartet", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} wurde installiert", + "StartupEmbyServerIsLoading": "Emby Server startet, bitte versuche es gleich noch einmal.", + "PluginUpdatedWithName": "{0} wurde aktualisiert", + "PluginUninstalledWithName": "{0} wurde deinstalliert", + "ItemAddedWithName": "{0} wurde der Bibliothek hinzugef\u00fcgt", + "ItemRemovedWithName": "{0} wurde aus der Bibliothek entfernt", + "LabelIpAddressValue": "IP Adresse: {0}", + "DeviceOnlineWithName": "{0} ist verbunden", + "UserOnlineFromDevice": "{0} ist online von {1}", + "ProviderValue": "Anbieter: {0}", + "SubtitlesDownloadedForItem": "Untertitel heruntergeladen f\u00fcr {0}", + "UserCreatedWithName": "Benutzer {0} wurde erstellt", + "UserPasswordChangedWithName": "Das Passwort f\u00fcr Benutzer {0} wurde ge\u00e4ndert", + "UserDeletedWithName": "Benutzer {0} wurde gel\u00f6scht", + "UserConfigurationUpdatedWithName": "Benutzereinstellungen wurden aktualisiert f\u00fcr {0}", + "MessageServerConfigurationUpdated": "Server Einstellungen wurden aktualisiert", + "MessageNamedServerConfigurationUpdatedWithValue": "Der Server Einstellungsbereich {0} wurde aktualisiert", + "MessageApplicationUpdated": "Emby Server wurde auf den neusten Stand gebracht.", + "FailedLoginAttemptWithUserName": "Fehlgeschlagener Anmeldeversuch von {0}", + "AuthenticationSucceededWithUserName": "{0} erfolgreich authentifiziert", + "UserOfflineFromDevice": "{0} wurde getrennt von {1}", + "DeviceOfflineWithName": "{0} wurde getrennt", + "UserStartedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} gestartet", + "UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} beendet", "NotificationOptionPluginError": "Plugin Fehler", "NotificationOptionApplicationUpdateAvailable": "Anwendungsaktualisierung verf\u00fcgbar", "NotificationOptionApplicationUpdateInstalled": "Anwendungsaktualisierung installiert", @@ -43,136 +75,22 @@ "NotificationOptionVideoPlaybackStopped": "Videowiedergabe gestoppt", "NotificationOptionAudioPlaybackStopped": "Audiowiedergabe gestoppt", "NotificationOptionGamePlaybackStopped": "Spielwiedergabe gestoppt", - "NotificationOptionTaskFailed": "Fehler bei geplanter Aufgabe", + "NotificationOptionTaskFailed": "Geplante Aufgaben fehlgeschlagen", "NotificationOptionInstallationFailed": "Installationsfehler", "NotificationOptionNewLibraryContent": "Neuer Inhalt hinzugef\u00fcgt", - "NotificationOptionNewLibraryContentMultiple": "Neuen Inhalte hinzugef\u00fcgt (mehrere)", "NotificationOptionCameraImageUploaded": "Kamera Bild hochgeladen", "NotificationOptionUserLockedOut": "Benutzer ausgeschlossen", "NotificationOptionServerRestartRequired": "Serverneustart notwendig", - "ViewTypePlaylists": "Wiedergabelisten", - "ViewTypeMovies": "Filme", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Spiele", - "ViewTypeMusic": "Musik", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "K\u00fcnstler", - "ViewTypeBoxSets": "Sammlungen", - "ViewTypeChannels": "Kan\u00e4le", - "ViewTypeLiveTV": "Live-TV", - "ViewTypeLiveTvNowPlaying": "Gerade ausgestrahlt", - "ViewTypeLatestGames": "Neueste Spiele", - "ViewTypeRecentlyPlayedGames": "K\u00fcrzlich abgespielt", - "ViewTypeGameFavorites": "Favoriten", - "ViewTypeGameSystems": "Spielesysteme", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Fortsetzen", - "ViewTypeTvNextUp": "Als n\u00e4chstes", - "ViewTypeTvLatest": "Neueste", - "ViewTypeTvShowSeries": "Serien", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Serien Favoriten", - "ViewTypeTvFavoriteEpisodes": "Episoden Favoriten", - "ViewTypeMovieResume": "Fortsetzen", - "ViewTypeMovieLatest": "Neueste", - "ViewTypeMovieMovies": "Filme", - "ViewTypeMovieCollections": "Sammlungen", - "ViewTypeMovieFavorites": "Favoriten", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Neueste", - "ViewTypeMusicPlaylists": "Wiedergabelisten", - "ViewTypeMusicAlbums": "Alben", - "ViewTypeMusicAlbumArtists": "Album-K\u00fcnstler", - "HeaderOtherDisplaySettings": "Anzeige Einstellungen", - "ViewTypeMusicSongs": "Lieder", - "ViewTypeMusicFavorites": "Favoriten", - "ViewTypeMusicFavoriteAlbums": "Album Favoriten", - "ViewTypeMusicFavoriteArtists": "Interpreten Favoriten", - "ViewTypeMusicFavoriteSongs": "Lieder Favoriten", - "ViewTypeFolders": "Verzeichnisse", - "ViewTypeLiveTvRecordingGroups": "Aufnahmen", - "ViewTypeLiveTvChannels": "Kan\u00e4le", - "ScheduledTaskFailedWithName": "{0} fehlgeschlagen", - "LabelRunningTimeValue": "Laufzeit: {0}", - "ScheduledTaskStartedWithName": "{0} gestartet", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} wurde installiert", - "PluginUpdatedWithName": "{0} wurde aktualisiert", - "PluginUninstalledWithName": "{0} wurde deinstalliert", - "ItemAddedWithName": "{0} wurde der Bibliothek hinzugef\u00fcgt", - "ItemRemovedWithName": "{0} wurde aus der Bibliothek entfernt", - "LabelIpAddressValue": "IP Adresse: {0}", - "DeviceOnlineWithName": "{0} ist verbunden", - "UserOnlineFromDevice": "{0} ist online von {1}", - "ProviderValue": "Anbieter: {0}", - "SubtitlesDownloadedForItem": "Untertitel heruntergeladen f\u00fcr {0}", - "UserConfigurationUpdatedWithName": "Benutzereinstellungen wurden aktualisiert f\u00fcr {0}", - "UserCreatedWithName": "Benutzer {0} wurde erstellt", - "UserPasswordChangedWithName": "Das Passwort f\u00fcr Benutzer {0} wurde ge\u00e4ndert", - "UserDeletedWithName": "Benutzer {0} wurde gel\u00f6scht", - "MessageServerConfigurationUpdated": "Server Einstellungen wurden aktualisiert", - "MessageNamedServerConfigurationUpdatedWithValue": "Der Server Einstellungsbereich {0} wurde aktualisiert", - "MessageApplicationUpdated": "Emby Server wurde auf den neusten Stand gebracht.", - "FailedLoginAttemptWithUserName": "Fehlgeschlagener Anmeldeversuch von {0}", - "AuthenticationSucceededWithUserName": "{0} erfolgreich authentifiziert", - "DeviceOfflineWithName": "{0} wurde getrennt", "UserLockedOutWithName": "Benutzer {0} wurde ausgeschlossen", - "UserOfflineFromDevice": "{0} wurde getrennt von {1}", - "UserStartedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} gestartet", - "UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} beendet", "SubtitleDownloadFailureForItem": "Download der Untertitel fehlgeschlagen f\u00fcr {0}", - "HeaderUnidentified": "Nicht identifiziert", - "HeaderImagePrimary": "Bevorzugt", - "HeaderImageBackdrop": "Hintergrund", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Benutzerbild", - "HeaderOverview": "\u00dcbersicht", - "HeaderShortOverview": "Kurz\u00fcbersicht", - "HeaderType": "Typ", - "HeaderSeverity": "Schwere", - "HeaderUser": "Benutzer", - "HeaderName": "Name", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premiere Datum", - "HeaderDateAdded": "Datum hinzugef\u00fcgt", - "HeaderReleaseDate": "Ver\u00f6ffentlichungsdatum", - "HeaderRuntime": "Laufzeit", - "HeaderPlayCount": "Anzahl Wiedergaben", - "HeaderSeason": "Staffel", - "HeaderSeasonNumber": "Staffel Nummer", - "HeaderSeries": "Serien:", - "HeaderNetwork": "Netzwerk", - "HeaderYear": "Jahr:", - "HeaderYears": "Jahre:", - "HeaderParentalRating": "Altersfreigabe", - "HeaderCommunityRating": "Community Bewertung", - "HeaderTrailers": "Trailer", - "HeaderSpecials": "Extras", - "HeaderGameSystems": "Spiele Systeme", - "HeaderPlayers": "Spieler:", - "HeaderAlbumArtists": "Album K\u00fcnstler", - "HeaderAlbums": "Alben", - "HeaderDisc": "Disc", - "HeaderTrack": "St\u00fcck", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Integriertes Bild", - "HeaderResolution": "Aufl\u00f6sung", - "HeaderSubtitles": "Untertitel", - "HeaderGenres": "Genres", - "HeaderCountries": "L\u00e4nder", - "HeaderStatus": "Status", - "HeaderTracks": "Lieder", - "HeaderMusicArtist": "Musik K\u00fcnstler", - "HeaderLocked": "Blockiert", - "HeaderStudios": "Studios", - "HeaderActor": "Schauspieler", - "HeaderComposer": "Komponierer", - "HeaderDirector": "Regie", - "HeaderGuestStar": "Gaststar", - "HeaderProducer": "Produzenten", - "HeaderWriter": "Autoren", - "HeaderParentalRatings": "Altersbeschr\u00e4nkung", - "HeaderCommunityRatings": "Community Bewertungen", - "StartupEmbyServerIsLoading": "Emby Server startet, bitte versuchen Sie es gleich noch einmal." + "Sync": "Synchronisation", + "User": "Benutzer", + "System": "System", + "Application": "Anwendung", + "Plugin": "Plugin", + "LabelExit": "Beenden", + "LabelVisitCommunity": "Besuche die Community", + "LabelBrowseLibrary": "Bibliothek durchsuchen", + "LabelConfigureServer": "Konfiguriere Emby", + "LabelRestartServer": "Server neustarten" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/el.json b/Emby.Server.Implementations/Localization/Core/el.json deleted file mode 100644 index 9e2d321cc4..0000000000 --- a/Emby.Server.Implementations/Localization/Core/el.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\u0391\u03bd\u03ac\u03bc\u03b5\u03b9\u03ba\u03c4\u03bf \u03a0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03bf", - "FolderTypeMovies": "\u03a4\u03b1\u03b9\u03bd\u03af\u03b5\u03c2", - "FolderTypeMusic": "\u039c\u03bf\u03c5\u03c3\u03b9\u03ba\u03ae", - "FolderTypeAdultVideos": "\u03a4\u03b1\u03b9\u03bd\u03af\u03b5\u03c2 \u0395\u03bd\u03b7\u03bb\u03af\u03ba\u03c9\u03bd", - "FolderTypePhotos": "\u03a6\u03c9\u03c4\u03bf\u03b3\u03c1\u03b1\u03c6\u03af\u03b5\u03c2", - "FolderTypeMusicVideos": "\u039c\u03bf\u03c5\u03c3\u03b9\u03ba\u03ac \u0392\u03af\u03bd\u03c4\u03b5\u03bf", - "FolderTypeHomeVideos": "\u03a0\u03c1\u03bf\u03c3\u03c9\u03c0\u03b9\u03ba\u03ac \u0392\u03af\u03bd\u03c4\u03b5\u03bf", - "FolderTypeGames": "\u03a0\u03b1\u03b9\u03c7\u03bd\u03af\u03b4\u03b9\u03b1", - "FolderTypeBooks": "\u0392\u03b9\u03b2\u03bb\u03af\u03b1", - "FolderTypeTvShows": "\u03a4\u03b7\u03bb\u03b5\u03cc\u03c1\u03b1\u03c3\u03b7", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "\u0397\u03b8\u03bf\u03c0\u03bf\u03b9\u03bf\u03af \u03ba\u03b1\u03b9 \u03c3\u03c5\u03bd\u03b5\u03c1\u03b3\u03b5\u03af\u03bf", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "\u0388\u03be\u03bf\u03b4\u03bf\u03c2", - "LabelVisitCommunity": "\u039a\u03bf\u03b9\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "\u03a0\u03b7\u03b3\u03ad\u03c2 \u03a0\u03c1\u03bf\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03b9\u03c3\u03c4\u03ae", - "LabelBrowseLibrary": "\u03a0\u03b5\u03c1\u03b9\u03b7\u03b3\u03b7\u03b8\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03b7 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7", - "LabelConfigureServer": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 Emby", - "LabelRestartServer": "\u0395\u03c0\u03b1\u03bd\u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae", - "CategorySync": "\u03a3\u03c5\u03c7\u03c1\u03bf\u03bd\u03b9\u03c3\u03bc\u03cc\u03c2", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "\u0389\u03c7\u03bf\u03c2", - "HeaderVideo": "\u0392\u03af\u03bd\u03c4\u03b5\u03bf", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -} \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/en-GB.json b/Emby.Server.Implementations/Localization/Core/en-GB.json index 493c6c4e99..8dc9abf012 100644 --- a/Emby.Server.Implementations/Localization/Core/en-GB.json +++ b/Emby.Server.Implementations/Localization/Core/en-GB.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favourite Artists", + "HeaderFavoriteSongs": "Favourite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favourite Albums", + "HeaderFavoriteEpisodes": "Favourite Episodes", + "HeaderFavoriteShows": "Favourite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favourites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Series {0}", - "LabelExit": "Exit", - "LabelVisitCommunity": "Visit Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Browse Library", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Restart Server", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "IP address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "NotificationOptionPluginError": "Plugin failure", "NotificationOptionApplicationUpdateAvailable": "Application update available", "NotificationOptionApplicationUpdateInstalled": "Application update installed", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New (multiple) content added", "NotificationOptionCameraImageUploaded": "Camera image uploaded", "NotificationOptionUserLockedOut": "User locked out", "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Showing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favourites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favourite Series", - "ViewTypeTvFavoriteEpisodes": "Favourite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favourites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favourites", - "ViewTypeMusicFavoriteAlbums": "Favourite Albums", - "ViewTypeMusicFavoriteArtists": "Favourite Artists", - "ViewTypeMusicFavoriteSongs": "Favourite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/en-US.json b/Emby.Server.Implementations/Localization/Core/en-US.json index c7f8652334..51bbf341fe 100644 --- a/Emby.Server.Implementations/Localization/Core/en-US.json +++ b/Emby.Server.Implementations/Localization/Core/en-US.json @@ -1,33 +1,68 @@ { + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonUnknown": "Season Unknown", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Exit", - "LabelVisitCommunity": "Visit Community", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Browse Library", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Restart Server", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "NotificationOptionPluginError": "Plugin failure", "NotificationOptionApplicationUpdateAvailable": "Application update available", "NotificationOptionApplicationUpdateInstalled": "Application update installed", @@ -46,119 +81,16 @@ "NotificationOptionCameraImageUploaded": "Camera image uploaded", "NotificationOptionUserLockedOut": "User locked out", "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Shows", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/es-AR.json b/Emby.Server.Implementations/Localization/Core/es-AR.json index 0555aa9d9c..e4a49abf64 100644 --- a/Emby.Server.Implementations/Localization/Core/es-AR.json +++ b/Emby.Server.Implementations/Localization/Core/es-AR.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Salir", - "LabelVisitCommunity": "Visit Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentaci\u00f3n API", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Browse Library", - "LabelConfigureServer": "Configurar Emby", - "LabelRestartServer": "Reiniciar el servidor", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "NotificationOptionPluginError": "Plugin failure", "NotificationOptionApplicationUpdateAvailable": "Application update available", "NotificationOptionApplicationUpdateInstalled": "Application update installed", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "NotificationOptionCameraImageUploaded": "Camera image uploaded", "NotificationOptionUserLockedOut": "User locked out", "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/es-MX.json b/Emby.Server.Implementations/Localization/Core/es-MX.json index 630c7a0379..45cc2c69b2 100644 --- a/Emby.Server.Implementations/Localization/Core/es-MX.json +++ b/Emby.Server.Implementations/Localization/Core/es-MX.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "Por favor espere mientras la base de datos de su Servidor Emby es actualizada. {0}% completo.", + "Latest": "Recientes", + "ValueSpecialEpisodeName": "Especial - {0}", + "Inherit": "Heredar", + "Books": "Libros", + "Music": "M\u00fasica", + "Games": "Juegos", + "Photos": "Fotos", + "MixedContent": "Contenido mezclado", + "MusicVideos": "Videos musicales", + "HomeVideos": "Videos caseros", + "Playlists": "Listas de reproducci\u00f3n", + "HeaderRecordingGroups": "Grupos de Grabaciones", + "HeaderContinueWatching": "Continuar Viendo", + "HeaderFavoriteArtists": "Artistas Favoritos", + "HeaderFavoriteSongs": "Canciones Favoritas", + "HeaderAlbumArtists": "Artistas del \u00c1lbum", + "HeaderFavoriteAlbums": "\u00c1lbumes Favoritos", + "HeaderFavoriteEpisodes": "Episodios Preferidos", + "HeaderFavoriteShows": "Programas Preferidos", + "HeaderNextUp": "A Continuaci\u00f3n", + "Favorites": "Favoritos", + "Collections": "Colecciones", + "Channels": "Canales", + "Movies": "Pel\u00edculas", + "Albums": "\u00c1lbumes", + "Artists": "Artistas", + "Folders": "Carpetas", + "Songs": "Canciones", + "TvShows": "TV Shows", + "Shows": "Programas", + "Genres": "G\u00e9neros", + "NameSeasonNumber": "Temporada {0}", "AppDeviceValues": "App: {0}, Dispositivo: {1}", "UserDownloadingItemWithValues": "{0} esta descargando {1}", - "FolderTypeMixed": "Contenido mezclado", - "FolderTypeMovies": "Pel\u00edculas", - "FolderTypeMusic": "M\u00fasica", - "FolderTypeAdultVideos": "Videos para adultos", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "Videos musicales", - "FolderTypeHomeVideos": "Videos caseros", - "FolderTypeGames": "Juegos", - "FolderTypeBooks": "Libros", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Heredar", - "HeaderCastCrew": "Reparto y Personal", - "HeaderPeople": "Personas", - "ValueSpecialEpisodeName": "Especial: {0}", - "LabelChapterName": "Cap\u00edtulo {0}", - "NameSeasonNumber": "Temporada {0}", - "LabelExit": "Salir", - "LabelVisitCommunity": "Visitar la Comunidad", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentaci\u00f3n del API", - "LabelDeveloperResources": "Recursos para Desarrolladores", - "LabelBrowseLibrary": "Explorar Biblioteca", - "LabelConfigureServer": "Configurar Emby", - "LabelRestartServer": "Reiniciar el Servidor", - "CategorySync": "Sinc.", - "CategoryUser": "Usuario", - "CategorySystem": "Sistema", - "CategoryApplication": "Aplicaci\u00f3n", - "CategoryPlugin": "Complemento", + "HeaderLiveTV": "TV en Vivo", + "ChapterNameValue": "Cap\u00edtulo {0}", + "ScheduledTaskFailedWithName": "{0} fall\u00f3", + "LabelRunningTimeValue": "Duraci\u00f3n: {0}", + "ScheduledTaskStartedWithName": "{0} Iniciado", + "VersionNumber": "Versi\u00f3n {0}", + "PluginInstalledWithName": "{0} fue instalado", + "StartupEmbyServerIsLoading": "El servidor Emby esta cargando. Por favor intente de nuevo dentro de poco.", + "PluginUpdatedWithName": "{0} fue actualizado", + "PluginUninstalledWithName": "{0} fue desinstalado", + "ItemAddedWithName": "{0} fue agregado a la biblioteca", + "ItemRemovedWithName": "{0} fue removido de la biblioteca", + "LabelIpAddressValue": "Direcci\u00f3n IP: {0}", + "DeviceOnlineWithName": "{0} est\u00e1 conectado", + "UserOnlineFromDevice": "{0} est\u00e1 en l\u00ednea desde {1}", + "ProviderValue": "Proveedor: {0}", + "SubtitlesDownloadedForItem": "Subt\u00edtulos descargados para {0}", + "UserCreatedWithName": "Se ha creado el usuario {0}", + "UserPasswordChangedWithName": "Se ha cambiado la contrase\u00f1a para el usuario {0}", + "UserDeletedWithName": "Se ha eliminado el usuario {0}", + "UserConfigurationUpdatedWithName": "Se ha actualizado la configuraci\u00f3n del usuario {0}", + "MessageServerConfigurationUpdated": "Se ha actualizado la configuraci\u00f3n del servidor", + "MessageNamedServerConfigurationUpdatedWithValue": "Se ha actualizado la secci\u00f3n {0} de la configuraci\u00f3n del servidor", + "MessageApplicationUpdated": "El servidor Emby ha sido actualizado", + "FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesi\u00f3n de {0}", + "AuthenticationSucceededWithUserName": "{0} autenticado con \u00e9xito", + "UserOfflineFromDevice": "{0} se ha desconectado desde {1}", + "DeviceOfflineWithName": "{0} se ha desconectado", + "UserStartedPlayingItemWithValues": "{0} ha iniciado la reproducci\u00f3n de {1}", + "UserStoppedPlayingItemWithValues": "{0} ha detenido la reproducci\u00f3n de {1}", "NotificationOptionPluginError": "Falla de complemento", "NotificationOptionApplicationUpdateAvailable": "Actualizaci\u00f3n de aplicaci\u00f3n disponible", "NotificationOptionApplicationUpdateInstalled": "Actualizaci\u00f3n de aplicaci\u00f3n instalada", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "Falla de tarea programada", "NotificationOptionInstallationFailed": "Falla de instalaci\u00f3n", "NotificationOptionNewLibraryContent": "Nuevo contenido agregado", - "NotificationOptionNewLibraryContentMultiple": "Nuevo contenido agregado (varios)", "NotificationOptionCameraImageUploaded": "Imagen de la c\u00e1mara subida", "NotificationOptionUserLockedOut": "Usuario bloqueado", - "NotificationOptionServerRestartRequired": "Reinicio del servidor requerido", - "ViewTypePlaylists": "Listas de Reproducci\u00f3n", - "ViewTypeMovies": "Pel\u00edculas", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Juegos", - "ViewTypeMusic": "M\u00fasica", - "ViewTypeMusicGenres": "G\u00e9neros", - "ViewTypeMusicArtists": "Artistas", - "ViewTypeBoxSets": "Colecciones", - "ViewTypeChannels": "Canales", - "ViewTypeLiveTV": "TV en Vivo", - "ViewTypeLiveTvNowPlaying": "Transmiti\u00e9ndose", - "ViewTypeLatestGames": "Juegos Recientes", - "ViewTypeRecentlyPlayedGames": "Reproducido Reci\u00e9ntemente", - "ViewTypeGameFavorites": "Favoritos", - "ViewTypeGameSystems": "Sistemas de Juego", - "ViewTypeGameGenres": "G\u00e9neros", - "ViewTypeTvResume": "Continuar", - "ViewTypeTvNextUp": "A Continuaci\u00f3n", - "ViewTypeTvLatest": "Recientes", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "G\u00e9neros", - "ViewTypeTvFavoriteSeries": "Series Favoritas", - "ViewTypeTvFavoriteEpisodes": "Episodios Favoritos", - "ViewTypeMovieResume": "Continuar", - "ViewTypeMovieLatest": "Recientes", - "ViewTypeMovieMovies": "Pel\u00edculas", - "ViewTypeMovieCollections": "Colecciones", - "ViewTypeMovieFavorites": "Favoritos", - "ViewTypeMovieGenres": "G\u00e9neros", - "ViewTypeMusicLatest": "Recientes", - "ViewTypeMusicPlaylists": "Listas", - "ViewTypeMusicAlbums": "\u00c1lbumes", - "ViewTypeMusicAlbumArtists": "Artistas del \u00c1lbum", - "HeaderOtherDisplaySettings": "Configuraci\u00f3n de Pantalla", - "ViewTypeMusicSongs": "Canciones", - "ViewTypeMusicFavorites": "Favoritos", - "ViewTypeMusicFavoriteAlbums": "\u00c1lbumes Favoritos", - "ViewTypeMusicFavoriteArtists": "Artistas Favoritos", - "ViewTypeMusicFavoriteSongs": "Canciones Favoritas", - "ViewTypeFolders": "Carpetas", - "ViewTypeLiveTvRecordingGroups": "Grabaciones", - "ViewTypeLiveTvChannels": "Canales", - "ScheduledTaskFailedWithName": "{0} fall\u00f3", - "LabelRunningTimeValue": "Duraci\u00f3n: {0}", - "ScheduledTaskStartedWithName": "{0} Iniciado", - "VersionNumber": "Versi\u00f3n {0}", - "PluginInstalledWithName": "{0} fue instalado", - "PluginUpdatedWithName": "{0} fue actualizado", - "PluginUninstalledWithName": "{0} fue desinstalado", - "ItemAddedWithName": "{0} fue agregado a la biblioteca", - "ItemRemovedWithName": "{0} fue removido de la biblioteca", - "LabelIpAddressValue": "Direcci\u00f3n IP: {0}", - "DeviceOnlineWithName": "{0} est\u00e1 conectado", - "UserOnlineFromDevice": "{0} est\u00e1 en l\u00ednea desde {1}", - "ProviderValue": "Proveedor: {0}", - "SubtitlesDownloadedForItem": "Subt\u00edtulos descargados para {0}", - "UserConfigurationUpdatedWithName": "Se ha actualizado la configuraci\u00f3n del usuario {0}", - "UserCreatedWithName": "Se ha creado el usuario {0}", - "UserPasswordChangedWithName": "Se ha cambiado la contrase\u00f1a para el usuario {0}", - "UserDeletedWithName": "Se ha eliminado al usuario {0}", - "MessageServerConfigurationUpdated": "Se ha actualizado la configuraci\u00f3n del servidor", - "MessageNamedServerConfigurationUpdatedWithValue": "Se ha actualizado la secci\u00f3n {0} de la configuraci\u00f3n del servidor", - "MessageApplicationUpdated": "El servidor Emby ha sido actualizado", - "FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesi\u00f3n de {0}", - "AuthenticationSucceededWithUserName": "{0} autenticado con \u00e9xito", - "DeviceOfflineWithName": "{0} se ha desconectado", + "NotificationOptionServerRestartRequired": "Se necesita reiniciar el Servidor", "UserLockedOutWithName": "El usuario {0} ha sido bloqueado", - "UserOfflineFromDevice": "{0} se ha desconectado desde {1}", - "UserStartedPlayingItemWithValues": "{0} ha iniciado la reproducci\u00f3n de {1}", - "UserStoppedPlayingItemWithValues": "{0} ha detenido la reproducci\u00f3n de {1}", "SubtitleDownloadFailureForItem": "Fall\u00f3 la descarga de subt\u00edtulos para {0}", - "HeaderUnidentified": "No Identificado", - "HeaderImagePrimary": "Principal", - "HeaderImageBackdrop": "Imagen de Fondo", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Imagen de Usuario", - "HeaderOverview": "Resumen", - "HeaderShortOverview": "Sinopsis corta:", - "HeaderType": "Tipo", - "HeaderSeverity": "Severidad", - "HeaderUser": "Usuario", - "HeaderName": "Nombre", - "HeaderDate": "Fecha", - "HeaderPremiereDate": "Fecha de Estreno", - "HeaderDateAdded": "Fecha de Adici\u00f3n", - "HeaderReleaseDate": "Fecha de estreno", - "HeaderRuntime": "Duraci\u00f3n", - "HeaderPlayCount": "Contador", - "HeaderSeason": "Temporada", - "HeaderSeasonNumber": "N\u00famero de temporada", - "HeaderSeries": "Series:", - "HeaderNetwork": "Cadena", - "HeaderYear": "A\u00f1o:", - "HeaderYears": "A\u00f1os:", - "HeaderParentalRating": "Clasificaci\u00f3n Parental", - "HeaderCommunityRating": "Calificaci\u00f3n de la comunidad", - "HeaderTrailers": "Tr\u00e1ilers", - "HeaderSpecials": "Especiales", - "HeaderGameSystems": "Sistemas de Juego", - "HeaderPlayers": "Reproductores:", - "HeaderAlbumArtists": "Artistas del \u00c1lbum", - "HeaderAlbums": "\u00c1lbumes", - "HeaderDisc": "Disco", - "HeaderTrack": "Pista", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Im\u00e1gen embebida", - "HeaderResolution": "Resoluci\u00f3n", - "HeaderSubtitles": "Subt\u00edtulos", - "HeaderGenres": "G\u00e9neros", - "HeaderCountries": "Pa\u00edses", - "HeaderStatus": "Estado", - "HeaderTracks": "Pistas", - "HeaderMusicArtist": "Int\u00e9rprete", - "HeaderLocked": "Bloqueado", - "HeaderStudios": "Estudios", - "HeaderActor": "Actores", - "HeaderComposer": "Compositores", - "HeaderDirector": "Directores", - "HeaderGuestStar": "Estrella invitada", - "HeaderProducer": "Productores", - "HeaderWriter": "Guionistas", - "HeaderParentalRatings": "Clasificaci\u00f3n Parental", - "HeaderCommunityRatings": "Clasificaciones de la comunidad", - "StartupEmbyServerIsLoading": "El servidor Emby esta cargando. Por favor intente de nuevo dentro de poco." + "Sync": "Sinc.", + "User": "Usuario", + "System": "Sistema", + "Application": "Aplicaci\u00f3n", + "Plugin": "Complemento", + "LabelExit": "Salir", + "LabelVisitCommunity": "Visitar la Comunidad", + "LabelBrowseLibrary": "Explorar Biblioteca", + "LabelConfigureServer": "Configurar Emby", + "LabelRestartServer": "Reiniciar el Servidor" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/es.json b/Emby.Server.Implementations/Localization/Core/es.json index d1a56240dd..68975d6322 100644 --- a/Emby.Server.Implementations/Localization/Core/es.json +++ b/Emby.Server.Implementations/Localization/Core/es.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Por favor espere mientras la base de datos de su servidor Emby se actualiza. {0}% completado.", + "Latest": "\u00daltimos", + "ValueSpecialEpisodeName": "Especial - {0}", + "Inherit": "Heredar", + "Books": "Libros", + "Music": "M\u00fasica", + "Games": "Juegos", + "Photos": "Fotos", + "MixedContent": "Contenido mixto", + "MusicVideos": "Videos musicales", + "HomeVideos": "V\u00eddeos de inicio", + "Playlists": "Listas reproducci\u00f3n", + "HeaderRecordingGroups": "Grupos de grabaci\u00f3n", + "HeaderContinueWatching": "Continuar viendo", + "HeaderFavoriteArtists": "Artistas favoritos", + "HeaderFavoriteSongs": "Canciones favoritas", + "HeaderAlbumArtists": "Artistas del \u00c1lbum", + "HeaderFavoriteAlbums": "\u00c1lbumes favoritos", + "HeaderFavoriteEpisodes": "Episodios favoritos", + "HeaderFavoriteShows": "Programas favoritos", + "HeaderNextUp": "Siguiendo", + "Favorites": "Favoritos", + "Collections": "Colecciones", + "Channels": "Canales", + "Movies": "Peliculas", + "Albums": "\u00c1lbumes", + "Artists": "Artistas", + "Folders": "Carpetas", + "Songs": "Canciones", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "G\u00e9neros", + "NameSeasonNumber": "Temporada {0}", "AppDeviceValues": "Aplicaci\u00f3n: {0}, Dispositivo: {1}", "UserDownloadingItemWithValues": "{0} est\u00e1 descargando {1}", - "FolderTypeMixed": "Contenido mezclado", - "FolderTypeMovies": "Peliculas", - "FolderTypeMusic": "Musica", - "FolderTypeAdultVideos": "Videos para adultos", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "Videos Musicales", - "FolderTypeHomeVideos": "Videos caseros", - "FolderTypeGames": "Juegos", - "FolderTypeBooks": "Libros", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Heredado", - "HeaderCastCrew": "Reparto y equipo t\u00e9cnico", - "HeaderPeople": "Gente", - "ValueSpecialEpisodeName": "Especial - {0}", - "LabelChapterName": "Cap\u00edtulo {0}", - "NameSeasonNumber": "Temporada {0}", - "LabelExit": "Salir", - "LabelVisitCommunity": "Visitar la comunidad", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentaci\u00f3n API", - "LabelDeveloperResources": "Recursos del Desarrollador", - "LabelBrowseLibrary": "Navegar biblioteca", - "LabelConfigureServer": "Configurar Emby", - "LabelRestartServer": "Reiniciar el servidor", - "CategorySync": "Sincronizar", - "CategoryUser": "Usuario", - "CategorySystem": "Sistema", - "CategoryApplication": "Aplicaci\u00f3n", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Error en plugin", - "NotificationOptionApplicationUpdateAvailable": "Disponible actualizaci\u00f3n de la aplicaci\u00f3n", - "NotificationOptionApplicationUpdateInstalled": "Se ha instalado la actualizaci\u00f3n de la aplicaci\u00f3n", - "NotificationOptionPluginUpdateInstalled": "Se ha instalado la actualizaci\u00f3n del plugin", - "NotificationOptionPluginInstalled": "Plugin instalado", - "NotificationOptionPluginUninstalled": "Plugin desinstalado", - "NotificationOptionVideoPlayback": "Reproduccion de video a iniciado", - "NotificationOptionAudioPlayback": "Reproduccion de audio a iniciado", - "NotificationOptionGamePlayback": "Reproduccion de video juego a iniciado", - "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3n de video detenida", - "NotificationOptionAudioPlaybackStopped": "Reproducci\u00f3n de audio detenida", - "NotificationOptionGamePlaybackStopped": "Reproducci\u00f3n de juego detenida", - "NotificationOptionTaskFailed": "La tarea programada ha fallado", - "NotificationOptionInstallationFailed": "Fallo en la instalaci\u00f3n", - "NotificationOptionNewLibraryContent": "Nuevo contenido a\u00f1adido", - "NotificationOptionNewLibraryContentMultiple": "Nuevo contenido a\u00f1adido (multiple)", - "NotificationOptionCameraImageUploaded": "Imagen de camara se a carcado", - "NotificationOptionUserLockedOut": "Usuario bloqueado", - "NotificationOptionServerRestartRequired": "Se requiere el reinicio del servidor", - "ViewTypePlaylists": "Listas de reproducci\u00f3n", - "ViewTypeMovies": "Pel\u00edculas", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Juegos", - "ViewTypeMusic": "M\u00fasica", - "ViewTypeMusicGenres": "G\u00e9neros", - "ViewTypeMusicArtists": "Artistas", - "ViewTypeBoxSets": "Colecciones", - "ViewTypeChannels": "Canales", - "ViewTypeLiveTV": "Tv en vivo", - "ViewTypeLiveTvNowPlaying": "Transmiti\u00e9ndose ahora", - "ViewTypeLatestGames": "\u00daltimos juegos", - "ViewTypeRecentlyPlayedGames": "Reproducido recientemente", - "ViewTypeGameFavorites": "Favoritos", - "ViewTypeGameSystems": "Sistemas de juego", - "ViewTypeGameGenres": "G\u00e9neros", - "ViewTypeTvResume": "Reanudar", - "ViewTypeTvNextUp": "Pr\u00f3ximamente", - "ViewTypeTvLatest": "\u00daltimas", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "G\u00e9neros", - "ViewTypeTvFavoriteSeries": "Series favoritas", - "ViewTypeTvFavoriteEpisodes": "Episodios favoritos", - "ViewTypeMovieResume": "Reanudar", - "ViewTypeMovieLatest": "\u00daltimas", - "ViewTypeMovieMovies": "Pel\u00edculas", - "ViewTypeMovieCollections": "Colecciones", - "ViewTypeMovieFavorites": "Favoritos", - "ViewTypeMovieGenres": "G\u00e9neros", - "ViewTypeMusicLatest": "\u00daltimas", - "ViewTypeMusicPlaylists": "Lista", - "ViewTypeMusicAlbums": "\u00c1lbumes", - "ViewTypeMusicAlbumArtists": "\u00c1lbumes de artistas", - "HeaderOtherDisplaySettings": "Configuraci\u00f3n de pantalla", - "ViewTypeMusicSongs": "Canciones", - "ViewTypeMusicFavorites": "Favoritos", - "ViewTypeMusicFavoriteAlbums": "\u00c1lbumes favoritos", - "ViewTypeMusicFavoriteArtists": "Artistas favoritos", - "ViewTypeMusicFavoriteSongs": "Canciones favoritas", - "ViewTypeFolders": "Carpetas", - "ViewTypeLiveTvRecordingGroups": "Grabaciones", - "ViewTypeLiveTvChannels": "Canales", + "HeaderLiveTV": "TV en vivo", + "ChapterNameValue": "Cap\u00edtulo {0}", "ScheduledTaskFailedWithName": "{0} fall\u00f3", - "LabelRunningTimeValue": "Tiempo de ejecuci\u00f3n: {0}", - "ScheduledTaskStartedWithName": "{0} iniciado", + "LabelRunningTimeValue": "Tiempo de funcionamiento: {0}", + "ScheduledTaskStartedWithName": "{0} iniciada", "VersionNumber": "Versi\u00f3n {0}", - "PluginInstalledWithName": "{0} ha sido instalado", - "PluginUpdatedWithName": "{0} ha sido actualizado", - "PluginUninstalledWithName": "{0} ha sido desinstalado", - "ItemAddedWithName": "{0} ha sido a\u00f1adido a la biblioteca", - "ItemRemovedWithName": "{0} se ha eliminado de la biblioteca", + "PluginInstalledWithName": "{0} se ha instalado", + "StartupEmbyServerIsLoading": "Emby Server se est\u00e1 cargando. Vuelve a intentarlo en breve.", + "PluginUpdatedWithName": "{0} se actualiz\u00f3", + "PluginUninstalledWithName": "{0} se ha desinstalado", + "ItemAddedWithName": "{0} se ha a\u00f1adido a la biblioteca", + "ItemRemovedWithName": "{0} se elimina de la biblioteca", "LabelIpAddressValue": "Direcci\u00f3n IP: {0}", "DeviceOnlineWithName": "{0} est\u00e1 conectado", - "UserOnlineFromDevice": "{0} est\u00e1 conectado desde {1}", + "UserOnlineFromDevice": "{0} est\u00e1 en l\u00ednea desde {1}", "ProviderValue": "Proveedor: {0}", - "SubtitlesDownloadedForItem": "Subt\u00edtulos descargados para {0}", - "UserConfigurationUpdatedWithName": "Se ha actualizado la configuraci\u00f3n de usuario para {0}", - "UserCreatedWithName": "Se ha creado el usuario {0}", - "UserPasswordChangedWithName": "Contrase\u00f1a cambiada al usuario {0}", - "UserDeletedWithName": "El usuario {0} ha sido eliminado", + "SubtitlesDownloadedForItem": "Descargar subt\u00edtulos para {0}", + "UserCreatedWithName": "El usuario {0} ha sido creado", + "UserPasswordChangedWithName": "Se ha cambiado la contrase\u00f1a para el usuario {0}", + "UserDeletedWithName": "El usuario {0} ha sido borrado", + "UserConfigurationUpdatedWithName": "Configuraci\u00f3n de usuario se ha actualizado para {0}", "MessageServerConfigurationUpdated": "Se ha actualizado la configuraci\u00f3n del servidor", - "MessageNamedServerConfigurationUpdatedWithValue": "Se ha actualizado la secci\u00f3n {0} de la configuraci\u00f3n del servidor", + "MessageNamedServerConfigurationUpdatedWithValue": "La secci\u00f3n de configuraci\u00f3n del servidor {0} ha sido actualizado", "MessageApplicationUpdated": "Se ha actualizado el servidor Emby", - "FailedLoginAttemptWithUserName": "Intento de inicio de sesi\u00f3n fallido desde {0}", - "AuthenticationSucceededWithUserName": "{0} se ha autenticado satisfactoriamente", - "DeviceOfflineWithName": "{0} se ha desconectado", - "UserLockedOutWithName": "El usuario {0} ha sido bloqueado", + "FailedLoginAttemptWithUserName": "Error al intentar iniciar sesi\u00f3n a partir de {0}", + "AuthenticationSucceededWithUserName": "{0} autenticado correctamente", "UserOfflineFromDevice": "{0} se ha desconectado de {1}", - "UserStartedPlayingItemWithValues": "{0} ha empezado a reproducir {1}", - "UserStoppedPlayingItemWithValues": "{0} ha parado de reproducir {1}", - "SubtitleDownloadFailureForItem": "Fallo en la descarga de subt\u00edtulos para {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "Usuario", - "HeaderName": "Nombre", - "HeaderDate": "Fecha", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subt\u00edtulos", - "HeaderGenres": "G\u00e9neros", - "HeaderCountries": "Paises", - "HeaderStatus": "Estado", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Estudios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Clasificaci\u00f3n parental", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "DeviceOfflineWithName": "{0} se ha desconectado", + "UserStartedPlayingItemWithValues": "{0} ha comenzado jugando {1}", + "UserStoppedPlayingItemWithValues": "{0} ha dejado de reproducir {1}", + "NotificationOptionPluginError": "Error en plugin", + "NotificationOptionApplicationUpdateAvailable": "Actualizaci\u00f3n de la aplicaci\u00f3n disponible", + "NotificationOptionApplicationUpdateInstalled": "Actualizaci\u00f3n de la aplicaci\u00f3n instalada", + "NotificationOptionPluginUpdateInstalled": "Actualizaci\u00f3n del complemento instalada", + "NotificationOptionPluginInstalled": "Plugin instalado", + "NotificationOptionPluginUninstalled": "Plugin desinstalado", + "NotificationOptionVideoPlayback": "Se inici\u00f3 la reproducci\u00f3n de v\u00eddeo", + "NotificationOptionAudioPlayback": "Se inici\u00f3 la reproducci\u00f3n de audio", + "NotificationOptionGamePlayback": "Se inici\u00f3 la reproducci\u00f3n del juego", + "NotificationOptionVideoPlaybackStopped": "Reproducci\u00f3n de v\u00eddeo detenida", + "NotificationOptionAudioPlaybackStopped": "Se detuvo la reproducci\u00f3n de audio", + "NotificationOptionGamePlaybackStopped": "Se detuvo la reproducci\u00f3n del juego", + "NotificationOptionTaskFailed": "Error de tarea programada", + "NotificationOptionInstallationFailed": "Error de instalaci\u00f3n", + "NotificationOptionNewLibraryContent": "Nuevo contenido a\u00f1adido", + "NotificationOptionCameraImageUploaded": "Imagen de la c\u00e1mara cargada", + "NotificationOptionUserLockedOut": "Usuario bloqueado", + "NotificationOptionServerRestartRequired": "Requiere reinicio del servidor", + "UserLockedOutWithName": "El usuario {0} ha sido bloqueado", + "SubtitleDownloadFailureForItem": "Error al descargar subt\u00edtulos para {0}", + "Sync": "Sincronizar", + "User": "Usuario", + "System": "Sistema", + "Application": "Aplicaci\u00f3n", + "Plugin": "Plugin", + "LabelExit": "Salida", + "LabelVisitCommunity": "Visita la Comunidad", + "LabelBrowseLibrary": "Navegar la biblioteca", + "LabelConfigureServer": "Configurar Emby", + "LabelRestartServer": "Configurar Emby" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/fi.json b/Emby.Server.Implementations/Localization/Core/fi.json deleted file mode 100644 index 20efa14067..0000000000 --- a/Emby.Server.Implementations/Localization/Core/fi.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Poistu", - "LabelVisitCommunity": "K\u00e4y Yhteis\u00f6ss\u00e4", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Selaa Kirjastoa", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "K\u00e4ynnist\u00e4 Palvelin uudelleen", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -} \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/fr-CA.json b/Emby.Server.Implementations/Localization/Core/fr-CA.json index 789817c843..795bc98cc5 100644 --- a/Emby.Server.Implementations/Localization/Core/fr-CA.json +++ b/Emby.Server.Implementations/Localization/Core/fr-CA.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "Veuillez patienter pendant que la base de donn\u00e9e de votre Serveur Emby se met \u00e0 jour. Termin\u00e9e \u00e0 {0}%.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Sp\u00e9cial - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continuer \u00e0 regarder", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "\u00c0 Suivre", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Quitter", - "LabelVisitCommunity": "Visiter la Communaut\u00e9", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentation de l'API", - "LabelDeveloperResources": "Ressources pour d\u00e9veloppeurs", - "LabelBrowseLibrary": "Parcourir la biblioth\u00e8que", - "LabelConfigureServer": "Configurer Emby", - "LabelRestartServer": "Red\u00e9marrer le Serveur", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "NotificationOptionPluginError": "Plugin failure", "NotificationOptionApplicationUpdateAvailable": "Application update available", "NotificationOptionApplicationUpdateInstalled": "Application update installed", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "NotificationOptionCameraImageUploaded": "Camera image uploaded", "NotificationOptionUserLockedOut": "User locked out", "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/fr.json b/Emby.Server.Implementations/Localization/Core/fr.json index 25c722989c..5ea01fcdbb 100644 --- a/Emby.Server.Implementations/Localization/Core/fr.json +++ b/Emby.Server.Implementations/Localization/Core/fr.json @@ -1,42 +1,74 @@ { - "DbUpgradeMessage": "Veuillez patienter pendant que la base de donn\u00e9e de votre Emby Serveur se met \u00e0 jour. Termin\u00e9e \u00e0 {0}%.", - "AppDeviceValues": "Application : {0}, Appareil: {1}", - "UserDownloadingItemWithValues": "{0} est en train de t\u00e9l\u00e9charger {1}", - "FolderTypeMixed": "Contenus m\u00e9lang\u00e9s", - "FolderTypeMovies": "Films", - "FolderTypeMusic": "Musique", - "FolderTypeAdultVideos": "Vid\u00e9os Adultes", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Vid\u00e9os Musical", - "FolderTypeHomeVideos": "Vid\u00e9os personnelles", - "FolderTypeGames": "Jeux", - "FolderTypeBooks": "Livres", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "H\u00e9rite", - "HeaderCastCrew": "\u00c9quipe de tournage", - "HeaderPeople": "Personnes", + "Latest": "R\u00e9cent", "ValueSpecialEpisodeName": "Sp\u00e9cial - {0}", - "LabelChapterName": "Chapitre {0}", + "Inherit": "H\u00e9riter", + "Books": "Livres", + "Music": "Musique", + "Games": "Jeux", + "Photos": "Photos", + "MixedContent": "Contenu mixte", + "MusicVideos": "Vid\u00e9os musicales", + "HomeVideos": "Vid\u00e9os personnelles", + "Playlists": "Listes de lecture", + "HeaderRecordingGroups": "Groupes d'enregistrements", + "HeaderContinueWatching": "Continuer \u00e0 regarder", + "HeaderFavoriteArtists": "Artistes favoris", + "HeaderFavoriteSongs": "Chansons favorites", + "HeaderAlbumArtists": "Artistes de l'album", + "HeaderFavoriteAlbums": "Albums favoris", + "HeaderFavoriteEpisodes": "\u00c9pisodes favoris", + "HeaderFavoriteShows": "S\u00e9ries favorites", + "HeaderNextUp": "En Cours", + "Favorites": "Favoris", + "Collections": "Collections", + "Channels": "Cha\u00eenes", + "Movies": "Films", + "Albums": "Albums", + "Artists": "Artistes", + "Folders": "Dossiers", + "Songs": "Chansons", + "TvShows": "TV Shows", + "Shows": "\u00c9missions", + "Genres": "Genres", "NameSeasonNumber": "Saison {0}", - "LabelExit": "Quitter", - "LabelVisitCommunity": "Visiter la Communaut\u00e9", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentation de l'API", - "LabelDeveloperResources": "Ressources pour d\u00e9veloppeurs", - "LabelBrowseLibrary": "Parcourir la biblioth\u00e8que", - "LabelConfigureServer": "Configurer Emby", - "LabelRestartServer": "Red\u00e9marrer le Serveur", - "CategorySync": "Sync", - "CategoryUser": "Utilisateur", - "CategorySystem": "Syst\u00e8me", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Erreur de plugin", - "NotificationOptionApplicationUpdateAvailable": "Mise \u00e0 jour d'application disponible", - "NotificationOptionApplicationUpdateInstalled": "Mise \u00e0 jour d'application install\u00e9e", - "NotificationOptionPluginUpdateInstalled": "Mise \u00e0 jour de plugin install\u00e9e", - "NotificationOptionPluginInstalled": "Plugin install\u00e9", - "NotificationOptionPluginUninstalled": "Plugin d\u00e9sinstall\u00e9", + "AppDeviceValues": "Application\u00a0: {0}, Appareil\u00a0: {1}", + "UserDownloadingItemWithValues": "{0} est en train de t\u00e9l\u00e9charger {1}", + "HeaderLiveTV": "TV en direct", + "ChapterNameValue": "Chapitre {0}", + "ScheduledTaskFailedWithName": "{0} a \u00e9chou\u00e9", + "LabelRunningTimeValue": "Dur\u00e9e\u00a0: {0}", + "ScheduledTaskStartedWithName": "{0} a commenc\u00e9", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} a \u00e9t\u00e9 install\u00e9", + "StartupEmbyServerIsLoading": "Le serveur Emby est en cours de chargement. Veuillez r\u00e9essayer dans quelques instants.", + "PluginUpdatedWithName": "{0} a \u00e9t\u00e9 mis \u00e0 jour", + "PluginUninstalledWithName": "{0} a \u00e9t\u00e9 d\u00e9sinstall\u00e9", + "ItemAddedWithName": "{0} a \u00e9t\u00e9 ajout\u00e9 \u00e0 la m\u00e9diath\u00e8que", + "ItemRemovedWithName": "{0} a \u00e9t\u00e9 supprim\u00e9 de la m\u00e9diath\u00e8que", + "LabelIpAddressValue": "Adresse IP\u00a0: {0}", + "DeviceOnlineWithName": "{0} est connect\u00e9", + "UserOnlineFromDevice": "{0} s'est connect\u00e9 depuis {1}", + "ProviderValue": "Fournisseur\u00a0: {0}", + "SubtitlesDownloadedForItem": "Les sous-titres de {0} ont \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9s", + "UserCreatedWithName": "L'utilisateur {0} a \u00e9t\u00e9 cr\u00e9\u00e9", + "UserPasswordChangedWithName": "Le mot de passe pour l'utilisateur {0} a \u00e9t\u00e9 modifi\u00e9", + "UserDeletedWithName": "L'utilisateur {0} a \u00e9t\u00e9 supprim\u00e9", + "UserConfigurationUpdatedWithName": "La configuration utilisateur de {0} a \u00e9t\u00e9 mise \u00e0 jour", + "MessageServerConfigurationUpdated": "La configuration du serveur a \u00e9t\u00e9 mise \u00e0 jour.", + "MessageNamedServerConfigurationUpdatedWithValue": "La configuration de la section {0} du serveur a \u00e9t\u00e9 mise \u00e0 jour", + "MessageApplicationUpdated": "Le serveur Emby a \u00e9t\u00e9 mis \u00e0 jour", + "FailedLoginAttemptWithUserName": "\u00c9chec d'une tentative de connexion de {0}", + "AuthenticationSucceededWithUserName": "{0} s'est authentifi\u00e9 avec succ\u00e8s", + "UserOfflineFromDevice": "{0} s'est d\u00e9connect\u00e9 depuis {1}", + "DeviceOfflineWithName": "{0} s'est d\u00e9connect\u00e9", + "UserStartedPlayingItemWithValues": "{0} vient de commencer la lecture de {1}", + "UserStoppedPlayingItemWithValues": "{0} vient d'arr\u00eater la lecture de {1}", + "NotificationOptionPluginError": "Erreur d'extension", + "NotificationOptionApplicationUpdateAvailable": "Mise \u00e0 jour de l'application disponible", + "NotificationOptionApplicationUpdateInstalled": "Mise \u00e0 jour de l'application install\u00e9e", + "NotificationOptionPluginUpdateInstalled": "Mise \u00e0 jour d'extension install\u00e9e", + "NotificationOptionPluginInstalled": "Extension install\u00e9e", + "NotificationOptionPluginUninstalled": "Extension d\u00e9sinstall\u00e9e", "NotificationOptionVideoPlayback": "Lecture vid\u00e9o d\u00e9marr\u00e9e", "NotificationOptionAudioPlayback": "Lecture audio d\u00e9marr\u00e9e", "NotificationOptionGamePlayback": "Lecture de jeu d\u00e9marr\u00e9e", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "\u00c9chec de t\u00e2che planifi\u00e9e", "NotificationOptionInstallationFailed": "\u00c9chec d'installation", "NotificationOptionNewLibraryContent": "Nouveau contenu ajout\u00e9", - "NotificationOptionNewLibraryContentMultiple": "Nouveau contenu ajout\u00e9 (multiple)", - "NotificationOptionCameraImageUploaded": "L'image de l'appareil photo a \u00e9t\u00e9 upload\u00e9e", + "NotificationOptionCameraImageUploaded": "L'image de l'appareil photo a \u00e9t\u00e9 transf\u00e9r\u00e9e", "NotificationOptionUserLockedOut": "Utilisateur verrouill\u00e9", "NotificationOptionServerRestartRequired": "Un red\u00e9marrage du serveur est requis", - "ViewTypePlaylists": "Listes de lecture", - "ViewTypeMovies": "Films", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Jeux", - "ViewTypeMusic": "Musique", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artistes", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Cha\u00eenes", - "ViewTypeLiveTV": "TV en direct", - "ViewTypeLiveTvNowPlaying": "En cours de diffusion", - "ViewTypeLatestGames": "Derniers jeux", - "ViewTypeRecentlyPlayedGames": "R\u00e9cemment jou\u00e9", - "ViewTypeGameFavorites": "Favoris", - "ViewTypeGameSystems": "Syst\u00e8me de jeu", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Reprise", - "ViewTypeTvNextUp": "A venir", - "ViewTypeTvLatest": "Derniers", - "ViewTypeTvShowSeries": "S\u00e9ries", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "S\u00e9ries favorites", - "ViewTypeTvFavoriteEpisodes": "Episodes favoris", - "ViewTypeMovieResume": "Reprise", - "ViewTypeMovieLatest": "Dernier", - "ViewTypeMovieMovies": "Films", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favoris", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Dernier", - "ViewTypeMusicPlaylists": "Listes de lectures", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Artiste de l'album", - "HeaderOtherDisplaySettings": "Param\u00e8tres d'affichage", - "ViewTypeMusicSongs": "Chansons", - "ViewTypeMusicFavorites": "Favoris", - "ViewTypeMusicFavoriteAlbums": "Albums favoris", - "ViewTypeMusicFavoriteArtists": "Artistes favoris", - "ViewTypeMusicFavoriteSongs": "Chansons favorites", - "ViewTypeFolders": "R\u00e9pertoires", - "ViewTypeLiveTvRecordingGroups": "Enregistrements", - "ViewTypeLiveTvChannels": "Cha\u00eenes", - "ScheduledTaskFailedWithName": "{0} a \u00e9chou\u00e9", - "LabelRunningTimeValue": "Dur\u00e9e: {0}", - "ScheduledTaskStartedWithName": "{0} a commenc\u00e9", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} a \u00e9t\u00e9 install\u00e9", - "PluginUpdatedWithName": "{0} a \u00e9t\u00e9 mis \u00e0 jour", - "PluginUninstalledWithName": "{0} a \u00e9t\u00e9 d\u00e9sinstall\u00e9", - "ItemAddedWithName": "{0} a \u00e9t\u00e9 ajout\u00e9 \u00e0 la biblioth\u00e8que", - "ItemRemovedWithName": "{0} a \u00e9t\u00e9 supprim\u00e9 de la biblioth\u00e8que", - "LabelIpAddressValue": "Adresse IP: {0}", - "DeviceOnlineWithName": "{0} est connect\u00e9", - "UserOnlineFromDevice": "{0} s'est connect\u00e9 depuis {1}", - "ProviderValue": "Fournisseur : {0}", - "SubtitlesDownloadedForItem": "Les sous-titres de {0} ont \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9s", - "UserConfigurationUpdatedWithName": "La configuration utilisateur de {0} a \u00e9t\u00e9 mise \u00e0 jour", - "UserCreatedWithName": "L'utilisateur {0} a \u00e9t\u00e9 cr\u00e9\u00e9.", - "UserPasswordChangedWithName": "Le mot de passe pour l'utilisateur {0} a \u00e9t\u00e9 modifi\u00e9.", - "UserDeletedWithName": "L'utilisateur {0} a \u00e9t\u00e9 supprim\u00e9.", - "MessageServerConfigurationUpdated": "La configuration du serveur a \u00e9t\u00e9 mise \u00e0 jour.", - "MessageNamedServerConfigurationUpdatedWithValue": "La configuration de la section {0} du serveur a \u00e9t\u00e9 mise \u00e0 jour.", - "MessageApplicationUpdated": "Le serveur Emby a \u00e9t\u00e9 mis \u00e0 jour", - "FailedLoginAttemptWithUserName": "Echec d'une tentative de connexion de {0}", - "AuthenticationSucceededWithUserName": "{0} s'est authentifi\u00e9 avec succ\u00e8s", - "DeviceOfflineWithName": "{0} s'est d\u00e9connect\u00e9", "UserLockedOutWithName": "L'utilisateur {0} a \u00e9t\u00e9 verrouill\u00e9", - "UserOfflineFromDevice": "{0} s'est d\u00e9connect\u00e9 depuis {1}", - "UserStartedPlayingItemWithValues": "{0} vient de commencer la lecture de {1}", - "UserStoppedPlayingItemWithValues": "{0} vient d'arr\u00eater la lecture de {1}", "SubtitleDownloadFailureForItem": "Le t\u00e9l\u00e9chargement des sous-titres pour {0} a \u00e9chou\u00e9.", - "HeaderUnidentified": "Non identifi\u00e9", - "HeaderImagePrimary": "Primaire", - "HeaderImageBackdrop": "Contexte", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Avatar de l'utilisateur", - "HeaderOverview": "Aper\u00e7u", - "HeaderShortOverview": "Synopsys", - "HeaderType": "Type", - "HeaderSeverity": "S\u00e9v\u00e9rit\u00e9", - "HeaderUser": "Utilisateur", - "HeaderName": "Nom", - "HeaderDate": "Date", - "HeaderPremiereDate": "Date de la Premi\u00e8re", - "HeaderDateAdded": "Date d'ajout", - "HeaderReleaseDate": "Date de sortie ", - "HeaderRuntime": "Dur\u00e9e", - "HeaderPlayCount": "Nombre de lectures", - "HeaderSeason": "Saison", - "HeaderSeasonNumber": "Num\u00e9ro de saison", - "HeaderSeries": "S\u00e9ries :", - "HeaderNetwork": "R\u00e9seau", - "HeaderYear": "Ann\u00e9e :", - "HeaderYears": "Ann\u00e9es :", - "HeaderParentalRating": "Classification parentale", - "HeaderCommunityRating": "Note de la communaut\u00e9", - "HeaderTrailers": "Bandes-annonces", - "HeaderSpecials": "Episodes sp\u00e9ciaux", - "HeaderGameSystems": "Plateformes de jeu", - "HeaderPlayers": "Lecteurs :", - "HeaderAlbumArtists": "Artistes sur l'album", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disque", - "HeaderTrack": "Piste", - "HeaderAudio": "Audio", - "HeaderVideo": "Vid\u00e9o", - "HeaderEmbeddedImage": "Image int\u00e9gr\u00e9e", - "HeaderResolution": "R\u00e9solution", - "HeaderSubtitles": "Sous-titres", - "HeaderGenres": "Genres", - "HeaderCountries": "Pays", - "HeaderStatus": "\u00c9tat", - "HeaderTracks": "Pistes", - "HeaderMusicArtist": "Artiste de l'album", - "HeaderLocked": "Verrouill\u00e9", - "HeaderStudios": "Studios", - "HeaderActor": "Acteurs", - "HeaderComposer": "Compositeurs", - "HeaderDirector": "R\u00e9alisateurs", - "HeaderGuestStar": "R\u00f4le principal", - "HeaderProducer": "Producteurs", - "HeaderWriter": "Auteur(e)s", - "HeaderParentalRatings": "Note parentale", - "HeaderCommunityRatings": "Classification de la communaut\u00e9", - "StartupEmbyServerIsLoading": "Le serveur Emby est en cours de chargement. Veuillez r\u00e9essayer dans quelques instant." + "Sync": "Synchroniser", + "User": "Utilisateur", + "System": "Syst\u00e8me", + "Application": "Application", + "Plugin": "Extension", + "LabelExit": "Quitter", + "LabelVisitCommunity": "Visiter la communaut\u00e9", + "LabelBrowseLibrary": "Parcourir la m\u00e9diath\u00e8que", + "LabelConfigureServer": "Configurer Emby", + "LabelRestartServer": "Red\u00e9marrer le serveur" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/gsw.json b/Emby.Server.Implementations/Localization/Core/gsw.json deleted file mode 100644 index 88af82b7e4..0000000000 --- a/Emby.Server.Implementations/Localization/Core/gsw.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Verschiedeni Sache", - "FolderTypeMovies": "Film", - "FolderTypeMusic": "Musig", - "FolderTypeAdultVideos": "Erwachseni Film", - "FolderTypePhotos": "F\u00f6teli", - "FolderTypeMusicVideos": "Musigvideos", - "FolderTypeHomeVideos": "Heimvideos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "B\u00fcecher", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "erbf\u00e4hig", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Verlasse", - "LabelVisitCommunity": "Bsuech d'Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "API Dokumentatione", - "LabelDeveloperResources": "Entwickler Ressurce", - "LabelBrowseLibrary": "Dursuech d'Bibliothek", - "LabelConfigureServer": "Konfigurier Emby", - "LabelRestartServer": "Server neustarte", - "CategorySync": "Synchronisierig", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -} \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/he.json b/Emby.Server.Implementations/Localization/Core/he.json index 137b455441..f287dc4222 100644 --- a/Emby.Server.Implementations/Localization/Core/he.json +++ b/Emby.Server.Implementations/Localization/Core/he.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "\u05de\u05d9\u05d5\u05d7\u05d3- {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "\u05e1\u05e8\u05d8\u05d9\u05dd", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "\u05d6'\u05d0\u05e0\u05e8\u05d9\u05dd", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\u05ea\u05d5\u05db\u05df \u05de\u05e2\u05d5\u05e8\u05d1", - "FolderTypeMovies": "\u05e1\u05e8\u05d8\u05d9\u05dd", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "\u05d8\u05dc\u05d5\u05d9\u05d6\u05d9\u05d4", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "\u05e9\u05d7\u05e7\u05e0\u05d9\u05dd \u05d5\u05e6\u05d5\u05d5\u05ea", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "\u05d9\u05e6\u05d9\u05d0\u05d4", - "LabelVisitCommunity": "\u05d1\u05e7\u05e8 \u05d1\u05e7\u05d4\u05d9\u05dc\u05d4", - "LabelGithub": "Github", - "LabelApiDocumentation": "\u05ea\u05d9\u05e2\u05d5\u05d3 API", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "\u05d3\u05e4\u05d3\u05e3 \u05d1\u05e1\u05e4\u05e8\u05d9\u05d4", - "LabelConfigureServer": "\u05e7\u05d1\u05e2 \u05ea\u05e6\u05d5\u05e8\u05ea Emby", - "LabelRestartServer": "\u05d0\u05ea\u05d7\u05dc \u05d0\u05ea \u05d4\u05e9\u05e8\u05ea", - "CategorySync": "\u05e1\u05e0\u05db\u05e8\u05df", - "CategoryUser": "\u05de\u05e9\u05ea\u05de\u05e9", - "CategorySystem": "\u05de\u05e2\u05e8\u05db\u05ea", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "\u05ea\u05e7\u05dc\u05d4 \u05d1\u05ea\u05d5\u05e1\u05e3", - "NotificationOptionApplicationUpdateAvailable": "\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05d5\u05db\u05de\u05d4 \u05e7\u05d9\u05d9\u05dd", - "NotificationOptionApplicationUpdateInstalled": "\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05d5\u05db\u05e0\u05d4 \u05d4\u05d5\u05ea\u05e7\u05df", - "NotificationOptionPluginUpdateInstalled": "\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05d5\u05e1\u05e3 \u05d4\u05d5\u05ea\u05e7\u05df", - "NotificationOptionPluginInstalled": "\u05ea\u05d5\u05e1\u05e3 \u05d4\u05d5\u05ea\u05e7\u05df", - "NotificationOptionPluginUninstalled": "\u05ea\u05d5\u05e1\u05e3 \u05d4\u05d5\u05e1\u05e8", - "NotificationOptionVideoPlayback": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d4\u05d7\u05dc\u05d4", - "NotificationOptionAudioPlayback": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05e6\u05dc\u05d9\u05dc \u05d4\u05d7\u05dc\u05d4", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4", - "NotificationOptionAudioPlaybackStopped": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05e6\u05dc\u05d9\u05dc \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "\u05de\u05e9\u05d9\u05de\u05d4 \u05de\u05ea\u05d5\u05d6\u05de\u05e0\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", - "NotificationOptionInstallationFailed": "\u05d4\u05ea\u05e7\u05e0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4", - "NotificationOptionNewLibraryContent": "\u05ea\u05d5\u05db\u05df \u05d7\u05d3\u05e9 \u05e0\u05d5\u05e1\u05e3", - "NotificationOptionNewLibraryContentMultiple": "\u05d4\u05ea\u05d5\u05d5\u05e1\u05e4\u05d5 \u05ea\u05db\u05e0\u05d9\u05dd \u05d7\u05d3\u05e9\u05d9\u05dd", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "\u05e0\u05d3\u05e8\u05e9\u05ea \u05d4\u05e4\u05e2\u05dc\u05d4 \u05de\u05d7\u05d3\u05e9 \u05e9\u05dc \u05d4\u05e9\u05e8\u05ea", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "\u05e1\u05e8\u05d8\u05d9\u05dd", - "ViewTypeTvShows": "\u05d8\u05dc\u05d5\u05d9\u05d6\u05d9\u05d4", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "\u05e1\u05e8\u05d8\u05d9\u05dd", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "\u05d2\u05d9\u05e8\u05e1\u05d0 {0}", + "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "\u05e9\u05dd", - "HeaderDate": "\u05ea\u05d0\u05e8\u05d9\u05da", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "\u05ea\u05d0\u05e8\u05d9\u05da \u05d4\u05d5\u05e1\u05e4\u05d4", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "\u05e1\u05d3\u05e8\u05d4", - "HeaderNetwork": "Network", - "HeaderYear": "\u05e9\u05e0\u05d4", - "HeaderYears": "\u05e9\u05e0\u05d9\u05dd", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "\u05de\u05e6\u05d1", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "\u05e9\u05d7\u05e7\u05e0\u05d9\u05dd", - "HeaderComposer": "\u05de\u05dc\u05d7\u05d9\u05e0\u05d9\u05dd", - "HeaderDirector": "\u05d1\u05de\u05d0\u05d9\u05dd", - "HeaderGuestStar": "\u05d0\u05de\u05df \u05d0\u05d5\u05e8\u05d7", - "HeaderProducer": "\u05de\u05e4\u05d9\u05e7\u05d9\u05dd", - "HeaderWriter": "\u05db\u05d5\u05ea\u05d1\u05d9\u05dd", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "\u05e1\u05e0\u05db\u05e8\u05df", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/hr.json b/Emby.Server.Implementations/Localization/Core/hr.json index 7a94dc32b7..143e3ab820 100644 --- a/Emby.Server.Implementations/Localization/Core/hr.json +++ b/Emby.Server.Implementations/Localization/Core/hr.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Glumci i ekipa", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Izlaz", - "LabelVisitCommunity": "Posjeti zajednicu", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Pregledaj biblioteku", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Restartiraj Server", - "CategorySync": "Sync", - "CategoryUser": "Korisnik", - "CategorySystem": "Sistem", - "CategoryApplication": "Aplikacija", - "CategoryPlugin": "Dodatak", + "Latest": "Najnovije", + "ValueSpecialEpisodeName": "Specijal - {0}", + "Inherit": "Naslijedi", + "Books": "Knjige", + "Music": "Glazba", + "Games": "Igre", + "Photos": "Slike", + "MixedContent": "Mije\u0161ani sadr\u017eaj", + "MusicVideos": "Glazbeni spotovi", + "HomeVideos": "Ku\u0107ni videi", + "Playlists": "Popisi", + "HeaderRecordingGroups": "Grupa snimka", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Omiljeni izvo\u0111a\u010di", + "HeaderFavoriteSongs": "Omiljene pjesme", + "HeaderAlbumArtists": "Izvo\u0111a\u010di albuma", + "HeaderFavoriteAlbums": "Omiljeni albumi", + "HeaderFavoriteEpisodes": "Omiljene epizode", + "HeaderFavoriteShows": "Omiljene emisije", + "HeaderNextUp": "Sljede\u0107e je", + "Favorites": "Omiljeni", + "Collections": "Kolekcije", + "Channels": "Kanali", + "Movies": "Filmovi", + "Albums": "Albumi", + "Artists": "Izvo\u0111a\u010di", + "Folders": "Mape", + "Songs": "Pjesme", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "\u017danrovi", + "NameSeasonNumber": "Sezona {0}", + "AppDeviceValues": "Aplikacija: {0}, Ure\u0111aj: {1}", + "UserDownloadingItemWithValues": "{0} se preuzima {1}", + "HeaderLiveTV": "TV u\u017eivo", + "ChapterNameValue": "Poglavlje {0}", + "ScheduledTaskFailedWithName": "{0} neuspjelo", + "LabelRunningTimeValue": "Vrijeme rada: {0}", + "ScheduledTaskStartedWithName": "{0} pokrenuto", + "VersionNumber": "Verzija {0}", + "PluginInstalledWithName": "{0} je instalirano", + "StartupEmbyServerIsLoading": "Emby Server se u\u010ditava. Poku\u0161ajte ponovo kasnije.", + "PluginUpdatedWithName": "{0} je a\u017eurirano", + "PluginUninstalledWithName": "{0} je deinstalirano", + "ItemAddedWithName": "{0} je dodano u biblioteku", + "ItemRemovedWithName": "{0} je uklonjen iz biblioteke", + "LabelIpAddressValue": "Ip adresa: {0}", + "DeviceOnlineWithName": "{0} je spojeno", + "UserOnlineFromDevice": "{0} je online od {1}", + "ProviderValue": "Pru\u017eitelj: {0}", + "SubtitlesDownloadedForItem": "Titlovi prijevoda preuzeti za {0}", + "UserCreatedWithName": "Korisnik {0} je stvoren", + "UserPasswordChangedWithName": "Lozinka je promijenjena za korisnika {0}", + "UserDeletedWithName": "Korisnik {0} je obrisan", + "UserConfigurationUpdatedWithName": "Postavke korisnika su a\u017eurirane za {0}", + "MessageServerConfigurationUpdated": "Postavke servera su a\u017eurirane", + "MessageNamedServerConfigurationUpdatedWithValue": "Odjeljak postavka servera {0} je a\u017euriran", + "MessageApplicationUpdated": "Emby Server je a\u017euriran", + "FailedLoginAttemptWithUserName": "Neuspjeli poku\u0161aj prijave za {0}", + "AuthenticationSucceededWithUserName": "{0} uspje\u0161no ovjerena", + "UserOfflineFromDevice": "{0} se odspojilo od {1}", + "DeviceOfflineWithName": "{0} se odspojilo", + "UserStartedPlayingItemWithValues": "{0} je pokrenuo {1}", + "UserStoppedPlayingItemWithValues": "{0} je zaustavio {1}", "NotificationOptionPluginError": "Dodatak otkazao", "NotificationOptionApplicationUpdateAvailable": "Dostupno a\u017euriranje aplikacije", "NotificationOptionApplicationUpdateInstalled": "Instalirano a\u017euriranje aplikacije", @@ -40,139 +72,25 @@ "NotificationOptionVideoPlayback": "Reprodukcija videa zapo\u010deta", "NotificationOptionAudioPlayback": "Reprodukcija glazbe zapo\u010deta", "NotificationOptionGamePlayback": "Igrica pokrenuta", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionVideoPlaybackStopped": "Reprodukcija videozapisa je zaustavljena", + "NotificationOptionAudioPlaybackStopped": "Reprodukcija audiozapisa je zaustavljena", + "NotificationOptionGamePlaybackStopped": "Reprodukcija igre je zaustavljena", "NotificationOptionTaskFailed": "Zakazan zadatak nije izvr\u0161en", "NotificationOptionInstallationFailed": "Instalacija nije izvr\u0161ena", - "NotificationOptionNewLibraryContent": "Novi sadr\u017eaj dodan", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionNewLibraryContent": "Novi sadr\u017eaj je dodan", + "NotificationOptionCameraImageUploaded": "Slike kamere preuzete", + "NotificationOptionUserLockedOut": "Korisnik zaklju\u010dan", "NotificationOptionServerRestartRequired": "Potrebno ponovo pokretanje servera", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Verzija {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Ime", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "UserLockedOutWithName": "Korisnik {0} je zaklju\u010dan", + "SubtitleDownloadFailureForItem": "Titlovi prijevoda nisu preuzeti za {0}", + "Sync": "Sink.", + "User": "Korisnik", + "System": "Sistem", + "Application": "Aplikacija", + "Plugin": "Dodatak", + "LabelExit": "Izlaz", + "LabelVisitCommunity": "Posjeti zajednicu", + "LabelBrowseLibrary": "Pregledaj biblioteku", + "LabelConfigureServer": "Podesi Emby", + "LabelRestartServer": "Restartiraj Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/hu.json b/Emby.Server.Implementations/Localization/Core/hu.json index 2b9d28d8c0..80160966ff 100644 --- a/Emby.Server.Implementations/Localization/Core/hu.json +++ b/Emby.Server.Implementations/Localization/Core/hu.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "K\u00e9rlek v\u00e1rj, m\u00edg az Emby Szerver adatb\u00e1zis friss\u00fcl. {0}% k\u00e9sz.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Vegyes tartalom", - "FolderTypeMovies": "Filmek", - "FolderTypeMusic": "Zen\u00e9k", - "FolderTypeAdultVideos": "Feln\u0151tt vide\u00f3k", - "FolderTypePhotos": "F\u00e9nyk\u00e9pek", - "FolderTypeMusicVideos": "Zenei vide\u00f3k", - "FolderTypeHomeVideos": "H\u00e1zi vide\u00f3k", - "FolderTypeGames": "J\u00e1t\u00e9kok", - "FolderTypeBooks": "K\u00f6nyvek", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Szerepl\u0151k & R\u00e9sztvev\u0151k", - "HeaderPeople": "Emberek", - "ValueSpecialEpisodeName": "K\u00fcl\u00f6nleges - {0}", - "LabelChapterName": "Fejezet {0}", - "NameSeasonNumber": "\u00c9vad {0}", - "LabelExit": "Kil\u00e9p\u00e9s", - "LabelVisitCommunity": "K\u00f6z\u00f6ss\u00e9g", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api dokument\u00e1ci\u00f3", - "LabelDeveloperResources": "Fejleszt\u0151i eszk\u00f6z\u00f6k", - "LabelBrowseLibrary": "M\u00e9diat\u00e1r tall\u00f3z\u00e1sa", - "LabelConfigureServer": "Emby konfigur\u00e1l\u00e1sa", - "LabelRestartServer": "Szerver \u00fajraindit\u00e1sa", - "CategorySync": "Sync", - "CategoryUser": "Felhaszn\u00e1l\u00f3", - "CategorySystem": "Rendszer", - "CategoryApplication": "Alkalmaz\u00e1s", - "CategoryPlugin": "B\u0151v\u00edtm\u00e9ny", + "Latest": "Leg\u00fajabb", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Vet\u00edt\u00e9s(ek) folytat\u00e1sa", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Kedvenc Epiz\u00f3dok", + "HeaderFavoriteShows": "Kedvenc M\u0171sorok", + "HeaderNextUp": "K\u00f6vetkezik", + "Favorites": "Favorites", + "Collections": "Gy\u0171jtem\u00e9nyek", + "Channels": "Csatorn\u00e1k", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "M\u0171fajok", + "NameSeasonNumber": "Season {0}", + "AppDeviceValues": "Program: {0}, Eszk\u00f6z: {1}", + "UserDownloadingItemWithValues": "{0} let\u00f6lti {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Jelenet {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} telep\u00edtve", + "StartupEmbyServerIsLoading": "Emby Szerver bet\u00f6lt\u0151dik. K\u00e9rj\u00fck, pr\u00f3b\u00e1ld meg \u00fajra k\u00e9s\u0151bb.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} elt\u00e1vol\u00edtva", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Szerver konfigur\u00e1ci\u00f3 friss\u00fclt", + "MessageNamedServerConfigurationUpdatedWithValue": "Szerver konfigur\u00e1ci\u00f3s r\u00e9sz {0} friss\u00edtve", + "MessageApplicationUpdated": "Emby Szerver friss\u00edtve", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} kijelentkezett innen {1}", + "DeviceOfflineWithName": "{0} kijelentkezett", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "NotificationOptionPluginError": "B\u0151v\u00edtm\u00e9ny hiba", "NotificationOptionApplicationUpdateAvailable": "Friss\u00edt\u00e9s el\u00e9rhet\u0151", "NotificationOptionApplicationUpdateInstalled": "Program friss\u00edt\u00e9s telep\u00edtve", "NotificationOptionPluginUpdateInstalled": "B\u0151v\u00edtm\u00e9ny friss\u00edt\u00e9s telep\u00edtve", "NotificationOptionPluginInstalled": "B\u0151v\u00edtm\u00e9ny telep\u00edtve", "NotificationOptionPluginUninstalled": "B\u0151v\u00edtm\u00e9ny elt\u00e1vol\u00edtva", - "NotificationOptionVideoPlayback": "Vide\u00f3 elind\u00edtva", - "NotificationOptionAudioPlayback": "Zene elind\u00edtva", - "NotificationOptionGamePlayback": "J\u00e1t\u00e9k elind\u00edtva", - "NotificationOptionVideoPlaybackStopped": "Vide\u00f3 meg\u00e1ll\u00edtva", - "NotificationOptionAudioPlaybackStopped": "Zene meg\u00e1ll\u00edtva", - "NotificationOptionGamePlaybackStopped": "J\u00e1t\u00e9k meg\u00e1ll\u00edtva", + "NotificationOptionVideoPlayback": "Vide\u00f3 lej\u00e1tsz\u00e1s elkezdve", + "NotificationOptionAudioPlayback": "Audi\u00f3 lej\u00e1tsz\u00e1s elkezdve", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Vide\u00f3 lej\u00e1tsz\u00e1s befejezve", + "NotificationOptionAudioPlaybackStopped": "Audi\u00f3 lej\u00e1tsz\u00e1s befejezve", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Telep\u00edt\u00e9si hiba", "NotificationOptionNewLibraryContent": "\u00daj tartalom hozz\u00e1adva", - "NotificationOptionNewLibraryContentMultiple": "\u00daj tartalom hozz\u00e1adva (t\u00f6bbsz\u00f6r\u00f6s)", "NotificationOptionCameraImageUploaded": "Kamera k\u00e9p felt\u00f6ltve", "NotificationOptionUserLockedOut": "Felhaszn\u00e1l\u00f3 tiltva", - "NotificationOptionServerRestartRequired": "\u00dajraind\u00edt\u00e1s sz\u00fcks\u00e9ges", - "ViewTypePlaylists": "Lej\u00e1tsz\u00e1si list\u00e1k", - "ViewTypeMovies": "Filmek", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "J\u00e1t\u00e9kok", - "ViewTypeMusic": "Zene", - "ViewTypeMusicGenres": "M\u0171fajok", - "ViewTypeMusicArtists": "M\u0171v\u00e9szek", - "ViewTypeBoxSets": "Gy\u0171jtem\u00e9nyek", - "ViewTypeChannels": "Csatorn\u00e1k", - "ViewTypeLiveTV": "\u00c9l\u0151 TV", - "ViewTypeLiveTvNowPlaying": "Most J\u00e1tszott", - "ViewTypeLatestGames": "Leg\u00fajabb J\u00e1t\u00e9kok", - "ViewTypeRecentlyPlayedGames": "Legut\u00f3bb J\u00e1tszott", - "ViewTypeGameFavorites": "Kedvencek", - "ViewTypeGameSystems": "J\u00e1t\u00e9k Rendszer", - "ViewTypeGameGenres": "M\u0171fajok", - "ViewTypeTvResume": "Folytat\u00e1s", - "ViewTypeTvNextUp": "K\u00f6vetkez\u0151", - "ViewTypeTvLatest": "Leg\u00fajabb", - "ViewTypeTvShowSeries": "Sorozat", - "ViewTypeTvGenres": "M\u0171fajok", - "ViewTypeTvFavoriteSeries": "Kedvenc Sorozat", - "ViewTypeTvFavoriteEpisodes": "Kedvenc R\u00e9szek", - "ViewTypeMovieResume": "Folytat\u00e1s", - "ViewTypeMovieLatest": "Leg\u00fajabb", - "ViewTypeMovieMovies": "Filmek", - "ViewTypeMovieCollections": "Gy\u0171jtem\u00e9nyek", - "ViewTypeMovieFavorites": "Kedvencek", - "ViewTypeMovieGenres": "M\u0171fajok", - "ViewTypeMusicLatest": "Leg\u00fajabb", - "ViewTypeMusicPlaylists": "Lej\u00e1tsz\u00e1si list\u00e1k", - "ViewTypeMusicAlbums": "Albumok", - "ViewTypeMusicAlbumArtists": "Album El\u0151ad\u00f3k", - "HeaderOtherDisplaySettings": "Megjelen\u00edt\u00e9si Be\u00e1ll\u00edt\u00e1sok", - "ViewTypeMusicSongs": "Dalok", - "ViewTypeMusicFavorites": "Kedvencek", - "ViewTypeMusicFavoriteAlbums": "Kedvenc Albumok", - "ViewTypeMusicFavoriteArtists": "Kedvenc M\u0171v\u00e9szek", - "ViewTypeMusicFavoriteSongs": "Kedvenc Dalok", - "ViewTypeFolders": "K\u00f6nyvt\u00e1rak", - "ViewTypeLiveTvRecordingGroups": "Felv\u00e9telek", - "ViewTypeLiveTvChannels": "Csatorn\u00e1k", - "ScheduledTaskFailedWithName": "{0} hiba", - "LabelRunningTimeValue": "Fut\u00e1si id\u0151: {0}", - "ScheduledTaskStartedWithName": "{0} elkezdve", - "VersionNumber": "Verzi\u00f3 {0}", - "PluginInstalledWithName": "{0} telep\u00edtve", - "PluginUpdatedWithName": "{0} friss\u00edtve", - "PluginUninstalledWithName": "{0} elt\u00e1vol\u00edtva", - "ItemAddedWithName": "{0} k\u00f6nyvt\u00e1rhoz adva", - "ItemRemovedWithName": "{0} t\u00f6r\u00f6lve a k\u00f6nyvt\u00e1rb\u00f3l", - "LabelIpAddressValue": "Ip c\u00edm: {0}", - "DeviceOnlineWithName": "{0} kapcsol\u00f3dva", - "UserOnlineFromDevice": "{0} akt\u00edv err\u0151l {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Felirat let\u00f6lt\u00e9se ehhez {0}", - "UserConfigurationUpdatedWithName": "A k\u00f6vetkez\u0151 felhaszn\u00e1l\u00f3 be\u00e1ll\u00edt\u00e1sai friss\u00edtve {0}", - "UserCreatedWithName": "Felhaszn\u00e1l\u00f3 {0} l\u00e9trehozva", - "UserPasswordChangedWithName": "Jelsz\u00f3 m\u00f3dos\u00edtva ennek a felhaszn\u00e1l\u00f3nak {0}", - "UserDeletedWithName": "Felhaszn\u00e1l\u00f3 {0} t\u00f6r\u00f6lve", - "MessageServerConfigurationUpdated": "Szerver be\u00e1ll\u00edt\u00e1sok friss\u00edtve", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server friss\u00edtve", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} sz\u00e9tkapcsolt", - "UserLockedOutWithName": "A k\u00f6vetkez\u0151 felhaszn\u00e1l\u00f3 tiltva {0}", - "UserOfflineFromDevice": "{0} kil\u00e9pett innen {1}", - "UserStartedPlayingItemWithValues": "{0} megkezdte j\u00e1tszani a(z) {1}", - "UserStoppedPlayingItemWithValues": "{0} befejezte a(z) {1}", - "SubtitleDownloadFailureForItem": "Nem siker\u00fcl a felirat let\u00f6lt\u00e9s ehhez {0}", - "HeaderUnidentified": "Azonos\u00edtatlan", - "HeaderImagePrimary": "Els\u0151dleges", - "HeaderImageBackdrop": "H\u00e1tt\u00e9r", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Felhaszn\u00e1l\u00f3 K\u00e9p", - "HeaderOverview": "\u00c1ttekint\u00e9s", - "HeaderShortOverview": "R\u00f6vid \u00c1ttekint\u00e9s", - "HeaderType": "T\u00edpus", - "HeaderSeverity": "Severity", - "HeaderUser": "Felhaszn\u00e1l\u00f3", - "HeaderName": "N\u00e9v", - "HeaderDate": "D\u00e1tum", - "HeaderPremiereDate": "Megjelen\u00e9s D\u00e1tuma", - "HeaderDateAdded": "Hozz\u00e1adva", - "HeaderReleaseDate": "Megjelen\u00e9s d\u00e1tuma", - "HeaderRuntime": "J\u00e1t\u00e9kid\u0151", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "\u00c9vad", - "HeaderSeasonNumber": "\u00c9vad sz\u00e1ma", - "HeaderSeries": "Sorozatok:", - "HeaderNetwork": "H\u00e1l\u00f3zat", - "HeaderYear": "\u00c9v:", - "HeaderYears": "\u00c9v:", - "HeaderParentalRating": "Korhat\u00e1r besorol\u00e1s", - "HeaderCommunityRating": "K\u00f6z\u00f6ss\u00e9gi \u00e9rt\u00e9kel\u00e9s", - "HeaderTrailers": "El\u0151zetesek", - "HeaderSpecials": "Speci\u00e1lis", - "HeaderGameSystems": "J\u00e1t\u00e9k Rendszer", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albumok", - "HeaderDisc": "Lemez", - "HeaderTrack": "S\u00e1v", - "HeaderAudio": "Audi\u00f3", - "HeaderVideo": "Vide\u00f3", - "HeaderEmbeddedImage": "Be\u00e1gyazott k\u00e9p", - "HeaderResolution": "Felbont\u00e1s", - "HeaderSubtitles": "Feliratok", - "HeaderGenres": "M\u0171fajok", - "HeaderCountries": "Orsz\u00e1gok", - "HeaderStatus": "\u00c1llapot", - "HeaderTracks": "S\u00e1vok", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Z\u00e1rt", - "HeaderStudios": "St\u00fadi\u00f3k", - "HeaderActor": "Sz\u00edn\u00e9szek", - "HeaderComposer": "Zeneszerz\u0151k", - "HeaderDirector": "Rendez\u0151k", - "HeaderGuestStar": "Vend\u00e9g szt\u00e1r", - "HeaderProducer": "Producerek", - "HeaderWriter": "\u00cdr\u00f3k", - "HeaderParentalRatings": "Korhat\u00e1r besorol\u00e1s", - "HeaderCommunityRatings": "K\u00f6z\u00f6ss\u00e9gi \u00e9rt\u00e9kel\u00e9sek", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "NotificationOptionServerRestartRequired": "Szerver \u00fajraind\u00edt\u00e1s sz\u00fcks\u00e9ges", + "UserLockedOutWithName": "User {0} has been locked out", + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "Sync": "Szinkroniz\u00e1l", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Kil\u00e9p\u00e9s", + "LabelVisitCommunity": "K\u00f6z\u00f6ss\u00e9g", + "LabelBrowseLibrary": "M\u00e9diat\u00e1r tall\u00f3z\u00e1sa", + "LabelConfigureServer": "Emby konfigur\u00e1l\u00e1sa", + "LabelRestartServer": "Szerver \u00fajraindit\u00e1sa" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/id.json b/Emby.Server.Implementations/Localization/Core/id.json deleted file mode 100644 index 8d64b63c46..0000000000 --- a/Emby.Server.Implementations/Localization/Core/id.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Silahkan menunggu sementara database Emby Server anda diupgrade. {0}% selesai.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Mewarisi", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Keluar", - "LabelVisitCommunity": "Kunjungi Komunitas", - "LabelGithub": "Github", - "LabelApiDocumentation": "Dokumentasi Api", - "LabelDeveloperResources": "Sumber daya Pengembang", - "LabelBrowseLibrary": "Telusuri Pustaka", - "LabelConfigureServer": "Konfigurasi Emby", - "LabelRestartServer": "Hidupkan ulang Server", - "CategorySync": "Singkron", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -} \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/it.json b/Emby.Server.Implementations/Localization/Core/it.json index d2d697c3ee..4ff0d98d83 100644 --- a/Emby.Server.Implementations/Localization/Core/it.json +++ b/Emby.Server.Implementations/Localization/Core/it.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Pi\u00f9 recenti", + "ValueSpecialEpisodeName": "Speciale - {0}", + "Inherit": "Eredita", + "Books": "Libri", + "Music": "Musica", + "Games": "Giochi", + "Photos": "Foto", + "MixedContent": "Contenuto misto", + "MusicVideos": "Video musicali", + "HomeVideos": "Video personali", + "Playlists": "Playlist", + "HeaderRecordingGroups": "Gruppi di Registrazione", + "HeaderContinueWatching": "Continua a guardare", + "HeaderFavoriteArtists": "Artisti preferiti", + "HeaderFavoriteSongs": "Brani Preferiti", + "HeaderAlbumArtists": "Artisti Album", + "HeaderFavoriteAlbums": "Album preferiti", + "HeaderFavoriteEpisodes": "Episodi Preferiti", + "HeaderFavoriteShows": "Show preferiti", + "HeaderNextUp": "Prossimo", + "Favorites": "Preferiti", + "Collections": "Collezioni", + "Channels": "Canali", + "Movies": "Film", + "Albums": "Album", + "Artists": "Artisti", + "Folders": "Cartelle", + "Songs": "Canzoni", + "TvShows": "TV Shows", + "Shows": "Programmi", + "Genres": "Generi", + "NameSeasonNumber": "Stagione {0}", "AppDeviceValues": "App: {0}, Dispositivo: {1}", "UserDownloadingItemWithValues": "{0} sta scaricando {1}", - "FolderTypeMixed": "contenuto misto", - "FolderTypeMovies": "Film", - "FolderTypeMusic": "Musica", - "FolderTypeAdultVideos": "Video per adulti", - "FolderTypePhotos": "Foto", - "FolderTypeMusicVideos": "Video musicali", - "FolderTypeHomeVideos": "Video personali", - "FolderTypeGames": "Giochi", - "FolderTypeBooks": "Libri", - "FolderTypeTvShows": "Tv", - "FolderTypeInherit": "ereditare", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "Persone", - "ValueSpecialEpisodeName": "Speciali - {0}", - "LabelChapterName": "Capitolo {0}", - "NameSeasonNumber": "Stagione {0}", - "LabelExit": "Esci", - "LabelVisitCommunity": "Visita la Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentazione Api", - "LabelDeveloperResources": "Risorse programmatori", - "LabelBrowseLibrary": "Esplora la libreria", - "LabelConfigureServer": "Configura Emby", - "LabelRestartServer": "Riavvia Server", - "CategorySync": "Sincronizza", - "CategoryUser": "Utente", - "CategorySystem": "Sistema", - "CategoryApplication": "Applicazione", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin fallito", - "NotificationOptionApplicationUpdateAvailable": "Aggiornamento dell'applicazione disponibile", - "NotificationOptionApplicationUpdateInstalled": "Aggiornamento dell'applicazione installato", - "NotificationOptionPluginUpdateInstalled": "Aggiornamento del plugin installato", - "NotificationOptionPluginInstalled": "Plugin installato", - "NotificationOptionPluginUninstalled": "Plugin disinstallato", - "NotificationOptionVideoPlayback": "La riproduzione video \u00e8 iniziata", - "NotificationOptionAudioPlayback": "Riproduzione audio iniziata", - "NotificationOptionGamePlayback": "Gioco avviato", - "NotificationOptionVideoPlaybackStopped": "Riproduzione video interrotta", - "NotificationOptionAudioPlaybackStopped": "Audio Fermato", - "NotificationOptionGamePlaybackStopped": "Gioco Fermato", - "NotificationOptionTaskFailed": "Operazione pianificata fallita", - "NotificationOptionInstallationFailed": "Installazione fallita", - "NotificationOptionNewLibraryContent": "Nuovo contenuto aggiunto", - "NotificationOptionNewLibraryContentMultiple": "Nuovi contenuti aggiunti (multipli)", - "NotificationOptionCameraImageUploaded": "Immagine fotocamera caricata", - "NotificationOptionUserLockedOut": "Utente bloccato", - "NotificationOptionServerRestartRequired": "Riavvio del server necessario", - "ViewTypePlaylists": "Playlist", - "ViewTypeMovies": "Film", - "ViewTypeTvShows": "Serie Tv", - "ViewTypeGames": "Giochi", - "ViewTypeMusic": "Musica", - "ViewTypeMusicGenres": "Generi", - "ViewTypeMusicArtists": "Artisti", - "ViewTypeBoxSets": "Collezioni", - "ViewTypeChannels": "Canali", - "ViewTypeLiveTV": "TV in diretta", - "ViewTypeLiveTvNowPlaying": "Ora in onda", - "ViewTypeLatestGames": "Ultimi Giorchi", - "ViewTypeRecentlyPlayedGames": "Guardato di recente", - "ViewTypeGameFavorites": "Preferiti", - "ViewTypeGameSystems": "Configurazione gioco", - "ViewTypeGameGenres": "Generi", - "ViewTypeTvResume": "Riprendi", - "ViewTypeTvNextUp": "Prossimi", - "ViewTypeTvLatest": "Ultimi", - "ViewTypeTvShowSeries": "Serie", - "ViewTypeTvGenres": "Generi", - "ViewTypeTvFavoriteSeries": "Serie Preferite", - "ViewTypeTvFavoriteEpisodes": "Episodi Preferiti", - "ViewTypeMovieResume": "Riprendi", - "ViewTypeMovieLatest": "Ultimi", - "ViewTypeMovieMovies": "Film", - "ViewTypeMovieCollections": "Collezioni", - "ViewTypeMovieFavorites": "Preferiti", - "ViewTypeMovieGenres": "Generi", - "ViewTypeMusicLatest": "Ultimi", - "ViewTypeMusicPlaylists": "Playlist", - "ViewTypeMusicAlbums": "Album", - "ViewTypeMusicAlbumArtists": "Album Artisti", - "HeaderOtherDisplaySettings": "Impostazioni Video", - "ViewTypeMusicSongs": "Canzoni", - "ViewTypeMusicFavorites": "Preferiti", - "ViewTypeMusicFavoriteAlbums": "Album preferiti", - "ViewTypeMusicFavoriteArtists": "Artisti preferiti", - "ViewTypeMusicFavoriteSongs": "Canzoni Preferite", - "ViewTypeFolders": "Cartelle", - "ViewTypeLiveTvRecordingGroups": "Registrazioni", - "ViewTypeLiveTvChannels": "canali", - "ScheduledTaskFailedWithName": "{0} Falliti", + "HeaderLiveTV": "Diretta TV", + "ChapterNameValue": "Capitolo {0}", + "ScheduledTaskFailedWithName": "{0} fallito", "LabelRunningTimeValue": "Durata: {0}", - "ScheduledTaskStartedWithName": "{0} Avviati", + "ScheduledTaskStartedWithName": "{0} avviati", "VersionNumber": "Versione {0}", - "PluginInstalledWithName": "{0} sono stati Installati", - "PluginUpdatedWithName": "{0} sono stati aggiornati", - "PluginUninstalledWithName": "{0} non sono stati installati", - "ItemAddedWithName": "{0} aggiunti alla libreria", - "ItemRemovedWithName": "{0} rimossi dalla libreria", + "PluginInstalledWithName": "{0} \u00e8 stato Installato", + "StartupEmbyServerIsLoading": "Emby server si sta avviando. Per favore riprova pi\u00f9 tardi.", + "PluginUpdatedWithName": "{0} \u00e8 stato aggiornato", + "PluginUninstalledWithName": "{0} \u00e8 stato disinstallato", + "ItemAddedWithName": "{0} \u00e8 stato aggiunto alla libreria", + "ItemRemovedWithName": "{0} \u00e8 stato rimosso dalla libreria", "LabelIpAddressValue": "Indirizzo IP: {0}", "DeviceOnlineWithName": "{0} \u00e8 connesso", "UserOnlineFromDevice": "{0} \u00e8 online da {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Sottotitoli scaricati per {0}", - "UserConfigurationUpdatedWithName": "Configurazione utente \u00e8 stata aggiornata per {0}", - "UserCreatedWithName": "Utente {0} \u00e8 stato creato", - "UserPasswordChangedWithName": "Password utente cambiata per {0}", - "UserDeletedWithName": "Utente {0} \u00e8 stato cancellato", - "MessageServerConfigurationUpdated": "Configurazione server aggioprnata", - "MessageNamedServerConfigurationUpdatedWithValue": "La sezione {0} \u00e8 stata aggiornata", + "UserCreatedWithName": "L'utente {0} \u00e8 stato creato", + "UserPasswordChangedWithName": "La password \u00e8 stata cambiata per l'utente {0}", + "UserDeletedWithName": "L'utente {0} \u00e8 stato rimosso", + "UserConfigurationUpdatedWithName": "La configurazione utente \u00e8 stata aggiornata per {0}", + "MessageServerConfigurationUpdated": "La configurazione del server \u00e8 stata aggiornata", + "MessageNamedServerConfigurationUpdatedWithValue": "La sezione {0} della configurazione server \u00e8 stata aggiornata", "MessageApplicationUpdated": "Il Server Emby \u00e8 stato aggiornato", - "FailedLoginAttemptWithUserName": "Login fallito da {0}", - "AuthenticationSucceededWithUserName": "{0} Autenticati con successo", - "DeviceOfflineWithName": "{0} \u00e8 stato disconesso", + "FailedLoginAttemptWithUserName": "Tentativo di accesso fallito da {0}", + "AuthenticationSucceededWithUserName": "{0} autenticato con successo", + "UserOfflineFromDevice": "{0} \u00e8 stato disconnesso da {1}", + "DeviceOfflineWithName": "{0} \u00e8 stato disconnesso", + "UserStartedPlayingItemWithValues": "{0} ha avviato la riproduzione di {1}", + "UserStoppedPlayingItemWithValues": "{0} ha interrotto la riproduzione di {1}", + "NotificationOptionPluginError": "Errore del Plug-in", + "NotificationOptionApplicationUpdateAvailable": "Aggiornamento dell'applicazione disponibile", + "NotificationOptionApplicationUpdateInstalled": "Aggiornamento dell'applicazione installato", + "NotificationOptionPluginUpdateInstalled": "Aggiornamento del plug-in installato", + "NotificationOptionPluginInstalled": "Plug-in installato", + "NotificationOptionPluginUninstalled": "Plug-in disinstallato", + "NotificationOptionVideoPlayback": "La riproduzione video \u00e8 iniziata", + "NotificationOptionAudioPlayback": "La riproduzione audio \u00e8 iniziata", + "NotificationOptionGamePlayback": "Il gioco \u00e8 stato avviato", + "NotificationOptionVideoPlaybackStopped": "La riproduzione video \u00e8 stata interrotta", + "NotificationOptionAudioPlaybackStopped": "La riproduzione audio \u00e8 stata interrotta", + "NotificationOptionGamePlaybackStopped": "Il gioco \u00e8 stato fermato", + "NotificationOptionTaskFailed": "Operazione pianificata fallita", + "NotificationOptionInstallationFailed": "Installazione fallita", + "NotificationOptionNewLibraryContent": "Nuovo contenuto aggiunto", + "NotificationOptionCameraImageUploaded": "Immagine fotocamera caricata", + "NotificationOptionUserLockedOut": "Utente bloccato", + "NotificationOptionServerRestartRequired": "Riavvio del server necessario", "UserLockedOutWithName": "L'utente {0} \u00e8 stato bloccato", - "UserOfflineFromDevice": "{0} \u00e8 stato disconesso da {1}", - "UserStartedPlayingItemWithValues": "{0} \u00e8 partito da {1}", - "UserStoppedPlayingItemWithValues": "{0} stoppato {1}", - "SubtitleDownloadFailureForItem": "Sottotitoli non scaricati per {0}", - "HeaderUnidentified": "Non identificata", - "HeaderImagePrimary": "Primaria", - "HeaderImageBackdrop": "Sfondo", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Immagine utente", - "HeaderOverview": "Panoramica", - "HeaderShortOverview": "breve panoramica", - "HeaderType": "Tipo", - "HeaderSeverity": "gravit\u00e0", - "HeaderUser": "Utente", - "HeaderName": "Nome", - "HeaderDate": "Data", - "HeaderPremiereDate": "Data della prima", - "HeaderDateAdded": "Aggiunto il", - "HeaderReleaseDate": "Data Rilascio", - "HeaderRuntime": "Durata", - "HeaderPlayCount": "Visto N\u00b0", - "HeaderSeason": "Stagione", - "HeaderSeasonNumber": "Stagione Numero", - "HeaderSeries": "Serie:", - "HeaderNetwork": "Rete", - "HeaderYear": "Anno:", - "HeaderYears": "Anni", - "HeaderParentalRating": "Valutazione parentale", - "HeaderCommunityRating": "Voto Comunit\u00e0", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Speciali", - "HeaderGameSystems": "Sistemi di gioco", - "HeaderPlayers": "Giocatori", - "HeaderAlbumArtists": "Album Artisti", - "HeaderAlbums": "Album", - "HeaderDisc": "Disco", - "HeaderTrack": "Traccia", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Immagine incorporata", - "HeaderResolution": "Risoluzione", - "HeaderSubtitles": "Sottotitoli", - "HeaderGenres": "Generi", - "HeaderCountries": "Paesi", - "HeaderStatus": "Stato", - "HeaderTracks": "Traccia", - "HeaderMusicArtist": "Musica artisti", - "HeaderLocked": "Bloccato", - "HeaderStudios": "Studios", - "HeaderActor": "Attori", - "HeaderComposer": "Compositori", - "HeaderDirector": "Registi", - "HeaderGuestStar": "Personaggi famosi", - "HeaderProducer": "Produttori", - "HeaderWriter": "Sceneggiatori", - "HeaderParentalRatings": "Valutazioni genitori", - "HeaderCommunityRatings": "Valutazione Comunity", - "StartupEmbyServerIsLoading": "Emby server si sta avviando. Riprova tra un po" + "SubtitleDownloadFailureForItem": "Impossibile scaricare i sottotitoli per {0}", + "Sync": "Sincronizza", + "User": "Utente", + "System": "Sistema", + "Application": "Applicazione", + "Plugin": "Plug-in", + "LabelExit": "Esci", + "LabelVisitCommunity": "Visita il forum di discussione", + "LabelBrowseLibrary": "Esplora la libreria", + "LabelConfigureServer": "Configura Emby", + "LabelRestartServer": "Riavvia Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/kk.json b/Emby.Server.Implementations/Localization/Core/kk.json index 93252c30b8..c24ee3d13b 100644 --- a/Emby.Server.Implementations/Localization/Core/kk.json +++ b/Emby.Server.Implementations/Localization/Core/kk.json @@ -1,38 +1,70 @@ { - "DbUpgradeMessage": "Emby Server \u0434\u0435\u0440\u0435\u043a\u049b\u043e\u0440\u044b\u04a3\u044b\u0437\u0434\u044b\u04a3 \u0436\u0430\u04a3\u0493\u044b\u0440\u0442\u044b\u043b\u0443\u044b\u043d \u043a\u04af\u0442\u0435 \u0442\u04b1\u0440\u044b\u04a3\u044b\u0437. {0} % \u0430\u044f\u049b\u0442\u0430\u043b\u0434\u044b.", + "Latest": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456", + "ValueSpecialEpisodeName": "\u0410\u0440\u043d\u0430\u0439\u044b - {0}", + "Inherit": "\u041c\u04b1\u0440\u0430\u0493\u0430 \u0438\u0435\u043b\u0435\u043d\u0443", + "Books": "\u041a\u0456\u0442\u0430\u043f\u0442\u0430\u0440", + "Music": "\u041c\u0443\u0437\u044b\u043a\u0430", + "Games": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440", + "Photos": "\u0424\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440", + "MixedContent": "\u0410\u0440\u0430\u043b\u0430\u0441 \u043c\u0430\u0437\u043c\u04b1\u043d", + "MusicVideos": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440", + "HomeVideos": "\u04ae\u0439\u043b\u0456\u043a \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440", + "Playlists": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0456", + "HeaderRecordingGroups": "\u0416\u0430\u0437\u0431\u0430 \u0442\u043e\u043f\u0442\u0430\u0440\u044b", + "HeaderContinueWatching": "\u049a\u0430\u0440\u0430\u0443\u0434\u044b \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443", + "HeaderFavoriteArtists": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", + "HeaderFavoriteSongs": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u04d9\u0443\u0435\u043d\u0434\u0435\u0440", + "HeaderAlbumArtists": "\u0410\u043b\u044c\u0431\u043e\u043c \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b", + "HeaderFavoriteAlbums": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0430\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", + "HeaderFavoriteEpisodes": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440", + "HeaderFavoriteShows": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c\u0434\u0435\u0440", + "HeaderNextUp": "\u041a\u0435\u0437\u0435\u043a\u0442\u0456", + "Favorites": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b\u043b\u0430\u0440", + "Collections": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440", + "Channels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440", + "Movies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440", + "Albums": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", + "Artists": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", + "Folders": "\u049a\u0430\u043b\u0442\u0430\u043b\u0430\u0440", + "Songs": "\u04d8\u0443\u0435\u043d\u0434\u0435\u0440", + "TvShows": "\u0422\u0414-\u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c\u0434\u0435\u0440", + "Shows": "\u041a\u04e9\u0440\u0441\u0435\u0442\u0456\u043c\u0434\u0435\u0440", + "Genres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", + "NameSeasonNumber": "{0}-\u043c\u0430\u0443\u0441\u044b\u043c", "AppDeviceValues": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430: {0}, \u049a\u04b1\u0440\u044b\u043b\u0493\u044b: {1}", "UserDownloadingItemWithValues": "{0} \u043c\u044b\u043d\u0430\u043d\u044b \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443\u0434\u0430: {1}", - "FolderTypeMixed": "\u0410\u0440\u0430\u043b\u0430\u0441 \u043c\u0430\u0437\u043c\u04b1\u043d", - "FolderTypeMovies": "\u041a\u0438\u043d\u043e", - "FolderTypeMusic": "\u041c\u0443\u0437\u044b\u043a\u0430", - "FolderTypeAdultVideos": "\u0415\u0440\u0435\u0441\u0435\u043a\u0442\u0456\u043a \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440", - "FolderTypePhotos": "\u0424\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440", - "FolderTypeMusicVideos": "\u041c\u0443\u0437\u044b\u043a\u0430\u043b\u044b\u049b \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440", - "FolderTypeHomeVideos": "\u04ae\u0439 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0440\u0456", - "FolderTypeGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440", - "FolderTypeBooks": "\u041a\u0456\u0442\u0430\u043f\u0442\u0430\u0440", - "FolderTypeTvShows": "\u0422\u0414", - "FolderTypeInherit": "\u041c\u04b1\u0440\u0430\u0493\u0430 \u0438\u0435\u043b\u0435\u043d\u0443", - "HeaderCastCrew": "\u0421\u043e\u043c\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440 \u043c\u0435\u043d \u0442\u04af\u0441\u0456\u0440\u0443\u0448\u0456\u043b\u0435\u0440", - "HeaderPeople": "\u0410\u0434\u0430\u043c\u0434\u0430\u0440", - "ValueSpecialEpisodeName": "\u0410\u0440\u043d\u0430\u0439\u044b - {0}", - "LabelChapterName": "{0}-\u0441\u0430\u0445\u043d\u0430", - "NameSeasonNumber": "{0}-\u0441\u0435\u0437\u043e\u043d", - "LabelExit": "\u0428\u044b\u0493\u0443", - "LabelVisitCommunity": "\u049a\u0430\u0443\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u049b\u049b\u0430 \u0431\u0430\u0440\u0443", - "LabelGithub": "GitHub \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439\u0456", - "LabelApiDocumentation": "API \u049b\u04b1\u0436\u0430\u0442\u0442\u0430\u043c\u0430\u0441\u044b", - "LabelDeveloperResources": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b \u043a\u04e9\u0437\u0434\u0435\u0440\u0456", - "LabelBrowseLibrary": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b \u0448\u043e\u043b\u0443", - "LabelConfigureServer": "Emby \u0442\u0435\u04a3\u0448\u0435\u0443", - "LabelRestartServer": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443", - "CategorySync": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", - "CategoryUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b", - "CategorySystem": "\u0416\u04af\u0439\u0435", - "CategoryApplication": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430", - "CategoryPlugin": "\u041f\u043b\u0430\u0433\u0438\u043d", + "HeaderLiveTV": "\u042d\u0444\u0438\u0440", + "ChapterNameValue": "{0}-\u0441\u0430\u0445\u043d\u0430", + "ScheduledTaskFailedWithName": "{0} \u0441\u04d9\u0442\u0441\u0456\u0437", + "LabelRunningTimeValue": "\u0406\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443 \u0443\u0430\u049b\u044b\u0442\u044b: {0}", + "ScheduledTaskStartedWithName": "{0} \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0434\u044b", + "VersionNumber": "\u041d\u04b1\u0441\u049b\u0430\u0441\u044b: {0}", + "PluginInstalledWithName": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", + "StartupEmbyServerIsLoading": "Emby Server \u0436\u04af\u043a\u0442\u0435\u043b\u0443\u0434\u0435. \u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u043a\u04e9\u043f \u04b1\u0437\u0430\u043c\u0430\u0439 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437.", + "PluginUpdatedWithName": "{0} \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", + "PluginUninstalledWithName": "{0} \u0436\u043e\u0439\u044b\u043b\u0434\u044b", + "ItemAddedWithName": "{0} \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u0493\u0430 \u04af\u0441\u0442\u0435\u043b\u0456\u043d\u0434\u0456", + "ItemRemovedWithName": "{0} \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u043b\u0434\u044b", + "LabelIpAddressValue": "IP-\u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b: {0}", + "DeviceOnlineWithName": "{0} \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d", + "UserOnlineFromDevice": "{0} - {1} \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d", + "ProviderValue": "\u0416\u0435\u0442\u043a\u0456\u0437\u0443\u0448\u0456: {0}", + "SubtitlesDownloadedForItem": "{0} \u04af\u0448\u0456\u043d \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0434\u044b", + "UserCreatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u0436\u0430\u0441\u0430\u043b\u0493\u0430\u043d", + "UserPasswordChangedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u04e9\u0437\u0433\u0435\u0440\u0442\u0456\u043b\u0434\u0456", + "UserDeletedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u0436\u043e\u0439\u044b\u043b\u0493\u0430\u043d", + "UserConfigurationUpdatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", + "MessageServerConfigurationUpdated": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456 \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", + "MessageNamedServerConfigurationUpdatedWithValue": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456 ({0} \u0431\u04e9\u043b\u0456\u043c\u0456) \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", + "MessageApplicationUpdated": "Emby Server \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b.", + "FailedLoginAttemptWithUserName": "{0} \u0442\u0430\u0440\u0430\u043f\u044b\u043d\u0430\u043d \u043a\u0456\u0440\u0443 \u04d9\u0440\u0435\u043a\u0435\u0442\u0456 \u0441\u04d9\u0442\u0441\u0456\u0437", + "AuthenticationSucceededWithUserName": "{0} \u0442\u04af\u043f\u043d\u04b1\u0441\u049b\u0430\u043b\u044b\u0493\u044b\u043d \u0440\u0430\u0441\u0442\u0430\u043b\u0443\u044b \u0441\u04d9\u0442\u0442\u0456", + "UserOfflineFromDevice": "{0} - {1} \u0442\u0430\u0440\u0430\u043f\u044b\u043d\u0430\u043d \u0430\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d", + "DeviceOfflineWithName": "{0} \u0430\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d", + "UserStartedPlayingItemWithValues": "{0} - {1} \u043e\u0439\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u0430\u0441\u0442\u0430\u0434\u044b", + "UserStoppedPlayingItemWithValues": "{0} - {1} \u043e\u0439\u043d\u0430\u0442\u0443\u044b\u043d \u0442\u043e\u049b\u0442\u0430\u0442\u0442\u044b", "NotificationOptionPluginError": "\u041f\u043b\u0430\u0433\u0438\u043d \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", - "NotificationOptionApplicationUpdateAvailable": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u049b\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456", + "NotificationOptionApplicationUpdateAvailable": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456", "NotificationOptionApplicationUpdateInstalled": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", "NotificationOptionPluginUpdateInstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", "NotificationOptionPluginInstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "\u0416\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d \u0442\u0430\u043f\u0441\u044b\u0440\u043c\u0430 \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", "NotificationOptionInstallationFailed": "\u041e\u0440\u043d\u0430\u0442\u0443 \u0441\u04d9\u0442\u0441\u0456\u0437\u0434\u0456\u0433\u0456", "NotificationOptionNewLibraryContent": "\u0416\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d \u04af\u0441\u0442\u0435\u043b\u0433\u0435\u043d", - "NotificationOptionNewLibraryContentMultiple": "\u0416\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d \u049b\u043e\u0441\u044b\u043b\u0434\u044b (\u043a\u04e9\u043f\u0442\u0435\u0433\u0435\u043d)", "NotificationOptionCameraImageUploaded": "\u041a\u0430\u043c\u0435\u0440\u0430\u0434\u0430\u043d \u0444\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442 \u043a\u0435\u0440\u0456 \u049b\u043e\u0442\u0430\u0440\u044b\u043b\u0493\u0430\u043d", "NotificationOptionUserLockedOut": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u044b", "NotificationOptionServerRestartRequired": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443 \u049b\u0430\u0436\u0435\u0442", - "ViewTypePlaylists": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0456", - "ViewTypeMovies": "\u041a\u0438\u043d\u043e", - "ViewTypeTvShows": "\u0422\u0414", - "ViewTypeGames": "\u041e\u0439\u044b\u043d\u0434\u0430\u0440", - "ViewTypeMusic": "\u041c\u0443\u0437\u044b\u043a\u0430", - "ViewTypeMusicGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", - "ViewTypeMusicArtists": "\u041e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", - "ViewTypeBoxSets": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440", - "ViewTypeChannels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440", - "ViewTypeLiveTV": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414", - "ViewTypeLiveTvNowPlaying": "\u042d\u0444\u0438\u0440\u0434\u0435", - "ViewTypeLatestGames": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456 \u043e\u0439\u044b\u043d\u0434\u0430\u0440", - "ViewTypeRecentlyPlayedGames": "\u0416\u0430\u049b\u044b\u043d\u0434\u0430 \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d\u0434\u0430\u0440", - "ViewTypeGameFavorites": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b\u043b\u0430\u0440", - "ViewTypeGameSystems": "\u041e\u0439\u044b\u043d \u0436\u04af\u0439\u0435\u043b\u0435\u0440\u0456", - "ViewTypeGameGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", - "ViewTypeTvResume": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u043c\u0430\u043b\u044b", - "ViewTypeTvNextUp": "\u041a\u0435\u0437\u0435\u043a\u0442\u0456", - "ViewTypeTvLatest": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456", - "ViewTypeTvShowSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043b\u0430\u0440", - "ViewTypeTvGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", - "ViewTypeTvFavoriteSeries": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0442\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043b\u0430\u0440", - "ViewTypeTvFavoriteEpisodes": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440", - "ViewTypeMovieResume": "\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u043c\u0430\u043b\u044b", - "ViewTypeMovieLatest": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456", - "ViewTypeMovieMovies": "\u0424\u0438\u043b\u044c\u043c\u0434\u0435\u0440", - "ViewTypeMovieCollections": "\u0416\u0438\u044b\u043d\u0442\u044b\u049b\u0442\u0430\u0440", - "ViewTypeMovieFavorites": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b\u043b\u0430\u0440", - "ViewTypeMovieGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", - "ViewTypeMusicLatest": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u043d\u0433\u0456", - "ViewTypeMusicPlaylists": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u0440\u0456", - "ViewTypeMusicAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", - "ViewTypeMusicAlbumArtists": "\u0410\u043b\u044c\u0431\u043e\u043c \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b", - "HeaderOtherDisplaySettings": "\u0411\u0435\u0439\u043d\u0435\u043b\u0435\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", - "ViewTypeMusicSongs": "\u04d8\u0443\u0435\u043d\u0434\u0435\u0440", - "ViewTypeMusicFavorites": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b\u043b\u0430\u0440", - "ViewTypeMusicFavoriteAlbums": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0430\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", - "ViewTypeMusicFavoriteArtists": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", - "ViewTypeMusicFavoriteSongs": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u04d9\u0443\u0435\u043d\u0434\u0435\u0440", - "ViewTypeFolders": "\u049a\u0430\u043b\u0442\u0430\u043b\u0430\u0440", - "ViewTypeLiveTvRecordingGroups": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440", - "ViewTypeLiveTvChannels": "\u0410\u0440\u043d\u0430\u043b\u0430\u0440", - "ScheduledTaskFailedWithName": "{0} \u0441\u04d9\u0442\u0441\u0456\u0437", - "LabelRunningTimeValue": "\u0406\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443 \u0443\u0430\u049b\u044b\u0442\u044b: {0}", - "ScheduledTaskStartedWithName": "{0} \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0434\u044b", - "VersionNumber": "\u041d\u04b1\u0441\u049b\u0430\u0441\u044b: {0}", - "PluginInstalledWithName": "{0} \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", - "PluginUpdatedWithName": "{0} \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", - "PluginUninstalledWithName": "{0} \u0436\u043e\u0439\u044b\u043b\u0434\u044b", - "ItemAddedWithName": "{0} (\u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u0493\u0430 \u04af\u0441\u0442\u0435\u043b\u0456\u043d\u0434\u0456)", - "ItemRemovedWithName": "{0} (\u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u043b\u0434\u044b)", - "LabelIpAddressValue": "IP \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b: {0}", - "DeviceOnlineWithName": "{0} \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d", - "UserOnlineFromDevice": "{0} - {1} \u0430\u0440\u049b\u044b\u043b\u044b \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d", - "ProviderValue": "\u0416\u0435\u0442\u043a\u0456\u0437\u0443\u0448\u0456: {0}", - "SubtitlesDownloadedForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 {0} \u04af\u0448\u0456\u043d \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0434\u044b", - "UserConfigurationUpdatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", - "UserCreatedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u0436\u0430\u0441\u0430\u043b\u0493\u0430\u043d", - "UserPasswordChangedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u04af\u0448\u0456\u043d \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u04e9\u0437\u0433\u0435\u0440\u0442\u0456\u043b\u0434\u0456", - "UserDeletedWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u0436\u043e\u0439\u044b\u043b\u0493\u0430\u043d", - "MessageServerConfigurationUpdated": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456 \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", - "MessageNamedServerConfigurationUpdatedWithValue": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456 ({0} \u0431\u04e9\u043b\u0456\u043c\u0456) \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b", - "MessageApplicationUpdated": "Emby Server \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0434\u044b.", - "FailedLoginAttemptWithUserName": "{0} \u043a\u0456\u0440\u0443 \u04d9\u0440\u0435\u043a\u0435\u0442\u0456 \u0441\u04d9\u0442\u0441\u0456\u0437", - "AuthenticationSucceededWithUserName": "{0} \u0442\u04af\u043f\u043d\u04b1\u0441\u049b\u0430\u043b\u044b\u0493\u044b\u043d \u0440\u0430\u0441\u0442\u0430\u043b\u0443\u044b \u0441\u04d9\u0442\u0442\u0456", - "DeviceOfflineWithName": "{0} \u0430\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d", "UserLockedOutWithName": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b {0} \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u044b", - "UserOfflineFromDevice": "{0} - {1} \u0430\u0440\u049b\u044b\u043b\u044b \u0430\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d", - "UserStartedPlayingItemWithValues": "{0} - {1} \u043e\u0439\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u0430\u0441\u0442\u0430\u0434\u044b", - "UserStoppedPlayingItemWithValues": "{0} - {1} \u043e\u0439\u043d\u0430\u0442\u0443\u044b\u043d \u0442\u043e\u049b\u0442\u0430\u0442\u0442\u044b", "SubtitleDownloadFailureForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 {0} \u04af\u0448\u0456\u043d \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0443\u044b \u0441\u04d9\u0442\u0441\u0456\u0437", - "HeaderUnidentified": "\u0410\u043d\u044b\u049b\u0442\u0430\u043b\u043c\u0430\u0493\u0430\u043d", - "HeaderImagePrimary": "\u041d\u0435\u0433\u0456\u0437\u0433\u0456", - "HeaderImageBackdrop": "\u0410\u0440\u0442\u049b\u044b \u0441\u0443\u0440\u0435\u0442", - "HeaderImageLogo": "\u041b\u043e\u0433\u043e\u0442\u0438\u043f", - "HeaderUserPrimaryImage": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u0441\u0443\u0440\u0435\u0442\u0456", - "HeaderOverview": "\u0416\u0430\u043b\u043f\u044b \u0448\u043e\u043b\u0443", - "HeaderShortOverview": "\u049a\u044b\u0441\u049b\u0430\u0448\u0430 \u0448\u043e\u043b\u0443", - "HeaderType": "\u0422\u04af\u0440\u0456", - "HeaderSeverity": "\u049a\u0438\u044b\u043d\u0434\u044b\u0493\u044b", - "HeaderUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b", - "HeaderName": "\u0410\u0442\u044b", - "HeaderDate": "\u041a\u04af\u043d\u0456", - "HeaderPremiereDate": "\u0422\u04b1\u0441\u0430\u0443\u043a\u0435\u0441\u0435\u0440 \u043a\u04af\u043d\u0456", - "HeaderDateAdded": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d \u043a\u04af\u043d\u0456", - "HeaderReleaseDate": "\u0428\u044b\u0493\u0430\u0440\u0443 \u043a\u04af\u043d\u0456", - "HeaderRuntime": "\u04b0\u0437\u0430\u049b\u0442\u044b\u0493\u044b", - "HeaderPlayCount": "\u041e\u0439\u043d\u0430\u0442\u0443 \u0435\u0441\u0435\u0431\u0456", - "HeaderSeason": "\u041c\u0430\u0443\u0441\u044b\u043c", - "HeaderSeasonNumber": "\u041c\u0430\u0443\u0441\u044b\u043c \u043d\u04e9\u043c\u0456\u0440\u0456", - "HeaderSeries": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f\u043b\u0430\u0440", - "HeaderNetwork": "\u0422\u0435\u043b\u0435\u0436\u0435\u043b\u0456", - "HeaderYear": "\u0416\u044b\u043b:", - "HeaderYears": "\u0416\u044b\u043b\u0434\u0430\u0440:", - "HeaderParentalRating": "\u0416\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442\u044b", - "HeaderCommunityRating": "\u049a\u0430\u0443\u044b\u043c \u0431\u0430\u0493\u0430\u043b\u0430\u0443\u044b", - "HeaderTrailers": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u043b\u0435\u0440", - "HeaderSpecials": "\u0410\u0440\u043d\u0430\u0439\u044b \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0434\u0430\u0440", - "HeaderGameSystems": "\u041e\u0439\u044b\u043d \u0436\u04af\u0439\u0435\u043b\u0435\u0440\u0456", - "HeaderPlayers": "\u041e\u0439\u044b\u043d\u0448\u044b\u043b\u0430\u0440:", - "HeaderAlbumArtists": "\u0410\u043b\u044c\u0431\u043e\u043c \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440\u044b", - "HeaderAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u0434\u0430\u0440", - "HeaderDisc": "\u0414\u0438\u0441\u043a\u0456", - "HeaderTrack": "\u0416\u043e\u043b\u0448\u044b\u049b", - "HeaderAudio": "\u0414\u044b\u0431\u044b\u0441", - "HeaderVideo": "\u0411\u0435\u0439\u043d\u0435", - "HeaderEmbeddedImage": "\u0415\u043d\u0434\u0456\u0440\u0456\u043b\u0433\u0435\u043d \u0441\u0443\u0440\u0435\u0442", - "HeaderResolution": "\u0410\u0436\u044b\u0440\u0430\u0442\u044b\u043c\u0434\u044b\u043b\u044b\u0493\u044b", - "HeaderSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440", - "HeaderGenres": "\u0416\u0430\u043d\u0440\u043b\u0430\u0440", - "HeaderCountries": "\u0415\u043b\u0434\u0435\u0440", - "HeaderStatus": "\u041a\u04af\u0439", - "HeaderTracks": "\u0416\u043e\u043b\u0448\u044b\u049b\u0442\u0430\u0440", - "HeaderMusicArtist": "\u041c\u0443\u0437\u044b\u043a\u0430 \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b", - "HeaderLocked": "\u049a\u04b1\u043b\u044b\u043f\u0442\u0430\u043b\u0493\u0430\u043d", - "HeaderStudios": "\u0421\u0442\u0443\u0434\u0438\u044f\u043b\u0430\u0440", - "HeaderActor": "\u0410\u043a\u0442\u0435\u0440\u043b\u0435\u0440", - "HeaderComposer": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u043b\u0430\u0440", - "HeaderDirector": "\u0420\u0435\u0436\u0438\u0441\u0441\u0435\u0440\u043b\u0435\u0440", - "HeaderGuestStar": "\u0428\u0430\u049b\u044b\u0440\u044b\u043b\u0493\u0430\u043d \u0430\u043a\u0442\u0435\u0440", - "HeaderProducer": "\u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u043b\u0435\u0440", - "HeaderWriter": "\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439\u0448\u0456\u043b\u0435\u0440", - "HeaderParentalRatings": "\u0416\u0430\u0441\u0442\u0430\u0441 \u0441\u0430\u043d\u0430\u0442\u0442\u0430\u0440", - "HeaderCommunityRatings": "\u049a\u0430\u0443\u044b\u043c \u0431\u0430\u0493\u0430\u043b\u0430\u0443\u043b\u0430\u0440\u044b", - "StartupEmbyServerIsLoading": "Emby Server \u0436\u04af\u043a\u0442\u0435\u043b\u0443\u0434\u0435. \u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u043a\u04e9\u043f \u04b1\u0437\u0430\u043c\u0430\u0439 \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437." + "Sync": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", + "User": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b", + "System": "\u0416\u04af\u0439\u0435", + "Application": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430", + "Plugin": "\u041f\u043b\u0430\u0433\u0438\u043d", + "LabelExit": "\u0428\u044b\u0493\u0443", + "LabelVisitCommunity": "\u049a\u0430\u0443\u044b\u043c\u0434\u0430\u0441\u0442\u044b\u049b\u049b\u0430 \u0431\u0430\u0440\u0443", + "LabelBrowseLibrary": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b \u0448\u043e\u043b\u0443", + "LabelConfigureServer": "Emby \u0442\u0435\u04a3\u0448\u0435\u0443", + "LabelRestartServer": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/ko.json b/Emby.Server.Implementations/Localization/Core/ko.json index 834ccc17bc..6c5ed0260a 100644 --- a/Emby.Server.Implementations/Localization/Core/ko.json +++ b/Emby.Server.Implementations/Localization/Core/ko.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "\uc571: {0}, \uc7a5\uce58: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\ud63c\ud569 \ucf58\ud150\ud2b8", - "FolderTypeMovies": "\uc601\ud654", - "FolderTypeMusic": "\uc74c\uc545", - "FolderTypeAdultVideos": "\uc131\uc778 \ube44\ub514\uc624", - "FolderTypePhotos": "\uc0ac\uc9c4", - "FolderTypeMusicVideos": "\ubba4\uc9c1 \ube44\ub514\uc624", - "FolderTypeHomeVideos": "\ud648 \ube44\ub514\uc624", - "FolderTypeGames": "\uac8c\uc784", - "FolderTypeBooks": "\ucc45", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "\ubc30\uc5ed \ubc0f \uc81c\uc791\uc9c4", - "HeaderPeople": "People", + "Latest": "Latest", "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "\ucc55\ud130 {0}", - "NameSeasonNumber": "\uc2dc\uc98c {0}", - "LabelExit": "\uc885\ub8cc", - "LabelVisitCommunity": "\ucee4\ubba4\ub2c8\ud2f0 \ubc29\ubb38", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api \ubb38\uc11c", - "LabelDeveloperResources": "\uac1c\ubc1c\uc790 \ub9ac\uc18c\uc2a4", - "LabelBrowseLibrary": "\ub77c\uc774\ube0c\ub7ec\ub9ac \ud0d0\uc0c9", - "LabelConfigureServer": "Emby \uc124\uc815", - "LabelRestartServer": "\uc11c\ubc84 \uc7ac\uc2dc\ub3d9", - "CategorySync": "\ub3d9\uae30\ud654", - "CategoryUser": "\uc0ac\uc6a9\uc790", - "CategorySystem": "\uc2dc\uc2a4\ud15c", - "CategoryApplication": "\uc560\ud50c\ub9ac\ucf00\uc774\uc158", - "CategoryPlugin": "\ud50c\ub7ec\uadf8\uc778", - "NotificationOptionPluginError": "\ud50c\ub7ec\uadf8\uc778 \uc2e4\ud328", - "NotificationOptionApplicationUpdateAvailable": "\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc5c5\ub370\uc774\ud2b8 \uc0ac\uc6a9 \uac00\ub2a5", - "NotificationOptionApplicationUpdateInstalled": "\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc5c5\ub370\uc774\ud2b8 \uc124\uce58\ub428", - "NotificationOptionPluginUpdateInstalled": "\ud50c\ub7ec\uadf8\uc778 \uc5c5\ub370\uc774\ud2b8 \uc124\uce58\ub428", - "NotificationOptionPluginInstalled": "\ud50c\ub7ec\uadf8\uc778 \uc124\uce58\ub428", - "NotificationOptionPluginUninstalled": "\ud50c\ub7ec\uadf8\uc778 \uc124\uce58 \uc81c\uac70\ub428", - "NotificationOptionVideoPlayback": "\ube44\ub514\uc624 \uc7ac\uc0dd \uc2dc\uc791\ub428", - "NotificationOptionAudioPlayback": "\uc624\ub514\uc624 \uc7ac\uc0dd \uc2dc\uc791\ub428", - "NotificationOptionGamePlayback": "\uac8c\uc784 \ud50c\ub808\uc774 \uc9c0\uc791\ub428", - "NotificationOptionVideoPlaybackStopped": "\ube44\ub514\uc624 \uc7ac\uc0dd \uc911\uc9c0\ub428", - "NotificationOptionAudioPlaybackStopped": "\uc624\ub514\uc624 \uc7ac\uc0dd \uc911\uc9c0\ub428", - "NotificationOptionGamePlaybackStopped": "\uac8c\uc784 \ud50c\ub808\uc774 \uc911\uc9c0\ub428", - "NotificationOptionTaskFailed": "\uc608\uc57d \uc791\uc5c5 \uc2e4\ud328", - "NotificationOptionInstallationFailed": "\uc124\uce58 \uc2e4\ud328", - "NotificationOptionNewLibraryContent": "\uc0c8 \ucf58\ud150\ud2b8 \ucd94\uac00\ub428", - "NotificationOptionNewLibraryContentMultiple": "\uc0c8 \ucf58\ub374\ud2b8 \ucd94\uac00\ub428 (\ubcf5\uc218)", - "NotificationOptionCameraImageUploaded": "\uce74\uba54\ub77c \uc774\ubbf8\uc9c0 \uc5c5\ub85c\ub4dc\ub428", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "\uc11c\ubc84\ub97c \ub2e4\uc2dc \uc2dc\uc791\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4", - "ViewTypePlaylists": "\uc7ac\uc0dd\ubaa9\ub85d", - "ViewTypeMovies": "\uc601\ud654", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "\uac8c\uc784", - "ViewTypeMusic": "\uc74c\uc545", - "ViewTypeMusicGenres": "\uc7a5\ub974", - "ViewTypeMusicArtists": "\uc544\ud2f0\uc2a4\ud2b8", - "ViewTypeBoxSets": "\uceec\ub809\uc158", - "ViewTypeChannels": "\ucc44\ub110", - "ViewTypeLiveTV": "TV \ubc29\uc1a1", - "ViewTypeLiveTvNowPlaying": "\uc9c0\uae08 \ubc29\uc1a1 \uc911", - "ViewTypeLatestGames": "\ucd5c\uadfc \uac8c\uc784", - "ViewTypeRecentlyPlayedGames": "\ucd5c\uadfc \ud50c\ub808\uc774", - "ViewTypeGameFavorites": "\uc990\uaca8\ucc3e\uae30", - "ViewTypeGameSystems": "\uac8c\uc784 \uc2dc\uc2a4\ud15c", - "ViewTypeGameGenres": "\uc7a5\ub974", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "\uc2dc\ub9ac\uc988", - "ViewTypeTvGenres": "\uc7a5\ub974", - "ViewTypeTvFavoriteSeries": "\uc88b\uc544\ud558\ub294 \uc2dc\ub9ac\uc988", - "ViewTypeTvFavoriteEpisodes": "\uc88b\uc544\ud558\ub294 \uc5d0\ud53c\uc18c\ub4dc", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "\uc601\ud654", - "ViewTypeMovieCollections": "\uceec\ub809\uc158", - "ViewTypeMovieFavorites": "\uc990\uaca8\ucc3e\uae30", - "ViewTypeMovieGenres": "\uc7a5\ub974", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "\uc7ac\uc0dd\ubaa9\ub85d", - "ViewTypeMusicAlbums": "\uc568\ubc94", - "ViewTypeMusicAlbumArtists": "\uc568\ubc94 \uc544\ud2f0\uc2a4\ud2b8", - "HeaderOtherDisplaySettings": "\ud654\uba74 \uc124\uc815", - "ViewTypeMusicSongs": "\ub178\ub798", - "ViewTypeMusicFavorites": "\uc990\uaca8\ucc3e\uae30", - "ViewTypeMusicFavoriteAlbums": "\uc88b\uc544\ud558\ub294 \uc568\ubc94", - "ViewTypeMusicFavoriteArtists": "\uc88b\uc544\ud558\ub294 \uc544\ud2f0\uc2a4\ud2b8", - "ViewTypeMusicFavoriteSongs": "\uc88b\uc544\ud558\ub294 \ub178\ub798", - "ViewTypeFolders": "\ud3f4\ub354", - "ViewTypeLiveTvRecordingGroups": "\ub179\ud654", - "ViewTypeLiveTvChannels": "\ucc44\ub110", - "ScheduledTaskFailedWithName": "{0} \uc2e4\ud328", - "LabelRunningTimeValue": "\uc0c1\uc601 \uc2dc\uac04: {0}", - "ScheduledTaskStartedWithName": "{0} \uc2dc\uc791\ub428", - "VersionNumber": "\ubc84\uc804 {0}", - "PluginInstalledWithName": "{0} \uc124\uce58\ub428", - "PluginUpdatedWithName": "{0} \uc5c5\ub370\uc774\ud2b8\ub428", - "PluginUninstalledWithName": "{0} \uc124\uce58 \uc81c\uac70\ub428", - "ItemAddedWithName": "\ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0 {0} \ucd94\uac00\ub428", - "ItemRemovedWithName": "\ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c {0} \uc0ad\uc81c\ub428", - "LabelIpAddressValue": "IP \uc8fc\uc18c: {0}", - "DeviceOnlineWithName": "{0} \uc5f0\uacb0\ub428", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "\uacc4\uc18d \uc2dc\uccad\ud558\uae30", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "\uc568\ubc94 \uc544\ud2f0\uc2a4\ud2b8", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "\uc990\uaca8\ucc3e\ub294 \uc1fc", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby \uc11c\ubc84\ub97c \ubd88\ub7ec\uc624\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc7a0\uc2dc\ud6c4 \ub2e4\uc2dc\uc2dc\ub3c4 \ud574\uc8fc\uc138\uc694.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "\uc81c\uacf5\uc790: {0}", - "SubtitlesDownloadedForItem": "{0} \uc790\ub9c9 \ub2e4\uc6b4\ub85c\ub4dc\ub428", - "UserConfigurationUpdatedWithName": "{0} \uc0ac\uc6a9\uc790 \uc124\uc815\uc774 \uc5c5\ub370\uc774\ud2b8\ub428", - "UserCreatedWithName": "\uc0ac\uc6a9\uc790 {0} \uc0dd\uc131\ub428", - "UserPasswordChangedWithName": "\uc0ac\uc6a9\uc790 {0} \ube44\ubc00\ubc88\ud638 \ubcc0\uacbd\ub428", - "UserDeletedWithName": "\uc0ac\uc6a9\uc790 {0} \uc0ad\uc81c\ub428", - "MessageServerConfigurationUpdated": "\uc11c\ubc84 \ud658\uacbd \uc124\uc815 \uc5c5\ub370\uc774\ub4dc\ub428", - "MessageNamedServerConfigurationUpdatedWithValue": "\uc11c\ubc84 \ud658\uacbd \uc124\uc815 {0} \uc139\uc158 \uc5c5\ub370\uc774\ud2b8 \ub428", - "MessageApplicationUpdated": "Emby \uc11c\ubc84 \uc5c5\ub370\uc774\ud2b8\ub428", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} \uc5f0\uacb0 \ud574\uc81c\ub428", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{1} \uc5d0\uc11c {0} \uc5f0\uacb0 \ud574\uc81c\ub428", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "{0} \uc790\ub9c9 \ub2e4\uc6b4\ub85c\ub4dc \uc2e4\ud328", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "\ubc30\uacbd", - "HeaderImageLogo": "\ub85c\uace0", - "HeaderUserPrimaryImage": "\uc0ac\uc6a9\uc790 \uc774\ubbf8\uc9c0", - "HeaderOverview": "\uc904\uac70\ub9ac", - "HeaderShortOverview": "\uac04\ub7b5 \uc904\uac70\ub9ac", - "HeaderType": "Type", - "HeaderSeverity": "\uc2ec\uac01\ub3c4", - "HeaderUser": "\uc0ac\uc6a9\uc790", - "HeaderName": "Name", - "HeaderDate": "\ub0a0\uc9dc", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "\uac1c\ubd09\uc77c", - "HeaderRuntime": "\uc0c1\uc601 \uc2dc\uac04", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "\uc2dc\uc98c", - "HeaderSeasonNumber": "\uc2dc\uc98c \ubc88\ud638", - "HeaderSeries": "Series:", - "HeaderNetwork": "\ub124\ud2b8\uc6cc\ud06c", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "\ucee4\ubba4\ub2c8\ud2f0 \ud3c9\uc810", - "HeaderTrailers": "\uc608\uace0\ud3b8", - "HeaderSpecials": "\uc2a4\ud398\uc15c", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "\uc568\ubc94", - "HeaderDisc": "\ub514\uc2a4\ud06c", - "HeaderTrack": "\ud2b8\ub799", - "HeaderAudio": "\uc624\ub514\uc624", - "HeaderVideo": "\ube44\ub514\uc624", - "HeaderEmbeddedImage": "\ub0b4\uc7a5 \uc774\ubbf8\uc9c0", - "HeaderResolution": "\ud574\uc0c1\ub3c4", - "HeaderSubtitles": "\uc790\ub9c9", - "HeaderGenres": "\uc7a5\ub974", - "HeaderCountries": "\uad6d\uac00", - "HeaderStatus": "\uc0c1\ud0dc", - "HeaderTracks": "\ud2b8\ub799", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "\uc7a0\uae40", - "HeaderStudios": "\uc2a4\ud29c\ub514\uc624", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "\uc790\ub140 \ubcf4\ud638 \ub4f1\uae09", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/lt-LT.json b/Emby.Server.Implementations/Localization/Core/lt-LT.json new file mode 100644 index 0000000000..21ed36d7c6 --- /dev/null +++ b/Emby.Server.Implementations/Localization/Core/lt-LT.json @@ -0,0 +1,96 @@ +{ + "Latest": "Latest", + "ValueSpecialEpisodeName": "Ypatinga - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "\u017di\u016br\u0117ti toliau", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Filmai", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "\u017danrai", + "NameSeasonNumber": "Season {0}", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "Sync": "Sinchronizuoti", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" +} \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/ms.json b/Emby.Server.Implementations/Localization/Core/ms.json index fe5eef894d..e4a49abf64 100644 --- a/Emby.Server.Implementations/Localization/Core/ms.json +++ b/Emby.Server.Implementations/Localization/Core/ms.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Tutup", - "LabelVisitCommunity": "Melawat Masyarakat", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Imbas Pengumpulan", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Restart Server", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "NotificationOptionPluginError": "Plugin failure", "NotificationOptionApplicationUpdateAvailable": "Application update available", "NotificationOptionApplicationUpdateInstalled": "Application update installed", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "NotificationOptionCameraImageUploaded": "Camera image uploaded", "NotificationOptionUserLockedOut": "User locked out", "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/nb.json b/Emby.Server.Implementations/Localization/Core/nb.json index 315d49b5fd..d0482315d8 100644 --- a/Emby.Server.Implementations/Localization/Core/nb.json +++ b/Emby.Server.Implementations/Localization/Core/nb.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0} , Device: {1}", - "UserDownloadingItemWithValues": "{0} laster ned {1}", - "FolderTypeMixed": "Forskjellig innhold", - "FolderTypeMovies": "Filmer", - "FolderTypeMusic": "Musikk", - "FolderTypeAdultVideos": "Voksen-videoer", - "FolderTypePhotos": "Foto", - "FolderTypeMusicVideos": "Musikk-videoer", - "FolderTypeHomeVideos": "Hjemme-videoer", - "FolderTypeGames": "Spill", - "FolderTypeBooks": "B\u00f8ker", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Arve", - "HeaderCastCrew": "Mannskap", - "HeaderPeople": "Personer", - "ValueSpecialEpisodeName": "Spesiell - {0}", - "LabelChapterName": "Kapittel {0}", + "Latest": "Siste", + "ValueSpecialEpisodeName": "Spesial - {0}", + "Inherit": "Arve", + "Books": "B\u00f8ker", + "Music": "Musikk", + "Games": "Spill", + "Photos": "BIlder", + "MixedContent": "Blandet innhold", + "MusicVideos": "Musikkvideoer", + "HomeVideos": "Hjemmelaget filmer", + "Playlists": "Spilleliste", + "HeaderRecordingGroups": "Opptak Grupper", + "HeaderContinueWatching": "Forsett og see p\u00e5", + "HeaderFavoriteArtists": "Favorittartister", + "HeaderFavoriteSongs": "Favorittsanger", + "HeaderAlbumArtists": "Albumartist", + "HeaderFavoriteAlbums": "Favoritt albumer", + "HeaderFavoriteEpisodes": "Favoritt episode", + "HeaderFavoriteShows": "Favorittserier", + "HeaderNextUp": "Neste", + "Favorites": "Favoritter", + "Collections": "Samlinger", + "Channels": "Kanaler", + "Movies": "Filmer", + "Albums": "Album", + "Artists": "Artister", + "Folders": "Mapper", + "Songs": "Sanger", + "TvShows": "TV Shows", + "Shows": "Programmer", + "Genres": "Sjanger", "NameSeasonNumber": "Sesong {0}", - "LabelExit": "Avslutt", - "LabelVisitCommunity": "Bes\u00f8k oss", - "LabelGithub": "Github", - "LabelApiDocumentation": "API-dokumentasjon", - "LabelDeveloperResources": "Ressurser for Utviklere", - "LabelBrowseLibrary": "Browse biblioteket", - "LabelConfigureServer": "Konfigurer Emby", - "LabelRestartServer": "Restart serveren", - "CategorySync": "Synk", - "CategoryUser": "Bruker", - "CategorySystem": "System", - "CategoryApplication": "Applikasjon", - "CategoryPlugin": "Programtillegg", - "NotificationOptionPluginError": "Programtillegg feilet", - "NotificationOptionApplicationUpdateAvailable": "Oppdatering tilgjengelig", - "NotificationOptionApplicationUpdateInstalled": "Oppdatering installert", - "NotificationOptionPluginUpdateInstalled": "Oppdatert programtillegg installert", - "NotificationOptionPluginInstalled": "Programtillegg installert", - "NotificationOptionPluginUninstalled": "Programtillegg er fjernet", - "NotificationOptionVideoPlayback": "Videoavspilling startet", - "NotificationOptionAudioPlayback": "Lydavspilling startet", - "NotificationOptionGamePlayback": "Spill startet", - "NotificationOptionVideoPlaybackStopped": "Videoavspilling stoppet", - "NotificationOptionAudioPlaybackStopped": "Lydavspilling stoppet", - "NotificationOptionGamePlaybackStopped": "Spill stoppet", - "NotificationOptionTaskFailed": "Planlagt oppgave feilet", - "NotificationOptionInstallationFailed": "Installasjon feilet", - "NotificationOptionNewLibraryContent": "Nytt innhold er lagt til", - "NotificationOptionNewLibraryContentMultiple": "Nytt innhold lagt til (flere)", - "NotificationOptionCameraImageUploaded": "Bilde fra kamera lastet opp", - "NotificationOptionUserLockedOut": "Bruker er utestengt", - "NotificationOptionServerRestartRequired": "Server m\u00e5 startes p\u00e5 nytt", - "ViewTypePlaylists": "Spillelister", - "ViewTypeMovies": "Filmer", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Spill", - "ViewTypeMusic": "Musikk", - "ViewTypeMusicGenres": "Sjangere", - "ViewTypeMusicArtists": "Artist", - "ViewTypeBoxSets": "Samlinger", - "ViewTypeChannels": "Kanaler", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Sendes n\u00e5", - "ViewTypeLatestGames": "Siste spill", - "ViewTypeRecentlyPlayedGames": "Nylig spilt", - "ViewTypeGameFavorites": "Favoritter", - "ViewTypeGameSystems": "Spillsystemer", - "ViewTypeGameGenres": "Sjangere", - "ViewTypeTvResume": "Fortsette", - "ViewTypeTvNextUp": "Neste", - "ViewTypeTvLatest": "Siste", - "ViewTypeTvShowSeries": "Serier", - "ViewTypeTvGenres": "Sjangere", - "ViewTypeTvFavoriteSeries": "Favoritt serier", - "ViewTypeTvFavoriteEpisodes": "Favoritt episoder", - "ViewTypeMovieResume": "Fortsette", - "ViewTypeMovieLatest": "Siste", - "ViewTypeMovieMovies": "Filmer", - "ViewTypeMovieCollections": "Samlinger", - "ViewTypeMovieFavorites": "Favoritter", - "ViewTypeMovieGenres": "Sjangere", - "ViewTypeMusicLatest": "Siste", - "ViewTypeMusicPlaylists": "Spillelister", - "ViewTypeMusicAlbums": "Albumer", - "ViewTypeMusicAlbumArtists": "Album artister", - "HeaderOtherDisplaySettings": "Visnings Innstillinger", - "ViewTypeMusicSongs": "Sanger", - "ViewTypeMusicFavorites": "Favoritter", - "ViewTypeMusicFavoriteAlbums": "Favorittalbumer", - "ViewTypeMusicFavoriteArtists": "Favorittartister", - "ViewTypeMusicFavoriteSongs": "Favorittsanger", - "ViewTypeFolders": "Mapper", - "ViewTypeLiveTvRecordingGroups": "Opptak", - "ViewTypeLiveTvChannels": "Kanaler", - "ScheduledTaskFailedWithName": "{0} feilet", - "LabelRunningTimeValue": "Spille tide: {0}", - "ScheduledTaskStartedWithName": "{0} startet", + "AppDeviceValues": "App:{0}, Enhet {1}", + "UserDownloadingItemWithValues": "{0} laster ned {1}", + "HeaderLiveTV": "Direkte TV", + "ChapterNameValue": "Kapittel {0}", + "ScheduledTaskFailedWithName": "{0} Mislykkes", + "LabelRunningTimeValue": "L\u00f8petid {0}", + "ScheduledTaskStartedWithName": "{0} Startet", "VersionNumber": "Versjon {0}", "PluginInstalledWithName": "{0} ble installert", + "StartupEmbyServerIsLoading": "Emby server laster. Pr\u00f8v igjen snart.", "PluginUpdatedWithName": "{0} ble oppdatert", "PluginUninstalledWithName": "{0} ble avinstallert", - "ItemAddedWithName": "{0} ble lagt til biblioteket", + "ItemAddedWithName": "{0} ble lagt til i biblioteket", "ItemRemovedWithName": "{0} ble fjernet fra biblioteket", - "LabelIpAddressValue": "Ip adresse: {0}", + "LabelIpAddressValue": "IP adresse: {0}", "DeviceOnlineWithName": "{0} er tilkoblet", - "UserOnlineFromDevice": "{0} er online fra {1}", - "ProviderValue": "Tilbyder: {0}", + "UserOnlineFromDevice": "{0} er tilkoblet fra {1}", + "ProviderValue": "Leverand\u00f8rer: {0}", "SubtitlesDownloadedForItem": "Undertekster lastet ned for {0}", - "UserConfigurationUpdatedWithName": "Bruker konfigurasjon har blitt oppdatert for {0}", - "UserCreatedWithName": "Bruker {0} har blitt opprettet", - "UserPasswordChangedWithName": "Passord har blitt endret for bruker {0}", + "UserCreatedWithName": "Bruker {0} er opprettet", + "UserPasswordChangedWithName": "Passordet for {0} er oppdatert", "UserDeletedWithName": "Bruker {0} har blitt slettet", - "MessageServerConfigurationUpdated": "Server konfigurasjon har blitt oppdatert", + "UserConfigurationUpdatedWithName": "Brukerkonfigurasjon har blitt oppdatert for {0}", + "MessageServerConfigurationUpdated": "Server konfigurasjon er oppdatert", "MessageNamedServerConfigurationUpdatedWithValue": "Server konfigurasjon seksjon {0} har blitt oppdatert", "MessageApplicationUpdated": "Emby server har blitt oppdatert", - "FailedLoginAttemptWithUserName": "P\u00e5loggingsfors\u00f8k feilet fra {0}", - "AuthenticationSucceededWithUserName": "{0} autentisert med suksess", - "DeviceOfflineWithName": "{0} har koblet fra", - "UserLockedOutWithName": "User {0} has been locked out", + "FailedLoginAttemptWithUserName": "Mislykket p\u00e5loggingsfors\u00f8k fra {0}", + "AuthenticationSucceededWithUserName": "{0} vellykkede autentisert", "UserOfflineFromDevice": "{0} har koblet fra {1}", - "UserStartedPlayingItemWithValues": "{0} har startet avspilling av {1}", - "UserStoppedPlayingItemWithValues": "{0} har stoppet avspilling av {1}", - "SubtitleDownloadFailureForItem": "nedlasting av undertekster feilet for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "Bruker", - "HeaderName": "Navn", - "HeaderDate": "Dato", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Utgivelsesdato", - "HeaderRuntime": "Spilletid", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Sesong", - "HeaderSeasonNumber": "Sesong nummer", - "HeaderSeries": "Series:", - "HeaderNetwork": "Nettverk", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Fellesskap anmeldelse", - "HeaderTrailers": "Trailere", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albumer", - "HeaderDisc": "Disk", - "HeaderTrack": "Spor", - "HeaderAudio": "Lyd", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "innebygd bilde", - "HeaderResolution": "Oppl\u00f8sning", - "HeaderSubtitles": "Undertekster", - "HeaderGenres": "Sjanger", - "HeaderCountries": "Land", - "HeaderStatus": "Status", - "HeaderTracks": "Spor", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studioer", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Foreldresensur", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "DeviceOfflineWithName": "{0} har koblet fra", + "UserStartedPlayingItemWithValues": "{0} har startet avspilling {1}", + "UserStoppedPlayingItemWithValues": "{0} har stoppet avspilling {1}", + "NotificationOptionPluginError": "Plugin feil", + "NotificationOptionApplicationUpdateAvailable": "Applikasjon oppdatering tilgjengelig", + "NotificationOptionApplicationUpdateInstalled": "Applikasjon oppdatering installert.", + "NotificationOptionPluginUpdateInstalled": "Plugin oppdatering installert", + "NotificationOptionPluginInstalled": "Plugin installert", + "NotificationOptionPluginUninstalled": "Plugin avinstallert", + "NotificationOptionVideoPlayback": "Video tilbakespilling startet", + "NotificationOptionAudioPlayback": "Lyd tilbakespilling startet", + "NotificationOptionGamePlayback": "Spill avspillingen startet", + "NotificationOptionVideoPlaybackStopped": "Video avspilling stoppet", + "NotificationOptionAudioPlaybackStopped": "Lyd avspilling stoppet", + "NotificationOptionGamePlaybackStopped": "Filmer", + "NotificationOptionTaskFailed": "Feil under utf\u00f8ring av planlagt oppgaver", + "NotificationOptionInstallationFailed": "Installasjon feil", + "NotificationOptionNewLibraryContent": "Ny innhold er lagt til", + "NotificationOptionCameraImageUploaded": "Kamera bilde lastet opp", + "NotificationOptionUserLockedOut": "Bruker er utestengt", + "NotificationOptionServerRestartRequired": "Server omstart er n\u00f8dvendig", + "UserLockedOutWithName": "Bruker {0} er blitt utestengt", + "SubtitleDownloadFailureForItem": "En feil oppst\u00e5 under nedlasting av undertekster for {0}", + "Sync": "Synk", + "User": "Bruker", + "System": "System", + "Application": "Applikasjon", + "Plugin": "Plugin", + "LabelExit": "Avslutt", + "LabelVisitCommunity": "Bes\u00f8k Samfunnet", + "LabelBrowseLibrary": "Bla i biblioteket", + "LabelConfigureServer": "Konfigurere Emby", + "LabelRestartServer": "Start om serveren" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/nl.json b/Emby.Server.Implementations/Localization/Core/nl.json index 2818fbf6a6..daba9bed5c 100644 --- a/Emby.Server.Implementations/Localization/Core/nl.json +++ b/Emby.Server.Implementations/Localization/Core/nl.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Een ogenblik geduld terwijl uw Emby Server-database wordt bijgewerkt. {0}% voltooid.", + "Latest": "Nieuwste", + "ValueSpecialEpisodeName": "Speciaal - {0}", + "Inherit": "Overerven", + "Books": "Boeken", + "Music": "Muziek", + "Games": "Spellen", + "Photos": "Foto's", + "MixedContent": "Gemengde inhoud", + "MusicVideos": "Muziek video's", + "HomeVideos": "Thuis video's", + "Playlists": "Afspeellijsten", + "HeaderRecordingGroups": "Opname groepen", + "HeaderContinueWatching": "Kijken hervatten", + "HeaderFavoriteArtists": "Favoriete artiesten", + "HeaderFavoriteSongs": "Favoriete titels", + "HeaderAlbumArtists": "Album artiesten", + "HeaderFavoriteAlbums": "Favoriete albums", + "HeaderFavoriteEpisodes": "Favoriete Afleveringen", + "HeaderFavoriteShows": "Favoriete Shows", + "HeaderNextUp": "Volgende", + "Favorites": "Favorieten", + "Collections": "Collecties", + "Channels": "Kanalen", + "Movies": "Films", + "Albums": "Albums", + "Artists": "Artiesten", + "Folders": "Mappen", + "Songs": "Titels", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "Genres", + "NameSeasonNumber": "Seizoen {0}", "AppDeviceValues": "App: {0}, Apparaat: {1}", "UserDownloadingItemWithValues": "{0} download {1}", - "FolderTypeMixed": "Gemengde inhoud", - "FolderTypeMovies": "Films", - "FolderTypeMusic": "Muziek", - "FolderTypeAdultVideos": "Adult video's", - "FolderTypePhotos": "Foto's", - "FolderTypeMusicVideos": "Muziek video's", - "FolderTypeHomeVideos": "Thuis video's", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Boeken", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "overerven", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "Personen", - "ValueSpecialEpisodeName": "Speciaal - {0}", - "LabelChapterName": "Hoofdstuk {0}", - "NameSeasonNumber": "Seizoen {0}", - "LabelExit": "Afsluiten", - "LabelVisitCommunity": "Bezoek Gemeenschap", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api documentatie", - "LabelDeveloperResources": "Ontwikkelaars bronnen", - "LabelBrowseLibrary": "Bekijk bibliotheek", - "LabelConfigureServer": "Emby Configureren", - "LabelRestartServer": "Server herstarten", - "CategorySync": "Sync", - "CategoryUser": "Gebruiker", - "CategorySystem": "Systeem", - "CategoryApplication": "Toepassing", - "CategoryPlugin": "Plug-in", - "NotificationOptionPluginError": "Plug-in fout", - "NotificationOptionApplicationUpdateAvailable": "Programma-update beschikbaar", - "NotificationOptionApplicationUpdateInstalled": "Programma-update ge\u00efnstalleerd", - "NotificationOptionPluginUpdateInstalled": "Plug-in-update ge\u00efnstalleerd", - "NotificationOptionPluginInstalled": "Plug-in ge\u00efnstalleerd", - "NotificationOptionPluginUninstalled": "Plug-in verwijderd", - "NotificationOptionVideoPlayback": "Video afspelen gestart", - "NotificationOptionAudioPlayback": "Geluid afspelen gestart", - "NotificationOptionGamePlayback": "Game gestart", - "NotificationOptionVideoPlaybackStopped": "Video afspelen gestopt", - "NotificationOptionAudioPlaybackStopped": "Geluid afspelen gestopt", - "NotificationOptionGamePlaybackStopped": "Afspelen spel gestopt", - "NotificationOptionTaskFailed": "Mislukken van de geplande taak", - "NotificationOptionInstallationFailed": "Mislukken van de installatie", - "NotificationOptionNewLibraryContent": "Nieuwe content toegevoegd", - "NotificationOptionNewLibraryContentMultiple": "Nieuwe content toegevoegd (meerdere)", - "NotificationOptionCameraImageUploaded": "Camera afbeelding ge\u00fcpload", - "NotificationOptionUserLockedOut": "Gebruikersaccount vergrendeld", - "NotificationOptionServerRestartRequired": "Server herstart nodig", - "ViewTypePlaylists": "Afspeellijsten", - "ViewTypeMovies": "Films", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Muziek", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artiesten", - "ViewTypeBoxSets": "Collecties", - "ViewTypeChannels": "Kanalen", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Nu uitgezonden", - "ViewTypeLatestGames": "Nieuwste games", - "ViewTypeRecentlyPlayedGames": "Recent gespeelt", - "ViewTypeGameFavorites": "Favorieten", - "ViewTypeGameSystems": "Game systemen", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Hervatten", - "ViewTypeTvNextUp": "Volgende", - "ViewTypeTvLatest": "Nieuwste", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favoriete Series", - "ViewTypeTvFavoriteEpisodes": "Favoriete Afleveringen", - "ViewTypeMovieResume": "Hervatten", - "ViewTypeMovieLatest": "Nieuwste", - "ViewTypeMovieMovies": "Films", - "ViewTypeMovieCollections": "Collecties", - "ViewTypeMovieFavorites": "Favorieten", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Nieuwste", - "ViewTypeMusicPlaylists": "Afspeellijsten", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album artiesten", - "HeaderOtherDisplaySettings": "Beeld instellingen", - "ViewTypeMusicSongs": "Nummers", - "ViewTypeMusicFavorites": "Favorieten", - "ViewTypeMusicFavoriteAlbums": "Favoriete albums", - "ViewTypeMusicFavoriteArtists": "Favoriete artiesten", - "ViewTypeMusicFavoriteSongs": "Favoriete nummers", - "ViewTypeFolders": "Mappen", - "ViewTypeLiveTvRecordingGroups": "Opnamen", - "ViewTypeLiveTvChannels": "Kanalen", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Hoofdstuk {0}", "ScheduledTaskFailedWithName": "{0} is mislukt", "LabelRunningTimeValue": "Looptijd: {0}", "ScheduledTaskStartedWithName": "{0} is gestart", "VersionNumber": "Versie {0}", "PluginInstalledWithName": "{0} is ge\u00efnstalleerd", + "StartupEmbyServerIsLoading": "Emby Server is aan het laden, probeer het later opnieuw.", "PluginUpdatedWithName": "{0} is bijgewerkt", "PluginUninstalledWithName": "{0} is gede\u00efnstalleerd", "ItemAddedWithName": "{0} is toegevoegd aan de bibliotheek", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} heeft verbinding met {1}", "ProviderValue": "Aanbieder: {0}", "SubtitlesDownloadedForItem": "Ondertiteling voor {0} is gedownload", - "UserConfigurationUpdatedWithName": "Gebruikersinstellingen voor {0} zijn bijgewerkt", "UserCreatedWithName": "Gebruiker {0} is aangemaakt", "UserPasswordChangedWithName": "Wachtwoord voor {0} is gewijzigd", "UserDeletedWithName": "Gebruiker {0} is verwijderd", + "UserConfigurationUpdatedWithName": "Gebruikersinstellingen voor {0} zijn bijgewerkt", "MessageServerConfigurationUpdated": "Server configuratie is bijgewerkt", "MessageNamedServerConfigurationUpdatedWithValue": "Sectie {0} van de server configuratie is bijgewerkt", "MessageApplicationUpdated": "Emby Server is bijgewerkt", "FailedLoginAttemptWithUserName": "Mislukte aanmeld poging van {0}", "AuthenticationSucceededWithUserName": "{0} is succesvol geverifieerd", - "DeviceOfflineWithName": "{0} is losgekoppeld", - "UserLockedOutWithName": "Gebruikersaccount {0} is vergrendeld", "UserOfflineFromDevice": "Verbinding van {0} met {1} is verbroken", + "DeviceOfflineWithName": "{0} is losgekoppeld", "UserStartedPlayingItemWithValues": "{0} heeft afspelen van {1} gestart", "UserStoppedPlayingItemWithValues": "{0} heeft afspelen van {1} gestopt", + "NotificationOptionPluginError": "Plug-in fout", + "NotificationOptionApplicationUpdateAvailable": "Programma-update beschikbaar", + "NotificationOptionApplicationUpdateInstalled": "Programma-update ge\u00efnstalleerd", + "NotificationOptionPluginUpdateInstalled": "Plug-in-update ge\u00efnstalleerd", + "NotificationOptionPluginInstalled": "Plug-in ge\u00efnstalleerd", + "NotificationOptionPluginUninstalled": "Plug-in verwijderd", + "NotificationOptionVideoPlayback": "Video gestart", + "NotificationOptionAudioPlayback": "Geluid gestart", + "NotificationOptionGamePlayback": "Spel gestart", + "NotificationOptionVideoPlaybackStopped": "Video gestopt", + "NotificationOptionAudioPlaybackStopped": "Geluid gestopt", + "NotificationOptionGamePlaybackStopped": "Spel gestopt", + "NotificationOptionTaskFailed": "Geplande taak mislukt", + "NotificationOptionInstallationFailed": "Installatie mislukt", + "NotificationOptionNewLibraryContent": "Nieuwe content toegevoegd", + "NotificationOptionCameraImageUploaded": "Camera afbeelding ge\u00fcpload", + "NotificationOptionUserLockedOut": "Gebruikersaccount vergrendeld", + "NotificationOptionServerRestartRequired": "Server herstart nodig", + "UserLockedOutWithName": "Gebruikersaccount {0} is vergrendeld", "SubtitleDownloadFailureForItem": "Downloaden van ondertiteling voor {0} is mislukt", - "HeaderUnidentified": "One\u00efdentificaard", - "HeaderImagePrimary": "Primair", - "HeaderImageBackdrop": "Achtergrond", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Afbeelding gebruiker", - "HeaderOverview": "Overzicht", - "HeaderShortOverview": "Kort overzicht", - "HeaderType": "Type", - "HeaderSeverity": "Ernst", - "HeaderUser": "Gebruiker", - "HeaderName": "Naam", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premi\u00e8re Datum", - "HeaderDateAdded": "Datum toegevoegd", - "HeaderReleaseDate": "Uitgave datum", - "HeaderRuntime": "Speelduur", - "HeaderPlayCount": "Afspeel telling", - "HeaderSeason": "Seizoen", - "HeaderSeasonNumber": "Seizoen nummer", - "HeaderSeries": "Series:", - "HeaderNetwork": "Zender", - "HeaderYear": "Jaar:", - "HeaderYears": "Jaren:", - "HeaderParentalRating": "Kijkwijzer classificatie", - "HeaderCommunityRating": "Gemeenschap cijfer", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game systemen", - "HeaderPlayers": "Spelers:", - "HeaderAlbumArtists": "Album artiesten", - "HeaderAlbums": "Albums", - "HeaderDisc": "Schijf", - "HeaderTrack": "Track", - "HeaderAudio": "Geluid", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Ingesloten afbeelding", - "HeaderResolution": "Resolutie", - "HeaderSubtitles": "Ondertiteling", - "HeaderGenres": "Genres", - "HeaderCountries": "Landen", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Muziek artiest", - "HeaderLocked": "Vergrendeld", - "HeaderStudios": "Studio's", - "HeaderActor": "Acteurs", - "HeaderComposer": "Componisten", - "HeaderDirector": "Regiseurs", - "HeaderGuestStar": "Gast ster", - "HeaderProducer": "Producenten", - "HeaderWriter": "Schrijvers", - "HeaderParentalRatings": "Ouderlijke toezicht", - "HeaderCommunityRatings": "Gemeenschapswaardering", - "StartupEmbyServerIsLoading": "Emby Server is aan het laden, probeer het later opnieuw." + "Sync": "Synchronisatie", + "User": "Gebruiker", + "System": "Systeem", + "Application": "Toepassing", + "Plugin": "Plug-in", + "LabelExit": "Afsluiten", + "LabelVisitCommunity": "Bezoek Gemeenschap", + "LabelBrowseLibrary": "Bekijk bibliotheek", + "LabelConfigureServer": "Emby Configureren", + "LabelRestartServer": "Server herstarten" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/pl.json b/Emby.Server.Implementations/Localization/Core/pl.json index cdaa87c4d8..24ac0d973e 100644 --- a/Emby.Server.Implementations/Localization/Core/pl.json +++ b/Emby.Server.Implementations/Localization/Core/pl.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Prosz\u0119 czeka\u0107 na koniec aktualizacji biblioteki. Post\u0119p: {0}%", + "Latest": "Ostatnio dodane do", + "ValueSpecialEpisodeName": "Specjalne - {0}", + "Inherit": "Dziedzicz", + "Books": "Ksi\u0105\u017cki", + "Music": "Muzyka", + "Games": "Gry", + "Photos": "Zdj\u0119cia", + "MixedContent": "Zawarto\u015b\u0107 mieszana", + "MusicVideos": "Teledyski", + "HomeVideos": "Nagrania prywatne", + "Playlists": "Listy odtwarzania", + "HeaderRecordingGroups": "Grupy nagra\u0144", + "HeaderContinueWatching": "Kontynuuj ogl\u0105danie", + "HeaderFavoriteArtists": "Wykonawcy ulubieni", + "HeaderFavoriteSongs": "Utwory ulubione", + "HeaderAlbumArtists": "Wykonawcy album\u00f3w", + "HeaderFavoriteAlbums": "Albumy ulubione", + "HeaderFavoriteEpisodes": "Odcinki ulubione", + "HeaderFavoriteShows": "Seriale ulubione", + "HeaderNextUp": "Do obejrzenia", + "Favorites": "Ulubione", + "Collections": "Kolekcje", + "Channels": "Kana\u0142y", + "Movies": "Filmy", + "Albums": "Albumy", + "Artists": "Wykonawcy", + "Folders": "Foldery", + "Songs": "Utwory", + "TvShows": "TV Shows", + "Shows": "Seriale", + "Genres": "Gatunki", + "NameSeasonNumber": "Sezon {0}", "AppDeviceValues": "Aplikacja: {0}, Urz\u0105dzenie: {1}", "UserDownloadingItemWithValues": "{0} pobiera {1}", - "FolderTypeMixed": "Zawarto\u015b\u0107 mieszana", - "FolderTypeMovies": "Filmy", - "FolderTypeMusic": "Muzyka", - "FolderTypeAdultVideos": "Filmy dla doros\u0142ych", - "FolderTypePhotos": "Zdj\u0119cia", - "FolderTypeMusicVideos": "Teledyski", - "FolderTypeHomeVideos": "Filmy domowe", - "FolderTypeGames": "Gry", - "FolderTypeBooks": "Ksi\u0105\u017cki", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Dziedzicz", - "HeaderCastCrew": "Obsada & Eikpa", - "HeaderPeople": "Ludzie", - "ValueSpecialEpisodeName": "Specjalny - {0}", - "LabelChapterName": "Rozdzia\u0142 {0}", - "NameSeasonNumber": "Sezon {0}", - "LabelExit": "Wyj\u015bcie", - "LabelVisitCommunity": "Odwied\u017a spo\u0142eczno\u015b\u0107", - "LabelGithub": "Github", - "LabelApiDocumentation": "Dokumantacja API", - "LabelDeveloperResources": "Materia\u0142y dla deweloper\u00f3w", - "LabelBrowseLibrary": "Przegl\u0105daj bibliotek\u0119", - "LabelConfigureServer": "Konfiguracja Emby", - "LabelRestartServer": "Restart serwera", - "CategorySync": "Sync", - "CategoryUser": "U\u017cytkownik", - "CategorySystem": "System", - "CategoryApplication": "Aplikacja", - "CategoryPlugin": "Wtyczka", - "NotificationOptionPluginError": "Niepowodzenie wtyczki", + "HeaderLiveTV": "Telewizja", + "ChapterNameValue": "Rozdzia\u0142 {0}", + "ScheduledTaskFailedWithName": "Nieudane {0}", + "LabelRunningTimeValue": "Czas trwania: {0}", + "ScheduledTaskStartedWithName": "Rozpocz\u0119to {0}", + "VersionNumber": "Wersja {0}", + "PluginInstalledWithName": "{0} zosta\u0142o zainstalowane", + "StartupEmbyServerIsLoading": "Twa wczytywanie serwera Emby. Spr\u00f3buj ponownie za chwil\u0119.", + "PluginUpdatedWithName": "{0} zaktualizowane", + "PluginUninstalledWithName": "{0} odinstalowane", + "ItemAddedWithName": "{0} zosta\u0142o dodane do biblioteki", + "ItemRemovedWithName": "{0} zosta\u0142o usuni\u0119te z biblioteki", + "LabelIpAddressValue": "Adres IP: {0}", + "DeviceOnlineWithName": "{0} po\u0142\u0105czy\u0142 si\u0119", + "UserOnlineFromDevice": "{0} po\u0142\u0105czy\u0142 si\u0119 z {1}", + "ProviderValue": "Dostawca: {0}", + "SubtitlesDownloadedForItem": "Pobrano napisy dla {0}", + "UserCreatedWithName": "U\u017cytkownik {0} zosta\u0142 utworzony", + "UserPasswordChangedWithName": "Has\u0142o u\u017cytkownika {0} zosta\u0142o zmienione", + "UserDeletedWithName": "U\u017cytkownik {0} zosta\u0142 usuni\u0119ty", + "UserConfigurationUpdatedWithName": "Konfiguracja u\u017cytkownika {0} zosta\u0142a zaktualizowana", + "MessageServerConfigurationUpdated": "Konfiguracja serwera zosta\u0142a zaktualizowana", + "MessageNamedServerConfigurationUpdatedWithValue": "Sekcja {0} konfiguracji serwera zosta\u0142a zaktualizowana", + "MessageApplicationUpdated": "Serwer Emby zosta\u0142 zaktualizowany", + "FailedLoginAttemptWithUserName": "Pr\u00f3ba logowania przez {0} zako\u0144czona niepowodzeniem", + "AuthenticationSucceededWithUserName": "{0} zosta\u0142 pomy\u015blnie uwierzytelniony", + "UserOfflineFromDevice": "{0} z {1} zosta\u0142 roz\u0142\u0105czony", + "DeviceOfflineWithName": "{0} zosta\u0142 roz\u0142\u0105czony", + "UserStartedPlayingItemWithValues": "{0} rozpocz\u0105\u0142 odtwarzanie {1}", + "UserStoppedPlayingItemWithValues": "{0} zatrzyma\u0142 odtwarzanie {1}", + "NotificationOptionPluginError": "Awaria wtyczki", "NotificationOptionApplicationUpdateAvailable": "Dost\u0119pna aktualizacja aplikacji", "NotificationOptionApplicationUpdateInstalled": "Zainstalowano aktualizacj\u0119 aplikacji", "NotificationOptionPluginUpdateInstalled": "Zainstalowano aktualizacj\u0119 wtyczki", "NotificationOptionPluginInstalled": "Zainstalowano wtyczk\u0119", "NotificationOptionPluginUninstalled": "Odinstalowano wtyczk\u0119", "NotificationOptionVideoPlayback": "Rozpocz\u0119to odtwarzanie wideo", - "NotificationOptionAudioPlayback": "Rozpocz\u0119to odtwarzanie audio", + "NotificationOptionAudioPlayback": "Rozpocz\u0119to odtwarzanie muzyki", "NotificationOptionGamePlayback": "Odtwarzanie gry rozpocz\u0119te", "NotificationOptionVideoPlaybackStopped": "Odtwarzanie wideo zatrzymane", - "NotificationOptionAudioPlaybackStopped": "Odtwarzane audio zatrzymane", + "NotificationOptionAudioPlaybackStopped": "Odtwarzane d\u017awi\u0119ku zatrzymane", "NotificationOptionGamePlaybackStopped": "Odtwarzanie gry zatrzymane", - "NotificationOptionTaskFailed": "Niepowodzenie zaplanowanego zadania", + "NotificationOptionTaskFailed": "Awaria zaplanowanego zadania", "NotificationOptionInstallationFailed": "Niepowodzenie instalacji", - "NotificationOptionNewLibraryContent": "Nowa zawarto\u015b\u0107 dodana", - "NotificationOptionNewLibraryContentMultiple": "Nowa zawarto\u015b\u0107 dodana (wiele)", - "NotificationOptionCameraImageUploaded": "Obraz z Kamery dodany", + "NotificationOptionNewLibraryContent": "Dodano now\u0105 zawarto\u015b\u0107", + "NotificationOptionCameraImageUploaded": "Przekazano obraz z urz\u0105dzenia mobilnego", "NotificationOptionUserLockedOut": "U\u017cytkownik zablokowany", - "NotificationOptionServerRestartRequired": "Restart serwera wymagany", - "ViewTypePlaylists": "Playlisty", - "ViewTypeMovies": "Filmy", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Gry", - "ViewTypeMusic": "Muzyka", - "ViewTypeMusicGenres": "Gatunki", - "ViewTypeMusicArtists": "Arty\u015bci", - "ViewTypeBoxSets": "Kolekcje", - "ViewTypeChannels": "Kana\u0142y", - "ViewTypeLiveTV": "TV Na \u017bywo", - "ViewTypeLiveTvNowPlaying": "Teraz Transmitowane", - "ViewTypeLatestGames": "Ostatnie Gry", - "ViewTypeRecentlyPlayedGames": "Ostatnio Odtwarzane", - "ViewTypeGameFavorites": "Ulubione", - "ViewTypeGameSystems": "Systemy Gier Wideo", - "ViewTypeGameGenres": "Gatunki", - "ViewTypeTvResume": "Wzn\u00f3w", - "ViewTypeTvNextUp": "Nast\u0119pny", - "ViewTypeTvLatest": "Najnowsze", - "ViewTypeTvShowSeries": "Seriale", - "ViewTypeTvGenres": "Gatunki", - "ViewTypeTvFavoriteSeries": "Ulubione Seriale", - "ViewTypeTvFavoriteEpisodes": "Ulubione Odcinki", - "ViewTypeMovieResume": "Wzn\u00f3w", - "ViewTypeMovieLatest": "Najnowsze", - "ViewTypeMovieMovies": "Filmy", - "ViewTypeMovieCollections": "Kolekcje", - "ViewTypeMovieFavorites": "Ulubione", - "ViewTypeMovieGenres": "Gatunki", - "ViewTypeMusicLatest": "Najnowsze", - "ViewTypeMusicPlaylists": "Playlisty", - "ViewTypeMusicAlbums": "Albumy", - "ViewTypeMusicAlbumArtists": "Arty\u015bci albumu", - "HeaderOtherDisplaySettings": "Ustawienia Wy\u015bwietlania", - "ViewTypeMusicSongs": "Utwory", - "ViewTypeMusicFavorites": "Ulubione", - "ViewTypeMusicFavoriteAlbums": "Ulubione Albumy", - "ViewTypeMusicFavoriteArtists": "Ulubieni Arty\u015bci", - "ViewTypeMusicFavoriteSongs": "Ulubione Utwory", - "ViewTypeFolders": "Foldery", - "ViewTypeLiveTvRecordingGroups": "Nagrania", - "ViewTypeLiveTvChannels": "Kana\u0142y", - "ScheduledTaskFailedWithName": "{0} niepowodze\u0144", - "LabelRunningTimeValue": "Czas trwania: {0}", - "ScheduledTaskStartedWithName": "{0} rozpocz\u0119te", - "VersionNumber": "Wersja {0}", - "PluginInstalledWithName": "{0} zainstalowanych", - "PluginUpdatedWithName": "{0} zaktualizowanych", - "PluginUninstalledWithName": "{0} odinstalowanych", - "ItemAddedWithName": "{0} dodanych do biblioteki", - "ItemRemovedWithName": "{0} usuni\u0119tych z biblioteki", - "LabelIpAddressValue": "Adres IP: {0}", - "DeviceOnlineWithName": "{0} po\u0142\u0105czonych", - "UserOnlineFromDevice": "{0} jest online od {1}", - "ProviderValue": "Dostawca: {0}", - "SubtitlesDownloadedForItem": "Napisy pobrane dla {0}", - "UserConfigurationUpdatedWithName": "Konfiguracja u\u017cytkownika zosta\u0142a zaktualizowana dla {0}", - "UserCreatedWithName": "U\u017cytkownik {0} zosta\u0142 utworzony", - "UserPasswordChangedWithName": "Has\u0142o zosta\u0142o zmienione dla u\u017cytkownika {0}", - "UserDeletedWithName": "u\u017cytkownik {0} zosta\u0142 usuni\u0119ty", - "MessageServerConfigurationUpdated": "Konfiguracja serwera zosta\u0142a zaktualizowana", - "MessageNamedServerConfigurationUpdatedWithValue": "Sekcja {0} konfiguracji serwera zosta\u0142a zaktualizowana", - "MessageApplicationUpdated": "Serwer Emby zosta\u0142 zaktualizowany", - "FailedLoginAttemptWithUserName": "Nieudana pr\u00f3ba logowania z {0}", - "AuthenticationSucceededWithUserName": "{0} zaktualizowanych z powodzeniem", - "DeviceOfflineWithName": "{0} zosta\u0142o od\u0142aczonych", + "NotificationOptionServerRestartRequired": "Wymagane ponowne uruchomienie serwera", "UserLockedOutWithName": "U\u017cytkownik {0} zosta\u0142 zablokowany", - "UserOfflineFromDevice": "{0} zosta\u0142o od\u0142\u0105czonych od {1}", - "UserStartedPlayingItemWithValues": "{0} rozpocz\u0105\u0142 odtwarzanie {1}", - "UserStoppedPlayingItemWithValues": "{0} zatrzyma\u0142 odtwarzanie {1}", - "SubtitleDownloadFailureForItem": "Napisy niepobrane dla {0}", - "HeaderUnidentified": "Niezidentyfikowane", - "HeaderImagePrimary": "Priorytetowy", - "HeaderImageBackdrop": "Obraz t\u0142a", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Avatar u\u017cytkownika", - "HeaderOverview": "Opis", - "HeaderShortOverview": "Kr\u00f3tki Opis", - "HeaderType": "Typ", - "HeaderSeverity": "Rygor", - "HeaderUser": "U\u017cytkownik", - "HeaderName": "Nazwa", - "HeaderDate": "Data", - "HeaderPremiereDate": "Data premiery", - "HeaderDateAdded": "Data dodania", - "HeaderReleaseDate": "Data wydania", - "HeaderRuntime": "D\u0142ugo\u015b\u0107 filmu", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Sezon", - "HeaderSeasonNumber": "Numer sezonu", - "HeaderSeries": "Seriale:", - "HeaderNetwork": "Sie\u0107", - "HeaderYear": "Rok:", - "HeaderYears": "Lata:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Ocena spo\u0142eczno\u015bci", - "HeaderTrailers": "Zwiastuny", - "HeaderSpecials": "Specjalne", - "HeaderGameSystems": "Systemy gier", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albumy", - "HeaderDisc": "P\u0142yta", - "HeaderTrack": "\u015acie\u017cka", - "HeaderAudio": "Audio", - "HeaderVideo": "Wideo", - "HeaderEmbeddedImage": "Osadzony obraz", - "HeaderResolution": "Rozdzielczo\u015b\u0107", - "HeaderSubtitles": "Napisy", - "HeaderGenres": "Gatunki", - "HeaderCountries": "Kraje", - "HeaderStatus": "Status", - "HeaderTracks": "Utwory", - "HeaderMusicArtist": "Wykonawcy muzyczni", - "HeaderLocked": "Zablokowane", - "HeaderStudios": "Studia", - "HeaderActor": "Aktorzy", - "HeaderComposer": "Kopozytorzy", - "HeaderDirector": "Re\u017cyszerzy", - "HeaderGuestStar": "Go\u015b\u0107 specjalny", - "HeaderProducer": "Producenci", - "HeaderWriter": "Scenarzy\u015bci", - "HeaderParentalRatings": "Ocena rodzicielska", - "HeaderCommunityRatings": "Ocena spo\u0142eczno\u015bci", - "StartupEmbyServerIsLoading": "Serwer Emby si\u0119 \u0142aduje. Prosz\u0119 spr\u00f3bowa\u0107 za chwil\u0119." + "SubtitleDownloadFailureForItem": "Pobieranie napis\u00f3w dla {0} zako\u0144czone niepowodzeniem", + "Sync": "Synchronizacja", + "User": "U\u017cytkownik", + "System": "System", + "Application": "Aplikacja", + "Plugin": "Wtyczka", + "LabelExit": "Wyj\u015bcie", + "LabelVisitCommunity": "Odwied\u017a spo\u0142eczno\u015b\u0107", + "LabelBrowseLibrary": "Przegl\u0105daj bibliotek\u0119", + "LabelConfigureServer": "Konfiguracja Emby", + "LabelRestartServer": "Uruchom serwer ponownie" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/pt-BR.json b/Emby.Server.Implementations/Localization/Core/pt-BR.json index 67f204b2ee..196a6b78b3 100644 --- a/Emby.Server.Implementations/Localization/Core/pt-BR.json +++ b/Emby.Server.Implementations/Localization/Core/pt-BR.json @@ -1,40 +1,72 @@ { - "DbUpgradeMessage": "Por favor, aguarde enquanto a base de dados do Servidor Emby \u00e9 atualizada. {0}% completo.", - "AppDeviceValues": "App: {0}, Dispositivo: {1}", - "UserDownloadingItemWithValues": "{0} est\u00e1 fazendo download de {1}", - "FolderTypeMixed": "Conte\u00fado misto", - "FolderTypeMovies": "Filmes", - "FolderTypeMusic": "M\u00fasica", - "FolderTypeAdultVideos": "V\u00eddeos adultos", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "V\u00eddeos musicais", - "FolderTypeHomeVideos": "V\u00eddeos caseiros", - "FolderTypeGames": "Jogos", - "FolderTypeBooks": "Livros", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Herdar", - "HeaderCastCrew": "Elenco & Equipe", - "HeaderPeople": "Pessoas", - "ValueSpecialEpisodeName": "Especial - {0}", - "LabelChapterName": "Cap\u00edtulo {0}", + "Latest": "Recente", + "ValueSpecialEpisodeName": "Especial - {0}", + "Inherit": "Herdar", + "Books": "Livros", + "Music": "M\u00fasica", + "Games": "Jogos", + "Photos": "Fotos", + "MixedContent": "Conte\u00fado misto", + "MusicVideos": "V\u00eddeos musicais", + "HomeVideos": "V\u00eddeos caseiros", + "Playlists": "Listas de Reprodu\u00e7\u00e3o", + "HeaderRecordingGroups": "Grupos de Grava\u00e7\u00e3o", + "HeaderContinueWatching": "Continuar Assistindo", + "HeaderFavoriteArtists": "Artistas Favoritos", + "HeaderFavoriteSongs": "M\u00fasicas Favoritas", + "HeaderAlbumArtists": "Artistas do \u00c1lbum", + "HeaderFavoriteAlbums": "\u00c1lbuns Favoritos", + "HeaderFavoriteEpisodes": "Epis\u00f3dios Favoritos", + "HeaderFavoriteShows": "S\u00e9ries Favoritas", + "HeaderNextUp": "Pr\u00f3ximos", + "Favorites": "Favoritos", + "Collections": "Colet\u00e2neas", + "Channels": "Canais", + "Movies": "Filmes", + "Albums": "\u00c1lbuns", + "Artists": "Artistas", + "Folders": "Pastas", + "Songs": "M\u00fasicas", + "TvShows": "TV Shows", + "Shows": "S\u00e9ries", + "Genres": "G\u00eaneros", "NameSeasonNumber": "Temporada {0}", - "LabelExit": "Sair", - "LabelVisitCommunity": "Visitar a Comunidade", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documenta\u00e7\u00e3o da Api", - "LabelDeveloperResources": "Recursos do Desenvolvedor", - "LabelBrowseLibrary": "Explorar Biblioteca", - "LabelConfigureServer": "Configurar o Emby", - "LabelRestartServer": "Reiniciar Servidor", - "CategorySync": "Sincroniza\u00e7\u00e3o", - "CategoryUser": "Usu\u00e1rio", - "CategorySystem": "Sistema", - "CategoryApplication": "Aplica\u00e7\u00e3o", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Falha no plugin", - "NotificationOptionApplicationUpdateAvailable": "Atualiza\u00e7\u00e3o da aplica\u00e7\u00e3o disponivel", - "NotificationOptionApplicationUpdateInstalled": "Atualiza\u00e7\u00e3o da aplica\u00e7\u00e3o instalada", - "NotificationOptionPluginUpdateInstalled": "Atualiza\u00e7\u00e3o do plugin instalada", + "AppDeviceValues": "App: {0}, Dispositivo: {1}", + "UserDownloadingItemWithValues": "{0} est\u00e1 baixando {1}", + "HeaderLiveTV": "TV ao Vivo", + "ChapterNameValue": "Cap\u00edtulo {0}", + "ScheduledTaskFailedWithName": "{0} falhou", + "LabelRunningTimeValue": "Tempo de execu\u00e7\u00e3o: {0}", + "ScheduledTaskStartedWithName": "{0} iniciada", + "VersionNumber": "Vers\u00e3o {0}", + "PluginInstalledWithName": "{0} foi instalado", + "StartupEmbyServerIsLoading": "O Servidor Emby est\u00e1 carregando. Por favor tente novamente em breve.", + "PluginUpdatedWithName": "{0} foi atualizado", + "PluginUninstalledWithName": "{0} foi desinstalado", + "ItemAddedWithName": "{0} foi adicionado \u00e0 biblioteca", + "ItemRemovedWithName": "{0} foi removido da biblioteca", + "LabelIpAddressValue": "Endere\u00e7o ip: {0}", + "DeviceOnlineWithName": "{0} est\u00e1 conectado", + "UserOnlineFromDevice": "{0} est\u00e1 ativo em {1}", + "ProviderValue": "Provedor: {0}", + "SubtitlesDownloadedForItem": "Legendas baixadas para {0}", + "UserCreatedWithName": "O usu\u00e1rio {0} foi criado", + "UserPasswordChangedWithName": "A senha foi alterada para o usu\u00e1rio {0}", + "UserDeletedWithName": "O usu\u00e1rio {0} foi exclu\u00eddo", + "UserConfigurationUpdatedWithName": "A configura\u00e7\u00e3o do usu\u00e1rio foi atualizada para {0}", + "MessageServerConfigurationUpdated": "A configura\u00e7\u00e3o do servidor foi atualizada", + "MessageNamedServerConfigurationUpdatedWithValue": "A se\u00e7\u00e3o {0} da configura\u00e7\u00e3o do servidor foi atualizada", + "MessageApplicationUpdated": "O servidor Emby foi atualizado", + "FailedLoginAttemptWithUserName": "Falha na tentativa de login de {0}", + "AuthenticationSucceededWithUserName": "{0} autenticado com sucesso", + "UserOfflineFromDevice": "{0} se desconectou de {1}", + "DeviceOfflineWithName": "{0} se desconectou", + "UserStartedPlayingItemWithValues": "{0} iniciou a reprodu\u00e7\u00e3o de {1}", + "UserStoppedPlayingItemWithValues": "{0} parou de reproduzir {1}", + "NotificationOptionPluginError": "Falha de plugin", + "NotificationOptionApplicationUpdateAvailable": "Atualiza\u00e7\u00e3o de aplicativo dispon\u00edvel", + "NotificationOptionApplicationUpdateInstalled": "Atualiza\u00e7\u00e3o de aplicativo instalada", + "NotificationOptionPluginUpdateInstalled": "Atualiza\u00e7\u00e3o de plugin instalada", "NotificationOptionPluginInstalled": "Plugin instalado", "NotificationOptionPluginUninstalled": "Plugin desinstalado", "NotificationOptionVideoPlayback": "Reprodu\u00e7\u00e3o de v\u00eddeo iniciada", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "Falha na tarefa agendada", "NotificationOptionInstallationFailed": "Falha na instala\u00e7\u00e3o", "NotificationOptionNewLibraryContent": "Novo conte\u00fado adicionado", - "NotificationOptionNewLibraryContentMultiple": "Novo conte\u00fado adicionado (m\u00faltiplo)", - "NotificationOptionCameraImageUploaded": "Imagem da c\u00e2mera carregada", + "NotificationOptionCameraImageUploaded": "Imagem de c\u00e2mera enviada", "NotificationOptionUserLockedOut": "Usu\u00e1rio bloqueado", - "NotificationOptionServerRestartRequired": "Necessidade de reiniciar servidor", - "ViewTypePlaylists": "Listas de Reprodu\u00e7\u00e3o", - "ViewTypeMovies": "Filmes", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Jogos", - "ViewTypeMusic": "M\u00fasicas", - "ViewTypeMusicGenres": "G\u00eaneros", - "ViewTypeMusicArtists": "Artistas", - "ViewTypeBoxSets": "Cole\u00e7\u00f5es", - "ViewTypeChannels": "Canais", - "ViewTypeLiveTV": "TV ao Vivo", - "ViewTypeLiveTvNowPlaying": "Exibindo Agora", - "ViewTypeLatestGames": "Jogos Recentes", - "ViewTypeRecentlyPlayedGames": "Reproduzido Recentemente", - "ViewTypeGameFavorites": "Favoritos", - "ViewTypeGameSystems": "Sistemas de Jogo", - "ViewTypeGameGenres": "G\u00eaneros", - "ViewTypeTvResume": "Retomar", - "ViewTypeTvNextUp": "Pr\u00f3ximos", - "ViewTypeTvLatest": "Recentes", - "ViewTypeTvShowSeries": "S\u00e9ries", - "ViewTypeTvGenres": "G\u00eaneros", - "ViewTypeTvFavoriteSeries": "S\u00e9ries Favoritas", - "ViewTypeTvFavoriteEpisodes": "Epis\u00f3dios Favoritos", - "ViewTypeMovieResume": "Retomar", - "ViewTypeMovieLatest": "Recentes", - "ViewTypeMovieMovies": "Filmes", - "ViewTypeMovieCollections": "Cole\u00e7\u00f5es", - "ViewTypeMovieFavorites": "Favoritos", - "ViewTypeMovieGenres": "G\u00eaneros", - "ViewTypeMusicLatest": "Recentes", - "ViewTypeMusicPlaylists": "Listas de Reprodu\u00e7\u00e3o", - "ViewTypeMusicAlbums": "\u00c1lbuns", - "ViewTypeMusicAlbumArtists": "Artistas do \u00c1lbum", - "HeaderOtherDisplaySettings": "Ajustes de Exibi\u00e7\u00e3o", - "ViewTypeMusicSongs": "M\u00fasicas", - "ViewTypeMusicFavorites": "Favoritos", - "ViewTypeMusicFavoriteAlbums": "\u00c1lbuns Favoritos", - "ViewTypeMusicFavoriteArtists": "Artistas Favoritos", - "ViewTypeMusicFavoriteSongs": "M\u00fasicas Favoritas", - "ViewTypeFolders": "Pastas", - "ViewTypeLiveTvRecordingGroups": "Grava\u00e7\u00f5es", - "ViewTypeLiveTvChannels": "Canais", - "ScheduledTaskFailedWithName": "{0} falhou", - "LabelRunningTimeValue": "Dura\u00e7\u00e3o: {0}", - "ScheduledTaskStartedWithName": "{0} iniciado", - "VersionNumber": "Vers\u00e3o {0}", - "PluginInstalledWithName": "{0} foi instalado", - "PluginUpdatedWithName": "{0} foi atualizado", - "PluginUninstalledWithName": "{0} foi desinstalado", - "ItemAddedWithName": "{0} foi adicionado \u00e0 biblioteca", - "ItemRemovedWithName": "{0} foi removido da biblioteca", - "LabelIpAddressValue": "Endere\u00e7o Ip: {0}", - "DeviceOnlineWithName": "{0} est\u00e1 conectado", - "UserOnlineFromDevice": "{0} est\u00e1 ativo em {1}", - "ProviderValue": "Provedor: {0}", - "SubtitlesDownloadedForItem": "Legendas baixadas para {0}", - "UserConfigurationUpdatedWithName": "A configura\u00e7\u00e3o do usu\u00e1rio {0} foi atualizada", - "UserCreatedWithName": "O usu\u00e1rio {0} foi criado", - "UserPasswordChangedWithName": "A senha do usu\u00e1rio {0} foi alterada", - "UserDeletedWithName": "O usu\u00e1rio {0} foi exclu\u00eddo", - "MessageServerConfigurationUpdated": "A configura\u00e7\u00e3o do servidor foi atualizada", - "MessageNamedServerConfigurationUpdatedWithValue": "A se\u00e7\u00e3o {0} da configura\u00e7\u00e3o do servidor foi atualizada", - "MessageApplicationUpdated": "O Servidor Emby foi atualizado", - "FailedLoginAttemptWithUserName": "Falha na tentativa de login de {0}", - "AuthenticationSucceededWithUserName": "{0} autenticou-se com sucesso", - "DeviceOfflineWithName": "{0} foi desconectado", + "NotificationOptionServerRestartRequired": "Necess\u00e1rio reiniciar servidor", "UserLockedOutWithName": "Usu\u00e1rio {0} foi bloqueado", - "UserOfflineFromDevice": "{0} foi desconectado de {1}", - "UserStartedPlayingItemWithValues": "{0} come\u00e7ou a reproduzir {1}", - "UserStoppedPlayingItemWithValues": "{0} parou de reproduzir {1}", - "SubtitleDownloadFailureForItem": "Falha ao baixar legendas para {0}", - "HeaderUnidentified": "N\u00e3o-identificado", - "HeaderImagePrimary": "Principal", - "HeaderImageBackdrop": "Imagem de Fundo", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "Imagem do Usu\u00e1rio", - "HeaderOverview": "Sinopse", - "HeaderShortOverview": "Sinopse curta", - "HeaderType": "Tipo", - "HeaderSeverity": "Severidade", - "HeaderUser": "Usu\u00e1rio", - "HeaderName": "Nome", - "HeaderDate": "Data", - "HeaderPremiereDate": "Data da Estr\u00e9ia", - "HeaderDateAdded": "Data da Adi\u00e7\u00e3o", - "HeaderReleaseDate": "Data de lan\u00e7amento", - "HeaderRuntime": "Dura\u00e7\u00e3o", - "HeaderPlayCount": "N\u00famero de Reprodu\u00e7\u00f5es", - "HeaderSeason": "Temporada", - "HeaderSeasonNumber": "N\u00famero da temporada", - "HeaderSeries": "S\u00e9rie:", - "HeaderNetwork": "Rede de TV", - "HeaderYear": "Ano:", - "HeaderYears": "Anos:", - "HeaderParentalRating": "Classifica\u00e7\u00e3o Parental", - "HeaderCommunityRating": "Avalia\u00e7\u00e3o da Comunidade", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Especiais", - "HeaderGameSystems": "Sistemas de Jogo", - "HeaderPlayers": "Jogadores:", - "HeaderAlbumArtists": "Artistas do \u00c1lbum", - "HeaderAlbums": "\u00c1lbuns", - "HeaderDisc": "Disco", - "HeaderTrack": "Faixa", - "HeaderAudio": "\u00c1udio", - "HeaderVideo": "V\u00eddeo", - "HeaderEmbeddedImage": "Imagem incorporada", - "HeaderResolution": "Resolu\u00e7\u00e3o", - "HeaderSubtitles": "Legendas", - "HeaderGenres": "G\u00eaneros", - "HeaderCountries": "Pa\u00edses", - "HeaderStatus": "Status", - "HeaderTracks": "Faixas", - "HeaderMusicArtist": "Artista da m\u00fasica", - "HeaderLocked": "Travado", - "HeaderStudios": "Est\u00fadios", - "HeaderActor": "Atores", - "HeaderComposer": "Compositores", - "HeaderDirector": "Diretores", - "HeaderGuestStar": "Ator convidado", - "HeaderProducer": "Produtores", - "HeaderWriter": "Escritores", - "HeaderParentalRatings": "Classifica\u00e7\u00f5es Parentais", - "HeaderCommunityRatings": "Avalia\u00e7\u00f5es da comunidade", - "StartupEmbyServerIsLoading": "O Servidor Emby est\u00e1 carregando. Por favor, tente novamente em breve." + "SubtitleDownloadFailureForItem": "Download de legendas falhou para {0}", + "Sync": "Sincronizar", + "User": "Usu\u00e1rio", + "System": "Sistema", + "Application": "Aplicativo", + "Plugin": "Plugin", + "LabelExit": "Sair", + "LabelVisitCommunity": "Visite a Comunidade", + "LabelBrowseLibrary": "Explorar Biblioteca", + "LabelConfigureServer": "Configurar Emby", + "LabelRestartServer": "Reiniciar Servidor" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/pt-PT.json b/Emby.Server.Implementations/Localization/Core/pt-PT.json index f12939b102..7a6b8f4195 100644 --- a/Emby.Server.Implementations/Localization/Core/pt-PT.json +++ b/Emby.Server.Implementations/Localization/Core/pt-PT.json @@ -1,178 +1,96 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Especial - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continuar a ver", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "S\u00e9ries Favoritas", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Filmes", - "FolderTypeMusic": "M\u00fasica", - "FolderTypeAdultVideos": "V\u00eddeos adultos", - "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "V\u00eddeos musicais", - "FolderTypeHomeVideos": "V\u00eddeos caseiros", - "FolderTypeGames": "Jogos", - "FolderTypeBooks": "Livros", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Elenco e Equipa", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Sair", - "LabelVisitCommunity": "Visitar a Comunidade", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documenta\u00e7\u00e3o da API", - "LabelDeveloperResources": "Recursos do Programador", - "LabelBrowseLibrary": "Navegar pela Biblioteca", - "LabelConfigureServer": "Configurar o Emby", - "LabelRestartServer": "Reiniciar Servidor", - "CategorySync": "Sincroniza\u00e7\u00e3o", - "CategoryUser": "Utilizador", - "CategorySystem": "Sistema", - "CategoryApplication": "Aplica\u00e7\u00e3o", - "CategoryPlugin": "Extens\u00e3o", - "NotificationOptionPluginError": "Falha na extens\u00e3o", - "NotificationOptionApplicationUpdateAvailable": "Dispon\u00edvel atualiza\u00e7\u00e3o da aplica\u00e7\u00e3o", - "NotificationOptionApplicationUpdateInstalled": "Instalada atualiza\u00e7\u00e3o da aplica\u00e7\u00e3o", - "NotificationOptionPluginUpdateInstalled": "Instalada atualiza\u00e7\u00e3o da extens\u00e3o", - "NotificationOptionPluginInstalled": "Extens\u00e3o instalada", - "NotificationOptionPluginUninstalled": "Extens\u00e3o desinstalada", - "NotificationOptionVideoPlayback": "Reprodu\u00e7\u00e3o de v\u00eddeo iniciada", - "NotificationOptionAudioPlayback": "Reprodu\u00e7\u00e3o de \u00e1udio iniciada", - "NotificationOptionGamePlayback": "Reprodu\u00e7\u00e3o de jogo iniciada", - "NotificationOptionVideoPlaybackStopped": "Reprodu\u00e7\u00e3o de v\u00eddeo parada", - "NotificationOptionAudioPlaybackStopped": "Reprodu\u00e7\u00e3o de \u00e1udio parada", - "NotificationOptionGamePlaybackStopped": "Reprodu\u00e7\u00e3o de jogo parada", - "NotificationOptionTaskFailed": "Falha na tarefa agendada", - "NotificationOptionInstallationFailed": "Falha na instala\u00e7\u00e3o", - "NotificationOptionNewLibraryContent": "Adicionado novo conte\u00fado", - "NotificationOptionNewLibraryContentMultiple": "Novo conte\u00fado adicionado (m\u00faltiplo)", - "NotificationOptionCameraImageUploaded": "Imagem da c\u00e2mara carregada", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "\u00c9 necess\u00e1rio reiniciar o servidor", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "TV ao Vivo", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Reproduzido Recentemente", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "\u00daltimas", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "\u00daltimas", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "\u00daltimas", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Vers\u00e3o {0}", - "PluginInstalledWithName": "{0} foi instalado", - "PluginUpdatedWithName": "{0} foi atualizado", - "PluginUninstalledWithName": "{0} foi desinstalado", - "ItemAddedWithName": "{0} foi adicionado \u00e0 biblioteca", - "ItemRemovedWithName": "{0} foi removido da biblioteca", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} est\u00e1 conectado", + "DeviceOnlineWithName": "{0} is connected", "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Nome", - "HeaderDate": "Data", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "\u00c1udio", - "HeaderVideo": "V\u00eddeo", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Estado", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Aplica\u00e7\u00e3o", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/ro.json b/Emby.Server.Implementations/Localization/Core/ro.json deleted file mode 100644 index c58df27d57..0000000000 --- a/Emby.Server.Implementations/Localization/Core/ro.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Continut mixt", - "FolderTypeMovies": "Filme", - "FolderTypeMusic": "Muzica", - "FolderTypeAdultVideos": "Filme Porno", - "FolderTypePhotos": "Fotografii", - "FolderTypeMusicVideos": "Videoclipuri", - "FolderTypeHomeVideos": "Video Personale", - "FolderTypeGames": "Jocuri", - "FolderTypeBooks": "Carti", - "FolderTypeTvShows": "Seriale TV", - "FolderTypeInherit": "Relationat", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Iesire", - "LabelVisitCommunity": "Viziteaza comunitatea", - "LabelGithub": "Github", - "LabelApiDocumentation": "Documentatie Api", - "LabelDeveloperResources": "Resurse Dezvoltator", - "LabelBrowseLibrary": "Rasfoieste Librarie", - "LabelConfigureServer": "Configureaza Emby", - "LabelRestartServer": "Restarteaza Server", - "CategorySync": "Sincronizeaza", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Muzica", - "HeaderVideo": "Filme", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -} \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/ru.json b/Emby.Server.Implementations/Localization/Core/ru.json index 62fe3b4964..d27b1ca93d 100644 --- a/Emby.Server.Implementations/Localization/Core/ru.json +++ b/Emby.Server.Implementations/Localization/Core/ru.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435, \u043f\u043e\u043a\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c Emby Server \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f. {0} % \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e.", + "Latest": "\u041d\u043e\u0432\u0435\u0439\u0448\u0435\u0435", + "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u044d\u043f\u0438\u0437\u043e\u0434 - {0}", + "Inherit": "\u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0435", + "Books": "\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430", + "Music": "\u041c\u0443\u0437\u044b\u043a\u0430", + "Games": "\u0418\u0433\u0440\u044b", + "Photos": "\u0424\u043e\u0442\u043e", + "MixedContent": "\u0421\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435", + "MusicVideos": "\u041c\u0443\u0437. \u0432\u0438\u0434\u0435\u043e", + "HomeVideos": "\u0414\u043e\u043c. \u0432\u0438\u0434\u0435\u043e", + "Playlists": "\u041f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442\u044b", + "HeaderRecordingGroups": "\u0413\u0440\u0443\u043f\u043f\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439", + "HeaderContinueWatching": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430", + "HeaderFavoriteArtists": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", + "HeaderFavoriteSongs": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438", + "HeaderAlbumArtists": "\u0418\u0441\u043f-\u043b\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430", + "HeaderFavoriteAlbums": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0430\u043b\u044c\u0431\u043e\u043c\u044b", + "HeaderFavoriteEpisodes": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", + "HeaderFavoriteShows": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438", + "HeaderNextUp": "\u041e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435", + "Favorites": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", + "Collections": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438", + "Channels": "\u041a\u0430\u043d\u0430\u043b\u044b", + "Movies": "\u041a\u0438\u043d\u043e", + "Albums": "\u0410\u043b\u044c\u0431\u043e\u043c\u044b", + "Artists": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", + "Folders": "\u041f\u0430\u043f\u043a\u0438", + "Songs": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438", + "TvShows": "\u0422\u0412", + "Shows": "\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438", + "Genres": "\u0416\u0430\u043d\u0440\u044b", + "NameSeasonNumber": "\u0421\u0435\u0437\u043e\u043d {0}", "AppDeviceValues": "\u041f\u0440\u0438\u043b.: {0}, \u0423\u0441\u0442\u0440.: {1}", "UserDownloadingItemWithValues": "{0} \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 {1}", - "FolderTypeMixed": "\u0421\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435", - "FolderTypeMovies": "\u041a\u0438\u043d\u043e", - "FolderTypeMusic": "\u041c\u0443\u0437\u044b\u043a\u0430", - "FolderTypeAdultVideos": "\u0414\u043b\u044f \u0432\u0437\u0440\u043e\u0441\u043b\u044b\u0445", - "FolderTypePhotos": "\u0424\u043e\u0442\u043e", - "FolderTypeMusicVideos": "\u041c\u0443\u0437. \u0432\u0438\u0434\u0435\u043e", - "FolderTypeHomeVideos": "\u0414\u043e\u043c. \u0432\u0438\u0434\u0435\u043e", - "FolderTypeGames": "\u0418\u0433\u0440\u044b", - "FolderTypeBooks": "\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0430", - "FolderTypeTvShows": "\u0422\u0412", - "FolderTypeInherit": "\u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439", - "HeaderCastCrew": "\u0421\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u0438 \u0441\u043d\u0438\u043c\u0430\u043b\u0438", - "HeaderPeople": "\u041b\u044e\u0434\u0438", - "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u044d\u043f\u0438\u0437\u043e\u0434 - {0}", - "LabelChapterName": "\u0421\u0446\u0435\u043d\u0430 {0}", - "NameSeasonNumber": "\u0421\u0435\u0437\u043e\u043d {0}", - "LabelExit": "\u0412\u044b\u0445\u043e\u0434", - "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0435 \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430", - "LabelGithub": "GitHub", - "LabelApiDocumentation": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e API", - "LabelDeveloperResources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432", - "LabelBrowseLibrary": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435", - "LabelConfigureServer": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Emby", - "LabelRestartServer": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430", - "CategorySync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f", - "CategoryUser": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c", - "CategorySystem": "\u0421\u0438\u0441\u0442\u0435\u043c\u0430", - "CategoryApplication": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435", - "CategoryPlugin": "\u041f\u043b\u0430\u0433\u0438\u043d", + "HeaderLiveTV": "\u042d\u0444\u0438\u0440", + "ChapterNameValue": "\u0421\u0446\u0435\u043d\u0430 {0}", + "ScheduledTaskFailedWithName": "{0} - \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430", + "LabelRunningTimeValue": "\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: {0}", + "ScheduledTaskStartedWithName": "{0} - \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430", + "VersionNumber": "\u0412\u0435\u0440\u0441\u0438\u044f {0}", + "PluginInstalledWithName": "{0} - \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e", + "StartupEmbyServerIsLoading": "Emby Server \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f.", + "PluginUpdatedWithName": "{0} - \u0431\u044b\u043b\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e", + "PluginUninstalledWithName": "{0} - \u0431\u044b\u043b\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e", + "ItemAddedWithName": "{0} - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0443", + "ItemRemovedWithName": "{0} - \u0438\u0437\u044a\u044f\u0442\u043e \u0438\u0437 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438", + "LabelIpAddressValue": "IP-\u0430\u0434\u0440\u0435\u0441: {0}", + "DeviceOnlineWithName": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0443\u0441\u0442-\u043d\u043e", + "UserOnlineFromDevice": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0441 {1} \u0443\u0441\u0442-\u043d\u043e", + "ProviderValue": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a: {0}", + "SubtitlesDownloadedForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u043a {0} \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b", + "UserCreatedWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d", + "UserPasswordChangedWithName": "\u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0451\u043d", + "UserDeletedWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d", + "UserConfigurationUpdatedWithName": "\u041a\u043e\u043d\u0444\u0438\u0433-\u0438\u044f \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "MessageServerConfigurationUpdated": "\u041a\u043e\u043d\u0444\u0438\u0433-\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "MessageNamedServerConfigurationUpdatedWithValue": "\u041a\u043e\u043d\u0444\u0438\u0433-\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0440\u0430\u0437\u0434\u0435\u043b {0}) \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "MessageApplicationUpdated": "Emby Server \u0431\u044b\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d", + "FailedLoginAttemptWithUserName": "{0} - \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430", + "AuthenticationSucceededWithUserName": "{0} - \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u0430", + "UserOfflineFromDevice": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0441 {1} \u0440\u0430\u0437\u044a-\u043d\u043e", + "DeviceOfflineWithName": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0440\u0430\u0437\u044a-\u043d\u043e", + "UserStartedPlayingItemWithValues": "{0} - \u0432\u043e\u0441\u043f\u0440. \u00ab{1}\u00bb \u0437\u0430\u043f-\u043d\u043e", + "UserStoppedPlayingItemWithValues": "{0} - \u0432\u043e\u0441\u043f\u0440. \u00ab{1}\u00bb \u043e\u0441\u0442-\u043d\u043e", "NotificationOptionPluginError": "\u0421\u0431\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u0430", "NotificationOptionApplicationUpdateAvailable": "\u0418\u043c\u0435\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", "NotificationOptionApplicationUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "\u0421\u0431\u043e\u0439 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438", "NotificationOptionInstallationFailed": "\u0421\u0431\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438", "NotificationOptionNewLibraryContent": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e", - "NotificationOptionNewLibraryContentMultiple": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e (\u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e)", "NotificationOptionCameraImageUploaded": "\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0430 \u043e\u0442\u0441\u043d\u044f\u0442\u043e\u0433\u043e \u0441 \u043a\u0430\u043c\u0435\u0440\u044b", "NotificationOptionUserLockedOut": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d", "NotificationOptionServerRestartRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430", - "ViewTypePlaylists": "\u041f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442\u044b", - "ViewTypeMovies": "\u041a\u0438\u043d\u043e", - "ViewTypeTvShows": "\u0422\u0412", - "ViewTypeGames": "\u0418\u0433\u0440\u044b", - "ViewTypeMusic": "\u041c\u0443\u0437\u044b\u043a\u0430", - "ViewTypeMusicGenres": "\u0416\u0430\u043d\u0440\u044b", - "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": "\u042d\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", - "ViewTypeGameFavorites": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", - "ViewTypeGameSystems": "\u0418\u0433\u0440\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b", - "ViewTypeGameGenres": "\u0416\u0430\u043d\u0440\u044b", - "ViewTypeTvResume": "\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u043c\u043e\u0435", - "ViewTypeTvNextUp": "\u041e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435", - "ViewTypeTvLatest": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435", - "ViewTypeTvShowSeries": "\u0421\u0435\u0440\u0438\u0430\u043b\u044b", - "ViewTypeTvGenres": "\u0416\u0430\u043d\u0440\u044b", - "ViewTypeTvFavoriteSeries": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u044b", - "ViewTypeTvFavoriteEpisodes": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", - "ViewTypeMovieResume": "\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u043c\u043e\u0435", - "ViewTypeMovieLatest": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435", - "ViewTypeMovieMovies": "\u0424\u0438\u043b\u044c\u043c\u044b", - "ViewTypeMovieCollections": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438", - "ViewTypeMovieFavorites": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", - "ViewTypeMovieGenres": "\u0416\u0430\u043d\u0440\u044b", - "ViewTypeMusicLatest": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435", - "ViewTypeMusicPlaylists": "\u041f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442\u044b", - "ViewTypeMusicAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u044b", - "ViewTypeMusicAlbumArtists": "\u0418\u0441\u043f-\u043b\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430", - "HeaderOtherDisplaySettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f", - "ViewTypeMusicSongs": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438", - "ViewTypeMusicFavorites": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", - "ViewTypeMusicFavoriteAlbums": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0430\u043b\u044c\u0431\u043e\u043c\u044b", - "ViewTypeMusicFavoriteArtists": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", - "ViewTypeMusicFavoriteSongs": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438", - "ViewTypeFolders": "\u041f\u0430\u043f\u043a\u0438", - "ViewTypeLiveTvRecordingGroups": "\u0417\u0430\u043f\u0438\u0441\u0438", - "ViewTypeLiveTvChannels": "\u041a\u0430\u043d\u0430\u043b\u044b", - "ScheduledTaskFailedWithName": "{0} - \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430", - "LabelRunningTimeValue": "\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: {0}", - "ScheduledTaskStartedWithName": "{0} - \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430", - "VersionNumber": "\u0412\u0435\u0440\u0441\u0438\u044f {0}", - "PluginInstalledWithName": "{0} - \u0431\u044b\u043b\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e", - "PluginUpdatedWithName": "{0} - \u0431\u044b\u043b\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e", - "PluginUninstalledWithName": "{0} - \u0431\u044b\u043b\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e", - "ItemAddedWithName": "{0} (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0443)", - "ItemRemovedWithName": "{0} (\u0438\u0437\u044a\u044f\u0442\u043e \u0438\u0437 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438)", - "LabelIpAddressValue": "IP-\u0430\u0434\u0440\u0435\u0441: {0}", - "DeviceOnlineWithName": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0443\u0441\u0442-\u043d\u043e", - "UserOnlineFromDevice": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0441 {1} \u0443\u0441\u0442-\u043d\u043e", - "ProviderValue": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a: {0}", - "SubtitlesDownloadedForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u0434\u043b\u044f {0} \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438\u0441\u044c", - "UserConfigurationUpdatedWithName": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", - "UserCreatedWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d", - "UserPasswordChangedWithName": "\u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437-\u043b\u044f {0} \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0451\u043d", - "UserDeletedWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d", - "MessageServerConfigurationUpdated": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", - "MessageNamedServerConfigurationUpdatedWithValue": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0440\u0430\u0437\u0434\u0435\u043b {0}) \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", - "MessageApplicationUpdated": "Emby Server \u0431\u044b\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d", - "FailedLoginAttemptWithUserName": "{0} - \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430", - "AuthenticationSucceededWithUserName": "{0} - \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u0430", - "DeviceOfflineWithName": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0440\u0430\u0437\u044a-\u043d\u043e", "UserLockedOutWithName": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c {0} \u0431\u044b\u043b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d", - "UserOfflineFromDevice": "{0} - \u043f\u043e\u0434\u043a\u043b. \u0441 {1} \u0440\u0430\u0437\u044a-\u043d\u043e", - "UserStartedPlayingItemWithValues": "{0} - \u0432\u043e\u0441\u043f\u0440. \u00ab{1}\u00bb \u0437\u0430\u043f-\u043d\u043e", - "UserStoppedPlayingItemWithValues": "{0} - \u0432\u043e\u0441\u043f\u0440. \u00ab{1}\u00bb \u043e\u0441\u0442-\u043d\u043e", "SubtitleDownloadFailureForItem": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u043a {0} \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c", - "HeaderUnidentified": "\u041d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043e", - "HeaderImagePrimary": "\u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439", - "HeaderImageBackdrop": "\u0417\u0430\u0434\u043d\u0438\u043a", - "HeaderImageLogo": "\u041b\u043e\u0433\u043e\u0442\u0438\u043f", - "HeaderUserPrimaryImage": "\u0420\u0438\u0441\u0443\u043d\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", - "HeaderOverview": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435", - "HeaderShortOverview": "\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435", - "HeaderType": "\u0422\u0438\u043f", - "HeaderSeverity": "\u0412\u0430\u0436\u043d\u043e\u0441\u0442\u044c", - "HeaderUser": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c", - "HeaderName": "\u0418\u043c\u044f (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435)", - "HeaderDate": "\u0414\u0430\u0442\u0430", - "HeaderPremiereDate": "\u0414\u0430\u0442\u0430 \u043f\u0440\u0435\u043c\u044c\u0435\u0440\u044b", - "HeaderDateAdded": "\u0414\u0430\u0442\u0430 \u0434\u043e\u0431.", - "HeaderReleaseDate": "\u0414\u0430\u0442\u0430 \u0432\u044b\u043f.", - "HeaderRuntime": "\u0414\u043b\u0438\u0442.", - "HeaderPlayCount": "\u041a\u043e\u043b-\u0432\u043e \u0432\u043e\u0441\u043f\u0440.", - "HeaderSeason": "\u0421\u0435\u0437\u043e\u043d", - "HeaderSeasonNumber": "\u2116 \u0441\u0435\u0437\u043e\u043d\u0430", - "HeaderSeries": "\u0421\u0435\u0440\u0438\u0430\u043b:", - "HeaderNetwork": "\u0422\u0435\u043b\u0435\u0441\u0435\u0442\u044c", - "HeaderYear": "\u0413\u043e\u0434:", - "HeaderYears": "\u0413\u043e\u0434\u044b:", - "HeaderParentalRating": "\u0412\u043e\u0437\u0440. \u043a\u0430\u0442.", - "HeaderCommunityRating": "\u041e\u0431\u0449. \u043e\u0446\u0435\u043d\u043a\u0430", - "HeaderTrailers": "\u0422\u0440\u0435\u0439\u043b.", - "HeaderSpecials": "\u0421\u043f\u0435\u0446.", - "HeaderGameSystems": "\u0418\u0433\u0440. \u0441\u0438\u0441\u0442\u0435\u043c\u044b", - "HeaderPlayers": "\u0418\u0433\u0440\u043e\u043a\u0438:", - "HeaderAlbumArtists": "\u0418\u0441\u043f-\u043b\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430", - "HeaderAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u044b", - "HeaderDisc": "\u0414\u0438\u0441\u043a", - "HeaderTrack": "\u0414\u043e\u0440-\u043a\u0430", - "HeaderAudio": "\u0410\u0443\u0434\u0438\u043e", - "HeaderVideo": "\u0412\u0438\u0434\u0435\u043e", - "HeaderEmbeddedImage": "\u0412\u043d\u0435\u0434\u0440\u0451\u043d\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a", - "HeaderResolution": "\u0420\u0430\u0437\u0440.", - "HeaderSubtitles": "\u0421\u0443\u0431\u0442.", - "HeaderGenres": "\u0416\u0430\u043d\u0440\u044b", - "HeaderCountries": "\u0421\u0442\u0440\u0430\u043d\u044b", - "HeaderStatus": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435", - "HeaderTracks": "\u0414\u043e\u0440-\u043a\u0438", - "HeaderMusicArtist": "\u041c\u0443\u0437. \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c", - "HeaderLocked": "\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e", - "HeaderStudios": "\u0421\u0442\u0443\u0434\u0438\u0438", - "HeaderActor": "\u0410\u043a\u0442\u0451\u0440\u044b", - "HeaderComposer": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u044b", - "HeaderDirector": "\u0420\u0435\u0436\u0438\u0441\u0441\u0451\u0440\u044b", - "HeaderGuestStar": "\u041f\u0440\u0438\u0433\u043b. \u0430\u043a\u0442\u0451\u0440", - "HeaderProducer": "\u041f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u044b", - "HeaderWriter": "\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0441\u0442\u044b", - "HeaderParentalRatings": "\u0412\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f", - "HeaderCommunityRatings": "\u041e\u0431\u0449. \u043e\u0446\u0435\u043d\u043a\u0438", - "StartupEmbyServerIsLoading": "Emby Server \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f." + "Sync": "\u0421\u0438\u043d\u0445\u0440\u043e", + "User": "\u041f\u043e\u043b\u044c\u0437-\u043b\u044c", + "System": "\u0421\u0438\u0441\u0442\u0435\u043c\u0430", + "Application": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435", + "Plugin": "\u041f\u043b\u0430\u0433\u0438\u043d", + "LabelExit": "\u0412\u044b\u0445\u043e\u0434", + "LabelVisitCommunity": "\u041f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0435 \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430", + "LabelBrowseLibrary": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435", + "LabelConfigureServer": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Emby", + "LabelRestartServer": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/sk.json b/Emby.Server.Implementations/Localization/Core/sk.json new file mode 100644 index 0000000000..98f60e5e1d --- /dev/null +++ b/Emby.Server.Implementations/Localization/Core/sk.json @@ -0,0 +1,96 @@ +{ + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Ob\u013e\u00faben\u00e9 pesni\u010dky", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Ob\u013e\u00faben\u00e9 seri\u00e1ly", + "HeaderNextUp": "Next Up", + "Favorites": "Ob\u013e\u00faben\u00e9", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Series", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" +} \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/sl-SI.json b/Emby.Server.Implementations/Localization/Core/sl-SI.json index 0631e3fa88..cb8e080e45 100644 --- a/Emby.Server.Implementations/Localization/Core/sl-SI.json +++ b/Emby.Server.Implementations/Localization/Core/sl-SI.json @@ -1,102 +1,46 @@ { - "DbUpgradeMessage": "Prosimo pocakajte podatkovna baza Emby Streznika se posodablja. {0}% koncano.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Serije", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Izhod", - "LabelVisitCommunity": "Obiscite Skupnost", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Dokumentacija", - "LabelDeveloperResources": "Vsebine za razvijalce", - "LabelBrowseLibrary": "Brskanje po knjiznici", - "LabelConfigureServer": "Emby Nastavitve", - "LabelRestartServer": "Ponovni Zagon Streznika", - "CategorySync": "Sync", - "CategoryUser": "Uporabnik", - "CategorySystem": "Sistem", - "CategoryApplication": "Aplikacija", - "CategoryPlugin": "Vticnik", - "NotificationOptionPluginError": "Napaka v vticniku", - "NotificationOptionApplicationUpdateAvailable": "Na voljo je posodobitev", - "NotificationOptionApplicationUpdateInstalled": "Posodobitev je bila namescena", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Vticnik namescen", - "NotificationOptionPluginUninstalled": "Vticnik odstranjen", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Predvajanje videa koncano", - "NotificationOptionAudioPlaybackStopped": "Predvajanje audia koncano", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Napaka v namestitvi", - "NotificationOptionNewLibraryContent": "Dodana nova vsebina", - "NotificationOptionNewLibraryContentMultiple": "Dodane nove vsebine", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Zahtevan je ponovni zagon", - "ViewTypePlaylists": "Playliste", - "ViewTypeMovies": "Filmi", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Igre", - "ViewTypeMusic": "Glasba", - "ViewTypeMusicGenres": "Zvrsti", - "ViewTypeMusicArtists": "Izvajalci", - "ViewTypeBoxSets": "Zbirke", - "ViewTypeChannels": "Kanali", - "ViewTypeLiveTV": "TV v Zivo", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Zadnje Igre", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Priljubljeno", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Zvrsti", - "ViewTypeTvResume": "Nadaljuj", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Serije", - "ViewTypeTvGenres": "Zvrsti", - "ViewTypeTvFavoriteSeries": "Priljubljene Serije", - "ViewTypeTvFavoriteEpisodes": "Priljubljene Epizode", - "ViewTypeMovieResume": "Nadaljuj", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Filmi", - "ViewTypeMovieCollections": "Zbirke", - "ViewTypeMovieFavorites": "Priljubljeno", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albumi", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Priljubljeni Albumi", - "ViewTypeMusicFavoriteArtists": "Priljubljeni Izvajalci", - "ViewTypeMusicFavoriteSongs": "Priljubljene skladbe", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Verzija {0}", + "VersionNumber": "Version {0}", "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", "ItemAddedWithName": "{0} was added to the library", @@ -106,73 +50,47 @@ "UserOnlineFromDevice": "{0} is online from {1}", "ProviderValue": "Provider: {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "UserCreatedWithName": "User {0} has been created", "UserPasswordChangedWithName": "Password has been changed for user {0}", "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", "MessageServerConfigurationUpdated": "Server configuration has been updated", "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", "MessageApplicationUpdated": "Emby Server has been updated", "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", "UserStartedPlayingItemWithValues": "{0} has started playing {1}", "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "NotificationOptionVideoPlayback": "Video playback started", + "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionGamePlayback": "Game playback started", + "NotificationOptionVideoPlaybackStopped": "Video playback stopped", + "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionTaskFailed": "Scheduled task failure", + "NotificationOptionInstallationFailed": "Installation failure", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "UserLockedOutWithName": "User {0} has been locked out", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "Uporabnik", - "HeaderName": "Name", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/sv.json b/Emby.Server.Implementations/Localization/Core/sv.json index 4a6565affe..a038811837 100644 --- a/Emby.Server.Implementations/Localization/Core/sv.json +++ b/Emby.Server.Implementations/Localization/Core/sv.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "V\u00e4nligen v\u00e4nta medan databasen p\u00e5 din Emby Server uppgraderas. {0}% klar", - "AppDeviceValues": "App: {0}, enhet: {1}", - "UserDownloadingItemWithValues": "{0} laddar ned {1}", - "FolderTypeMixed": "Blandat inneh\u00e5ll", - "FolderTypeMovies": "Filmer", - "FolderTypeMusic": "Musik", - "FolderTypeAdultVideos": "Inneh\u00e5ll f\u00f6r vuxna", - "FolderTypePhotos": "Foton", - "FolderTypeMusicVideos": "Musikvideor", - "FolderTypeHomeVideos": "Hemvideor", - "FolderTypeGames": "Spel", - "FolderTypeBooks": "B\u00f6cker", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "\u00c4rv", - "HeaderCastCrew": "Rollista & bes\u00e4ttning", - "HeaderPeople": "Personer", + "Latest": "Senaste", "ValueSpecialEpisodeName": "Specialavsnitt - {0}", - "LabelChapterName": "Kapitel {0}", + "Inherit": "\u00c4rv", + "Books": "B\u00f6cker", + "Music": "Musik", + "Games": "Spel", + "Photos": "Bilder", + "MixedContent": "Blandat inneh\u00e5ll", + "MusicVideos": "Musikvideos", + "HomeVideos": "Hemvideor", + "Playlists": "Spellistor", + "HeaderRecordingGroups": "Inspelningsgrupper", + "HeaderContinueWatching": "Forts\u00e4tt kolla p\u00e5", + "HeaderFavoriteArtists": "Favoritartister", + "HeaderFavoriteSongs": "Favoritl\u00e5tar", + "HeaderAlbumArtists": "Albumartister", + "HeaderFavoriteAlbums": "Favoritalbum", + "HeaderFavoriteEpisodes": "Favoritavsnitt", + "HeaderFavoriteShows": "Favoritserier", + "HeaderNextUp": "N\u00e4sta p\u00e5 tur", + "Favorites": "Favoriter", + "Collections": "Samlingar", + "Channels": "Kanaler", + "Movies": "Filmer", + "Albums": "Album", + "Artists": "Artister", + "Folders": "Mappar", + "Songs": "L\u00e5tar", + "TvShows": "TV Shows", + "Shows": "Serier", + "Genres": "Genrer", "NameSeasonNumber": "S\u00e4song {0}", - "LabelExit": "Avsluta", - "LabelVisitCommunity": "Bes\u00f6k v\u00e5rt diskussionsforum", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api-dokumentation", - "LabelDeveloperResources": "Resurser f\u00f6r utvecklare", - "LabelBrowseLibrary": "Bl\u00e4ddra i biblioteket", - "LabelConfigureServer": "Konfigurera Emby", - "LabelRestartServer": "Starta om servern", - "CategorySync": "Synkronisera", - "CategoryUser": "Anv\u00e4ndare", - "CategorySystem": "System", - "CategoryApplication": "App", - "CategoryPlugin": "Till\u00e4gg", + "AppDeviceValues": "App: {0}, Enhet: {1}", + "UserDownloadingItemWithValues": "{0} laddar ner {1}", + "HeaderLiveTV": "Live-TV", + "ChapterNameValue": "Kapitel {0}", + "ScheduledTaskFailedWithName": "{0} misslyckades", + "LabelRunningTimeValue": "Speltid: {0}", + "ScheduledTaskStartedWithName": "{0} startad", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} installerades", + "StartupEmbyServerIsLoading": "Emby server arbetar. Pr\u00f6va igen inom kort.", + "PluginUpdatedWithName": "{0} uppdaterades", + "PluginUninstalledWithName": "{0} avinstallerades", + "ItemAddedWithName": "{0} lades till i biblioteket", + "ItemRemovedWithName": "{0} togs bort fr\u00e5n biblioteket", + "LabelIpAddressValue": "IP-adress: {0}", + "DeviceOnlineWithName": "{0} \u00e4r ansluten", + "UserOnlineFromDevice": "{0} \u00e4r uppkopplad fr\u00e5n {1}", + "ProviderValue": "K\u00e4lla: {0}", + "SubtitlesDownloadedForItem": "Undertexter har laddats ner till {0}", + "UserCreatedWithName": "Anv\u00e4ndaren {0} har skapats", + "UserPasswordChangedWithName": "L\u00f6senordet f\u00f6r {0} har \u00e4ndrats", + "UserDeletedWithName": "Anv\u00e4ndaren {0} har tagits bort", + "UserConfigurationUpdatedWithName": "Anv\u00e4ndarinst\u00e4llningarna f\u00f6r {0} har uppdaterats", + "MessageServerConfigurationUpdated": "Server konfigurationen har uppdaterats", + "MessageNamedServerConfigurationUpdatedWithValue": "Serverinst\u00e4llningarna {0} har uppdaterats", + "MessageApplicationUpdated": "Emby Server har uppdaterats", + "FailedLoginAttemptWithUserName": "Misslyckat inloggningsf\u00f6rs\u00f6k fr\u00e5n {0}", + "AuthenticationSucceededWithUserName": "{0} har autentiserats", + "UserOfflineFromDevice": "{0} har avbrutit anslutningen fr\u00e5n {1}", + "DeviceOfflineWithName": "{0} har tappat anslutningen", + "UserStartedPlayingItemWithValues": "{0} har b\u00f6rjat spela upp {1}", + "UserStoppedPlayingItemWithValues": "{0} har avslutat uppspelningen av {1}", "NotificationOptionPluginError": "Fel uppstod med till\u00e4gget", "NotificationOptionApplicationUpdateAvailable": "Ny programversion tillg\u00e4nglig", "NotificationOptionApplicationUpdateInstalled": "Programuppdatering installerad", @@ -45,134 +77,20 @@ "NotificationOptionGamePlaybackStopped": "Spel stoppat", "NotificationOptionTaskFailed": "Schemalagd aktivitet har misslyckats", "NotificationOptionInstallationFailed": "Fel vid installation", - "NotificationOptionNewLibraryContent": "Nytt inneh\u00e5ll har tillkommit", - "NotificationOptionNewLibraryContentMultiple": "Nytillkommet inneh\u00e5ll finns (flera objekt)", - "NotificationOptionCameraImageUploaded": "Kaberabild uppladdad", - "NotificationOptionUserLockedOut": "Anv\u00e4ndare har l\u00e5sts ute", + "NotificationOptionNewLibraryContent": "Nytt inneh\u00e5ll har lagts till", + "NotificationOptionCameraImageUploaded": "Kamerabild har laddats upp", + "NotificationOptionUserLockedOut": "Anv\u00e4ndare har l\u00e5sts ut", "NotificationOptionServerRestartRequired": "Servern m\u00e5ste startas om", - "ViewTypePlaylists": "Spellistor", - "ViewTypeMovies": "Filmer", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Spel", - "ViewTypeMusic": "Musik", - "ViewTypeMusicGenres": "Genrer", - "ViewTypeMusicArtists": "Artister", - "ViewTypeBoxSets": "Samlingar", - "ViewTypeChannels": "Kanaler", - "ViewTypeLiveTV": "Live-TV", - "ViewTypeLiveTvNowPlaying": "Visas nu", - "ViewTypeLatestGames": "Senaste spelen", - "ViewTypeRecentlyPlayedGames": "Nyligen spelade", - "ViewTypeGameFavorites": "Favoriter", - "ViewTypeGameSystems": "Spelsystem", - "ViewTypeGameGenres": "Genrer", - "ViewTypeTvResume": "\u00c5teruppta", - "ViewTypeTvNextUp": "N\u00e4stkommande", - "ViewTypeTvLatest": "Nytillkommet", - "ViewTypeTvShowSeries": "Serier", - "ViewTypeTvGenres": "Genrer", - "ViewTypeTvFavoriteSeries": "Favoritserier", - "ViewTypeTvFavoriteEpisodes": "Favoritavsnitt", - "ViewTypeMovieResume": "\u00c5teruppta", - "ViewTypeMovieLatest": "Nytillkommet", - "ViewTypeMovieMovies": "Filmer", - "ViewTypeMovieCollections": "Samlingar", - "ViewTypeMovieFavorites": "Favoriter", - "ViewTypeMovieGenres": "Genrer", - "ViewTypeMusicLatest": "Nytillkommet", - "ViewTypeMusicPlaylists": "Spellistor", - "ViewTypeMusicAlbums": "Album", - "ViewTypeMusicAlbumArtists": "Albumartister", - "HeaderOtherDisplaySettings": "Visningsalternativ", - "ViewTypeMusicSongs": "L\u00e5tar", - "ViewTypeMusicFavorites": "Favoriter", - "ViewTypeMusicFavoriteAlbums": "Favoritalbum", - "ViewTypeMusicFavoriteArtists": "Favoritartister", - "ViewTypeMusicFavoriteSongs": "Favoritl\u00e5tar", - "ViewTypeFolders": "Mappar", - "ViewTypeLiveTvRecordingGroups": "Inspelningar", - "ViewTypeLiveTvChannels": "Kanaler", - "ScheduledTaskFailedWithName": "{0} misslyckades", - "LabelRunningTimeValue": "Speltid: {0}", - "ScheduledTaskStartedWithName": "{0} startad", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} installerades", - "PluginUpdatedWithName": "{0} uppdaterades", - "PluginUninstalledWithName": "{0} avinstallerades", - "ItemAddedWithName": "{0} lades till i biblioteket", - "ItemRemovedWithName": "{0} togs bort ur biblioteket", - "LabelIpAddressValue": "IP-adress: {0}", - "DeviceOnlineWithName": "{0} \u00e4r ansluten", - "UserOnlineFromDevice": "{0} \u00e4r uppkopplad fr\u00e5n {1}", - "ProviderValue": "K\u00e4lla: {0}", - "SubtitlesDownloadedForItem": "Undertexter har laddats ner f\u00f6r {0}", - "UserConfigurationUpdatedWithName": "Anv\u00e4ndarinst\u00e4llningarna f\u00f6r {0} har uppdaterats", - "UserCreatedWithName": "Anv\u00e4ndaren {0} har skapats", - "UserPasswordChangedWithName": "L\u00f6senordet f\u00f6r {0} har \u00e4ndrats", - "UserDeletedWithName": "Anv\u00e4ndaren {0} har tagits bort", - "MessageServerConfigurationUpdated": "Server konfigurationen har uppdaterats", - "MessageNamedServerConfigurationUpdatedWithValue": "Serverinst\u00e4llningarnas del {0} ar uppdaterats", - "MessageApplicationUpdated": "Emby Server har uppdaterats", - "FailedLoginAttemptWithUserName": "Misslyckat inloggningsf\u00f6rs\u00f6k fr\u00e5n {0}", - "AuthenticationSucceededWithUserName": "{0} har autentiserats", - "DeviceOfflineWithName": "{0} har avbrutit anslutningen", "UserLockedOutWithName": "Anv\u00e4ndare {0} har l\u00e5sts ute", - "UserOfflineFromDevice": "{0} har avbrutit anslutningen fr\u00e5n {1}", - "UserStartedPlayingItemWithValues": "{0} har p\u00e5b\u00f6rjat uppspelning av {1}", - "UserStoppedPlayingItemWithValues": "{0} har avslutat uppspelning av {1}", "SubtitleDownloadFailureForItem": "Nerladdning av undertexter f\u00f6r {0} misslyckades", - "HeaderUnidentified": "Oidentifierad", - "HeaderImagePrimary": "Huvudbild", - "HeaderImageBackdrop": "Bakgrundsbild", - "HeaderImageLogo": "Logotyp", - "HeaderUserPrimaryImage": "Anv\u00e4ndarbild", - "HeaderOverview": "\u00d6versikt", - "HeaderShortOverview": "Kort \u00f6versikt", - "HeaderType": "Typ", - "HeaderSeverity": "Severity", - "HeaderUser": "Anv\u00e4ndare", - "HeaderName": "Namn", - "HeaderDate": "Datum", - "HeaderPremiereDate": "Premi\u00e4rdatum", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Premi\u00e4rdatum:", - "HeaderRuntime": "Speltid", - "HeaderPlayCount": "Antal spelningar", - "HeaderSeason": "S\u00e4song", - "HeaderSeasonNumber": "S\u00e4songsnummer:", - "HeaderSeries": "Serie:", - "HeaderNetwork": "TV-bolag", - "HeaderYear": "\u00c5r:", - "HeaderYears": "\u00c5r:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Anv\u00e4ndaromd\u00f6me", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specialavsnitt", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Spelare:", - "HeaderAlbumArtists": "Albumartister", - "HeaderAlbums": "Album", - "HeaderDisc": "Skiva", - "HeaderTrack": "Sp\u00e5r", - "HeaderAudio": "Ljud", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Infogad bild", - "HeaderResolution": "Uppl\u00f6sning", - "HeaderSubtitles": "Undertexter", - "HeaderGenres": "Genrer", - "HeaderCountries": "L\u00e4nder", - "HeaderStatus": "Status", - "HeaderTracks": "Sp\u00e5r", - "HeaderMusicArtist": "Musikartist", - "HeaderLocked": "L\u00e5st", - "HeaderStudios": "Studior", - "HeaderActor": "Sk\u00e5despelare", - "HeaderComposer": "Komposit\u00f6rer", - "HeaderDirector": "Regiss\u00f6r", - "HeaderGuestStar": "G\u00e4startist", - "HeaderProducer": "Producenter", - "HeaderWriter": "F\u00f6rfattare", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server startar. V\u00e4nligen f\u00f6rs\u00f6k igen om en kort stund." + "Sync": "Synk", + "User": "Anv\u00e4ndare", + "System": "System", + "Application": "App", + "Plugin": "Till\u00e4gg", + "LabelExit": "Avsluta", + "LabelVisitCommunity": "Bes\u00f6k v\u00e5rt diskussionsforum", + "LabelBrowseLibrary": "Bl\u00e4ddra i biblioteket", + "LabelConfigureServer": "Konfigurera Emby", + "LabelRestartServer": "Starta om servern" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/tr.json b/Emby.Server.Implementations/Localization/Core/tr.json index a691e9d025..a0a5151707 100644 --- a/Emby.Server.Implementations/Localization/Core/tr.json +++ b/Emby.Server.Implementations/Localization/Core/tr.json @@ -1,37 +1,69 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favori Showlar", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Cikis", - "LabelVisitCommunity": "Bizi Ziyaret Edin", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "K\u00fct\u00fcphane", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Server Yeniden Baslat", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Uygulamalar", - "CategoryPlugin": "Eklenti", - "NotificationOptionPluginError": "Eklenti Ba\u015far\u0131s\u0131z", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "NotificationOptionPluginError": "Plugin failure", "NotificationOptionApplicationUpdateAvailable": "Application update available", "NotificationOptionApplicationUpdateInstalled": "Application update installed", "NotificationOptionPluginUpdateInstalled": "Plugin update installed", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "NotificationOptionCameraImageUploaded": "Camera image uploaded", "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Sunucu yeniden ba\u015flat\u0131lmal\u0131", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Versiyon {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", + "NotificationOptionServerRestartRequired": "Server restart required", "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Durum", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "Visit Community", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/uk.json b/Emby.Server.Implementations/Localization/Core/uk.json deleted file mode 100644 index 0dc6afe8a2..0000000000 --- a/Emby.Server.Implementations/Localization/Core/uk.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "\u0424\u0456\u043b\u044c\u043c\u0438", - "FolderTypeMusic": "\u041c\u0443\u0437\u0438\u043a\u0430", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "\u0421\u0432\u0456\u0442\u043b\u0438\u043d\u0438", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "\u0406\u0433\u0440\u0438", - "FolderTypeBooks": "\u041a\u043d\u0438\u0433\u0438", - "FolderTypeTvShows": "\u0422\u0411", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "\u0412\u0438\u0439\u0442\u0438", - "LabelVisitCommunity": "Visit Community", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Browse Library", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "\u0424\u0456\u043b\u044c\u043c\u0438", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "\u041a\u043e\u043b\u0435\u043a\u0446\u0456\u0457", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "\u041e\u0441\u0442\u0430\u043d\u043d\u0456 \u0456\u0433\u0440\u0438", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "\u0424\u0456\u043b\u044c\u043c\u0438", - "ViewTypeMovieCollections": "\u041a\u043e\u043b\u0435\u043a\u0446\u0456\u0457", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "\u041e\u0441\u0442\u0430\u043d\u043d\u0456", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "\u0421\u0435\u0437\u043e\u043d", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u0438", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "\u0410\u043b\u044c\u0431\u043e\u043c\u0438", - "HeaderDisc": "\u0414\u0438\u0441\u043a", - "HeaderTrack": "\u0414\u043e\u0440\u0456\u0436\u043a\u0430", - "HeaderAudio": "\u0410\u0443\u0434\u0456\u043e", - "HeaderVideo": "\u0412\u0456\u0434\u0435\u043e", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Status", - "HeaderTracks": "\u0414\u043e\u0440\u0456\u0436\u043a\u0438", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "\u0421\u0442\u0443\u0434\u0456\u0457", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -} \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/vi.json b/Emby.Server.Implementations/Localization/Core/vi.json deleted file mode 100644 index 6ea1d1d3fd..0000000000 --- a/Emby.Server.Implementations/Localization/Core/vi.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "Cast & Crew", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "Tho\u00e1t", - "LabelVisitCommunity": "Gh\u00e9 th\u0103m trang C\u1ed9ng \u0111\u1ed3ng", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", - "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "Duy\u1ec7t th\u01b0 vi\u1ec7n", - "LabelConfigureServer": "Configure Emby", - "LabelRestartServer": "Kh\u1edfi \u0111\u1ed9ng l\u1ea1i m\u00e1y ch\u1ee7", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "Version {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "T\u00ean", - "HeaderDate": "Ng\u00e0y", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "Tr\u1ea1ng th\u00e1i", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -} \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/zh-CN.json b/Emby.Server.Implementations/Localization/Core/zh-CN.json index 580832a9ea..42126ca1b6 100644 --- a/Emby.Server.Implementations/Localization/Core/zh-CN.json +++ b/Emby.Server.Implementations/Localization/Core/zh-CN.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", - "AppDeviceValues": "App\uff1a {0}\uff0c\u8bbe\u5907\uff1a {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\u6df7\u5408\u5185\u5bb9", - "FolderTypeMovies": "\u7535\u5f71", - "FolderTypeMusic": "\u97f3\u4e50", - "FolderTypeAdultVideos": "\u6210\u4eba\u89c6\u9891", - "FolderTypePhotos": "\u56fe\u7247", - "FolderTypeMusicVideos": "\u97f3\u4e50\u89c6\u9891", - "FolderTypeHomeVideos": "\u5bb6\u5ead\u89c6\u9891", - "FolderTypeGames": "\u6e38\u620f", - "FolderTypeBooks": "\u4e66\u7c4d", - "FolderTypeTvShows": "\u7535\u89c6", - "FolderTypeInherit": "\u7ee7\u627f", - "HeaderCastCrew": "\u6f14\u804c\u4eba\u5458", - "HeaderPeople": "\u4eba\u7269", - "ValueSpecialEpisodeName": "\u7279\u522b - {0}", - "LabelChapterName": "\u7ae0\u8282 {0}", + "Latest": "\u6700\u65b0", + "ValueSpecialEpisodeName": "\u7279\u5178 - {0}", + "Inherit": "\u7ee7\u627f", + "Books": "\u4e66\u7c4d", + "Music": "\u97f3\u4e50", + "Games": "\u6e38\u620f", + "Photos": "\u7167\u7247", + "MixedContent": "\u6df7\u5408\u5185\u5bb9", + "MusicVideos": "\u97f3\u4e50\u89c6\u9891", + "HomeVideos": "\u5bb6\u5ead\u89c6\u9891", + "Playlists": "\u64ad\u653e\u5217\u8868", + "HeaderRecordingGroups": "\u5f55\u5236\u7ec4", + "HeaderContinueWatching": "\u7ee7\u7eed\u89c2\u770b", + "HeaderFavoriteArtists": "\u6700\u7231\u4f5c\u5bb6", + "HeaderFavoriteSongs": "\u6700\u7231\u7684\u6b4c\u66f2", + "HeaderAlbumArtists": "\u4e13\u8f91\u4f5c\u5bb6", + "HeaderFavoriteAlbums": "\u6700\u7231\u7684\u4e13\u8f91", + "HeaderFavoriteEpisodes": "\u6700\u7231\u7684\u96c6", + "HeaderFavoriteShows": "\u6700\u7231\u7684\u8282\u76ee", + "HeaderNextUp": "\u63a5\u4e0b\u6765", + "Favorites": "\u6700\u7231", + "Collections": "\u5408\u96c6", + "Channels": "\u9891\u9053", + "Movies": "\u7535\u5f71", + "Albums": "\u4e13\u8f91", + "Artists": "\u827a\u672f\u5bb6", + "Folders": "\u6587\u4ef6\u5939", + "Songs": "\u6b4c\u66f2", + "TvShows": "TV Shows", + "Shows": "\u8282\u76ee", + "Genres": "\u98ce\u683c", "NameSeasonNumber": "\u5b63 {0}", - "LabelExit": "\u9000\u51fa", - "LabelVisitCommunity": "\u8bbf\u95ee\u793e\u533a", - "LabelGithub": "Github", - "LabelApiDocumentation": "API\u6587\u6863", - "LabelDeveloperResources": "\u5f00\u53d1\u8005\u8d44\u6e90", - "LabelBrowseLibrary": "\u6d4f\u89c8\u5a92\u4f53\u5e93", - "LabelConfigureServer": "\u914d\u7f6eEmby", - "LabelRestartServer": "\u91cd\u542f\u670d\u52a1\u5668", - "CategorySync": "\u540c\u6b65", - "CategoryUser": "\u7528\u6237", - "CategorySystem": "\u7cfb\u7edf", - "CategoryApplication": "\u5e94\u7528\u7a0b\u5e8f", - "CategoryPlugin": "\u63d2\u4ef6", + "AppDeviceValues": "\u5e94\u7528: {0}, \u8bbe\u5907: {1}", + "UserDownloadingItemWithValues": "{0} \u6b63\u5728\u4e0b\u8f7d {1}", + "HeaderLiveTV": "\u7535\u89c6\u76f4\u64ad", + "ChapterNameValue": "\u7ae0\u8282 {0}", + "ScheduledTaskFailedWithName": "{0} \u5df2\u5931\u8d25", + "LabelRunningTimeValue": "\u8fd0\u884c\u65f6\u95f4\uff1a{0}", + "ScheduledTaskStartedWithName": "{0} \u5df2\u5f00\u59cb", + "VersionNumber": "\u7248\u672c {0}", + "PluginInstalledWithName": "{0} \u5df2\u5b89\u88c5", + "StartupEmbyServerIsLoading": "Emby \u670d\u52a1\u5668\u52a0\u8f7d\u4e2d\u3002\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002", + "PluginUpdatedWithName": "{0} \u5df2\u66f4\u65b0", + "PluginUninstalledWithName": "{0} \u5df2\u5378\u8f7d", + "ItemAddedWithName": "{0} \u5df2\u6dfb\u52a0\u5230\u5a92\u4f53\u5e93", + "ItemRemovedWithName": "{0} \u5df2\u4ece\u5a92\u4f53\u5e93\u4e2d\u79fb\u9664", + "LabelIpAddressValue": "Ip \u5730\u5740\uff1a{0}", + "DeviceOnlineWithName": "{0} \u5df2\u8fde\u63a5", + "UserOnlineFromDevice": "{0} \u5728\u7ebf\uff0c\u6765\u81ea {1}", + "ProviderValue": "\u63d0\u4f9b\u5546\uff1a{0}", + "SubtitlesDownloadedForItem": "\u5df2\u4e3a {0} \u4e0b\u8f7d\u4e86\u5b57\u5e55", + "UserCreatedWithName": "\u7528\u6237 {0} \u5df2\u521b\u5efa", + "UserPasswordChangedWithName": "\u5df2\u4e3a\u7528\u6237 {0} \u66f4\u6539\u5bc6\u7801", + "UserDeletedWithName": "\u7528\u6237 {0} \u5df2\u5220\u9664", + "UserConfigurationUpdatedWithName": "{0} \u7684\u7528\u6237\u914d\u7f6e\u5df2\u66f4\u65b0", + "MessageServerConfigurationUpdated": "\u670d\u52a1\u5668\u914d\u7f6e\u5df2\u66f4\u65b0", + "MessageNamedServerConfigurationUpdatedWithValue": "\u670d\u52a1\u5668\u914d\u7f6e {0} \u90e8\u5206\u5df2\u66f4\u65b0", + "MessageApplicationUpdated": "Emby \u670d\u52a1\u5668\u5df2\u66f4\u65b0", + "FailedLoginAttemptWithUserName": "\u6765\u81ea {0} \u7684\u5931\u8d25\u767b\u5165", + "AuthenticationSucceededWithUserName": "{0} \u6210\u529f\u9a8c\u8bc1", + "UserOfflineFromDevice": "{0} \u5df2\u4ece {1} \u65ad\u5f00", + "DeviceOfflineWithName": "{0} \u5df2\u65ad\u5f00", + "UserStartedPlayingItemWithValues": "{0} \u5df2\u5f00\u59cb\u64ad\u653e {1}", + "UserStoppedPlayingItemWithValues": "{0} \u5df2\u505c\u6b62\u64ad\u653e {1}", "NotificationOptionPluginError": "\u63d2\u4ef6\u5931\u8d25", "NotificationOptionApplicationUpdateAvailable": "\u6709\u53ef\u7528\u7684\u5e94\u7528\u7a0b\u5e8f\u66f4\u65b0", "NotificationOptionApplicationUpdateInstalled": "\u5e94\u7528\u7a0b\u5e8f\u66f4\u65b0\u5df2\u5b89\u88c5", @@ -40,139 +72,25 @@ "NotificationOptionVideoPlayback": "\u89c6\u9891\u5f00\u59cb\u64ad\u653e", "NotificationOptionAudioPlayback": "\u97f3\u9891\u5f00\u59cb\u64ad\u653e", "NotificationOptionGamePlayback": "\u6e38\u620f\u5f00\u59cb", - "NotificationOptionVideoPlaybackStopped": "\u89c6\u9891\u64ad\u653e\u505c\u6b62", - "NotificationOptionAudioPlaybackStopped": "\u97f3\u9891\u64ad\u653e\u505c\u6b62", + "NotificationOptionVideoPlaybackStopped": "\u89c6\u9891\u64ad\u653e\u5df2\u505c\u6b62", + "NotificationOptionAudioPlaybackStopped": "\u97f3\u9891\u64ad\u653e\u5df2\u505c\u6b62", "NotificationOptionGamePlaybackStopped": "\u6e38\u620f\u505c\u6b62", "NotificationOptionTaskFailed": "\u8ba1\u5212\u4efb\u52a1\u5931\u8d25", "NotificationOptionInstallationFailed": "\u5b89\u88c5\u5931\u8d25", - "NotificationOptionNewLibraryContent": "\u6dfb\u52a0\u65b0\u5185\u5bb9", - "NotificationOptionNewLibraryContentMultiple": "\u65b0\u7684\u5185\u5bb9\u52a0\u5165\uff08\u591a\u4e2a\uff09", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "\u9700\u8981\u91cd\u65b0\u542f\u52a8\u670d\u52a1\u5668", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "\u7535\u5f71", - "ViewTypeTvShows": "\u7535\u89c6", - "ViewTypeGames": "\u6e38\u620f", - "ViewTypeMusic": "\u97f3\u4e50", - "ViewTypeMusicGenres": "\u98ce\u683c", - "ViewTypeMusicArtists": "\u827a\u672f\u5bb6", - "ViewTypeBoxSets": "\u5408\u96c6", - "ViewTypeChannels": "\u9891\u9053", - "ViewTypeLiveTV": "\u7535\u89c6\u76f4\u64ad", - "ViewTypeLiveTvNowPlaying": "\u73b0\u5728\u64ad\u653e", - "ViewTypeLatestGames": "\u6700\u65b0\u6e38\u620f", - "ViewTypeRecentlyPlayedGames": "\u6700\u8fd1\u64ad\u653e", - "ViewTypeGameFavorites": "\u6211\u7684\u6700\u7231", - "ViewTypeGameSystems": "\u6e38\u620f\u7cfb\u7edf", - "ViewTypeGameGenres": "\u98ce\u683c", - "ViewTypeTvResume": "\u6062\u590d\u64ad\u653e", - "ViewTypeTvNextUp": "\u4e0b\u4e00\u4e2a", - "ViewTypeTvLatest": "\u6700\u65b0", - "ViewTypeTvShowSeries": "\u7535\u89c6\u5267", - "ViewTypeTvGenres": "\u98ce\u683c", - "ViewTypeTvFavoriteSeries": "\u6700\u559c\u6b22\u7684\u7535\u89c6\u5267", - "ViewTypeTvFavoriteEpisodes": "\u6700\u559c\u6b22\u7684\u5267\u96c6", - "ViewTypeMovieResume": "\u6062\u590d\u64ad\u653e", - "ViewTypeMovieLatest": "\u6700\u65b0", - "ViewTypeMovieMovies": "\u7535\u5f71", - "ViewTypeMovieCollections": "\u5408\u96c6", - "ViewTypeMovieFavorites": "\u6536\u85cf\u5939", - "ViewTypeMovieGenres": "\u98ce\u683c", - "ViewTypeMusicLatest": "\u6700\u65b0", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "\u4e13\u8f91", - "ViewTypeMusicAlbumArtists": "\u4e13\u8f91\u827a\u672f\u5bb6", - "HeaderOtherDisplaySettings": "\u663e\u793a\u8bbe\u7f6e", - "ViewTypeMusicSongs": "\u6b4c\u66f2", - "ViewTypeMusicFavorites": "\u6211\u7684\u6700\u7231", - "ViewTypeMusicFavoriteAlbums": "\u6700\u7231\u7684\u4e13\u8f91", - "ViewTypeMusicFavoriteArtists": "\u6700\u7231\u7684\u827a\u672f\u5bb6", - "ViewTypeMusicFavoriteSongs": "\u6700\u7231\u7684\u6b4c\u66f2", - "ViewTypeFolders": "\u6587\u4ef6\u5939", - "ViewTypeLiveTvRecordingGroups": "\u5f55\u5236", - "ViewTypeLiveTvChannels": "\u9891\u9053", - "ScheduledTaskFailedWithName": "{0} \u5931\u8d25", - "LabelRunningTimeValue": "\u8fd0\u884c\u65f6\u95f4\uff1a {0}", - "ScheduledTaskStartedWithName": "{0} \u5f00\u59cb", - "VersionNumber": "\u7248\u672c {0}", - "PluginInstalledWithName": "{0} \u5df2\u5b89\u88c5", - "PluginUpdatedWithName": "{0} \u5df2\u66f4\u65b0", - "PluginUninstalledWithName": "{0} \u5df2\u5378\u8f7d", - "ItemAddedWithName": "{0} \u5df2\u6dfb\u52a0\u5230\u5a92\u4f53\u5e93", - "ItemRemovedWithName": "{0} \u5df2\u4ece\u5a92\u4f53\u5e93\u4e2d\u79fb\u9664", - "LabelIpAddressValue": "Ip \u5730\u5740\uff1a {0}", - "DeviceOnlineWithName": "{0} \u5df2\u8fde\u63a5", - "UserOnlineFromDevice": "{0} \u5728\u7ebf\uff0c\u6765\u81ea {1}", - "ProviderValue": "\u63d0\u4f9b\u8005\uff1a {0}", - "SubtitlesDownloadedForItem": "\u5df2\u4e3a {0} \u4e0b\u8f7d\u4e86\u5b57\u5e55", - "UserConfigurationUpdatedWithName": "\u7528\u6237\u914d\u7f6e\u5df2\u66f4\u65b0\u4e3a {0}", - "UserCreatedWithName": "\u7528\u6237 {0} \u5df2\u88ab\u521b\u5efa", - "UserPasswordChangedWithName": "\u5df2\u4e3a\u7528\u6237 {0} \u66f4\u6539\u5bc6\u7801", - "UserDeletedWithName": "\u7528\u6237 {0} \u5df2\u88ab\u5220\u9664", - "MessageServerConfigurationUpdated": "\u670d\u52a1\u5668\u914d\u7f6e\u5df2\u66f4\u65b0", - "MessageNamedServerConfigurationUpdatedWithValue": "\u670d\u52a1\u5668\u914d\u7f6e {0} \u90e8\u5206\u5df2\u66f4\u65b0", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "\u5931\u8d25\u7684\u767b\u5f55\u5c1d\u8bd5\uff0c\u6765\u81ea {0}", - "AuthenticationSucceededWithUserName": "{0} \u6210\u529f\u88ab\u6388\u6743", - "DeviceOfflineWithName": "{0} \u5df2\u65ad\u5f00\u8fde\u63a5", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} \u5df2\u4ece {1} \u65ad\u5f00\u8fde\u63a5", - "UserStartedPlayingItemWithValues": "{0} \u5f00\u59cb\u64ad\u653e {1}", - "UserStoppedPlayingItemWithValues": "{0} \u505c\u6b62\u64ad\u653e {1}", + "NotificationOptionNewLibraryContent": "\u5df2\u6dfb\u52a0\u65b0\u5185\u5bb9", + "NotificationOptionCameraImageUploaded": "\u76f8\u673a\u56fe\u7247\u5df2\u4e0a\u4f20", + "NotificationOptionUserLockedOut": "\u7528\u6237\u5df2\u9501\u5b9a", + "NotificationOptionServerRestartRequired": "\u670d\u52a1\u5668\u9700\u8981\u91cd\u542f", + "UserLockedOutWithName": "\u7528\u6237 {0} \u5df2\u88ab\u9501\u5b9a", "SubtitleDownloadFailureForItem": "\u4e3a {0} \u4e0b\u8f7d\u5b57\u5e55\u5931\u8d25", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "\u7528\u6237", - "HeaderName": "\u540d\u5b57", - "HeaderDate": "\u65e5\u671f", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "\u53d1\u884c\u65e5\u671f", - "HeaderRuntime": "\u64ad\u653e\u65f6\u95f4", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "\u5b63", - "HeaderSeasonNumber": "\u591a\u5c11\u5b63", - "HeaderSeries": "Series:", - "HeaderNetwork": "\u7f51\u7edc", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "\u516c\u4f17\u8bc4\u5206", - "HeaderTrailers": "\u9884\u544a\u7247", - "HeaderSpecials": "\u7279\u96c6", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "\u4e13\u8f91", - "HeaderDisc": "\u5149\u76d8", - "HeaderTrack": "\u97f3\u8f68", - "HeaderAudio": "\u97f3\u9891", - "HeaderVideo": "\u89c6\u9891", - "HeaderEmbeddedImage": "\u5d4c\u5165\u5f0f\u56fe\u50cf", - "HeaderResolution": "\u5206\u8fa8\u7387", - "HeaderSubtitles": "\u5b57\u5e55", - "HeaderGenres": "\u98ce\u683c", - "HeaderCountries": "\u56fd\u5bb6", - "HeaderStatus": "\u72b6\u6001", - "HeaderTracks": "\u97f3\u8f68", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "\u5de5\u4f5c\u5ba4", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "\u5bb6\u957f\u5206\u7ea7", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "Sync": "\u540c\u6b65", + "User": "\u7528\u6237", + "System": "\u7cfb\u7edf", + "Application": "\u5e94\u7528\u7a0b\u5e8f", + "Plugin": "\u63d2\u4ef6", + "LabelExit": "\u9000\u51fa", + "LabelVisitCommunity": "\u8bbf\u95ee\u793e\u533a", + "LabelBrowseLibrary": "\u6d4f\u89c8\u5a92\u4f53\u5e93", + "LabelConfigureServer": "\u914d\u7f6e Emby", + "LabelRestartServer": "\u91cd\u542f\u670d\u52a1\u5668" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/zh-HK.json b/Emby.Server.Implementations/Localization/Core/zh-HK.json index a70e7a0035..37afc47e61 100644 --- a/Emby.Server.Implementations/Localization/Core/zh-HK.json +++ b/Emby.Server.Implementations/Localization/Core/zh-HK.json @@ -1,36 +1,68 @@ { - "DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.", + "Latest": "Latest", + "ValueSpecialEpisodeName": "Special - {0}", + "Inherit": "Inherit", + "Books": "Books", + "Music": "Music", + "Games": "Games", + "Photos": "Photos", + "MixedContent": "Mixed content", + "MusicVideos": "Music videos", + "HomeVideos": "Home videos", + "Playlists": "Playlists", + "HeaderRecordingGroups": "Recording Groups", + "HeaderContinueWatching": "Continue Watching", + "HeaderFavoriteArtists": "Favorite Artists", + "HeaderFavoriteSongs": "Favorite Songs", + "HeaderAlbumArtists": "Album Artists", + "HeaderFavoriteAlbums": "Favorite Albums", + "HeaderFavoriteEpisodes": "Favorite Episodes", + "HeaderFavoriteShows": "Favorite Shows", + "HeaderNextUp": "Next Up", + "Favorites": "Favorites", + "Collections": "Collections", + "Channels": "Channels", + "Movies": "Movies", + "Albums": "Albums", + "Artists": "Artists", + "Folders": "Folders", + "Songs": "Songs", + "TvShows": "TV Shows", + "Shows": "Shows", + "Genres": "Genres", + "NameSeasonNumber": "Season {0}", "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "\u6df7\u5408\u5167\u5bb9", - "FolderTypeMovies": "\u96fb\u5f71", - "FolderTypeMusic": "\u97f3\u6a02", - "FolderTypeAdultVideos": "\u6210\u4eba\u5f71\u7247", - "FolderTypePhotos": "\u76f8\u7247", - "FolderTypeMusicVideos": "MV", - "FolderTypeHomeVideos": "\u500b\u4eba\u5f71\u7247", - "FolderTypeGames": "\u904a\u6232", - "FolderTypeBooks": "\u66f8\u85c9", - "FolderTypeTvShows": "\u96fb\u8996\u7bc0\u76ee", - "FolderTypeInherit": "\u7e7c\u627f", - "HeaderCastCrew": "\u6f14\u54e1\u9663\u5bb9", - "HeaderPeople": "\u4eba\u7269", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "\u5287\u96c6\u5b63\u5ea6 {0}", - "LabelExit": "\u96e2\u958b", - "LabelVisitCommunity": "\u8a2a\u554f\u8a0e\u8ad6\u5340", - "LabelGithub": "Github", - "LabelApiDocumentation": "Api \u6587\u4ef6", - "LabelDeveloperResources": "\u958b\u767c\u8005\u8cc7\u6e90", - "LabelBrowseLibrary": "\u700f\u89bd\u8cc7\u6599\u5eab", - "LabelConfigureServer": "\u8a2d\u7f6e Emby", - "LabelRestartServer": "\u91cd\u65b0\u555f\u52d5\u4f3a\u670d\u5668", - "CategorySync": "\u540c\u6b65", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", + "HeaderLiveTV": "Live TV", + "ChapterNameValue": "Chapter {0}", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "\u7248\u672c{0}", + "PluginInstalledWithName": "{0} was installed", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly.", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "DeviceOfflineWithName": "{0} has disconnected", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", "NotificationOptionPluginError": "Plugin failure", "NotificationOptionApplicationUpdateAvailable": "Application update available", "NotificationOptionApplicationUpdateInstalled": "Application update installed", @@ -46,133 +78,19 @@ "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", "NotificationOptionCameraImageUploaded": "Camera image uploaded", "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "\u9700\u8981\u91cd\u65b0\u555f\u52d5", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "\u904a\u6232", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "\u85cf\u54c1", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "Live TV", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "\u6700\u8fd1\u904a\u6232", - "ViewTypeRecentlyPlayedGames": "\u6700\u8fd1\u64ad\u653e", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "\u904a\u6232\u7cfb\u7d71", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "\u96fb\u8996\u5287", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "\u6211\u7684\u6700\u611b\u96fb\u8996\u5287", - "ViewTypeTvFavoriteEpisodes": "\u6211\u7684\u6700\u611b\u5287\u96c6", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "\u85cf\u54c1", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "\u6b4c\u66f2", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "\u6211\u7684\u6700\u611b\u6b4c\u66f2", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "\u7248\u672c {0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "\u5df2\u7d93\u70ba {0} \u4e0b\u8f09\u4e86\u5b57\u5e55", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", + "NotificationOptionServerRestartRequired": "Server restart required", "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "\u70ba {0} \u4e0b\u8f09\u5b57\u5e55\u5931\u6557", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "\u540d\u7a31", - "HeaderDate": "\u65e5\u671f", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "\u5287\u96c6\u5b63\u5ea6", - "HeaderSeasonNumber": "\u5287\u96c6\u5b63\u5ea6\u6578\u76ee", - "HeaderSeries": "\u96fb\u8996\u5287\uff1a", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "\u904a\u6232\u7cfb\u7d71", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "\u97f3\u8a0a", - "HeaderVideo": "\u5f71\u7247", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "\u5b57\u5e55", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "\u72c0\u614b", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "\u6b4c\u624b", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "\u7279\u7d04\u660e\u661f", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "Sync": "Sync", + "User": "User", + "System": "System", + "Application": "Application", + "Plugin": "Plugin", + "LabelExit": "Exit", + "LabelVisitCommunity": "\u8a2a\u554f\u8a0e\u8ad6\u5340", + "LabelBrowseLibrary": "Browse Library", + "LabelConfigureServer": "Configure Emby", + "LabelRestartServer": "Restart Server" } \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/Core/zh-TW.json b/Emby.Server.Implementations/Localization/Core/zh-TW.json deleted file mode 100644 index b711aab1f2..0000000000 --- a/Emby.Server.Implementations/Localization/Core/zh-TW.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "DbUpgradeMessage": "\u8acb\u7a0d\u5019\uff0cEmby\u4f3a\u670d\u5668\u8cc7\u6599\u5eab\u6b63\u5728\u66f4\u65b0...\uff08\u5df2\u5b8c\u6210{0}%\uff09", - "AppDeviceValues": "App: {0}, Device: {1}", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypeAdultVideos": "Adult videos", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeHomeVideos": "Home videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "HeaderCastCrew": "\u62cd\u651d\u4eba\u54e1\u53ca\u6f14\u54e1", - "HeaderPeople": "People", - "ValueSpecialEpisodeName": "Special - {0}", - "LabelChapterName": "Chapter {0}", - "NameSeasonNumber": "Season {0}", - "LabelExit": "\u96e2\u958b", - "LabelVisitCommunity": "\u8a2a\u554f\u793e\u7fa4", - "LabelGithub": "GitHub", - "LabelApiDocumentation": "API\u8aaa\u660e\u6587\u4ef6", - "LabelDeveloperResources": "\u958b\u767c\u4eba\u54e1\u5c08\u5340", - "LabelBrowseLibrary": "\u700f\u89bd\u5a92\u9ad4\u6ac3", - "LabelConfigureServer": "Emby\u8a2d\u5b9a", - "LabelRestartServer": "\u91cd\u65b0\u555f\u52d5\u4f3a\u670d\u5668", - "CategorySync": "Sync", - "CategoryUser": "User", - "CategorySystem": "System", - "CategoryApplication": "Application", - "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", - "NotificationOptionApplicationUpdateAvailable": "Application update available", - "NotificationOptionApplicationUpdateInstalled": "Application update installed", - "NotificationOptionPluginUpdateInstalled": "Plugin update installed", - "NotificationOptionPluginInstalled": "Plugin installed", - "NotificationOptionPluginUninstalled": "Plugin uninstalled", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", - "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", - "NotificationOptionTaskFailed": "Scheduled task failure", - "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "NotificationOptionServerRestartRequired": "Server restart required", - "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", - "ViewTypeGames": "Games", - "ViewTypeMusic": "Music", - "ViewTypeMusicGenres": "Genres", - "ViewTypeMusicArtists": "Artists", - "ViewTypeBoxSets": "Collections", - "ViewTypeChannels": "Channels", - "ViewTypeLiveTV": "\u96fb\u8996", - "ViewTypeLiveTvNowPlaying": "Now Airing", - "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", - "ViewTypeGameFavorites": "Favorites", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", - "ViewTypeTvNextUp": "Next Up", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", - "ViewTypeTvFavoriteSeries": "Favorite Series", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", - "ViewTypeMovieCollections": "Collections", - "ViewTypeMovieFavorites": "Favorites", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Favorites", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", - "ViewTypeMusicFavoriteSongs": "Favorite Songs", - "ViewTypeFolders": "Folders", - "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", - "ScheduledTaskFailedWithName": "{0} failed", - "LabelRunningTimeValue": "Running time: {0}", - "ScheduledTaskStartedWithName": "{0} started", - "VersionNumber": "\u7248\u672c{0}", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", - "LabelIpAddressValue": "Ip address: {0}", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "ProviderValue": "Provider: {0}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", - "AuthenticationSucceededWithUserName": "{0} successfully authenticated", - "DeviceOfflineWithName": "{0} has disconnected", - "UserLockedOutWithName": "User {0} has been locked out", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "HeaderUnidentified": "Unidentified", - "HeaderImagePrimary": "Primary", - "HeaderImageBackdrop": "Backdrop", - "HeaderImageLogo": "Logo", - "HeaderUserPrimaryImage": "User Image", - "HeaderOverview": "Overview", - "HeaderShortOverview": "Short Overview", - "HeaderType": "Type", - "HeaderSeverity": "Severity", - "HeaderUser": "User", - "HeaderName": "Name", - "HeaderDate": "Date", - "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", - "HeaderReleaseDate": "Release date", - "HeaderRuntime": "Runtime", - "HeaderPlayCount": "Play Count", - "HeaderSeason": "Season", - "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", - "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", - "HeaderParentalRating": "Parental Rating", - "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", - "HeaderSpecials": "Specials", - "HeaderGameSystems": "Game Systems", - "HeaderPlayers": "Players:", - "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", - "HeaderDisc": "Disc", - "HeaderTrack": "Track", - "HeaderAudio": "Audio", - "HeaderVideo": "Video", - "HeaderEmbeddedImage": "Embedded image", - "HeaderResolution": "Resolution", - "HeaderSubtitles": "Subtitles", - "HeaderGenres": "Genres", - "HeaderCountries": "Countries", - "HeaderStatus": "\u72c0\u614b", - "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Music artist", - "HeaderLocked": "Locked", - "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", - "HeaderParentalRatings": "Parental Ratings", - "HeaderCommunityRatings": "Community ratings", - "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." -} \ No newline at end of file diff --git a/Emby.Server.Implementations/Localization/LocalizationManager.cs b/Emby.Server.Implementations/Localization/LocalizationManager.cs index 278a39cd1e..650f388a1b 100644 --- a/Emby.Server.Implementations/Localization/LocalizationManager.cs +++ b/Emby.Server.Implementations/Localization/LocalizationManager.cs @@ -315,6 +315,15 @@ namespace Emby.Server.Implementations.Localization public string GetLocalizedString(string phrase, string culture) { + if (string.IsNullOrWhiteSpace(culture)) + { + culture = _configurationManager.Configuration.UICulture; + } + if (string.IsNullOrWhiteSpace(culture)) + { + culture = DefaultCulture; + } + var dictionary = GetLocalizationDictionary(culture); string value; @@ -327,19 +336,31 @@ namespace Emby.Server.Implementations.Localization return phrase; } + const string DefaultCulture = "en-US"; + private readonly ConcurrentDictionary> _dictionaries = new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); public Dictionary GetLocalizationDictionary(string culture) { + if (string.IsNullOrWhiteSpace(culture)) + { + throw new ArgumentNullException("culture"); + } + const string prefix = "Core"; var key = prefix + culture; - return _dictionaries.GetOrAdd(key, k => GetDictionary(prefix, culture, "en-US.json")); + return _dictionaries.GetOrAdd(key, k => GetDictionary(prefix, culture, DefaultCulture + ".json")); } private Dictionary GetDictionary(string prefix, string culture, string baseFilename) { + if (string.IsNullOrWhiteSpace(culture)) + { + throw new ArgumentNullException("culture"); + } + var dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); var namespaceName = GetType().Namespace + "." + prefix; @@ -387,36 +408,47 @@ namespace Emby.Server.Implementations.Localization return new LocalizatonOption[] { new LocalizatonOption{ Name="Arabic", Value="ar"}, + new LocalizatonOption{ Name="Belarusian (Belarus)", Value="be-BY"}, new LocalizatonOption{ Name="Bulgarian (Bulgaria)", Value="bg-BG"}, new LocalizatonOption{ Name="Catalan", Value="ca"}, new LocalizatonOption{ Name="Chinese Simplified", Value="zh-CN"}, new LocalizatonOption{ Name="Chinese Traditional", Value="zh-TW"}, + new LocalizatonOption{ Name="Chinese Traditional (Hong Kong)", Value="zh-HK"}, new LocalizatonOption{ Name="Croatian", Value="hr"}, new LocalizatonOption{ Name="Czech", Value="cs"}, new LocalizatonOption{ Name="Danish", Value="da"}, new LocalizatonOption{ Name="Dutch", Value="nl"}, new LocalizatonOption{ Name="English (United Kingdom)", Value="en-GB"}, - new LocalizatonOption{ Name="English (United States)", Value="en-us"}, + new LocalizatonOption{ Name="English (United States)", Value="en-US"}, new LocalizatonOption{ Name="Finnish", Value="fi"}, new LocalizatonOption{ Name="French", Value="fr"}, new LocalizatonOption{ Name="French (Canada)", Value="fr-CA"}, new LocalizatonOption{ Name="German", Value="de"}, new LocalizatonOption{ Name="Greek", Value="el"}, new LocalizatonOption{ Name="Hebrew", Value="he"}, + new LocalizatonOption{ Name="Hindi (India)", Value="hi-IN"}, new LocalizatonOption{ Name="Hungarian", Value="hu"}, new LocalizatonOption{ Name="Indonesian", Value="id"}, new LocalizatonOption{ Name="Italian", Value="it"}, + new LocalizatonOption{ Name="Japanese", Value="ja"}, new LocalizatonOption{ Name="Kazakh", Value="kk"}, + new LocalizatonOption{ Name="Korean", Value="ko"}, + new LocalizatonOption{ Name="Lithuanian", Value="lt-LT"}, + new LocalizatonOption{ Name="Malay", Value="ms"}, new LocalizatonOption{ Name="Norwegian Bokmål", Value="nb"}, new LocalizatonOption{ Name="Persian", Value="fa"}, new LocalizatonOption{ Name="Polish", Value="pl"}, new LocalizatonOption{ Name="Portuguese (Brazil)", Value="pt-BR"}, new LocalizatonOption{ Name="Portuguese (Portugal)", Value="pt-PT"}, + new LocalizatonOption{ Name="Romanian", Value="ro"}, new LocalizatonOption{ Name="Russian", Value="ru"}, + new LocalizatonOption{ Name="Slovak", Value="sk"}, new LocalizatonOption{ Name="Slovenian (Slovenia)", Value="sl-SI"}, - new LocalizatonOption{ Name="Spanish", Value="es-ES"}, + new LocalizatonOption{ Name="Spanish", Value="es"}, + new LocalizatonOption{ Name="Spanish (Latin America)", Value="es-419"}, new LocalizatonOption{ Name="Spanish (Mexico)", Value="es-MX"}, new LocalizatonOption{ Name="Swedish", Value="sv"}, + new LocalizatonOption{ Name="Swiss German", Value="gsw"}, new LocalizatonOption{ Name="Turkish", Value="tr"}, new LocalizatonOption{ Name="Ukrainian", Value="uk"}, new LocalizatonOption{ Name="Vietnamese", Value="vi"} diff --git a/Emby.Server.Implementations/Networking/NetworkManager.cs b/Emby.Server.Implementations/Networking/NetworkManager.cs index b47c058dff..66b2cba39b 100644 --- a/Emby.Server.Implementations/Networking/NetworkManager.cs +++ b/Emby.Server.Implementations/Networking/NetworkManager.cs @@ -29,7 +29,7 @@ namespace Emby.Server.Implementations.Networking public List GetLocalIpAddresses() { - const int cacheMinutes = 5; + const int cacheMinutes = 10; lock (_localIpAddressSyncLock) { @@ -81,8 +81,18 @@ namespace Emby.Server.Implementations.Networking return true; } - // Handle ipv4 mapped to ipv6 - endpoint = endpoint.Replace("::ffff:", string.Empty); + // ipv6 + if (endpoint.Split('.').Length > 4) + { + // Handle ipv4 mapped to ipv6 + var originalEndpoint = endpoint; + endpoint = endpoint.Replace("::ffff:", string.Empty); + + if (string.Equals(endpoint, originalEndpoint, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + } // Private address space: // http://en.wikipedia.org/wiki/Private_network @@ -92,13 +102,74 @@ namespace Emby.Server.Implementations.Networking return Is172AddressPrivate(endpoint); } - return + return endpoint.StartsWith("localhost", StringComparison.OrdinalIgnoreCase) || + endpoint.StartsWith("127.0.0.1", StringComparison.OrdinalIgnoreCase) || + IsInPrivateAddressSpaceAndLocalSubnet(endpoint); + } - endpoint.StartsWith("localhost", StringComparison.OrdinalIgnoreCase) || + public bool IsInPrivateAddressSpaceAndLocalSubnet(string endpoint) + { + var endpointFirstPart = endpoint.Split('.')[0]; + + string subnet_Match = ""; + if ( endpoint.StartsWith("127.", StringComparison.OrdinalIgnoreCase) || endpoint.StartsWith("10.", StringComparison.OrdinalIgnoreCase) || endpoint.StartsWith("192.168", StringComparison.OrdinalIgnoreCase) || - endpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase); + endpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase) + ) + { + foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) + foreach (UnicastIPAddressInformation unicastIPAddressInformation in adapter.GetIPProperties().UnicastAddresses) + if (unicastIPAddressInformation.Address.AddressFamily == AddressFamily.InterNetwork && endpointFirstPart == unicastIPAddressInformation.Address.ToString().Split('.')[0]) + { + int subnet_Test = 0; + foreach (string part in unicastIPAddressInformation.IPv4Mask.ToString().Split('.')) + { + if (part.Equals("0")) break; + subnet_Test++; + } + + subnet_Match = String.Join(".", unicastIPAddressInformation.Address.ToString().Split('.').Take(subnet_Test).ToArray()); + } + } + + return endpoint.StartsWith(subnet_Match + ".", StringComparison.OrdinalIgnoreCase); + } + + private Dictionary _subnetLookup = new Dictionary(StringComparer.Ordinal); + private string GetSubnet(string endpointFirstPart) + { + string subnet_Match = ""; + + lock (_subnetLookup) + { + if (_subnetLookup.TryGetValue(endpointFirstPart, out subnet_Match)) + { + return subnet_Match; + } + + foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) + foreach (UnicastIPAddressInformation unicastIPAddressInformation in adapter.GetIPProperties().UnicastAddresses) + if (unicastIPAddressInformation.Address.AddressFamily == AddressFamily.InterNetwork && endpointFirstPart == unicastIPAddressInformation.Address.ToString().Split('.')[0]) + { + int subnet_Test = 0; + foreach (string part in unicastIPAddressInformation.IPv4Mask.ToString().Split('.')) + { + if (part.Equals("0")) break; + subnet_Test++; + } + + subnet_Match = String.Join(".", unicastIPAddressInformation.Address.ToString().Split('.').Take(subnet_Test).ToArray()); + } + + if (!string.IsNullOrWhiteSpace(subnet_Match)) + { + _subnetLookup[endpointFirstPart] = subnet_Match; + } + } + + return subnet_Match; } private bool Is172AddressPrivate(string endpoint) @@ -198,12 +269,6 @@ namespace Emby.Server.Implementations.Networking return Dns.GetHostAddressesAsync(hostName); } - private readonly List _validNetworkInterfaceTypes = new List - { - NetworkInterfaceType.Ethernet, - NetworkInterfaceType.Wireless80211 - }; - private List GetIPsDefault() { NetworkInterface[] interfaces; @@ -227,7 +292,8 @@ namespace Emby.Server.Implementations.Networking try { - Logger.Debug("Querying interface: {0}. Type: {1}. Status: {2}", network.Name, network.NetworkInterfaceType, network.OperationalStatus); + // suppress logging because it might be causing nas device wake up + //Logger.Debug("Querying interface: {0}. Type: {1}. Status: {2}", network.Name, network.NetworkInterfaceType, network.OperationalStatus); var ipProperties = network.GetIPProperties(); diff --git a/Emby.Server.Implementations/News/NewsEntryPoint.cs b/Emby.Server.Implementations/News/NewsEntryPoint.cs index 03c79c2c1e..74366233c6 100644 --- a/Emby.Server.Implementations/News/NewsEntryPoint.cs +++ b/Emby.Server.Implementations/News/NewsEntryPoint.cs @@ -88,15 +88,18 @@ namespace Emby.Server.Implementations.News BufferContent = false }; - using (var stream = await _httpClient.Get(requestOptions).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(requestOptions, "GET").ConfigureAwait(false)) { - using (var reader = XmlReader.Create(stream)) + using (var stream = response.Content) { - var news = ParseRssItems(reader).ToList(); + using (var reader = XmlReader.Create(stream)) + { + var news = ParseRssItems(reader).ToList(); - _json.SerializeToFile(news, path); + _json.SerializeToFile(news, path); - await CreateNotifications(news, lastUpdate, CancellationToken.None).ConfigureAwait(false); + await CreateNotifications(news, lastUpdate, CancellationToken.None).ConfigureAwait(false); + } } } } diff --git a/Emby.Server.Implementations/Notifications/CoreNotificationTypes.cs b/Emby.Server.Implementations/Notifications/CoreNotificationTypes.cs index 849e02d812..b00b5d43b9 100644 --- a/Emby.Server.Implementations/Notifications/CoreNotificationTypes.cs +++ b/Emby.Server.Implementations/Notifications/CoreNotificationTypes.cs @@ -160,7 +160,7 @@ namespace Emby.Server.Implementations.Notifications Update(type); } - var systemName = _localization.GetLocalizedString("CategorySystem"); + var systemName = _localization.GetLocalizedString("System"); return knownTypes.OrderByDescending(i => string.Equals(i.Category, systemName, StringComparison.OrdinalIgnoreCase)) .ThenBy(i => i.Category) @@ -175,23 +175,23 @@ namespace Emby.Server.Implementations.Notifications if (note.Type.IndexOf("Playback", StringComparison.OrdinalIgnoreCase) != -1) { - note.Category = _localization.GetLocalizedString("CategoryUser"); + note.Category = _localization.GetLocalizedString("User"); } else if (note.Type.IndexOf("Plugin", StringComparison.OrdinalIgnoreCase) != -1) { - note.Category = _localization.GetLocalizedString("CategoryPlugin"); + note.Category = _localization.GetLocalizedString("Plugin"); } else if (note.Type.IndexOf("CameraImageUploaded", StringComparison.OrdinalIgnoreCase) != -1) { - note.Category = _localization.GetLocalizedString("CategorySync"); + note.Category = _localization.GetLocalizedString("Sync"); } else if (note.Type.IndexOf("UserLockedOut", StringComparison.OrdinalIgnoreCase) != -1) { - note.Category = _localization.GetLocalizedString("CategoryUser"); + note.Category = _localization.GetLocalizedString("User"); } else { - note.Category = _localization.GetLocalizedString("CategorySystem"); + note.Category = _localization.GetLocalizedString("System"); } } } diff --git a/Emby.Server.Implementations/Notifications/NotificationManager.cs b/Emby.Server.Implementations/Notifications/NotificationManager.cs index f49d5a1d10..e11f2790e8 100644 --- a/Emby.Server.Implementations/Notifications/NotificationManager.cs +++ b/Emby.Server.Implementations/Notifications/NotificationManager.cs @@ -37,6 +37,11 @@ namespace Emby.Server.Implementations.Notifications } public Task SendNotification(NotificationRequest request, CancellationToken cancellationToken) + { + return SendNotification(request, null, cancellationToken); + } + + public Task SendNotification(NotificationRequest request, BaseItem relatedItem, CancellationToken cancellationToken) { var notificationType = request.NotificationType; @@ -45,7 +50,9 @@ namespace Emby.Server.Implementations.Notifications GetConfiguration().GetOptions(notificationType); var users = GetUserIds(request, options) - .Select(i => _userManager.GetUserById(i)); + .Select(i => _userManager.GetUserById(i)) + .Where(i => relatedItem == null || relatedItem.IsVisibleStandalone(i)) + .ToArray(); var title = GetTitle(request, options); var description = GetDescription(request, options); @@ -69,7 +76,6 @@ namespace Emby.Server.Implementations.Notifications var tasks = users.Select(i => SendNotification(request, service, title, description, i, cancellationToken)); return Task.WhenAll(tasks); - } private IEnumerable GetUserIds(NotificationRequest request, NotificationOption options) diff --git a/Emby.Server.Implementations/Notifications/Notifications.cs b/Emby.Server.Implementations/Notifications/Notifications.cs index 09c1f07e0b..b7e1d65593 100644 --- a/Emby.Server.Implementations/Notifications/Notifications.cs +++ b/Emby.Server.Implementations/Notifications/Notifications.cs @@ -97,7 +97,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["UserName"] = e.Argument.Name; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _deviceManager_CameraImageUploaded(object sender, GenericEventArgs e) @@ -111,7 +111,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["DeviceName"] = e.Argument.Device.Name; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _appHost_ApplicationUpdated(object sender, GenericEventArgs e) @@ -127,7 +127,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Version"] = e.Argument.versionStr; notification.Variables["ReleaseNotes"] = e.Argument.description; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _installationManager_PluginUpdated(object sender, GenericEventArgs> e) @@ -146,7 +146,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Version"] = installationInfo.Version.ToString(); notification.Variables["ReleaseNotes"] = e.Argument.Item2.description; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _installationManager_PluginInstalled(object sender, GenericEventArgs e) @@ -164,7 +164,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Name"] = installationInfo.name; notification.Variables["Version"] = installationInfo.versionStr; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _appHost_HasUpdateAvailableChanged(object sender, EventArgs e) @@ -183,7 +183,7 @@ namespace Emby.Server.Implementations.Notifications NotificationType = type }; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _appHost_HasPendingRestartChanged(object sender, EventArgs e) @@ -200,7 +200,7 @@ namespace Emby.Server.Implementations.Notifications NotificationType = type }; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } private NotificationOptions GetOptions() @@ -285,7 +285,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["AppName"] = e.ClientName; notification.Variables["DeviceName"] = e.DeviceName; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } private string GetPlaybackNotificationType(string mediaType) @@ -390,7 +390,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Name"] = GetItemName(item); - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, item).ConfigureAwait(false); } } @@ -457,7 +457,7 @@ namespace Emby.Server.Implementations.Notifications Description = "Check back here for more notifications." }; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _taskManager_TaskCompleted(object sender, TaskCompletionEventArgs e) @@ -478,7 +478,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Name"] = result.Name; notification.Variables["ErrorMessage"] = result.ErrorMessage; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } } @@ -496,7 +496,7 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Name"] = plugin.Name; notification.Variables["Version"] = plugin.Version.ToString(); - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } async void _installationManager_PackageInstallationFailed(object sender, InstallationFailedEventArgs e) @@ -515,14 +515,14 @@ namespace Emby.Server.Implementations.Notifications notification.Variables["Name"] = installationInfo.Name; notification.Variables["Version"] = installationInfo.Version; - await SendNotification(notification).ConfigureAwait(false); + await SendNotification(notification, null).ConfigureAwait(false); } - private async Task SendNotification(NotificationRequest notification) + private async Task SendNotification(NotificationRequest notification, BaseItem relatedItem) { try { - await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false); + await _notificationManager.SendNotification(notification, relatedItem, CancellationToken.None).ConfigureAwait(false); } catch (Exception ex) { diff --git a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs b/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs deleted file mode 100644 index f7c65f63d7..0000000000 --- a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs +++ /dev/null @@ -1,34 +0,0 @@ -using MediaBrowser.Common.Configuration; -using MediaBrowser.Controller.Drawing; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Providers; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Emby.Server.Implementations.Images; -using MediaBrowser.Model.IO; -using MediaBrowser.Model.Entities; - -namespace Emby.Server.Implementations.Photos -{ - public class PhotoAlbumImageProvider : BaseDynamicImageProvider - { - public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor) - : base(fileSystem, providerManager, applicationPaths, imageProcessor) - { - } - - protected override List GetItemsWithImages(IHasMetadata item) - { - var photoAlbum = (PhotoAlbum)item; - var items = GetFinalItems(photoAlbum.Children); - - return items; - } - - protected override string CreateImage(IHasMetadata item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) - { - return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); - } - } -} diff --git a/Emby.Server.Implementations/Playlists/PlaylistManager.cs b/Emby.Server.Implementations/Playlists/PlaylistManager.cs index 87832e7dda..f268e9c0c1 100644 --- a/Emby.Server.Implementations/Playlists/PlaylistManager.cs +++ b/Emby.Server.Implementations/Playlists/PlaylistManager.cs @@ -209,7 +209,7 @@ namespace Emby.Server.Implementations.Playlists newList.AddRange(list); playlist.LinkedChildren = newList.ToArray(newList.Count); - await playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(_fileSystem) { @@ -237,7 +237,7 @@ namespace Emby.Server.Implementations.Playlists .Select(i => i.Item1) .ToArray(); - await playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(_fileSystem) { @@ -281,7 +281,7 @@ namespace Emby.Server.Implementations.Playlists playlist.LinkedChildren = newList.ToArray(newList.Count); - await playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } public Folder GetPlaylistsFolder(string userId) diff --git a/Emby.Server.Implementations/ScheduledTasks/TaskManager.cs b/Emby.Server.Implementations/ScheduledTasks/TaskManager.cs index 5f9bf37316..c0fcb459d1 100644 --- a/Emby.Server.Implementations/ScheduledTasks/TaskManager.cs +++ b/Emby.Server.Implementations/ScheduledTasks/TaskManager.cs @@ -11,6 +11,7 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.System; using MediaBrowser.Model.Tasks; +using System.IO; namespace Emby.Server.Implementations.ScheduledTasks { @@ -86,6 +87,57 @@ namespace Emby.Server.Implementations.ScheduledTasks } } + public void RunTaskOnNextStartup(string key) + { + var path = Path.Combine(ApplicationPaths.CachePath, "startuptasks.txt"); + + List lines; + + try + { + lines = _fileSystem.ReadAllLines(path).ToList() ; + } + catch + { + lines = new List(); + } + + if (!lines.Contains(key, StringComparer.OrdinalIgnoreCase)) + { + lines.Add(key); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(path)); + _fileSystem.WriteAllLines(path, lines); + } + } + + private void RunStartupTasks() + { + var path = Path.Combine(ApplicationPaths.CachePath, "startuptasks.txt"); + + List lines; + + try + { + lines = _fileSystem.ReadAllLines(path).Where(i => !string.IsNullOrWhiteSpace(i)).Distinct(StringComparer.OrdinalIgnoreCase).ToList(); + + foreach (var key in lines) + { + var task = ScheduledTasks.FirstOrDefault(i => string.Equals(i.ScheduledTask.Key, key, StringComparison.OrdinalIgnoreCase)); + + if (task != null) + { + QueueScheduledTask(task, new TaskExecutionOptions()); + } + } + + _fileSystem.DeleteFile(path); + } + catch + { + return; + } + } + /// /// Cancels if running and queue. /// @@ -235,6 +287,8 @@ namespace Emby.Server.Implementations.ScheduledTasks ScheduledTasks = myTasks.ToArray(); BindToSystemEvent(); + + RunStartupTasks(); } /// diff --git a/Emby.Server.Implementations/Security/AuthenticationRepository.cs b/Emby.Server.Implementations/Security/AuthenticationRepository.cs index f5b847ccf9..b1877d776b 100644 --- a/Emby.Server.Implementations/Security/AuthenticationRepository.cs +++ b/Emby.Server.Implementations/Security/AuthenticationRepository.cs @@ -34,7 +34,7 @@ namespace Emby.Server.Implementations.Security string[] queries = { - "create table if not exists AccessTokens (Id GUID PRIMARY KEY, AccessToken TEXT NOT NULL, DeviceId TEXT, AppName TEXT, AppVersion TEXT, DeviceName TEXT, UserId TEXT, IsActive BIT, DateCreated DATETIME NOT NULL, DateRevoked DATETIME)", + "create table if not exists AccessTokens (Id GUID PRIMARY KEY NOT NULL, AccessToken TEXT NOT NULL, DeviceId TEXT NOT NULL, AppName TEXT NOT NULL, AppVersion TEXT NOT NULL, DeviceName TEXT NOT NULL, UserId TEXT, IsActive BIT NOT NULL, DateCreated DATETIME NOT NULL, DateRevoked DATETIME)", "create index if not exists idx_AccessTokens on AccessTokens(Id)" }; diff --git a/Emby.Server.Implementations/Security/PluginSecurityManager.cs b/Emby.Server.Implementations/Security/PluginSecurityManager.cs index d42fae3ad0..615ffa1f4b 100644 --- a/Emby.Server.Implementations/Security/PluginSecurityManager.cs +++ b/Emby.Server.Implementations/Security/PluginSecurityManager.cs @@ -293,10 +293,13 @@ namespace Emby.Server.Implementations.Security options.SetPostData(data); - using (var json = (await _httpClient.Post(options).ConfigureAwait(false)).Content) + using (var response = (await _httpClient.Post(options).ConfigureAwait(false))) { - reg = _jsonSerializer.DeserializeFromStream(json); - success = true; + using (var json = response.Content) + { + reg = _jsonSerializer.DeserializeFromStream(json); + success = true; + } } if (reg.registered) diff --git a/Emby.Server.Implementations/Session/HttpSessionController.cs b/Emby.Server.Implementations/Session/HttpSessionController.cs index bd53da1bdb..940c821e2f 100644 --- a/Emby.Server.Implementations/Session/HttpSessionController.cs +++ b/Emby.Server.Implementations/Session/HttpSessionController.cs @@ -66,19 +66,22 @@ namespace Emby.Server.Implementations.Session return SendMessage(name, new Dictionary(), cancellationToken); } - private Task SendMessage(string name, + private async Task SendMessage(string name, Dictionary args, CancellationToken cancellationToken) { var url = PostUrl + "/" + name + ToQueryString(args); - return _httpClient.Post(new HttpRequestOptions + using ((await _httpClient.Post(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, BufferContent = false - }); + }).ConfigureAwait(false))) + { + + } } public Task SendSessionEndedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs index 97506cdefd..2c15351656 100644 --- a/Emby.Server.Implementations/Session/SessionManager.cs +++ b/Emby.Server.Implementations/Session/SessionManager.cs @@ -437,7 +437,7 @@ namespace Emby.Server.Implementations.Session if (!string.IsNullOrEmpty(deviceId)) { var userIdString = userId.HasValue ? userId.Value.ToString("N") : null; - device = await _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString).ConfigureAwait(false); + device = _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString); } } @@ -446,7 +446,7 @@ namespace Emby.Server.Implementations.Session if (device == null) { var userIdString = userId.HasValue ? userId.Value.ToString("N") : null; - device = await _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString).ConfigureAwait(false); + device = _deviceManager.RegisterDevice(deviceId, deviceName, appName, appVersion, userIdString); } if (device != null) @@ -1567,7 +1567,7 @@ namespace Emby.Server.Implementations.Session ReportCapabilities(session, capabilities, true); } - private async void ReportCapabilities(SessionInfo session, + private void ReportCapabilities(SessionInfo session, ClientCapabilities capabilities, bool saveCapabilities) { @@ -1593,7 +1593,7 @@ namespace Emby.Server.Implementations.Session { try { - await SaveCapabilities(session.DeviceId, capabilities).ConfigureAwait(false); + SaveCapabilities(session.DeviceId, capabilities); } catch (Exception ex) { @@ -1607,9 +1607,9 @@ namespace Emby.Server.Implementations.Session return _deviceManager.GetCapabilities(deviceId); } - private Task SaveCapabilities(string deviceId, ClientCapabilities capabilities) + private void SaveCapabilities(string deviceId, ClientCapabilities capabilities) { - return _deviceManager.SaveCapabilities(deviceId, capabilities); + _deviceManager.SaveCapabilities(deviceId, capabilities); } public SessionInfoDto GetSessionInfoDto(SessionInfo session) diff --git a/Emby.Server.Implementations/Social/SharingRepository.cs b/Emby.Server.Implementations/Social/SharingRepository.cs index f0b8cbd30f..3c9e1024f8 100644 --- a/Emby.Server.Implementations/Social/SharingRepository.cs +++ b/Emby.Server.Implementations/Social/SharingRepository.cs @@ -50,7 +50,7 @@ namespace Emby.Server.Implementations.Social string[] queries = { - "create table if not exists Shares (Id GUID, ItemId TEXT, UserId TEXT, ExpirationDate DateTime, PRIMARY KEY (Id))", + "create table if not exists Shares (Id GUID NOT NULL, ItemId TEXT NOT NULL, UserId TEXT NOT NULL, ExpirationDate DateTime NOT NULL, PRIMARY KEY (Id))", "create index if not exists idx_Shares on Shares(Id)", "pragma shrink_memory" diff --git a/Emby.Server.Implementations/TV/TVSeriesManager.cs b/Emby.Server.Implementations/TV/TVSeriesManager.cs index ec2d8c4fc4..d92245a677 100644 --- a/Emby.Server.Implementations/TV/TVSeriesManager.cs +++ b/Emby.Server.Implementations/TV/TVSeriesManager.cs @@ -36,8 +36,6 @@ namespace Emby.Server.Implementations.TV throw new ArgumentException("User not found"); } - var parentIdGuid = string.IsNullOrWhiteSpace(request.ParentId) ? (Guid?)null : new Guid(request.ParentId); - string presentationUniqueKey = null; int? limit = null; if (!string.IsNullOrWhiteSpace(request.SeriesId)) @@ -56,10 +54,26 @@ namespace Emby.Server.Implementations.TV return GetResult(GetNextUpEpisodes(request, user, new[] { presentationUniqueKey }, dtoOptions), request); } - var parents = user.RootFolder.GetChildren(user, true) - .Where(i => i is Folder) - .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N"))) - .ToList(); + var parentIdGuid = string.IsNullOrWhiteSpace(request.ParentId) ? (Guid?)null : new Guid(request.ParentId); + + List parents; + + if (parentIdGuid.HasValue) + { + var parent = _libraryManager.GetItemById(parentIdGuid.Value); + parents = new List(); + if (parent != null) + { + parents.Add(parent); + } + } + else + { + parents = user.RootFolder.GetChildren(user, true) + .Where(i => i is Folder) + .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N"))) + .ToList(); + } return GetNextUp(request, parents, dtoOptions); } @@ -88,7 +102,7 @@ namespace Emby.Server.Implementations.TV if (!string.IsNullOrWhiteSpace(presentationUniqueKey)) { - return GetResult(GetNextUpEpisodes(request, user, new [] { presentationUniqueKey }, dtoOptions), request); + return GetResult(GetNextUpEpisodes(request, user, new[] { presentationUniqueKey }, dtoOptions), request); } if (limit.HasValue) diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs index 1804630403..51acfee881 100644 --- a/Emby.Server.Implementations/Updates/InstallationManager.cs +++ b/Emby.Server.Implementations/Updates/InstallationManager.cs @@ -175,13 +175,24 @@ namespace Emby.Server.Implementations.Updates { "systemid", _applicationHost.SystemId } }; - using (var json = await _httpClient.Post("https://www.mb3admin.com/admin/service/package/retrieveall?includeAllRuntimes=true", data, cancellationToken).ConfigureAwait(false)) + var options = new HttpRequestOptions { - cancellationToken.ThrowIfCancellationRequested(); + Url = "https://www.mb3admin.com/admin/service/package/retrieveall?includeAllRuntimes=true", + CancellationToken = cancellationToken + }; - var packages = _jsonSerializer.DeserializeFromStream(json); + options.SetPostData(data); - return FilterPackages(packages, packageType, applicationVersion); + using (var response = await _httpClient.SendAsync(options, "POST").ConfigureAwait(false)) + { + using (var json = response.Content) + { + cancellationToken.ThrowIfCancellationRequested(); + + var packages = _jsonSerializer.DeserializeFromStream(json); + + return FilterPackages(packages, packageType, applicationVersion); + } } } else @@ -442,11 +453,6 @@ namespace Emby.Server.Implementations.Updates /// Task{IEnumerable{PackageVersionInfo}}. public async Task> GetAvailablePluginUpdates(Version applicationVersion, bool withAutoUpdateEnabled, CancellationToken cancellationToken) { - if (!_config.CommonConfiguration.EnableAutoUpdate) - { - return new PackageVersionInfo[] { }; - } - var catalog = await GetAvailablePackagesWithoutRegistrationInfo(cancellationToken).ConfigureAwait(false); var systemUpdateLevel = GetSystemUpdateLevel(); diff --git a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs index fa1d5b74e5..f051e856a8 100644 --- a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs @@ -28,14 +28,6 @@ namespace Emby.Server.Implementations.UserViews { } - public override IEnumerable GetSupportedImages(IHasMetadata item) - { - return new List - { - ImageType.Primary - }; - } - protected override List GetItemsWithImages(IHasMetadata item) { var view = (CollectionFolder)item; @@ -126,14 +118,6 @@ namespace Emby.Server.Implementations.UserViews _libraryManager = libraryManager; } - public override IEnumerable GetSupportedImages(IHasMetadata item) - { - return new List - { - ImageType.Primary - }; - } - protected override List GetItemsWithImages(IHasMetadata item) { var view = (ManualCollectionsFolder)item; diff --git a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs index 885dfec58b..23b8c9b9e9 100644 --- a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs @@ -31,23 +31,6 @@ namespace Emby.Server.Implementations.UserViews _libraryManager = libraryManager; } - public override IEnumerable GetSupportedImages(IHasMetadata item) - { - var view = (UserView)item; - if (IsUsingCollectionStrip(view)) - { - return new List - { - ImageType.Primary - }; - } - - return new List - { - ImageType.Primary - }; - } - protected override List GetItemsWithImages(IHasMetadata item) { var view = (UserView)item; diff --git a/Emby.Server.Implementations/UserViews/FolderImageProvider.cs b/Emby.Server.Implementations/UserViews/FolderImageProvider.cs new file mode 100644 index 0000000000..80a74e8774 --- /dev/null +++ b/Emby.Server.Implementations/UserViews/FolderImageProvider.cs @@ -0,0 +1,100 @@ +using MediaBrowser.Common.Configuration; +using MediaBrowser.Controller.Drawing; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Providers; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Emby.Server.Implementations.Images; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Querying; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Dto; + +namespace Emby.Server.Implementations.Photos +{ + public abstract class BaseFolderImageProvider : BaseDynamicImageProvider + where T : Folder, new () + { + protected ILibraryManager _libraryManager; + + public BaseFolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor) + { + _libraryManager = libraryManager; + } + + protected override List GetItemsWithImages(IHasMetadata item) + { + return _libraryManager.GetItemList(new InternalItemsQuery + { + Parent = item as BaseItem, + GroupByPresentationUniqueKey = false, + DtoOptions = new DtoOptions(true), + ImageTypes = new ImageType[] { ImageType.Primary } + }); + } + + protected override string CreateImage(IHasMetadata item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + { + return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); + } + + protected override bool Supports(IHasMetadata item) + { + if (item is PhotoAlbum || item is MusicAlbum) + { + return true; + } + + if (item.GetType() == typeof(Folder)) + { + var folder = item as Folder; + if (folder.IsTopParent) + { + return false; + } + return true; + } + + return false; + } + + protected override bool HasChangedByDate(IHasMetadata item, ItemImageInfo image) + { + if (item is MusicAlbum) + { + return false; + } + + return base.HasChangedByDate(item, image); + } + } + + public class FolderImageProvider : BaseFolderImageProvider + { + public FolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager) + { + } + } + + public class MusicAlbumImageProvider : BaseFolderImageProvider + { + public MusicAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager) + { + } + } + + public class PhotoAlbumImageProvider : BaseFolderImageProvider + { + public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) + : base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager) + { + } + } +} diff --git a/MediaBrowser.Api/ChannelService.cs b/MediaBrowser.Api/ChannelService.cs index d64bf7ec77..2e8eb9e07d 100644 --- a/MediaBrowser.Api/ChannelService.cs +++ b/MediaBrowser.Api/ChannelService.cs @@ -101,7 +101,7 @@ namespace MediaBrowser.Api [ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] public string Fields { get; set; } - + /// /// Gets the filters. /// @@ -160,7 +160,7 @@ namespace MediaBrowser.Api [ApiMember(Name = "ChannelIds", Description = "Optional. Specify one or more channel id's, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] public string ChannelIds { get; set; } - + /// /// Gets the filters. /// @@ -177,7 +177,7 @@ namespace MediaBrowser.Api return val.Split(',').Select(v => (ItemFilter)Enum.Parse(typeof(ItemFilter), v, true)); } } - + [Route("/Channels/Folder", "GET", Summary = "Gets the users channel folder, along with configured images")] public class GetChannelFolder : IReturn { @@ -209,9 +209,9 @@ namespace MediaBrowser.Api return ToOptimizedResult(result); } - public async Task Get(GetChannelFolder request) + public object Get(GetChannelFolder request) { - return ToOptimizedResult(await _channelManager.GetChannelFolder(request.UserId, CancellationToken.None).ConfigureAwait(false)); + return ToOptimizedResult(_channelManager.GetChannelFolder(request.UserId, CancellationToken.None)); } public async Task Get(GetChannels request) diff --git a/MediaBrowser.Api/Devices/DeviceService.cs b/MediaBrowser.Api/Devices/DeviceService.cs index 012f0ddb27..c375e272a7 100644 --- a/MediaBrowser.Api/Devices/DeviceService.cs +++ b/MediaBrowser.Api/Devices/DeviceService.cs @@ -85,13 +85,11 @@ namespace MediaBrowser.Api.Devices public void Post(PostDeviceOptions request) { - var task = _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions + _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions { CustomName = request.CustomName, CameraUploadPath = request.CameraUploadPath }); - - Task.WaitAll(task); } public object Get(GetDeviceInfo request) @@ -116,9 +114,7 @@ namespace MediaBrowser.Api.Devices public void Delete(DeleteDevice request) { - var task = _deviceManager.DeleteDevice(request.Id); - - Task.WaitAll(task); + _deviceManager.DeleteDevice(request.Id); } public void Post(PostCameraUpload request) diff --git a/MediaBrowser.Api/Dlna/DlnaServerService.cs b/MediaBrowser.Api/Dlna/DlnaServerService.cs index cbef6e5b3b..6a0cea4df9 100644 --- a/MediaBrowser.Api/Dlna/DlnaServerService.cs +++ b/MediaBrowser.Api/Dlna/DlnaServerService.cs @@ -246,7 +246,7 @@ namespace MediaBrowser.Api.Dlna if (string.IsNullOrEmpty(notificationType)) { - return GetSubscriptionResponse(eventManager.RenewEventSubscription(subscriptionId, timeoutString)); + return GetSubscriptionResponse(eventManager.RenewEventSubscription(subscriptionId, notificationType, timeoutString, callback)); } return GetSubscriptionResponse(eventManager.CreateEventSubscription(notificationType, timeoutString, callback)); diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index f8481517db..2b8ac1a667 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -315,7 +315,7 @@ namespace MediaBrowser.Api.Images return list; } - private ImageInfo GetImageInfo(IHasMetadata item, ItemImageInfo info, int? imageIndex) + private ImageInfo GetImageInfo(BaseItem item, ItemImageInfo info, int? imageIndex) { try { @@ -330,11 +330,17 @@ namespace MediaBrowser.Api.Images var fileInfo = _fileSystem.GetFileInfo(info.Path); length = fileInfo.Length; - var size = _imageProcessor.GetImageSize(info, true); + var size = _imageProcessor.GetImageSize(item, info, true, true); width = Convert.ToInt32(size.Width); height = Convert.ToInt32(size.Height); + if (width <= 0 || height <= 0) + { + width = null; + height = null; + } + } } catch @@ -471,9 +477,7 @@ namespace MediaBrowser.Api.Images var item = _userManager.GetUserById(userId); - var task = item.DeleteImage(request.Type, request.Index ?? 0); - - Task.WaitAll(task); + item.DeleteImage(request.Type, request.Index ?? 0); } /// @@ -484,9 +488,7 @@ namespace MediaBrowser.Api.Images { var item = _libraryManager.GetItemById(request.Id); - var task = item.DeleteImage(request.Type, request.Index ?? 0); - - Task.WaitAll(task); + item.DeleteImage(request.Type, request.Index ?? 0); } /// @@ -497,9 +499,7 @@ namespace MediaBrowser.Api.Images { var item = _libraryManager.GetItemById(request.Id); - var task = UpdateItemIndex(item, request.Type, request.Index, request.NewIndex); - - Task.WaitAll(task); + UpdateItemIndex(item, request.Type, request.Index, request.NewIndex); } /// @@ -510,9 +510,9 @@ namespace MediaBrowser.Api.Images /// Index of the current. /// The new index. /// Task. - private Task UpdateItemIndex(IHasMetadata item, ImageType type, int currentIndex, int newIndex) + private void UpdateItemIndex(IHasMetadata item, ImageType type, int currentIndex, int newIndex) { - return item.SwapImages(type, currentIndex, newIndex); + item.SwapImages(type, currentIndex, newIndex); } /// @@ -558,7 +558,7 @@ namespace MediaBrowser.Api.Images var supportedImageEnhancers = request.EnableImageEnhancers ? _imageProcessor.GetSupportedEnhancers(item, request.Type) : new List(); - var cropwhitespace = request.Type == ImageType.Logo || + var cropwhitespace = request.Type == ImageType.Logo || request.Type == ImageType.Art || (request.Type == ImageType.Primary && item is LiveTvChannel); @@ -733,7 +733,7 @@ namespace MediaBrowser.Api.Images await _providerManager.SaveImage(entity, memoryStream, mimeType, imageType, null, CancellationToken.None).ConfigureAwait(false); - await entity.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); + entity.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } } } diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs index 3512a526ba..4782d76dfc 100644 --- a/MediaBrowser.Api/Images/RemoteImageService.cs +++ b/MediaBrowser.Api/Images/RemoteImageService.cs @@ -84,7 +84,7 @@ namespace MediaBrowser.Api.Images } [Route("/Items/{Id}/RemoteImages/Download", "POST", Summary = "Downloads a remote image for an item")] - [Authenticated(Roles="Admin")] + [Authenticated(Roles = "Admin")] public class DownloadRemoteImage : BaseDownloadRemoteImage { /// @@ -207,7 +207,7 @@ namespace MediaBrowser.Api.Images { await _providerManager.SaveImage(item, request.ImageUrl, request.Type, null, CancellationToken.None).ConfigureAwait(false); - await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } /// @@ -232,9 +232,9 @@ namespace MediaBrowser.Api.Images contentPath = _fileSystem.ReadAllText(pointerCachePath); if (_fileSystem.FileExists(contentPath)) - { - return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false); - } + { + return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false); + } } catch (FileNotFoundException) { @@ -262,28 +262,29 @@ namespace MediaBrowser.Api.Images /// Task. private async Task DownloadImage(string url, Guid urlHash, string pointerCachePath) { - var result = await _httpClient.GetResponse(new HttpRequestOptions + using (var result = await _httpClient.GetResponse(new HttpRequestOptions { Url = url, BufferContent = false - }).ConfigureAwait(false); - - var ext = result.ContentType.Split('/').Last(); - - var fullCachePath = GetFullCachePath(urlHash + "." + ext); - - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fullCachePath)); - using (var stream = result.Content) + }).ConfigureAwait(false)) { - using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) - { - await stream.CopyToAsync(filestream).ConfigureAwait(false); - } - } + var ext = result.ContentType.Split('/').Last(); - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(pointerCachePath)); - _fileSystem.WriteAllText(pointerCachePath, fullCachePath); + var fullCachePath = GetFullCachePath(urlHash + "." + ext); + + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fullCachePath)); + using (var stream = result.Content) + { + using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + { + await stream.CopyToAsync(filestream).ConfigureAwait(false); + } + } + + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(pointerCachePath)); + _fileSystem.WriteAllText(pointerCachePath, fullCachePath); + } } /// diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index 53a67ff712..a55741d7dc 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -124,24 +124,24 @@ namespace MediaBrowser.Api { list.Add(new NameValuePair { - Name = "FolderTypeInherit", + Name = "Inherit", Value = "" }); } list.Add(new NameValuePair { - Name = "FolderTypeMovies", + Name = "Movies", Value = "movies" }); list.Add(new NameValuePair { - Name = "FolderTypeMusic", + Name = "Music", Value = "music" }); list.Add(new NameValuePair { - Name = "FolderTypeTvShows", + Name = "Shows", Value = "tvshows" }); @@ -149,29 +149,29 @@ namespace MediaBrowser.Api { list.Add(new NameValuePair { - Name = "FolderTypeBooks", + Name = "Books", Value = "books" }); list.Add(new NameValuePair { - Name = "FolderTypeGames", + Name = "Games", Value = "games" }); } list.Add(new NameValuePair { - Name = "FolderTypeHomeVideos", + Name = "HomeVideos", Value = "homevideos" }); list.Add(new NameValuePair { - Name = "FolderTypeMusicVideos", + Name = "MusicVideos", Value = "musicvideos" }); list.Add(new NameValuePair { - Name = "FolderTypePhotos", + Name = "Photos", Value = "photos" }); @@ -179,7 +179,7 @@ namespace MediaBrowser.Api { list.Add(new NameValuePair { - Name = "FolderTypeMixed", + Name = "MixedContent", Value = "" }); } @@ -193,13 +193,6 @@ namespace MediaBrowser.Api } public void Post(UpdateItem request) - { - var task = UpdateItem(request); - - Task.WaitAll(task); - } - - private async Task UpdateItem(UpdateItem request) { var item = _libraryManager.GetItemById(request.ItemId); @@ -216,7 +209,7 @@ namespace MediaBrowser.Api item.OnMetadataChanged(); - await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); if (isLockedChanged && item.IsFolder) { @@ -225,7 +218,7 @@ namespace MediaBrowser.Api foreach (var child in folder.GetRecursiveChildren()) { child.IsLocked = newLockData; - await child.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + child.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } } } diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index 36bcee913f..703c96e0c6 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs @@ -734,7 +734,7 @@ namespace MediaBrowser.Api.LiveTv outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType(path); - return new ProgressiveFileCopier(_fileSystem, path, outputHeaders, Logger, _environment, CancellationToken.None) + return new ProgressiveFileCopier(_fileSystem, path, outputHeaders, Logger, _environment) { AllowEndOfFile = false }; @@ -753,7 +753,7 @@ namespace MediaBrowser.Api.LiveTv outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType("file." + request.Container); - return new ProgressiveFileCopier(directStreamProvider, outputHeaders, Logger, _environment, CancellationToken.None) + return new ProgressiveFileCopier(directStreamProvider, outputHeaders, Logger, _environment) { AllowEndOfFile = false }; @@ -892,11 +892,11 @@ namespace MediaBrowser.Api.LiveTv return ToOptimizedSerializedResultUsingCache(info); } - public async Task Get(GetChannels request) + public object Get(GetChannels request) { var options = GetDtoOptions(_authContext, request); - var channelResult = await _liveTvManager.GetInternalChannels(new LiveTvChannelQuery + var channelResult = _liveTvManager.GetInternalChannels(new LiveTvChannelQuery { ChannelType = request.Type, UserId = request.UserId, @@ -915,7 +915,7 @@ namespace MediaBrowser.Api.LiveTv SortOrder = request.SortOrder ?? SortOrder.Ascending, AddCurrentProgram = request.AddCurrentProgram - }, options, CancellationToken.None).ConfigureAwait(false); + }, options, CancellationToken.None); var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(request.UserId); @@ -947,9 +947,9 @@ namespace MediaBrowser.Api.LiveTv public object Get(GetChannel request) { - var user = string.IsNullOrWhiteSpace(request.UserId) ? null : _userManager.GetUserById(request.UserId); + var user = _userManager.GetUserById(request.UserId); - var item = _libraryManager.GetItemById(request.Id); + var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); var dtoOptions = GetDtoOptions(_authContext, request); @@ -958,9 +958,9 @@ namespace MediaBrowser.Api.LiveTv return ToOptimizedSerializedResultUsingCache(result); } - public async Task Get(GetLiveTvFolder request) + public object Get(GetLiveTvFolder request) { - return ToOptimizedResult(await _liveTvManager.GetLiveTvFolder(request.UserId, CancellationToken.None).ConfigureAwait(false)); + return ToOptimizedResult(_liveTvManager.GetLiveTvFolder(request.UserId, CancellationToken.None)); } public async Task Get(GetPrograms request) @@ -1020,7 +1020,7 @@ namespace MediaBrowser.Api.LiveTv return ToOptimizedResult(result); } - public async Task Get(GetRecommendedPrograms request) + public object Get(GetRecommendedPrograms request) { var query = new RecommendedProgramQuery { @@ -1036,7 +1036,7 @@ namespace MediaBrowser.Api.LiveTv EnableTotalRecordCount = request.EnableTotalRecordCount }; - var result = await _liveTvManager.GetRecommendedPrograms(query, GetDtoOptions(_authContext, request), CancellationToken.None).ConfigureAwait(false); + var result = _liveTvManager.GetRecommendedPrograms(query, GetDtoOptions(_authContext, request), CancellationToken.None); return ToOptimizedResult(result); } @@ -1098,12 +1098,13 @@ namespace MediaBrowser.Api.LiveTv public async Task Get(GetRecording request) { - var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(request.UserId); + var user = _userManager.GetUserById(request.UserId); - var options = new DtoOptions(); - options.DeviceId = _authContext.GetAuthorizationInfo(Request).DeviceId; + var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); - var result = await _liveTvManager.GetRecording(request.Id, options, CancellationToken.None, user).ConfigureAwait(false); + var dtoOptions = GetDtoOptions(_authContext, request); + + var result = _dtoService.GetBaseItemDto(item, dtoOptions, user); return ToOptimizedSerializedResultUsingCache(result); } diff --git a/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs b/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs index 9ce109fc40..74293ccd90 100644 --- a/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs +++ b/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs @@ -16,7 +16,6 @@ namespace MediaBrowser.Api.LiveTv private readonly IFileSystem _fileSystem; private readonly ILogger _logger; private readonly string _path; - private readonly CancellationToken _cancellationToken; private readonly Dictionary _outputHeaders; const int StreamCopyToBufferSize = 81920; @@ -28,22 +27,20 @@ namespace MediaBrowser.Api.LiveTv private readonly IDirectStreamProvider _directStreamProvider; private readonly IEnvironmentInfo _environment; - public ProgressiveFileCopier(IFileSystem fileSystem, string path, Dictionary outputHeaders, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken) + public ProgressiveFileCopier(IFileSystem fileSystem, string path, Dictionary outputHeaders, ILogger logger, IEnvironmentInfo environment) { _fileSystem = fileSystem; _path = path; _outputHeaders = outputHeaders; _logger = logger; - _cancellationToken = cancellationToken; _environment = environment; } - public ProgressiveFileCopier(IDirectStreamProvider directStreamProvider, Dictionary outputHeaders, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken) + public ProgressiveFileCopier(IDirectStreamProvider directStreamProvider, Dictionary outputHeaders, ILogger logger, IEnvironmentInfo environment) { _directStreamProvider = directStreamProvider; _outputHeaders = outputHeaders; _logger = logger; - _cancellationToken = cancellationToken; _environment = environment; } @@ -69,8 +66,6 @@ namespace MediaBrowser.Api.LiveTv public async Task WriteToAsync(Stream outputStream, CancellationToken cancellationToken) { - cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _cancellationToken).Token; - if (_directStreamProvider != null) { await _directStreamProvider.CopyToAsync(outputStream, cancellationToken).ConfigureAwait(false); @@ -89,7 +84,9 @@ namespace MediaBrowser.Api.LiveTv inputStream.Position = StartPosition; } - while (eofCount < 20 || !AllowEndOfFile) + var emptyReadLimit = AllowEndOfFile ? 20 : 100; + + while (eofCount < emptyReadLimit) { int bytesRead; if (allowAsyncFileRead) diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index ddb187f3d9..650306ea60 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -40,7 +40,6 @@ Properties\SharedVersion.cs - diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs index ee74ec450c..69ce6a385d 100644 --- a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs +++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs @@ -4,6 +4,7 @@ using MediaBrowser.Model.Tasks; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using MediaBrowser.Controller.Net; using MediaBrowser.Model.Threading; namespace MediaBrowser.Api.ScheduledTasks diff --git a/MediaBrowser.Api/Session/SessionsService.cs b/MediaBrowser.Api/Session/SessionsService.cs index 8f54b591e7..e961f9d516 100644 --- a/MediaBrowser.Api/Session/SessionsService.cs +++ b/MediaBrowser.Api/Session/SessionsService.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.Services; +using MediaBrowser.Controller; namespace MediaBrowser.Api.Session { @@ -293,15 +294,9 @@ namespace MediaBrowser.Api.Session private readonly IAuthenticationRepository _authRepo; private readonly IDeviceManager _deviceManager; private readonly ISessionContext _sessionContext; + private IServerApplicationHost _appHost; - /// - /// Initializes a new instance of the class. - /// - /// The session manager. - /// The user manager. - /// The authentication context. - /// The authentication repo. - public SessionsService(ISessionManager sessionManager, IUserManager userManager, IAuthorizationContext authContext, IAuthenticationRepository authRepo, IDeviceManager deviceManager, ISessionContext sessionContext) + public SessionsService(ISessionManager sessionManager, IServerApplicationHost appHost, IUserManager userManager, IAuthorizationContext authContext, IAuthenticationRepository authRepo, IDeviceManager deviceManager, ISessionContext sessionContext) { _sessionManager = sessionManager; _userManager = userManager; @@ -309,6 +304,7 @@ namespace MediaBrowser.Api.Session _authRepo = authRepo; _deviceManager = deviceManager; _sessionContext = sessionContext; + _appHost = appHost; } public void Delete(RevokeKey request) @@ -324,7 +320,10 @@ namespace MediaBrowser.Api.Session AppName = request.App, IsActive = true, AccessToken = Guid.NewGuid().ToString("N"), - DateCreated = DateTime.UtcNow + DateCreated = DateTime.UtcNow, + DeviceId = _appHost.SystemId, + DeviceName = _appHost.FriendlyName, + AppVersion = _appHost.ApplicationVersion.ToString() }, CancellationToken.None); } diff --git a/MediaBrowser.Api/StartupWizardService.cs b/MediaBrowser.Api/StartupWizardService.cs index 22f1f3b62c..52a5e444f3 100644 --- a/MediaBrowser.Api/StartupWizardService.cs +++ b/MediaBrowser.Api/StartupWizardService.cs @@ -95,6 +95,7 @@ namespace MediaBrowser.Api config.EnableSimpleArtistDetection = true; config.EnableNormalizedItemByNameIds = true; config.DisableLiveTvChannelUserDataName = true; + config.EnableNewOmdbSupport = true; } public void Post(UpdateStartupConfiguration request) diff --git a/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs b/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs index c641695dd8..793f745713 100644 --- a/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs +++ b/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs @@ -3,6 +3,7 @@ using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using System.Collections.Generic; using System.Threading.Tasks; +using MediaBrowser.Controller.Net; using MediaBrowser.Model.Threading; namespace MediaBrowser.Api.System diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 5fe386f1ab..1e531ba664 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -117,7 +117,9 @@ namespace MediaBrowser.Api.UserLibrary IsVirtualItem = false, CollapseBoxSetItems = false, EnableTotalRecordCount = request.EnableTotalRecordCount, - AncestorIds = ancestorIds.ToArray() + AncestorIds = ancestorIds.ToArray(), + IncludeItemTypes = request.GetIncludeItemTypes(), + ExcludeItemTypes = request.GetExcludeItemTypes() }); var returnItems = _dtoService.GetBaseItemDtos(itemsResult.Items, options, user); diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs index 3bd0497f7e..3f840dbfa3 100644 --- a/MediaBrowser.Api/VideosService.cs +++ b/MediaBrowser.Api/VideosService.cs @@ -109,13 +109,6 @@ namespace MediaBrowser.Api } public void Delete(DeleteAlternateSources request) - { - var task = DeleteAsync(request); - - Task.WaitAll(task); - } - - public async Task DeleteAsync(DeleteAlternateSources request) { var video = (Video)_libraryManager.GetItemById(request.Id); @@ -123,21 +116,14 @@ namespace MediaBrowser.Api { link.PrimaryVersionId = null; - await link.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + link.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } video.LinkedAlternateVersions = Video.EmptyLinkedChildArray; - await video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } public void Post(MergeVersions request) - { - var task = PostAsync(request); - - Task.WaitAll(task); - } - - public async Task PostAsync(MergeVersions request) { var items = request.Ids.Split(',') .Select(i => _libraryManager.GetItemById(i)) @@ -162,19 +148,19 @@ namespace MediaBrowser.Api if (primaryVersion == null) { primaryVersion = items.OrderBy(i => - { - if (i.Video3DFormat.HasValue) { - return 1; - } + if (i.Video3DFormat.HasValue) + { + return 1; + } - if (i.VideoType != Model.Entities.VideoType.VideoFile) - { - return 1; - } + if (i.VideoType != Model.Entities.VideoType.VideoFile) + { + return 1; + } - return 0; - }) + return 0; + }) .ThenByDescending(i => { var stream = i.GetDefaultVideoStream(); @@ -190,7 +176,7 @@ namespace MediaBrowser.Api { item.PrimaryVersionId = primaryVersion.Id.ToString("N"); - await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); list.Add(new LinkedChild { @@ -201,7 +187,7 @@ namespace MediaBrowser.Api primaryVersion.LinkedAlternateVersions = list.ToArray(); - await primaryVersion.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + primaryVersion.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } } } diff --git a/MediaBrowser.Common/Net/HttpRequestOptions.cs b/MediaBrowser.Common/Net/HttpRequestOptions.cs index 4a894e6624..51859ecdb5 100644 --- a/MediaBrowser.Common/Net/HttpRequestOptions.cs +++ b/MediaBrowser.Common/Net/HttpRequestOptions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading; +using System.Text; namespace MediaBrowser.Common.Net { @@ -90,6 +91,7 @@ namespace MediaBrowser.Common.Net public bool BufferContent { get; set; } public bool LogRequest { get; set; } + public bool LogRequestAsDebug { get; set; } public bool LogErrors { get; set; } public bool LogErrorResponseBody { get; set; } @@ -102,6 +104,8 @@ namespace MediaBrowser.Common.Net public bool PreferIpv4 { get; set; } public bool EnableDefaultUserAgent { get; set; } + public bool AppendCharsetToMimeType { get; set; } + private string GetHeaderValue(string name) { string value; diff --git a/MediaBrowser.Common/Net/IHttpClient.cs b/MediaBrowser.Common/Net/IHttpClient.cs index 15257715f5..cf55119653 100644 --- a/MediaBrowser.Common/Net/IHttpClient.cs +++ b/MediaBrowser.Common/Net/IHttpClient.cs @@ -18,24 +18,6 @@ namespace MediaBrowser.Common.Net /// Task{HttpResponseInfo}. Task GetResponse(HttpRequestOptions options); - /// - /// Performs a GET request and returns the resulting stream - /// - /// The URL. - /// The resource pool. - /// The cancellation token. - /// Task{Stream}. - /// - Task Get(string url, SemaphoreSlim resourcePool, CancellationToken cancellationToken); - - /// - /// Gets the specified URL. - /// - /// The URL. - /// The cancellation token. - /// Task{Stream}. - Task Get(string url, CancellationToken cancellationToken); - /// /// Gets the specified options. /// @@ -51,35 +33,6 @@ namespace MediaBrowser.Common.Net /// Task{HttpResponseInfo}. Task SendAsync(HttpRequestOptions options, string httpMethod); - /// - /// Performs a POST request - /// - /// The URL. - /// Params to add to the POST data. - /// The resource pool. - /// The cancellation token. - /// stream on success, null on failure - /// postData - /// - Task Post(string url, Dictionary postData, SemaphoreSlim resourcePool, CancellationToken cancellationToken); - - /// - /// Posts the specified URL. - /// - /// The URL. - /// The post data. - /// The cancellation token. - /// Task{Stream}. - Task Post(string url, Dictionary postData, CancellationToken cancellationToken); - - /// - /// Posts the specified options with post data - /// - /// The options - /// The post data - /// Task{Stream} - Task Post(HttpRequestOptions options, Dictionary postData); - /// /// Posts the specified options. /// diff --git a/MediaBrowser.Common/Updates/GithubUpdater.cs b/MediaBrowser.Common/Updates/GithubUpdater.cs index 2106ac6d52..30abdc5da5 100644 --- a/MediaBrowser.Common/Updates/GithubUpdater.cs +++ b/MediaBrowser.Common/Updates/GithubUpdater.cs @@ -40,11 +40,14 @@ namespace MediaBrowser.Common.Updates options.CacheLength = cacheLength; } - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(options, "GET").ConfigureAwait(false)) { - var obj = _jsonSerializer.DeserializeFromStream(stream); + using (var stream = response.Content) + { + var obj = _jsonSerializer.DeserializeFromStream(stream); - return CheckForUpdateResult(obj, minVersion, updateLevel, assetFilename, packageName, targetFilename); + return CheckForUpdateResult(obj, minVersion, updateLevel, assetFilename, packageName, targetFilename); + } } } @@ -110,17 +113,20 @@ namespace MediaBrowser.Common.Updates BufferContent = false }; - using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) + using (var response = await _httpClient.SendAsync(options, "GET").ConfigureAwait(false)) { - var obj = _jsonSerializer.DeserializeFromStream(stream); + using (var stream = response.Content) + { + var obj = _jsonSerializer.DeserializeFromStream(stream); - obj = obj.Where(i => (i.assets ?? new List()).Any(a => IsAsset(a, assetFilename, i.tag_name))).ToArray(); + obj = obj.Where(i => (i.assets ?? new List()).Any(a => IsAsset(a, assetFilename, i.tag_name))).ToArray(); - list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Release)).OrderByDescending(GetVersion).Take(1)); - list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Beta)).OrderByDescending(GetVersion).Take(1)); - list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Dev)).OrderByDescending(GetVersion).Take(1)); + list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Release)).OrderByDescending(GetVersion).Take(1)); + list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Beta)).OrderByDescending(GetVersion).Take(1)); + list.AddRange(obj.Where(i => MatchesUpdateLevel(i, PackageVersionClass.Dev)).OrderByDescending(GetVersion).Take(1)); - return list; + return list; + } } } diff --git a/MediaBrowser.Controller/Channels/Channel.cs b/MediaBrowser.Controller/Channels/Channel.cs index f74c019947..54faa14432 100644 --- a/MediaBrowser.Controller/Channels/Channel.cs +++ b/MediaBrowser.Controller/Channels/Channel.cs @@ -32,14 +32,6 @@ namespace MediaBrowser.Controller.Channels return base.IsVisible(user); } - public override double? GetDefaultPrimaryImageAspectRatio() - { - double value = 16; - value /= 9; - - return value; - } - [IgnoreDataMember] public override bool SupportsInheritedParentImages { diff --git a/MediaBrowser.Controller/Channels/IChannelManager.cs b/MediaBrowser.Controller/Channels/IChannelManager.cs index 46e55a21ce..37fc892b36 100644 --- a/MediaBrowser.Controller/Channels/IChannelManager.cs +++ b/MediaBrowser.Controller/Channels/IChannelManager.cs @@ -117,14 +117,13 @@ namespace MediaBrowser.Controller.Channels /// /// The cancellation token. /// BaseItemDto. - Task GetInternalChannelFolder(CancellationToken cancellationToken); + Folder GetInternalChannelFolder(CancellationToken cancellationToken); /// /// Gets the channel folder. /// /// The user identifier. /// The cancellation token. - /// BaseItemDto. - Task GetChannelFolder(string userId, CancellationToken cancellationToken); + BaseItemDto GetChannelFolder(string userId, CancellationToken cancellationToken); } } diff --git a/MediaBrowser.Controller/Devices/IDeviceManager.cs b/MediaBrowser.Controller/Devices/IDeviceManager.cs index 2846bcfc64..676db09aa7 100644 --- a/MediaBrowser.Controller/Devices/IDeviceManager.cs +++ b/MediaBrowser.Controller/Devices/IDeviceManager.cs @@ -28,7 +28,7 @@ namespace MediaBrowser.Controller.Devices /// The application version. /// The used by user identifier. /// Task. - Task RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId); + DeviceInfo RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId); /// /// Saves the capabilities. @@ -36,7 +36,7 @@ namespace MediaBrowser.Controller.Devices /// The reported identifier. /// The capabilities. /// Task. - Task SaveCapabilities(string reportedId, ClientCapabilities capabilities); + void SaveCapabilities(string reportedId, ClientCapabilities capabilities); /// /// Gets the capabilities. @@ -58,7 +58,7 @@ namespace MediaBrowser.Controller.Devices /// The identifier. /// The options. /// Task. - Task UpdateDeviceInfo(string id, DeviceOptions options); + void UpdateDeviceInfo(string id, DeviceOptions options); /// /// Gets the devices. @@ -67,12 +67,7 @@ namespace MediaBrowser.Controller.Devices /// IEnumerable<DeviceInfo>. QueryResult GetDevices(DeviceQuery query); - /// - /// Deletes the device. - /// - /// The identifier. - /// Task. - Task DeleteDevice(string id); + void DeleteDevice(string id); /// /// Gets the upload history. diff --git a/MediaBrowser.Controller/Devices/IDeviceRepository.cs b/MediaBrowser.Controller/Devices/IDeviceRepository.cs index 736504da30..b9ebbb6c71 100644 --- a/MediaBrowser.Controller/Devices/IDeviceRepository.cs +++ b/MediaBrowser.Controller/Devices/IDeviceRepository.cs @@ -1,7 +1,6 @@ using MediaBrowser.Model.Devices; using MediaBrowser.Model.Session; using System.Collections.Generic; -using System.Threading.Tasks; namespace MediaBrowser.Controller.Devices { @@ -12,7 +11,7 @@ namespace MediaBrowser.Controller.Devices /// /// The device. /// Task. - Task SaveDevice(DeviceInfo device); + void SaveDevice(DeviceInfo device); /// /// Saves the capabilities. @@ -20,7 +19,7 @@ namespace MediaBrowser.Controller.Devices /// The identifier. /// The capabilities. /// Task. - Task SaveCapabilities(string id, ClientCapabilities capabilities); + void SaveCapabilities(string id, ClientCapabilities capabilities); /// /// Gets the capabilities. @@ -36,18 +35,14 @@ namespace MediaBrowser.Controller.Devices /// DeviceInfo. DeviceInfo GetDevice(string id); - /// - /// Gets the devices. - /// - /// IEnumerable<DeviceInfo>. - IEnumerable GetDevices(); + List GetDevices(); /// /// Deletes the device. /// /// The identifier. /// Task. - Task DeleteDevice(string id); + void DeleteDevice(string id); /// /// Gets the upload history. diff --git a/MediaBrowser.Controller/Dlna/IEventManager.cs b/MediaBrowser.Controller/Dlna/IEventManager.cs index 8c91bd889d..3af357a174 100644 --- a/MediaBrowser.Controller/Dlna/IEventManager.cs +++ b/MediaBrowser.Controller/Dlna/IEventManager.cs @@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Dlna /// /// Renews the event subscription. /// - EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string requestedTimeoutString); + EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string notificationType, string requestedTimeoutString, string callbackUrl); /// /// Creates the event subscription. diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs index 542fa5e08f..0bc92ac7e7 100644 --- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs +++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs @@ -26,21 +26,16 @@ namespace MediaBrowser.Controller.Drawing /// The image enhancers. IImageEnhancer[] ImageEnhancers { get; } + ImageSize GetImageSize(string path); + /// /// Gets the size of the image. /// /// The information. /// ImageSize. - ImageSize GetImageSize(ItemImageInfo info); + ImageSize GetImageSize(BaseItem item, ItemImageInfo info); - ImageSize GetImageSize(ItemImageInfo info, bool allowSlowMethods); - - /// - /// Gets the size of the image. - /// - /// The path. - /// ImageSize. - ImageSize GetImageSize(string path); + ImageSize GetImageSize(BaseItem item, ItemImageInfo info, bool allowSlowMethods, bool updateItem); /// /// Adds the parts. diff --git a/MediaBrowser.Controller/Dto/IDtoService.cs b/MediaBrowser.Controller/Dto/IDtoService.cs index c0217330d8..5ba6e036e4 100644 --- a/MediaBrowser.Controller/Dto/IDtoService.cs +++ b/MediaBrowser.Controller/Dto/IDtoService.cs @@ -23,14 +23,14 @@ namespace MediaBrowser.Controller.Dto /// /// The dto. /// The item. - void AttachPrimaryImageAspectRatio(IItemDto dto, IHasMetadata item); + void AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item); /// /// Gets the primary image aspect ratio. /// /// The item. /// System.Nullable<System.Double>. - double? GetPrimaryImageAspectRatio(IHasMetadata item); + double? GetPrimaryImageAspectRatio(BaseItem item); /// /// Gets the base item dto. diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index 02a9f15a95..16fd75d2e9 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -60,6 +60,12 @@ namespace MediaBrowser.Controller.Entities.Audio } } + [IgnoreDataMember] + public override bool SupportsPeople + { + get { return false; } + } + [IgnoreDataMember] public override bool SupportsAddingToPlaylist { diff --git a/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs b/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs index d2b4569baf..1b717b900a 100644 --- a/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs +++ b/MediaBrowser.Controller/Entities/Audio/AudioPodcast.cs @@ -1,8 +1,9 @@ -using MediaBrowser.Model.Serialization; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities.Audio { - public class AudioPodcast : Audio + public class AudioPodcast : Audio, IHasLookupInfo { [IgnoreDataMember] public override bool SupportsPositionTicksResume @@ -13,6 +14,15 @@ namespace MediaBrowser.Controller.Entities.Audio } } + [IgnoreDataMember] + public override bool SupportsPlayedStatus + { + get + { + return true; + } + } + public override double? GetDefaultPrimaryImageAspectRatio() { return 1; diff --git a/MediaBrowser.Controller/Entities/AudioBook.cs b/MediaBrowser.Controller/Entities/AudioBook.cs index 1bdcfb881e..374bb21f74 100644 --- a/MediaBrowser.Controller/Entities/AudioBook.cs +++ b/MediaBrowser.Controller/Entities/AudioBook.cs @@ -1,11 +1,12 @@ using System; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Entities { - public class AudioBook : Audio.Audio, IHasSeries + public class AudioBook : Audio.Audio, IHasSeries, IHasLookupInfo { [IgnoreDataMember] public override bool SupportsPositionTicksResume @@ -50,12 +51,6 @@ namespace MediaBrowser.Controller.Entities return null; } - [IgnoreDataMember] - public override bool EnableRefreshOnDateModifiedChange - { - get { return true; } - } - public Guid? FindSeriesId() { return SeriesId; diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 502ba6c60e..89d48ff90f 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -477,14 +477,36 @@ namespace MediaBrowser.Controller.Entities locationType != LocationType.Virtual; } - public virtual bool IsAuthorizedToDelete(User user) + public virtual bool IsAuthorizedToDelete(User user, List allCollectionFolders) { - return user.Policy.EnableContentDeletion; + if (user.Policy.EnableContentDeletion) + { + return true; + } + + var allowed = user.Policy.EnableContentDeletionFromFolders; + var collectionFolders = LibraryManager.GetCollectionFolders(this, allCollectionFolders); + + foreach (var folder in collectionFolders) + { + if (allowed.Contains(folder.Id.ToString("N"), StringComparer.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + } + + public bool CanDelete(User user, List allCollectionFolders) + { + return CanDelete() && IsAuthorizedToDelete(user, allCollectionFolders); } public bool CanDelete(User user) { - return CanDelete() && IsAuthorizedToDelete(user); + var allCollectionFolders = LibraryManager.GetUserRootFolder().Children.OfType().ToList(); + return CanDelete(user, allCollectionFolders); } public virtual bool CanDownload() @@ -1142,7 +1164,7 @@ namespace MediaBrowser.Controller.Entities [IgnoreDataMember] public virtual bool SupportsPeople { - get { return true; } + get { return false; } } [IgnoreDataMember] @@ -1281,8 +1303,8 @@ namespace MediaBrowser.Controller.Entities { var subOptions = new MetadataRefreshOptions(options); - if (!i.ExtraType.HasValue || - i.ExtraType.Value != Model.Entities.ExtraType.ThemeSong || + if (!i.ExtraType.HasValue || + i.ExtraType.Value != Model.Entities.ExtraType.ThemeSong || i.OwnerId != ownerId || i.ParentId != Guid.Empty) { @@ -1356,14 +1378,20 @@ namespace MediaBrowser.Controller.Entities internal virtual bool IsValidFromResolver(BaseItem newItem) { - var current = this; + return true; + } - if (current.IsInMixedFolder != newItem.IsInMixedFolder) + internal virtual ItemUpdateType UpdateFromResolvedItem(BaseItem newItem) + { + var updateType = ItemUpdateType.None; + + if (IsInMixedFolder != newItem.IsInMixedFolder) { - return false; + IsInMixedFolder = newItem.IsInMixedFolder; + updateType |= ItemUpdateType.MetadataImport; } - return true; + return updateType; } public void AfterMetadataRefresh() @@ -1924,6 +1952,8 @@ namespace MediaBrowser.Controller.Entities { existingImage.Path = image.Path; existingImage.DateModified = image.DateModified; + existingImage.Width = image.Width; + existingImage.Height = image.Height; } else @@ -1966,14 +1996,14 @@ namespace MediaBrowser.Controller.Entities /// The type. /// The index. /// Task. - public Task DeleteImage(ImageType type, int index) + public void DeleteImage(ImageType type, int index) { var info = GetImageInfo(type, index); if (info == null) { // Nothing to do - return Task.FromResult(true); + return; } // Remove it from the item @@ -1984,7 +2014,7 @@ namespace MediaBrowser.Controller.Entities FileSystem.DeleteFile(info.Path); } - return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); + UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } public void RemoveImage(ItemImageInfo image) @@ -1997,9 +2027,9 @@ namespace MediaBrowser.Controller.Entities ImageInfos = ImageInfos.Except(deletedImages).ToArray(); } - public virtual Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) + public virtual void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { - return LibraryManager.UpdateItem(this, updateReason, cancellationToken); + LibraryManager.UpdateItem(this, updateReason, cancellationToken); } /// @@ -2209,7 +2239,7 @@ namespace MediaBrowser.Controller.Entities return type == ImageType.Backdrop || type == ImageType.Screenshot || type == ImageType.Chapter; } - public Task SwapImages(ImageType type, int index1, int index2) + public void SwapImages(ImageType type, int index1, int index2) { if (!AllowsMultipleImages(type)) { @@ -2222,13 +2252,13 @@ namespace MediaBrowser.Controller.Entities if (info1 == null || info2 == null) { // Nothing to do - return Task.FromResult(true); + return; } if (!info1.IsLocalFile || !info2.IsLocalFile) { // TODO: Not supported yet - return Task.FromResult(true); + return; } var path1 = info1.Path; @@ -2240,7 +2270,12 @@ namespace MediaBrowser.Controller.Entities info1.DateModified = FileSystem.GetLastWriteTimeUtc(info1.Path); info2.DateModified = FileSystem.GetLastWriteTimeUtc(info2.Path); - return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); + info1.Width = 0; + info1.Height = 0; + info2.Width = 0; + info2.Height = 0; + + UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } public virtual bool IsPlayed(User user) @@ -2526,15 +2561,6 @@ namespace MediaBrowser.Controller.Entities return LibraryManager.DeleteItem(this, options); } - public virtual Task OnFileDeleted() - { - // Remove from database - return Delete(new DeleteOptions - { - DeleteFileLocation = false - }); - } - public virtual List GetRelatedUrls() { return new List(); diff --git a/MediaBrowser.Controller/Entities/Book.cs b/MediaBrowser.Controller/Entities/Book.cs index 9b1a52f836..45e3915ce2 100644 --- a/MediaBrowser.Controller/Entities/Book.cs +++ b/MediaBrowser.Controller/Entities/Book.cs @@ -38,12 +38,6 @@ namespace MediaBrowser.Controller.Entities return SeriesPresentationUniqueKey; } - [IgnoreDataMember] - public override bool EnableRefreshOnDateModifiedChange - { - get { return true; } - } - public Guid? FindSeriesId() { return SeriesId; diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 6d88f70152..ce7145a791 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -328,11 +328,6 @@ namespace MediaBrowser.Controller.Entities return dictionary; } - private bool IsValidFromResolver(BaseItem current, BaseItem newItem) - { - return current.IsValidFromResolver(newItem); - } - protected override void TriggerOnRefreshStart() { } @@ -421,10 +416,15 @@ namespace MediaBrowser.Controller.Entities { BaseItem currentChild; - if (currentChildren.TryGetValue(child.Id, out currentChild) && IsValidFromResolver(currentChild, child)) + if (currentChildren.TryGetValue(child.Id, out currentChild) && currentChild.IsValidFromResolver(child)) { validChildren.Add(currentChild); + if (currentChild.UpdateFromResolvedItem(child) > ItemUpdateType.None) + { + currentChild.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken); + } + continue; } @@ -542,7 +542,6 @@ namespace MediaBrowser.Controller.Entities if (validChildrenNeedGeneration) { validChildren = Children.ToList(); - validChildrenNeedGeneration = false; } await RefreshMetadataRecursive(validChildren, refreshOptions, recursive, innerProgress, cancellationToken); diff --git a/MediaBrowser.Controller/Entities/Game.cs b/MediaBrowser.Controller/Entities/Game.cs index a99058925f..bead0ef955 100644 --- a/MediaBrowser.Controller/Entities/Game.cs +++ b/MediaBrowser.Controller/Entities/Game.cs @@ -29,15 +29,15 @@ namespace MediaBrowser.Controller.Entities } [IgnoreDataMember] - public override bool EnableRefreshOnDateModifiedChange + public override bool SupportsThemeMedia { get { return true; } } [IgnoreDataMember] - public override bool SupportsThemeMedia + public override bool SupportsPeople { - get { return true; } + get { return false; } } /// diff --git a/MediaBrowser.Controller/Entities/IHasMetadata.cs b/MediaBrowser.Controller/Entities/IHasMetadata.cs index 4146686b21..b7d31b4d6a 100644 --- a/MediaBrowser.Controller/Entities/IHasMetadata.cs +++ b/MediaBrowser.Controller/Entities/IHasMetadata.cs @@ -151,11 +151,7 @@ namespace MediaBrowser.Controller.Entities /// /// Swaps the images. /// - /// The type. - /// The index1. - /// The index2. - /// Task. - Task SwapImages(ImageType type, int index1, int index2); + void SwapImages(ImageType type, int index1, int index2); /// /// Gets or sets the primary image path. @@ -249,10 +245,7 @@ namespace MediaBrowser.Controller.Entities /// /// Updates to repository. /// - /// The update reason. - /// The cancellation token. - /// Task. - Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); + void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); /// /// Sets the image. diff --git a/MediaBrowser.Controller/Entities/ItemImageInfo.cs b/MediaBrowser.Controller/Entities/ItemImageInfo.cs index 6b2d2392dc..bd0011c4b3 100644 --- a/MediaBrowser.Controller/Entities/ItemImageInfo.cs +++ b/MediaBrowser.Controller/Entities/ItemImageInfo.cs @@ -24,6 +24,9 @@ namespace MediaBrowser.Controller.Entities /// The date modified. public DateTime DateModified { get; set; } + public int Width { get; set; } + public int Height { get; set; } + [IgnoreDataMember] public bool IsLocalFile { diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs index bd8d9024d4..268860ff01 100644 --- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs +++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs @@ -45,6 +45,12 @@ namespace MediaBrowser.Controller.Entities.Movies } } + [IgnoreDataMember] + public override bool SupportsPeople + { + get { return true; } + } + public Guid[] LocalTrailerIds { get; set; } public Guid[] RemoteTrailerIds { get; set; } @@ -126,7 +132,7 @@ namespace MediaBrowser.Controller.Entities.Movies } } - public override bool IsAuthorizedToDelete(User user) + public override bool IsAuthorizedToDelete(User user, List allCollectionFolders) { return true; } diff --git a/MediaBrowser.Controller/Entities/PhotoAlbum.cs b/MediaBrowser.Controller/Entities/PhotoAlbum.cs index 52d743e361..af9d8c801d 100644 --- a/MediaBrowser.Controller/Entities/PhotoAlbum.cs +++ b/MediaBrowser.Controller/Entities/PhotoAlbum.cs @@ -30,10 +30,5 @@ namespace MediaBrowser.Controller.Entities return false; } } - - public override double? GetDefaultPrimaryImageAspectRatio() - { - return 1; - } } } diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index c30e0ef8e7..3f52dfc934 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -78,6 +78,12 @@ namespace MediaBrowser.Controller.Entities.TV get { return true; } } + [IgnoreDataMember] + public override bool SupportsPeople + { + get { return true; } + } + [IgnoreDataMember] public int? AiredSeasonNumber { diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index bf6dc5678f..00bb75fa78 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -40,6 +40,12 @@ namespace MediaBrowser.Controller.Entities.TV } } + [IgnoreDataMember] + public override bool SupportsPeople + { + get { return true; } + } + [IgnoreDataMember] public override bool SupportsInheritedParentImages { diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 5931c32e1b..1d09783d1f 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -64,6 +64,12 @@ namespace MediaBrowser.Controller.Entities.TV } } + [IgnoreDataMember] + public override bool SupportsPeople + { + get { return true; } + } + public Guid[] LocalTrailerIds { get; set; } public Guid[] RemoteTrailerIds { get; set; } diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 36bbf6886a..821327b7f3 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -235,10 +235,9 @@ namespace MediaBrowser.Controller.Entities }, CancellationToken.None); } - public override Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) + public override void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { UserManager.UpdateUser(this); - return Task.FromResult(true); } /// diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 43adc4af68..97b96127a2 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -78,26 +78,26 @@ namespace MediaBrowser.Controller.Entities case SpecialFolder.LiveTvChannels: { - var result = await _liveTvManager.GetInternalChannels(new LiveTvChannelQuery + var result = _liveTvManager.GetInternalChannels(new LiveTvChannelQuery { UserId = query.User.Id.ToString("N"), Limit = query.Limit, StartIndex = query.StartIndex - }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false); + }, new DtoOptions(), CancellationToken.None); return GetResult(result); } case SpecialFolder.LiveTvNowPlaying: { - var result = await _liveTvManager.GetRecommendedProgramsInternal(new RecommendedProgramQuery + var result = _liveTvManager.GetRecommendedProgramsInternal(new RecommendedProgramQuery { UserId = query.User.Id.ToString("N"), Limit = query.Limit, IsAiring = true - }, new Dto.DtoOptions(), CancellationToken.None).ConfigureAwait(false); + }, new Dto.DtoOptions(), CancellationToken.None); return GetResult(result); } @@ -142,22 +142,22 @@ namespace MediaBrowser.Controller.Entities return GetResult(user.RootFolder.GetChildren(user, true), queryParent, query); case CollectionType.Playlists: - return GetPlaylistsView(queryParent, user, query); + return GetPlaylistsView(queryParent, user, query); case CollectionType.BoxSets: return GetBoxsetView(queryParent, user, query); case CollectionType.TvShows: - return await GetTvView(queryParent, user, query).ConfigureAwait(false); + return GetTvView(queryParent, user, query); case CollectionType.Movies: - return await GetMovieFolders(queryParent, user, query).ConfigureAwait(false); + return GetMovieFolders(queryParent, user, query); case SpecialFolder.TvShowSeries: return GetTvSeries(queryParent, user, query); case SpecialFolder.TvGenres: - return await GetTvGenres(queryParent, user, query).ConfigureAwait(false); + return GetTvGenres(queryParent, user, query); case SpecialFolder.TvGenre: return GetTvGenreItems(queryParent, displayParent, user, query); @@ -178,10 +178,10 @@ namespace MediaBrowser.Controller.Entities return GetMovieLatest(queryParent, user, query); case SpecialFolder.MovieGenres: - return await GetMovieGenres(queryParent, user, query).ConfigureAwait(false); + return GetMovieGenres(queryParent, user, query); case SpecialFolder.MovieGenre: - return GetMovieGenreItems(queryParent, displayParent, user, query); + return GetMovieGenreItems(queryParent, displayParent, user, query); case SpecialFolder.MovieResume: return GetMovieResume(queryParent, user, query); @@ -199,7 +199,7 @@ namespace MediaBrowser.Controller.Entities return GetFavoriteSeries(queryParent, user, query); case CollectionType.Music: - return await GetMusicFolders(queryParent, user, query).ConfigureAwait(false); + return GetMusicFolders(queryParent, user, query); case SpecialFolder.MusicGenres: return GetMusicGenres(queryParent, user, query); @@ -223,7 +223,7 @@ namespace MediaBrowser.Controller.Entities return GetMusicSongs(queryParent, user, query); case SpecialFolder.MusicFavorites: - return await GetMusicFavorites(queryParent, user, query).ConfigureAwait(false); + return GetMusicFavorites(queryParent, user, query); case SpecialFolder.MusicFavoriteAlbums: return GetFavoriteAlbums(queryParent, user, query); @@ -245,7 +245,7 @@ namespace MediaBrowser.Controller.Entities } } - private async Task> GetMusicFolders(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetMusicFolders(Folder parent, User user, InternalItemsQuery query) { if (query.Recursive) { @@ -262,25 +262,25 @@ namespace MediaBrowser.Controller.Entities var list = new List(); - list.Add(await GetUserView(SpecialFolder.MusicLatest, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicPlaylists, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicAlbums, "2", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicAlbumArtists, "3", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicArtists, "4", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicSongs, "5", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicGenres, "6", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicFavorites, "7", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.MusicLatest, "Latest", "0", parent)); + list.Add(GetUserView(SpecialFolder.MusicPlaylists, "Playlists", "1", parent)); + list.Add(GetUserView(SpecialFolder.MusicAlbums, "Albums", "2", parent)); + list.Add(GetUserView(SpecialFolder.MusicAlbumArtists, "HeaderAlbumArtists", "3", parent)); + list.Add(GetUserView(SpecialFolder.MusicArtists, "Artists", "4", parent)); + list.Add(GetUserView(SpecialFolder.MusicSongs, "Songs", "5", parent)); + list.Add(GetUserView(SpecialFolder.MusicGenres, "Genres", "6", parent)); + list.Add(GetUserView(SpecialFolder.MusicFavorites, "Favorites", "7", parent)); return GetResult(list, parent, query); } - private async Task> GetMusicFavorites(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetMusicFavorites(Folder parent, User user, InternalItemsQuery query) { var list = new List(); - list.Add(await GetUserView(SpecialFolder.MusicFavoriteAlbums, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicFavoriteArtists, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicFavoriteSongs, "2", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.MusicFavoriteAlbums, "HeaderFavoriteAlbums", "0", parent)); + list.Add(GetUserView(SpecialFolder.MusicFavoriteArtists, "HeaderFavoriteArtists", "1", parent)); + list.Add(GetUserView(SpecialFolder.MusicFavoriteSongs, "HeaderFavoriteSongs", "2", parent)); return GetResult(list, parent, query); } @@ -426,7 +426,7 @@ namespace MediaBrowser.Controller.Entities return 50; } - private async Task> GetMovieFolders(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetMovieFolders(Folder parent, User user, InternalItemsQuery query) { if (query.Recursive) { @@ -443,12 +443,12 @@ namespace MediaBrowser.Controller.Entities var list = new List(); - list.Add(await GetUserView(SpecialFolder.MovieResume, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieLatest, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieMovies, "2", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieCollections, "3", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieFavorites, "4", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieGenres, "5", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.MovieResume, "HeaderContinueWatching", "0", parent)); + list.Add(GetUserView(SpecialFolder.MovieLatest, "Latest", "1", parent)); + list.Add(GetUserView(SpecialFolder.MovieMovies, "Movies", "2", parent)); + list.Add(GetUserView(SpecialFolder.MovieCollections, "Collections", "3", parent)); + list.Add(GetUserView(SpecialFolder.MovieFavorites, "Favorites", "4", parent)); + list.Add(GetUserView(SpecialFolder.MovieGenres, "Genres", "5", parent)); return GetResult(list, parent, query); } @@ -538,9 +538,9 @@ namespace MediaBrowser.Controller.Entities }; } - private async Task> GetMovieGenres(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetMovieGenres(Folder parent, User user, InternalItemsQuery query) { - var tasks = parent.QueryRecursive(new InternalItemsQuery(user) + var genres = parent.QueryRecursive(new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(Movie).Name }, Recursive = true, @@ -564,9 +564,7 @@ namespace MediaBrowser.Controller.Entities }) .Where(i => i != null) - .Select(i => GetUserView(i.Name, SpecialFolder.MovieGenre, i.SortName, parent)); - - var genres = await Task.WhenAll(tasks).ConfigureAwait(false); + .Select(i => GetUserViewWithName(i.Name, SpecialFolder.MovieGenre, i.SortName, parent)); return GetResult(genres, parent, query); } @@ -598,7 +596,7 @@ namespace MediaBrowser.Controller.Entities return _libraryManager.GetItemsResult(query); } - private async Task> GetTvView(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetTvView(Folder parent, User user, InternalItemsQuery query) { if (query.Recursive) { @@ -615,13 +613,13 @@ namespace MediaBrowser.Controller.Entities var list = new List(); - list.Add(await GetUserView(SpecialFolder.TvResume, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvNextUp, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvLatest, "2", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvShowSeries, "3", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvFavoriteSeries, "4", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvFavoriteEpisodes, "5", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvGenres, "6", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.TvResume, "HeaderContinueWatching", "0", parent)); + list.Add(GetUserView(SpecialFolder.TvNextUp, "HeaderNextUp", "1", parent)); + list.Add(GetUserView(SpecialFolder.TvLatest, "Latest", "2", parent)); + list.Add(GetUserView(SpecialFolder.TvShowSeries, "Shows", "3", parent)); + list.Add(GetUserView(SpecialFolder.TvFavoriteSeries, "HeaderFavoriteShows", "4", parent)); + list.Add(GetUserView(SpecialFolder.TvFavoriteEpisodes, "HeaderFavoriteEpisodes", "5", parent)); + list.Add(GetUserView(SpecialFolder.TvGenres, "Genres", "6", parent)); return GetResult(list, parent, query); } @@ -679,9 +677,9 @@ namespace MediaBrowser.Controller.Entities return _libraryManager.GetItemsResult(query); } - private async Task> GetTvGenres(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetTvGenres(Folder parent, User user, InternalItemsQuery query) { - var tasks = parent.QueryRecursive(new InternalItemsQuery(user) + var genres = parent.QueryRecursive(new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(Series).Name }, Recursive = true, @@ -705,9 +703,7 @@ namespace MediaBrowser.Controller.Entities }) .Where(i => i != null) - .Select(i => GetUserView(i.Name, SpecialFolder.TvGenre, i.SortName, parent)); - - var genres = await Task.WhenAll(tasks).ConfigureAwait(false); + .Select(i => GetUserViewWithName(i.Name, SpecialFolder.TvGenre, i.SortName, parent)); return GetResult(genres, parent, query); } @@ -1740,20 +1736,20 @@ namespace MediaBrowser.Controller.Entities var list = new List(); //list.Add(await GetUserSubView(SpecialFolder.LiveTvNowPlaying, user, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.LiveTvChannels, string.Empty, user.RootFolder).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.LiveTvRecordingGroups, string.Empty, user.RootFolder).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.LiveTvChannels, "Channels", string.Empty, user.RootFolder)); + list.Add(GetUserView(SpecialFolder.LiveTvRecordingGroups, "HeaderRecordingGroups", string.Empty, user.RootFolder)); return GetResult(list, queryParent, query); } - private Task GetUserView(string name, string type, string sortName, BaseItem parent) + private UserView GetUserViewWithName(string name, string type, string sortName, BaseItem parent) { return _userViewManager.GetUserSubView(name, parent.Id.ToString("N"), type, sortName, CancellationToken.None); } - private Task GetUserView(string type, string sortName, BaseItem parent) + private UserView GetUserView(string type, string localizationKey, string sortName, BaseItem parent) { - return _userViewManager.GetUserSubView(parent.Id.ToString("N"), type, sortName, CancellationToken.None); + return _userViewManager.GetUserSubView(parent.Id.ToString("N"), type, localizationKey, sortName, CancellationToken.None); } public static IEnumerable FilterForAdjacency(List list, string adjacentToId) diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 8693d867cc..52f1dd0514 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -44,6 +44,12 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool SupportsPeople + { + get { return true; } + } + [IgnoreDataMember] public override bool SupportsInheritedParentImages { @@ -78,14 +84,6 @@ namespace MediaBrowser.Controller.Entities } } - public override double? GetDefaultPrimaryImageAspectRatio() - { - double value = 16; - value /= 9; - - return value; - } - public override string CreatePresentationUniqueKey() { if (!string.IsNullOrWhiteSpace(PrimaryVersionId)) @@ -406,30 +404,31 @@ namespace MediaBrowser.Controller.Entities } } - internal override bool IsValidFromResolver(BaseItem newItem) + internal override ItemUpdateType UpdateFromResolvedItem(BaseItem newItem) { - var current = this; + var updateType = base.UpdateFromResolvedItem(newItem); - var newAsVideo = newItem as Video; - - if (newAsVideo != null) + var newVideo = newItem as Video; + if (newVideo != null) { - if (!current.AdditionalParts.SequenceEqual(newAsVideo.AdditionalParts, StringComparer.OrdinalIgnoreCase)) + if (!AdditionalParts.SequenceEqual(newVideo.AdditionalParts, StringComparer.Ordinal)) { - return false; + AdditionalParts = newVideo.AdditionalParts; + updateType |= ItemUpdateType.MetadataImport; } - if (!current.LocalAlternateVersions.SequenceEqual(newAsVideo.LocalAlternateVersions, StringComparer.OrdinalIgnoreCase)) + if (!LocalAlternateVersions.SequenceEqual(newVideo.LocalAlternateVersions, StringComparer.Ordinal)) { - return false; + LocalAlternateVersions = newVideo.LocalAlternateVersions; + updateType |= ItemUpdateType.MetadataImport; } - - if (newAsVideo.VideoType != VideoType) + if (VideoType != newVideo.VideoType) { - return false; + VideoType = newVideo.VideoType; + updateType |= ItemUpdateType.MetadataImport; } } - return base.IsValidFromResolver(newItem); + return updateType; } public static string[] QueryPlayableStreamFiles(string rootPath, VideoType videoType) @@ -521,9 +520,9 @@ namespace MediaBrowser.Controller.Entities } } - public override async Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) + public override void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { - await base.UpdateToRepository(updateReason, cancellationToken).ConfigureAwait(false); + base.UpdateToRepository(updateReason, cancellationToken); var localAlternates = GetLocalAlternateVersionIds() .Select(i => LibraryManager.GetItemById(i)) @@ -540,7 +539,7 @@ namespace MediaBrowser.Controller.Entities item.Genres = Genres; item.ProviderIds = ProviderIds; - await item.UpdateToRepository(ItemUpdateType.MetadataDownload, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataDownload, cancellationToken); } } diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 3001e33661..37e0d56616 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -128,6 +128,8 @@ namespace MediaBrowser.Controller.Library /// void QueueLibraryScan(); + void UpdateImages(BaseItem item); + /// /// Gets the default view. /// @@ -207,11 +209,7 @@ namespace MediaBrowser.Controller.Library /// /// Updates the item. /// - /// The item. - /// The update reason. - /// The cancellation token. - /// Task. - Task UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken); + void UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken); /// /// Retrieves the item. @@ -330,8 +328,7 @@ namespace MediaBrowser.Controller.Library /// Type of the view. /// Name of the sort. /// The cancellation token. - /// Task<UserView>. - Task GetNamedView(string name, + UserView GetNamedView(string name, string viewType, string sortName, CancellationToken cancellationToken); @@ -345,8 +342,7 @@ namespace MediaBrowser.Controller.Library /// Name of the sort. /// The unique identifier. /// The cancellation token. - /// Task<UserView>. - Task GetNamedView(string name, + UserView GetNamedView(string name, string parentId, string viewType, string sortName, diff --git a/MediaBrowser.Controller/Library/IUserViewManager.cs b/MediaBrowser.Controller/Library/IUserViewManager.cs index 76182c641b..baecdd748f 100644 --- a/MediaBrowser.Controller/Library/IUserViewManager.cs +++ b/MediaBrowser.Controller/Library/IUserViewManager.cs @@ -13,9 +13,9 @@ namespace MediaBrowser.Controller.Library { Task GetUserViews(UserViewQuery query, CancellationToken cancellationToken); - Task GetUserSubView(string name, string parentId, string type, string sortName, CancellationToken cancellationToken); + UserView GetUserSubViewWithName(string name, string parentId, string type, string sortName, CancellationToken cancellationToken); - Task GetUserSubView(string category, string type, string sortName, CancellationToken cancellationToken); + UserView GetUserSubView(string category, string type, string localizationKey, string sortName, CancellationToken cancellationToken); List>> GetLatestItems(LatestItemsQuery request, DtoOptions options); } diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs index be85e115c4..4934cc1ca8 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs @@ -75,16 +75,6 @@ namespace MediaBrowser.Controller.LiveTv /// The listing providers. void AddParts(IEnumerable services, IEnumerable tunerHosts, IEnumerable listingProviders); - /// - /// Gets the recording. - /// - /// The identifier. - /// The options. - /// The cancellation token. - /// The user. - /// Task{RecordingInfoDto}. - Task GetRecording(string id, DtoOptions options, CancellationToken cancellationToken, User user = null); - /// /// Gets the timer. /// @@ -236,14 +226,12 @@ namespace MediaBrowser.Controller.LiveTv /// The query. /// The options. /// The cancellation token. - /// Task{QueryResult{ProgramInfoDto}}. - Task> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); + QueryResult GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); /// /// Gets the recommended programs internal. /// - /// Task<QueryResult<LiveTvProgram>>. - Task> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); + QueryResult GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); /// /// Gets the live tv information. @@ -264,8 +252,7 @@ namespace MediaBrowser.Controller.LiveTv /// Gets the live tv folder. /// /// The cancellation token. - /// BaseItemDto. - Task GetInternalLiveTvFolder(CancellationToken cancellationToken); + Folder GetInternalLiveTvFolder(CancellationToken cancellationToken); /// /// Gets the live tv folder. @@ -273,7 +260,7 @@ namespace MediaBrowser.Controller.LiveTv /// The user identifier. /// The cancellation token. /// BaseItemDto. - Task GetLiveTvFolder(string userId, CancellationToken cancellationToken); + BaseItemDto GetLiveTvFolder(string userId, CancellationToken cancellationToken); /// /// Gets the enabled users. @@ -284,7 +271,7 @@ namespace MediaBrowser.Controller.LiveTv /// /// Gets the internal channels. /// - Task> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken); + QueryResult GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken); /// /// Gets the internal recordings. @@ -362,13 +349,6 @@ namespace MediaBrowser.Controller.LiveTv /// The user. void AddChannelInfo(List> items, DtoOptions options, User user); - /// - /// Called when [recording file deleted]. - /// - /// The recording. - /// Task. - Task OnRecordingFileDeleted(BaseItem recording); - Task> GetChannelsForListingsProvider(string id, CancellationToken cancellationToken); Task> GetChannelsFromListingsProviderData(string id, CancellationToken cancellationToken); diff --git a/MediaBrowser.Controller/LiveTv/ITunerHost.cs b/MediaBrowser.Controller/LiveTv/ITunerHost.cs index 2019259c56..523eec24ac 100644 --- a/MediaBrowser.Controller/LiveTv/ITunerHost.cs +++ b/MediaBrowser.Controller/LiveTv/ITunerHost.cs @@ -59,8 +59,8 @@ namespace MediaBrowser.Controller.LiveTv public interface ILiveStream { - Task Open(CancellationToken cancellationToken); - Task Close(); + Task Open(CancellationToken openCancellationToken); + void Close(); int ConsumerCount { get; } string OriginalStreamId { get; set; } bool EnableStreamSharing { get; set; } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs index 8fa96076b7..bd84541f8f 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs @@ -132,7 +132,7 @@ namespace MediaBrowser.Controller.LiveTv return true; } - public override bool IsAuthorizedToDelete(User user) + public override bool IsAuthorizedToDelete(User user, List allCollectionFolders) { return user.Policy.EnableLiveTvManagement; } @@ -161,10 +161,5 @@ namespace MediaBrowser.Controller.LiveTv { return LiveTvManager.DeleteRecording(this); } - - public override Task OnFileDeleted() - { - return LiveTvManager.OnRecordingFileDeleted(this); - } } } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs index 4a93d0399a..16010b7f5a 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs @@ -136,7 +136,8 @@ namespace MediaBrowser.Controller.LiveTv Name = Name, Path = Path, RunTimeTicks = RunTimeTicks, - Type = MediaSourceType.Placeholder + Type = MediaSourceType.Placeholder, + IsInfiniteStream = RunTimeTicks == null }; list.Add(info); diff --git a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs index 1c16373306..9dff18690e 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs @@ -50,21 +50,40 @@ namespace MediaBrowser.Controller.LiveTv public static double? GetDefaultPrimaryImageAspectRatio(IHasProgramAttributes item) { var serviceName = item.ServiceName; - if (!item.IsMovie - && !string.Equals(serviceName, EmbyServiceName, StringComparison.OrdinalIgnoreCase) - && !string.Equals(serviceName, "Next Pvr", StringComparison.OrdinalIgnoreCase)) - { - double value = 16; - value /= 9; - return value; + if (item.IsMovie) + { + if (string.Equals(serviceName, EmbyServiceName, StringComparison.OrdinalIgnoreCase) || string.Equals(serviceName, "Next Pvr", StringComparison.OrdinalIgnoreCase)) + { + double value = 2; + value /= 3; + + return value; + } + else + { + double value = 16; + value /= 9; + + return value; + } } else { - double value = 2; - value /= 3; + if (string.Equals(serviceName, EmbyServiceName, StringComparison.OrdinalIgnoreCase) || string.Equals(serviceName, "Next Pvr", StringComparison.OrdinalIgnoreCase)) + { + double value = 2; + value /= 3; - return value; + return value; + } + else + { + double value = 16; + value /= 9; + + return value; + } } } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs index c5fe7b1b31..37c1faac6e 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs @@ -131,7 +131,7 @@ namespace MediaBrowser.Controller.LiveTv return true; } - public override bool IsAuthorizedToDelete(User user) + public override bool IsAuthorizedToDelete(User user, List allCollectionFolders) { return user.Policy.EnableLiveTvManagement; } @@ -160,10 +160,5 @@ namespace MediaBrowser.Controller.LiveTv { return LiveTvManager.DeleteRecording(this); } - - public override Task OnFileDeleted() - { - return LiveTvManager.OnRecordingFileDeleted(this); - } } } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index b33993859b..dafca05985 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -176,6 +176,7 @@ + @@ -219,7 +220,6 @@ - diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 8b612f809d..bddafe9a6a 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -794,11 +794,6 @@ namespace MediaBrowser.Controller.MediaEncoding return false; } - if (state.EnableMpDecimate) - { - return false; - } - if (videoStream.IsInterlaced) { if (state.DeInterlace(videoStream.Codec, false)) @@ -1515,11 +1510,6 @@ namespace MediaBrowser.Controller.MediaEncoding } } - if (state.EnableMpDecimate) - { - filters.Add("mpdecimate,setpts=N/FRAME_RATE/TB"); - } - if (filters.Count > 0) { output += string.Format(" -vf \"{0}\"", string.Join(",", filters.ToArray())); @@ -1638,7 +1628,7 @@ namespace MediaBrowser.Controller.MediaEncoding if (state.InputProtocol == MediaProtocol.Rtsp) { - inputModifier += " -rtsp_transport tcp"; + inputModifier += " -rtsp_transport tcp -rtsp_transport udp -rtsp_flags prefer_tcp"; } if (!string.IsNullOrEmpty(state.InputAudioSync)) @@ -1960,6 +1950,12 @@ namespace MediaBrowser.Controller.MediaEncoding return "-c:v h264_mmal"; } break; + case "mpeg2video": + if (_mediaEncoder.SupportsDecoder("mpeg2_mmal") && encodingOptions.HardwareDecodingCodecs.Contains("mpeg2video", StringComparer.OrdinalIgnoreCase)) + { + return "-c:v mpeg2_mmal"; + } + break; } } } diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs b/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs index 506fce3ca9..ad131064c3 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs @@ -127,11 +127,6 @@ namespace MediaBrowser.Controller.MediaEncoding } } - public bool EnableMpDecimate - { - get { return MediaSource.EnableMpDecimate; } - } - public string AlbumCoverPath { get; set; } public string InputAudioSync { get; set; } diff --git a/MediaBrowser.Api/BasePeriodicWebSocketListener.cs b/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs similarity index 99% rename from MediaBrowser.Api/BasePeriodicWebSocketListener.cs rename to MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs index c7a9d97bad..6be94e7e6e 100644 --- a/MediaBrowser.Api/BasePeriodicWebSocketListener.cs +++ b/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs @@ -4,12 +4,11 @@ using System.Globalization; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Controller.Net; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Net; using MediaBrowser.Model.Threading; -namespace MediaBrowser.Api +namespace MediaBrowser.Controller.Net { /// /// Starts sending data over a web socket periodically when a message is received, and then stops when a corresponding stop message is received @@ -93,7 +92,7 @@ namespace MediaBrowser.Api { get { - return true; + return false; } } diff --git a/MediaBrowser.Controller/Notifications/INotificationManager.cs b/MediaBrowser.Controller/Notifications/INotificationManager.cs index f9d2643145..68cfd6ff1b 100644 --- a/MediaBrowser.Controller/Notifications/INotificationManager.cs +++ b/MediaBrowser.Controller/Notifications/INotificationManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller.Entities; namespace MediaBrowser.Controller.Notifications { @@ -15,6 +16,8 @@ namespace MediaBrowser.Controller.Notifications /// Task. Task SendNotification(NotificationRequest request, CancellationToken cancellationToken); + Task SendNotification(NotificationRequest request, BaseItem relatedItem, CancellationToken cancellationToken); + /// /// Adds the parts. /// diff --git a/MediaBrowser.Controller/Persistence/IItemRepository.cs b/MediaBrowser.Controller/Persistence/IItemRepository.cs index 3d05d2fcab..4cb3e2bb61 100644 --- a/MediaBrowser.Controller/Persistence/IItemRepository.cs +++ b/MediaBrowser.Controller/Persistence/IItemRepository.cs @@ -48,6 +48,8 @@ namespace MediaBrowser.Controller.Persistence /// The cancellation token. void SaveItems(List items, CancellationToken cancellationToken); + void SaveImages(BaseItem item); + /// /// Retrieves the item. /// diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs index ee96a8c3b7..071f8a0961 100644 --- a/MediaBrowser.Controller/Playlists/Playlist.cs +++ b/MediaBrowser.Controller/Playlists/Playlist.cs @@ -73,7 +73,7 @@ namespace MediaBrowser.Controller.Playlists return 1; } - public override bool IsAuthorizedToDelete(User user) + public override bool IsAuthorizedToDelete(User user, List allCollectionFolders) { return true; } diff --git a/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs b/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs deleted file mode 100644 index aa0b0e3c97..0000000000 --- a/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs +++ /dev/null @@ -1,17 +0,0 @@ -using MediaBrowser.Controller.Entities; -using System; - -namespace MediaBrowser.Controller.Providers -{ - public interface IHasChangeMonitor - { - /// - /// Determines whether the specified item has changed. - /// - /// The item. - /// The directory service. - /// The date. - /// true if the specified item has changed; otherwise, false. - bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date); - } -} diff --git a/MediaBrowser.Controller/Providers/IMetadataService.cs b/MediaBrowser.Controller/Providers/IMetadataService.cs index 2d4873f7ed..7b7bf166b5 100644 --- a/MediaBrowser.Controller/Providers/IMetadataService.cs +++ b/MediaBrowser.Controller/Providers/IMetadataService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using System; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using System.Threading; using System.Threading.Tasks; @@ -13,6 +14,7 @@ namespace MediaBrowser.Controller.Providers /// The item. /// true if this instance can refresh the specified item; otherwise, false. bool CanRefresh(IHasMetadata item); + bool CanRefreshPrimary(Type type); /// /// Refreshes the metadata. diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index 77e6a7e405..c2cbda11d9 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -119,16 +119,12 @@ namespace MediaBrowser.Controller.Providers /// The item. /// Type of the update. /// Task. - Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType); + void SaveMetadata(IHasMetadata item, ItemUpdateType updateType); /// /// Saves the metadata. /// - /// The item. - /// Type of the update. - /// The savers. - /// Task. - Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable savers); + void SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable savers); /// /// Gets the metadata options. diff --git a/MediaBrowser.Controller/Providers/MetadataResult.cs b/MediaBrowser.Controller/Providers/MetadataResult.cs index 5ed55ea162..f35d41ca4c 100644 --- a/MediaBrowser.Controller/Providers/MetadataResult.cs +++ b/MediaBrowser.Controller/Providers/MetadataResult.cs @@ -20,6 +20,7 @@ namespace MediaBrowser.Controller.Providers public bool HasMetadata { get; set; } public T Item { get; set; } public string ResultLanguage { get; set; } + public string Provider { get; set; } public bool QueriedById { get; set; } public void AddPerson(PersonInfo p) { diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs index 910d697ec0..0bf4b914f1 100644 --- a/MediaBrowser.Controller/Sync/ISyncManager.cs +++ b/MediaBrowser.Controller/Sync/ISyncManager.cs @@ -91,8 +91,6 @@ namespace MediaBrowser.Controller.Sync /// List GetSyncTargets(string userId); - List GetSyncTargets(string userId, bool? supportsRemoteSync); - /// /// Supportses the synchronize. /// diff --git a/MediaBrowser.Controller/Sync/ISyncProvider.cs b/MediaBrowser.Controller/Sync/ISyncProvider.cs index 2f60e124ec..baee1a52f3 100644 --- a/MediaBrowser.Controller/Sync/ISyncProvider.cs +++ b/MediaBrowser.Controller/Sync/ISyncProvider.cs @@ -11,8 +11,6 @@ namespace MediaBrowser.Controller.Sync /// The name. string Name { get; } - bool SupportsRemoteSync { get; } - /// /// Gets the synchronize targets. /// diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index f7fffbf79a..65b054b0c7 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -183,6 +183,7 @@ namespace MediaBrowser.Model.Configuration public bool EnableExternalContentInSuggestions { get; set; } public bool RequireHttps { get; set; } public bool IsBehindProxy { get; set; } + public bool EnableNewOmdbSupport { get; set; } public int ImageExtractionTimeoutMs { get; set; } @@ -343,8 +344,8 @@ namespace MediaBrowser.Model.Configuration Type = ImageType.Logo } }, - - DisabledImageFetchers = new [] {"FanArt"} + DisabledMetadataFetchers = new []{ "The Open Movie Database" }, + DisabledImageFetchers = new []{ "The Open Movie Database", "FanArt" } }, new MetadataOptions(1, 1280) @@ -389,7 +390,9 @@ namespace MediaBrowser.Model.Configuration Limit = 1, Type = ImageType.Logo } - } + }, + DisabledMetadataFetchers = new []{ "TheMovieDb" }, + DisabledImageFetchers = new []{ "TheMovieDb" } }, new MetadataOptions(1, 1280) diff --git a/MediaBrowser.Model/Devices/DeviceInfo.cs b/MediaBrowser.Model/Devices/DeviceInfo.cs index d8358977e7..d2ee3fdcc6 100644 --- a/MediaBrowser.Model/Devices/DeviceInfo.cs +++ b/MediaBrowser.Model/Devices/DeviceInfo.cs @@ -21,17 +21,7 @@ namespace MediaBrowser.Model.Devices /// The camera upload path. public string CameraUploadPath { get; set; } - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return string.IsNullOrEmpty(CustomName) ? ReportedName : CustomName; - } - } + public string Name { get; set; } /// /// Gets or sets the identifier. diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 95a80c34c0..a11c886974 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -686,7 +686,7 @@ namespace MediaBrowser.Model.Dlna if (subtitleStream != null) { - SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, directPlay.Value, _transcoderSupport, null, null); + SubtitleProfile subtitleProfile = GetSubtitleProfile(item, subtitleStream, options.Profile.SubtitleProfiles, directPlay.Value, _transcoderSupport, null, null); playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method; playlistItem.SubtitleFormat = subtitleProfile.Format; @@ -728,7 +728,7 @@ namespace MediaBrowser.Model.Dlna if (subtitleStream != null) { - SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, PlayMethod.Transcode, _transcoderSupport, transcodingProfile.Protocol, transcodingProfile.Container); + SubtitleProfile subtitleProfile = GetSubtitleProfile(item, subtitleStream, options.Profile.SubtitleProfiles, PlayMethod.Transcode, _transcoderSupport, transcodingProfile.Protocol, transcodingProfile.Container); playlistItem.SubtitleDeliveryMethod = subtitleProfile.Method; playlistItem.SubtitleFormat = subtitleProfile.Format; @@ -1054,15 +1054,6 @@ namespace MediaBrowser.Model.Dlna string videoCodec = videoStream == null ? null : videoStream.Codec; - if (string.IsNullOrEmpty(videoCodec)) - { - _logger.Info("Profile: {0}, DirectPlay=false. Reason=Unknown video codec. Path: {1}", - profile.Name ?? "Unknown Profile", - mediaSource.Path ?? "Unknown path"); - - return new Tuple>(null, new List { TranscodeReason.UnknownVideoStreamInfo }); - } - conditions = new List(); foreach (CodecProfile i in profile.CodecProfiles) { @@ -1189,7 +1180,7 @@ namespace MediaBrowser.Model.Dlna { if (subtitleStream != null) { - SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, playMethod, _transcoderSupport, null, null); + SubtitleProfile subtitleProfile = GetSubtitleProfile(item, subtitleStream, options.Profile.SubtitleProfiles, playMethod, _transcoderSupport, null, null); if (subtitleProfile.Method != SubtitleDeliveryMethod.External && subtitleProfile.Method != SubtitleDeliveryMethod.Embed) { @@ -1208,7 +1199,7 @@ namespace MediaBrowser.Model.Dlna return new Tuple(result, TranscodeReason.ContainerBitrateExceedsLimit); } - public static SubtitleProfile GetSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, string transcodingSubProtocol, string transcodingContainer) + public static SubtitleProfile GetSubtitleProfile(MediaSourceInfo mediaSource, MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, string transcodingSubProtocol, string transcodingContainer) { if (!subtitleStream.IsExternal && (playMethod != PlayMethod.Transcode || !string.Equals(transcodingSubProtocol, "hls", StringComparison.OrdinalIgnoreCase))) { @@ -1262,8 +1253,8 @@ namespace MediaBrowser.Model.Dlna } // Look for an external or hls profile that matches the stream type (text/graphical) and doesn't require conversion - return GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, transcoderSupport, false) ?? - GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, transcoderSupport, true) ?? + return GetExternalSubtitleProfile(mediaSource, subtitleStream, subtitleProfiles, playMethod, transcoderSupport, false) ?? + GetExternalSubtitleProfile(mediaSource, subtitleStream, subtitleProfiles, playMethod, transcoderSupport, true) ?? new SubtitleProfile { Method = SubtitleDeliveryMethod.Encode, @@ -1299,7 +1290,7 @@ namespace MediaBrowser.Model.Dlna return false; } - private static SubtitleProfile GetExternalSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, bool allowConversion) + private static SubtitleProfile GetExternalSubtitleProfile(MediaSourceInfo mediaSource, MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, ITranscoderSupport transcoderSupport, bool allowConversion) { foreach (SubtitleProfile profile in subtitleProfiles) { @@ -1338,6 +1329,12 @@ namespace MediaBrowser.Model.Dlna continue; } + // TODO: Build this into subtitleStream.SupportsExternalStream + if (mediaSource.IsInfiniteStream) + { + continue; + } + if (subtitleStream.IsTextSubtitleStream && subtitleStream.SupportsExternalStream && subtitleStream.SupportsSubtitleConversionTo(profile.Format)) { return profile; diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs index 5a059e91d2..93a46aaf40 100644 --- a/MediaBrowser.Model/Dlna/StreamInfo.cs +++ b/MediaBrowser.Model/Dlna/StreamInfo.cs @@ -466,7 +466,7 @@ namespace MediaBrowser.Model.Dlna private SubtitleStreamInfo GetSubtitleStreamInfo(MediaStream stream, string baseUrl, string accessToken, long startPositionTicks, SubtitleProfile[] subtitleProfiles, ITranscoderSupport transcoderSupport) { - SubtitleProfile subtitleProfile = StreamBuilder.GetSubtitleProfile(stream, subtitleProfiles, PlayMethod, transcoderSupport, SubProtocol, Container); + SubtitleProfile subtitleProfile = StreamBuilder.GetSubtitleProfile(MediaSource, stream, subtitleProfiles, PlayMethod, transcoderSupport, SubProtocol, Container); SubtitleStreamInfo info = new SubtitleStreamInfo { IsForced = stream.IsForced, @@ -480,7 +480,7 @@ namespace MediaBrowser.Model.Dlna if (info.DeliveryMethod == SubtitleDeliveryMethod.External) { - if (MediaSource.Protocol == MediaProtocol.File || !StringHelper.EqualsIgnoreCase(stream.Codec, subtitleProfile.Format)) + if (MediaSource.Protocol == MediaProtocol.File || !StringHelper.EqualsIgnoreCase(stream.Codec, subtitleProfile.Format) || !stream.IsExternal) { info.Url = string.Format("{0}/Videos/{1}/{2}/Subtitles/{3}/{4}/Stream.{5}", baseUrl, diff --git a/MediaBrowser.Model/Dto/MediaSourceInfo.cs b/MediaBrowser.Model/Dto/MediaSourceInfo.cs index 27920bdf39..d6301b331f 100644 --- a/MediaBrowser.Model/Dto/MediaSourceInfo.cs +++ b/MediaBrowser.Model/Dto/MediaSourceInfo.cs @@ -40,7 +40,6 @@ namespace MediaBrowser.Model.Dto public string OpenToken { get; set; } public bool RequiresClosing { get; set; } public bool SupportsProbing { get; set; } - public bool EnableMpDecimate { get; set; } public string LiveStreamId { get; set; } public int? BufferMs { get; set; } diff --git a/MediaBrowser.Model/LiveTv/BaseTimerInfoDto.cs b/MediaBrowser.Model/LiveTv/BaseTimerInfoDto.cs index 7c9fe07909..e4d32ca4a5 100644 --- a/MediaBrowser.Model/LiveTv/BaseTimerInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/BaseTimerInfoDto.cs @@ -41,6 +41,8 @@ namespace MediaBrowser.Model.LiveTv /// public string ChannelName { get; set; } + public string ChannelPrimaryImageTag { get; set; } + /// /// Gets or sets the program identifier. /// diff --git a/MediaBrowser.Model/LiveTv/LiveTvOptions.cs b/MediaBrowser.Model/LiveTv/LiveTvOptions.cs index a70a1066d7..f177233f9b 100644 --- a/MediaBrowser.Model/LiveTv/LiveTvOptions.cs +++ b/MediaBrowser.Model/LiveTv/LiveTvOptions.cs @@ -13,7 +13,6 @@ namespace MediaBrowser.Model.LiveTv public string RecordingEncodingFormat { get; set; } public bool EnableRecordingSubfolders { get; set; } public bool EnableOriginalAudioWithEncodedRecordings { get; set; } - public string RecordedVideoCodec { get; set; } public TunerHostInfo[] TunerHosts { get; set; } public ListingsProviderInfo[] ListingProviders { get; set; } @@ -46,7 +45,6 @@ namespace MediaBrowser.Model.LiveTv public bool ImportFavoritesOnly { get; set; } public bool AllowHWTranscoding { get; set; } public bool EnableStreamLooping { get; set; } - public bool EnableMpDecimate { get; set; } public bool EnableNewHdhrChannelIds { get; set; } public string Source { get; set; } diff --git a/MediaBrowser.Model/Tasks/ITaskManager.cs b/MediaBrowser.Model/Tasks/ITaskManager.cs index fa3da97b3e..1674fc1070 100644 --- a/MediaBrowser.Model/Tasks/ITaskManager.cs +++ b/MediaBrowser.Model/Tasks/ITaskManager.cs @@ -74,5 +74,7 @@ namespace MediaBrowser.Model.Tasks event EventHandler> TaskExecuting; event EventHandler TaskCompleted; + + void RunTaskOnNextStartup(string key); } } \ No newline at end of file diff --git a/MediaBrowser.Model/Users/UserPolicy.cs b/MediaBrowser.Model/Users/UserPolicy.cs index 84ee5d6375..de2e9cc042 100644 --- a/MediaBrowser.Model/Users/UserPolicy.cs +++ b/MediaBrowser.Model/Users/UserPolicy.cs @@ -44,6 +44,7 @@ namespace MediaBrowser.Model.Users public bool EnablePlaybackRemuxing { get; set; } public bool EnableContentDeletion { get; set; } + public string[] EnableContentDeletionFromFolders { get; set; } public bool EnableContentDownloading { get; set; } /// @@ -73,6 +74,7 @@ namespace MediaBrowser.Model.Users public UserPolicy() { EnableContentDeletion = true; + EnableContentDeletionFromFolders = new string[] { }; EnableSyncTranscoding = true; diff --git a/MediaBrowser.Providers/Books/GoogleBooksProvider.cs b/MediaBrowser.Providers/Books/GoogleBooksProvider.cs new file mode 100644 index 0000000000..7330b8c43e --- /dev/null +++ b/MediaBrowser.Providers/Books/GoogleBooksProvider.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Providers; + +namespace MediaBrowser.Providers.Books +{ + public class GoogleBooksProvider : IRemoteMetadataProvider + { + public string Name => "Google Books"; + private readonly IHttpClient _httpClient; + + public GoogleBooksProvider(IHttpClient httpClient) + { + _httpClient = httpClient; + } + + public Task GetImageResponse(string url, CancellationToken cancellationToken) + { + return _httpClient.GetResponse(new HttpRequestOptions + { + CancellationToken = cancellationToken, + Url = url, + BufferContent = false + }); + } + + public async Task> GetMetadata(SongInfo info, CancellationToken cancellationToken) + { + return new MetadataResult(); + } + + public async Task> GetSearchResults(SongInfo searchInfo, CancellationToken cancellationToken) + { + return new List(); + } + } +} diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs index e271772cca..17b0646eda 100644 --- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs +++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs @@ -179,7 +179,7 @@ namespace MediaBrowser.Providers.BoxSets RootObject mainResult = null; - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -187,7 +187,10 @@ namespace MediaBrowser.Providers.BoxSets }).ConfigureAwait(false)) { - mainResult = _json.DeserializeFromStream(json); + using (var json = response.Content) + { + mainResult = _json.DeserializeFromStream(json); + } } cancellationToken.ThrowIfCancellationRequested(); @@ -204,7 +207,7 @@ namespace MediaBrowser.Providers.BoxSets url += "&include_image_language=" + MovieDbProvider.GetImageLanguagesParam(language); } - using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + using (var response = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, CancellationToken = cancellationToken, @@ -212,7 +215,10 @@ namespace MediaBrowser.Providers.BoxSets }).ConfigureAwait(false)) { - mainResult = _json.DeserializeFromStream(json); + using (var json = response.Content) + { + mainResult = _json.DeserializeFromStream(json); + } } } } diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index 00fd54271c..4419b48cbb 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -517,21 +517,11 @@ namespace MediaBrowser.Providers.Manager return true; } - if (libraryOptions.DownloadImagesInAdvance) - { - return false; - } - if (item.LocationType == LocationType.Remote || item.LocationType == LocationType.Virtual) { return true; } - if (!item.IsSaveLocalMetadataEnabled()) - { - return true; - } - if (item is IItemByName && !(item is MusicArtist)) { var hasDualAccess = item as IHasDualAccess; @@ -541,13 +531,17 @@ namespace MediaBrowser.Providers.Manager } } - switch (type) + if (libraryOptions.DownloadImagesInAdvance) { - case ImageType.Primary: - return true; - default: - return true; + return false; } + + //if (!item.IsSaveLocalMetadataEnabled()) + //{ + // return true; + //} + + return true; } private void SaveImageStub(IHasMetadata item, ImageType imageType, IEnumerable urls) diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index b93f783418..af03e21b2d 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -13,6 +13,7 @@ using System.Threading.Tasks; using MediaBrowser.Model.IO; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Providers; +using MediaBrowser.Providers.MediaInfo; namespace MediaBrowser.Providers.Manager { @@ -47,19 +48,47 @@ namespace MediaBrowser.Providers.Manager var libraryOptions = LibraryManager.GetLibraryOptions((BaseItem)item); - if (refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None) + if (!requiresRefresh && libraryOptions.AutomaticRefreshIntervalDays > 0 && (DateTime.UtcNow - item.DateLastRefreshed).TotalDays >= libraryOptions.AutomaticRefreshIntervalDays) + { + requiresRefresh = true; + } + + DateTime? newDateModified = null; + if (item.LocationType == LocationType.FileSystem) + { + var file = refreshOptions.DirectoryService.GetFile(item.Path); + if (file != null) + { + newDateModified = file.LastWriteTimeUtc; + if (item.EnableRefreshOnDateModifiedChange) + { + if (newDateModified != item.DateModified) + { + Logger.Debug("Date modified for {0}. Old date {1} new date {2} Id {3}", item.Path, item.DateModified, newDateModified, item.Id); + requiresRefresh = true; + } + } + + if (!requiresRefresh && item.SupportsLocalMetadata) + { + var video = item as Video; + + if (video != null && !video.IsPlaceHolder) + { + requiresRefresh = !video.SubtitleFiles + .SequenceEqual(SubtitleResolver.GetSubtitleFiles(video, refreshOptions.DirectoryService, FileSystem, false) + .OrderBy(i => i), StringComparer.OrdinalIgnoreCase); + } + } + } + } + + if (!requiresRefresh && refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None) { // TODO: If this returns true, should we instead just change metadata refresh mode to Full? requiresRefresh = item.RequiresRefresh(); } - if (!requiresRefresh && - libraryOptions.AutomaticRefreshIntervalDays > 0 && - (DateTime.UtcNow - item.DateLastRefreshed).TotalDays >= libraryOptions.AutomaticRefreshIntervalDays) - { - requiresRefresh = true; - } - var itemImageProvider = new ItemImageProvider(Logger, ProviderManager, ServerConfigurationManager, FileSystem); var localImagesFailed = false; @@ -145,20 +174,9 @@ namespace MediaBrowser.Providers.Manager var beforeSaveResult = BeforeSave(itemOfType, isFirstRefresh || refreshOptions.ReplaceAllMetadata || refreshOptions.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || requiresRefresh, updateType); updateType = updateType | beforeSaveResult; - if (item.LocationType == LocationType.FileSystem) + if (newDateModified.HasValue) { - var file = refreshOptions.DirectoryService.GetFile(item.Path); - if (file != null) - { - var fileLastWriteTime = file.LastWriteTimeUtc; - if (item.EnableRefreshOnDateModifiedChange && fileLastWriteTime != item.DateModified) - { - Logger.Debug("Date modified for {0}. Old date {1} new date {2} Id {3}", item.Path, item.DateModified, fileLastWriteTime, item.Id); - requiresRefresh = true; - } - - item.DateModified = fileLastWriteTime; - } + item.DateModified = newDateModified.Value; } // Save if changes were made, or it's never been saved before @@ -204,7 +222,7 @@ namespace MediaBrowser.Providers.Manager LibraryManager.UpdatePeople(baseItem, result.People); await SavePeopleMetadata(result.People, libraryOptions, cancellationToken).ConfigureAwait(false); } - await result.Item.UpdateToRepository(reason, cancellationToken).ConfigureAwait(false); + result.Item.UpdateToRepository(reason, cancellationToken); } private async Task SavePeopleMetadata(List people, LibraryOptions libraryOptions, CancellationToken cancellationToken) @@ -238,7 +256,7 @@ namespace MediaBrowser.Providers.Manager if (saveEntity) { - await personEntity.UpdateToRepository(updateType, cancellationToken).ConfigureAwait(false); + personEntity.UpdateToRepository(updateType, cancellationToken); } } } @@ -453,6 +471,11 @@ namespace MediaBrowser.Providers.Manager return item is TItemType; } + public bool CanRefreshPrimary(Type type) + { + return type == typeof(TItemType); + } + protected virtual async Task RefreshWithProviders(MetadataResult metadata, TIdType id, MetadataRefreshOptions options, @@ -655,6 +678,8 @@ namespace MediaBrowser.Providers.Manager if (result.HasMetadata) { + result.Provider = provider.Name; + results.Add(result); refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index c36d4cf63c..9dd5052dae 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -118,7 +118,29 @@ namespace MediaBrowser.Providers.Manager public Task RefreshSingleItem(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken) { - var service = _metadataServices.FirstOrDefault(i => i.CanRefresh(item)); + IMetadataService service = null; + var type = item.GetType(); + + foreach (var current in _metadataServices) + { + if (current.CanRefreshPrimary(type)) + { + service = current; + break; + } + } + + if (service == null) + { + foreach (var current in _metadataServices) + { + if (current.CanRefresh(item)) + { + service = current; + break; + } + } + } if (service != null) { @@ -131,16 +153,16 @@ namespace MediaBrowser.Providers.Manager public async Task SaveImage(IHasMetadata item, string url, ImageType type, int? imageIndex, CancellationToken cancellationToken) { - var response = await _httpClient.GetResponse(new HttpRequestOptions + using (var response = await _httpClient.GetResponse(new HttpRequestOptions { CancellationToken = cancellationToken, Url = url, BufferContent = false - }).ConfigureAwait(false); - - await SaveImage(item, response.Content, response.ContentType, type, imageIndex, cancellationToken) - .ConfigureAwait(false); + }).ConfigureAwait(false)) + { + await SaveImage(item, response.Content, response.ContentType, type, imageIndex, cancellationToken).ConfigureAwait(false); + } } public Task SaveImage(IHasMetadata item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken) @@ -452,6 +474,8 @@ namespace MediaBrowser.Providers.Manager GetPluginSummary(), GetPluginSummary(), GetPluginSummary