beginning dlna server

pull/702/head
Luke Pulverenti 10 years ago
parent f657e2981c
commit 3094868a83

@ -0,0 +1,89 @@
using MediaBrowser.Controller.Dlna;
using ServiceStack;
using ServiceStack.Web;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace MediaBrowser.Api.Dlna
{
[Route("/Dlna/{UuId}/description.xml", "GET", Summary = "Gets dlna server info")]
[Route("/Dlna/{UuId}/description", "GET", Summary = "Gets dlna server info")]
public class GetDescriptionXml
{
[ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
public string UuId { get; set; }
}
[Route("/Dlna/{UuId}/contentdirectory.xml", "GET", Summary = "Gets dlna content directory xml")]
[Route("/Dlna/{UuId}/contentdirectory", "GET", Summary = "Gets the content directory xml")]
public class GetContentDirectory
{
[ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
public string UuId { get; set; }
}
[Route("/Dlna/{UuId}/control", "POST", Summary = "Processes a control request")]
public class ProcessControlRequest : IRequiresRequestStream
{
[ApiMember(Name = "UuId", Description = "Server UuId", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
public string UuId { get; set; }
public Stream RequestStream { get; set; }
}
public class DlnaServerService : BaseApiService
{
private readonly IDlnaManager _dlnaManager;
public DlnaServerService(IDlnaManager dlnaManager)
{
_dlnaManager = dlnaManager;
}
public object Get(GetDescriptionXml request)
{
var xml = _dlnaManager.GetServerDescriptionXml(GetRequestHeaders(), request.UuId);
return ResultFactory.GetResult(xml, "text/xml");
}
public object Get(GetContentDirectory request)
{
var xml = _dlnaManager.GetContentDirectoryXml(GetRequestHeaders());
return ResultFactory.GetResult(xml, "text/xml");
}
public object Post(ProcessControlRequest request)
{
var response = PostAsync(request).Result;
return ResultFactory.GetResult(response.Xml, "text/xml");
}
private async Task<ControlResponse> PostAsync(ProcessControlRequest request)
{
using (var reader = new StreamReader(request.RequestStream))
{
return _dlnaManager.ProcessControlRequest(new ControlRequest
{
Headers = GetRequestHeaders(),
InputXml = await reader.ReadToEndAsync().ConfigureAwait(false)
});
}
}
private IDictionary<string, string> GetRequestHeaders()
{
var headers = new Dictionary<string, string>();
foreach (var key in Request.Headers.AllKeys)
{
headers[key] = Request.Headers[key];
}
return headers;
}
}
}

@ -4,7 +4,7 @@ using ServiceStack;
using System.Collections.Generic;
using System.Linq;
namespace MediaBrowser.Api
namespace MediaBrowser.Api.Dlna
{
[Route("/Dlna/ProfileInfos", "GET", Summary = "Gets a list of profiles")]
public class GetProfileInfos : IReturn<List<DeviceProfileInfo>>

@ -66,7 +66,8 @@
<Link>Properties\SharedVersion.cs</Link>
</Compile>
<Compile Include="ChannelService.cs" />
<Compile Include="DlnaService.cs" />
<Compile Include="Dlna\DlnaServerService.cs" />
<Compile Include="Dlna\DlnaService.cs" />
<Compile Include="Movies\CollectionService.cs" />
<Compile Include="Music\AlbumsService.cs" />
<Compile Include="AppThemeService.cs" />

@ -1341,6 +1341,12 @@ namespace MediaBrowser.Api.Playback
RequestedUrl = url
};
if (!string.IsNullOrWhiteSpace(request.AudioCodec))
{
state.SupportedAudioCodecs = request.AudioCodec.Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
state.Request.AudioCodec = state.SupportedAudioCodecs.FirstOrDefault();
}
var item = string.IsNullOrEmpty(request.MediaSourceId) ?
DtoService.GetItemByDtoId(request.Id) :
DtoService.GetItemByDtoId(request.MediaSourceId);
@ -1492,10 +1498,10 @@ namespace MediaBrowser.Api.Playback
videoRequest.VideoCodec = "copy";
}
//if (state.AudioStream != null && CanStreamCopyAudio(request, state.AudioStream))
//{
// request.AudioCodec = "copy";
//}
if (state.AudioStream != null && CanStreamCopyAudio(request, state.AudioStream, state.SupportedAudioCodecs))
{
request.AudioCodec = "copy";
}
}
return state;
@ -1587,10 +1593,10 @@ namespace MediaBrowser.Api.Playback
return SupportsAutomaticVideoStreamCopy;
}
private bool CanStreamCopyAudio(StreamRequest request, MediaStream audioStream)
private bool CanStreamCopyAudio(StreamRequest request, MediaStream audioStream, List<string> supportedAudioCodecs)
{
// Source and target codecs must match
if (string.IsNullOrEmpty(request.AudioCodec) || !string.Equals(request.AudioCodec, audioStream.Codec, StringComparison.OrdinalIgnoreCase))
if (string.IsNullOrEmpty(audioStream.Codec) || !supportedAudioCodecs.Contains(audioStream.Codec, StringComparer.OrdinalIgnoreCase))
{
return false;
}
@ -1623,7 +1629,7 @@ namespace MediaBrowser.Api.Playback
}
}
return SupportsAutomaticVideoStreamCopy;
return true;
}
protected virtual bool SupportsAutomaticVideoStreamCopy

@ -67,10 +67,13 @@ namespace MediaBrowser.Api.Playback
public string AudioSync = "1";
public string VideoSync = "vfr";
public List<string> SupportedAudioCodecs { get; set; }
public StreamState(ILiveTvManager liveTvManager, ILogger logger)
{
_liveTvManager = liveTvManager;
_logger = logger;
SupportedAudioCodecs = new List<string>();
}
public string InputAudioSync { get; set; }

@ -15,6 +15,44 @@ namespace MediaBrowser.Common.Implementations.Networking
/// </summary>
/// <returns>IPAddress.</returns>
public IEnumerable<string> GetLocalIpAddresses()
{
var list = GetIPsDefault().Where(i => !IPAddress.IsLoopback(i)).Select(i => i.ToString()).ToList();
if (list.Count > 0)
{
return list;
}
return GetLocalIpAddressesFallback();
}
private IEnumerable<IPAddress> GetIPsDefault()
{
foreach (var adapter in NetworkInterface.GetAllNetworkInterfaces())
{
var props = adapter.GetIPProperties();
var gateways = from ga in props.GatewayAddresses
where !ga.Address.Equals(IPAddress.Any)
select true;
if (!gateways.Any())
{
continue;
}
foreach (var uni in props.UnicastAddresses)
{
var address = uni.Address;
if (address.AddressFamily != AddressFamily.InterNetwork)
{
continue;
}
yield return address;
}
}
}
private IEnumerable<string> GetLocalIpAddressesFallback()
{
var host = Dns.GetHostEntry(Dns.GetHostName());
@ -25,7 +63,7 @@ namespace MediaBrowser.Common.Implementations.Networking
.Select(i => i.ToString())
.Reverse();
}
/// <summary>
/// Gets a random port number that is currently available
/// </summary>
@ -50,6 +88,7 @@ namespace MediaBrowser.Common.Implementations.Networking
.Select(i => BitConverter.ToString(i.GetPhysicalAddress().GetAddressBytes()))
.FirstOrDefault();
}
/// <summary>
/// Parses the specified endpointstring.
/// </summary>

@ -0,0 +1,28 @@
using System.Collections.Generic;
namespace MediaBrowser.Controller.Dlna
{
public class ControlRequest
{
public IDictionary<string, string> Headers { get; set; }
public string InputXml { get; set; }
public ControlRequest()
{
Headers = new Dictionary<string, string>();
}
}
public class ControlResponse
{
public IDictionary<string, string> Headers { get; set; }
public string Xml { get; set; }
public ControlResponse()
{
Headers = new Dictionary<string, string>();
}
}
}

@ -55,5 +55,27 @@ namespace MediaBrowser.Controller.Dlna
/// <param name="deviceInfo">The device information.</param>
/// <returns>DeviceProfile.</returns>
DeviceProfile GetProfile(DeviceIdentification deviceInfo);
/// <summary>
/// Gets the server description XML.
/// </summary>
/// <param name="headers">The headers.</param>
/// <param name="serverUuId">The server uu identifier.</param>
/// <returns>System.String.</returns>
string GetServerDescriptionXml(IDictionary<string, string> headers, string serverUuId);
/// <summary>
/// Gets the content directory XML.
/// </summary>
/// <param name="headers">The headers.</param>
/// <returns>System.String.</returns>
string GetContentDirectoryXml(IDictionary<string, string> headers);
/// <summary>
/// Processes the control request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>ControlResponse.</returns>
ControlResponse ProcessControlRequest(ControlRequest request);
}
}

@ -1,4 +1,6 @@

using MediaBrowser.Model.Entities;
using System.Collections.Generic;
namespace MediaBrowser.Controller.LiveTv
{
public class LiveStreamInfo
@ -20,5 +22,22 @@ namespace MediaBrowser.Controller.LiveTv
/// </summary>
/// <value>The identifier.</value>
public string Id { get; set; }
/// <summary>
/// Gets or sets the media container.
/// </summary>
/// <value>The media container.</value>
public string MediaContainer { get; set; }
/// <summary>
/// Gets or sets the media streams.
/// </summary>
/// <value>The media streams.</value>
public List<MediaStream> MediaStreams { get; set; }
public LiveStreamInfo()
{
MediaStreams = new List<MediaStream>();
}
}
}

@ -78,6 +78,7 @@
<Compile Include="Channels\Channel.cs" />
<Compile Include="Collections\CollectionCreationOptions.cs" />
<Compile Include="Collections\ICollectionManager.cs" />
<Compile Include="Dlna\ControlRequest.cs" />
<Compile Include="Dlna\IDlnaManager.cs" />
<Compile Include="Drawing\IImageProcessor.cs" />
<Compile Include="Drawing\ImageFormat.cs" />

@ -0,0 +1,12 @@

namespace MediaBrowser.Dlna.Common
{
public class Argument
{
public string Name { get; set; }
public string Direction { get; set; }
public string RelatedStateVariable { get; set; }
}
}

@ -1,5 +1,5 @@

namespace MediaBrowser.Dlna.PlayTo
namespace MediaBrowser.Dlna.Common
{
public class DeviceIcon
{

@ -1,5 +1,5 @@

namespace MediaBrowser.Dlna.PlayTo
namespace MediaBrowser.Dlna.Common
{
public class DeviceService
{
@ -13,15 +13,6 @@ namespace MediaBrowser.Dlna.PlayTo
public string EventSubUrl { get; set; }
public DeviceService(string serviceType, string serviceId, string scpdUrl, string controlUrl, string eventSubUrl)
{
ServiceType = serviceType;
ServiceId = serviceId;
ScpdUrl = scpdUrl;
ControlUrl = controlUrl;
EventSubUrl = eventSubUrl;
}
public override string ToString()
{
return string.Format("{0}", ServiceId);

@ -0,0 +1,21 @@
using System.Collections.Generic;
namespace MediaBrowser.Dlna.Common
{
public class ServiceAction
{
public string Name { get; set; }
public List<Argument> ArgumentList { get; set; }
public override string ToString()
{
return Name;
}
public ServiceAction()
{
ArgumentList = new List<Argument>();
}
}
}

@ -0,0 +1,25 @@
using System.Collections.Generic;
namespace MediaBrowser.Dlna.Common
{
public class StateVariable
{
public string Name { get; set; }
public string DataType { get; set; }
public bool SendsEvents { get; set; }
public List<string> AllowedValues { get; set; }
public override string ToString()
{
return Name;
}
public StateVariable()
{
AllowedValues = new List<string>();
}
}
}

@ -1,9 +1,9 @@
using System.Text;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Dlna.Profiles;
using MediaBrowser.Dlna.Server;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
@ -11,6 +11,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace MediaBrowser.Dlna
@ -476,5 +477,26 @@ namespace MediaBrowser.Dlna
internal DeviceProfileInfo Info { get; set; }
internal string Path { get; set; }
}
public string GetServerDescriptionXml(IDictionary<string, string> headers, string serverUuId)
{
var profile = GetProfile(headers) ??
GetDefaultProfile();
return new DescriptionXmlBuilder(profile, serverUuId).GetXml();
}
public string GetContentDirectoryXml(IDictionary<string, string> headers)
{
var profile = GetProfile(headers) ??
GetDefaultProfile();
return new ContentDirectoryXmlBuilder(profile).GetXml();
}
public ControlResponse ProcessControlRequest(ControlRequest request)
{
return new ControlHandler(_logger).ProcessControlRequest(request);
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -52,13 +52,13 @@
<Link>Properties\SharedVersion.cs</Link>
</Compile>
<Compile Include="DlnaManager.cs" />
<Compile Include="PlayTo\Argument.cs" />
<Compile Include="Common\Argument.cs" />
<Compile Include="PlayTo\CurrentIdEventArgs.cs" />
<Compile Include="PlayTo\Device.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="PlayTo\DeviceInfo.cs" />
<Compile Include="PlayTo\DeviceService.cs" />
<Compile Include="Common\DeviceService.cs" />
<Compile Include="PlayTo\DidlBuilder.cs" />
<Compile Include="PlayTo\DlnaController.cs" />
<Compile Include="PlayTo\Extensions.cs" />
@ -68,20 +68,25 @@
<Compile Include="PlayTo\PlaylistItemFactory.cs" />
<Compile Include="PlayTo\PlayToManager.cs" />
<Compile Include="PlayTo\PlayToServerEntryPoint.cs" />
<Compile Include="PlayTo\ServiceAction.cs" />
<Compile Include="Common\ServiceAction.cs" />
<Compile Include="Profiles\Foobar2000Profile.cs" />
<Compile Include="Profiles\Windows81Profile.cs" />
<Compile Include="Profiles\WindowsMediaCenterProfile.cs" />
<Compile Include="Profiles\WindowsPhoneProfile.cs" />
<Compile Include="Server\ControlHandler.cs" />
<Compile Include="Server\ServiceActionListBuilder.cs" />
<Compile Include="Server\ContentDirectoryXmlBuilder.cs" />
<Compile Include="Server\Datagram.cs" />
<Compile Include="Server\DescriptionXmlBuilder.cs" />
<Compile Include="Ssdp\SsdpHelper.cs" />
<Compile Include="PlayTo\SsdpHttpClient.cs" />
<Compile Include="PlayTo\StateVariable.cs" />
<Compile Include="Common\StateVariable.cs" />
<Compile Include="PlayTo\StreamHelper.cs" />
<Compile Include="PlayTo\TransportCommands.cs" />
<Compile Include="PlayTo\TransportStateEventArgs.cs" />
<Compile Include="PlayTo\uBaseObject.cs" />
<Compile Include="PlayTo\uContainer.cs" />
<Compile Include="PlayTo\DeviceIcon.cs" />
<Compile Include="Common\DeviceIcon.cs" />
<Compile Include="PlayTo\uParser.cs" />
<Compile Include="PlayTo\uPnpNamespaces.cs" />
<Compile Include="Profiles\DefaultProfile.cs" />
@ -141,6 +146,12 @@
<ItemGroup>
<EmbeddedResource Include="Profiles\Xml\Default.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Images\logo-120.jpg" />
<EmbeddedResource Include="Images\logo-120.png" />
<EmbeddedResource Include="Images\logo-48.jpg" />
<EmbeddedResource Include="Images\logo-48.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

@ -1,29 +0,0 @@
using System;
using System.Xml.Linq;
namespace MediaBrowser.Dlna.PlayTo
{
public class Argument
{
public string Name { get; set; }
public string Direction { get; set; }
public string RelatedStateVariable { get; set; }
public static Argument FromXml(XElement container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
return new Argument
{
Name = container.GetValue(uPnpNamespaces.svc + "name"),
Direction = container.GetValue(uPnpNamespaces.svc + "direction"),
RelatedStateVariable = container.GetValue(uPnpNamespaces.svc + "relatedStateVariable")
};
}
}
}

@ -1,9 +1,10 @@
using System.Globalization;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Dlna.Common;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@ -575,7 +576,7 @@ namespace MediaBrowser.Dlna.PlayTo
return false;
}
var trackString = (string) track;
var trackString = (string)track;
if (string.IsNullOrWhiteSpace(trackString) || string.Equals(trackString, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase))
{
@ -583,7 +584,7 @@ namespace MediaBrowser.Dlna.PlayTo
}
XElement uPnpResponse;
try
{
uPnpResponse = XElement.Parse(trackString);
@ -838,7 +839,14 @@ namespace MediaBrowser.Dlna.PlayTo
var controlURL = element.GetDescendantValue(uPnpNamespaces.ud.GetName("controlURL"));
var eventSubURL = element.GetDescendantValue(uPnpNamespaces.ud.GetName("eventSubURL"));
return new DeviceService(type, id, scpdUrl, controlURL, eventSubURL);
return new DeviceService
{
ControlUrl = controlURL,
EventSubUrl = eventSubURL,
ScpdUrl = scpdUrl,
ServiceId = id,
ServiceType = type
};
}
#region Events

@ -1,6 +1,6 @@
using MediaBrowser.Controller.Dlna;
using System.Collections.Generic;
using MediaBrowser.Dlna.Common;
using MediaBrowser.Model.Dlna;
using System.Collections.Generic;
namespace MediaBrowser.Dlna.PlayTo
{

@ -1,34 +0,0 @@
using System.Collections.Generic;
using System.Xml.Linq;
namespace MediaBrowser.Dlna.PlayTo
{
public class ServiceAction
{
public string Name { get; set; }
public List<Argument> ArgumentList { get; set; }
public override string ToString()
{
return Name;
}
public static ServiceAction FromXml(XElement container)
{
var argumentList = new List<Argument>();
foreach (var arg in container.Descendants(uPnpNamespaces.svc + "argument"))
{
argumentList.Add(Argument.FromXml(arg));
}
return new ServiceAction
{
Name = container.GetValue(uPnpNamespaces.svc + "name"),
ArgumentList = argumentList
};
}
}
}

@ -1,5 +1,6 @@
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Dlna.Common;
using System;
using System.Globalization;
using System.IO;

@ -1,52 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace MediaBrowser.Dlna.PlayTo
{
public class StateVariable
{
public string Name { get; set; }
public string DataType { get; set; }
private List<string> _allowedValues = new List<string>();
public List<string> AllowedValues
{
get
{
return _allowedValues;
}
set
{
_allowedValues = value;
}
}
public override string ToString()
{
return Name;
}
public static StateVariable FromXml(XElement container)
{
var allowedValues = new List<string>();
var element = container.Descendants(uPnpNamespaces.svc + "allowedValueList")
.FirstOrDefault();
if (element != null)
{
var values = element.Descendants(uPnpNamespaces.svc + "allowedValue");
allowedValues.AddRange(values.Select(child => child.Value));
}
return new StateVariable
{
Name = container.GetValue(uPnpNamespaces.svc + "name"),
DataType = container.GetValue(uPnpNamespaces.svc + "dataType"),
AllowedValues = allowedValues
};
}
}
}

@ -1,4 +1,6 @@
using System.Collections.Generic;
using System;
using MediaBrowser.Dlna.Common;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
@ -40,7 +42,7 @@ namespace MediaBrowser.Dlna.PlayTo
foreach (var container in actionList.Descendants(uPnpNamespaces.svc + "action"))
{
command.ServiceActions.Add(ServiceAction.FromXml(container));
command.ServiceActions.Add(ServiceActionFromXml(container));
}
var stateValues = document.Descendants(uPnpNamespaces.ServiceStateTable).FirstOrDefault();
@ -49,13 +51,66 @@ namespace MediaBrowser.Dlna.PlayTo
{
foreach (var container in stateValues.Elements(uPnpNamespaces.svc + "stateVariable"))
{
command.StateVariables.Add(StateVariable.FromXml(container));
command.StateVariables.Add(FromXml(container));
}
}
return command;
}
private static ServiceAction ServiceActionFromXml(XElement container)
{
var argumentList = new List<Argument>();
foreach (var arg in container.Descendants(uPnpNamespaces.svc + "argument"))
{
argumentList.Add(ArgumentFromXml(arg));
}
return new ServiceAction
{
Name = container.GetValue(uPnpNamespaces.svc + "name"),
ArgumentList = argumentList
};
}
private static Argument ArgumentFromXml(XElement container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
return new Argument
{
Name = container.GetValue(uPnpNamespaces.svc + "name"),
Direction = container.GetValue(uPnpNamespaces.svc + "direction"),
RelatedStateVariable = container.GetValue(uPnpNamespaces.svc + "relatedStateVariable")
};
}
public static StateVariable FromXml(XElement container)
{
var allowedValues = new List<string>();
var element = container.Descendants(uPnpNamespaces.svc + "allowedValueList")
.FirstOrDefault();
if (element != null)
{
var values = element.Descendants(uPnpNamespaces.svc + "allowedValue");
allowedValues.AddRange(values.Select(child => child.Value));
}
return new StateVariable
{
Name = container.GetValue(uPnpNamespaces.svc + "name"),
DataType = container.GetValue(uPnpNamespaces.svc + "dataType"),
AllowedValues = allowedValues
};
}
public string BuildPost(ServiceAction action, string xmlNamespace)
{
var stateString = string.Empty;

@ -0,0 +1,235 @@
using MediaBrowser.Dlna.Common;
using MediaBrowser.Model.Dlna;
using System.Collections.Generic;
using System.Security;
using System.Text;
namespace MediaBrowser.Dlna.Server
{
public class ContentDirectoryXmlBuilder
{
private readonly DeviceProfile _profile;
public ContentDirectoryXmlBuilder(DeviceProfile profile)
{
_profile = profile;
}
public string GetXml()
{
var builder = new StringBuilder();
builder.Append("<?xml version=\"1.0\"?>");
builder.Append("scpd xmlns=\"urn:schemas-upnp-org:service-1-0\"");
builder.Append("<specVersion>");
builder.Append("<major>1</major>");
builder.Append("<minor>0</minor>");
builder.Append("</specVersion>");
AppendActionList(builder);
AppendServiceStateTable(builder);
builder.Append("</scpd>");
return builder.ToString();
}
private void AppendActionList(StringBuilder builder)
{
builder.Append("<actionList>");
foreach (var item in new ServiceActionListBuilder().GetActions())
{
builder.Append("<action>");
builder.Append("<name>" + SecurityElement.Escape(item.Name ?? string.Empty) + "</name>");
builder.Append("<argumentList>");
foreach (var argument in item.ArgumentList)
{
builder.Append("<argument>");
builder.Append("<name>" + SecurityElement.Escape(argument.Name ?? string.Empty) + "</name>");
builder.Append("<direction>" + SecurityElement.Escape(argument.Direction ?? string.Empty) + "</direction>");
builder.Append("<relatedStateVariable>" + SecurityElement.Escape(argument.RelatedStateVariable ?? string.Empty) + "</relatedStateVariable>");
builder.Append("</argument>");
}
builder.Append("</argumentList>");
builder.Append("</action>");
}
builder.Append("</actionList>");
}
private void AppendServiceStateTable(StringBuilder builder)
{
builder.Append("<serviceStateTable>");
foreach (var item in GetStateVariables())
{
var sendEvents = item.SendsEvents ? "yes" : "no";
builder.Append("<stateVariable sendEvents=\"" + sendEvents + "\">");
builder.Append("<name>" + SecurityElement.Escape(item.Name ?? string.Empty) + "</name>");
builder.Append("<dataType>" + SecurityElement.Escape(item.DataType ?? string.Empty) + "</dataType>");
if (item.AllowedValues.Count > 0)
{
builder.Append("<allowedValueList>");
foreach (var allowedValue in item.AllowedValues)
{
builder.Append("<allowedValue>" + SecurityElement.Escape(allowedValue) + "</allowedValue>");
}
builder.Append("</allowedValueList>");
}
builder.Append("</stateVariable>");
}
builder.Append("</serviceStateTable>");
}
private IEnumerable<StateVariable> GetStateVariables()
{
var list = new List<StateVariable>();
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_SortCriteria",
DataType = "string",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_UpdateID",
DataType = "ui4",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_SearchCriteria",
DataType = "string",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_Filter",
DataType = "string",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_Result",
DataType = "string",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_Index",
DataType = "ui4",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_ObjectID",
DataType = "string",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "SortCapabilities",
DataType = "string",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "SearchCapabilities",
DataType = "string",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_Count",
DataType = "ui4",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_BrowseFlag",
DataType = "string",
SendsEvents = false,
AllowedValues = new List<string>
{
"BrowseMetadata",
"BrowseDirectChildren"
}
});
list.Add(new StateVariable
{
Name = "SystemUpdateID",
DataType = "ui4",
SendsEvents = true
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_BrowseLetter",
DataType = "string",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_CategoryType",
DataType = "ui4",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_RID",
DataType = "ui4",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_PosSec",
DataType = "ui4",
SendsEvents = false
});
list.Add(new StateVariable
{
Name = "A_ARG_TYPE_Featurelist",
DataType = "string",
SendsEvents = false
});
return list;
}
public override string ToString()
{
return GetXml();
}
}
}

@ -0,0 +1,190 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace MediaBrowser.Dlna.Server
{
public class ControlHandler
{
private readonly ILogger _logger;
private const string NS_DC = "http://purl.org/dc/elements/1.1/";
private const string NS_DIDL = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/";
private const string NS_DLNA = "urn:schemas-dlna-org:metadata-1-0/";
private const string NS_SEC = "http://www.sec.co.kr/";
private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/";
private const string NS_UPNP = "urn:schemas-upnp-org:metadata-1-0/upnp/";
private const int systemID = 0;
public ControlHandler(ILogger logger)
{
_logger = logger;
}
public ControlResponse ProcessControlRequest(ControlRequest request)
{
var soap = new XmlDocument();
soap.LoadXml(request.InputXml);
var sparams = new Headers();
var body = soap.GetElementsByTagName("Body", NS_SOAPENV).Item(0);
var method = body.FirstChild;
foreach (var p in method.ChildNodes)
{
var e = p as XmlElement;
if (e == null)
{
continue;
}
sparams.Add(e.LocalName, e.InnerText.Trim());
}
var env = new XmlDocument();
env.AppendChild(env.CreateXmlDeclaration("1.0", "utf-8", "yes"));
var envelope = env.CreateElement("SOAP-ENV", "Envelope", NS_SOAPENV);
env.AppendChild(envelope);
envelope.SetAttribute("encodingStyle", NS_SOAPENV, "http://schemas.xmlsoap.org/soap/encoding/");
var rbody = env.CreateElement("SOAP-ENV:Body", NS_SOAPENV);
env.DocumentElement.AppendChild(rbody);
IEnumerable<KeyValuePair<string, string>> result;
switch (method.LocalName)
{
case "GetSearchCapabilities":
result = HandleGetSearchCapabilities();
break;
case "GetSortCapabilities":
result = HandleGetSortCapabilities();
break;
case "GetSystemUpdateID":
result = HandleGetSystemUpdateID();
break;
case "Browse":
result = HandleBrowse(sparams);
break;
case "X_GetFeatureList":
result = HandleXGetFeatureList();
break;
case "X_SetBookmark":
result = HandleXSetBookmark(sparams);
break;
default:
throw new ResourceNotFoundException();
}
var response = env.CreateElement(String.Format("u:{0}Response", method.LocalName), method.NamespaceURI);
rbody.AppendChild(response);
foreach (var i in result)
{
var ri = env.CreateElement(i.Key);
ri.InnerText = i.Value;
response.AppendChild(ri);
}
var controlResponse = new ControlResponse
{
Xml = env.OuterXml
};
controlResponse.Headers.Add("EXT", string.Empty);
return controlResponse;
}
private Headers HandleXSetBookmark(Headers sparams)
{
var id = sparams["ObjectID"];
//var item = GetItem(id) as IBookmarkable;
//if (item != null)
//{
// var newbookmark = long.Parse(sparams["PosSecond"]);
// if (newbookmark > 30)
// {
// newbookmark -= 5;
// }
// if (newbookmark > 30 || !item.Bookmark.HasValue || item.Bookmark.Value < 60)
// {
// item.Bookmark = newbookmark;
// }
//}
return new Headers();
}
private Headers HandleGetSearchCapabilities()
{
return new Headers { { "SearchCaps", string.Empty } };
}
private Headers HandleGetSortCapabilities()
{
return new Headers { { "SortCaps", string.Empty } };
}
private Headers HandleGetSystemUpdateID()
{
return new Headers { { "Id", systemID.ToString() } };
}
private Headers HandleXGetFeatureList()
{
return new Headers { { "FeatureList", GetFeatureListXml() } };
}
private string GetFeatureListXml()
{
var builder = new StringBuilder();
builder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
builder.Append("<Features xmlns=\"urn:schemas-upnp-org:av:avs\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:schemas-upnp-org:av:avs http://www.upnp.org/schemas/av/avs.xsd\">");
builder.Append("<Feature name=\"samsung.com_BASICVIEW\" version=\"1\">");
builder.Append("<container id=\"I\" type=\"object.item.imageItem\"/>");
builder.Append("<container id=\"A\" type=\"object.item.audioItem\"/>");
builder.Append("<container id=\"V\" type=\"object.item.videoItem\"/>");
builder.Append("</Feature>");
builder.Append("</Features>");
return builder.ToString();
}
private IEnumerable<KeyValuePair<string, string>> HandleBrowse(Headers sparams)
{
var id = sparams["ObjectID"];
var flag = sparams["BrowseFlag"];
int requested;
var provided = 0;
int start;
if (sparams.ContainsKey("RequestedCount") && int.TryParse(sparams["RequestedCount"], out requested) && requested <= 0)
{
requested = 20;
}
if (sparams.ContainsKey("StartingIndex") && int.TryParse(sparams["StartingIndex"], out start) && start <= 0)
{
start = 0;
}
//var root = GetItem(id) as IMediaFolder;
var result = new XmlDocument();
var didl = result.CreateElement(string.Empty, "DIDL-Lite", NS_DIDL);
didl.SetAttribute("xmlns:dc", NS_DC);
didl.SetAttribute("xmlns:dlna", NS_DLNA);
didl.SetAttribute("xmlns:upnp", NS_UPNP);
didl.SetAttribute("xmlns:sec", NS_SEC);
result.AppendChild(didl);
return null;
}
}
}

@ -0,0 +1,65 @@
using MediaBrowser.Model.Logging;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace MediaBrowser.Dlna.Server
{
public class Datagram
{
public IPEndPoint EndPoint { get; private set; }
public IPAddress LocalAddress { get; private set; }
public string Message { get; private set; }
public bool Sticky { get; private set; }
public int SendCount { get; private set; }
private readonly ILogger _logger;
public Datagram(IPEndPoint endPoint, IPAddress localAddress, ILogger logger, string message, bool sticky)
{
Message = message;
_logger = logger;
Sticky = sticky;
LocalAddress = localAddress;
EndPoint = endPoint;
}
public void Send()
{
var msg = Encoding.ASCII.GetBytes(Message);
try
{
var client = new UdpClient();
client.Client.Bind(new IPEndPoint(LocalAddress, 0));
client.BeginSend(msg, msg.Length, EndPoint, result =>
{
try
{
client.EndSend(result);
}
catch (Exception ex)
{
_logger.ErrorException("Error sending Datagram", ex);
}
finally
{
try
{
client.Close();
}
catch (Exception)
{
}
}
}, null);
}
catch (Exception ex)
{
_logger.ErrorException("Error sending Datagram", ex);
}
++SendCount;
}
}
}

@ -0,0 +1,179 @@
using MediaBrowser.Dlna.Common;
using MediaBrowser.Model.Dlna;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Security;
using System.Text;
namespace MediaBrowser.Dlna.Server
{
public class DescriptionXmlBuilder
{
private readonly DeviceProfile _profile;
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
private readonly string _serverUdn;
public DescriptionXmlBuilder(DeviceProfile profile, string serverUdn)
{
if (string.IsNullOrWhiteSpace(serverUdn))
{
throw new ArgumentNullException("serverUdn");
}
_profile = profile;
_serverUdn = serverUdn;
}
public string GetXml()
{
var builder = new StringBuilder();
builder.Append("<?xml version=\"1.0\"?>");
builder.Append("<root xmlns=\"urn:schemas-upnp-org:device-1-0\" xmlns:dlna=\"urn:schemas-dlna-org:device-1-0\" xmlns:sec=\"http://www.sec.co.kr/dlna\">");
builder.Append("<specVersion>");
builder.Append("<major>1</major>");
builder.Append("<minor>0</minor>");
builder.Append("</specVersion>");
AppendDeviceInfo(builder);
builder.Append("</root>");
return builder.ToString();
}
private void AppendDeviceInfo(StringBuilder builder)
{
AppendDeviceProperties(builder);
AppendIconList(builder);
AppendServiceList(builder);
}
private void AppendDeviceProperties(StringBuilder builder)
{
builder.Append("<UDN>" + SecurityElement.Escape(_serverUdn) + "</UDN>");
builder.Append("<dlna:X_DLNACAP>" + SecurityElement.Escape(_profile.XDlnaCap ?? string.Empty) + "</dlna:X_DLNACAP>");
builder.Append("<dlna:X_DLNADOC>M-DMS-1.50</dlna:X_DLNADOC>");
builder.Append("<dlna:X_DLNADOC>" + SecurityElement.Escape(_profile.XDlnaDoc ?? string.Empty) + "</dlna:X_DLNADOC>");
builder.Append("<friendlyName>" + SecurityElement.Escape(_profile.FriendlyName ?? string.Empty) + "</friendlyName>");
builder.Append("<deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>");
builder.Append("<manufacturer>" + SecurityElement.Escape(_profile.Manufacturer ?? string.Empty) + "</manufacturer>");
builder.Append("<manufacturerURL>" + SecurityElement.Escape(_profile.ManufacturerUrl ?? string.Empty) + "</manufacturerURL>");
builder.Append("<modelName>" + SecurityElement.Escape(_profile.ModelName ?? string.Empty) + "</modelName>");
builder.Append("<modelDescription>" + SecurityElement.Escape(_profile.ModelDescription ?? string.Empty) + "</modelDescription>");
builder.Append("<modelNumber>" + SecurityElement.Escape(_profile.ModelNumber ?? string.Empty) + "</modelNumber>");
builder.Append("<modelURL>" + SecurityElement.Escape(_profile.ModelUrl ?? string.Empty) + "</modelURL>");
builder.Append("<serialNumber>" + SecurityElement.Escape(_profile.SerialNumber ?? string.Empty) + "</serialNumber>");
builder.Append("<sec:ProductCap>DCM10,getMediaInfo.sec</sec:ProductCap>");
builder.Append("<sec:X_ProductCap>DCM10,getMediaInfo.sec</sec:X_ProductCap>");
}
private void AppendIconList(StringBuilder builder)
{
builder.Append("<iconList>");
foreach (var icon in GetIcons())
{
builder.Append("<icon>");
builder.Append("<mimetype>" + SecurityElement.Escape(icon.MimeType ?? string.Empty) + "</mimetype>");
builder.Append("<width>" + SecurityElement.Escape(icon.Width.ToString(_usCulture)) + "</width>");
builder.Append("<height>" + SecurityElement.Escape(icon.Height.ToString(_usCulture)) + "</height>");
builder.Append("<depth>" + SecurityElement.Escape(icon.Depth ?? string.Empty) + "</depth>");
builder.Append("<url>" + SecurityElement.Escape(icon.Url ?? string.Empty) + "</url>");
builder.Append("</icon>");
}
builder.Append("</iconList>");
}
private void AppendServiceList(StringBuilder builder)
{
builder.Append("<serviceList>");
foreach (var service in GetServices())
{
builder.Append("<icon>");
builder.Append("<serviceType>" + SecurityElement.Escape(service.ServiceType ?? string.Empty) + "</serviceType>");
builder.Append("<serviceId>" + SecurityElement.Escape(service.ServiceId ?? string.Empty) + "</serviceId>");
builder.Append("<SCPDURL>" + SecurityElement.Escape(service.ScpdUrl ?? string.Empty) + "</SCPDURL>");
builder.Append("<controlURL>" + SecurityElement.Escape(service.ControlUrl ?? string.Empty) + "</controlURL>");
builder.Append("<eventSubURL>" + SecurityElement.Escape(service.EventSubUrl ?? string.Empty) + "</eventSubURL>");
builder.Append("</icon>");
}
builder.Append("</serviceList>");
}
private IEnumerable<DeviceIcon> GetIcons()
{
var list = new List<DeviceIcon>();
list.Add(new DeviceIcon
{
MimeType = "image/jpeg",
Depth = "24",
Width = 48,
Height = 48,
Url = "/icons/small.jpg"
});
list.Add(new DeviceIcon
{
MimeType = "image/jpeg",
Depth = "24",
Width = 120,
Height = 120,
Url = "/icons/large.jpg"
});
list.Add(new DeviceIcon
{
MimeType = "image/png",
Depth = "24",
Width = 48,
Height = 48,
Url = "/icons/small.png"
});
list.Add(new DeviceIcon
{
MimeType = "image/png",
Depth = "24",
Width = 120,
Height = 120,
Url = "/icons/large.png"
});
return list;
}
private IEnumerable<DeviceService> GetServices()
{
var list = new List<DeviceService>();
list.Add(new DeviceService
{
ServiceType = "urn:schemas-upnp-org:service:ContentDirectory:1",
ServiceId = "urn:upnp-org:serviceId:ContentDirectory",
ScpdUrl = "/contentdirectory.xml",
ControlUrl = "/servicecontrol"
});
return list;
}
public override string ToString()
{
return GetXml();
}
}
}

@ -1,8 +1,11 @@
using MediaBrowser.Common;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Plugins;
using MediaBrowser.Model.Logging;
using System;
using System.Net;
namespace MediaBrowser.Dlna.Server
{
@ -13,11 +16,13 @@ namespace MediaBrowser.Dlna.Server
private SsdpHandler _ssdpHandler;
private readonly IApplicationHost _appHost;
private readonly INetworkManager _network;
public DlnaServerEntryPoint(IServerConfigurationManager config, ILogManager logManager, IApplicationHost appHost)
public DlnaServerEntryPoint(IServerConfigurationManager config, ILogManager logManager, IApplicationHost appHost, INetworkManager network)
{
_config = config;
_appHost = appHost;
_network = network;
_logger = logManager.GetLogger("DlnaServer");
}
@ -25,12 +30,12 @@ namespace MediaBrowser.Dlna.Server
{
_config.ConfigurationUpdated += ConfigurationUpdated;
//ReloadServer();
ReloadServer();
}
void ConfigurationUpdated(object sender, EventArgs e)
{
//ReloadServer();
ReloadServer();
}
private void ReloadServer()
@ -57,6 +62,8 @@ namespace MediaBrowser.Dlna.Server
try
{
_ssdpHandler = new SsdpHandler(_logger, _config, signature);
RegisterEndpoints();
}
catch (Exception ex)
{
@ -65,6 +72,20 @@ namespace MediaBrowser.Dlna.Server
}
}
private void RegisterEndpoints()
{
foreach (var address in _network.GetLocalIpAddresses())
{
var guid = address.GetMD5();
var descriptorURI = "/mediabrowser/dlna/" + guid.ToString("N") + "/description.xml";
var uri = new Uri(string.Format("http://{0}:{1}{2}", address, _config.Configuration.HttpServerPortNumber, descriptorURI));
_ssdpHandler.RegisterNotification(guid, uri, IPAddress.Parse(address));
}
}
private void DisposeServer()
{
lock (_syncLock)

@ -0,0 +1,209 @@
using MediaBrowser.Dlna.Common;
using System.Collections.Generic;
namespace MediaBrowser.Dlna.Server
{
public class ServiceActionListBuilder
{
public IEnumerable<ServiceAction> GetActions()
{
var list = new List<ServiceAction>
{
GetGetSystemUpdateIDAction(),
GetSearchCapabilitiesAction(),
GetSortCapabilitiesAction(),
GetBrowseAction(),
GetX_GetFeatureListAction(),
GetXSetBookmarkAction()
};
return list;
}
private ServiceAction GetGetSystemUpdateIDAction()
{
var action = new ServiceAction
{
Name = "GetSystemUpdateID"
};
action.ArgumentList.Add(new Argument
{
Name = "Id",
Direction = "out",
RelatedStateVariable = "SystemUpdateID"
});
return action;
}
private ServiceAction GetSearchCapabilitiesAction()
{
var action = new ServiceAction
{
Name = "GetSearchCapabilities"
};
action.ArgumentList.Add(new Argument
{
Name = "SearchCaps",
Direction = "out",
RelatedStateVariable = "SearchCapabilities"
});
return action;
}
private ServiceAction GetSortCapabilitiesAction()
{
var action = new ServiceAction
{
Name = "GetSortCapabilities"
};
action.ArgumentList.Add(new Argument
{
Name = "SortCaps",
Direction = "out",
RelatedStateVariable = "SortCapabilities"
});
return action;
}
private ServiceAction GetX_GetFeatureListAction()
{
var action = new ServiceAction
{
Name = "X_GetFeatureList"
};
action.ArgumentList.Add(new Argument
{
Name = "FeatureList",
Direction = "out",
RelatedStateVariable = "A_ARG_TYPE_Featurelist"
});
return action;
}
private ServiceAction GetBrowseAction()
{
var action = new ServiceAction
{
Name = "Browse"
};
action.ArgumentList.Add(new Argument
{
Name = "ObjectID",
Direction = "in",
RelatedStateVariable = "A_ARG_TYPE_ObjectID"
});
action.ArgumentList.Add(new Argument
{
Name = "BrowseFlag",
Direction = "in",
RelatedStateVariable = "A_ARG_TYPE_BrowseFlag"
});
action.ArgumentList.Add(new Argument
{
Name = "Filter",
Direction = "in",
RelatedStateVariable = "A_ARG_TYPE_Filter"
});
action.ArgumentList.Add(new Argument
{
Name = "StartingIndex",
Direction = "in",
RelatedStateVariable = "A_ARG_TYPE_Index"
});
action.ArgumentList.Add(new Argument
{
Name = "RequestedCount",
Direction = "in",
RelatedStateVariable = "A_ARG_TYPE_Count"
});
action.ArgumentList.Add(new Argument
{
Name = "SortCriteria",
Direction = "in",
RelatedStateVariable = "A_ARG_TYPE_SortCriteria"
});
action.ArgumentList.Add(new Argument
{
Name = "Result",
Direction = "out",
RelatedStateVariable = "A_ARG_TYPE_Result"
});
action.ArgumentList.Add(new Argument
{
Name = "NumberReturned",
Direction = "out",
RelatedStateVariable = "A_ARG_TYPE_Count"
});
action.ArgumentList.Add(new Argument
{
Name = "TotalMatches",
Direction = "out",
RelatedStateVariable = "A_ARG_TYPE_Count"
});
action.ArgumentList.Add(new Argument
{
Name = "UpdateID",
Direction = "out",
RelatedStateVariable = "A_ARG_TYPE_UpdateID"
});
return action;
}
private ServiceAction GetXSetBookmarkAction()
{
var action = new ServiceAction
{
Name = "X_SetBookmark"
};
action.ArgumentList.Add(new Argument
{
Name = "CategoryType",
Direction = "in",
RelatedStateVariable = "A_ARG_TYPE_CategoryType"
});
action.ArgumentList.Add(new Argument
{
Name = "RID",
Direction = "in",
RelatedStateVariable = "A_ARG_TYPE_RID"
});
action.ArgumentList.Add(new Argument
{
Name = "ObjectID",
Direction = "in",
RelatedStateVariable = "A_ARG_TYPE_ObjectID"
});
action.ArgumentList.Add(new Argument
{
Name = "PosSecond",
Direction = "in",
RelatedStateVariable = "A_ARG_TYPE_PosSec"
});
return action;
}
}
}

@ -1,21 +1,26 @@
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace MediaBrowser.Dlna.Server
{
public class SsdpHandler : IDisposable
{
private readonly AutoResetEvent _datagramPosted = new AutoResetEvent(false);
private readonly ConcurrentQueue<Datagram> _messageQueue = new ConcurrentQueue<Datagram>();
private readonly ILogger _logger;
private readonly IServerConfigurationManager _config;
private readonly string _serverSignature;
private bool _isDisposed = false;
private bool _isDisposed;
const string SSDPAddr = "239.255.255.250";
const int SSDPPort = 1900;
@ -27,6 +32,9 @@ namespace MediaBrowser.Dlna.Server
private readonly Dictionary<Guid, List<UpnpDevice>> _devices = new Dictionary<Guid, List<UpnpDevice>>();
private Timer _queueTimer;
private Timer _notificationTimer;
public SsdpHandler(ILogger logger, IServerConfigurationManager config, string serverSignature)
{
_logger = logger;
@ -59,6 +67,8 @@ namespace MediaBrowser.Dlna.Server
_udpClient.JoinMulticastGroup(_ssdpIp, 2);
_logger.Info("SSDP service started");
Receive();
StartNotificationTimer();
}
private void Receive()
@ -157,28 +167,67 @@ namespace MediaBrowser.Dlna.Server
headers.Add("ST", dev.Type);
headers.Add("USN", dev.USN);
SendDatagram(endpoint, String.Format("HTTP/1.1 200 OK\r\n{0}\r\n", headers.HeaderBlock), false);
var msg = String.Format("HTTP/1.1 200 OK\r\n{0}\r\n", headers.HeaderBlock);
SendDatagram(endpoint, dev.Address, msg, false);
_logger.Info("{1} - Responded to a {0} request", dev.Type, endpoint);
}
private void SendDatagram(IPEndPoint endpoint, string msg, bool sticky)
private void SendDatagram(IPEndPoint endpoint, IPAddress localAddress, string msg, bool sticky)
{
if (_isDisposed)
{
return;
}
//var dgram = new Datagram(endpoint, msg, sticky);
//if (messageQueue.Count == 0)
//{
// dgram.Send();
//}
//messageQueue.Enqueue(dgram);
//queueTimer.Enabled = true;
var dgram = new Datagram(endpoint, localAddress, _logger, msg, sticky);
if (_messageQueue.Count == 0)
{
dgram.Send();
}
_messageQueue.Enqueue(dgram);
StartQueueTimer();
}
private void QueueTimerCallback(object state)
{
while (_messageQueue.Count != 0)
{
Datagram msg;
if (!_messageQueue.TryPeek(out msg))
{
continue;
}
if (msg != null && (!_isDisposed || msg.Sticky))
{
msg.Send();
if (msg.SendCount > 2)
{
_messageQueue.TryDequeue(out msg);
}
break;
}
_messageQueue.TryDequeue(out msg);
}
_datagramPosted.Set();
if (_messageQueue.Count > 0)
{
StartQueueTimer();
}
else
{
DisposeQueueTimer();
}
}
private void NotifyAll()
{
_logger.Debug("NotifyAll");
_logger.Debug("Sending alive notifications");
foreach (var d in Devices)
{
NotifyDevice(d, "alive", false);
@ -197,64 +246,122 @@ namespace MediaBrowser.Dlna.Server
headers.Add("NT", dev.Type);
headers.Add("USN", dev.USN);
SendDatagram(_ssdpEndp, String.Format("NOTIFY * HTTP/1.1\r\n{0}\r\n", headers.HeaderBlock), sticky);
var msg = String.Format("NOTIFY * HTTP/1.1\r\n{0}\r\n", headers.HeaderBlock);
_logger.Debug("{0} said {1}", dev.USN, type);
SendDatagram(_ssdpEndp, dev.Address, msg, sticky);
}
private void RegisterNotification(Guid UUID, Uri Descriptor)
public void RegisterNotification(Guid uuid, Uri descriptor, IPAddress address)
{
List<UpnpDevice> list;
lock (_devices)
{
if (!_devices.TryGetValue(UUID, out list))
if (!_devices.TryGetValue(uuid, out list))
{
_devices.Add(UUID, list = new List<UpnpDevice>());
_devices.Add(uuid, list = new List<UpnpDevice>());
}
}
foreach (var t in new[] { "upnp:rootdevice", "urn:schemas-upnp-org:device:MediaServer:1", "urn:schemas-upnp-org:service:ContentDirectory:1", "uuid:" + UUID })
foreach (var t in new[] { "upnp:rootdevice", "urn:schemas-upnp-org:device:MediaServer:1", "urn:schemas-upnp-org:service:ContentDirectory:1", "uuid:" + uuid })
{
list.Add(new UpnpDevice(UUID, t, Descriptor));
list.Add(new UpnpDevice(uuid, t, descriptor, address));
}
NotifyAll();
_logger.Debug("Registered mount {0}", UUID);
_logger.Debug("Registered mount {0}", uuid);
}
internal void UnregisterNotification(Guid UUID)
private void UnregisterNotification(Guid uuid)
{
List<UpnpDevice> dl;
lock (_devices)
{
if (!_devices.TryGetValue(UUID, out dl))
if (!_devices.TryGetValue(uuid, out dl))
{
return;
}
_devices.Remove(UUID);
_devices.Remove(uuid);
}
foreach (var d in dl)
{
NotifyDevice(d, "byebye", true);
}
_logger.Debug("Unregistered mount {0}", UUID);
_logger.Debug("Unregistered mount {0}", uuid);
}
public void Dispose()
{
_isDisposed = true;
//while (messageQueue.Count != 0)
//{
// datagramPosted.WaitOne();
//}
while (_messageQueue.Count != 0)
{
_datagramPosted.WaitOne();
}
_udpClient.DropMulticastGroup(_ssdpIp);
_udpClient.Close();
//notificationTimer.Enabled = false;
//queueTimer.Enabled = false;
//notificationTimer.Dispose();
//queueTimer.Dispose();
//datagramPosted.Dispose();
DisposeNotificationTimer();
DisposeQueueTimer();
_datagramPosted.Dispose();
}
private readonly object _queueTimerSyncLock = new object();
private void StartQueueTimer()
{
lock (_queueTimerSyncLock)
{
if (_queueTimer == null)
{
_queueTimer = new Timer(QueueTimerCallback, null, 1000, Timeout.Infinite);
}
else
{
_queueTimer.Change(1000, Timeout.Infinite);
}
}
}
private void DisposeQueueTimer()
{
lock (_queueTimerSyncLock)
{
if (_queueTimer != null)
{
_queueTimer.Dispose();
_queueTimer = null;
}
}
}
private readonly object _notificationTimerSyncLock = new object();
private void StartNotificationTimer()
{
const int intervalMs = 60000;
lock (_notificationTimerSyncLock)
{
if (_notificationTimer == null)
{
_notificationTimer = new Timer(state => NotifyAll(), null, intervalMs, intervalMs);
}
else
{
_notificationTimer.Change(intervalMs, intervalMs);
}
}
}
private void DisposeNotificationTimer()
{
lock (_notificationTimerSyncLock)
{
if (_notificationTimer != null)
{
_notificationTimer.Dispose();
_notificationTimer = null;
}
}
}
}
}

@ -1,4 +1,5 @@
using System;
using System.Net;
namespace MediaBrowser.Dlna.Server
{
@ -8,13 +9,16 @@ namespace MediaBrowser.Dlna.Server
public readonly string Type;
public readonly string USN;
public readonly Guid Uuid;
public readonly IPAddress Address;
public UpnpDevice(Guid aUuid, string aType, Uri aDescriptor)
public UpnpDevice(Guid aUuid, string aType, Uri aDescriptor, IPAddress address)
{
Uuid = aUuid;
Type = aType;
Descriptor = aDescriptor;
Address = address;
if (Type.StartsWith("uuid:"))
{
USN = Type;

@ -31,6 +31,11 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
<Optimize>false</Optimize>
<OutputPath>bin\Release Mono</OutputPath>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="BDInfo">
<HintPath>..\packages\MediaBrowser.BdInfo.1.0.0.10\lib\net35\BDInfo.dll</HintPath>
@ -75,7 +80,6 @@
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

@ -34,6 +34,7 @@ namespace MediaBrowser.Model.Dlna
public string ModelDescription { get; set; }
public string ModelNumber { get; set; }
public string ModelUrl { get; set; }
public string SerialNumber { get; set; }
public bool IgnoreTranscodeByteRangeRequests { get; set; }
public bool EnableAlbumArtInDidl { get; set; }

@ -21,6 +21,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Mono",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Dlna", "MediaBrowser.Dlna\MediaBrowser.Dlna.csproj", "{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.MediaEncoding", "MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj", "{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
@ -29,6 +31,14 @@ Global
Release Mono|Any CPU = Release Mono|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|x86.ActiveCfg = Debug|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|x86.Build.0 = Debug|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.Build.0 = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Any CPU.Build.0 = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|x86.ActiveCfg = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|x86.Build.0 = Release|Any CPU
{175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.ActiveCfg = Debug|x86
{175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.Build.0 = Debug|x86
{175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
@ -77,6 +87,14 @@ Global
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|Any CPU.Build.0 = Release|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.ActiveCfg = Release|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.Build.0 = Release|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Debug|x86.ActiveCfg = Debug|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Debug|x86.Build.0 = Debug|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release|Any CPU.Build.0 = Release|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release|x86.ActiveCfg = Release|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release|x86.Build.0 = Release|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|x86.ActiveCfg = Debug|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|x86.Build.0 = Debug|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
@ -101,14 +119,6 @@ Global
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release|Any CPU.Build.0 = Release|Any CPU
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release|x86.ActiveCfg = Release|Any CPU
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Release|x86.Build.0 = Release|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Debug|x86.ActiveCfg = Debug|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Debug|x86.Build.0 = Debug|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release|Any CPU.Build.0 = Release|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release|x86.ActiveCfg = Release|Any CPU
{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = MediaBrowser.Server.Mono\MediaBrowser.Server.Mono.csproj

@ -5,7 +5,7 @@
<File FileName="MediaBrowser.Server.Mono\app.config" Line="1" Column="1" />
<File FileName="MediaBrowser.ServerApplication\ApplicationHost.cs" Line="1" Column="1" />
<File FileName="MediaBrowser.Server.Mono\Native\NativeApp.cs" Line="1" Column="1" />
<File FileName="MediaBrowser.Server.Mono\Program.cs" Line="36" Column="34" />
<File FileName="MediaBrowser.Server.Mono\Program.cs" Line="36" Column="37" />
</Files>
</MonoDevelop.Ide.Workbench>
<MonoDevelop.Ide.DebuggingService.Breakpoints>

@ -9,11 +9,8 @@ using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Serialization;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@ -64,7 +61,7 @@ namespace MediaBrowser.Providers.Music
return result;
}
protected virtual async Task FetchLastfmData(MusicArtist item, string musicBrainzId, CancellationToken cancellationToken)
protected async Task FetchLastfmData(MusicArtist item, string musicBrainzId, CancellationToken cancellationToken)
{
// Get artist info with provided id
var url = RootUrl + String.Format("method=artist.getInfo&mbid={0}&api_key={1}&format=json", UrlEncode(musicBrainzId), ApiKey);

@ -31,9 +31,21 @@ namespace MediaBrowser.Server.Implementations.Library
public async Task<QueryResult<SearchHintInfo>> GetSearchHints(SearchQuery query)
{
var user = _userManager.GetUserById(new Guid(query.UserId));
IEnumerable<BaseItem> inputItems;
var inputItems = user.RootFolder.GetRecursiveChildren(user, null).Where(i => !(i is ICollectionFolder));
if (string.IsNullOrEmpty(query.UserId))
{
inputItems = _libraryManager.RootFolder.RecursiveChildren;
}
else
{
var user = _userManager.GetUserById(new Guid(query.UserId));
inputItems = user.RootFolder.GetRecursiveChildren(user, null);
}
inputItems = inputItems.Where(i => !(i is ICollectionFolder));
inputItems = _libraryManager.ReplaceVideosWithPrimaryVersions(inputItems);

@ -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."
}

@ -0,0 +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."
}

@ -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."
}

@ -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":"Release","OptionBeta":"Beta","OptionDev":"Dev","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."
}

@ -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":"Uninstall 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":"This plugin has nothing to configure.","NoPluginsInstalledMessage":"You have no plugins installed.","BrowsePluginCatalogMessage":"Browse our plugin catalog to view available 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": "Uninstall 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": "This plugin has nothing to configure.",
"NoPluginsInstalledMessage": "You have no plugins installed.",
"BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins."
}

@ -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."
}

@ -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."
}

@ -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":"Apagado","OptionOn":"Encendido","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": "Apagado",
"OptionOn": "Encendido",
"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."
}

@ -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."
}

@ -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."
}

@ -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."
}

@ -0,0 +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."
}

@ -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"
}

@ -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."
}

@ -1 +1,30 @@
{"SettingsSaved":"Prefer\u00eancias salvas.","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":"Tem certeza que deseja apagar {0}?","PasswordResetHeader":"Redefinir Senha","PasswordResetComplete":"A senha foi redefinida.","PasswordResetConfirmation":"Deseja realmente redefinir a senha?","PasswordSaved":"Senha salva.","PasswordMatchError":"A senha e confirma\u00e7\u00e3o da senha devem conferir.","OptionOff":"Off","OptionOn":"On","OptionRelease":"Lan\u00e7amento Oficial","OptionBeta":"Beta","OptionDev":"Dev (Inst\u00e1vel)","UninstallPluginHeader":"Desintalar 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": "Prefer\u00eancias salvas.",
"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": "Tem certeza que deseja apagar {0}?",
"PasswordResetHeader": "Redefinir Senha",
"PasswordResetComplete": "A senha foi redefinida.",
"PasswordResetConfirmation": "Deseja realmente redefinir a senha?",
"PasswordSaved": "Senha salva.",
"PasswordMatchError": "A senha e confirma\u00e7\u00e3o da senha devem conferir.",
"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."
}

@ -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":"Desligar","OptionOn":"Ligar","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": "Desligar",
"OptionOn": "Ligar",
"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."
}

@ -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 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","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\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435?","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":"\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u043d\u0430\u0448\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432."}
{
"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 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",
"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\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435?",
"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": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u043d\u0430\u0448\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b."
}

@ -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."
}

@ -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

@ -0,0 +1,451 @@
{
"LabelExit": "Sortir",
"LabelVisitCommunity": "Visitar la comunitat",
"LabelGithubWiki": "Github Wiki",
"LabelSwagger": "Swagger",
"LabelStandard": "Est\u00e0ndard",
"LabelViewApiDocumentation": "Veure la documentaci\u00f3 de l'API",
"LabelBrowseLibrary": "Examinar la biblioteca",
"LabelConfigureMediaBrowser": "Configurar Media Browser",
"LabelOpenLibraryViewer": "Obrir el visor de la biblioteca",
"LabelRestartServer": "Reiniciar el servidor",
"LabelShowLogWindow": "Veure la finestra del registre",
"LabelPrevious": "Anterior",
"LabelFinish": "Finalitzar",
"LabelNext": "Seg\u00fcent",
"LabelYoureDone": "Ja est\u00e0!",
"WelcomeToMediaBrowser": "Benvingut a Meida Browser!",
"TitleMediaBrowser": "Media Browser",
"ThisWizardWillGuideYou": "Aquest assistent us guiar\u00e0 a trav\u00e9s del proc\u00e9s de configuraci\u00f3.",
"TellUsAboutYourself": "Expliqui'ns sobre vost\u00e8",
"LabelYourFirstName": "El seu nom:",
"MoreUsersCanBeAddedLater": "M\u00e9s usuaris es poden afegir m\u00e9s tard en el tauler d'instruments.",
"UserProfilesIntro": "Media Browser inclou suport integrat per als perfils d'usuari, la qual cosa permet que cada usuari tingui la seva pr\u00f2pia configuraci\u00f3 de pantalla, estat de reproducci\u00f3 i controls dels pares.",
"LabelWindowsService": "Servei de Windows",
"AWindowsServiceHasBeenInstalled": "A Windows Service has been installed.",
"WindowsServiceIntro1": "Media Browser Server normally runs as a desktop application with a tray icon, but if you prefer to run it as a background service, it can be started from the windows services control panel instead.",
"WindowsServiceIntro2": "If using the windows service, please note that it cannot be run at the same time as the tray icon, so you'll need to exit the tray in order to run the service. The service will also need to be configured with administrative privileges via the control panel. Please note that at this time the service is unable to self-update, so new versions will require manual interaction.",
"WizardCompleted": "That's all we need for now. Media Browser has begun collecting information about your media library. Check out some of our apps, and then click <b>Finish<\/b> to view the <b>Dashboard<\/b>.",
"LabelConfigureSettings": "Configure settings",
"LabelEnableVideoImageExtraction": "Enable video image extraction",
"VideoImageExtractionHelp": "For videos that don't already have images, and that we're unable to find internet images for. This will add some additional time to the initial library scan but will result in a more pleasing presentation.",
"LabelEnableChapterImageExtractionForMovies": "Extract chapter image extraction for Movies",
"LabelChapterImageExtractionForMoviesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs as a nightly scheduled task at 4am, although this is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.",
"LabelEnableAutomaticPortMapping": "Enable automatic port mapping",
"LabelEnableAutomaticPortMappingHelp": "UPnP allows automated router configuration for easy remote access. This may not work with some router models.",
"ButtonOk": "Ok",
"ButtonCancel": "Cancel",
"ButtonNew": "New",
"HeaderSetupLibrary": "Setup your media library",
"ButtonAddMediaFolder": "Add media folder",
"LabelFolderType": "Folder type:",
"MediaFolderHelpPluginRequired": "* Requires the use of a plugin, e.g. GameBrowser or MB Bookshelf.",
"ReferToMediaLibraryWiki": "Refer to the media library wiki.",
"LabelCountry": "Country:",
"LabelLanguage": "Language:",
"HeaderPreferredMetadataLanguage": "Preferred metadata language:",
"LabelSaveLocalMetadata": "Save artwork and metadata into media folders",
"LabelSaveLocalMetadataHelp": "Saving artwork and metadata directly into media folders will put them in a place where they can be easily edited.",
"LabelDownloadInternetMetadata": "Download artwork and metadata from the internet",
"LabelDownloadInternetMetadataHelp": "Media Browser can download information about your media to enable rich presentations.",
"TabPreferences": "Preferences",
"TabPassword": "Password",
"TabLibraryAccess": "Library Access",
"TabImage": "Image",
"TabProfile": "Profile",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabCollectionTitles": "Titles",
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "Video Playback Settings",
"LabelAudioLanguagePreference": "Audio language preference:",
"LabelSubtitleLanguagePreference": "Subtitle language preference:",
"LabelDisplayForcedSubtitlesOnly": "Display only forced subtitles",
"TabProfiles": "Profiles",
"TabSecurity": "Security",
"ButtonAddUser": "Add User",
"ButtonSave": "Save",
"ButtonResetPassword": "Reset Password",
"LabelNewPassword": "New password:",
"LabelNewPasswordConfirm": "New password confirm:",
"HeaderCreatePassword": "Create Password",
"LabelCurrentPassword": "Current password:",
"LabelMaxParentalRating": "Maximum allowed parental rating:",
"MaxParentalRatingHelp": "Content with a higher rating will be hidden from this user.",
"LibraryAccessHelp": "Select the media folders to share with this user. Administrators will be able to edit all folders using the metadata manager.",
"ButtonDeleteImage": "Delete Image",
"ButtonUpload": "Upload",
"HeaderUploadNewImage": "Upload New Image",
"LabelDropImageHere": "Drop Image Here",
"ImageUploadAspectRatioHelp": "1:1 Aspect Ratio Recommended. JPG\/PNG only.",
"MessageNothingHere": "Nothing here.",
"MessagePleaseEnsureInternetMetadata": "Please ensure downloading of internet metadata is enabled.",
"TabSuggested": "Suggested",
"TabLatest": "Latest",
"TabUpcoming": "Upcoming",
"TabShows": "Shows",
"TabEpisodes": "Episodes",
"TabGenres": "Genres",
"TabPeople": "People",
"TabNetworks": "Networks",
"HeaderUsers": "Users",
"HeaderFilters": "Filters:",
"ButtonFilter": "Filter",
"OptionFavorite": "Favorites",
"OptionLikes": "Likes",
"OptionDislikes": "Dislikes",
"OptionActors": "Actors",
"OptionGuestStars": "Guest Stars",
"OptionDirectors": "Directors",
"OptionWriters": "Writers",
"OptionProducers": "Producers",
"HeaderResume": "Resume",
"HeaderNextUp": "Next Up",
"NoNextUpItemsMessage": "None found. Start watching your shows!",
"HeaderLatestEpisodes": "Latest Episodes",
"HeaderPersonTypes": "Person Types:",
"TabSongs": "Songs",
"TabAlbums": "Albums",
"TabArtists": "Artists",
"TabAlbumArtists": "Album Artists",
"TabMusicVideos": "Music Videos",
"ButtonSort": "Sort",
"HeaderSortBy": "Sort By:",
"HeaderSortOrder": "Sort Order:",
"OptionPlayed": "Played",
"OptionUnplayed": "Unplayed",
"OptionAscending": "Ascending",
"OptionDescending": "Descending",
"OptionRuntime": "Runtime",
"OptionReleaseDate": "Release Date",
"OptionPlayCount": "Play Count",
"OptionDatePlayed": "Date Played",
"OptionDateAdded": "Date Added",
"OptionAlbumArtist": "Album Artist",
"OptionArtist": "Artist",
"OptionAlbum": "Album",
"OptionTrackName": "Track Name",
"OptionCommunityRating": "Community Rating",
"OptionNameSort": "Name",
"OptionFolderSort": "Folders",
"OptionBudget": "Budget",
"OptionRevenue": "Revenue",
"OptionPoster": "Poster",
"OptionBackdrop": "Backdrop",
"OptionTimeline": "Timeline",
"OptionThumb": "Thumb",
"OptionBanner": "Banner",
"OptionCriticRating": "Critic Rating",
"OptionVideoBitrate": "Video Bitrate",
"OptionResumable": "Resumable",
"ScheduledTasksHelp": "Click a task to adjust its schedule.",
"ScheduledTasksTitle": "Scheduled Tasks",
"TabMyPlugins": "My Plugins",
"TabCatalog": "Catalog",
"TabUpdates": "Updates",
"PluginsTitle": "Plugins",
"HeaderAutomaticUpdates": "Automatic Updates",
"HeaderUpdateLevel": "Update Level",
"HeaderNowPlaying": "Now Playing",
"HeaderLatestAlbums": "Latest Albums",
"HeaderLatestSongs": "Latest Songs",
"HeaderRecentlyPlayed": "Recently Played",
"HeaderFrequentlyPlayed": "Frequently Played",
"DevBuildWarning": "Dev builds are the bleeding edge. Released often, these build have not been tested. The application may crash and entire features may not work at all.",
"LabelVideoType": "Video Type:",
"OptionBluray": "Bluray",
"OptionDvd": "Dvd",
"OptionIso": "Iso",
"Option3D": "3D",
"LabelFeatures": "Features:",
"OptionHasSubtitles": "Subtitles",
"OptionHasTrailer": "Trailer",
"OptionHasThemeSong": "Theme Song",
"OptionHasThemeVideo": "Theme Video",
"TabMovies": "Movies",
"TabStudios": "Studios",
"TabTrailers": "Trailers",
"HeaderLatestMovies": "Latest Movies",
"HeaderLatestTrailers": "Latest Trailers",
"OptionHasSpecialFeatures": "Special Features",
"OptionImdbRating": "IMDb Rating",
"OptionParentalRating": "Parental Rating",
"OptionPremiereDate": "Premiere Date",
"TabBasic": "Basic",
"TabAdvanced": "Advanced",
"HeaderStatus": "Status",
"OptionContinuing": "Continuing",
"OptionEnded": "Ended",
"HeaderAirDays": "Air Days:",
"OptionSunday": "Sunday",
"OptionMonday": "Monday",
"OptionTuesday": "Tuesday",
"OptionWednesday": "Wednesday",
"OptionThursday": "Thursday",
"OptionFriday": "Friday",
"OptionSaturday": "Saturday",
"HeaderManagement": "Management:",
"OptionMissingImdbId": "Missing IMDb Id",
"OptionMissingTvdbId": "Missing TheTVDB Id",
"OptionMissingOverview": "Missing Overview",
"OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched",
"TabGeneral": "General",
"TitleSupport": "Support",
"TabLog": "Log",
"TabAbout": "About",
"TabSupporterKey": "Supporter Key",
"TabBecomeSupporter": "Become a Supporter",
"MediaBrowserHasCommunity": "Media Browser has a thriving community of users and contributors.",
"CheckoutKnowledgeBase": "Check out our knowledge base to help you get the most out of Media Browser.",
"SearchKnowledgeBase": "Search the Knowledge Base",
"VisitTheCommunity": "Visit the Community",
"VisitMediaBrowserWebsite": "Visit the Media Browser Web Site",
"VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.",
"OptionHideUser": "Hide this user from login screens",
"OptionDisableUser": "Disable this user",
"OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.",
"HeaderAdvancedControl": "Advanced Control",
"LabelName": "Name:",
"OptionAllowUserToManageServer": "Allow this user to manage the server",
"HeaderFeatureAccess": "Feature Access",
"OptionAllowMediaPlayback": "Allow media playback",
"OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
"OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
"OptionAllowManageLiveTv": "Allow management of live tv recordings",
"OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
"OptionMissingTmdbId": "Missing Tmdb Id",
"OptionIsHD": "HD",
"OptionIsSD": "SD",
"OptionMetascore": "Metascore",
"ButtonSelect": "Select",
"ButtonSearch": "Search",
"ButtonGroupVersions": "Group Versions",
"PismoMessage": "Utilizing Pismo File Mount through a donated license.",
"PleaseSupportOtherProduces": "Please support other free products we utilize:",
"VersionNumber": "Version {0}",
"TabPaths": "Paths",
"TabServer": "Server",
"TabTranscoding": "Transcoding",
"TitleAdvanced": "Advanced",
"LabelAutomaticUpdateLevel": "Automatic update level",
"OptionRelease": "Versi\u00f3 Oficial",
"OptionBeta": "Beta",
"OptionDev": "Dev (Inestable)",
"LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates",
"LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods, when no users are active.",
"LabelEnableDebugLogging": "Enable debug logging",
"LabelRunServerAtStartup": "Run server at startup",
"LabelRunServerAtStartupHelp": "This will start the tray icon on windows startup. To start the windows service, uncheck this and run the service from the windows control panel. Please note that you cannot run both at the same time, so you will need to exit the tray icon before starting the service.",
"ButtonSelectDirectory": "Select Directory",
"LabelCustomPaths": "Specify custom paths where desired. Leave fields empty to use the defaults.",
"LabelCachePath": "Cache path:",
"LabelCachePathHelp": "This folder contains server cache files, such as images.",
"LabelImagesByNamePath": "Images by name path:",
"LabelImagesByNamePathHelp": "This folder contains actor, artist, genre and studio images.",
"LabelMetadataPath": "Metadata path:",
"LabelMetadataPathHelp": "This location contains downloaded artwork and metadata that is not configured to be stored in media folders.",
"LabelTranscodingTempPath": "Transcoding temporary path:",
"LabelTranscodingTempPathHelp": "This folder contains working files used by the transcoder.",
"TabBasics": "Basics",
"TabTV": "TV",
"TabGames": "Games",
"TabMusic": "Music",
"TabOthers": "Others",
"HeaderExtractChapterImagesFor": "Extract chapter images for:",
"OptionMovies": "Movies",
"OptionEpisodes": "Episodes",
"OptionOtherVideos": "Other Videos",
"TitleMetadata": "Metadata",
"LabelAutomaticUpdatesFanart": "Enable automatic updates from FanArt.tv",
"LabelAutomaticUpdatesTmdb": "Enable automatic updates from TheMovieDB.org",
"LabelAutomaticUpdatesTvdb": "Enable automatic updates from TheTVDB.com",
"LabelAutomaticUpdatesFanartHelp": "If enabled, new images will be downloaded automatically as they're added to fanart.tv. Existing images will not be replaced.",
"LabelAutomaticUpdatesTmdbHelp": "If enabled, new images will be downloaded automatically as they're added to TheMovieDB.org. Existing images will not be replaced.",
"LabelAutomaticUpdatesTvdbHelp": "If enabled, new images will be downloaded automatically as they're added to TheTVDB.com. Existing images will not be replaced.",
"ExtractChapterImagesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs as a nightly scheduled task at 4am, although this is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.",
"LabelMetadataDownloadLanguage": "Preferred language:",
"ButtonAutoScroll": "Auto-scroll",
"LabelImageSavingConvention": "Image saving convention:",
"LabelImageSavingConventionHelp": "Media Browser recognizes images from most major media applications. Choosing your downloading convention is useful if you also use other products.",
"OptionImageSavingCompatible": "Compatible - MB3\/Plex\/Xbmc",
"OptionImageSavingStandard": "Standard - MB3\/MB2",
"ButtonSignIn": "Sign In",
"TitleSignIn": "Sign In",
"HeaderPleaseSignIn": "Please sign in",
"LabelUser": "User:",
"LabelPassword": "Password:",
"ButtonManualLogin": "Manual Login:",
"PasswordLocalhostMessage": "Passwords are not required when logging in from localhost.",
"TabGuide": "Guide",
"TabChannels": "Channels",
"HeaderChannels": "Channels",
"TabRecordings": "Recordings",
"TabScheduled": "Scheduled",
"TabSeries": "Series",
"ButtonCancelRecording": "Cancel Recording",
"HeaderPrePostPadding": "Pre\/Post Padding",
"LabelPrePaddingMinutes": "Pre-padding minutes:",
"OptionPrePaddingRequired": "Pre-padding is required in order to record.",
"LabelPostPaddingMinutes": "Post-padding minutes:",
"OptionPostPaddingRequired": "Post-padding is required in order to record.",
"HeaderWhatsOnTV": "What's On",
"HeaderUpcomingTV": "Upcoming TV",
"TabStatus": "Status",
"TabSettings": "Settings",
"ButtonRefreshGuideData": "Refresh Guide Data",
"OptionPriority": "Priority",
"OptionRecordOnAllChannels": "Record program on all channels",
"OptionRecordAnytime": "Record program at any time",
"OptionRecordOnlyNewEpisodes": "Record only new episodes",
"HeaderDays": "Days",
"HeaderActiveRecordings": "Active Recordings",
"HeaderLatestRecordings": "Latest Recordings",
"HeaderAllRecordings": "All Recordings",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonRecord": "Record",
"ButtonDelete": "Delete",
"ButtonRemove": "Remove",
"OptionRecordSeries": "Record Series",
"HeaderDetails": "Details",
"TitleLiveTV": "Live TV",
"LabelNumberOfGuideDays": "Number of days of guide data to download:",
"LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.",
"LabelActiveService": "Active Service:",
"LabelActiveServiceHelp": "Multiple tv plugins can be installed but only one can be active at a time.",
"OptionAutomatic": "Auto",
"LiveTvPluginRequired": "A Live TV service provider plugin is required in order to continue.",
"LiveTvPluginRequiredHelp": "Please install one of our available plugins, such as Next Pvr or ServerWmc.",
"HeaderCustomizeOptionsPerMediaType": "Customize options per media type",
"OptionDownloadThumbImage": "Thumb",
"OptionDownloadMenuImage": "Menu",
"OptionDownloadLogoImage": "Logo",
"OptionDownloadBoxImage": "Box",
"OptionDownloadDiscImage": "Disc",
"OptionDownloadBannerImage": "Banner",
"OptionDownloadBackImage": "Back",
"OptionDownloadArtImage": "Art",
"OptionDownloadPrimaryImage": "Primary",
"HeaderFetchImages": "Fetch Images:",
"HeaderImageSettings": "Image Settings",
"LabelMaxBackdropsPerItem": "Maximum number of backdrops per item:",
"LabelMaxScreenshotsPerItem": "Maximum number of screenshots per item:",
"LabelMinBackdropDownloadWidth": "Minimum backdrop download width:",
"LabelMinScreenshotDownloadWidth": "Minimum screenshot download width:",
"ButtonAddScheduledTaskTrigger": "Add Task Trigger",
"HeaderAddScheduledTaskTrigger": "Add Task Trigger",
"ButtonAdd": "Add",
"LabelTriggerType": "Trigger Type:",
"OptionDaily": "Daily",
"OptionWeekly": "Weekly",
"OptionOnInterval": "On an interval",
"OptionOnAppStartup": "On application startup",
"OptionAfterSystemEvent": "After a system event",
"LabelDay": "Day:",
"LabelTime": "Time:",
"LabelEvent": "Event:",
"OptionWakeFromSleep": "Wake from sleep",
"LabelEveryXMinutes": "Every:",
"HeaderTvTuners": "Tuners",
"HeaderGallery": "Gallery",
"HeaderLatestGames": "Latest Games",
"HeaderRecentlyPlayedGames": "Recently Played Games",
"TabGameSystems": "Game Systems",
"TitleMediaLibrary": "Media Library",
"TabFolders": "Folders",
"TabPathSubstitution": "Path Substitution",
"LabelSeasonZeroDisplayName": "Season 0 display name:",
"LabelEnableRealtimeMonitor": "Enable real time monitoring",
"LabelEnableRealtimeMonitorHelp": "Changes will be processed immediately, on supported file systems.",
"ButtonScanLibrary": "Scan Library",
"HeaderNumberOfPlayers": "Players:",
"OptionAnyNumberOfPlayers": "Any",
"Option1Player": "1+",
"Option2Player": "2+",
"Option3Player": "3+",
"Option4Player": "4+",
"HeaderMediaFolders": "Media Folders",
"HeaderThemeVideos": "Theme Videos",
"HeaderThemeSongs": "Theme Songs",
"HeaderScenes": "Scenes",
"HeaderAwardsAndReviews": "Awards and Reviews",
"HeaderSoundtracks": "Soundtracks",
"HeaderMusicVideos": "Music Videos",
"HeaderSpecialFeatures": "Special Features",
"HeaderCastCrew": "Cast & Crew",
"HeaderAdditionalParts": "Additional Parts",
"ButtonSplitVersionsApart": "Split Versions Apart",
"ButtonPlayTrailer": "Trailer",
"LabelMissing": "Missing",
"LabelOffline": "Offline",
"PathSubstitutionHelp": "Path substitutions are used for mapping a path on the server to a path that clients are able to access. By allowing clients direct access to media on the server they may be able to play them directly over the network and avoid using server resources to stream and transcode them.",
"HeaderFrom": "From",
"HeaderTo": "To",
"LabelFrom": "From:",
"LabelFromHelp": "Example: D:\\Movies (on the server)",
"LabelTo": "To:",
"LabelToHelp": "Example: \\\\MyServer\\Movies (a path clients can access)",
"ButtonAddPathSubstitution": "Add Substitution",
"OptionSpecialEpisode": "Specials",
"OptionMissingEpisode": "Missing Episodes",
"OptionUnairedEpisode": "Unaired Episodes",
"OptionEpisodeSortName": "Episode Sort Name",
"OptionSeriesSortName": "Series Name",
"OptionTvdbRating": "Tvdb Rating",
"HeaderTranscodingQualityPreference": "Transcoding Quality Preference:",
"OptionAutomaticTranscodingHelp": "The server will decide quality and speed",
"OptionHighSpeedTranscodingHelp": "Lower quality, but faster encoding",
"OptionHighQualityTranscodingHelp": "Higher quality, but slower encoding",
"OptionMaxQualityTranscodingHelp": "Best quality with slower encoding and high CPU usage",
"OptionHighSpeedTranscoding": "Higher speed",
"OptionHighQualityTranscoding": "Higher quality",
"OptionMaxQualityTranscoding": "Max quality",
"OptionEnableDebugTranscodingLogging": "Enable debug transcoding logging",
"OptionEnableDebugTranscodingLoggingHelp": "This will create very large log files and is only recommended as needed for troubleshooting purposes.",
"OptionUpscaling": "Allow clients to request upscaled video",
"OptionUpscalingHelp": "In some cases this will result in improved video quality but will increase CPU usage.",
"EditCollectionItemsHelp": "Add or remove any movies, series, albums, books or games you wish to group within this collection.",
"HeaderAddTitles": "Add Titles",
"LabelEnableDlnaPlayTo": "Enable DLNA Play To",
"LabelEnableDlnaPlayToHelp": "Media Browser can detect devices within your network and offer the ability to remote control them.",
"LabelEnableDlnaDebugLogging": "Enable DLNA debug logging",
"LabelEnableDlnaDebugLoggingHelp": "This will create large log files and should only be used as needed for troubleshooting purposes.",
"LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds of the interval between SSDP searches performed by Media Browser.",
"HeaderCustomDlnaProfiles": "Custom Profiles",
"HeaderSystemDlnaProfiles": "System Profiles",
"CustomDlnaProfilesHelp": "Create a custom profile to target a new device or override a system profile.",
"SystemDlnaProfilesHelp": "System profiles are read-only. To override a system profile, create a custom profile targeting the same device.",
"TitleDashboard": "Dashboard",
"TabHome": "Home",
"TabInfo": "Info",
"HeaderLinks": "Links",
"HeaderSystemPaths": "System Paths",
"LinkCommunity": "Community",
"LinkGithub": "Github",
"LinkApiDocumentation": "Api Documentation",
"LabelFriendlyServerName": "Friendly server name:",
"LabelFriendlyServerNameHelp": "This name will be used to identify this server. If left blank, the computer name will be used.",
"LabelPreferredDisplayLanguage": "Preferred display language",
"LabelPreferredDisplayLanguageHelp": "Translating Media Browser is an ongoing project and is not yet complete.",
"LabelReadHowYouCanContribute": "Read about how you can contribute.",
"HeaderNewCollection": "New Collection",
"NewCollectionNameExample": "Example: Star Wars Collection",
"OptionSearchForInternetMetadata": "Search the internet for artwork and metadata",
"ButtonCreate": "Create",
"LabelHttpServerPortNumber": "Http server port number:",
"LabelWebSocketPortNumber": "Web socket port number:",
"LabelEnableAutomaticPortHelp": "UPnP allows automated router configuration for remote access. This may not work with some router models.",
"LabelExternalDDNS": "External DDNS:",
"LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Media Browser apps will use it when connecting remotely.",
"TabResume": "Resume",
"TabWeather": "Weather",
"TitleAppSettings": "App Settings",
"LabelMinResumePercentage": "Min resume percentage:",
"LabelMaxResumePercentage": "Max resume percentage:",
"LabelMinResumeDuration": "Min resume duration (seconds):",
"LabelMinResumePercentageHelp": "Titles are assumed unplayed if stopped before this time",
"LabelMaxResumePercentageHelp": "Titles are assumed fully played if stopped after this time",
"LabelMinResumeDurationHelp": "Titles shorter than this will not be resumable"
}

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

@ -0,0 +1,451 @@
{
"LabelExit": "Tutup",
"LabelVisitCommunity": "Melawat Masyarakat",
"LabelGithubWiki": "Gihub Wiki",
"LabelSwagger": "Swagger",
"LabelStandard": "Biasa",
"LabelViewApiDocumentation": "Melihat Dokumentasi Api",
"LabelBrowseLibrary": "Imbas Pengumpulan",
"LabelConfigureMediaBrowser": "Konfigurasi Media Browser",
"LabelOpenLibraryViewer": "Open Library Viewer",
"LabelRestartServer": "Restart Server",
"LabelShowLogWindow": "Show Log Window",
"LabelPrevious": "Sebelumnya",
"LabelFinish": "Habis",
"LabelNext": "Seterusnya",
"LabelYoureDone": "Kamu Selesai!",
"WelcomeToMediaBrowser": "Welcome to Media Browser!",
"TitleMediaBrowser": "Media Browser",
"ThisWizardWillGuideYou": "This wizard will help guide you through the setup process.",
"TellUsAboutYourself": "Tell us about yourself",
"LabelYourFirstName": "Your first name:",
"MoreUsersCanBeAddedLater": "More users can be added later within the Dashboard.",
"UserProfilesIntro": "Media Browser includes built-in support for user profiles, enabling each user to have their own display settings, playstate and parental controls.",
"LabelWindowsService": "Windows Service",
"AWindowsServiceHasBeenInstalled": "A Windows Service has been installed.",
"WindowsServiceIntro1": "Media Browser Server normally runs as a desktop application with a tray icon, but if you prefer to run it as a background service, it can be started from the windows services control panel instead.",
"WindowsServiceIntro2": "If using the windows service, please note that it cannot be run at the same time as the tray icon, so you'll need to exit the tray in order to run the service. The service will also need to be configured with administrative privileges via the control panel. Please note that at this time the service is unable to self-update, so new versions will require manual interaction.",
"WizardCompleted": "That's all we need for now. Media Browser has begun collecting information about your media library. Check out some of our apps, and then click <b>Finish<\/b> to view the <b>Dashboard<\/b>.",
"LabelConfigureSettings": "Configure settings",
"LabelEnableVideoImageExtraction": "Enable video image extraction",
"VideoImageExtractionHelp": "For videos that don't already have images, and that we're unable to find internet images for. This will add some additional time to the initial library scan but will result in a more pleasing presentation.",
"LabelEnableChapterImageExtractionForMovies": "Extract chapter image extraction for Movies",
"LabelChapterImageExtractionForMoviesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs as a nightly scheduled task at 4am, although this is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.",
"LabelEnableAutomaticPortMapping": "Enable automatic port mapping",
"LabelEnableAutomaticPortMappingHelp": "UPnP allows automated router configuration for easy remote access. This may not work with some router models.",
"ButtonOk": "Ok",
"ButtonCancel": "Cancel",
"ButtonNew": "New",
"HeaderSetupLibrary": "Setup your media library",
"ButtonAddMediaFolder": "Add media folder",
"LabelFolderType": "Folder type:",
"MediaFolderHelpPluginRequired": "* Requires the use of a plugin, e.g. GameBrowser or MB Bookshelf.",
"ReferToMediaLibraryWiki": "Refer to the media library wiki.",
"LabelCountry": "Country:",
"LabelLanguage": "Language:",
"HeaderPreferredMetadataLanguage": "Preferred metadata language:",
"LabelSaveLocalMetadata": "Save artwork and metadata into media folders",
"LabelSaveLocalMetadataHelp": "Saving artwork and metadata directly into media folders will put them in a place where they can be easily edited.",
"LabelDownloadInternetMetadata": "Download artwork and metadata from the internet",
"LabelDownloadInternetMetadataHelp": "Media Browser can download information about your media to enable rich presentations.",
"TabPreferences": "Preferences",
"TabPassword": "Password",
"TabLibraryAccess": "Library Access",
"TabImage": "Image",
"TabProfile": "Profile",
"TabMetadata": "Metadata",
"TabImages": "Images",
"TabCollectionTitles": "Titles",
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
"HeaderVideoPlaybackSettings": "Video Playback Settings",
"LabelAudioLanguagePreference": "Audio language preference:",
"LabelSubtitleLanguagePreference": "Subtitle language preference:",
"LabelDisplayForcedSubtitlesOnly": "Display only forced subtitles",
"TabProfiles": "Profiles",
"TabSecurity": "Security",
"ButtonAddUser": "Add User",
"ButtonSave": "Save",
"ButtonResetPassword": "Reset Password",
"LabelNewPassword": "New password:",
"LabelNewPasswordConfirm": "New password confirm:",
"HeaderCreatePassword": "Create Password",
"LabelCurrentPassword": "Current password:",
"LabelMaxParentalRating": "Maximum allowed parental rating:",
"MaxParentalRatingHelp": "Content with a higher rating will be hidden from this user.",
"LibraryAccessHelp": "Select the media folders to share with this user. Administrators will be able to edit all folders using the metadata manager.",
"ButtonDeleteImage": "Delete Image",
"ButtonUpload": "Upload",
"HeaderUploadNewImage": "Upload New Image",
"LabelDropImageHere": "Drop Image Here",
"ImageUploadAspectRatioHelp": "1:1 Aspect Ratio Recommended. JPG\/PNG only.",
"MessageNothingHere": "Nothing here.",
"MessagePleaseEnsureInternetMetadata": "Please ensure downloading of internet metadata is enabled.",
"TabSuggested": "Suggested",
"TabLatest": "Latest",
"TabUpcoming": "Upcoming",
"TabShows": "Shows",
"TabEpisodes": "Episodes",
"TabGenres": "Genres",
"TabPeople": "People",
"TabNetworks": "Networks",
"HeaderUsers": "Users",
"HeaderFilters": "Filters:",
"ButtonFilter": "Filter",
"OptionFavorite": "Favorites",
"OptionLikes": "Likes",
"OptionDislikes": "Dislikes",
"OptionActors": "Actors",
"OptionGuestStars": "Guest Stars",
"OptionDirectors": "Directors",
"OptionWriters": "Writers",
"OptionProducers": "Producers",
"HeaderResume": "Resume",
"HeaderNextUp": "Next Up",
"NoNextUpItemsMessage": "None found. Start watching your shows!",
"HeaderLatestEpisodes": "Latest Episodes",
"HeaderPersonTypes": "Person Types:",
"TabSongs": "Songs",
"TabAlbums": "Albums",
"TabArtists": "Artists",
"TabAlbumArtists": "Album Artists",
"TabMusicVideos": "Music Videos",
"ButtonSort": "Sort",
"HeaderSortBy": "Sort By:",
"HeaderSortOrder": "Sort Order:",
"OptionPlayed": "Played",
"OptionUnplayed": "Unplayed",
"OptionAscending": "Ascending",
"OptionDescending": "Descending",
"OptionRuntime": "Runtime",
"OptionReleaseDate": "Release Date",
"OptionPlayCount": "Play Count",
"OptionDatePlayed": "Date Played",
"OptionDateAdded": "Date Added",
"OptionAlbumArtist": "Album Artist",
"OptionArtist": "Artist",
"OptionAlbum": "Album",
"OptionTrackName": "Track Name",
"OptionCommunityRating": "Community Rating",
"OptionNameSort": "Name",
"OptionFolderSort": "Folders",
"OptionBudget": "Budget",
"OptionRevenue": "Revenue",
"OptionPoster": "Poster",
"OptionBackdrop": "Backdrop",
"OptionTimeline": "Timeline",
"OptionThumb": "Thumb",
"OptionBanner": "Banner",
"OptionCriticRating": "Critic Rating",
"OptionVideoBitrate": "Video Bitrate",
"OptionResumable": "Resumable",
"ScheduledTasksHelp": "Click a task to adjust its schedule.",
"ScheduledTasksTitle": "Scheduled Tasks",
"TabMyPlugins": "My Plugins",
"TabCatalog": "Catalog",
"TabUpdates": "Updates",
"PluginsTitle": "Plugins",
"HeaderAutomaticUpdates": "Automatic Updates",
"HeaderUpdateLevel": "Update Level",
"HeaderNowPlaying": "Now Playing",
"HeaderLatestAlbums": "Latest Albums",
"HeaderLatestSongs": "Latest Songs",
"HeaderRecentlyPlayed": "Recently Played",
"HeaderFrequentlyPlayed": "Frequently Played",
"DevBuildWarning": "Dev builds are the bleeding edge. Released often, these build have not been tested. The application may crash and entire features may not work at all.",
"LabelVideoType": "Video Type:",
"OptionBluray": "Bluray",
"OptionDvd": "Dvd",
"OptionIso": "Iso",
"Option3D": "3D",
"LabelFeatures": "Features:",
"OptionHasSubtitles": "Subtitles",
"OptionHasTrailer": "Trailer",
"OptionHasThemeSong": "Theme Song",
"OptionHasThemeVideo": "Theme Video",
"TabMovies": "Movies",
"TabStudios": "Studios",
"TabTrailers": "Trailers",
"HeaderLatestMovies": "Latest Movies",
"HeaderLatestTrailers": "Latest Trailers",
"OptionHasSpecialFeatures": "Special Features",
"OptionImdbRating": "IMDb Rating",
"OptionParentalRating": "Parental Rating",
"OptionPremiereDate": "Premiere Date",
"TabBasic": "Basic",
"TabAdvanced": "Advanced",
"HeaderStatus": "Status",
"OptionContinuing": "Continuing",
"OptionEnded": "Ended",
"HeaderAirDays": "Air Days:",
"OptionSunday": "Sunday",
"OptionMonday": "Monday",
"OptionTuesday": "Tuesday",
"OptionWednesday": "Wednesday",
"OptionThursday": "Thursday",
"OptionFriday": "Friday",
"OptionSaturday": "Saturday",
"HeaderManagement": "Management:",
"OptionMissingImdbId": "Missing IMDb Id",
"OptionMissingTvdbId": "Missing TheTVDB Id",
"OptionMissingOverview": "Missing Overview",
"OptionFileMetadataYearMismatch": "File\/Metadata Years Mismatched",
"TabGeneral": "General",
"TitleSupport": "Support",
"TabLog": "Log",
"TabAbout": "About",
"TabSupporterKey": "Supporter Key",
"TabBecomeSupporter": "Become a Supporter",
"MediaBrowserHasCommunity": "Media Browser has a thriving community of users and contributors.",
"CheckoutKnowledgeBase": "Check out our knowledge base to help you get the most out of Media Browser.",
"SearchKnowledgeBase": "Search the Knowledge Base",
"VisitTheCommunity": "Visit the Community",
"VisitMediaBrowserWebsite": "Visit the Media Browser Web Site",
"VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.",
"OptionHideUser": "Hide this user from login screens",
"OptionDisableUser": "Disable this user",
"OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.",
"HeaderAdvancedControl": "Advanced Control",
"LabelName": "Name:",
"OptionAllowUserToManageServer": "Allow this user to manage the server",
"HeaderFeatureAccess": "Feature Access",
"OptionAllowMediaPlayback": "Allow media playback",
"OptionAllowBrowsingLiveTv": "Allow browsing of live tv",
"OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
"OptionAllowManageLiveTv": "Allow management of live tv recordings",
"OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
"OptionMissingTmdbId": "Missing Tmdb Id",
"OptionIsHD": "HD",
"OptionIsSD": "SD",
"OptionMetascore": "Metascore",
"ButtonSelect": "Select",
"ButtonSearch": "Search",
"ButtonGroupVersions": "Group Versions",
"PismoMessage": "Utilizing Pismo File Mount through a donated license.",
"PleaseSupportOtherProduces": "Please support other free products we utilize:",
"VersionNumber": "Version {0}",
"TabPaths": "Paths",
"TabServer": "Server",
"TabTranscoding": "Transcoding",
"TitleAdvanced": "Advanced",
"LabelAutomaticUpdateLevel": "Automatic update level",
"OptionRelease": "Official Release",
"OptionBeta": "Beta",
"OptionDev": "Dev (Unstable)",
"LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates",
"LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods, when no users are active.",
"LabelEnableDebugLogging": "Enable debug logging",
"LabelRunServerAtStartup": "Run server at startup",
"LabelRunServerAtStartupHelp": "This will start the tray icon on windows startup. To start the windows service, uncheck this and run the service from the windows control panel. Please note that you cannot run both at the same time, so you will need to exit the tray icon before starting the service.",
"ButtonSelectDirectory": "Select Directory",
"LabelCustomPaths": "Specify custom paths where desired. Leave fields empty to use the defaults.",
"LabelCachePath": "Cache path:",
"LabelCachePathHelp": "This folder contains server cache files, such as images.",
"LabelImagesByNamePath": "Images by name path:",
"LabelImagesByNamePathHelp": "This folder contains actor, artist, genre and studio images.",
"LabelMetadataPath": "Metadata path:",
"LabelMetadataPathHelp": "This location contains downloaded artwork and metadata that is not configured to be stored in media folders.",
"LabelTranscodingTempPath": "Transcoding temporary path:",
"LabelTranscodingTempPathHelp": "This folder contains working files used by the transcoder.",
"TabBasics": "Basics",
"TabTV": "TV",
"TabGames": "Games",
"TabMusic": "Music",
"TabOthers": "Others",
"HeaderExtractChapterImagesFor": "Extract chapter images for:",
"OptionMovies": "Movies",
"OptionEpisodes": "Episodes",
"OptionOtherVideos": "Other Videos",
"TitleMetadata": "Metadata",
"LabelAutomaticUpdatesFanart": "Enable automatic updates from FanArt.tv",
"LabelAutomaticUpdatesTmdb": "Enable automatic updates from TheMovieDB.org",
"LabelAutomaticUpdatesTvdb": "Enable automatic updates from TheTVDB.com",
"LabelAutomaticUpdatesFanartHelp": "If enabled, new images will be downloaded automatically as they're added to fanart.tv. Existing images will not be replaced.",
"LabelAutomaticUpdatesTmdbHelp": "If enabled, new images will be downloaded automatically as they're added to TheMovieDB.org. Existing images will not be replaced.",
"LabelAutomaticUpdatesTvdbHelp": "If enabled, new images will be downloaded automatically as they're added to TheTVDB.com. Existing images will not be replaced.",
"ExtractChapterImagesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs as a nightly scheduled task at 4am, although this is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.",
"LabelMetadataDownloadLanguage": "Preferred language:",
"ButtonAutoScroll": "Auto-scroll",
"LabelImageSavingConvention": "Image saving convention:",
"LabelImageSavingConventionHelp": "Media Browser recognizes images from most major media applications. Choosing your downloading convention is useful if you also use other products.",
"OptionImageSavingCompatible": "Compatible - MB3\/Plex\/Xbmc",
"OptionImageSavingStandard": "Standard - MB3\/MB2",
"ButtonSignIn": "Sign In",
"TitleSignIn": "Sign In",
"HeaderPleaseSignIn": "Please sign in",
"LabelUser": "User:",
"LabelPassword": "Password:",
"ButtonManualLogin": "Manual Login:",
"PasswordLocalhostMessage": "Passwords are not required when logging in from localhost.",
"TabGuide": "Guide",
"TabChannels": "Channels",
"HeaderChannels": "Channels",
"TabRecordings": "Recordings",
"TabScheduled": "Scheduled",
"TabSeries": "Series",
"ButtonCancelRecording": "Cancel Recording",
"HeaderPrePostPadding": "Pre\/Post Padding",
"LabelPrePaddingMinutes": "Pre-padding minutes:",
"OptionPrePaddingRequired": "Pre-padding is required in order to record.",
"LabelPostPaddingMinutes": "Post-padding minutes:",
"OptionPostPaddingRequired": "Post-padding is required in order to record.",
"HeaderWhatsOnTV": "What's On",
"HeaderUpcomingTV": "Upcoming TV",
"TabStatus": "Status",
"TabSettings": "Settings",
"ButtonRefreshGuideData": "Refresh Guide Data",
"OptionPriority": "Priority",
"OptionRecordOnAllChannels": "Record program on all channels",
"OptionRecordAnytime": "Record program at any time",
"OptionRecordOnlyNewEpisodes": "Record only new episodes",
"HeaderDays": "Days",
"HeaderActiveRecordings": "Active Recordings",
"HeaderLatestRecordings": "Latest Recordings",
"HeaderAllRecordings": "All Recordings",
"ButtonPlay": "Play",
"ButtonEdit": "Edit",
"ButtonRecord": "Record",
"ButtonDelete": "Delete",
"ButtonRemove": "Remove",
"OptionRecordSeries": "Record Series",
"HeaderDetails": "Details",
"TitleLiveTV": "Live TV",
"LabelNumberOfGuideDays": "Number of days of guide data to download:",
"LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.",
"LabelActiveService": "Active Service:",
"LabelActiveServiceHelp": "Multiple tv plugins can be installed but only one can be active at a time.",
"OptionAutomatic": "Auto",
"LiveTvPluginRequired": "A Live TV service provider plugin is required in order to continue.",
"LiveTvPluginRequiredHelp": "Please install one of our available plugins, such as Next Pvr or ServerWmc.",
"HeaderCustomizeOptionsPerMediaType": "Customize options per media type",
"OptionDownloadThumbImage": "Thumb",
"OptionDownloadMenuImage": "Menu",
"OptionDownloadLogoImage": "Logo",
"OptionDownloadBoxImage": "Box",
"OptionDownloadDiscImage": "Disc",
"OptionDownloadBannerImage": "Banner",
"OptionDownloadBackImage": "Back",
"OptionDownloadArtImage": "Art",
"OptionDownloadPrimaryImage": "Primary",
"HeaderFetchImages": "Fetch Images:",
"HeaderImageSettings": "Image Settings",
"LabelMaxBackdropsPerItem": "Maximum number of backdrops per item:",
"LabelMaxScreenshotsPerItem": "Maximum number of screenshots per item:",
"LabelMinBackdropDownloadWidth": "Minimum backdrop download width:",
"LabelMinScreenshotDownloadWidth": "Minimum screenshot download width:",
"ButtonAddScheduledTaskTrigger": "Add Task Trigger",
"HeaderAddScheduledTaskTrigger": "Add Task Trigger",
"ButtonAdd": "Add",
"LabelTriggerType": "Trigger Type:",
"OptionDaily": "Daily",
"OptionWeekly": "Weekly",
"OptionOnInterval": "On an interval",
"OptionOnAppStartup": "On application startup",
"OptionAfterSystemEvent": "After a system event",
"LabelDay": "Day:",
"LabelTime": "Time:",
"LabelEvent": "Event:",
"OptionWakeFromSleep": "Wake from sleep",
"LabelEveryXMinutes": "Every:",
"HeaderTvTuners": "Tuners",
"HeaderGallery": "Gallery",
"HeaderLatestGames": "Latest Games",
"HeaderRecentlyPlayedGames": "Recently Played Games",
"TabGameSystems": "Game Systems",
"TitleMediaLibrary": "Media Library",
"TabFolders": "Folders",
"TabPathSubstitution": "Path Substitution",
"LabelSeasonZeroDisplayName": "Season 0 display name:",
"LabelEnableRealtimeMonitor": "Enable real time monitoring",
"LabelEnableRealtimeMonitorHelp": "Changes will be processed immediately, on supported file systems.",
"ButtonScanLibrary": "Scan Library",
"HeaderNumberOfPlayers": "Players:",
"OptionAnyNumberOfPlayers": "Any",
"Option1Player": "1+",
"Option2Player": "2+",
"Option3Player": "3+",
"Option4Player": "4+",
"HeaderMediaFolders": "Media Folders",
"HeaderThemeVideos": "Theme Videos",
"HeaderThemeSongs": "Theme Songs",
"HeaderScenes": "Scenes",
"HeaderAwardsAndReviews": "Awards and Reviews",
"HeaderSoundtracks": "Soundtracks",
"HeaderMusicVideos": "Music Videos",
"HeaderSpecialFeatures": "Special Features",
"HeaderCastCrew": "Cast & Crew",
"HeaderAdditionalParts": "Additional Parts",
"ButtonSplitVersionsApart": "Split Versions Apart",
"ButtonPlayTrailer": "Trailer",
"LabelMissing": "Missing",
"LabelOffline": "Offline",
"PathSubstitutionHelp": "Path substitutions are used for mapping a path on the server to a path that clients are able to access. By allowing clients direct access to media on the server they may be able to play them directly over the network and avoid using server resources to stream and transcode them.",
"HeaderFrom": "From",
"HeaderTo": "To",
"LabelFrom": "From:",
"LabelFromHelp": "Example: D:\\Movies (on the server)",
"LabelTo": "To:",
"LabelToHelp": "Example: \\\\MyServer\\Movies (a path clients can access)",
"ButtonAddPathSubstitution": "Add Substitution",
"OptionSpecialEpisode": "Specials",
"OptionMissingEpisode": "Missing Episodes",
"OptionUnairedEpisode": "Unaired Episodes",
"OptionEpisodeSortName": "Episode Sort Name",
"OptionSeriesSortName": "Series Name",
"OptionTvdbRating": "Tvdb Rating",
"HeaderTranscodingQualityPreference": "Transcoding Quality Preference:",
"OptionAutomaticTranscodingHelp": "The server will decide quality and speed",
"OptionHighSpeedTranscodingHelp": "Lower quality, but faster encoding",
"OptionHighQualityTranscodingHelp": "Higher quality, but slower encoding",
"OptionMaxQualityTranscodingHelp": "Best quality with slower encoding and high CPU usage",
"OptionHighSpeedTranscoding": "Higher speed",
"OptionHighQualityTranscoding": "Higher quality",
"OptionMaxQualityTranscoding": "Max quality",
"OptionEnableDebugTranscodingLogging": "Enable debug transcoding logging",
"OptionEnableDebugTranscodingLoggingHelp": "This will create very large log files and is only recommended as needed for troubleshooting purposes.",
"OptionUpscaling": "Allow clients to request upscaled video",
"OptionUpscalingHelp": "In some cases this will result in improved video quality but will increase CPU usage.",
"EditCollectionItemsHelp": "Add or remove any movies, series, albums, books or games you wish to group within this collection.",
"HeaderAddTitles": "Add Titles",
"LabelEnableDlnaPlayTo": "Enable DLNA Play To",
"LabelEnableDlnaPlayToHelp": "Media Browser can detect devices within your network and offer the ability to remote control them.",
"LabelEnableDlnaDebugLogging": "Enable DLNA debug logging",
"LabelEnableDlnaDebugLoggingHelp": "This will create large log files and should only be used as needed for troubleshooting purposes.",
"LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds of the interval between SSDP searches performed by Media Browser.",
"HeaderCustomDlnaProfiles": "Custom Profiles",
"HeaderSystemDlnaProfiles": "System Profiles",
"CustomDlnaProfilesHelp": "Create a custom profile to target a new device or override a system profile.",
"SystemDlnaProfilesHelp": "System profiles are read-only. To override a system profile, create a custom profile targeting the same device.",
"TitleDashboard": "Dashboard",
"TabHome": "Home",
"TabInfo": "Info",
"HeaderLinks": "Links",
"HeaderSystemPaths": "System Paths",
"LinkCommunity": "Community",
"LinkGithub": "Github",
"LinkApiDocumentation": "Api Documentation",
"LabelFriendlyServerName": "Friendly server name:",
"LabelFriendlyServerNameHelp": "This name will be used to identify this server. If left blank, the computer name will be used.",
"LabelPreferredDisplayLanguage": "Preferred display language",
"LabelPreferredDisplayLanguageHelp": "Translating Media Browser is an ongoing project and is not yet complete.",
"LabelReadHowYouCanContribute": "Read about how you can contribute.",
"HeaderNewCollection": "New Collection",
"NewCollectionNameExample": "Example: Star Wars Collection",
"OptionSearchForInternetMetadata": "Search the internet for artwork and metadata",
"ButtonCreate": "Create",
"LabelHttpServerPortNumber": "Http server port number:",
"LabelWebSocketPortNumber": "Web socket port number:",
"LabelEnableAutomaticPortHelp": "UPnP allows automated router configuration for remote access. This may not work with some router models.",
"LabelExternalDDNS": "External DDNS:",
"LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Media Browser apps will use it when connecting remotely.",
"TabResume": "Resume",
"TabWeather": "Weather",
"TitleAppSettings": "App Settings",
"LabelMinResumePercentage": "Min resume percentage:",
"LabelMaxResumePercentage": "Max resume percentage:",
"LabelMinResumeDuration": "Min resume duration (seconds):",
"LabelMinResumePercentageHelp": "Titles are assumed unplayed if stopped before this time",
"LabelMaxResumePercentageHelp": "Titles are assumed fully played if stopped after this time",
"LabelMinResumeDurationHelp": "Titles shorter than this will not be resumable"
}

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

@ -319,6 +319,10 @@
<EmbeddedResource Include="Localization\Server\sv.json" />
<EmbeddedResource Include="Localization\JavaScript\cs.json" />
<EmbeddedResource Include="Localization\Server\cs.json" />
<EmbeddedResource Include="Localization\JavaScript\ca.json" />
<EmbeddedResource Include="Localization\JavaScript\ms.json" />
<EmbeddedResource Include="Localization\Server\ca.json" />
<EmbeddedResource Include="Localization\Server\ms.json" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>

@ -1,5 +1,4 @@
using System.Threading;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Logging;

@ -101,7 +101,7 @@
<Name>MediaBrowser.Providers</Name>
</ProjectReference>
<ProjectReference Include="..\MediaBrowser.Dlna\MediaBrowser.Dlna.csproj">
<Project>{734098eb-6dc1-4dd0-a1ca-3140dcd2737c}</Project>
<Project>{734098EB-6DC1-4DD0-A1CA-3140DCD2737C}</Project>
<Name>MediaBrowser.Dlna</Name>
</ProjectReference>
<ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
@ -124,6 +124,10 @@
<Project>{4FD51AC5-2C16-4308-A993-C3A84F3B4582}</Project>
<Name>MediaBrowser.Api</Name>
</ProjectReference>
<ProjectReference Include="..\MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj">
<Project>{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}</Project>
<Name>MediaBrowser.MediaEncoding</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="EntryPoints\" />

@ -16,6 +16,7 @@ using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using System.Reflection;
using System.Linq;
// MONOMKBUNDLE: For the embedded version, mkbundle tool
#if MONOMKBUNDLE
using Mono.Unix;
@ -39,8 +40,13 @@ namespace MediaBrowser.Server.Mono
#else
var applicationPath = Assembly.GetEntryAssembly ().Location;
#endif
var commandArgs = Environment.GetCommandLineArgs();
// Allow this to be specified on the command line.
var customProgramDataPath = commandArgs.ElementAtOrDefault(1);
var appPaths = CreateApplicationPaths(applicationPath);
var appPaths = CreateApplicationPaths(applicationPath, customProgramDataPath);
var logManager = new NlogManager(appPaths.LogDirectoryPath, "server");
logManager.ReloadLogger(LogSeverity.Info);
@ -70,9 +76,14 @@ namespace MediaBrowser.Server.Mono
}
}
private static ServerApplicationPaths CreateApplicationPaths(string applicationPath)
private static ServerApplicationPaths CreateApplicationPaths(string applicationPath, string programDataPath)
{
return new ServerApplicationPaths(applicationPath);
if (string.IsNullOrEmpty(programDataPath))
{
return new ServerApplicationPaths(applicationPath);
}
return new ServerApplicationPaths(programDataPath, applicationPath);
}
/// <summary>

Loading…
Cancel
Save