update dlna profiles

This commit is contained in:
Luke Pulverenti 2014-04-22 13:25:54 -04:00
parent 4331700747
commit 54eb7cb855
83 changed files with 12782 additions and 503 deletions

View File

@ -237,7 +237,7 @@ namespace MediaBrowser.Api.Movies
foreach (var director in directors) foreach (var director in directors)
{ {
var items = allMovies var items = allMovies
.Where(i => !_userDataRepository.GetUserData(userId, i.GetUserDataKey()).Played && i.People.Any(p => string.Equals(p.Type, PersonType.Director, StringComparison.OrdinalIgnoreCase) && string.Equals(p.Name, director, StringComparison.OrdinalIgnoreCase))) .Where(i => i.People.Any(p => string.Equals(p.Type, PersonType.Director, StringComparison.OrdinalIgnoreCase) && string.Equals(p.Name, director, StringComparison.OrdinalIgnoreCase)))
.Take(itemLimit) .Take(itemLimit)
.ToList(); .ToList();
@ -261,7 +261,7 @@ namespace MediaBrowser.Api.Movies
foreach (var name in names) foreach (var name in names)
{ {
var items = allMovies var items = allMovies
.Where(i => !_userDataRepository.GetUserData(userId, i.GetUserDataKey()).Played && i.People.Any(p => string.Equals(p.Name, name, StringComparison.OrdinalIgnoreCase))) .Where(i => i.People.Any(p => string.Equals(p.Name, name, StringComparison.OrdinalIgnoreCase)))
.Take(itemLimit) .Take(itemLimit)
.ToList(); .ToList();
@ -286,7 +286,6 @@ namespace MediaBrowser.Api.Movies
{ {
var similar = SimilarItemsHelper var similar = SimilarItemsHelper
.GetSimilaritems(item, allMovies, SimilarItemsHelper.GetSimiliarityScore) .GetSimilaritems(item, allMovies, SimilarItemsHelper.GetSimiliarityScore)
.Where(i => !_userDataRepository.GetUserData(userId, i.GetUserDataKey()).Played)
.Take(itemLimit) .Take(itemLimit)
.ToList(); .ToList();

View File

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Collections;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.Movies;
@ -257,26 +258,28 @@ namespace MediaBrowser.Api.UserLibrary
/// The _library manager /// The _library manager
/// </summary> /// </summary>
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
private readonly ISearchEngine _searchEngine;
private readonly ILocalizationManager _localization; private readonly ILocalizationManager _localization;
private readonly IDtoService _dtoService; private readonly IDtoService _dtoService;
private readonly ICollectionManager _collectionManager;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="ItemsService" /> class. /// Initializes a new instance of the <see cref="ItemsService" /> class.
/// </summary> /// </summary>
/// <param name="userManager">The user manager.</param> /// <param name="userManager">The user manager.</param>
/// <param name="libraryManager">The library manager.</param> /// <param name="libraryManager">The library manager.</param>
/// <param name="searchEngine">The search engine.</param>
/// <param name="userDataRepository">The user data repository.</param> /// <param name="userDataRepository">The user data repository.</param>
public ItemsService(IUserManager userManager, ILibraryManager libraryManager, ISearchEngine searchEngine, IUserDataManager userDataRepository, ILocalizationManager localization, IDtoService dtoService) /// <param name="localization">The localization.</param>
/// <param name="dtoService">The dto service.</param>
/// <param name="collectionManager">The collection manager.</param>
public ItemsService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, ILocalizationManager localization, IDtoService dtoService, ICollectionManager collectionManager)
{ {
_userManager = userManager; _userManager = userManager;
_libraryManager = libraryManager; _libraryManager = libraryManager;
_searchEngine = searchEngine;
_userDataRepository = userDataRepository; _userDataRepository = userDataRepository;
_localization = localization; _localization = localization;
_dtoService = dtoService; _dtoService = dtoService;
_collectionManager = collectionManager;
} }
/// <summary> /// <summary>
@ -319,7 +322,7 @@ namespace MediaBrowser.Api.UserLibrary
if (CollapseBoxSetItems(request)) if (CollapseBoxSetItems(request))
{ {
items = CollapseItemsWithinBoxSets(items, user); items = _collectionManager.CollapseItemsWithinBoxSets(items, user);
} }
items = ApplySortOrder(request, items, user, _libraryManager); items = ApplySortOrder(request, items, user, _libraryManager);
@ -1245,38 +1248,143 @@ namespace MediaBrowser.Api.UserLibrary
return false; return false;
} }
private IEnumerable<BaseItem> CollapseItemsWithinBoxSets(IEnumerable<BaseItem> items, User user)
{
var itemsToCollapse = new List<ISupportsBoxSetGrouping>();
var boxsets = new List<BaseItem>();
var list = items.ToList();
foreach (var item in list.OfType<ISupportsBoxSetGrouping>())
{
var currentBoxSets = item.BoxSetIdList
.Select(i => _libraryManager.GetItemById(i))
.Where(i => i != null && i.IsVisible(user))
.ToList();
if (currentBoxSets.Count > 0)
{
itemsToCollapse.Add(item);
boxsets.AddRange(currentBoxSets);
}
}
return list.Except(itemsToCollapse.Cast<BaseItem>()).Concat(boxsets).Distinct();
}
private bool AllowBoxSetCollapsing(GetItems request) private bool AllowBoxSetCollapsing(GetItems request)
{ {
// Only allow when using default sort order if (!string.IsNullOrWhiteSpace(request.Filters))
if (!string.IsNullOrEmpty(request.SortBy) && !string.Equals(request.SortBy, "SortName", StringComparison.OrdinalIgnoreCase))
{ {
return false; return false;
} }
if (!string.IsNullOrWhiteSpace(request.AllGenres))
{
return false;
}
if (!string.IsNullOrWhiteSpace(request.Genres))
{
return false;
}
if (request.HasImdbId.HasValue)
{
return false;
}
if (request.HasOfficialRating.HasValue)
{
return false;
}
if (request.HasOverview.HasValue)
{
return false;
}
if (request.HasParentalRating.HasValue)
{
return false;
}
if (request.HasSpecialFeature.HasValue)
{
return false;
}
if (request.HasSubtitles.HasValue)
{
return false;
}
if (request.HasThemeSong.HasValue)
{
return false;
}
if (request.HasThemeVideo.HasValue)
{
return false;
}
if (request.HasTmdbId.HasValue)
{
return false;
}
if (request.HasTrailer.HasValue)
{
return false;
}
if (!string.IsNullOrWhiteSpace(request.Ids))
{
return false;
}
if (!string.IsNullOrWhiteSpace(request.ImageTypes))
{
return false;
}
if (request.Is3D.HasValue)
{
return false;
}
if (request.IsHD.HasValue)
{
return false;
}
if (request.IsInBoxSet.HasValue)
{
return false;
}
if (request.IsLocked.HasValue)
{
return false;
}
if (request.IsPlaceHolder.HasValue)
{
return false;
}
if (request.IsPlayed.HasValue)
{
return false;
}
if (request.IsUnidentified.HasValue)
{
return false;
}
if (request.IsYearMismatched.HasValue)
{
return false;
}
if (!string.IsNullOrWhiteSpace(request.Person))
{
return false;
}
if (!string.IsNullOrWhiteSpace(request.Studios))
{
return false;
}
if (!string.IsNullOrWhiteSpace(request.VideoTypes))
{
return false;
}
if (!string.IsNullOrWhiteSpace(request.Years))
{
return false;
}
return true; return true;
} }

View File

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -29,5 +30,13 @@ namespace MediaBrowser.Controller.Collections
/// <param name="itemIds">The item ids.</param> /// <param name="itemIds">The item ids.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task RemoveFromCollection(Guid collectionId, IEnumerable<Guid> itemIds); Task RemoveFromCollection(Guid collectionId, IEnumerable<Guid> itemIds);
/// <summary>
/// Collapses the items within box sets.
/// </summary>
/// <param name="items">The items.</param>
/// <param name="user">The user.</param>
/// <returns>IEnumerable{BaseItem}.</returns>
IEnumerable<BaseItem> CollapseItemsWithinBoxSets(IEnumerable<BaseItem> items, User user);
} }
} }

View File

@ -15,6 +15,7 @@ namespace MediaBrowser.Controller.Entities.Audio
public string FormatName { get; set; } public string FormatName { get; set; }
public long? Size { get; set; } public long? Size { get; set; }
public string Container { get; set; } public string Container { get; set; }
public int? TotalBitrate { get; set; }
public Audio() public Audio()
{ {

View File

@ -129,14 +129,13 @@ namespace MediaBrowser.Controller.Entities
return NullTaskResult; return NullTaskResult;
} }
private List<LinkedChild> _linkedChildren;
/// <summary> /// <summary>
/// Our children are actually just references to the ones in the physical root... /// Our children are actually just references to the ones in the physical root...
/// </summary> /// </summary>
/// <value>The linked children.</value> /// <value>The linked children.</value>
public override List<LinkedChild> LinkedChildren public override List<LinkedChild> LinkedChildren
{ {
get { return _linkedChildren ?? (_linkedChildren = GetLinkedChildrenInternal()); } get { return GetLinkedChildrenInternal(); }
set set
{ {
base.LinkedChildren = value; base.LinkedChildren = value;
@ -175,7 +174,6 @@ namespace MediaBrowser.Controller.Entities
public void ResetDynamicChildren() public void ResetDynamicChildren()
{ {
_actualChildren = null; _actualChildren = null;
_linkedChildren = null;
} }
} }
} }

View File

@ -29,6 +29,7 @@ namespace MediaBrowser.Controller.Entities
public string FormatName { get; set; } public string FormatName { get; set; }
public long? Size { get; set; } public long? Size { get; set; }
public string Container { get; set; } public string Container { get; set; }
public int? TotalBitrate { get; set; }
public Video() public Video()
{ {

View File

@ -134,6 +134,11 @@ namespace MediaBrowser.Controller.MediaEncoding
if (data.format != null) if (data.format != null)
{ {
info.Format = data.format.format_name; info.Format = data.format.format_name;
if (!string.IsNullOrEmpty(data.format.bit_rate))
{
info.TotalBitrate = int.Parse(data.format.bit_rate, UsCulture);
}
} }
return info; return info;

View File

@ -58,6 +58,7 @@
<Compile Include="PlayTo\Device.cs"> <Compile Include="PlayTo\Device.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="PlayTo\DeviceEventArgs.cs" />
<Compile Include="PlayTo\DeviceInfo.cs" /> <Compile Include="PlayTo\DeviceInfo.cs" />
<Compile Include="Common\DeviceService.cs" /> <Compile Include="Common\DeviceService.cs" />
<Compile Include="PlayTo\DidlBuilder.cs" /> <Compile Include="PlayTo\DidlBuilder.cs" />
@ -86,7 +87,7 @@
<Compile Include="PlayTo\TransportCommands.cs" /> <Compile Include="PlayTo\TransportCommands.cs" />
<Compile Include="PlayTo\TransportStateEventArgs.cs" /> <Compile Include="PlayTo\TransportStateEventArgs.cs" />
<Compile Include="PlayTo\uBaseObject.cs" /> <Compile Include="PlayTo\uBaseObject.cs" />
<Compile Include="PlayTo\uContainer.cs" /> <Compile Include="PlayTo\UpnpContainer.cs" />
<Compile Include="Common\DeviceIcon.cs" /> <Compile Include="Common\DeviceIcon.cs" />
<Compile Include="PlayTo\uParser.cs" /> <Compile Include="PlayTo\uParser.cs" />
<Compile Include="PlayTo\uPnpNamespaces.cs" /> <Compile Include="PlayTo\uPnpNamespaces.cs" />

View File

@ -20,34 +20,12 @@ namespace MediaBrowser.Dlna.PlayTo
#region Fields & Properties #region Fields & Properties
private Timer _timer; private Timer _timer;
private Timer _volumeTimer;
public DeviceInfo Properties { get; set; } public DeviceInfo Properties { get; set; }
private int _muteVol; private int _muteVol;
public bool IsMuted public bool IsMuted { get; set; }
{
get
{
return _muteVol > 0;
}
}
private string _currentId = String.Empty;
public string CurrentId
{
get
{
return _currentId;
}
set
{
if (_currentId == value)
return;
_currentId = value;
NotifyCurrentIdChanged(value);
}
}
public int Volume { get; set; } public int Volume { get; set; }
@ -66,23 +44,7 @@ namespace MediaBrowser.Dlna.PlayTo
} }
} }
private TRANSPORTSTATE _transportState = TRANSPORTSTATE.STOPPED; public TRANSPORTSTATE TransportState { get; private set; }
public TRANSPORTSTATE TransportState
{
get
{
return _transportState;
}
set
{
if (_transportState == value)
return;
_transportState = value;
NotifyPlaybackChanged(value);
}
}
public bool IsPlaying public bool IsPlaying
{ {
@ -92,14 +54,6 @@ namespace MediaBrowser.Dlna.PlayTo
} }
} }
public bool IsTransitioning
{
get
{
return (TransportState == TRANSPORTSTATE.TRANSITIONING);
}
}
public bool IsPaused public bool IsPaused
{ {
get get
@ -134,7 +88,12 @@ namespace MediaBrowser.Dlna.PlayTo
private int GetPlaybackTimerIntervalMs() private int GetPlaybackTimerIntervalMs()
{ {
return 2000; return 1000;
}
private int GetVolumeTimerIntervalMs()
{
return 5000;
} }
private int GetInactiveTimerIntervalMs() private int GetInactiveTimerIntervalMs()
@ -146,77 +105,135 @@ namespace MediaBrowser.Dlna.PlayTo
{ {
UpdateTime = DateTime.UtcNow; UpdateTime = DateTime.UtcNow;
var interval = GetPlaybackTimerIntervalMs(); _timer = new Timer(TimerCallback, null, GetPlaybackTimerIntervalMs(), GetInactiveTimerIntervalMs());
_timer = new Timer(TimerCallback, null, interval, interval); _volumeTimer = new Timer(VolumeTimerCallback, null, Timeout.Infinite, Timeout.Infinite);
_timerActive = false;
} }
private readonly object _timerLock = new object();
private bool _timerActive;
private void RestartTimer() private void RestartTimer()
{ {
var interval = GetPlaybackTimerIntervalMs(); if (!_timerActive)
{
lock (_timerLock)
{
if (!_timerActive)
{
_timer.Change(10, GetPlaybackTimerIntervalMs());
_timer.Change(interval, interval); _volumeTimer.Change(100, GetVolumeTimerIntervalMs());
}
_timerActive = true;
}
}
} }
/// <summary> /// <summary>
/// Restarts the timer in inactive mode. /// Restarts the timer in inactive mode.
/// </summary> /// </summary>
private void RestartTimerInactive() private void RestartTimerInactive()
{ {
var interval = GetInactiveTimerIntervalMs(); if (_timerActive)
{
lock (_timerLock)
{
if (_timerActive)
{
var interval = GetInactiveTimerIntervalMs();
_timer.Change(interval, interval); _timer.Change(interval, interval);
} _volumeTimer.Change(Timeout.Infinite, Timeout.Infinite);
}
private void StopTimer() _timerActive = false;
{ }
_timer.Change(Timeout.Infinite, Timeout.Infinite); }
} }
#region Commanding #region Commanding
public Task<bool> VolumeDown(bool mute = false) public Task VolumeDown()
{ {
var sendVolume = (Volume - 5) > 0 ? Volume - 5 : 0; var sendVolume = Math.Max(Volume - 5, 0);
if (mute && _muteVol == 0)
{
sendVolume = 0;
_muteVol = Volume;
}
return SetVolume(sendVolume); return SetVolume(sendVolume);
} }
public Task<bool> VolumeUp(bool unmute = false) public Task VolumeUp()
{ {
var sendVolume = (Volume + 5) < 100 ? Volume + 5 : 100; var sendVolume = Math.Min(Volume + 5, 100);
if (unmute && _muteVol > 0)
sendVolume = _muteVol;
_muteVol = 0;
return SetVolume(sendVolume); return SetVolume(sendVolume);
} }
public Task ToggleMute() public Task ToggleMute()
{ {
if (_muteVol == 0) if (IsMuted)
{ {
_muteVol = Volume; return Unmute();
return SetVolume(0);
} }
var tmp = _muteVol; return Mute();
_muteVol = 0; }
return SetVolume(tmp);
public async Task Mute()
{
var success = await SetMute(true).ConfigureAwait(true);
if (!success)
{
await SetVolume(0).ConfigureAwait(false);
}
}
public async Task Unmute()
{
var success = await SetMute(false).ConfigureAwait(true);
if (!success)
{
var sendVolume = _muteVol <= 0 ? 20 : _muteVol;
await SetVolume(sendVolume).ConfigureAwait(false);
}
}
private async Task<bool> SetMute(bool mute)
{
var command = RendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetMute");
if (command == null)
return false;
var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceRenderingType);
if (service == null)
{
return false;
}
_logger.Debug("Setting mute");
var value = mute ? 1 : 0;
await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType, value))
.ConfigureAwait(false);
IsMuted = mute;
return true;
} }
/// <summary> /// <summary>
/// Sets volume on a scale of 0-100 /// Sets volume on a scale of 0-100
/// </summary> /// </summary>
public async Task<bool> SetVolume(int value) public async Task SetVolume(int value)
{ {
var command = RendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetVolume"); var command = RendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetVolume");
if (command == null) if (command == null)
return true; return;
var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceRenderingType); var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceRenderingType);
@ -225,17 +242,19 @@ namespace MediaBrowser.Dlna.PlayTo
throw new InvalidOperationException("Unable to find service"); throw new InvalidOperationException("Unable to find service");
} }
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType, value)) // Set it early and assume it will succeed
.ConfigureAwait(false); // Remote control will perform better
Volume = value; Volume = value;
return true;
await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType, value))
.ConfigureAwait(false);
} }
public async Task<TimeSpan> Seek(TimeSpan value) public async Task Seek(TimeSpan value)
{ {
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Seek"); var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Seek");
if (command == null) if (command == null)
return value; return;
var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType); var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
@ -244,22 +263,17 @@ namespace MediaBrowser.Dlna.PlayTo
throw new InvalidOperationException("Unable to find service"); throw new InvalidOperationException("Unable to find service");
} }
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, String.Format("{0:hh}:{0:mm}:{0:ss}", value), "REL_TIME")) await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, String.Format("{0:hh}:{0:mm}:{0:ss}", value), "REL_TIME"))
.ConfigureAwait(false); .ConfigureAwait(false);
return value;
} }
public async Task<bool> SetAvTransport(string url, string header, string metaData) public async Task SetAvTransport(string url, string header, string metaData)
{ {
StopTimer();
await SetStop().ConfigureAwait(false); await SetStop().ConfigureAwait(false);
CurrentId = null;
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetAVTransportURI"); var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetAVTransportURI");
if (command == null) if (command == null)
return false; return;
var dictionary = new Dictionary<string, string> var dictionary = new Dictionary<string, string>
{ {
@ -274,18 +288,13 @@ namespace MediaBrowser.Dlna.PlayTo
throw new InvalidOperationException("Unable to find service"); throw new InvalidOperationException("Unable to find service");
} }
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, url, dictionary), header) await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, url, dictionary), header)
.ConfigureAwait(false); .ConfigureAwait(false);
await Task.Delay(50).ConfigureAwait(false); await Task.Delay(50).ConfigureAwait(false);
await SetPlay().ConfigureAwait(false); await SetPlay().ConfigureAwait(false);
_lapsCount = GetLapsCount();
RestartTimer(); RestartTimer();
return true;
} }
private string CreateDidlMeta(string value) private string CreateDidlMeta(string value)
@ -300,11 +309,11 @@ namespace MediaBrowser.Dlna.PlayTo
private const string BaseDidl = "&lt;DIDL-Lite xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\" xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0/\"&gt;{0}&lt;/DIDL-Lite&gt;"; private const string BaseDidl = "&lt;DIDL-Lite xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\" xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0/\"&gt;{0}&lt;/DIDL-Lite&gt;";
public async Task<bool> SetNextAvTransport(string value, string header, string metaData) public async Task SetNextAvTransport(string value, string header, string metaData)
{ {
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetNextAVTransportURI"); var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "SetNextAVTransportURI");
if (command == null) if (command == null)
return false; return;
var dictionary = new Dictionary<string, string> var dictionary = new Dictionary<string, string>
{ {
@ -319,19 +328,17 @@ namespace MediaBrowser.Dlna.PlayTo
throw new InvalidOperationException("Unable to find service"); throw new InvalidOperationException("Unable to find service");
} }
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, value, dictionary), header) await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, value, dictionary), header)
.ConfigureAwait(false); .ConfigureAwait(false);
await Task.Delay(100).ConfigureAwait(false); RestartTimer();
return true;
} }
public async Task<bool> SetPlay() public async Task SetPlay()
{ {
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Play"); var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Play");
if (command == null) if (command == null)
return false; return;
var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType); var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
@ -340,81 +347,73 @@ namespace MediaBrowser.Dlna.PlayTo
throw new InvalidOperationException("Unable to find service"); throw new InvalidOperationException("Unable to find service");
} }
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, 1)) await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, 1))
.ConfigureAwait(false); .ConfigureAwait(false);
_lapsCount = GetLapsCount();
return true;
} }
public async Task<bool> SetStop() public async Task SetStop()
{ {
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Stop"); var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Stop");
if (command == null) if (command == null)
return false; return;
var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType); var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, 1)) await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, 1))
.ConfigureAwait(false); .ConfigureAwait(false);
await Task.Delay(50).ConfigureAwait(false);
return true;
} }
public async Task<bool> SetPause() public async Task SetPause()
{ {
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Pause"); var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "Pause");
if (command == null) if (command == null)
return false; return;
var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType); var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, 1)) await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType, 1))
.ConfigureAwait(false); .ConfigureAwait(false);
await Task.Delay(50).ConfigureAwait(false); TransportState = TRANSPORTSTATE.PAUSED;
TransportState = TRANSPORTSTATE.PAUSED_PLAYBACK;
return true;
} }
#endregion #endregion
#region Get data #region Get data
private int GetLapsCount()
{
// No need to get all data every lap, just every X time.
return 10;
}
int _lapsCount = 0;
private async void TimerCallback(object sender) private async void TimerCallback(object sender)
{ {
if (_disposed) if (_disposed)
return; return;
StopTimer();
try try
{ {
await GetTransportInfo().ConfigureAwait(false); var transportState = await GetTransportInfo().ConfigureAwait(false);
//If we're not playing anything no need to get additional data if (transportState.HasValue)
if (TransportState != TRANSPORTSTATE.STOPPED)
{ {
var hasTrack = await GetPositionInfo().ConfigureAwait(false); UpdateTime = DateTime.UtcNow;
// TODO: Why make these requests if hasTrack==false? // If we're not playing anything no need to get additional data
// TODO ANSWER Some vendors don't include track in GetPositionInfo, use GetMediaInfo instead. if (transportState.Value == TRANSPORTSTATE.STOPPED)
if (_lapsCount > GetLapsCount())
{ {
if (!hasTrack) UpdateMediaInfo(null, transportState.Value);
}
else
{
var tuple = await GetPositionInfo().ConfigureAwait(false);
var currentObject = tuple.Item2;
if (tuple.Item1 && currentObject == null)
{ {
await GetMediaInfo().ConfigureAwait(false); currentObject = await GetMediaInfo().ConfigureAwait(false);
}
if (currentObject != null)
{
UpdateMediaInfo(currentObject, transportState.Value);
} }
await GetVolume().ConfigureAwait(false);
_lapsCount = 0;
} }
} }
} }
@ -423,16 +422,27 @@ namespace MediaBrowser.Dlna.PlayTo
_logger.ErrorException("Error updating device info", ex); _logger.ErrorException("Error updating device info", ex);
} }
_lapsCount++;
if (_disposed) if (_disposed)
return; return;
//If we're not playing anything make sure we don't get data more often than neccessry to keep the Session alive // If we're not playing anything make sure we don't get data more often than neccessry to keep the Session alive
if (TransportState != TRANSPORTSTATE.STOPPED) if (TransportState == TRANSPORTSTATE.STOPPED)
RestartTimer();
else
RestartTimerInactive(); RestartTimerInactive();
else
RestartTimer();
}
private async void VolumeTimerCallback(object sender)
{
try
{
await GetVolume().ConfigureAwait(false);
await GetMute().ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.ErrorException("Error updating device info", ex);
}
} }
private async Task GetVolume() private async Task GetVolume()
@ -462,28 +472,52 @@ namespace MediaBrowser.Dlna.PlayTo
Volume = int.Parse(volumeValue, UsCulture); Volume = int.Parse(volumeValue, UsCulture);
//Reset the Mute value if Volume is bigger than zero if (Volume > 0)
if (Volume > 0 && _muteVol > 0)
{ {
_muteVol = 0; _muteVol = Volume;
} }
} }
private async Task GetTransportInfo() private async Task GetMute()
{ {
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetTransportInfo"); var command = RendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetMute");
if (command == null) if (command == null)
return; return;
var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceRenderingType);
if (service == null)
{
throw new InvalidOperationException("Unable to find service");
}
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, RendererCommands.BuildPost(command, service.ServiceType))
.ConfigureAwait(false);
if (result == null || result.Document == null)
return;
var valueNode = result.Document.Descendants(uPnpNamespaces.RenderingControl + "GetMuteResponse").Select(i => i.Element("CurrentMute")).FirstOrDefault(i => i != null);
var value = valueNode == null ? null : valueNode.Value;
IsMuted = string.Equals(value, "1", StringComparison.OrdinalIgnoreCase);
}
private async Task<TRANSPORTSTATE?> GetTransportInfo()
{
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetTransportInfo");
if (command == null)
return null;
var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType); var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
if (service == null) if (service == null)
return; return null;
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType)) var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, AvCommands.BuildPost(command, service.ServiceType))
.ConfigureAwait(false); .ConfigureAwait(false);
if (result == null || result.Document == null) if (result == null || result.Document == null)
return; return null;
var transportState = var transportState =
result.Document.Descendants(uPnpNamespaces.AvTransport + "GetTransportInfoResponse").Select(i => i.Element("CurrentTransportState")).FirstOrDefault(i => i != null); result.Document.Descendants(uPnpNamespaces.AvTransport + "GetTransportInfoResponse").Select(i => i.Element("CurrentTransportState")).FirstOrDefault(i => i != null);
@ -496,18 +530,18 @@ namespace MediaBrowser.Dlna.PlayTo
if (Enum.TryParse(transportStateValue, true, out state)) if (Enum.TryParse(transportStateValue, true, out state))
{ {
TransportState = state; return state;
} }
} }
UpdateTime = DateTime.UtcNow; return null;
} }
private async Task GetMediaInfo() private async Task<uBaseObject> GetMediaInfo()
{ {
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetMediaInfo"); var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetMediaInfo");
if (command == null) if (command == null)
return; return null;
var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType); var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
@ -520,33 +554,25 @@ namespace MediaBrowser.Dlna.PlayTo
.ConfigureAwait(false); .ConfigureAwait(false);
if (result == null || result.Document == null) if (result == null || result.Document == null)
return; return null;
var track = result.Document.Descendants("CurrentURIMetaData").FirstOrDefault(); var track = result.Document.Descendants("CurrentURIMetaData").FirstOrDefault();
if (track == null) if (track == null)
{ {
CurrentId = null; return null;
return;
} }
var e = track.Element(uPnpNamespaces.items) ?? track; var e = track.Element(uPnpNamespaces.items) ?? track;
var uTrack = uParser.CreateObjectFromXML(new uParserObject return UpnpContainer.Create(e);
{
Type = e.GetValue(uPnpNamespaces.uClass),
Element = e
});
if (uTrack != null)
CurrentId = uTrack.Id;
} }
private async Task<bool> GetPositionInfo() private async Task<Tuple<bool, uBaseObject>> GetPositionInfo()
{ {
var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetPositionInfo"); var command = AvCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetPositionInfo");
if (command == null) if (command == null)
return true; return new Tuple<bool, uBaseObject>(false, null);
var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType); var service = Properties.Services.FirstOrDefault(s => s.ServiceType == ServiceAvtransportType);
@ -559,7 +585,7 @@ namespace MediaBrowser.Dlna.PlayTo
.ConfigureAwait(false); .ConfigureAwait(false);
if (result == null || result.Document == null) if (result == null || result.Document == null)
return true; return new Tuple<bool, uBaseObject>(false, null);
var durationElem = result.Document.Descendants(uPnpNamespaces.AvTransport + "GetPositionInfoResponse").Select(i => i.Element("TrackDuration")).FirstOrDefault(i => i != null); var durationElem = result.Document.Descendants(uPnpNamespaces.AvTransport + "GetPositionInfoResponse").Select(i => i.Element("TrackDuration")).FirstOrDefault(i => i != null);
var duration = durationElem == null ? null : durationElem.Value; var duration = durationElem == null ? null : durationElem.Value;
@ -582,14 +608,14 @@ namespace MediaBrowser.Dlna.PlayTo
if (track == null) if (track == null)
{ {
//If track is null, some vendors do this, use GetMediaInfo instead //If track is null, some vendors do this, use GetMediaInfo instead
return false; return new Tuple<bool, uBaseObject>(true, null);
} }
var trackString = (string)track; var trackString = (string)track;
if (string.IsNullOrWhiteSpace(trackString) || string.Equals(trackString, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase)) if (string.IsNullOrWhiteSpace(trackString) || string.Equals(trackString, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase))
{ {
return false; return new Tuple<bool, uBaseObject>(true, null);
} }
XElement uPnpResponse; XElement uPnpResponse;
@ -601,19 +627,14 @@ namespace MediaBrowser.Dlna.PlayTo
catch catch
{ {
_logger.Error("Unable to parse xml {0}", trackString); _logger.Error("Unable to parse xml {0}", trackString);
return false; return new Tuple<bool, uBaseObject>(true, null);
} }
var e = uPnpResponse.Element(uPnpNamespaces.items); var e = uPnpResponse.Element(uPnpNamespaces.items);
var uTrack = CreateUBaseObject(e); var uTrack = CreateUBaseObject(e);
if (uTrack == null) return new Tuple<bool, uBaseObject>(true, uTrack);
return true;
CurrentId = uTrack.Id;
return true;
} }
private static uBaseObject CreateUBaseObject(XElement container) private static uBaseObject CreateUBaseObject(XElement container)
@ -858,29 +879,64 @@ namespace MediaBrowser.Dlna.PlayTo
}; };
} }
#region Events public event EventHandler<PlaybackStartEventArgs> PlaybackStart;
public event EventHandler<PlaybackProgressEventArgs> PlaybackProgress;
public event EventHandler<PlaybackStoppedEventArgs> PlaybackStopped;
public event EventHandler<TransportStateEventArgs> PlaybackChanged; private uBaseObject _lastMediaInfo;
public event EventHandler<CurrentIdEventArgs> CurrentIdChanged; private void UpdateMediaInfo(uBaseObject mediaInfo, TRANSPORTSTATE state)
private void NotifyPlaybackChanged(TRANSPORTSTATE state)
{ {
if (PlaybackChanged != null) TransportState = state;
var previousMediaInfo = _lastMediaInfo;
_lastMediaInfo = mediaInfo;
if (previousMediaInfo == null && mediaInfo != null)
{ {
PlaybackChanged.Invoke(this, new TransportStateEventArgs OnPlaybackStart(mediaInfo);
}
else if (mediaInfo == null && previousMediaInfo != null)
{
OnPlaybackStop(previousMediaInfo);
}
else if (mediaInfo != null && mediaInfo.Equals(previousMediaInfo))
{
OnPlaybackProgress(mediaInfo);
}
}
private void OnPlaybackStart(uBaseObject mediaInfo)
{
if (PlaybackStart != null)
{
PlaybackStart.Invoke(this, new PlaybackStartEventArgs
{ {
State = state MediaInfo = mediaInfo
}); });
} }
} }
private void NotifyCurrentIdChanged(string value) private void OnPlaybackProgress(uBaseObject mediaInfo)
{ {
if (CurrentIdChanged != null) if (PlaybackProgress != null)
CurrentIdChanged.Invoke(this, new CurrentIdEventArgs { Id = value }); {
PlaybackProgress.Invoke(this, new PlaybackProgressEventArgs
{
MediaInfo = mediaInfo
});
}
} }
#endregion private void OnPlaybackStop(uBaseObject mediaInfo)
{
if (PlaybackStopped != null)
{
PlaybackStopped.Invoke(this, new PlaybackStoppedEventArgs
{
MediaInfo = mediaInfo
});
}
}
#region IDisposable #region IDisposable
@ -890,7 +946,27 @@ namespace MediaBrowser.Dlna.PlayTo
if (!_disposed) if (!_disposed)
{ {
_disposed = true; _disposed = true;
DisposeTimer();
DisposeVolumeTimer();
}
}
private void DisposeTimer()
{
if (_timer != null)
{
_timer.Dispose(); _timer.Dispose();
_timer = null;
}
}
private void DisposeVolumeTimer()
{
if (_volumeTimer != null)
{
_volumeTimer.Dispose();
_volumeTimer = null;
} }
} }
@ -900,15 +976,5 @@ namespace MediaBrowser.Dlna.PlayTo
{ {
return String.Format("{0} - {1}", Properties.Name, Properties.BaseUrl); return String.Format("{0} - {1}", Properties.Name, Properties.BaseUrl);
} }
}
public enum TRANSPORTSTATE
{
STOPPED,
PLAYING,
TRANSITIONING,
PAUSED_PLAYBACK,
PAUSED
} }
} }

View File

@ -0,0 +1,28 @@
using System;
namespace MediaBrowser.Dlna.PlayTo
{
public class PlaybackStartEventArgs : EventArgs
{
public uBaseObject MediaInfo { get; set; }
}
public class PlaybackProgressEventArgs : EventArgs
{
public uBaseObject MediaInfo { get; set; }
}
public class PlaybackStoppedEventArgs : EventArgs
{
public uBaseObject MediaInfo { get; set; }
}
public enum TRANSPORTSTATE
{
STOPPED,
PLAYING,
TRANSITIONING,
PAUSED_PLAYBACK,
PAUSED
}
}

View File

@ -24,7 +24,6 @@ namespace MediaBrowser.Dlna.PlayTo
public class PlayToController : ISessionController, IDisposable public class PlayToController : ISessionController, IDisposable
{ {
private Device _device; private Device _device;
private BaseItem _currentItem;
private readonly SessionInfo _session; private readonly SessionInfo _session;
private readonly ISessionManager _sessionManager; private readonly ISessionManager _sessionManager;
private readonly IItemRepository _itemRepository; private readonly IItemRepository _itemRepository;
@ -35,9 +34,6 @@ namespace MediaBrowser.Dlna.PlayTo
private readonly IUserManager _userManager; private readonly IUserManager _userManager;
private readonly IServerApplicationHost _appHost; private readonly IServerApplicationHost _appHost;
private readonly IDtoService _dtoService; private readonly IDtoService _dtoService;
private bool _playbackStarted;
private const int UpdateTimerIntervalMs = 1000;
public bool SupportsMediaRemoteControl public bool SupportsMediaRemoteControl
{ {
@ -72,82 +68,113 @@ namespace MediaBrowser.Dlna.PlayTo
public void Init(Device device) public void Init(Device device)
{ {
_device = device; _device = device;
_device.PlaybackChanged += Device_PlaybackChanged; _device.PlaybackStart += _device_PlaybackStart;
_device.CurrentIdChanged += Device_CurrentIdChanged; _device.PlaybackProgress += _device_PlaybackProgress;
_device.PlaybackStopped += _device_PlaybackStopped;
_device.Start(); _device.Start();
_updateTimer = new Timer(updateTimer_Elapsed, null, UpdateTimerIntervalMs, UpdateTimerIntervalMs); _updateTimer = new Timer(updateTimer_Elapsed, null, 30000, 30000);
}
async void _device_PlaybackStopped(object sender, PlaybackStoppedEventArgs e)
{
try
{
await _sessionManager.OnPlaybackStopped(new PlaybackStopInfo
{
ItemId = e.MediaInfo.Id,
SessionId = _session.Id,
PositionTicks = _device.Position.Ticks
}).ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.ErrorException("Error reporting progress", ex);
}
await SetNext().ConfigureAwait(false);
}
async void _device_PlaybackStart(object sender, PlaybackStartEventArgs e)
{
var playlistItem = Playlist.FirstOrDefault(p => p.PlayState == 1);
if (playlistItem != null)
{
var streamInfo = playlistItem.StreamInfo;
var info = GetProgressInfo(streamInfo, e.MediaInfo);
try
{
await _sessionManager.OnPlaybackStart(info).ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.ErrorException("Error reporting progress", ex);
}
}
}
async void _device_PlaybackProgress(object sender, PlaybackProgressEventArgs e)
{
var playlistItem = Playlist.FirstOrDefault(p => p.PlayState == 1);
if (playlistItem != null)
{
var streamInfo = playlistItem.StreamInfo;
var info = GetProgressInfo(streamInfo, e.MediaInfo);
try
{
await _sessionManager.OnPlaybackProgress(info).ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.ErrorException("Error reporting progress", ex);
}
}
}
private PlaybackStartInfo GetProgressInfo(StreamInfo streamInfo, uBaseObject mediaInfo)
{
var ticks = _device.Position.Ticks;
if (!streamInfo.IsDirectStream)
{
ticks += streamInfo.StartPositionTicks;
}
return new PlaybackStartInfo
{
ItemId = mediaInfo.Id,
SessionId = _session.Id,
PositionTicks = ticks,
IsMuted = _device.IsMuted,
IsPaused = _device.IsPaused,
MediaSourceId = streamInfo.MediaSourceId,
AudioStreamIndex = streamInfo.AudioStreamIndex,
SubtitleStreamIndex = streamInfo.SubtitleStreamIndex,
VolumeLevel = _device.Volume,
CanSeek = streamInfo.RunTimeTicks.HasValue,
PlayMethod = streamInfo.IsDirectStream ? PlayMethod.DirectStream : PlayMethod.Transcode,
QueueableMediaTypes = new List<string> { mediaInfo.MediaType }
};
} }
#region Device EventHandlers & Update Timer #region Device EventHandlers & Update Timer
Timer _updateTimer; Timer _updateTimer;
async void Device_PlaybackChanged(object sender, TransportStateEventArgs e)
{
if (_currentItem == null)
return;
if (e.State == TRANSPORTSTATE.STOPPED)
await ReportProgress().ConfigureAwait(false);
else if (e.State == TRANSPORTSTATE.STOPPED && _playbackStarted)
{
_playbackStarted = false;
await _sessionManager.OnPlaybackStopped(new PlaybackStopInfo
{
ItemId = _currentItem.Id.ToString("N"),
SessionId = _session.Id,
PositionTicks = _device.Position.Ticks
}).ConfigureAwait(false);
await SetNext().ConfigureAwait(false);
}
}
async void Device_CurrentIdChanged(object sender, CurrentIdEventArgs e)
{
if (!string.IsNullOrWhiteSpace(e.Id))
{
Guid guid;
if (Guid.TryParse(e.Id, out guid))
{
if (_currentItem != null && _currentItem.Id == guid)
{
return;
}
var item = _libraryManager.GetItemById(guid);
if (item != null)
{
_logger.Debug("{0} - CurrentId {1}", _session.DeviceName, item.Id);
_currentItem = item;
_playbackStarted = false;
await ReportProgress().ConfigureAwait(false);
}
}
}
}
/// <summary> /// <summary>
/// Handles the Elapsed event of the updateTimer control. /// Handles the Elapsed event of the updateTimer control.
/// </summary> /// </summary>
/// <param name="state">The state.</param> /// <param name="state">The state.</param>
private async void updateTimer_Elapsed(object state) private async void updateTimer_Elapsed(object state)
{ {
if (_disposed) if (!IsSessionActive)
return;
if (IsSessionActive)
{
await ReportProgress().ConfigureAwait(false);
}
else
{ {
_updateTimer.Change(Timeout.Infinite, Timeout.Infinite); _updateTimer.Change(Timeout.Infinite, Timeout.Infinite);
@ -163,70 +190,6 @@ namespace MediaBrowser.Dlna.PlayTo
} }
} }
/// <summary>
/// Reports the playback progress.
/// </summary>
/// <returns></returns>
private async Task ReportProgress()
{
if (_currentItem == null || _device.IsStopped)
return;
var playlistItem = Playlist.FirstOrDefault(p => p.PlayState == 1);
if (playlistItem != null)
{
var streamInfo = playlistItem.StreamInfo;
if (!_playbackStarted)
{
await _sessionManager.OnPlaybackStart(new PlaybackStartInfo
{
ItemId = _currentItem.Id.ToString("N"),
SessionId = _session.Id,
CanSeek = streamInfo.RunTimeTicks.HasValue,
QueueableMediaTypes = new List<string> { _currentItem.MediaType },
MediaSourceId = streamInfo.MediaSourceId,
AudioStreamIndex = streamInfo.AudioStreamIndex,
SubtitleStreamIndex = streamInfo.SubtitleStreamIndex,
IsMuted = _device.IsMuted,
IsPaused = _device.IsPaused,
VolumeLevel = _device.Volume,
PlayMethod = streamInfo.IsDirectStream ? PlayMethod.DirectStream : PlayMethod.Transcode
}).ConfigureAwait(false);
_playbackStarted = true;
}
if ((_device.IsPlaying || _device.IsPaused))
{
var ticks = _device.Position.Ticks;
if (!streamInfo.IsDirectStream)
{
ticks += streamInfo.StartPositionTicks;
}
await _sessionManager.OnPlaybackProgress(new PlaybackProgressInfo
{
ItemId = _currentItem.Id.ToString("N"),
SessionId = _session.Id,
PositionTicks = ticks,
IsMuted = _device.IsMuted,
IsPaused = _device.IsPaused,
MediaSourceId = streamInfo.MediaSourceId,
AudioStreamIndex = streamInfo.AudioStreamIndex,
SubtitleStreamIndex = streamInfo.SubtitleStreamIndex,
VolumeLevel = _device.Volume,
CanSeek = streamInfo.RunTimeTicks.HasValue,
PlayMethod = streamInfo.IsDirectStream ? PlayMethod.DirectStream : PlayMethod.Transcode
}).ConfigureAwait(false);
}
}
}
#endregion #endregion
#region SendCommands #region SendCommands
@ -263,11 +226,11 @@ namespace MediaBrowser.Dlna.PlayTo
if (command.PlayCommand == PlayCommand.PlayLast) if (command.PlayCommand == PlayCommand.PlayLast)
{ {
AddItemsToPlaylist(playlist); Playlist.AddRange(playlist);
} }
if (command.PlayCommand == PlayCommand.PlayNext) if (command.PlayCommand == PlayCommand.PlayNext)
{ {
AddItemsToPlaylist(playlist); Playlist.AddRange(playlist);
} }
_logger.Debug("{0} - Playing {1} items", _session.DeviceName, playlist.Count); _logger.Debug("{0} - Playing {1} items", _session.DeviceName, playlist.Count);
@ -314,11 +277,9 @@ namespace MediaBrowser.Dlna.PlayTo
case PlaystateCommand.NextTrack: case PlaystateCommand.NextTrack:
_currentItem = null;
return SetNext(); return SetNext();
case PlaystateCommand.PreviousTrack: case PlaystateCommand.PreviousTrack:
_currentItem = null;
return SetPrevious(); return SetPrevious();
} }
@ -374,18 +335,13 @@ namespace MediaBrowser.Dlna.PlayTo
#region Playlist #region Playlist
private List<PlaylistItem> _playlist = new List<PlaylistItem>(); private readonly List<PlaylistItem> _playlist = new List<PlaylistItem>();
private List<PlaylistItem> Playlist private List<PlaylistItem> Playlist
{ {
get get
{ {
return _playlist; return _playlist;
} }
set
{
_playlist = value;
}
} }
private void AddItemFromId(Guid id, List<BaseItem> list) private void AddItemFromId(Guid id, List<BaseItem> list)
@ -564,15 +520,6 @@ namespace MediaBrowser.Dlna.PlayTo
return true; return true;
} }
/// <summary>
/// Adds the items to playlist.
/// </summary>
/// <param name="items">The items.</param>
private void AddItemsToPlaylist(IEnumerable<PlaylistItem> items)
{
Playlist.AddRange(items);
}
private async Task<bool> SetNext() private async Task<bool> SetNext()
{ {
if (!Playlist.Any() || Playlist.All(i => i.PlayState != 0)) if (!Playlist.Any() || Playlist.All(i => i.PlayState != 0))
@ -608,7 +555,7 @@ namespace MediaBrowser.Dlna.PlayTo
return true; return true;
} }
public Task<bool> SetPrevious() public Task SetPrevious()
{ {
if (!Playlist.Any() || Playlist.All(i => i.PlayState != 2)) if (!Playlist.Any() || Playlist.All(i => i.PlayState != 2))
return Task.FromResult(false); return Task.FromResult(false);
@ -638,9 +585,13 @@ namespace MediaBrowser.Dlna.PlayTo
if (!_disposed) if (!_disposed)
{ {
_disposed = true; _disposed = true;
_device.PlaybackStart -= _device_PlaybackStart;
_device.PlaybackProgress -= _device_PlaybackProgress;
_device.PlaybackStopped -= _device_PlaybackStopped;
_updateTimer.Dispose(); _updateTimer.Dispose();
_device.Dispose(); _device.Dispose();
_logger.Log(LogSeverity.Debug, "Controller disposed");
} }
} }
@ -659,9 +610,9 @@ namespace MediaBrowser.Dlna.PlayTo
case GeneralCommandType.VolumeUp: case GeneralCommandType.VolumeUp:
return _device.VolumeUp(); return _device.VolumeUp();
case GeneralCommandType.Mute: case GeneralCommandType.Mute:
return _device.VolumeDown(true); return _device.Mute();
case GeneralCommandType.Unmute: case GeneralCommandType.Unmute:
return _device.VolumeUp(true); return _device.Unmute();
case GeneralCommandType.ToggleMute: case GeneralCommandType.ToggleMute:
return _device.ToggleMute(); return _device.ToggleMute();
case GeneralCommandType.SetVolume: case GeneralCommandType.SetVolume:

View File

@ -23,7 +23,7 @@ namespace MediaBrowser.Dlna.PlayTo
{ {
class PlayToManager : IDisposable class PlayToManager : IDisposable
{ {
private bool _disposed = false; private bool _disposed;
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly ISessionManager _sessionManager; private readonly ISessionManager _sessionManager;
private readonly IHttpClient _httpClient; private readonly IHttpClient _httpClient;
@ -65,36 +65,28 @@ namespace MediaBrowser.Dlna.PlayTo
{ {
_logger.Debug("Found interface: {0}. Type: {1}. Status: {2}", network.Name, network.NetworkInterfaceType, network.OperationalStatus); _logger.Debug("Found interface: {0}. Type: {1}. Status: {2}", network.Name, network.NetworkInterfaceType, network.OperationalStatus);
if (!network.SupportsMulticast || OperationalStatus.Up != network.OperationalStatus || !network.GetIPProperties().MulticastAddresses.Any()) if (!network.SupportsMulticast || !network.GetIPProperties().MulticastAddresses.Any())
continue; continue;
var ipV4 = network.GetIPProperties().GetIPv4Properties(); var ipV4 = network.GetIPProperties().GetIPv4Properties();
if (null == ipV4) if (null == ipV4)
continue; continue;
IPAddress localIp = null; var localIp = network.GetIPProperties().UnicastAddresses
.Where(i => i.Address.AddressFamily == AddressFamily.InterNetwork)
.Select(i => i.Address)
.FirstOrDefault();
foreach (var ipInfo in network.GetIPProperties().UnicastAddresses) if (localIp != null)
{ {
if (ipInfo.Address.AddressFamily == AddressFamily.InterNetwork) try
{ {
localIp = ipInfo.Address; CreateListener(localIp);
break; }
catch (Exception e)
{
_logger.ErrorException("Failed to Initilize Socket", e);
} }
}
if (localIp == null)
{
continue;
}
try
{
CreateListener(localIp);
}
catch (Exception e)
{
_logger.ErrorException("Failed to Initilize Socket", e);
} }
} }
} }

View File

@ -3,7 +3,7 @@ using System.Xml.Linq;
namespace MediaBrowser.Dlna.PlayTo namespace MediaBrowser.Dlna.PlayTo
{ {
public class uContainer : uBaseObject public class UpnpContainer : uBaseObject
{ {
new public static uBaseObject Create(XElement container) new public static uBaseObject Create(XElement container)
{ {
@ -14,10 +14,11 @@ namespace MediaBrowser.Dlna.PlayTo
return new uBaseObject return new uBaseObject
{ {
Id = (string)container.Attribute(uPnpNamespaces.Id), Id = container.GetAttributeValue(uPnpNamespaces.Id),
ParentId = (string)container.Attribute(uPnpNamespaces.ParentId), ParentId = container.GetAttributeValue(uPnpNamespaces.ParentId),
Title = (string)container.Element(uPnpNamespaces.title), Title = container.GetValue(uPnpNamespaces.title),
IconUrl = container.GetValue(uPnpNamespaces.Artwork) IconUrl = container.GetValue(uPnpNamespaces.Artwork),
UpnpClass = container.GetValue(uPnpNamespaces.uClass)
}; };
} }
} }

View File

@ -1,4 +1,5 @@
 using System;
namespace MediaBrowser.Dlna.PlayTo namespace MediaBrowser.Dlna.PlayTo
{ {
public class uBaseObject public class uBaseObject
@ -18,5 +19,40 @@ namespace MediaBrowser.Dlna.PlayTo
public string Url { get; set; } public string Url { get; set; }
public string[] ProtocolInfo { get; set; } public string[] ProtocolInfo { get; set; }
public string UpnpClass { get; set; }
public bool Equals(uBaseObject obj)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
return string.Equals(Id, obj.Id);
}
public string MediaType
{
get
{
var classType = UpnpClass ?? string.Empty;
if (classType.IndexOf(Model.Entities.MediaType.Audio, StringComparison.Ordinal) != -1)
{
return Model.Entities.MediaType.Audio;
}
if (classType.IndexOf(Model.Entities.MediaType.Video, StringComparison.Ordinal) != -1)
{
return Model.Entities.MediaType.Video;
}
if (classType.IndexOf("image", StringComparison.Ordinal) != -1)
{
return Model.Entities.MediaType.Photo;
}
return null;
}
}
} }
} }

View File

@ -29,10 +29,10 @@ namespace MediaBrowser.Dlna.PlayTo
var uPnpResponse = XElement.Parse((String)item); var uPnpResponse = XElement.Parse((String)item);
var uObjects = from container in uPnpResponse.Elements(uPnpNamespaces.containers) var uObjects = from container in uPnpResponse.Elements(uPnpNamespaces.containers)
select new uParserObject { Type = (string)container.Element(uPnpNamespaces.uClass), Element = container }; select new uParserObject { Element = container };
var uObjects2 = from container in uPnpResponse.Elements(uPnpNamespaces.items) var uObjects2 = from container in uPnpResponse.Elements(uPnpNamespaces.items)
select new uParserObject { Type = (string)container.Element(uPnpNamespaces.uClass), Element = container }; select new uParserObject { Element = container };
list.AddRange(uObjects.Concat(uObjects2).Select(CreateObjectFromXML).Where(uObject => uObject != null)); list.AddRange(uObjects.Concat(uObjects2).Select(CreateObjectFromXML).Where(uObject => uObject != null));
@ -41,14 +41,12 @@ namespace MediaBrowser.Dlna.PlayTo
public static uBaseObject CreateObjectFromXML(uParserObject uItem) public static uBaseObject CreateObjectFromXML(uParserObject uItem)
{ {
return uContainer.Create(uItem.Element); return UpnpContainer.Create(uItem.Element);
} }
} }
public class uParserObject public class uParserObject
{ {
public string Type { get; set; }
public XElement Element { get; set; } public XElement Element { get; set; }
} }
} }

View File

@ -12,6 +12,8 @@ namespace MediaBrowser.Dlna.Profiles
ProtocolInfo = "DLNA"; ProtocolInfo = "DLNA";
XDlnaDoc = "DMS-1.50";
FriendlyName = "Media Browser"; FriendlyName = "Media Browser";
Manufacturer = "Media Browser"; Manufacturer = "Media Browser";
ModelDescription = "Media Browser"; ModelDescription = "Media Browser";

View File

@ -17,6 +17,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds> <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>

View File

@ -22,6 +22,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds> <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>

View File

@ -23,6 +23,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>10</TimelineOffsetSeconds> <TimelineOffsetSeconds>10</TimelineOffsetSeconds>
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>

View File

@ -21,6 +21,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds> <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>

View File

@ -24,6 +24,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>10</TimelineOffsetSeconds> <TimelineOffsetSeconds>10</TimelineOffsetSeconds>
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>

View File

@ -21,6 +21,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds> <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -24,6 +24,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<SonyAggregationFlags>10</SonyAggregationFlags> <SonyAggregationFlags>10</SonyAggregationFlags>
<ProtocolInfo>http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000</ProtocolInfo> <ProtocolInfo>http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds> <TimelineOffsetSeconds>0</TimelineOffsetSeconds>

View File

@ -24,6 +24,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<SonyAggregationFlags>10</SonyAggregationFlags> <SonyAggregationFlags>10</SonyAggregationFlags>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds> <TimelineOffsetSeconds>0</TimelineOffsetSeconds>

View File

@ -24,6 +24,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<SonyAggregationFlags>10</SonyAggregationFlags> <SonyAggregationFlags>10</SonyAggregationFlags>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds> <TimelineOffsetSeconds>0</TimelineOffsetSeconds>

View File

@ -24,6 +24,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<SonyAggregationFlags>10</SonyAggregationFlags> <SonyAggregationFlags>10</SonyAggregationFlags>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds> <TimelineOffsetSeconds>0</TimelineOffsetSeconds>

View File

@ -24,6 +24,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>5</TimelineOffsetSeconds> <TimelineOffsetSeconds>5</TimelineOffsetSeconds>
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>

View File

@ -23,6 +23,7 @@
<MaxIconWidth xsi:nil="true" /> <MaxIconWidth xsi:nil="true" />
<MaxIconHeight xsi:nil="true" /> <MaxIconHeight xsi:nil="true" />
<MaxBitrate xsi:nil="true" /> <MaxBitrate xsi:nil="true" />
<XDlnaDoc>DMS-1.50</XDlnaDoc>
<ProtocolInfo>DLNA</ProtocolInfo> <ProtocolInfo>DLNA</ProtocolInfo>
<TimelineOffsetSeconds>0</TimelineOffsetSeconds> <TimelineOffsetSeconds>0</TimelineOffsetSeconds>
<RequiresPlainVideoItems>false</RequiresPlainVideoItems> <RequiresPlainVideoItems>false</RequiresPlainVideoItems>

View File

@ -259,7 +259,7 @@ namespace MediaBrowser.Dlna.Server
didl.SetAttribute("xmlns:dc", NS_DC); didl.SetAttribute("xmlns:dc", NS_DC);
didl.SetAttribute("xmlns:dlna", NS_DLNA); didl.SetAttribute("xmlns:dlna", NS_DLNA);
didl.SetAttribute("xmlns:upnp", NS_UPNP); didl.SetAttribute("xmlns:upnp", NS_UPNP);
didl.SetAttribute("xmlns:sec", NS_SEC); //didl.SetAttribute("xmlns:sec", NS_SEC);
result.AppendChild(didl); result.AppendChild(didl);
var folder = (Folder)GetItemFromObjectId(id, user); var folder = (Folder)GetItemFromObjectId(id, user);
@ -341,7 +341,7 @@ namespace MediaBrowser.Dlna.Server
didl.SetAttribute("xmlns:dc", NS_DC); didl.SetAttribute("xmlns:dc", NS_DC);
didl.SetAttribute("xmlns:dlna", NS_DLNA); didl.SetAttribute("xmlns:dlna", NS_DLNA);
didl.SetAttribute("xmlns:upnp", NS_UPNP); didl.SetAttribute("xmlns:upnp", NS_UPNP);
didl.SetAttribute("xmlns:sec", NS_SEC); //didl.SetAttribute("xmlns:sec", NS_SEC);
result.AppendChild(didl); result.AppendChild(didl);
var folder = (Folder)GetItemFromObjectId(sparams["ContainerID"], user); var folder = (Folder)GetItemFromObjectId(sparams["ContainerID"], user);
@ -498,7 +498,6 @@ namespace MediaBrowser.Dlna.Server
AddCover(f, container); AddCover(f, container);
container.AppendChild(CreateObjectClass(result, f));
result.DocumentElement.AppendChild(container); result.DocumentElement.AppendChild(container);
} }
@ -527,9 +526,7 @@ namespace MediaBrowser.Dlna.Server
element.SetAttribute("parentID", item.Parent.Id.ToString("N")); element.SetAttribute("parentID", item.Parent.Id.ToString("N"));
} }
element.AppendChild(CreateObjectClass(result, item)); //AddBookmarkInfo(item, user, element);
AddBookmarkInfo(item, user, element);
AddGeneralProperties(item, element, filter); AddGeneralProperties(item, element, filter);
@ -812,6 +809,13 @@ namespace MediaBrowser.Dlna.Server
/// <param name="filter">The filter.</param> /// <param name="filter">The filter.</param>
private void AddCommonFields(BaseItem item, XmlElement element, Filter filter) private void AddCommonFields(BaseItem item, XmlElement element, Filter filter)
{ {
if (filter.Contains("dc:title"))
{
AddValue(element, "dc", "title", item.Name, NS_DC);
}
element.AppendChild(CreateObjectClass(element.OwnerDocument, item));
if (filter.Contains("dc:date")) if (filter.Contains("dc:date"))
{ {
if (item.PremiereDate.HasValue) if (item.PremiereDate.HasValue)
@ -830,11 +834,6 @@ namespace MediaBrowser.Dlna.Server
AddValue(element, "upnp", "publisher", studio, NS_UPNP); AddValue(element, "upnp", "publisher", studio, NS_UPNP);
} }
if (filter.Contains("dc:title"))
{
AddValue(element, "dc", "title", item.Name, NS_DC);
}
if (filter.Contains("dc:description")) if (filter.Contains("dc:description"))
{ {
if (!string.IsNullOrWhiteSpace(item.Overview)) if (!string.IsNullOrWhiteSpace(item.Overview))

View File

@ -61,7 +61,7 @@ namespace MediaBrowser.Model.Dlna
/// </summary> /// </summary>
public string XDlnaCap { get; set; } public string XDlnaCap { get; set; }
/// <summary> /// <summary>
/// Controls the content of the aggregationFlags element in the urn:schemas-sonycom:av. /// Controls the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.
/// </summary> /// </summary>
public string SonyAggregationFlags { get; set; } public string SonyAggregationFlags { get; set; }

View File

@ -173,6 +173,8 @@ namespace MediaBrowser.Model.Entities
/// <value>The format.</value> /// <value>The format.</value>
public string Format { get; set; } public string Format { get; set; }
public int? TotalBitrate { get; set; }
public MediaInfo() public MediaInfo()
{ {
MediaStreams = new List<MediaStream>(); MediaStreams = new List<MediaStream>();

View File

@ -1,5 +1,5 @@
using System.Collections.Generic; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Entities; using System.Collections.Generic;
namespace MediaBrowser.Model.Session namespace MediaBrowser.Model.Session
{ {

View File

@ -93,8 +93,11 @@ namespace MediaBrowser.Providers.MediaInfo
/// <returns>Task.</returns> /// <returns>Task.</returns>
protected Task Fetch(Audio audio, CancellationToken cancellationToken, InternalMediaInfoResult data) protected Task Fetch(Audio audio, CancellationToken cancellationToken, InternalMediaInfoResult data)
{ {
var mediaStreams = MediaEncoderHelpers.GetMediaInfo(data).MediaStreams; var mediaInfo = MediaEncoderHelpers.GetMediaInfo(data);
var mediaStreams = mediaInfo.MediaStreams;
audio.FormatName = mediaInfo.Format;
audio.TotalBitrate = mediaInfo.TotalBitrate;
audio.HasEmbeddedImage = mediaStreams.Any(i => i.Type == MediaStreamType.Video); audio.HasEmbeddedImage = mediaStreams.Any(i => i.Type == MediaStreamType.Video);
if (data.streams != null) if (data.streams != null)
@ -123,8 +126,6 @@ namespace MediaBrowser.Providers.MediaInfo
if (data.format != null) if (data.format != null)
{ {
audio.FormatName = data.format.format_name;
var extension = (Path.GetExtension(audio.Path) ?? string.Empty).TrimStart('.'); var extension = (Path.GetExtension(audio.Path) ?? string.Empty).TrimStart('.');
audio.Container = extension; audio.Container = extension;

View File

@ -151,6 +151,13 @@ namespace MediaBrowser.Providers.MediaInfo
protected async Task Fetch(Video video, CancellationToken cancellationToken, InternalMediaInfoResult data, IIsoMount isoMount, BlurayDiscInfo blurayInfo, IDirectoryService directoryService) protected async Task Fetch(Video video, CancellationToken cancellationToken, InternalMediaInfoResult data, IIsoMount isoMount, BlurayDiscInfo blurayInfo, IDirectoryService directoryService)
{ {
var mediaInfo = MediaEncoderHelpers.GetMediaInfo(data);
var mediaStreams = mediaInfo.MediaStreams;
video.TotalBitrate = mediaInfo.TotalBitrate;
video.FormatName = (mediaInfo.Format ?? string.Empty)
.Replace("matroska", "mkv", StringComparison.OrdinalIgnoreCase);
if (data.format != null) if (data.format != null)
{ {
// For dvd's this may not always be accurate, so don't set the runtime if the item already has one // For dvd's this may not always be accurate, so don't set the runtime if the item already has one
@ -161,9 +168,6 @@ namespace MediaBrowser.Providers.MediaInfo
video.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(data.format.duration, _usCulture)).Ticks; video.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(data.format.duration, _usCulture)).Ticks;
} }
video.FormatName = (data.format.format_name ?? string.Empty)
.Replace("matroska", "mkv", StringComparison.OrdinalIgnoreCase);
if (video.VideoType == VideoType.VideoFile) if (video.VideoType == VideoType.VideoFile)
{ {
var extension = (Path.GetExtension(video.Path) ?? string.Empty).TrimStart('.'); var extension = (Path.GetExtension(video.Path) ?? string.Empty).TrimStart('.');
@ -185,8 +189,6 @@ namespace MediaBrowser.Providers.MediaInfo
} }
} }
var mediaStreams = MediaEncoderHelpers.GetMediaInfo(data).MediaStreams;
var mediaChapters = (data.Chapters ?? new MediaChapter[] { }).ToList(); var mediaChapters = (data.Chapters ?? new MediaChapter[] { }).ToList();
var chapters = mediaChapters.Select(GetChapterInfo).ToList(); var chapters = mediaChapters.Select(GetChapterInfo).ToList();

View File

@ -227,5 +227,29 @@ namespace MediaBrowser.Server.Implementations.Collections
await collection.RefreshMetadata(CancellationToken.None).ConfigureAwait(false); await collection.RefreshMetadata(CancellationToken.None).ConfigureAwait(false);
} }
public IEnumerable<BaseItem> CollapseItemsWithinBoxSets(IEnumerable<BaseItem> items, User user)
{
var itemsToCollapse = new List<ISupportsBoxSetGrouping>();
var boxsets = new List<BaseItem>();
var list = items.ToList();
foreach (var item in list.OfType<ISupportsBoxSetGrouping>())
{
var currentBoxSets = item.BoxSetIdList
.Select(i => _libraryManager.GetItemById(i))
.Where(i => i != null && i.IsVisible(user))
.ToList();
if (currentBoxSets.Count > 0)
{
itemsToCollapse.Add(item);
boxsets.AddRange(currentBoxSets);
}
}
return list.Except(itemsToCollapse.Cast<BaseItem>()).Concat(boxsets).Distinct();
}
} }
} }

View File

@ -1252,7 +1252,10 @@ namespace MediaBrowser.Server.Implementations.Dto
} }
} }
var bitrate = info.MediaStreams.Where(m => m.Type == MediaStreamType.Audio || m.Type == MediaStreamType.Video).Select(m => m.BitRate ?? 0).Sum(); var bitrate = i.TotalBitrate ??
info.MediaStreams.Where(m => m.Type != MediaStreamType.Subtitle && !string.Equals(m.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase))
.Select(m => m.BitRate ?? 0)
.Sum();
if (bitrate > 0) if (bitrate > 0)
{ {
@ -1286,7 +1289,10 @@ namespace MediaBrowser.Server.Implementations.Dto
} }
} }
var bitrate = info.MediaStreams.Where(m => m.Type == MediaStreamType.Audio).Select(m => m.BitRate ?? 0).Sum(); var bitrate = i.TotalBitrate ??
info.MediaStreams.Where(m => m.Type == MediaStreamType.Audio)
.Select(m => m.BitRate ?? 0)
.Sum();
if (bitrate > 0) if (bitrate > 0)
{ {

View File

@ -1 +1,30 @@
{"SettingsSaved":"\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0627\u0639\u062f\u0627\u062f\u0627\u062a.","AddUser":"\u0627\u0636\u0627\u0641\u0629 \u0645\u0633\u062a\u062e\u062f\u0645","Users":"\u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646","Delete":"\u062d\u0630\u0641","Administrator":"\u0627\u0644\u0645\u0633\u0624\u0648\u0644","Password":"\u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631","DeleteImage":"\u062d\u0630\u0641 \u0635\u0648\u0631\u0629","DeleteImageConfirmation":"\u0647\u0644 \u0627\u0646\u062a \u0645\u062a\u0627\u0643\u062f \u0645\u0646 \u062d\u0630\u0641 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629\u061f","FileReadCancelled":"\u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u0644\u0641.","FileNotFound":"\u0627\u0644\u0645\u0644\u0641 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f.","FileReadError":"\u062d\u062f\u062b \u062e\u0637\u0623 \u0628\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u0644\u0641.","DeleteUser":"\u062d\u0630\u0641 \u0645\u0633\u062a\u062e\u062f\u0645","DeleteUserConfirmation":"\u0647\u0644 \u0627\u0646\u062a \u0645\u062a\u0627\u0643\u062f \u0645\u0646 \u0627\u0646\u0643 \u062a\u0631\u064a\u062f \u062d\u0630\u0641 {0} \u061f","PasswordResetHeader":"\u0627\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631","PasswordResetComplete":"\u0644\u0642\u062f \u062a\u0645 \u0627\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631.","PasswordResetConfirmation":"\u0647\u0644 \u0627\u0646\u062a \u0645\u062a\u0627\u0643\u062f \u0645\u0646 \u0627\u0646\u0643 \u062a\u0631\u064a\u062f \u0627\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631\u061f","PasswordSaved":"\u062a\u0645 \u062d\u0641\u0638 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631.","PasswordMatchError":"\u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631 \u0648\u062a\u0627\u0643\u064a\u062f\u0647\u0627 \u064a\u062c\u0628 \u0627\u0646 \u064a\u062a\u0637\u0627\u0628\u0642\u0627\u0646.","OptionOff":"\u0627\u064a\u0642\u0627\u0641","OptionOn":"\u062a\u0634\u063a\u064a\u0644","OptionRelease":"\u0627\u0644\u0627\u0635\u062f\u0627\u0631 \u0627\u0644\u0631\u0633\u0645\u0649","OptionBeta":"\u0628\u064a\u062a\u0627","OptionDev":"\u062a\u0637\u0648\u0631\u0649 (\u063a\u064a\u0631 \u0645\u0633\u062a\u0642\u0631)","UninstallPluginHeader":"\u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0645\u0644\u062d\u0642","UninstallPluginConfirmation":"\u0647\u0644 \u0627\u0646\u062a \u0645\u062a\u0627\u0643\u062f \u0627\u0646\u0643 \u062a\u0631\u064a\u062f \u0627\u0644\u063a\u0627\u0621 {0} \u061f","NoPluginConfigurationMessage":"\u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u062d\u0642 \u0644\u064a\u0633 \u0644\u0647 \u0636\u0628\u0637.","NoPluginsInstalledMessage":"\u0644\u0627 \u064a\u0648\u062c\u062f \u0644\u062f\u064a\u0643 \u0627\u0649 \u0645\u0644\u0627\u062d\u0642 \u0645\u062b\u0628\u062a\u0629.","BrowsePluginCatalogMessage":"\u062a\u0635\u0641\u062d \u0642\u0627\u0626\u0645\u062a\u0646\u0627 \u0644\u0644\u0645\u0644\u062d\u0642 \u0644\u062a\u0631\u0649 \u0627\u0644\u0645\u062a\u0648\u0641\u0631 \u0645\u0646 \u0627\u0644\u0645\u0644\u0627\u062d\u0642."} {
"SettingsSaved": "\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0627\u0639\u062f\u0627\u062f\u0627\u062a.",
"AddUser": "\u0627\u0636\u0627\u0641\u0629 \u0645\u0633\u062a\u062e\u062f\u0645",
"Users": "\u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646",
"Delete": "\u062d\u0630\u0641",
"Administrator": "\u0627\u0644\u0645\u0633\u0624\u0648\u0644",
"Password": "\u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631",
"DeleteImage": "\u062d\u0630\u0641 \u0635\u0648\u0631\u0629",
"DeleteImageConfirmation": "\u0647\u0644 \u0627\u0646\u062a \u0645\u062a\u0627\u0643\u062f \u0645\u0646 \u062d\u0630\u0641 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629\u061f",
"FileReadCancelled": "\u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u0644\u0641.",
"FileNotFound": "\u0627\u0644\u0645\u0644\u0641 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f.",
"FileReadError": "\u062d\u062f\u062b \u062e\u0637\u0623 \u0628\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u0644\u0641.",
"DeleteUser": "\u062d\u0630\u0641 \u0645\u0633\u062a\u062e\u062f\u0645",
"DeleteUserConfirmation": "\u0647\u0644 \u0627\u0646\u062a \u0645\u062a\u0627\u0643\u062f \u0645\u0646 \u0627\u0646\u0643 \u062a\u0631\u064a\u062f \u062d\u0630\u0641 {0} \u061f",
"PasswordResetHeader": "\u0627\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631",
"PasswordResetComplete": "\u0644\u0642\u062f \u062a\u0645 \u0627\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631.",
"PasswordResetConfirmation": "\u0647\u0644 \u0627\u0646\u062a \u0645\u062a\u0627\u0643\u062f \u0645\u0646 \u0627\u0646\u0643 \u062a\u0631\u064a\u062f \u0627\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631\u061f",
"PasswordSaved": "\u062a\u0645 \u062d\u0641\u0638 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631.",
"PasswordMatchError": "\u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631 \u0648\u062a\u0627\u0643\u064a\u062f\u0647\u0627 \u064a\u062c\u0628 \u0627\u0646 \u064a\u062a\u0637\u0627\u0628\u0642\u0627\u0646.",
"OptionOff": "\u0627\u064a\u0642\u0627\u0641",
"OptionOn": "\u062a\u0634\u063a\u064a\u0644",
"OptionRelease": "\u0627\u0644\u0627\u0635\u062f\u0627\u0631 \u0627\u0644\u0631\u0633\u0645\u0649",
"OptionBeta": "\u0628\u064a\u062a\u0627",
"OptionDev": "\u062a\u0637\u0648\u0631\u0649 (\u063a\u064a\u0631 \u0645\u0633\u062a\u0642\u0631)",
"UninstallPluginHeader": "\u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0645\u0644\u062d\u0642",
"UninstallPluginConfirmation": "\u0647\u0644 \u0627\u0646\u062a \u0645\u062a\u0627\u0643\u062f \u0627\u0646\u0643 \u062a\u0631\u064a\u062f \u0627\u0644\u063a\u0627\u0621 {0} \u061f",
"NoPluginConfigurationMessage": "\u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u062d\u0642 \u0644\u064a\u0633 \u0644\u0647 \u0636\u0628\u0637.",
"NoPluginsInstalledMessage": "\u0644\u0627 \u064a\u0648\u062c\u062f \u0644\u062f\u064a\u0643 \u0627\u0649 \u0645\u0644\u0627\u062d\u0642 \u0645\u062b\u0628\u062a\u0629.",
"BrowsePluginCatalogMessage": "\u062a\u0635\u0641\u062d \u0642\u0627\u0626\u0645\u062a\u0646\u0627 \u0644\u0644\u0645\u0644\u062d\u0642 \u0644\u062a\u0631\u0649 \u0627\u0644\u0645\u062a\u0648\u0641\u0631 \u0645\u0646 \u0627\u0644\u0645\u0644\u0627\u062d\u0642."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Configuraci\u00f3 guardada.","AddUser":"Afegir Usuari","Users":"Usuaris","Delete":"Esborrar","Administrator":"Administrador","Password":"Contrasenya","DeleteImage":"Esborrar Imatge","DeleteImageConfirmation":"Esteu segur que voleu suprimir aquesta imatge?","FileReadCancelled":"La lectura de l'arxiu ha estat cancel\u00b7lada.","FileNotFound":"Arxiu no trobat.","FileReadError":"S'ha produ\u00eft un error en llegir el fitxer.","DeleteUser":"Esborrar Usuari","DeleteUserConfirmation":"Esteu segur que voleu suprimir {0}?","PasswordResetHeader":"Restablir contrasenya","PasswordResetComplete":"La contrasenya s'ha restablert.","PasswordResetConfirmation":"Esteu segur que voleu restablir la contrasenya?","PasswordSaved":"S'ha guardat la contrasenya.","PasswordMatchError":"Confirmaci\u00f3 de la contrasenya i la contrasenya han de coincidir.","OptionOff":"Apagat","OptionOn":"Enc\u00e8s","OptionRelease":"Versi\u00f3 Oficial","OptionBeta":"Beta","OptionDev":"Dev (Inestable)","UninstallPluginHeader":"Desinstal\u00b7lar Plugin.","UninstallPluginConfirmation":"Esteu segur que voleu desinstal\u00b7lar {0}?","NoPluginConfigurationMessage":"Aquest plugin no necessita configuraci\u00f3.","NoPluginsInstalledMessage":"No t\u00e9 cap plugin instal\u00b7lat.","BrowsePluginCatalogMessage":"Consulti el nostre cat\u00e0leg per veure els plugins disponibles."} {
"SettingsSaved": "Configuraci\u00f3 guardada.",
"AddUser": "Afegir Usuari",
"Users": "Usuaris",
"Delete": "Esborrar",
"Administrator": "Administrador",
"Password": "Contrasenya",
"DeleteImage": "Esborrar Imatge",
"DeleteImageConfirmation": "Esteu segur que voleu suprimir aquesta imatge?",
"FileReadCancelled": "La lectura de l'arxiu ha estat cancel\u00b7lada.",
"FileNotFound": "Arxiu no trobat.",
"FileReadError": "S'ha produ\u00eft un error en llegir el fitxer.",
"DeleteUser": "Esborrar Usuari",
"DeleteUserConfirmation": "Esteu segur que voleu suprimir {0}?",
"PasswordResetHeader": "Restablir contrasenya",
"PasswordResetComplete": "La contrasenya s'ha restablert.",
"PasswordResetConfirmation": "Esteu segur que voleu restablir la contrasenya?",
"PasswordSaved": "S'ha guardat la contrasenya.",
"PasswordMatchError": "Confirmaci\u00f3 de la contrasenya i la contrasenya han de coincidir.",
"OptionOff": "Apagat",
"OptionOn": "Enc\u00e8s",
"OptionRelease": "Versi\u00f3 Oficial",
"OptionBeta": "Beta",
"OptionDev": "Dev (Inestable)",
"UninstallPluginHeader": "Desinstal\u00b7lar Plugin.",
"UninstallPluginConfirmation": "Esteu segur que voleu desinstal\u00b7lar {0}?",
"NoPluginConfigurationMessage": "Aquest plugin no necessita configuraci\u00f3.",
"NoPluginsInstalledMessage": "No t\u00e9 cap plugin instal\u00b7lat.",
"BrowsePluginCatalogMessage": "Consulti el nostre cat\u00e0leg per veure els plugins disponibles."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Nastaven\u00ed ulo\u017eeno.","AddUser":"P\u0159idat u\u017eivatele","Users":"U\u017eivatel\u00e9","Delete":"Odstranit","Administrator":"Administr\u00e1tor","Password":"Heslo","DeleteImage":"Odstranit obr\u00e1zek","DeleteImageConfirmation":"Jste si jisti, \u017ee chcete odstranit tento obr\u00e1zek?","FileReadCancelled":"\u010cten\u00ed souboru bylo zru\u0161eno.","FileNotFound":"Soubor nebyl nalezen.","FileReadError":"Nastala chyba p\u0159i na\u010d\u00edt\u00e1n\u00ed souboru.","DeleteUser":"Odstranit u\u017eivatele","DeleteUserConfirmation":"Jste si jisti, \u017ee chcete odstranit {0}?","PasswordResetHeader":"Obnovit heslo","PasswordResetComplete":"Heslo bylo obnoveno.","PasswordResetConfirmation":"Jste si jisti, \u017ee chcete obnovit heslo?","PasswordSaved":"Heslo ulo\u017eeno.","PasswordMatchError":"Heslo a potvrzen\u00ed hesla mus\u00ed souhlasit.","OptionOff":"Vypnout","OptionOn":"Zapnout","OptionRelease":"Ofici\u00e1ln\u00ed vyd\u00e1n\u00ed","OptionBeta":"Betaverze","OptionDev":"Dev (Nestabiln\u00ed\/V\u00fdvoj\u00e1\u0159sk\u00e1)","UninstallPluginHeader":"Odinstalovat plugin","UninstallPluginConfirmation":"Jste si jisti, \u017ee chcete odinstalovat {0}?","NoPluginConfigurationMessage":"Tento plugin nem\u00e1 nastaven\u00ed.","NoPluginsInstalledMessage":"Nem\u00e1te nainstalov\u00e1n \u017e\u00e1dn\u00fd plugin.","BrowsePluginCatalogMessage":"Prohl\u00e9dn\u011bte si n\u00e1\u0161 katalog, kde najdete dostupn\u00e9 pluginy."} {
"SettingsSaved": "Nastaven\u00ed ulo\u017eeno.",
"AddUser": "P\u0159idat u\u017eivatele",
"Users": "U\u017eivatel\u00e9",
"Delete": "Odstranit",
"Administrator": "Administr\u00e1tor",
"Password": "Heslo",
"DeleteImage": "Odstranit obr\u00e1zek",
"DeleteImageConfirmation": "Jste si jisti, \u017ee chcete odstranit tento obr\u00e1zek?",
"FileReadCancelled": "\u010cten\u00ed souboru bylo zru\u0161eno.",
"FileNotFound": "Soubor nebyl nalezen.",
"FileReadError": "Nastala chyba p\u0159i na\u010d\u00edt\u00e1n\u00ed souboru.",
"DeleteUser": "Odstranit u\u017eivatele",
"DeleteUserConfirmation": "Jste si jisti, \u017ee chcete odstranit {0}?",
"PasswordResetHeader": "Obnovit heslo",
"PasswordResetComplete": "Heslo bylo obnoveno.",
"PasswordResetConfirmation": "Jste si jisti, \u017ee chcete obnovit heslo?",
"PasswordSaved": "Heslo ulo\u017eeno.",
"PasswordMatchError": "Heslo a potvrzen\u00ed hesla mus\u00ed souhlasit.",
"OptionOff": "Vypnout",
"OptionOn": "Zapnout",
"OptionRelease": "Ofici\u00e1ln\u00ed vyd\u00e1n\u00ed",
"OptionBeta": "Betaverze",
"OptionDev": "Dev (Nestabiln\u00ed\/V\u00fdvoj\u00e1\u0159sk\u00e1)",
"UninstallPluginHeader": "Odinstalovat plugin",
"UninstallPluginConfirmation": "Jste si jisti, \u017ee chcete odinstalovat {0}?",
"NoPluginConfigurationMessage": "Tento plugin nem\u00e1 nastaven\u00ed.",
"NoPluginsInstalledMessage": "Nem\u00e1te nainstalov\u00e1n \u017e\u00e1dn\u00fd plugin.",
"BrowsePluginCatalogMessage": "Prohl\u00e9dn\u011bte si n\u00e1\u0161 katalog, kde najdete dostupn\u00e9 pluginy."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Einstellungen gespeichert","AddUser":"Benutzer hinzuf\u00fcgen","Users":"Benutzer","Delete":"L\u00f6schen","Administrator":"Administrator","Password":"Passwort","DeleteImage":"Bild l\u00f6schen","DeleteImageConfirmation":"M\u00f6chten Sie das Bild wirklich l\u00f6schen?","FileReadCancelled":"Das Einlesen der Datei wurde abgebrochen.","FileNotFound":"Datei nicht gefunden","FileReadError":"Beim Lesen der Datei ist ein Fehler aufgetreten.","DeleteUser":"Benutzer l\u00f6schen","DeleteUserConfirmation":"M\u00f6chten Sie {0} wirklich l\u00f6schen?","PasswordResetHeader":"Passwort zur\u00fccksetzen","PasswordResetComplete":"Das Passwort wurde zur\u00fcckgesetzt.","PasswordResetConfirmation":"M\u00f6chten Sie das Passwort wirklich zur\u00fccksetzen?","PasswordSaved":"Passwort gespeichert","PasswordMatchError":"Passwort und Passwortbest\u00e4tigung stimmen nicht \u00fcberein.","OptionOff":"Aus","OptionOn":"Ein","OptionRelease":"Offizielles Release","OptionBeta":"Beta","OptionDev":"Entwickler (instabil)","UninstallPluginHeader":"Deinstalliere Plugin","UninstallPluginConfirmation":"M\u00f6chten Sie {0} wirklich deinstallieren?","NoPluginConfigurationMessage":"Bei diesem Plugin kann nichts eingestellt werden.","NoPluginsInstalledMessage":"Sie haben keine Plugins installiert.","BrowsePluginCatalogMessage":"Durchsuchen Sie unsere Bibliothek um alle verf\u00fcgbaren Plugins anzuzeigen."} {
"SettingsSaved": "Einstellungen gespeichert",
"AddUser": "Benutzer hinzuf\u00fcgen",
"Users": "Benutzer",
"Delete": "L\u00f6schen",
"Administrator": "Administrator",
"Password": "Passwort",
"DeleteImage": "Bild l\u00f6schen",
"DeleteImageConfirmation": "M\u00f6chten Sie das Bild wirklich l\u00f6schen?",
"FileReadCancelled": "Das Einlesen der Datei wurde abgebrochen.",
"FileNotFound": "Datei nicht gefunden",
"FileReadError": "Beim Lesen der Datei ist ein Fehler aufgetreten.",
"DeleteUser": "Benutzer l\u00f6schen",
"DeleteUserConfirmation": "M\u00f6chten Sie {0} wirklich l\u00f6schen?",
"PasswordResetHeader": "Passwort zur\u00fccksetzen",
"PasswordResetComplete": "Das Passwort wurde zur\u00fcckgesetzt.",
"PasswordResetConfirmation": "M\u00f6chten Sie das Passwort wirklich zur\u00fccksetzen?",
"PasswordSaved": "Passwort gespeichert",
"PasswordMatchError": "Passwort und Passwortbest\u00e4tigung stimmen nicht \u00fcberein.",
"OptionOff": "Aus",
"OptionOn": "Ein",
"OptionRelease": "Offizielles Release",
"OptionBeta": "Beta",
"OptionDev": "Entwickler (instabil)",
"UninstallPluginHeader": "Deinstalliere Plugin",
"UninstallPluginConfirmation": "M\u00f6chten Sie {0} wirklich deinstallieren?",
"NoPluginConfigurationMessage": "Bei diesem Plugin kann nichts eingestellt werden.",
"NoPluginsInstalledMessage": "Sie haben keine Plugins installiert.",
"BrowsePluginCatalogMessage": "Durchsuchen Sie unsere Bibliothek um alle verf\u00fcgbaren Plugins anzuzeigen."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"\u039f\u03b9 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b1\u03bd","AddUser":"\u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7","Users":"\u039f\u03b9 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2","Delete":"\u0394\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5","Administrator":"\u03c4\u03bf \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c2","Password":"\u03c4\u03bf\u03bd \u03ba\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2","DeleteImage":"\u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1","DeleteImageConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae \u03c4\u03b7\u03bd \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1;","FileReadCancelled":"\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b9\u03b1\u03b2\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03ad\u03c7\u03b5\u03b9 \u03b1\u03ba\u03c5\u03c1\u03c9\u03b8\u03b5\u03af","FileNotFound":"\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5","FileReadError":"\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5","DeleteUser":"\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7","DeleteUserConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5","PasswordResetHeader":"\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2","PasswordResetComplete":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03ad\u03c7\u03b5\u03b9 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac","PasswordResetConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2;","PasswordSaved":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b5","PasswordMatchError":"\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7\u03c2 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c4\u03b1\u03b9\u03c1\u03b9\u03ac\u03b6\u03bf\u03c5\u03bd","OptionOff":"\u03c3\u03b2\u03b7\u03c3\u03c4\u03cc\u03c2","OptionOn":"On","OptionRelease":"\u0397 \u03b5\u03c0\u03af\u03c3\u03b7\u03bc\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7","OptionBeta":"\u03b2\u03ae\u03c4\u03b1","OptionDev":"\u03b1\u03bd\u03ac\u03c0\u03c4\u03c5\u03be\u03b7 (\u03b1\u03c3\u03c4\u03b1\u03b8\u03ae\u03c2)","UninstallPluginHeader":"\u03b1\u03c0\u03b5\u03b3\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b7\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf plugin","UninstallPluginConfirmation":"\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03c0\u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5;","NoPluginConfigurationMessage":"\u0391\u03c5\u03c4\u03cc \u03c4\u03bf plugin \u03ad\u03c7\u03b5\u03b9 \u03c4\u03af\u03c0\u03bf\u03c4\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03ce\u03c3\u03b5\u03c4\u03b5","NoPluginsInstalledMessage":"\u0388\u03c7\u03b5\u03c4\u03b5 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03b9 \u03ba\u03b1\u03bd\u03ad\u03bd\u03b1 plugins ","BrowsePluginCatalogMessage":"\u03a0\u03bb\u03bf\u03b7\u03b3\u03b7\u03b8\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03bf\u03bd \u03ba\u03b1\u03c4\u03ac\u03bb\u03bf\u03b3\u03bf plugin \u03bc\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b5\u03af\u03c4\u03b5 \u03c4\u03b1 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 plugins"} {
"SettingsSaved": "\u039f\u03b9 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b1\u03bd",
"AddUser": "\u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7",
"Users": "\u039f\u03b9 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2",
"Delete": "\u0394\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5",
"Administrator": "\u03c4\u03bf \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c2",
"Password": "\u03c4\u03bf\u03bd \u03ba\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
"DeleteImage": "\u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1",
"DeleteImageConfirmation": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae \u03c4\u03b7\u03bd \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1;",
"FileReadCancelled": "\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b9\u03b1\u03b2\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03ad\u03c7\u03b5\u03b9 \u03b1\u03ba\u03c5\u03c1\u03c9\u03b8\u03b5\u03af",
"FileNotFound": "\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5",
"FileReadError": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b1\u03bd\u03ac\u03b3\u03bd\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5",
"DeleteUser": "\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7",
"DeleteUserConfirmation": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5",
"PasswordResetHeader": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03ba\u03c9\u03b4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
"PasswordResetComplete": "\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03ad\u03c7\u03b5\u03b9 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac",
"PasswordResetConfirmation": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2;",
"PasswordSaved": "\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b5",
"PasswordMatchError": "\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7\u03c2 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c4\u03b1\u03b9\u03c1\u03b9\u03ac\u03b6\u03bf\u03c5\u03bd",
"OptionOff": "\u03c3\u03b2\u03b7\u03c3\u03c4\u03cc\u03c2",
"OptionOn": "On",
"OptionRelease": "\u0397 \u03b5\u03c0\u03af\u03c3\u03b7\u03bc\u03b7 \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7",
"OptionBeta": "\u03b2\u03ae\u03c4\u03b1",
"OptionDev": "\u03b1\u03bd\u03ac\u03c0\u03c4\u03c5\u03be\u03b7 (\u03b1\u03c3\u03c4\u03b1\u03b8\u03ae\u03c2)",
"UninstallPluginHeader": "\u03b1\u03c0\u03b5\u03b3\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b7\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf plugin",
"UninstallPluginConfirmation": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03c0\u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5;",
"NoPluginConfigurationMessage": "\u0391\u03c5\u03c4\u03cc \u03c4\u03bf plugin \u03ad\u03c7\u03b5\u03b9 \u03c4\u03af\u03c0\u03bf\u03c4\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03ce\u03c3\u03b5\u03c4\u03b5",
"NoPluginsInstalledMessage": "\u0388\u03c7\u03b5\u03c4\u03b5 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03b9 \u03ba\u03b1\u03bd\u03ad\u03bd\u03b1 plugins ",
"BrowsePluginCatalogMessage": "\u03a0\u03bb\u03bf\u03b7\u03b3\u03b7\u03b8\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03bf\u03bd \u03ba\u03b1\u03c4\u03ac\u03bb\u03bf\u03b3\u03bf plugin \u03bc\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b5\u03af\u03c4\u03b5 \u03c4\u03b1 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 plugins"
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Settings saved.","AddUser":"Add User","Users":"Users","Delete":"Delete","Administrator":"Administrator","Password":"Password","DeleteImage":"Delete Image","DeleteImageConfirmation":"Are you sure you wish to delete this image?","FileReadCancelled":"The file read has been cancelled.","FileNotFound":"File not found.","FileReadError":"An error occurred while reading the file.","DeleteUser":"Delete User","DeleteUserConfirmation":"Are you sure you wish to delete {0}?","PasswordResetHeader":"Password Reset","PasswordResetComplete":"The password has been reset.","PasswordResetConfirmation":"Are you sure you wish to reset the password?","PasswordSaved":"Password saved.","PasswordMatchError":"Password and password confirmation must match.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Official Release","OptionBeta":"Beta","OptionDev":"Dev (Unstable)","UninstallPluginHeader":"Uninstall Plugin","UninstallPluginConfirmation":"Are you sure you wish to uninstall {0}?","NoPluginConfigurationMessage":"This plugin has nothing to configure.","NoPluginsInstalledMessage":"You have no plugins installed.","BrowsePluginCatalogMessage":"Browse our plugin catalog to view available plugins."} {
"SettingsSaved": "Settings saved.",
"AddUser": "Add User",
"Users": "Users",
"Delete": "Delete",
"Administrator": "Administrator",
"Password": "Password",
"DeleteImage": "Delete Image",
"DeleteImageConfirmation": "Are you sure you wish to delete this image?",
"FileReadCancelled": "The file read has been cancelled.",
"FileNotFound": "File not found.",
"FileReadError": "An error occurred while reading the file.",
"DeleteUser": "Delete User",
"DeleteUserConfirmation": "Are you sure you wish to delete {0}?",
"PasswordResetHeader": "Password Reset",
"PasswordResetComplete": "The password has been reset.",
"PasswordResetConfirmation": "Are you sure you wish to reset the password?",
"PasswordSaved": "Password saved.",
"PasswordMatchError": "Password and password confirmation must match.",
"OptionOff": "Off",
"OptionOn": "On",
"OptionRelease": "Official Release",
"OptionBeta": "Beta",
"OptionDev": "Dev (Unstable)",
"UninstallPluginHeader": "Uninstall Plugin",
"UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?",
"NoPluginConfigurationMessage": "This plugin has nothing to configure.",
"NoPluginsInstalledMessage": "You have no plugins installed.",
"BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Settings saved.","AddUser":"Add User","Users":"Users","Delete":"Delete","Administrator":"Administrator","Password":"Password","DeleteImage":"Delete Image","DeleteImageConfirmation":"Are you sure you wish to delete this image?","FileReadCancelled":"The file read has been canceled.","FileNotFound":"File not found.","FileReadError":"An error occurred while reading the file.","DeleteUser":"Delete User","DeleteUserConfirmation":"Are you sure you wish to delete {0}?","PasswordResetHeader":"Password Reset","PasswordResetComplete":"The password has been reset.","PasswordResetConfirmation":"Are you sure you wish to reset the password?","PasswordSaved":"Password saved.","PasswordMatchError":"Password and password confirmation must match.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Official Release","OptionBeta":"Beta","OptionDev":"Dev (Unstable)","UninstallPluginHeader":"Uninstall Plugin","UninstallPluginConfirmation":"Are you sure you wish to uninstall {0}?","NoPluginConfigurationMessage":"This plugin has nothing to configure.","NoPluginsInstalledMessage":"You have no plugins installed.","BrowsePluginCatalogMessage":"Browse our plugin catalog to view available plugins."} {
"SettingsSaved": "Settings saved.",
"AddUser": "Add User",
"Users": "Users",
"Delete": "Delete",
"Administrator": "Administrator",
"Password": "Password",
"DeleteImage": "Delete Image",
"DeleteImageConfirmation": "Are you sure you wish to delete this image?",
"FileReadCancelled": "The file read has been canceled.",
"FileNotFound": "File not found.",
"FileReadError": "An error occurred while reading the file.",
"DeleteUser": "Delete User",
"DeleteUserConfirmation": "Are you sure you wish to delete {0}?",
"PasswordResetHeader": "Password Reset",
"PasswordResetComplete": "The password has been reset.",
"PasswordResetConfirmation": "Are you sure you wish to reset the password?",
"PasswordSaved": "Password saved.",
"PasswordMatchError": "Password and password confirmation must match.",
"OptionOff": "Off",
"OptionOn": "On",
"OptionRelease": "Official Release",
"OptionBeta": "Beta",
"OptionDev": "Dev (Unstable)",
"UninstallPluginHeader": "Uninstall Plugin",
"UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?",
"NoPluginConfigurationMessage": "This plugin has nothing to configure.",
"NoPluginsInstalledMessage": "You have no plugins installed.",
"BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Configuraci\u00f3n guardada","AddUser":"Agregar usuario","Users":"Usuarios","Delete":"Borrar","Administrator":"Administrador","Password":"Contrase\u00f1a","DeleteImage":"Borrar Imagen","DeleteImageConfirmation":"Est\u00e1 seguro que desea borrar esta imagen?","FileReadCancelled":"La lectura del archivo se ha cancelado.","FileNotFound":"Archivo no encontrado.","FileReadError":"Se encontr\u00f3 un error al leer el archivo.","DeleteUser":"Borrar Usuario","DeleteUserConfirmation":"Esta seguro que desea eliminar a {0}?","PasswordResetHeader":"Restablecer contrase\u00f1a","PasswordResetComplete":"La contrase\u00f1a se ha restablecido.","PasswordResetConfirmation":"Esta seguro que desea restablecer la contrase\u00f1a?","PasswordSaved":"Contrase\u00f1a guardada.","PasswordMatchError":"La contrase\u00f1a y la confirmaci\u00f3n de la contrase\u00f1a deben de ser iguales.","OptionOff":"Apagado","OptionOn":"Encendido","OptionRelease":"Liberar","OptionBeta":"Beta","OptionDev":"Desarrollo","UninstallPluginHeader":"Desinstalar Plugin","UninstallPluginConfirmation":"Esta seguro que desea desinstalar {0}?","NoPluginConfigurationMessage":"El plugin no requiere configuraci\u00f3n","NoPluginsInstalledMessage":"No tiene plugins instalados.","BrowsePluginCatalogMessage":"Navegar el catalogo de plugins para ver los plugins disponibles."} {
"SettingsSaved": "Configuraci\u00f3n guardada",
"AddUser": "Agregar usuario",
"Users": "Usuarios",
"Delete": "Borrar",
"Administrator": "Administrador",
"Password": "Contrase\u00f1a",
"DeleteImage": "Borrar Imagen",
"DeleteImageConfirmation": "Est\u00e1 seguro que desea borrar esta imagen?",
"FileReadCancelled": "La lectura del archivo se ha cancelado.",
"FileNotFound": "Archivo no encontrado.",
"FileReadError": "Se encontr\u00f3 un error al leer el archivo.",
"DeleteUser": "Borrar Usuario",
"DeleteUserConfirmation": "Esta seguro que desea eliminar a {0}?",
"PasswordResetHeader": "Restablecer contrase\u00f1a",
"PasswordResetComplete": "La contrase\u00f1a se ha restablecido.",
"PasswordResetConfirmation": "Esta seguro que desea restablecer la contrase\u00f1a?",
"PasswordSaved": "Contrase\u00f1a guardada.",
"PasswordMatchError": "La contrase\u00f1a y la confirmaci\u00f3n de la contrase\u00f1a deben de ser iguales.",
"OptionOff": "Apagado",
"OptionOn": "Encendido",
"OptionRelease": "Liberar",
"OptionBeta": "Beta",
"OptionDev": "Desarrollo",
"UninstallPluginHeader": "Desinstalar Plugin",
"UninstallPluginConfirmation": "Esta seguro que desea desinstalar {0}?",
"NoPluginConfigurationMessage": "El plugin no requiere configuraci\u00f3n",
"NoPluginsInstalledMessage": "No tiene plugins instalados.",
"BrowsePluginCatalogMessage": "Navegar el catalogo de plugins para ver los plugins disponibles."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Configuraci\u00f3n guardada.","AddUser":"Agregar usuario","Users":"Usuarios","Delete":"Eliminar","Administrator":"Administrador","Password":"Contrase\u00f1a","DeleteImage":"Eliminar imagen","DeleteImageConfirmation":"\u00bfEst\u00e1 seguro que desea eliminar esta imagen?","FileReadCancelled":"La lectura del archivo ha sido cancelada.","FileNotFound":"Archivo no encontrado.","FileReadError":"Ha ocurrido un error al leer el archivo.","DeleteUser":"Eliminar Usuario","DeleteUserConfirmation":"\u00bfEsta seguro que desea eliminar a {0}?","PasswordResetHeader":"Restablecer Contrase\u00f1a","PasswordResetComplete":"La contrase\u00f1a ha sido restablecida.","PasswordResetConfirmation":"\u00bfEst\u00e1 seguro que desea restablecer la contrase\u00f1a?","PasswordSaved":"Contrase\u00f1a guardada.","PasswordMatchError":"La Contrase\u00f1a y la confirmaci\u00f3n de la contrase\u00f1a deben coincidir.","OptionOff":"No","OptionOn":"Si","OptionRelease":"Versi\u00f3n Oficial","OptionBeta":"Beta","OptionDev":"Desarrollo (Inestable)","UninstallPluginHeader":"Desinstalar Complemento","UninstallPluginConfirmation":"\u00bfEst\u00e1 seguro que desea desinstalar {0}?","NoPluginConfigurationMessage":"El complemento no requiere configuraci\u00f3n","NoPluginsInstalledMessage":"No tiene complementos instalados.","BrowsePluginCatalogMessage":"Navege en el catalogo de complementos para ver los complementos disponibles."} {
"SettingsSaved": "Configuraci\u00f3n guardada.",
"AddUser": "Agregar usuario",
"Users": "Usuarios",
"Delete": "Eliminar",
"Administrator": "Administrador",
"Password": "Contrase\u00f1a",
"DeleteImage": "Eliminar imagen",
"DeleteImageConfirmation": "\u00bfEst\u00e1 seguro que desea eliminar esta imagen?",
"FileReadCancelled": "La lectura del archivo ha sido cancelada.",
"FileNotFound": "Archivo no encontrado.",
"FileReadError": "Ha ocurrido un error al leer el archivo.",
"DeleteUser": "Eliminar Usuario",
"DeleteUserConfirmation": "\u00bfEsta seguro que desea eliminar a {0}?",
"PasswordResetHeader": "Restablecer Contrase\u00f1a",
"PasswordResetComplete": "La contrase\u00f1a ha sido restablecida.",
"PasswordResetConfirmation": "\u00bfEst\u00e1 seguro que desea restablecer la contrase\u00f1a?",
"PasswordSaved": "Contrase\u00f1a guardada.",
"PasswordMatchError": "La Contrase\u00f1a y la confirmaci\u00f3n de la contrase\u00f1a deben coincidir.",
"OptionOff": "No",
"OptionOn": "Si",
"OptionRelease": "Versi\u00f3n Oficial",
"OptionBeta": "Beta",
"OptionDev": "Desarrollo (Inestable)",
"UninstallPluginHeader": "Desinstalar Complemento",
"UninstallPluginConfirmation": "\u00bfEst\u00e1 seguro que desea desinstalar {0}?",
"NoPluginConfigurationMessage": "El complemento no requiere configuraci\u00f3n",
"NoPluginsInstalledMessage": "No tiene complementos instalados.",
"BrowsePluginCatalogMessage": "Navege en el catalogo de complementos para ver los complementos disponibles."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Param\u00e8tres sauvegard\u00e9s.","AddUser":"Ajouter utilisateur","Users":"Utilisateurs","Delete":"Supprimer","Administrator":"Administrateur","Password":"Mot de passe","DeleteImage":"Supprimer Image","DeleteImageConfirmation":"\u00cates-vous s\u00fbr de vouloir supprimer l'image?","FileReadCancelled":"La lecture du fichier a \u00e9t\u00e9 annul\u00e9e.","FileNotFound":"Fichier non trouv\u00e9","FileReadError":"Un erreur est survenue pendant la lecture du fichier.","DeleteUser":"Supprimer utilisateur","DeleteUserConfirmation":"\u00cates-vous s\u00fbr de vouloir supprimer {0}?","PasswordResetHeader":"R\u00e9initialisation du mot de passe","PasswordResetComplete":"Le mot de passe a \u00e9t\u00e9 r\u00e9initialis\u00e9.","PasswordResetConfirmation":"\u00cates-vous s\u00fbr de vouloir r\u00e9initialiser le mot de passe?","PasswordSaved":"Mot de passe sauvegard\u00e9.","PasswordMatchError":"Le mot de passe et sa confirmation doivent correspondre.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Version officielle","OptionBeta":"Beta","OptionDev":"Dev (Instable)","UninstallPluginHeader":"D\u00e9sinstaller Plug-in","UninstallPluginConfirmation":"\u00cates-vous s\u00fbr de vouloir d\u00e9sinstaller {0}?","NoPluginConfigurationMessage":"Ce module d'extension n'a rien \u00e0 configurer.","NoPluginsInstalledMessage":"Vous n'avez aucun Plugin install\u00e9.","BrowsePluginCatalogMessage":"Explorer notre catalogue de Plugins disponibles."} {
"SettingsSaved": "Param\u00e8tres sauvegard\u00e9s.",
"AddUser": "Ajouter utilisateur",
"Users": "Utilisateurs",
"Delete": "Supprimer",
"Administrator": "Administrateur",
"Password": "Mot de passe",
"DeleteImage": "Supprimer Image",
"DeleteImageConfirmation": "\u00cates-vous s\u00fbr de vouloir supprimer l'image?",
"FileReadCancelled": "La lecture du fichier a \u00e9t\u00e9 annul\u00e9e.",
"FileNotFound": "Fichier non trouv\u00e9",
"FileReadError": "Un erreur est survenue pendant la lecture du fichier.",
"DeleteUser": "Supprimer utilisateur",
"DeleteUserConfirmation": "\u00cates-vous s\u00fbr de vouloir supprimer {0}?",
"PasswordResetHeader": "R\u00e9initialisation du mot de passe",
"PasswordResetComplete": "Le mot de passe a \u00e9t\u00e9 r\u00e9initialis\u00e9.",
"PasswordResetConfirmation": "\u00cates-vous s\u00fbr de vouloir r\u00e9initialiser le mot de passe?",
"PasswordSaved": "Mot de passe sauvegard\u00e9.",
"PasswordMatchError": "Le mot de passe et sa confirmation doivent correspondre.",
"OptionOff": "Off",
"OptionOn": "On",
"OptionRelease": "Version officielle",
"OptionBeta": "Beta",
"OptionDev": "Dev (Instable)",
"UninstallPluginHeader": "D\u00e9sinstaller Plug-in",
"UninstallPluginConfirmation": "\u00cates-vous s\u00fbr de vouloir d\u00e9sinstaller {0}?",
"NoPluginConfigurationMessage": "Ce module d'extension n'a rien \u00e0 configurer.",
"NoPluginsInstalledMessage": "Vous n'avez aucun Plugin install\u00e9.",
"BrowsePluginCatalogMessage": "Explorer notre catalogue de Plugins disponibles."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"\u05d4\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05e0\u05e9\u05de\u05e8\u05d5.","AddUser":"\u05d4\u05d5\u05e1\u05e3 \u05de\u05e9\u05ea\u05de\u05e9","Users":"\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd","Delete":"\u05de\u05d7\u05e7","Administrator":"\u05de\u05e0\u05d4\u05dc","Password":"\u05e1\u05d9\u05e1\u05de\u05d0","DeleteImage":"\u05de\u05d7\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4","DeleteImageConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5?","FileReadCancelled":"\u05e7\u05e8\u05d9\u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d1\u05d5\u05d8\u05dc\u05d4.","FileNotFound":"\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0.","FileReadError":"\u05d7\u05dc\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05e7\u05e8\u05d9\u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5.","DeleteUser":"\u05de\u05d7\u05e7 \u05de\u05e9\u05ea\u05de\u05e9","DeleteUserConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05db\u05d9 \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 {0}?","PasswordResetHeader":"\u05d0\u05d9\u05e4\u05d5\u05e1 \u05e1\u05d9\u05e1\u05de\u05d0","PasswordResetComplete":"\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05d0\u05d5\u05e4\u05e1\u05d4.","PasswordResetConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d0\u05e4\u05e1 \u05d0\u05ea \u05d4\u05e1\u05d9\u05e1\u05de\u05d0?","PasswordSaved":"\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05e0\u05e9\u05de\u05e8\u05d4.","PasswordMatchError":"\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05d5\u05d0\u05d9\u05de\u05d5\u05ea \u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05e6\u05e8\u05d9\u05db\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d6\u05d4\u05d5\u05ea.","OptionOff":"\u05db\u05d1\u05d5\u05d9","OptionOn":"\u05e4\u05d5\u05e2\u05dc","OptionRelease":"\u05e9\u05d9\u05d7\u05e8\u05d5\u05e8 \u05e8\u05e9\u05de\u05d9","OptionBeta":"\u05d1\u05d8\u05d0","OptionDev":"\u05de\u05e4\u05ea\u05d7 (\u05dc\u05d0 \u05d9\u05e6\u05d9\u05d1)","UninstallPluginHeader":"\u05d4\u05e1\u05e8 \u05ea\u05d5\u05e1\u05e3","UninstallPluginConfirmation":"\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05e1\u05d9\u05e8 {0}?","NoPluginConfigurationMessage":"\u05dc\u05ea\u05d5\u05e1\u05e3 \u05d4\u05d6\u05d4 \u05d0\u05d9\u05df \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05de\u05d9\u05d5\u05d7\u05d3\u05d5\u05ea.","NoPluginsInstalledMessage":"\u05d0\u05d9\u05df \u05dc\u05da \u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05de\u05d5\u05ea\u05e7\u05e0\u05d9\u05dd.","BrowsePluginCatalogMessage":"\u05e2\u05d1\u05d5\u05e8 \u05dc\u05e7\u05d8\u05dc\u05d5\u05d2 \u05d4\u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05dc\u05e8\u05d0\u05d5\u05ea \u05d0\u05d9\u05dc\u05d5 \u05d6\u05de\u05d9\u05e0\u05d9\u05dd."} {
"SettingsSaved": "\u05d4\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05e0\u05e9\u05de\u05e8\u05d5.",
"AddUser": "\u05d4\u05d5\u05e1\u05e3 \u05de\u05e9\u05ea\u05de\u05e9",
"Users": "\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd",
"Delete": "\u05de\u05d7\u05e7",
"Administrator": "\u05de\u05e0\u05d4\u05dc",
"Password": "\u05e1\u05d9\u05e1\u05de\u05d0",
"DeleteImage": "\u05de\u05d7\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4",
"DeleteImageConfirmation": "\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5?",
"FileReadCancelled": "\u05e7\u05e8\u05d9\u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d1\u05d5\u05d8\u05dc\u05d4.",
"FileNotFound": "\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0.",
"FileReadError": "\u05d7\u05dc\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05e7\u05e8\u05d9\u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5.",
"DeleteUser": "\u05de\u05d7\u05e7 \u05de\u05e9\u05ea\u05de\u05e9",
"DeleteUserConfirmation": "\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05db\u05d9 \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 {0}?",
"PasswordResetHeader": "\u05d0\u05d9\u05e4\u05d5\u05e1 \u05e1\u05d9\u05e1\u05de\u05d0",
"PasswordResetComplete": "\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05d0\u05d5\u05e4\u05e1\u05d4.",
"PasswordResetConfirmation": "\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d0\u05e4\u05e1 \u05d0\u05ea \u05d4\u05e1\u05d9\u05e1\u05de\u05d0?",
"PasswordSaved": "\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05e0\u05e9\u05de\u05e8\u05d4.",
"PasswordMatchError": "\u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05d5\u05d0\u05d9\u05de\u05d5\u05ea \u05d4\u05e1\u05d9\u05e1\u05de\u05d0 \u05e6\u05e8\u05d9\u05db\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d6\u05d4\u05d5\u05ea.",
"OptionOff": "\u05db\u05d1\u05d5\u05d9",
"OptionOn": "\u05e4\u05d5\u05e2\u05dc",
"OptionRelease": "\u05e9\u05d9\u05d7\u05e8\u05d5\u05e8 \u05e8\u05e9\u05de\u05d9",
"OptionBeta": "\u05d1\u05d8\u05d0",
"OptionDev": "\u05de\u05e4\u05ea\u05d7 (\u05dc\u05d0 \u05d9\u05e6\u05d9\u05d1)",
"UninstallPluginHeader": "\u05d4\u05e1\u05e8 \u05ea\u05d5\u05e1\u05e3",
"UninstallPluginConfirmation": "\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05e1\u05d9\u05e8 {0}?",
"NoPluginConfigurationMessage": "\u05dc\u05ea\u05d5\u05e1\u05e3 \u05d4\u05d6\u05d4 \u05d0\u05d9\u05df \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05de\u05d9\u05d5\u05d7\u05d3\u05d5\u05ea.",
"NoPluginsInstalledMessage": "\u05d0\u05d9\u05df \u05dc\u05da \u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05de\u05d5\u05ea\u05e7\u05e0\u05d9\u05dd.",
"BrowsePluginCatalogMessage": "\u05e2\u05d1\u05d5\u05e8 \u05dc\u05e7\u05d8\u05dc\u05d5\u05d2 \u05d4\u05ea\u05d5\u05e1\u05e4\u05d9\u05dd \u05dc\u05e8\u05d0\u05d5\u05ea \u05d0\u05d9\u05dc\u05d5 \u05d6\u05de\u05d9\u05e0\u05d9\u05dd."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Settaggi salvati.","AddUser":"Aggiungi utente","Users":"Utenti","Delete":"Elimina","Administrator":"Amministratore","Password":"Password","DeleteImage":"Elimina immagine","DeleteImageConfirmation":"Sei sicuro di voler eliminare questa immagine?","FileReadCancelled":"Il file letto \u00e8 stato cancellato.","FileNotFound":"File non trovato","FileReadError":"Errore durante la lettura del file.","DeleteUser":"Elimina utente","DeleteUserConfirmation":"Sei sicuro di voler eliminare {0}?","PasswordResetHeader":"Ripristina Password","PasswordResetComplete":"la password \u00e8 stata ripristinata.","PasswordResetConfirmation":"Sei sicuro di voler ripristinare la password?","PasswordSaved":"Password salvata.","PasswordMatchError":"Le password non coincidono.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Versione Ufficiale","OptionBeta":"Beta","OptionDev":"Dev (instabile)","UninstallPluginHeader":"Disinstalla Plugin","UninstallPluginConfirmation":"Sei sicuro di voler Disinstallare {0}?","NoPluginConfigurationMessage":"Questo Plugin non \u00e8 stato configurato.","NoPluginsInstalledMessage":"non ci sono Plugins installati.","BrowsePluginCatalogMessage":"Sfoglia il catalogo dei Plugins."} {
"SettingsSaved": "Settaggi salvati.",
"AddUser": "Aggiungi utente",
"Users": "Utenti",
"Delete": "Elimina",
"Administrator": "Amministratore",
"Password": "Password",
"DeleteImage": "Elimina immagine",
"DeleteImageConfirmation": "Sei sicuro di voler eliminare questa immagine?",
"FileReadCancelled": "Il file letto \u00e8 stato cancellato.",
"FileNotFound": "File non trovato",
"FileReadError": "Errore durante la lettura del file.",
"DeleteUser": "Elimina utente",
"DeleteUserConfirmation": "Sei sicuro di voler eliminare {0}?",
"PasswordResetHeader": "Ripristina Password",
"PasswordResetComplete": "la password \u00e8 stata ripristinata.",
"PasswordResetConfirmation": "Sei sicuro di voler ripristinare la password?",
"PasswordSaved": "Password salvata.",
"PasswordMatchError": "Le password non coincidono.",
"OptionOff": "Off",
"OptionOn": "On",
"OptionRelease": "Versione Ufficiale",
"OptionBeta": "Beta",
"OptionDev": "Dev (instabile)",
"UninstallPluginHeader": "Disinstalla Plugin",
"UninstallPluginConfirmation": "Sei sicuro di voler Disinstallare {0}?",
"NoPluginConfigurationMessage": "Questo Plugin non \u00e8 stato configurato.",
"NoPluginsInstalledMessage": "non ci sono Plugins installati.",
"BrowsePluginCatalogMessage": "Sfoglia il catalogo dei Plugins."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.","AddUser":"\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b \u04af\u0441\u0442\u0435\u0443","Users":"\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440","Delete":"\u0416\u043e\u044e","Administrator":"\u04d8\u043a\u0456\u043c\u0448\u0456","Password":"\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437","DeleteImage":"\u0421\u0443\u0440\u0435\u0442\u0442\u0456 \u0436\u043e\u044e","DeleteImageConfirmation":"\u0421\u0456\u0437 \u0448\u044b\u043d\u044b\u043c\u0435\u043d \u0431\u04b1\u043b \u0441\u0443\u0440\u0435\u0442\u0442\u0456 \u0436\u043e\u0439\u0493\u044b\u04a3\u044b\u0437 \u043a\u0435\u043b\u0435 \u043c\u0435?","FileReadCancelled":"\u0424\u0430\u0439\u043b \u043e\u049b\u0443\u044b \u0442\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0434\u044b.","FileNotFound":"\u0424\u0430\u0439\u043b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b.","FileReadError":"\u0424\u0430\u0439\u043b\u0434\u044b \u043e\u049b\u044b\u043f \u0436\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u049b\u0430\u0442\u0435 \u043f\u0430\u0439\u0434\u0430 \u0431\u043e\u043b\u0434\u044b.","DeleteUser":"\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b \u0430\u043b\u0430\u0441\u0442\u0430\u0443","DeleteUserConfirmation":"\u0421\u0456\u0437 \u0448\u044b\u043d\u044b\u043c\u0435\u043d {0} \u0436\u043e\u0439\u0493\u044b\u04a3\u044b\u0437 \u043a\u0435\u043b\u0435 \u043c\u0435?","PasswordResetHeader":"\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0456 \u044b\u0441\u044b\u0440\u0443","PasswordResetComplete":"\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u044b\u0441\u044b\u0440\u044b\u043b\u0434\u044b.","PasswordResetConfirmation":"\u0421\u0456\u0437 \u0448\u044b\u043d\u044b\u043c\u0435\u043d \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0456 \u044b\u0441\u044b\u0440\u0493\u044b\u04a3\u044b\u0437 \u043a\u0435\u043b\u0435 \u043c\u0435?","PasswordSaved":"\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.","PasswordMatchError":"\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0456 \u043c\u0435\u043d \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0456 \u0440\u0430\u0441\u0442\u0430\u0443 \u04e9\u0440\u0456\u0441\u0442\u0435\u0440\u0456 \u0441\u04d9\u0439\u043a\u0435\u0441 \u0431\u043e\u043b\u0443 \u043a\u0435\u0440\u0435\u043a.","OptionOff":"\u04e8\u0448\u0456\u0440","OptionOn":"\u049a\u043e\u0441","OptionRelease":"\u0420\u0435\u0441\u043c\u0438 \u0448\u044b\u0493\u0430\u0440\u044b\u043b\u044b\u043c","OptionBeta":"\u0411\u0435\u0442\u0430 \u043d\u04b1\u0441\u049b\u0430","OptionDev":"\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443 (\u0422\u04b1\u0440\u0430\u049b\u0441\u044b\u0437)","UninstallPluginHeader":"\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443","UninstallPluginConfirmation":"\u0421\u0456\u0437 \u0448\u044b\u043d\u044b\u043c\u0435\u043d {0} \u043e\u0440\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443\u044b\u04a3\u044b\u0437 \u043a\u0435\u043b\u0435 \u043c\u0435?","NoPluginConfigurationMessage":"\u0411\u04b1\u043b \u043f\u043b\u0430\u0433\u0438\u043d \u04af\u0448\u0456\u043d \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043b\u0430\u0443 \u0436\u043e\u049b.","NoPluginsInstalledMessage":"\u0421\u0456\u0437\u0434\u0435 \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440 \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u043c\u0430\u0493\u0430\u043d.","BrowsePluginCatalogMessage":"\u049a\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440\u043c\u0435\u043d \u0442\u0430\u043d\u044b\u0441\u0443 \u04af\u0448\u0456\u043d \u0431\u0456\u0437\u0434\u0456\u04a3 \u043f\u043b\u0430\u0433\u0438\u043d \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0456\u043d \u0448\u043e\u043b\u044b\u04a3\u044b\u0437."} {
"SettingsSaved": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.",
"AddUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b \u04af\u0441\u0442\u0435\u0443",
"Users": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440",
"Delete": "\u0416\u043e\u044e",
"Administrator": "\u04d8\u043a\u0456\u043c\u0448\u0456",
"Password": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437",
"DeleteImage": "\u0421\u0443\u0440\u0435\u0442\u0442\u0456 \u0436\u043e\u044e",
"DeleteImageConfirmation": "\u0421\u0456\u0437 \u0448\u044b\u043d\u044b\u043c\u0435\u043d \u0431\u04b1\u043b \u0441\u0443\u0440\u0435\u0442\u0442\u0456 \u0436\u043e\u0439\u0493\u044b\u04a3\u044b\u0437 \u043a\u0435\u043b\u0435 \u043c\u0435?",
"FileReadCancelled": "\u0424\u0430\u0439\u043b \u043e\u049b\u0443\u044b \u0442\u043e\u049b\u0442\u0430\u0442\u044b\u043b\u0434\u044b.",
"FileNotFound": "\u0424\u0430\u0439\u043b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b.",
"FileReadError": "\u0424\u0430\u0439\u043b\u0434\u044b \u043e\u049b\u044b\u043f \u0436\u0430\u0442\u049b\u0430\u043d\u0434\u0430 \u049b\u0430\u0442\u0435 \u043f\u0430\u0439\u0434\u0430 \u0431\u043e\u043b\u0434\u044b.",
"DeleteUser": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043d\u044b \u0430\u043b\u0430\u0441\u0442\u0430\u0443",
"DeleteUserConfirmation": "\u0421\u0456\u0437 \u0448\u044b\u043d\u044b\u043c\u0435\u043d {0} \u0436\u043e\u0439\u0493\u044b\u04a3\u044b\u0437 \u043a\u0435\u043b\u0435 \u043c\u0435?",
"PasswordResetHeader": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0456 \u044b\u0441\u044b\u0440\u0443",
"PasswordResetComplete": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u044b\u0441\u044b\u0440\u044b\u043b\u0434\u044b.",
"PasswordResetConfirmation": "\u0421\u0456\u0437 \u0448\u044b\u043d\u044b\u043c\u0435\u043d \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0456 \u044b\u0441\u044b\u0440\u0493\u044b\u04a3\u044b\u0437 \u043a\u0435\u043b\u0435 \u043c\u0435?",
"PasswordSaved": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437 \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.",
"PasswordMatchError": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0456 \u043c\u0435\u043d \u049b\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0456 \u0440\u0430\u0441\u0442\u0430\u0443 \u04e9\u0440\u0456\u0441\u0442\u0435\u0440\u0456 \u0441\u04d9\u0439\u043a\u0435\u0441 \u0431\u043e\u043b\u0443 \u043a\u0435\u0440\u0435\u043a.",
"OptionOff": "\u04e8\u0448\u0456\u0440",
"OptionOn": "\u049a\u043e\u0441",
"OptionRelease": "\u0420\u0435\u0441\u043c\u0438 \u0448\u044b\u0493\u0430\u0440\u044b\u043b\u044b\u043c",
"OptionBeta": "\u0411\u0435\u0442\u0430 \u043d\u04b1\u0441\u049b\u0430",
"OptionDev": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443 (\u0422\u04b1\u0440\u0430\u049b\u0441\u044b\u0437)",
"UninstallPluginHeader": "\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443",
"UninstallPluginConfirmation": "\u0421\u0456\u0437 \u0448\u044b\u043d\u044b\u043c\u0435\u043d {0} \u043e\u0440\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443\u044b\u04a3\u044b\u0437 \u043a\u0435\u043b\u0435 \u043c\u0435?",
"NoPluginConfigurationMessage": "\u0411\u04b1\u043b \u043f\u043b\u0430\u0433\u0438\u043d \u04af\u0448\u0456\u043d \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043b\u0430\u0443 \u0436\u043e\u049b.",
"NoPluginsInstalledMessage": "\u0421\u0456\u0437\u0434\u0435 \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440 \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u043c\u0430\u0493\u0430\u043d.",
"BrowsePluginCatalogMessage": "\u049a\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440\u043c\u0435\u043d \u0442\u0430\u043d\u044b\u0441\u0443 \u04af\u0448\u0456\u043d \u0431\u0456\u0437\u0434\u0456\u04a3 \u043f\u043b\u0430\u0433\u0438\u043d \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0456\u043d \u0448\u043e\u043b\u044b\u04a3\u044b\u0437."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Seting Disimpan","AddUser":"Tambah Pengguna","Users":"Para Pengguna","Delete":"Padam","Administrator":"Administrator","Password":"Password","DeleteImage":"Delete Image","DeleteImageConfirmation":"Are you sure you wish to delete this image?","FileReadCancelled":"The file read has been canceled.","FileNotFound":"File not found.","FileReadError":"An error occurred while reading the file.","DeleteUser":"Delete User","DeleteUserConfirmation":"Are you sure you wish to delete {0}?","PasswordResetHeader":"Password Reset","PasswordResetComplete":"The password has been reset.","PasswordResetConfirmation":"Are you sure you wish to reset the password?","PasswordSaved":"Password saved.","PasswordMatchError":"Password and password confirmation must match.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Official Release","OptionBeta":"Beta","OptionDev":"Dev (Unstable)","UninstallPluginHeader":"Uninstall Plugin","UninstallPluginConfirmation":"Are you sure you wish to uninstall {0}?","NoPluginConfigurationMessage":"This plugin has nothing to configure.","NoPluginsInstalledMessage":"You have no plugins installed.","BrowsePluginCatalogMessage":"Browse our plugin catalog to view available plugins."} {
"SettingsSaved": "Seting Disimpan",
"AddUser": "Tambah Pengguna",
"Users": "Para Pengguna",
"Delete": "Padam",
"Administrator": "Administrator",
"Password": "Password",
"DeleteImage": "Delete Image",
"DeleteImageConfirmation": "Are you sure you wish to delete this image?",
"FileReadCancelled": "The file read has been canceled.",
"FileNotFound": "File not found.",
"FileReadError": "An error occurred while reading the file.",
"DeleteUser": "Delete User",
"DeleteUserConfirmation": "Are you sure you wish to delete {0}?",
"PasswordResetHeader": "Password Reset",
"PasswordResetComplete": "The password has been reset.",
"PasswordResetConfirmation": "Are you sure you wish to reset the password?",
"PasswordSaved": "Password saved.",
"PasswordMatchError": "Password and password confirmation must match.",
"OptionOff": "Off",
"OptionOn": "On",
"OptionRelease": "Official Release",
"OptionBeta": "Beta",
"OptionDev": "Dev (Unstable)",
"UninstallPluginHeader": "Uninstall Plugin",
"UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?",
"NoPluginConfigurationMessage": "This plugin has nothing to configure.",
"NoPluginsInstalledMessage": "You have no plugins installed.",
"BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Innstillinger lagret","AddUser":"Legg til bruker","Users":"Brukere","Delete":"Slett","Administrator":"Administrator","Password":"PAssord","DeleteImage":"Slett bilde","DeleteImageConfirmation":"Er du sikker p\u00e5 at du vil slette bildet?","FileReadCancelled":"Lesing av filen avbrutt","FileNotFound":"Fil ikke funnet","FileReadError":"Feil oppstod i det filen ble lest","DeleteUser":"Slett bruker","DeleteUserConfirmation":"Er du sikker p\u00e5 at du vil slette{0}?","PasswordResetHeader":"Resett passord","PasswordResetComplete":"Passordet har blitt resatt","PasswordResetConfirmation":"Er du sikker p\u00e5 at du vil resette passordet?","PasswordSaved":"Passord lagret","PasswordMatchError":"Passord og passord-verifiseringen m\u00e5 matche","OptionOff":"Av","OptionOn":"P\u00e5","OptionRelease":"Sluppet","OptionBeta":"Beta","OptionDev":"Dev","UninstallPluginHeader":"Avinstaller plugin","UninstallPluginConfirmation":"Are you sure you wish to uninstall {0}?","NoPluginConfigurationMessage":"Denne pluginn-en har intet \u00e5 konfigurere","NoPluginsInstalledMessage":"Du har ikke installert noen plugins enn\u00e5","BrowsePluginCatalogMessage":"Browse v\u00e5r plugin-katalog for \u00e5 se tilgjengelige plugins"} {
"SettingsSaved": "Innstillinger lagret",
"AddUser": "Legg til bruker",
"Users": "Brukere",
"Delete": "Slett",
"Administrator": "Administrator",
"Password": "PAssord",
"DeleteImage": "Slett bilde",
"DeleteImageConfirmation": "Er du sikker p\u00e5 at du vil slette bildet?",
"FileReadCancelled": "Lesing av filen avbrutt",
"FileNotFound": "Fil ikke funnet",
"FileReadError": "Feil oppstod i det filen ble lest",
"DeleteUser": "Slett bruker",
"DeleteUserConfirmation": "Er du sikker p\u00e5 at du vil slette{0}?",
"PasswordResetHeader": "Resett passord",
"PasswordResetComplete": "Passordet har blitt resatt",
"PasswordResetConfirmation": "Er du sikker p\u00e5 at du vil resette passordet?",
"PasswordSaved": "Passord lagret",
"PasswordMatchError": "Passord og passord-verifiseringen m\u00e5 matche",
"OptionOff": "Av",
"OptionOn": "P\u00e5",
"OptionRelease": "Sluppet",
"OptionBeta": "Beta",
"OptionDev": "Dev",
"UninstallPluginHeader": "Avinstaller plugin",
"UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?",
"NoPluginConfigurationMessage": "Denne pluginn-en har intet \u00e5 konfigurere",
"NoPluginsInstalledMessage": "Du har ikke installert noen plugins enn\u00e5",
"BrowsePluginCatalogMessage": "Browse v\u00e5r plugin-katalog for \u00e5 se tilgjengelige plugins"
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Instellingen opgeslagen.","AddUser":"Gebruiker toevoegen","Users":"Gebruikers","Delete":"Verwijderen","Administrator":"Beheerder","Password":"Wachtwoord","DeleteImage":"Verwijder afbeelding","DeleteImageConfirmation":"Weet je zeker dat je deze afbeelding wilt verwijderen?","FileReadCancelled":"Bestand lezen is geannuleerd.","FileNotFound":"Bestand niet gevonden.","FileReadError":"Er is een fout opgetreden bij het lezen van het bestand.","DeleteUser":"Verwijder gebruiker","DeleteUserConfirmation":"Weet je zeker dat je {0} wilt verwijderen?","PasswordResetHeader":"Wachtwoord opnieuw instellen","PasswordResetComplete":"Het wachtwoord is opnieuw ingesteld.","PasswordResetConfirmation":"Weet je zeker dat je het wachtwoord opnieuw in wilt stellen?","PasswordSaved":"Wachtwoord opgeslagen.","PasswordMatchError":"Wachtwoord en wachtwoord bevestiging moeten hetzelfde zijn.","OptionOff":"Uit","OptionOn":"Aan","OptionRelease":"Offici\u00eble Release","OptionBeta":"Beta","OptionDev":"Dev (Instabiel)","UninstallPluginHeader":"Plug-in de\u00efnstalleren","UninstallPluginConfirmation":"Weet u zeker dat u {0} wilt de\u00efnstalleren?","NoPluginConfigurationMessage":"Deze plug-in heeft niets in te stellen","NoPluginsInstalledMessage":"U heeft geen plug-ins ge\u00efnstalleerd","BrowsePluginCatalogMessage":"Bekijk de Plug-in catalogus voor beschikbare plug-ins."} {
"SettingsSaved": "Instellingen opgeslagen.",
"AddUser": "Gebruiker toevoegen",
"Users": "Gebruikers",
"Delete": "Verwijderen",
"Administrator": "Beheerder",
"Password": "Wachtwoord",
"DeleteImage": "Verwijder afbeelding",
"DeleteImageConfirmation": "Weet je zeker dat je deze afbeelding wilt verwijderen?",
"FileReadCancelled": "Bestand lezen is geannuleerd.",
"FileNotFound": "Bestand niet gevonden.",
"FileReadError": "Er is een fout opgetreden bij het lezen van het bestand.",
"DeleteUser": "Verwijder gebruiker",
"DeleteUserConfirmation": "Weet je zeker dat je {0} wilt verwijderen?",
"PasswordResetHeader": "Wachtwoord opnieuw instellen",
"PasswordResetComplete": "Het wachtwoord is opnieuw ingesteld.",
"PasswordResetConfirmation": "Weet je zeker dat je het wachtwoord opnieuw in wilt stellen?",
"PasswordSaved": "Wachtwoord opgeslagen.",
"PasswordMatchError": "Wachtwoord en wachtwoord bevestiging moeten hetzelfde zijn.",
"OptionOff": "Uit",
"OptionOn": "Aan",
"OptionRelease": "Offici\u00eble Release",
"OptionBeta": "Beta",
"OptionDev": "Dev (Instabiel)",
"UninstallPluginHeader": "Plug-in de\u00efnstalleren",
"UninstallPluginConfirmation": "Weet u zeker dat u {0} wilt de\u00efnstalleren?",
"NoPluginConfigurationMessage": "Deze plug-in heeft niets in te stellen",
"NoPluginsInstalledMessage": "U heeft geen plug-ins ge\u00efnstalleerd",
"BrowsePluginCatalogMessage": "Bekijk de Plug-in catalogus voor beschikbare plug-ins."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Ajustes salvos.","AddUser":"Adicionar Usu\u00e1rio","Users":"Usu\u00e1rios","Delete":"Apagar","Administrator":"Administrador","Password":"Senha","DeleteImage":"Apagar Imagem","DeleteImageConfirmation":"Tem certeza que deseja apagar esta imagem?","FileReadCancelled":"A leitura do arquivo foi cancelada.","FileNotFound":"Arquivo n\u00e3o encontrado.","FileReadError":"Ocorreu um erro ao ler o arquivo.","DeleteUser":"Apagar Usu\u00e1rio","DeleteUserConfirmation":"Deseja realmente apagar {0}?","PasswordResetHeader":"Redefinir Senha","PasswordResetComplete":"A senha foi redefinida.","PasswordResetConfirmation":"Deseja realmente redefinir a senha?","PasswordSaved":"Senha salva.","PasswordMatchError":"A senha e a confirma\u00e7\u00e3o da senha devem ser iguais.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Lan\u00e7amento Oficial","OptionBeta":"Beta","OptionDev":"Dev (Inst\u00e1vel)","UninstallPluginHeader":"Desinstalar Plugin","UninstallPluginConfirmation":"Deseja realmente desinstalar {0}?","NoPluginConfigurationMessage":"Este plugin n\u00e3o necessita configurar.","NoPluginsInstalledMessage":"N\u00e3o existem plugins instalados.","BrowsePluginCatalogMessage":"Navegue pelo cat\u00e1logo de plugins para ver os dispon\u00edveis."} {
"SettingsSaved": "Ajustes salvos.",
"AddUser": "Adicionar Usu\u00e1rio",
"Users": "Usu\u00e1rios",
"Delete": "Apagar",
"Administrator": "Administrador",
"Password": "Senha",
"DeleteImage": "Apagar Imagem",
"DeleteImageConfirmation": "Tem certeza que deseja apagar esta imagem?",
"FileReadCancelled": "A leitura do arquivo foi cancelada.",
"FileNotFound": "Arquivo n\u00e3o encontrado.",
"FileReadError": "Ocorreu um erro ao ler o arquivo.",
"DeleteUser": "Apagar Usu\u00e1rio",
"DeleteUserConfirmation": "Deseja realmente apagar {0}?",
"PasswordResetHeader": "Redefinir Senha",
"PasswordResetComplete": "A senha foi redefinida.",
"PasswordResetConfirmation": "Deseja realmente redefinir a senha?",
"PasswordSaved": "Senha salva.",
"PasswordMatchError": "A senha e a confirma\u00e7\u00e3o da senha devem ser iguais.",
"OptionOff": "Off",
"OptionOn": "On",
"OptionRelease": "Lan\u00e7amento Oficial",
"OptionBeta": "Beta",
"OptionDev": "Dev (Inst\u00e1vel)",
"UninstallPluginHeader": "Desinstalar Plugin",
"UninstallPluginConfirmation": "Deseja realmente desinstalar {0}?",
"NoPluginConfigurationMessage": "Este plugin n\u00e3o necessita configurar.",
"NoPluginsInstalledMessage": "N\u00e3o existem plugins instalados.",
"BrowsePluginCatalogMessage": "Navegue pelo cat\u00e1logo de plugins para ver os dispon\u00edveis."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Configura\u00e7\u00f5es guardadas.","AddUser":"Adicionar Utilizador","Users":"Utilizadores","Delete":"Apagar","Administrator":"Administrador","Password":"Senha","DeleteImage":"Apagar Imagem","DeleteImageConfirmation":"Tem a certeza que deseja apagar a imagem?","FileReadCancelled":"A leitura do ficheiro foi cancelada.","FileNotFound":"Ficheiro n\u00e3o encontrado.","FileReadError":"Ocorreu um erro ao ler o ficheiro.","DeleteUser":"Apagar Utilizador","DeleteUserConfirmation":"Tem a certeza que deseja apagar {0}?","PasswordResetHeader":"Redefinir Senha","PasswordResetComplete":"A senha foi redefinida.","PasswordResetConfirmation":"Tem a certeza que deseja redefinir a senha?","PasswordSaved":"Senha guardada.","PasswordMatchError":"A senha e a confirma\u00e7\u00e3o da senha devem coincidir.","OptionOff":"Desligado","OptionOn":"Ligado","OptionRelease":"Lan\u00e7amento Oficial","OptionBeta":"Beta","OptionDev":"Dev (Inst\u00e1vel)","UninstallPluginHeader":"Desinstalar extens\u00e3o","UninstallPluginConfirmation":"Tem a certeza que deseja desinstalar {0}?","NoPluginConfigurationMessage":"Esta extens\u00e3o n\u00e3o \u00e9 configur\u00e1vel.","NoPluginsInstalledMessage":"N\u00e3o tem extens\u00f5es instaladas.","BrowsePluginCatalogMessage":"Navegue o nosso cat\u00e1logo de extens\u00f5es, para ver as extens\u00f5es dispon\u00edveis."} {
"SettingsSaved": "Configura\u00e7\u00f5es guardadas.",
"AddUser": "Adicionar Utilizador",
"Users": "Utilizadores",
"Delete": "Apagar",
"Administrator": "Administrador",
"Password": "Senha",
"DeleteImage": "Apagar Imagem",
"DeleteImageConfirmation": "Tem a certeza que deseja apagar a imagem?",
"FileReadCancelled": "A leitura do ficheiro foi cancelada.",
"FileNotFound": "Ficheiro n\u00e3o encontrado.",
"FileReadError": "Ocorreu um erro ao ler o ficheiro.",
"DeleteUser": "Apagar Utilizador",
"DeleteUserConfirmation": "Tem a certeza que deseja apagar {0}?",
"PasswordResetHeader": "Redefinir Senha",
"PasswordResetComplete": "A senha foi redefinida.",
"PasswordResetConfirmation": "Tem a certeza que deseja redefinir a senha?",
"PasswordSaved": "Senha guardada.",
"PasswordMatchError": "A senha e a confirma\u00e7\u00e3o da senha devem coincidir.",
"OptionOff": "Desligado",
"OptionOn": "Ligado",
"OptionRelease": "Lan\u00e7amento Oficial",
"OptionBeta": "Beta",
"OptionDev": "Dev (Inst\u00e1vel)",
"UninstallPluginHeader": "Desinstalar extens\u00e3o",
"UninstallPluginConfirmation": "Tem a certeza que deseja desinstalar {0}?",
"NoPluginConfigurationMessage": "Esta extens\u00e3o n\u00e3o \u00e9 configur\u00e1vel.",
"NoPluginsInstalledMessage": "N\u00e3o tem extens\u00f5es instaladas.",
"BrowsePluginCatalogMessage": "Navegue o nosso cat\u00e1logo de extens\u00f5es, para ver as extens\u00f5es dispon\u00edveis."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b","AddUser":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f","Users":"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438","Delete":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c","Administrator":"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440","Password":"\u041f\u0430\u0440\u043e\u043b\u044c","DeleteImage":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043e\u043a","DeleteImageConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a?","FileReadCancelled":"\u0427\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0431\u044b\u043b\u043e \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e.","FileNotFound":"\u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d","FileReadError":"\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430","DeleteUser":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f","DeleteUserConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}?","PasswordResetHeader":"\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f","PasswordResetComplete":"\u041f\u0430\u0440\u043e\u043b\u044c \u0431\u044b\u043b \u0441\u0431\u0440\u043e\u0448\u0435\u043d","PasswordResetConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c?","PasswordSaved":"\u041f\u0430\u0440\u043e\u043b\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d","PasswordMatchError":"\u041f\u043e\u043b\u044f \u041f\u0430\u0440\u043e\u043b\u044c \u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c","OptionOff":"\u0412\u044b\u043a\u043b","OptionOn":"\u0412\u043a\u043b","OptionRelease":"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u043f\u0443\u0441\u043a","OptionBeta":"\u0411\u0435\u0442\u0430","OptionDev":"\u0420\u0430\u0437\u0440\u0430\u0431 (\u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e)","UninstallPluginHeader":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d","UninstallPluginConfirmation":"\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}?","NoPluginConfigurationMessage":"\u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0435\u0447\u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.","NoPluginsInstalledMessage":"\u0423 \u0412\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430.","BrowsePluginCatalogMessage":"\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430\u0448 \u043a\u0430\u0442\u0430\u043b\u043e\u0433, \u0447\u0442\u043e\u0431\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438."} {
"SettingsSaved": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b",
"AddUser": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
"Users": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438",
"Delete": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c",
"Administrator": "\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440",
"Password": "\u041f\u0430\u0440\u043e\u043b\u044c",
"DeleteImage": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043e\u043a",
"DeleteImageConfirmation": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0438\u0441\u0443\u043d\u043e\u043a?",
"FileReadCancelled": "\u0427\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0431\u044b\u043b\u043e \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e.",
"FileNotFound": "\u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d",
"FileReadError": "\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430",
"DeleteUser": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
"DeleteUserConfirmation": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}?",
"PasswordResetHeader": "\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f",
"PasswordResetComplete": "\u041f\u0430\u0440\u043e\u043b\u044c \u0431\u044b\u043b \u0441\u0431\u0440\u043e\u0448\u0435\u043d",
"PasswordResetConfirmation": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c?",
"PasswordSaved": "\u041f\u0430\u0440\u043e\u043b\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d",
"PasswordMatchError": "\u041f\u043e\u043b\u044f \u041f\u0430\u0440\u043e\u043b\u044c \u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c",
"OptionOff": "\u0412\u044b\u043a\u043b",
"OptionOn": "\u0412\u043a\u043b",
"OptionRelease": "\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u043f\u0443\u0441\u043a",
"OptionBeta": "\u0411\u0435\u0442\u0430",
"OptionDev": "\u0420\u0430\u0437\u0440\u0430\u0431 (\u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e)",
"UninstallPluginHeader": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d",
"UninstallPluginConfirmation": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}?",
"NoPluginConfigurationMessage": "\u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0435\u0447\u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.",
"NoPluginsInstalledMessage": "\u0423 \u0412\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430.",
"BrowsePluginCatalogMessage": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430\u0448 \u043a\u0430\u0442\u0430\u043b\u043e\u0433, \u0447\u0442\u043e\u0431\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"Inst\u00e4llningarna sparade.","AddUser":"Skapa anv\u00e4ndare","Users":"Anv\u00e4ndare","Delete":"Ta bort","Administrator":"Administrat\u00f6r","Password":"L\u00f6senord","DeleteImage":"Ta bort bild","DeleteImageConfirmation":"\u00c4r du s\u00e4ker p\u00e5 att du vill ta bort den h\u00e4r bilden?","FileReadCancelled":"Inl\u00e4sningen av filen har avbrutits.","FileNotFound":"Kan inte hitta filen.","FileReadError":"Ett fel intr\u00e4ffade vid inl\u00e4sningen av filen.","DeleteUser":"Ta bort anv\u00e4ndare","DeleteUserConfirmation":"\u00c4r du s\u00e4ker p\u00e5 att du vill ta bort {0}?","PasswordResetHeader":"\u00c5terst\u00e4ll l\u00f6senordet","PasswordResetComplete":"L\u00f6senordet har \u00e5terst\u00e4llts.","PasswordResetConfirmation":"\u00c4r du s\u00e4ker p\u00e5 att du vill \u00e5terst\u00e4lla l\u00f6senordet?","PasswordSaved":"L\u00f6senordet har sparats.","PasswordMatchError":"L\u00f6senordet och bekr\u00e4ftelsen m\u00e5ste \u00f6verensst\u00e4mma.","OptionOff":"Av","OptionOn":"P\u00e5","OptionRelease":"Officiell version","OptionBeta":"Betaversion","OptionDev":"Utvecklarversion (instabil)","UninstallPluginHeader":"Avinstallera till\u00e4gg","UninstallPluginConfirmation":"\u00c4r du s\u00e4ker p\u00e5 att du vill avinstallera {0}?","NoPluginConfigurationMessage":"Detta till\u00e4gg har inga inst\u00e4llningar.","NoPluginsInstalledMessage":"Du har inte installerat n\u00e5gra till\u00e4gg.","BrowsePluginCatalogMessage":"Bes\u00f6k katalogen f\u00f6r att se tillg\u00e4ngliga till\u00e4gg."} {
"SettingsSaved": "Inst\u00e4llningarna sparade.",
"AddUser": "Skapa anv\u00e4ndare",
"Users": "Anv\u00e4ndare",
"Delete": "Ta bort",
"Administrator": "Administrat\u00f6r",
"Password": "L\u00f6senord",
"DeleteImage": "Ta bort bild",
"DeleteImageConfirmation": "\u00c4r du s\u00e4ker p\u00e5 att du vill ta bort den h\u00e4r bilden?",
"FileReadCancelled": "Inl\u00e4sningen av filen har avbrutits.",
"FileNotFound": "Kan inte hitta filen.",
"FileReadError": "Ett fel intr\u00e4ffade vid inl\u00e4sningen av filen.",
"DeleteUser": "Ta bort anv\u00e4ndare",
"DeleteUserConfirmation": "\u00c4r du s\u00e4ker p\u00e5 att du vill ta bort {0}?",
"PasswordResetHeader": "\u00c5terst\u00e4ll l\u00f6senordet",
"PasswordResetComplete": "L\u00f6senordet har \u00e5terst\u00e4llts.",
"PasswordResetConfirmation": "\u00c4r du s\u00e4ker p\u00e5 att du vill \u00e5terst\u00e4lla l\u00f6senordet?",
"PasswordSaved": "L\u00f6senordet har sparats.",
"PasswordMatchError": "L\u00f6senordet och bekr\u00e4ftelsen m\u00e5ste \u00f6verensst\u00e4mma.",
"OptionOff": "Av",
"OptionOn": "P\u00e5",
"OptionRelease": "Officiell version",
"OptionBeta": "Betaversion",
"OptionDev": "Utvecklarversion (instabil)",
"UninstallPluginHeader": "Avinstallera till\u00e4gg",
"UninstallPluginConfirmation": "\u00c4r du s\u00e4ker p\u00e5 att du vill avinstallera {0}?",
"NoPluginConfigurationMessage": "Detta till\u00e4gg har inga inst\u00e4llningar.",
"NoPluginsInstalledMessage": "Du har inte installerat n\u00e5gra till\u00e4gg.",
"BrowsePluginCatalogMessage": "Bes\u00f6k katalogen f\u00f6r att se tillg\u00e4ngliga till\u00e4gg."
}

View File

@ -1 +1,30 @@
{"SettingsSaved":"\u8a2d\u7f6e\u5df2\u4fdd\u5b58\u3002","AddUser":"\u6dfb\u52a0\u7528\u6236","Users":"\u7528\u6236","Delete":"\u522a\u9664","Administrator":"\u7ba1\u7406\u54e1","Password":"\u5bc6\u78bc","DeleteImage":"\u522a\u9664\u5716\u50cf","DeleteImageConfirmation":"\u4f60\u78ba\u5b9a\u8981\u522a\u9664\u9019\u5f35\u5716\u50cf\uff1f","FileReadCancelled":"\u6a94\u6848\u8b80\u53d6\u5df2\u88ab\u53d6\u6d88\u3002","FileNotFound":"\u672a\u627e\u5230\u6a94\u6848\u3002","FileReadError":"\u5728\u8b80\u53d6\u6a94\u6848\u6642\u767c\u751f\u932f\u8aa4\u3002","DeleteUser":"\u522a\u9664\u7528\u6236","DeleteUserConfirmation":"\u4f60\u78ba\u5b9a\u8981\u522a\u9664{0}\uff1f","PasswordResetHeader":"\u91cd\u8a2d\u5bc6\u78bc","PasswordResetComplete":"\u5bc6\u78bc\u5df2\u91cd\u8a2d","PasswordResetConfirmation":"\u4f60\u78ba\u5b9a\u8981\u91cd\u8a2d\u5bc6\u78bc\uff1f","PasswordSaved":"\u5bc6\u78bc\u5df2\u4fdd\u5b58\u3002","PasswordMatchError":"\u5bc6\u78bc\u548c\u5bc6\u78bc\u78ba\u8a8d\u5fc5\u9808\u4e00\u81f4\u3002","OptionOff":"\u95dc\u9589","OptionOn":"\u958b\u555f","OptionRelease":"\u6b63\u5f0f\u7248\u672c","OptionBeta":"\u516c\u6e2c\u7248\u672c","OptionDev":"\u958b\u767c\u7248\u672c","UninstallPluginHeader":"\u5378\u8f09\u63d2\u4ef6","UninstallPluginConfirmation":"\u4f60\u78ba\u5b9a\u8981\u5378\u8f09{0}\uff1f","NoPluginConfigurationMessage":"\u9019\u500b\u63d2\u4ef6\u6c92\u6709\u8a2d\u5b9a\u9078\u9805\u3002","NoPluginsInstalledMessage":"\u4f60\u6c92\u6709\u5b89\u88dd\u63d2\u4ef6\u3002","BrowsePluginCatalogMessage":"\u700f\u89bd\u6211\u5011\u7684\u63d2\u4ef6\u76ee\u9304\u4f86\u67e5\u770b\u53ef\u7528\u7684\u63d2\u4ef6\u3002"} {
"SettingsSaved": "\u8a2d\u7f6e\u5df2\u4fdd\u5b58\u3002",
"AddUser": "\u6dfb\u52a0\u7528\u6236",
"Users": "\u7528\u6236",
"Delete": "\u522a\u9664",
"Administrator": "\u7ba1\u7406\u54e1",
"Password": "\u5bc6\u78bc",
"DeleteImage": "\u522a\u9664\u5716\u50cf",
"DeleteImageConfirmation": "\u4f60\u78ba\u5b9a\u8981\u522a\u9664\u9019\u5f35\u5716\u50cf\uff1f",
"FileReadCancelled": "\u6a94\u6848\u8b80\u53d6\u5df2\u88ab\u53d6\u6d88\u3002",
"FileNotFound": "\u672a\u627e\u5230\u6a94\u6848\u3002",
"FileReadError": "\u5728\u8b80\u53d6\u6a94\u6848\u6642\u767c\u751f\u932f\u8aa4\u3002",
"DeleteUser": "\u522a\u9664\u7528\u6236",
"DeleteUserConfirmation": "\u4f60\u78ba\u5b9a\u8981\u522a\u9664{0}\uff1f",
"PasswordResetHeader": "\u91cd\u8a2d\u5bc6\u78bc",
"PasswordResetComplete": "\u5bc6\u78bc\u5df2\u91cd\u8a2d",
"PasswordResetConfirmation": "\u4f60\u78ba\u5b9a\u8981\u91cd\u8a2d\u5bc6\u78bc\uff1f",
"PasswordSaved": "\u5bc6\u78bc\u5df2\u4fdd\u5b58\u3002",
"PasswordMatchError": "\u5bc6\u78bc\u548c\u5bc6\u78bc\u78ba\u8a8d\u5fc5\u9808\u4e00\u81f4\u3002",
"OptionOff": "\u95dc\u9589",
"OptionOn": "\u958b\u555f",
"OptionRelease": "\u6b63\u5f0f\u7248\u672c",
"OptionBeta": "\u516c\u6e2c\u7248\u672c",
"OptionDev": "\u958b\u767c\u7248\u672c",
"UninstallPluginHeader": "\u5378\u8f09\u63d2\u4ef6",
"UninstallPluginConfirmation": "\u4f60\u78ba\u5b9a\u8981\u5378\u8f09{0}\uff1f",
"NoPluginConfigurationMessage": "\u9019\u500b\u63d2\u4ef6\u6c92\u6709\u8a2d\u5b9a\u9078\u9805\u3002",
"NoPluginsInstalledMessage": "\u4f60\u6c92\u6709\u5b89\u88dd\u63d2\u4ef6\u3002",
"BrowsePluginCatalogMessage": "\u700f\u89bd\u6211\u5011\u7684\u63d2\u4ef6\u76ee\u9304\u4f86\u67e5\u770b\u53ef\u7528\u7684\u63d2\u4ef6\u3002"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -543,5 +543,7 @@
"LabelBlastMessageInterval": "Alive message interval (seconds)", "LabelBlastMessageInterval": "Alive message interval (seconds)",
"LabelBlastMessageIntervalHelp": "Determines the duration in seconds between server alive messages.", "LabelBlastMessageIntervalHelp": "Determines the duration in seconds between server alive messages.",
"LabelDefaultUser": "Default user:", "LabelDefaultUser": "Default user:",
"LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles." "LabelDefaultUserHelp": "Determines which user library should be displayed on connected devices. This can be overridden for each device using profiles.",
"TitleDlna": "DLNA",
"HeaderServerSettings": "Server Settings"
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -153,7 +153,8 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder
{ {
if (extractImages) if (extractImages)
{ {
if (video.VideoType == VideoType.HdDvd || video.VideoType == VideoType.Iso) if (video.VideoType == VideoType.HdDvd || video.VideoType == VideoType.Iso ||
video.VideoType == VideoType.BluRay)
{ {
continue; continue;
} }

View File

@ -282,14 +282,13 @@ namespace MediaBrowser.Server.Implementations.Session
info.Item = GetItemInfo(libraryItem, runtimeTicks); info.Item = GetItemInfo(libraryItem, runtimeTicks);
} }
session.PlayState.IsPaused = info.IsPaused;
session.PlayState.PositionTicks = info.PositionTicks;
session.NowPlayingItem = info.Item; session.NowPlayingItem = info.Item;
session.LastActivityDate = DateTime.UtcNow; session.LastActivityDate = DateTime.UtcNow;
session.PlayState.IsPaused = info.IsPaused;
session.PlayState.PositionTicks = info.PositionTicks;
session.PlayState.MediaSourceId = info.MediaSourceId; session.PlayState.MediaSourceId = info.MediaSourceId;
session.PlayState.CanSeek = info.CanSeek; session.PlayState.CanSeek = info.CanSeek;
session.PlayState.IsMuted = info.IsMuted; session.PlayState.IsMuted = info.IsMuted;
session.PlayState.VolumeLevel = info.VolumeLevel; session.PlayState.VolumeLevel = info.VolumeLevel;
session.PlayState.AudioStreamIndex = info.AudioStreamIndex; session.PlayState.AudioStreamIndex = info.AudioStreamIndex;