Compare commits
203 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6c99e7951f | |||
| e44e745761 | |||
| 30c11439e4 | |||
| 0883f621f6 | |||
| 2d0784d1e5 | |||
| af0011f32a | |||
| ab6c5ac21a | |||
| 227a38fb98 | |||
| 06f9dee649 | |||
| 75680192bb | |||
| a53efb394f | |||
| 98ed32c8cf | |||
| df10ebebca | |||
| 88dc73cd66 | |||
| cd0919aeeb | |||
| ce6711b587 | |||
| e6178efcfb | |||
| 30cf0e2040 | |||
| 48d620cdb0 | |||
| 3bd487d092 | |||
| 6c8c37256b | |||
| 37b1fcbaf0 | |||
| dc111768e3 | |||
| 6589d5d5d3 | |||
| e6975a71d5 | |||
| 33b497e5f4 | |||
| c5e7c81c19 | |||
| 47d1fe7082 | |||
| 735bd574ff | |||
| 5c0d9785e0 | |||
| db14868324 | |||
| 06952833ef | |||
| 2a90e93a6f | |||
| 0d94ddb96e | |||
| c7645b55ba | |||
| 208806c027 | |||
| 8024610364 | |||
| 8e4644568b | |||
| e0a71830fa | |||
| 5b0057c258 | |||
| fb61c55fa7 | |||
| a70ef52964 | |||
| 51204ee401 | |||
| 657f165ffb | |||
| 3bd98d851a | |||
| 9eea46b19b | |||
| 76fb5d260f | |||
| 267cd46ea0 | |||
| 96f6a0161f | |||
| 7bc53adc67 | |||
| 8ecff73c18 | |||
| 35e65ad18c | |||
| 8def8eaa86 | |||
| c0774ad9b9 | |||
| f306cbe457 | |||
| 577b989c4c | |||
| e6b162f4f6 | |||
| b40cc1879f | |||
| 8a7c7bf77d | |||
| 38a1179de5 | |||
| f263b4d92b | |||
| c612727116 | |||
| ab9c9df7d6 | |||
| c607e50433 | |||
| df5555bdf1 | |||
| 9506339e6f | |||
| 68605a7560 | |||
| 839dd7315a | |||
| f1314628d7 | |||
| e23ed30b0c | |||
| 55cb46927e | |||
| 654c3b7403 | |||
| 4195754b0c | |||
| 96a6f17bd7 | |||
| 61d99c4061 | |||
| 0a6e91a2f9 | |||
| cf9e786e45 | |||
| ba1d3fd3e6 | |||
| ac01fd48fa | |||
| f53fb694be | |||
| 1ecd8fa87d | |||
| ce1c9d697b | |||
| c67a76fb03 | |||
| 3d72a4497c | |||
| 30cc8e0861 | |||
| 30ca3f6df9 | |||
| cccfed6efe | |||
| 82c148e997 | |||
| c50a3e7a27 | |||
| 811cbe2339 | |||
| a8bf881ae1 | |||
| c446be734c | |||
| f0f7f6af55 | |||
| 19bd8ae193 | |||
| 81d8f74e0d | |||
| 0011d568c6 | |||
| 159718bf4f | |||
| b9ff3ca729 | |||
| 4f3ac36d7f | |||
| a9257ad366 | |||
| 2218459877 | |||
| 8f5e2946d6 | |||
| 19c3b251a0 | |||
| ce4c855f00 | |||
| 48c45447e4 | |||
| 4683144987 | |||
| 238a237cb5 | |||
| cde1ca9f83 | |||
| 93e2d8d822 | |||
| 8609389bdb | |||
| 48f985b70a | |||
| b02afb3af8 | |||
| b9d814c3fb | |||
| 1b54ce1d48 | |||
| e3efc0d19b | |||
| 3ba9e09164 | |||
| d148c10c66 | |||
| 2b573b9070 | |||
| 4cb03ab36c | |||
| 3ebbcc77e9 | |||
| 8be97295dc | |||
| 3dd411f159 | |||
| 8b141dc51a | |||
| 278aa3f820 | |||
| a7a38478db | |||
| b2e004b825 | |||
| 10df6e878c | |||
| eac11c1b80 | |||
| 0ad5da67ea | |||
| 3fb9ffca5b | |||
| 8e7fe5ee55 | |||
| 9554c6a1c6 | |||
| 8597876c92 | |||
| 3df7d81bde | |||
| f82ae4fdda | |||
| 4a981225b3 | |||
| 0cd115c268 | |||
| 291b0582e4 | |||
| f4e48872a2 | |||
| 9e320700e2 | |||
| 7f0ff70ca9 | |||
| 65e3b7f951 | |||
| 156f145c69 | |||
| a0c941dac2 | |||
| 33eb9d40f3 | |||
| cf8186653c | |||
| 75403d3b94 | |||
| 083bab0528 | |||
| ee3e3787a8 | |||
| a3895ab149 | |||
| c590c6a265 | |||
| 6c1bf4b85f | |||
| 3632d6b0c6 | |||
| bf95792524 | |||
| 885b421201 | |||
| b11143e2c4 | |||
| 0df1ebb83e | |||
| 204d7a79aa | |||
| e68629b8bc | |||
| 84858bea65 | |||
| 243633365e | |||
| dc7e18b97b | |||
| d3c553c945 | |||
| 05fc15d164 | |||
| a71961c35b | |||
| da8af696c5 | |||
| 12f5df33da | |||
| f184276ef8 | |||
| c72ab927a6 | |||
| 7bc2375a77 | |||
| 392fbb836f | |||
| 0cb8603c80 | |||
| 20fc02053a | |||
| e389dc39a7 | |||
| fbd4669da8 | |||
| c138c6643a | |||
| a2b876608f | |||
| c95c1a7038 | |||
| 9e1c5e71e4 | |||
| aba68720bb | |||
| 1b1722c875 | |||
| 248af2eaa2 | |||
| 0709174560 | |||
| b0c0ed050d | |||
| e3a085774c | |||
| 6f0ddc37a0 | |||
| d3eb5ceabe | |||
| 1bffb7395c | |||
| e636a42744 | |||
| d3927a1265 | |||
| d6fc106588 | |||
| 68fc833280 | |||
| 5a8443fe72 | |||
| 153fb4a248 | |||
| 72ef5b01d2 | |||
| 0854fee4ee | |||
| e122d40fb9 | |||
| b696aa4340 | |||
| e32dd303e3 | |||
| 7c524abb84 | |||
| 993bac8a29 | |||
| 51769847ad | |||
| 918e7ad682 |
@@ -36,6 +36,8 @@ src\Umbraco.Web.UI\media\*
|
||||
src\Umbraco.Web.UI\masterpages\*
|
||||
src\Umbraco.Web.UI\macroScripts\*
|
||||
src\Umbraco.Web.UI\xslt\*
|
||||
src\Umbraco.Web.UI\images\*
|
||||
src\Umbraco.Web.UI\scripts\*
|
||||
|
||||
umbraco\presentation\umbraco\plugins\uComponents\uComponentsInstaller.ascx
|
||||
umbraco\presentation\packages\uComponents\MultiNodePicker\CustomTreeService.asmx
|
||||
|
||||
@@ -10,7 +10,14 @@ d03fcffb8834a9583a56813bb44b6abbd9f042cc Release-4.6.0
|
||||
096f20bb0575d6199f20fcb3147b63554e765a74 Release-4.8.0
|
||||
8f8a203857886b373148af29edd57460a42940be Release-4.8.1
|
||||
de73e687ddf6086ed52b6554676c1632865d07f2 Release-4.9.0
|
||||
de73e687ddf6086ed52b6554676c1632865d07f2 Release-4.9.0
|
||||
0000000000000000000000000000000000000000 Release-4.9.0
|
||||
0000000000000000000000000000000000000000 Release-4.9.0
|
||||
09f5a69cf19ebf7ddd9501e5258bee1e6a125391 Release-4.9.0
|
||||
8d7d8609e2e4b971da99cd97f72132ce85ce3333 Release-4.9.1
|
||||
f6da531fbb4c251ff61d314e2a7effb13c71e74a Release-4.10.0
|
||||
20e4dff821d8ac2527a5353618fa1a23ea1d8b34 Release-4.11.0
|
||||
7f827760cb49d749616859f528d19dde64807947 Release-4.11.1
|
||||
7f827760cb49d749616859f528d19dde64807947 Release-4.11.1
|
||||
6eb5f2fb5a88aa29ea544499df9160a1b31b5638 Release-4.11.1
|
||||
73711b806a4044dbf0d7d7c095ddfdda23b09932 4.11.2
|
||||
73711b806a4044dbf0d7d7c095ddfdda23b09932 4.11.2
|
||||
0000000000000000000000000000000000000000 4.11.2
|
||||
73711b806a4044dbf0d7d7c095ddfdda23b09932 Release-4.11.2
|
||||
77db220b89e166b3c0736ed321ecfd6416cddbcd Release-4.11.2.1
|
||||
|
||||
@@ -1,3 +1,14 @@
|
||||
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\App_Code\dummy.txt
|
||||
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\App_Data\dummy.txt
|
||||
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\App_Plugins\dummy.txt
|
||||
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\css\dummy.txt
|
||||
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\macroScripts\dummy.txt
|
||||
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\masterpages\dummy.txt
|
||||
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\media\dummy.txt
|
||||
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\scripts\dummy.txt
|
||||
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\usercontrols\dummy.txt
|
||||
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\xslt\dummy.txt
|
||||
|
||||
NuGet.exe pack NuSpecs\UmbracoCms.Core.nuspec
|
||||
NuGet.exe pack NuSpecs\UmbracoCms.nuspec
|
||||
REM pause
|
||||
@@ -2,7 +2,7 @@
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>UmbracoCms.Core</id>
|
||||
<version>4.10.0</version>
|
||||
<version>4.11.2.2</version>
|
||||
<title>Umbraco Cms Core Binaries</title>
|
||||
<authors>Morten Christensen</authors>
|
||||
<owners>Umbraco HQ</owners>
|
||||
@@ -26,6 +26,7 @@
|
||||
<file src="..\_BuildOutput\WebApp\bin\ICSharpCode.SharpZipLib.dll" target="lib\ICSharpCode.SharpZipLib.dll" />
|
||||
<file src="..\_BuildOutput\WebApp\bin\interfaces.dll" target="lib\interfaces.dll" />
|
||||
<file src="..\_BuildOutput\WebApp\bin\Lucene.Net.dll" target="lib\Lucene.Net.dll" />
|
||||
<file src="..\_BuildOutput\WebApp\bin\log4net.dll" target="lib\log4net.dll" />
|
||||
<file src="..\_BuildOutput\WebApp\bin\Microsoft.ApplicationBlocks.Data.dll" target="lib\Microsoft.ApplicationBlocks.Data.dll" />
|
||||
<file src="..\_BuildOutput\WebApp\bin\Microsoft.Web.Helpers.dll" target="lib\Microsoft.Web.Helpers.dll" />
|
||||
<file src="..\_BuildOutput\WebApp\bin\Microsoft.Web.Infrastructure.dll" target="lib\Microsoft.Web.Infrastructure.dll" />
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>UmbracoCms</id>
|
||||
<version>4.10.0</version>
|
||||
<version>4.11.2.2</version>
|
||||
<title>Umbraco Cms</title>
|
||||
<authors>Morten Christensen</authors>
|
||||
<owners>Umbraco HQ</owners>
|
||||
@@ -15,7 +15,7 @@
|
||||
<language>en-US</language>
|
||||
<tags>umbraco</tags>
|
||||
<dependencies>
|
||||
<dependency id="UmbracoCms.Core" version="4.9.0" />
|
||||
<dependency id="UmbracoCms.Core" version="4.11.2.2" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
@@ -27,16 +27,19 @@
|
||||
<file src="..\_BuildOutput\WebApp\scripts\**" target="Content\scripts" />
|
||||
<file src="..\_BuildOutput\WebApp\usercontrols\**" target="Content\usercontrols" />
|
||||
<file src="..\_BuildOutput\WebApp\xslt\**" target="Content\xslt" />
|
||||
<file src="..\_BuildOutput\WebApp\Views\**" target="Content\Views" />
|
||||
<file src="..\_BuildOutput\WebApp\default.aspx" target="Content\default.aspx" />
|
||||
<file src="..\_BuildOutput\WebApp\Web.config" target="Content\Web.config" />
|
||||
<file src="..\_BuildOutput\WebApp\App_Browsers\**" target="UmbracoFiles\App_Browsers" />
|
||||
<file src="..\_BuildOutput\WebApp\App_Code\**" target="UmbracoFiles\App_Code" />
|
||||
<file src="..\_BuildOutput\WebApp\App_Data\**" target="UmbracoFiles\App_Data" />
|
||||
<file src="..\_BuildOutput\WebApp\App_Plugins\**" target="UmbracoFiles\App_Plugins" />
|
||||
<file src="..\_BuildOutput\WebApp\config\**" target="UmbracoFiles\config" />
|
||||
<file src="..\_BuildOutput\WebApp\install\**" target="UmbracoFiles\install" />
|
||||
<file src="..\_BuildOutput\WebApp\umbraco\**" target="UmbracoFiles\umbraco" />
|
||||
<file src="..\_BuildOutput\WebApp\umbraco_client\**" target="UmbracoFiles\umbraco_client" />
|
||||
<file src="..\_BuildOutput\WebApp\Web.config" target="UmbracoFiles\Web.config" />
|
||||
<file src="..\_BuildOutput\WebApp\Global.asax" target="UmbracoFiles\Global.asax" />
|
||||
<file src="tools\install.ps1" target="tools\install.ps1" />
|
||||
<file src="tools\Readme.txt" target="tools\Readme.txt" />
|
||||
</files>
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace Umbraco.Core
|
||||
/// <remarks>
|
||||
/// Any caching that is done in the application (app wide) should be done through this property
|
||||
/// </remarks>
|
||||
internal CacheHelper ApplicationCache { get; private set; }
|
||||
public CacheHelper ApplicationCache { get; private set; }
|
||||
|
||||
// IsReady is set to true by the boot manager once it has successfully booted
|
||||
// note - the original umbraco module checks on content.Instance in umbraco.dll
|
||||
@@ -111,6 +111,7 @@ namespace Umbraco.Core
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string ConfigurationStatus
|
||||
{
|
||||
get
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace Umbraco.Core
|
||||
/// <remarks>
|
||||
/// This class may be opened publicly at some point but needs a review of what is absoletely necessary.
|
||||
/// </remarks>
|
||||
internal class CacheHelper
|
||||
public class CacheHelper
|
||||
{
|
||||
private readonly Cache _cache;
|
||||
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Umbraco.Core.CodeAnnotations
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// An attribute used to decorate classes or methods that have been marked to be obsoleted
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This attribute exists because sometimes we may not want to explicitly [Obsolete] a class or method because we
|
||||
/// know it is still in use and we don't want warning messages showing up in developers output windows when they compile, however
|
||||
/// we will be able to produce reports declaring which classes/methods/etc... have been marked for being obsoleted in the near future
|
||||
/// </remarks>
|
||||
internal class UmbracoDeprecateAttribute : Attribute
|
||||
{
|
||||
/// <summary>
|
||||
/// Constructor requries a description
|
||||
/// </summary>
|
||||
/// <param name="description"></param>
|
||||
public UmbracoDeprecateAttribute(string description)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,16 +3,30 @@ using System;
|
||||
namespace Umbraco.Core.CodeAnnotations
|
||||
{
|
||||
/// <summary>
|
||||
/// An attribute used to decorate classes or methods that have been marked to become public but require more testing and review
|
||||
/// before this is possible.
|
||||
/// Marks the program elements that Umbraco is experimenting with and could become public.
|
||||
/// </summary>
|
||||
internal class UmbracoExperimentalFeatureAttribute : Attribute
|
||||
/// <remarks>
|
||||
/// <para>Indicates that Umbraco is experimenting with code that potentially could become
|
||||
/// public, but we're not sure, and the code is not stable and can be refactored at any time.</para>
|
||||
/// <para>The issue tracker should contain more details, discussion, and planning.</para>
|
||||
/// </remarks>
|
||||
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = false)]
|
||||
internal sealed class UmbracoExperimentalFeatureAttribute : Attribute
|
||||
{
|
||||
/// <summary>
|
||||
/// constructor requires a tracker url and a description
|
||||
/// Initializes a new instance of the <see cref="UmbracoExperimentalFeatureAttribute"/> class with a description.
|
||||
/// </summary>
|
||||
/// <param name="trackerUrl"></param>
|
||||
/// <param name="description"></param>
|
||||
/// <param name="description">The text string that describes what is intended.</param>
|
||||
public UmbracoExperimentalFeatureAttribute(string description)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="UmbracoExperimentalFeatureAttribute"/> class with a tracker url and a description.
|
||||
/// </summary>
|
||||
/// <param name="trackerUrl">The url of a tracker issue containing more details, discussion, and planning.</param>
|
||||
/// <param name="description">The text string that describes what is intended.</param>
|
||||
public UmbracoExperimentalFeatureAttribute(string trackerUrl, string description)
|
||||
{
|
||||
|
||||
|
||||
@@ -3,20 +3,31 @@ using System;
|
||||
namespace Umbraco.Core.CodeAnnotations
|
||||
{
|
||||
/// <summary>
|
||||
/// An attribute used to decorate classes or methods that have potential to become part of the public API
|
||||
/// Marks the program elements that Umbraco is considering making public.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Classes, properties or methods marked with this attribute will have a tracker URL assigned where discussions may take place
|
||||
/// regarding whether or not this should become part of the public APIs and if/when. Please note that any objects marked with this
|
||||
/// attribute may not ever become public, this attribute exists to tag code that has potential to become public pending reviews.
|
||||
/// <para>Indicates that Umbraco considers making the (currently internal) program element public
|
||||
/// at some point in the future, but the decision is not fully made yet and is still pending reviews.</para>
|
||||
/// <para>Note that it is not a commitment to make the program element public. It may not ever become public.</para>
|
||||
/// <para>The issue tracker should contain more details, discussion, and planning.</para>
|
||||
/// </remarks>
|
||||
internal class UmbracoProposedPublicAttribute : Attribute
|
||||
[AttributeUsage(AttributeTargets.All, AllowMultiple=false, Inherited=false)]
|
||||
internal sealed class UmbracoProposedPublicAttribute : Attribute
|
||||
{
|
||||
/// <summary>
|
||||
/// constructor requires a tracker url and a description
|
||||
/// Initializes a new instance of the <see cref="UmbracoProposedPublicAttribute"/> class with a description.
|
||||
/// </summary>
|
||||
/// <param name="trackerUrl"></param>
|
||||
/// <param name="description"></param>
|
||||
/// <param name="description">The text string that describes what is intended.</param>
|
||||
public UmbracoProposedPublicAttribute(string description)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="UmbracoProposedPublicAttribute"/> class with a tracker url and a description.
|
||||
/// </summary>
|
||||
/// <param name="trackerUrl">The url of a tracker issue containing more details, discussion, and planning.</param>
|
||||
/// <param name="description">The text string that describes what is intended.</param>
|
||||
public UmbracoProposedPublicAttribute(string trackerUrl, string description)
|
||||
{
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Umbraco.Core.CodeAnnotations
|
||||
{
|
||||
/// <summary>
|
||||
/// Marks the program elements that Umbraco will obsolete.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Indicates that Umbraco will obsolete the program element at some point in the future, but we do not want to
|
||||
/// explicitely mark it [Obsolete] yet to avoid warning messages showing when developers compile Umbraco.
|
||||
/// </remarks>
|
||||
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = false)]
|
||||
internal sealed class UmbracoWillObsoleteAttribute : Attribute
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="UmbracoWillObsoleteAttribute"/> class with a description.
|
||||
/// </summary>
|
||||
/// <param name="description">The text string that describes what is intended.</param>
|
||||
public UmbracoWillObsoleteAttribute(string description)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="UmbracoWillObsoleteAttribute"/> class with a tracker url and a description.
|
||||
/// </summary>
|
||||
/// <param name="trackerUrl">The url of a tracker issue containing more details, discussion, and planning.</param>
|
||||
/// <param name="description">The text string that describes what is intended.</param>
|
||||
public UmbracoWillObsoleteAttribute(string trackerUrl, string description)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ using System.Configuration;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Configuration;
|
||||
using System.Web.Routing;
|
||||
using System.Xml;
|
||||
using System.Xml.Linq;
|
||||
using Umbraco.Core.IO;
|
||||
@@ -27,7 +28,7 @@ namespace Umbraco.Core.Configuration
|
||||
#region Private static fields
|
||||
|
||||
// CURRENT UMBRACO VERSION ID
|
||||
private const string CurrentUmbracoVersion = "4.10.0";
|
||||
private const string CurrentUmbracoVersion = "4.11.2.2";
|
||||
|
||||
private static string _reservedUrlsCache;
|
||||
private static string _reservedPathsCache;
|
||||
@@ -57,9 +58,9 @@ namespace Umbraco.Core.Configuration
|
||||
{
|
||||
get
|
||||
{
|
||||
return ConfigurationManager.AppSettings.ContainsKey("umbracoReservedPaths")
|
||||
? ConfigurationManager.AppSettings["umbracoReservedPaths"]
|
||||
: string.Empty;
|
||||
return ConfigurationManager.AppSettings.ContainsKey("umbracoReservedPaths")
|
||||
? ConfigurationManager.AppSettings["umbracoReservedPaths"]
|
||||
: string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -549,7 +550,29 @@ namespace Umbraco.Core.Configuration
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <summary>
|
||||
/// Determines whether the current request is reserved based on the route table and
|
||||
/// whether the specified URL is reserved or is inside a reserved path.
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="httpContext"></param>
|
||||
/// <param name="routes">The route collection to lookup the request in</param>
|
||||
/// <returns></returns>
|
||||
public static bool IsReservedPathOrUrl(string url, HttpContextBase httpContext, RouteCollection routes)
|
||||
{
|
||||
if (httpContext == null) throw new ArgumentNullException("httpContext");
|
||||
if (routes == null) throw new ArgumentNullException("routes");
|
||||
|
||||
//check if the current request matches a route, if so then it is reserved.
|
||||
var route = routes.GetRouteData(httpContext);
|
||||
if (route != null)
|
||||
return true;
|
||||
|
||||
//continue with the standard ignore routine
|
||||
return IsReservedPathOrUrl(url);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the specified URL is reserved or is inside a reserved path.
|
||||
/// </summary>
|
||||
/// <param name="url">The URL to check.</param>
|
||||
@@ -557,7 +580,7 @@ namespace Umbraco.Core.Configuration
|
||||
/// <c>true</c> if the specified URL is reserved; otherwise, <c>false</c>.
|
||||
/// </returns>
|
||||
public static bool IsReservedPathOrUrl(string url)
|
||||
{
|
||||
{
|
||||
// check if GlobalSettings.ReservedPaths and GlobalSettings.ReservedUrls are unchanged
|
||||
if (!object.ReferenceEquals(_reservedPathsCache, GlobalSettings.ReservedPaths)
|
||||
|| !object.ReferenceEquals(_reservedUrlsCache, GlobalSettings.ReservedUrls))
|
||||
|
||||
@@ -25,6 +25,18 @@ namespace Umbraco.Core.Configuration
|
||||
/// </summary>
|
||||
internal class UmbracoSettings
|
||||
{
|
||||
/// <summary>
|
||||
/// Used in unit testing to reset all config items that were set with property setters (i.e. did not come from config)
|
||||
/// </summary>
|
||||
internal static void ResetSetters()
|
||||
{
|
||||
_addTrailingSlash = null;
|
||||
_forceSafeAliases = null;
|
||||
_useLegacySchema = null;
|
||||
_useDomainPrefixes = null;
|
||||
_umbracoLibraryCacheDuration = null;
|
||||
}
|
||||
|
||||
internal const string TempFriendlyXmlChildContainerNodename = ""; // "children";
|
||||
|
||||
/// <summary>
|
||||
@@ -601,6 +613,8 @@ namespace Umbraco.Core.Configuration
|
||||
}
|
||||
}
|
||||
|
||||
private static bool? _forceSafeAliases;
|
||||
|
||||
/// <summary>
|
||||
/// Whether to force safe aliases (no spaces, no special characters) at businesslogic level on contenttypes and propertytypes
|
||||
/// </summary>
|
||||
@@ -608,6 +622,9 @@ namespace Umbraco.Core.Configuration
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_forceSafeAliases.HasValue)
|
||||
return _forceSafeAliases.Value;
|
||||
|
||||
string forceSafeAlias = GetKey("/settings/content/ForceSafeAliases");
|
||||
if (String.IsNullOrEmpty(forceSafeAlias))
|
||||
return true;
|
||||
@@ -622,7 +639,11 @@ namespace Umbraco.Core.Configuration
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
internal set
|
||||
{
|
||||
//used for unit testing
|
||||
_forceSafeAliases = value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -645,6 +666,8 @@ namespace Umbraco.Core.Configuration
|
||||
get { return GetKey("/settings/content/scripteditor/scriptFileTypes"); }
|
||||
}
|
||||
|
||||
private static int? _umbracoLibraryCacheDuration;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the duration in seconds to cache queries to umbraco library member and media methods
|
||||
/// Default is 1800 seconds (30 minutes)
|
||||
@@ -653,6 +676,9 @@ namespace Umbraco.Core.Configuration
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_umbracoLibraryCacheDuration.HasValue)
|
||||
return _umbracoLibraryCacheDuration.Value;
|
||||
|
||||
string libraryCacheDuration = GetKey("/settings/content/UmbracoLibraryCacheDuration");
|
||||
if (String.IsNullOrEmpty(libraryCacheDuration))
|
||||
return 1800;
|
||||
@@ -669,6 +695,7 @@ namespace Umbraco.Core.Configuration
|
||||
}
|
||||
|
||||
}
|
||||
internal set { _umbracoLibraryCacheDuration = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace Umbraco.Core
|
||||
{
|
||||
var str = (string)value;
|
||||
if (str == "1") return true;
|
||||
if (str == "0") return false;
|
||||
if (str == "0" || str == "") return false;
|
||||
}
|
||||
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
|
||||
@@ -4,99 +4,135 @@ using Umbraco.Core.Logging;
|
||||
|
||||
namespace Umbraco.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Starts the timer and invokes a callback upon disposal. Provides a simple way of timing an operation by wrapping it in a <code>using</code> (C#) statement.
|
||||
/// </summary>
|
||||
/// <example>
|
||||
/// <code>
|
||||
/// Console.WriteLine("Testing Stopwatchdisposable, should be 567:");
|
||||
// using (var timer = new DisposableTimer(result => Console.WriteLine("Took {0}ms", result)))
|
||||
// {
|
||||
// Thread.Sleep(567);
|
||||
// }
|
||||
/// </code>
|
||||
/// </example>
|
||||
public class DisposableTimer : DisposableObject
|
||||
{
|
||||
private readonly Stopwatch _stopwatch = Stopwatch.StartNew();
|
||||
private readonly Action<long> _callback;
|
||||
/// <summary>
|
||||
/// Starts the timer and invokes a callback upon disposal. Provides a simple way of timing an operation by wrapping it in a <code>using</code> (C#) statement.
|
||||
/// </summary>
|
||||
/// <example>
|
||||
/// <code>
|
||||
/// Console.WriteLine("Testing Stopwatchdisposable, should be 567:");
|
||||
// using (var timer = new DisposableTimer(result => Console.WriteLine("Took {0}ms", result)))
|
||||
// {
|
||||
// Thread.Sleep(567);
|
||||
// }
|
||||
/// </code>
|
||||
/// </example>
|
||||
public class DisposableTimer : DisposableObject
|
||||
{
|
||||
private readonly Stopwatch _stopwatch = Stopwatch.StartNew();
|
||||
private readonly Action<long> _callback;
|
||||
|
||||
protected DisposableTimer(Action<long> callback)
|
||||
{
|
||||
_callback = callback;
|
||||
}
|
||||
protected DisposableTimer(Action<long> callback)
|
||||
{
|
||||
_callback = callback;
|
||||
}
|
||||
|
||||
public Stopwatch Stopwatch
|
||||
{
|
||||
get { return _stopwatch; }
|
||||
}
|
||||
public Stopwatch Stopwatch
|
||||
{
|
||||
get { return _stopwatch; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Starts the timer and invokes the specified callback upon disposal.
|
||||
/// </summary>
|
||||
/// <param name="callback">The callback.</param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer Start(Action<long> callback)
|
||||
{
|
||||
return new DisposableTimer(callback);
|
||||
}
|
||||
/// <summary>
|
||||
/// Starts the timer and invokes the specified callback upon disposal.
|
||||
/// </summary>
|
||||
/// <param name="callback">The callback.</param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer Start(Action<long> callback)
|
||||
{
|
||||
return new DisposableTimer(callback);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a start and end log entry as Info and tracks how long it takes until disposed.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="startMessage"></param>
|
||||
/// <param name="completeMessage"></param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer TraceDuration<T>(string startMessage, string completeMessage)
|
||||
{
|
||||
return TraceDuration(typeof(T), startMessage, completeMessage);
|
||||
}
|
||||
public static DisposableTimer TraceDuration<T>(Func<string> startMessage, Func<string> completeMessage)
|
||||
{
|
||||
return TraceDuration(typeof(T), startMessage, completeMessage);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a start and end log entry as Info and tracks how long it takes until disposed.
|
||||
/// </summary>
|
||||
/// <param name="loggerType"></param>
|
||||
/// <param name="startMessage"></param>
|
||||
/// <param name="completeMessage"></param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer TraceDuration(Type loggerType, string startMessage, string completeMessage)
|
||||
{
|
||||
LogHelper.Info(loggerType, () => startMessage);
|
||||
return new DisposableTimer(x => LogHelper.Info(loggerType, () => completeMessage + " (took " + x + "ms)"));
|
||||
}
|
||||
public static DisposableTimer TraceDuration(Type loggerType, Func<string> startMessage, Func<string> completeMessage)
|
||||
{
|
||||
LogHelper.Debug(loggerType, startMessage);
|
||||
return new DisposableTimer(x => LogHelper.Info(loggerType, () => completeMessage() + " (took " + x + "ms)"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="startMessage"></param>
|
||||
/// <param name="completeMessage"></param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer DebugDuration<T>(string startMessage, string completeMessage)
|
||||
{
|
||||
return DebugDuration(typeof(T), startMessage, completeMessage);
|
||||
}
|
||||
/// <summary>
|
||||
/// Adds a start and end log entry as Info and tracks how long it takes until disposed.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="startMessage"></param>
|
||||
/// <param name="completeMessage"></param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer TraceDuration<T>(string startMessage, string completeMessage)
|
||||
{
|
||||
return TraceDuration(typeof(T), startMessage, completeMessage);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
|
||||
/// </summary>
|
||||
/// <param name="loggerType"></param>
|
||||
/// <param name="startMessage"></param>
|
||||
/// <param name="completeMessage"></param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer DebugDuration(Type loggerType, string startMessage, string completeMessage)
|
||||
{
|
||||
LogHelper.Debug(loggerType, () => startMessage);
|
||||
return new DisposableTimer(x => LogHelper.Debug(loggerType, () => completeMessage + " (took " + x + "ms)"));
|
||||
}
|
||||
/// <summary>
|
||||
/// Adds a start and end log entry as Info and tracks how long it takes until disposed.
|
||||
/// </summary>
|
||||
/// <param name="loggerType"></param>
|
||||
/// <param name="startMessage"></param>
|
||||
/// <param name="completeMessage"></param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer TraceDuration(Type loggerType, string startMessage, string completeMessage)
|
||||
{
|
||||
LogHelper.Info(loggerType, () => startMessage);
|
||||
return new DisposableTimer(x => LogHelper.Info(loggerType, () => completeMessage + " (took " + x + "ms)"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles the disposal of resources. Derived from abstract class <see cref="DisposableObject"/> which handles common required locking logic.
|
||||
/// </summary>
|
||||
protected override void DisposeResources()
|
||||
{
|
||||
_callback.Invoke(Stopwatch.ElapsedMilliseconds);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="startMessage"></param>
|
||||
/// <param name="completeMessage"></param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer DebugDuration<T>(string startMessage, string completeMessage)
|
||||
{
|
||||
return DebugDuration(typeof(T), startMessage, completeMessage);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="startMessage"></param>
|
||||
/// <param name="completeMessage"></param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer DebugDuration<T>(Func<string> startMessage, Func<string> completeMessage)
|
||||
{
|
||||
return DebugDuration(typeof(T), startMessage, completeMessage);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
|
||||
/// </summary>
|
||||
/// <param name="loggerType"></param>
|
||||
/// <param name="startMessage"></param>
|
||||
/// <param name="completeMessage"></param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer DebugDuration(Type loggerType, string startMessage, string completeMessage)
|
||||
{
|
||||
LogHelper.Debug(loggerType, () => startMessage);
|
||||
return new DisposableTimer(x => LogHelper.Debug(loggerType, () => completeMessage + " (took " + x + "ms)"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
|
||||
/// </summary>
|
||||
/// <param name="loggerType"></param>
|
||||
/// <param name="startMessage"></param>
|
||||
/// <param name="completeMessage"></param>
|
||||
/// <returns></returns>
|
||||
public static DisposableTimer DebugDuration(Type loggerType, Func<string> startMessage, Func<string> completeMessage)
|
||||
{
|
||||
LogHelper.Debug(loggerType, startMessage);
|
||||
return new DisposableTimer(x => LogHelper.Debug(loggerType, () => completeMessage() + " (took " + x + "ms)"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles the disposal of resources. Derived from abstract class <see cref="DisposableObject"/> which handles common required locking logic.
|
||||
/// </summary>
|
||||
protected override void DisposeResources()
|
||||
{
|
||||
_callback.Invoke(Stopwatch.ElapsedMilliseconds);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Dynamic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Umbraco.Core.Logging;
|
||||
|
||||
namespace Umbraco.Core.Dynamics
|
||||
{
|
||||
/// <summary>
|
||||
/// A helper class to try invoke members, find properties, etc...
|
||||
/// </summary>
|
||||
internal class DynamicInstanceHelper
|
||||
{
|
||||
|
||||
internal class TryInvokeMemberResult
|
||||
{
|
||||
public object ObjectResult { get; private set; }
|
||||
public TryInvokeMemberSuccessReason Reason { get; private set; }
|
||||
|
||||
public TryInvokeMemberResult(object result, TryInvokeMemberSuccessReason reason)
|
||||
{
|
||||
ObjectResult = result;
|
||||
Reason = reason;
|
||||
}
|
||||
}
|
||||
|
||||
internal enum TryInvokeMemberSuccessReason
|
||||
{
|
||||
FoundProperty,
|
||||
FoundMethod,
|
||||
FoundExtensionMethod
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to invoke a member based on the dynamic instance
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="thisObject">The object instance to invoke the extension method for</param>
|
||||
/// <param name="binder"></param>
|
||||
/// <param name="args"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// First tries to find a property with the binder name, if that fails it will try to find a static or instance method
|
||||
/// on the object that matches the binder name
|
||||
/// </remarks>
|
||||
public static Attempt<TryInvokeMemberResult> TryInvokeMember<T>(T thisObject, InvokeMemberBinder binder, object[] args)
|
||||
{
|
||||
return TryInvokeMember<T>(thisObject, binder, args, null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to invoke a member based on the dynamic instance
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="thisObject">The object instance to invoke the extension method for</param>
|
||||
/// <param name="binder"></param>
|
||||
/// <param name="args"></param>
|
||||
/// <param name="findExtensionMethodsOnTypes">The types to scan for extension methods </param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// First tries to find a property with the binder name, if that fails it will try to find a static or instance method
|
||||
/// on the object that matches the binder name, if that fails it will then attempt to invoke an extension method
|
||||
/// based on the binder name and the extension method types to scan.
|
||||
/// </remarks>
|
||||
public static Attempt<TryInvokeMemberResult> TryInvokeMember<T>(T thisObject,
|
||||
InvokeMemberBinder binder,
|
||||
object[] args,
|
||||
IEnumerable<Type> findExtensionMethodsOnTypes)
|
||||
{
|
||||
//TODO: We MUST cache the result here, it is very expensive to keep finding extension methods!
|
||||
object result;
|
||||
try
|
||||
{
|
||||
//Property?
|
||||
result = typeof(T).InvokeMember(binder.Name,
|
||||
System.Reflection.BindingFlags.Instance |
|
||||
System.Reflection.BindingFlags.Public |
|
||||
System.Reflection.BindingFlags.GetProperty,
|
||||
null,
|
||||
thisObject,
|
||||
args);
|
||||
return new Attempt<TryInvokeMemberResult>(true, new TryInvokeMemberResult(result, TryInvokeMemberSuccessReason.FoundProperty));
|
||||
}
|
||||
catch (MissingMethodException)
|
||||
{
|
||||
try
|
||||
{
|
||||
//Static or Instance Method?
|
||||
result = typeof(T).InvokeMember(binder.Name,
|
||||
System.Reflection.BindingFlags.Instance |
|
||||
System.Reflection.BindingFlags.Public |
|
||||
System.Reflection.BindingFlags.Static |
|
||||
System.Reflection.BindingFlags.InvokeMethod,
|
||||
null,
|
||||
thisObject,
|
||||
args);
|
||||
return new Attempt<TryInvokeMemberResult>(true, new TryInvokeMemberResult(result, TryInvokeMemberSuccessReason.FoundMethod));
|
||||
}
|
||||
catch (MissingMethodException)
|
||||
{
|
||||
if (findExtensionMethodsOnTypes != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
result = FindAndExecuteExtensionMethod(thisObject, args, binder.Name, findExtensionMethodsOnTypes);
|
||||
return new Attempt<TryInvokeMemberResult>(true, new TryInvokeMemberResult(result, TryInvokeMemberSuccessReason.FoundExtensionMethod));
|
||||
}
|
||||
catch (TargetInvocationException ext)
|
||||
{
|
||||
//don't log here, we return this exception because the caller may need to do something specific when
|
||||
//this exception occurs.
|
||||
return new Attempt<TryInvokeMemberResult>(ext);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var sb = new StringBuilder("An error occurred finding an executing an extension method for type ");
|
||||
sb.Append(typeof (T));
|
||||
sb.Append("Types searched for extension methods were ");
|
||||
foreach(var t in findExtensionMethodsOnTypes)
|
||||
{
|
||||
sb.Append(t + ",");
|
||||
}
|
||||
LogHelper.Error<DynamicInstanceHelper>(sb.ToString(), ex);
|
||||
return new Attempt<TryInvokeMemberResult>(ex);
|
||||
}
|
||||
}
|
||||
return Attempt<TryInvokeMemberResult>.False;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.Error<DynamicInstanceHelper>("An unhandled exception occurred in method TryInvokeMember", ex);
|
||||
return new Attempt<TryInvokeMemberResult>(ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to find an extension method that matches the name and arguments based on scanning the Type's passed in
|
||||
/// to the findMethodsOnTypes parameter
|
||||
/// </summary>
|
||||
/// <param name="thisObject">The instance object to execute the extension method for</param>
|
||||
/// <param name="args"></param>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="findMethodsOnTypes"></param>
|
||||
/// <returns></returns>
|
||||
internal static object FindAndExecuteExtensionMethod<T>(T thisObject,
|
||||
object[] args,
|
||||
string name,
|
||||
IEnumerable<Type> findMethodsOnTypes)
|
||||
{
|
||||
object result = null;
|
||||
|
||||
//find known extension methods that match the first type in the list
|
||||
MethodInfo toExecute = null;
|
||||
foreach (var t in findMethodsOnTypes)
|
||||
{
|
||||
toExecute = ExtensionMethodFinder.FindExtensionMethod(t, args, name, false);
|
||||
if (toExecute != null)
|
||||
break;
|
||||
}
|
||||
|
||||
if (toExecute != null)
|
||||
{
|
||||
var genericArgs = (new[] { (object)thisObject }).Concat(args);
|
||||
result = toExecute.Invoke(null, genericArgs.ToArray());
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new MissingMethodException();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Dynamic;
|
||||
using System.Reflection;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.XPath;
|
||||
using System.Collections;
|
||||
@@ -10,7 +11,7 @@ using System.Web;
|
||||
|
||||
namespace Umbraco.Core.Dynamics
|
||||
{
|
||||
public class DynamicXml : DynamicObject, IEnumerable
|
||||
public class DynamicXml : DynamicObject, IEnumerable<DynamicXml>, IEnumerable<XElement>
|
||||
{
|
||||
public XElement BaseElement { get; set; }
|
||||
|
||||
@@ -70,7 +71,53 @@ namespace Umbraco.Core.Dynamics
|
||||
HandleIEnumerableXElement(elements, out result);
|
||||
return true; //anyway
|
||||
}
|
||||
return base.TryInvokeMember(binder, args, out result);
|
||||
|
||||
//ok, now lets try to match by member, property, extensino method
|
||||
var attempt = DynamicInstanceHelper.TryInvokeMember(this, binder, args, new[]
|
||||
{
|
||||
typeof (IEnumerable<DynamicXml>),
|
||||
typeof (IEnumerable<XElement>),
|
||||
typeof (DynamicXml)
|
||||
});
|
||||
|
||||
if (attempt.Success)
|
||||
{
|
||||
result = attempt.Result.ObjectResult;
|
||||
|
||||
//need to check the return type and possibly cast if result is from an extension method found
|
||||
if (attempt.Result.Reason == DynamicInstanceHelper.TryInvokeMemberSuccessReason.FoundExtensionMethod)
|
||||
{
|
||||
//if the result is already a DynamicXml instance, then we do not need to cast
|
||||
if (attempt.Result.ObjectResult != null && !(attempt.Result.ObjectResult is DynamicXml))
|
||||
{
|
||||
if (attempt.Result.ObjectResult is XElement)
|
||||
{
|
||||
result = new DynamicXml((XElement)attempt.Result.ObjectResult);
|
||||
}
|
||||
else if (attempt.Result.ObjectResult is IEnumerable<XElement>)
|
||||
{
|
||||
result = ((IEnumerable<XElement>)attempt.Result.ObjectResult).Select(x => new DynamicXml(x));
|
||||
}
|
||||
else if (attempt.Result.ObjectResult is IEnumerable<DynamicXml>)
|
||||
{
|
||||
result = ((IEnumerable<DynamicXml>)attempt.Result.ObjectResult).Select(x => new DynamicXml(x.BaseElement));
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//this is the result of an extension method execution gone wrong so we return dynamic null
|
||||
if (attempt.Result.Reason == DynamicInstanceHelper.TryInvokeMemberSuccessReason.FoundExtensionMethod
|
||||
&& attempt.Error != null && attempt.Error is TargetInvocationException)
|
||||
{
|
||||
result = new DynamicNull();
|
||||
return true;
|
||||
}
|
||||
|
||||
result = null;
|
||||
return false;
|
||||
|
||||
}
|
||||
public override bool TryGetMember(GetMemberBinder binder, out object result)
|
||||
{
|
||||
@@ -181,20 +228,41 @@ namespace Umbraco.Core.Dynamics
|
||||
return new DynamicXml(this.BaseElement.XPathSelectElements(expression).FirstOrDefault());
|
||||
}
|
||||
|
||||
public IEnumerator GetEnumerator()
|
||||
{
|
||||
return this.BaseElement.Elements().Select(e => new DynamicXml(e)).GetEnumerator();
|
||||
}
|
||||
IEnumerator<XElement> IEnumerable<XElement>.GetEnumerator()
|
||||
{
|
||||
return this.BaseElement.Elements().GetEnumerator();
|
||||
}
|
||||
|
||||
public IEnumerator<DynamicXml> GetEnumerator()
|
||||
{
|
||||
return this.BaseElement.Elements().Select(e => new DynamicXml(e)).GetEnumerator();
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return GetEnumerator();
|
||||
}
|
||||
|
||||
public int Count()
|
||||
{
|
||||
return this.BaseElement.Elements().Count();
|
||||
return ((IEnumerable<XElement>)this).Count();
|
||||
}
|
||||
|
||||
public bool Any()
|
||||
{
|
||||
return this.BaseElement.Elements().Any();
|
||||
return ((IEnumerable<XElement>)this).Any();
|
||||
}
|
||||
|
||||
public IEnumerable<DynamicXml> Take(int count)
|
||||
{
|
||||
return ((IEnumerable<DynamicXml>)this).Take(count);
|
||||
}
|
||||
|
||||
public IEnumerable<DynamicXml> Skip(int count)
|
||||
{
|
||||
return ((IEnumerable<DynamicXml>)this).Skip(count);
|
||||
}
|
||||
|
||||
public bool IsNull()
|
||||
{
|
||||
return false;
|
||||
@@ -514,7 +582,7 @@ namespace Umbraco.Core.Dynamics
|
||||
}
|
||||
public IEnumerable<DynamicXml> Ancestors(Func<XElement, bool> func)
|
||||
{
|
||||
List<XElement> ancestorList = new List<XElement>();
|
||||
var ancestorList = new List<XElement>();
|
||||
var node = this.BaseElement;
|
||||
while (node != null)
|
||||
{
|
||||
@@ -661,5 +729,7 @@ namespace Umbraco.Core.Dynamics
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace Umbraco.Core.Dynamics
|
||||
);
|
||||
|
||||
//add the extension methods defined in IEnumerable
|
||||
candidates = candidates.Concat(typeof(IEnumerable).GetMethods(BindingFlags.Static | BindingFlags.Public));
|
||||
candidates = candidates.Concat(typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public));
|
||||
|
||||
//filter by name
|
||||
var methodsByName = candidates.Where(m => m.Name == name);
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Umbraco.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Used to create a hash code from multiple objects.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// .Net has a class the same as this: System.Web.Util.HashCodeCombiner and of course it works for all sorts of things
|
||||
/// which we've not included here as we just need a quick easy class for this in order to create a unique
|
||||
/// hash of directories/files to see if they have changed.
|
||||
/// </remarks>
|
||||
internal class HashCodeCombiner
|
||||
{
|
||||
private long _combinedHash = 5381L;
|
||||
|
||||
internal void AddInt(int i)
|
||||
{
|
||||
_combinedHash = ((_combinedHash << 5) + _combinedHash) ^ i;
|
||||
}
|
||||
|
||||
internal void AddObject(object o)
|
||||
{
|
||||
AddInt(o.GetHashCode());
|
||||
}
|
||||
|
||||
internal void AddDateTime(DateTime d)
|
||||
{
|
||||
AddInt(d.GetHashCode());
|
||||
}
|
||||
|
||||
internal void AddCaseInsensitiveString(string s)
|
||||
{
|
||||
if (s != null)
|
||||
AddInt((StringComparer.InvariantCultureIgnoreCase).GetHashCode(s));
|
||||
}
|
||||
|
||||
internal void AddFileSystemItem(FileSystemInfo f)
|
||||
{
|
||||
//if it doesn't exist, don't proceed.
|
||||
if (!f.Exists)
|
||||
return;
|
||||
|
||||
AddCaseInsensitiveString(f.FullName);
|
||||
AddDateTime(f.CreationTimeUtc);
|
||||
AddDateTime(f.LastWriteTimeUtc);
|
||||
|
||||
//check if it is a file or folder
|
||||
var fileInfo = f as FileInfo;
|
||||
if (fileInfo != null)
|
||||
{
|
||||
AddInt(fileInfo.Length.GetHashCode());
|
||||
}
|
||||
|
||||
var dirInfo = f as DirectoryInfo;
|
||||
if (dirInfo != null)
|
||||
{
|
||||
foreach (var d in dirInfo.GetFiles())
|
||||
{
|
||||
AddFile(d);
|
||||
}
|
||||
foreach (var s in dirInfo.GetDirectories())
|
||||
{
|
||||
AddFolder(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void AddFile(FileInfo f)
|
||||
{
|
||||
AddFileSystemItem(f);
|
||||
}
|
||||
|
||||
internal void AddFolder(DirectoryInfo d)
|
||||
{
|
||||
AddFileSystemItem(d);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the hex code of the combined hash code
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
internal string GetCombinedHashCode()
|
||||
{
|
||||
return _combinedHash.ToString("x", CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -220,7 +220,7 @@ namespace Umbraco.Core.IO
|
||||
{
|
||||
foreach (var character in Path.GetInvalidFileNameChars())
|
||||
{
|
||||
filePath = filePath.Replace(character, '_');
|
||||
filePath = filePath.Replace(character, '-');
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -240,10 +240,14 @@ namespace Umbraco.Core.IO
|
||||
if (reservedCharacters.IndexOf(character) == -1)
|
||||
stringBuilder.Append(character);
|
||||
else
|
||||
stringBuilder.Append("_");
|
||||
stringBuilder.Append("-");
|
||||
}
|
||||
|
||||
return stringBuilder.ToString();
|
||||
// Remove repeating dashes
|
||||
// From: http://stackoverflow.com/questions/5111967/regex-to-remove-a-specific-repeated-character
|
||||
var reducedString = Regex.Replace(stringBuilder.ToString(), "-+", "-");
|
||||
|
||||
return reducedString;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
using Umbraco.Core.CodeAnnotations;
|
||||
using Umbraco.Core.Logging;
|
||||
|
||||
namespace Umbraco.Core.IO
|
||||
{
|
||||
|
||||
[UmbracoExperimentalFeature("http://issues.umbraco.org/issue/U4-1156", "Will be declared public after 4.10")]
|
||||
internal class PhysicalFileSystem : IFileSystem
|
||||
{
|
||||
@@ -43,9 +43,13 @@ namespace Umbraco.Core.IO
|
||||
return Directory.EnumerateDirectories(path).Select(GetRelativePath);
|
||||
}
|
||||
catch (UnauthorizedAccessException ex)
|
||||
{ }
|
||||
{
|
||||
LogHelper.Error<PhysicalFileSystem>("Not authorized to get directories", ex);
|
||||
}
|
||||
catch (DirectoryNotFoundException ex)
|
||||
{ }
|
||||
{
|
||||
LogHelper.Error<PhysicalFileSystem>("Directory not found", ex);
|
||||
}
|
||||
|
||||
return Enumerable.Empty<string>();
|
||||
}
|
||||
@@ -65,7 +69,9 @@ namespace Umbraco.Core.IO
|
||||
Directory.Delete(GetFullPath(path), recursive);
|
||||
}
|
||||
catch (DirectoryNotFoundException ex)
|
||||
{ }
|
||||
{
|
||||
LogHelper.Error<PhysicalFileSystem>("Directory not found", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public bool DirectoryExists(string path)
|
||||
@@ -80,9 +86,7 @@ namespace Umbraco.Core.IO
|
||||
|
||||
public void AddFile(string path, Stream stream, bool overrideIfExists)
|
||||
{
|
||||
if (FileExists(path) && !overrideIfExists)
|
||||
throw new InvalidOperationException(string.Format("A file at path '{0}' already exists",
|
||||
path));
|
||||
if (FileExists(path) && !overrideIfExists) throw new InvalidOperationException(string.Format("A file at path '{0}' already exists", path));
|
||||
|
||||
EnsureDirectory(Path.GetDirectoryName(path));
|
||||
|
||||
@@ -108,9 +112,13 @@ namespace Umbraco.Core.IO
|
||||
return Directory.EnumerateFiles(path, filter).Select(GetRelativePath);
|
||||
}
|
||||
catch (UnauthorizedAccessException ex)
|
||||
{ }
|
||||
{
|
||||
LogHelper.Error<PhysicalFileSystem>("Not authorized to get directories", ex);
|
||||
}
|
||||
catch (DirectoryNotFoundException ex)
|
||||
{ }
|
||||
{
|
||||
LogHelper.Error<PhysicalFileSystem>("Directory not found", ex);
|
||||
}
|
||||
|
||||
return Enumerable.Empty<string>();
|
||||
}
|
||||
@@ -130,7 +138,9 @@ namespace Umbraco.Core.IO
|
||||
File.Delete(GetFullPath(path));
|
||||
}
|
||||
catch (FileNotFoundException ex)
|
||||
{ }
|
||||
{
|
||||
LogHelper.Error<PhysicalFileSystem>("File not found", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public bool FileExists(string path)
|
||||
@@ -188,7 +198,7 @@ namespace Umbraco.Core.IO
|
||||
|
||||
protected string EnsureTrailingSeparator(string path)
|
||||
{
|
||||
if (!path.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
|
||||
if (!path.EndsWith(Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal))
|
||||
path = path + Path.DirectorySeparatorChar;
|
||||
|
||||
return path;
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace Umbraco.Core.IO
|
||||
//all paths has a starting but no trailing /
|
||||
public class SystemDirectories
|
||||
{
|
||||
//TODO: Why on earth is this even configurable? You cannot change the /Bin folder in ASP.Net
|
||||
public static string Bin
|
||||
{
|
||||
get
|
||||
@@ -68,6 +69,15 @@ namespace Umbraco.Core.IO
|
||||
}
|
||||
}
|
||||
|
||||
public static string AppPlugins
|
||||
{
|
||||
get
|
||||
{
|
||||
//NOTE: this is not configurable and shouldn't need to be
|
||||
return "~/App_Plugins";
|
||||
}
|
||||
}
|
||||
|
||||
public static string MvcViews
|
||||
{
|
||||
get
|
||||
|
||||
@@ -60,49 +60,77 @@ namespace Umbraco.Core.Logging
|
||||
|
||||
#region Warn
|
||||
|
||||
public static void Warn(Type callingType, string message, params object[] format)
|
||||
public static void Warn(Type callingType, string message, params Func<object>[] formatItems)
|
||||
{
|
||||
var logger = LogManager.GetLogger(callingType);
|
||||
if (logger != null)
|
||||
logger.WarnFormat(PrefixThreadId(message), format);
|
||||
if (logger == null || !logger.IsWarnEnabled) return;
|
||||
logger.WarnFormat(PrefixThreadId(message), formatItems.Select(x => x.Invoke()).ToArray());
|
||||
}
|
||||
|
||||
public static void Warn(Type callingType, TraceContext trace, string message, params object[] format)
|
||||
public static void Warn(Type callingType, string message, bool showHttpTrace, params Func<object>[] formatItems)
|
||||
{
|
||||
if (trace != null)
|
||||
Mandate.ParameterNotNull(callingType, "callingType");
|
||||
Mandate.ParameterNotNullOrEmpty(message, "message");
|
||||
|
||||
if (showHttpTrace && HttpContext.Current != null)
|
||||
{
|
||||
trace.Warn(string.Format(message, format));
|
||||
HttpContext.Current.Trace.Warn(callingType.Name, string.Format(message, formatItems.Select(x => x.Invoke()).ToArray()));
|
||||
}
|
||||
|
||||
var logger = LogManager.GetLogger(callingType);
|
||||
if (logger != null)
|
||||
logger.WarnFormat(PrefixThreadId(message), format);
|
||||
if (logger == null || !logger.IsWarnEnabled) return;
|
||||
logger.WarnFormat(PrefixThreadId(message), formatItems.Select(x => x.Invoke()).ToArray());
|
||||
|
||||
}
|
||||
|
||||
public static void WarnWithException(Type callingType, string message, Exception e, params Func<object>[] formatItems)
|
||||
{
|
||||
WarnWithException(callingType, message, false, e, formatItems);
|
||||
}
|
||||
|
||||
public static void WarnWithException(Type callingType, string message, bool showHttpTrace, Exception e, params Func<object>[] formatItems)
|
||||
{
|
||||
Mandate.ParameterNotNull(e, "e");
|
||||
Mandate.ParameterNotNull(callingType, "callingType");
|
||||
Mandate.ParameterNotNullOrEmpty(message, "message");
|
||||
|
||||
if (showHttpTrace && HttpContext.Current != null)
|
||||
{
|
||||
HttpContext.Current.Trace.Warn(
|
||||
callingType.Name,
|
||||
string.Format(message, formatItems.Select(x => x.Invoke()).ToArray()),
|
||||
e);
|
||||
}
|
||||
|
||||
var logger = LogManager.GetLogger(callingType);
|
||||
if (logger == null || !logger.IsWarnEnabled) return;
|
||||
var executedParams = formatItems.Select(x => x.Invoke()).ToArray();
|
||||
logger.WarnFormat(PrefixThreadId(message) + ". Exception: " + e, executedParams);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a warn log
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="message"></param>
|
||||
/// <param name="items"></param>
|
||||
public static void Warn<T>(string message, params object[] items)
|
||||
/// <param name="formatItems"></param>
|
||||
public static void Warn<T>(string message, params Func<object>[] formatItems)
|
||||
{
|
||||
var logger = LoggerFor<T>();
|
||||
if (logger != null)
|
||||
logger.WarnFormat(PrefixThreadId(message), items);
|
||||
Warn(typeof(T), message, formatItems);
|
||||
}
|
||||
|
||||
public static void Warn<T>(string message, TraceContext trace, params object[] items)
|
||||
public static void Warn<T>(string message, bool showHttpTrace, params Func<object>[] formatItems)
|
||||
{
|
||||
if (trace != null)
|
||||
{
|
||||
trace.Warn(string.Format(message, items));
|
||||
}
|
||||
Warn(typeof(T), message, showHttpTrace, formatItems);
|
||||
}
|
||||
|
||||
var logger = LoggerFor<T>();
|
||||
if (logger != null)
|
||||
logger.WarnFormat(PrefixThreadId(message), items);
|
||||
public static void WarnWithException<T>(string message, Exception e, params Func<object>[] formatItems)
|
||||
{
|
||||
WarnWithException(typeof(T), message, e, formatItems);
|
||||
}
|
||||
public static void WarnWithException<T>(string message, bool showHttpTrace, Exception e, params Func<object>[] formatItems)
|
||||
{
|
||||
WarnWithException(typeof(T), message, showHttpTrace, e, formatItems);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -214,13 +242,15 @@ namespace Umbraco.Core.Logging
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="generateMessageFormat"></param>
|
||||
/// <param name="trace"></param>
|
||||
/// <param name="showHttpTrace"></param>
|
||||
/// <param name="formatItems"></param>
|
||||
public static void Debug<T>(string generateMessageFormat, TraceContext trace, params Func<object>[] formatItems)
|
||||
public static void Debug<T>(string generateMessageFormat, bool showHttpTrace, params Func<object>[] formatItems)
|
||||
{
|
||||
if (trace != null)
|
||||
if (showHttpTrace && HttpContext.Current != null)
|
||||
{
|
||||
trace.Write(string.Format(generateMessageFormat, formatItems.Select(x => x())));
|
||||
HttpContext.Current.Trace.Write(
|
||||
typeof(T).Name,
|
||||
string.Format(generateMessageFormat, formatItems.Select(x => x()).ToArray()));
|
||||
}
|
||||
Debug(typeof(T), generateMessageFormat, formatItems);
|
||||
}
|
||||
|
||||
@@ -66,8 +66,7 @@ namespace Umbraco.Core.Macros
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var macroAlias = attributes["macroalias"] ?? attributes["alias"];
|
||||
var macroAlias = attributes.ContainsKey("macroalias") ? attributes["macroalias"] : attributes["alias"];
|
||||
|
||||
//call the callback now that we have the macro parsed
|
||||
macroFoundCallback(macroAlias, attributes);
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Umbraco.Core.Media
|
||||
{
|
||||
public interface IImageUrlProvider
|
||||
{
|
||||
string Name { get; }
|
||||
string GetImageUrlFromMedia(int mediaId, IDictionary<string, string> parameters);
|
||||
string GetImageUrlFromFileName(string specifiedSrc, IDictionary<string, string> parameters);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Web;
|
||||
using System.Web.UI;
|
||||
using Umbraco.Core.Macros;
|
||||
using umbraco.interfaces;
|
||||
@@ -47,7 +48,7 @@ namespace Umbraco.Core.ObjectResolution
|
||||
/// </remarks>
|
||||
internal string GetValueFromMacroControl(Control macroControl)
|
||||
{
|
||||
return ((IMacroGuiRendering)macroControl).Value;
|
||||
return HttpUtility.HtmlDecode(((IMacroGuiRendering)macroControl).Value);
|
||||
}
|
||||
|
||||
/// <remarks>
|
||||
@@ -74,7 +75,7 @@ namespace Umbraco.Core.ObjectResolution
|
||||
{
|
||||
if (!string.IsNullOrEmpty(prop.Value))
|
||||
{
|
||||
instance.Value = prop.Value;
|
||||
instance.Value = HttpUtility.HtmlDecode(prop.Value);
|
||||
}
|
||||
var macroControl = instance as Control;
|
||||
if (macroControl != null)
|
||||
|
||||
+710
-290
File diff suppressed because it is too large
Load Diff
@@ -21,16 +21,7 @@ namespace Umbraco.Core.PropertyEditors
|
||||
/// <returns></returns>
|
||||
public Attempt<object> ConvertPropertyValue(object value)
|
||||
{
|
||||
if (value == null) return new Attempt<object>(false, null);
|
||||
//if its already a DateTime
|
||||
if (TypeHelper.IsTypeAssignableFrom<DateTime>(value))
|
||||
return new Attempt<object>(true, value);
|
||||
//convert to string
|
||||
var asString = Convert.ToString(value);
|
||||
DateTime dt;
|
||||
return DateTime.TryParse(asString, out dt)
|
||||
? new Attempt<object>(true, dt)
|
||||
: new Attempt<object>(false, null);
|
||||
return value.TryConvertTo(typeof(DateTime));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,18 +16,7 @@ namespace Umbraco.Core.PropertyEditors
|
||||
/// <returns></returns>
|
||||
public Attempt<object> ConvertPropertyValue(object value)
|
||||
{
|
||||
if (value == null) return new Attempt<object>(false, null);
|
||||
//if its already a bool
|
||||
if (TypeHelper.IsTypeAssignableFrom<bool>(value))
|
||||
return new Attempt<object>(true, value);
|
||||
//convert to string
|
||||
var asString = Convert.ToString(value);
|
||||
bool asBool;
|
||||
return bool.TryParse(asString, out asBool)
|
||||
? new Attempt<object>(true, asBool)
|
||||
: bool.TryParse(asString.Replace("1", "true").Replace("0", "false"), out asBool) //convert 0 or 1 to true or false
|
||||
? new Attempt<object>(true, asBool)
|
||||
: new Attempt<object>(false, null);
|
||||
return value.TryConvertTo(typeof(bool));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Net.Mime;
|
||||
using System.Web;
|
||||
using Umbraco.Core.Dynamics;
|
||||
using Umbraco.Core.Models;
|
||||
using umbraco.interfaces;
|
||||
|
||||
@@ -14,6 +13,7 @@ namespace Umbraco.Core
|
||||
/// </summary>
|
||||
public static class PublishedContentExtensions
|
||||
{
|
||||
|
||||
|
||||
|
||||
#region GetProperty
|
||||
@@ -41,24 +41,33 @@ namespace Umbraco.Core
|
||||
#endregion
|
||||
|
||||
#region GetPropertyValue
|
||||
public static string GetPropertyValue(this IPublishedContent doc, string alias)
|
||||
public static object GetPropertyValue(this IPublishedContent doc, string alias)
|
||||
{
|
||||
return doc.GetPropertyValue(alias, false);
|
||||
}
|
||||
public static string GetPropertyValue(this IPublishedContent doc, string alias, string fallback)
|
||||
public static object GetPropertyValue(this IPublishedContent doc, string alias, string fallback)
|
||||
{
|
||||
var prop = doc.GetPropertyValue(alias);
|
||||
return !prop.IsNullOrWhiteSpace() ? prop : fallback;
|
||||
return (prop != null && !Convert.ToString(prop).IsNullOrWhiteSpace()) ? prop : fallback;
|
||||
}
|
||||
public static string GetPropertyValue(this IPublishedContent doc, string alias, bool recursive)
|
||||
public static object GetPropertyValue(this IPublishedContent doc, string alias, bool recursive)
|
||||
{
|
||||
var p = doc.GetProperty(alias, recursive);
|
||||
return p == null ? null : Convert.ToString(p.Value);
|
||||
if (p == null) return null;
|
||||
|
||||
//Here we need to put the value through the IPropertyEditorValueConverter's
|
||||
//get the data type id for the current property
|
||||
var dataType = PublishedContentHelper.GetDataType(doc.DocumentTypeAlias, alias);
|
||||
//convert the string value to a known type
|
||||
var converted = PublishedContentHelper.ConvertPropertyValue(p.Value, dataType, doc.DocumentTypeAlias, alias);
|
||||
return converted.Success
|
||||
? converted.Result
|
||||
: p.Value;
|
||||
}
|
||||
public static string GetPropertyValue(this IPublishedContent doc, string alias, bool recursive, string fallback)
|
||||
public static object GetPropertyValue(this IPublishedContent doc, string alias, bool recursive, string fallback)
|
||||
{
|
||||
var prop = doc.GetPropertyValue(alias, recursive);
|
||||
return !prop.IsNullOrWhiteSpace() ? prop : fallback;
|
||||
return (prop != null && !Convert.ToString(prop).IsNullOrWhiteSpace()) ? prop : fallback;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -125,23 +134,51 @@ namespace Umbraco.Core
|
||||
/// then the default value of type T is returned.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="prop"></param>
|
||||
/// <param name="doc"></param>
|
||||
/// <param name="alias"></param>
|
||||
/// <returns></returns>
|
||||
public static T GetPropertyValue<T>(this IPublishedContent prop, string alias)
|
||||
public static T GetPropertyValue<T>(this IPublishedContent doc, string alias)
|
||||
{
|
||||
return prop.GetPropertyValue<T>(alias, default(T));
|
||||
return doc.GetPropertyValue<T>(alias, default(T));
|
||||
}
|
||||
|
||||
public static T GetPropertyValue<T>(this IPublishedContent prop, string alias, bool recursive, T ifCannotConvert)
|
||||
{
|
||||
var p = prop.GetProperty(alias, recursive);
|
||||
if (p == null)
|
||||
return ifCannotConvert;
|
||||
|
||||
//before we try to convert it manually, lets see if the PropertyEditorValueConverter does this for us
|
||||
//Here we need to put the value through the IPropertyEditorValueConverter's
|
||||
//get the data type id for the current property
|
||||
var dataType = PublishedContentHelper.GetDataType(prop.DocumentTypeAlias, alias);
|
||||
//convert the value to a known type
|
||||
var converted = PublishedContentHelper.ConvertPropertyValue(p.Value, dataType, prop.DocumentTypeAlias, alias);
|
||||
if (converted.Success)
|
||||
{
|
||||
//if its successful, check if its the correct type and return it
|
||||
if (converted.Result is T)
|
||||
{
|
||||
return (T)converted.Result;
|
||||
}
|
||||
//if that's not correct, try converting the converted type
|
||||
var reConverted = converted.Result.TryConvertTo<T>();
|
||||
if (reConverted.Success)
|
||||
{
|
||||
return reConverted.Result;
|
||||
}
|
||||
}
|
||||
|
||||
//last, if all the above has failed, we'll just try converting the raw value straight to 'T'
|
||||
var manualConverted = p.Value.TryConvertTo<T>();
|
||||
if (manualConverted.Success)
|
||||
return manualConverted.Result;
|
||||
return ifCannotConvert;
|
||||
}
|
||||
|
||||
public static T GetPropertyValue<T>(this IPublishedContent prop, string alias, T ifCannotConvert)
|
||||
{
|
||||
var p = prop.GetProperty(alias);
|
||||
if (p == null)
|
||||
return default(T);
|
||||
var converted = p.Value.TryConvertTo<T>();
|
||||
if (converted.Success)
|
||||
return converted.Result;
|
||||
return ifCannotConvert;
|
||||
return prop.GetPropertyValue<T>(alias, false, ifCannotConvert);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Dynamics;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
|
||||
namespace Umbraco.Core
|
||||
{
|
||||
internal class PublishedContentHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// This callback is used only so we can set it dynamically because in the "Core" project currently we don't have
|
||||
/// access to the business logic layer.
|
||||
/// TODO: Once 6.0 is released we need to change this to use the new business logic layer that we can access from
|
||||
/// this proejct. Until then this will return a Guid.Empty but the callback will need to be set in the WebBootManager
|
||||
/// to work in the website. if people use this in a non-web aspect without the WebBootManager, the the IPropertyEditorValueConverters
|
||||
/// will not be executed.
|
||||
/// </summary>
|
||||
internal static Func<string, string, Guid> GetDataTypeCallback = (docTypeAlias, propertyAlias) => Guid.Empty;
|
||||
|
||||
internal static Guid GetDataType(string docTypeAlias, string propertyAlias)
|
||||
{
|
||||
return GetDataTypeCallback(docTypeAlias, propertyAlias);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts the currentValue to a correctly typed value based on known registered converters, then based on known standards.
|
||||
/// </summary>
|
||||
/// <param name="currentValue"></param>
|
||||
/// <param name="dataType"></param>
|
||||
/// <param name="docTypeAlias"></param>
|
||||
/// <param name="propertyTypeAlias"></param>
|
||||
/// <returns></returns>
|
||||
internal static Attempt<object> ConvertPropertyValue(object currentValue, Guid dataType, string docTypeAlias, string propertyTypeAlias)
|
||||
{
|
||||
if (currentValue == null) return Attempt<object>.False;
|
||||
|
||||
//First lets check all registered converters for this data type.
|
||||
var converters = PropertyEditorValueConvertersResolver.Current.Converters
|
||||
.Where(x => x.IsConverterFor(dataType, docTypeAlias, propertyTypeAlias))
|
||||
.ToArray();
|
||||
|
||||
//try to convert the value with any of the converters:
|
||||
foreach (var converted in converters
|
||||
.Select(p => p.ConvertPropertyValue(currentValue))
|
||||
.Where(converted => converted.Success))
|
||||
{
|
||||
return new Attempt<object>(true, converted.Result);
|
||||
}
|
||||
|
||||
//if none of the converters worked, then we'll process this from what we know
|
||||
|
||||
var sResult = Convert.ToString(currentValue).Trim();
|
||||
|
||||
//this will eat csv strings, so only do it if the decimal also includes a decimal seperator (according to the current culture)
|
||||
if (sResult.Contains(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator))
|
||||
{
|
||||
decimal dResult;
|
||||
if (decimal.TryParse(sResult, System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.CurrentCulture, out dResult))
|
||||
{
|
||||
return new Attempt<object>(true, dResult);
|
||||
}
|
||||
}
|
||||
//process string booleans as booleans
|
||||
if (sResult.InvariantEquals("true"))
|
||||
{
|
||||
return new Attempt<object>(true, true);
|
||||
}
|
||||
if (sResult.InvariantEquals("false"))
|
||||
{
|
||||
return new Attempt<object>(true, false);
|
||||
}
|
||||
|
||||
//a really rough check to see if this may be valid xml
|
||||
//TODO: This is legacy code, I'm sure there's a better and nicer way
|
||||
if (sResult.StartsWith("<") && sResult.EndsWith(">") && sResult.Contains("/"))
|
||||
{
|
||||
try
|
||||
{
|
||||
var e = XElement.Parse(DynamicXml.StripDashesInElementOrAttributeNames(sResult), LoadOptions.None);
|
||||
|
||||
//check that the document element is not one of the disallowed elements
|
||||
//allows RTE to still return as html if it's valid xhtml
|
||||
var documentElement = e.Name.LocalName;
|
||||
|
||||
//TODO: See note against this setting, pretty sure we don't need this
|
||||
if (!UmbracoSettings.NotDynamicXmlDocumentElements.Any(
|
||||
tag => string.Equals(tag, documentElement, StringComparison.CurrentCultureIgnoreCase)))
|
||||
{
|
||||
return new Attempt<object>(true, new DynamicXml(e));
|
||||
}
|
||||
return Attempt<object>.False;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return Attempt<object>.False;
|
||||
}
|
||||
}
|
||||
return Attempt<object>.False;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -54,7 +54,7 @@
|
||||
<Compile Include="AssemblyExtensions.cs" />
|
||||
<Compile Include="Attempt.cs" />
|
||||
<Compile Include="CacheHelper.cs" />
|
||||
<Compile Include="CodeAnnotations\UmbracoDeprecateAttribute.cs" />
|
||||
<Compile Include="CodeAnnotations\UmbracoWillObsoleteAttribute.cs" />
|
||||
<Compile Include="CodeAnnotations\UmbracoExperimentalFeatureAttribute.cs" />
|
||||
<Compile Include="CodeAnnotations\UmbracoProposedPublicAttribute.cs" />
|
||||
<Compile Include="Configuration\FileSystemProviderElement.cs" />
|
||||
@@ -65,8 +65,11 @@
|
||||
<Compile Include="DictionaryExtensions.cs" />
|
||||
<Compile Include="Dictionary\CultureDictionaryFactoryResolver.cs" />
|
||||
<Compile Include="Dictionary\ICultureDictionaryFactory.cs" />
|
||||
<Compile Include="Dynamics\DynamicInstanceHelper.cs" />
|
||||
<Compile Include="Enum.cs" />
|
||||
<Compile Include="HashCodeCombiner.cs" />
|
||||
<Compile Include="IO\FileSystemWrapper.cs" />
|
||||
<Compile Include="Media\IImageUrlProvider.cs" />
|
||||
<Compile Include="PublishedContentExtensions.cs" />
|
||||
<Compile Include="Dictionary\ICultureDictionary.cs" />
|
||||
<Compile Include="Dynamics\ClassFactory.cs" />
|
||||
@@ -124,6 +127,7 @@
|
||||
<Compile Include="ObjectResolution\Resolution.cs" />
|
||||
<Compile Include="ObjectResolution\ResolverBase.cs" />
|
||||
<Compile Include="ObjectResolution\SingleObjectResolverBase.cs" />
|
||||
<Compile Include="PublishedContentHelper.cs" />
|
||||
<Compile Include="RenderingEngine.cs" />
|
||||
<Compile Include="TypeExtensions.cs" />
|
||||
<Compile Include="ReadLock.cs" />
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace Umbraco.Tests
|
||||
TestHelper.SetupLog4NetForTests();
|
||||
|
||||
//this ensures its reset
|
||||
PluginManager.Current = new PluginManager();
|
||||
PluginManager.Current = new PluginManager(false);
|
||||
|
||||
//for testing, we'll specify which assemblies are scanned for the PluginTypeResolver
|
||||
PluginManager.Current.AssembliesToScan = new[]
|
||||
|
||||
@@ -6,13 +6,69 @@ using Examine;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Tests.PublishedContent;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Web;
|
||||
using umbraco.BusinessLogic;
|
||||
|
||||
namespace Umbraco.Tests
|
||||
namespace Umbraco.Tests.ContentStores
|
||||
{
|
||||
[TestFixture]
|
||||
public class PublishMediaStoreTests
|
||||
public class PublishMediaStoreTests : BaseWebTest
|
||||
{
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
//we're going to use the same initialization as the PublishedMediaTests
|
||||
PublishedMediaTests.DoInitialization(GetUmbracoContext("/test", 1234));
|
||||
}
|
||||
|
||||
public override void TearDown()
|
||||
{
|
||||
base.TearDown();
|
||||
PublishedMediaTests.DoTearDown();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Get_Root_Docs()
|
||||
{
|
||||
var user = new User(0);
|
||||
var mType = global::umbraco.cms.businesslogic.media.MediaType.MakeNew(user, "TestMediaType");
|
||||
var mRoot1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("MediaRoot1", mType, user, -1);
|
||||
var mRoot2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("MediaRoot2", mType, user, -1);
|
||||
var mChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child1", mType, user, mRoot1.Id);
|
||||
var mChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child2", mType, user, mRoot2.Id);
|
||||
|
||||
var ctx = GetUmbracoContext("/test", 1234);
|
||||
var mediaStore = new DefaultPublishedMediaStore();
|
||||
var roots = mediaStore.GetRootDocuments(ctx);
|
||||
Assert.AreEqual(2, roots.Count());
|
||||
Assert.IsTrue(roots.Select(x => x.Id).ContainsAll(new[] {mRoot1.Id, mRoot2.Id}));
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Get_Item_Without_Examine()
|
||||
{
|
||||
var user = new User(0);
|
||||
var mType = global::umbraco.cms.businesslogic.media.MediaType.MakeNew(user, "TestMediaType");
|
||||
var mRoot = global::umbraco.cms.businesslogic.media.Media.MakeNew("MediaRoot", mType, user, -1);
|
||||
var mChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child1", mType, user, mRoot.Id);
|
||||
var publishedMedia = PublishedMediaTests.GetNode(mRoot.Id, GetUmbracoContext("/test", 1234));
|
||||
|
||||
Assert.AreEqual(mRoot.Id, publishedMedia.Id);
|
||||
Assert.AreEqual(mRoot.CreateDateTime.ToString("dd/MM/yyyy HH:mm:ss"), publishedMedia.CreateDate.ToString("dd/MM/yyyy HH:mm:ss"));
|
||||
Assert.AreEqual(mRoot.User.Id, publishedMedia.CreatorId);
|
||||
Assert.AreEqual(mRoot.User.Name, publishedMedia.CreatorName);
|
||||
Assert.AreEqual(mRoot.ContentType.Alias, publishedMedia.DocumentTypeAlias);
|
||||
Assert.AreEqual(mRoot.ContentType.Id, publishedMedia.DocumentTypeId);
|
||||
Assert.AreEqual(mRoot.Level, publishedMedia.Level);
|
||||
Assert.AreEqual(mRoot.Text, publishedMedia.Name);
|
||||
Assert.AreEqual(mRoot.Path, publishedMedia.Path);
|
||||
Assert.AreEqual(mRoot.sortOrder, publishedMedia.SortOrder);
|
||||
Assert.IsNull(publishedMedia.Parent);
|
||||
}
|
||||
|
||||
[TestCase("id")]
|
||||
[TestCase("nodeId")]
|
||||
[TestCase("__NodeId")]
|
||||
@@ -191,10 +247,12 @@ namespace Umbraco.Tests
|
||||
a => null,
|
||||
//we're not going to test this so ignore
|
||||
a => new List<IPublishedContent>(),
|
||||
(dd, a) => dd.Properties.FirstOrDefault(x => x.Alias.InvariantEquals(a))),
|
||||
(dd, a) => dd.Properties.FirstOrDefault(x => x.Alias.InvariantEquals(a)),
|
||||
false),
|
||||
//callback to get the children
|
||||
d => children,
|
||||
(dd, a) => dd.Properties.FirstOrDefault(x => x.Alias.InvariantEquals(a)));
|
||||
(dd, a) => dd.Properties.FirstOrDefault(x => x.Alias.InvariantEquals(a)),
|
||||
false);
|
||||
return dicDoc;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace Umbraco.Tests
|
||||
TestHelper.SetupLog4NetForTests();
|
||||
|
||||
//this ensures its reset
|
||||
PluginManager.Current = new PluginManager();
|
||||
PluginManager.Current = new PluginManager(false);
|
||||
|
||||
//for testing, we'll specify which assemblies are scanned for the PluginTypeResolver
|
||||
PluginManager.Current.AssembliesToScan = new[]
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Xml;
|
||||
using System.Xml.Linq;
|
||||
using Microsoft.CSharp.RuntimeBinder;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core.Dynamics;
|
||||
|
||||
namespace Umbraco.Tests.DynamicDocument
|
||||
{
|
||||
[TestFixture]
|
||||
public class DynamicXmlTests
|
||||
{
|
||||
|
||||
[Test]
|
||||
public void Ensure_Legacy_Objects_Are_Returned()
|
||||
{
|
||||
var xml = "<DAMP fullMedia=\"\"><mediaItem><Image id=\"1057\" version=\"d58d5c16-153e-4896-892f-a722e45a69af\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:55:29\" updateDate=\"2012-11-05T16:55:44\" nodeName=\"test12\" urlName=\"test12\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1057\"><umbracoFile>/media/54/tulips.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>620888</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:55:34\"><crop name=\"thumbCrop\" x=\"154\" y=\"1\" x2=\"922\" y2=\"768\" url=\"/media/54/tulips_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem><mediaItem><Image id=\"1055\" version=\"4df1f08a-3552-45f2-b4bf-fa980c762f4a\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:29:58\" updateDate=\"2012-11-05T16:30:27\" nodeName=\"Test\" urlName=\"test\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1055\"><umbracoFile>/media/41/hydrangeas.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>595284</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:30:18\"><crop name=\"thumbCrop\" x=\"133\" y=\"0\" x2=\"902\" y2=\"768\" url=\"/media/41/hydrangeas_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem></DAMP>";
|
||||
var mediaItems = new global::umbraco.MacroEngines.DynamicXml(xml);
|
||||
//Debug.WriteLine("full xml = {0}", mediaItems.ToXml());
|
||||
|
||||
if (mediaItems.Count() != 0)
|
||||
{
|
||||
foreach (dynamic item in mediaItems)
|
||||
{
|
||||
Type itemType = item.GetType();
|
||||
Debug.WriteLine("item type = {0}", itemType);
|
||||
dynamic image = item.Image;
|
||||
|
||||
Type imageType = image.GetType();
|
||||
Debug.WriteLine("image type = {0}", imageType);
|
||||
|
||||
//ensure they are the same
|
||||
Assert.AreEqual(itemType, imageType);
|
||||
|
||||
//ensure they are legacy
|
||||
Assert.AreEqual(typeof(global::umbraco.MacroEngines.DynamicXml), itemType);
|
||||
Assert.AreEqual(typeof(global::umbraco.MacroEngines.DynamicXml), imageType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test the current Core class
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Find_Test_Core_Class()
|
||||
{
|
||||
RunFindTest(x => new DynamicXml(x));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tests the macroEngines legacy class
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Find_Test_Legacy_Class()
|
||||
{
|
||||
RunFindTest(x => new global::umbraco.MacroEngines.DynamicXml(x));
|
||||
}
|
||||
|
||||
private void RunFindTest(Func<string, dynamic> getDynamicXml)
|
||||
{
|
||||
var xmlstring = @"<test>
|
||||
<item id='1' name='test 1' value='found 1'/>
|
||||
<item id='2' name='test 2' value='found 2'/>
|
||||
<item id='3' name='test 3' value='found 3'/>
|
||||
</test>";
|
||||
|
||||
dynamic dXml = getDynamicXml(xmlstring);
|
||||
|
||||
var result1 = dXml.Find("@name", "test 1");
|
||||
var result2 = dXml.Find("@name", "test 2");
|
||||
var result3 = dXml.Find("@name", "test 3");
|
||||
var result4 = dXml.Find("@name", "dont find");
|
||||
|
||||
Assert.AreEqual("found 1", result1.value);
|
||||
Assert.AreEqual("found 2", result2.value);
|
||||
Assert.AreEqual("found 3", result3.value);
|
||||
Assert.Throws<RuntimeBinderException>(() =>
|
||||
{
|
||||
//this will throw because result4 is not found
|
||||
var temp = result4.value;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
using System.Configuration;
|
||||
using System.Web.Routing;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using System.Web.Mvc;
|
||||
|
||||
namespace Umbraco.Tests
|
||||
{
|
||||
@@ -53,5 +55,42 @@ namespace Umbraco.Tests
|
||||
{
|
||||
Assert.IsFalse(Umbraco.Core.Configuration.GlobalSettings.IsReservedPathOrUrl(url));
|
||||
}
|
||||
|
||||
|
||||
[TestCase("/Do/Not/match", false)]
|
||||
[TestCase("/Umbraco/RenderMvcs", false)]
|
||||
[TestCase("/Umbraco/RenderMvc", true)]
|
||||
[TestCase("/Umbraco/RenderMvc/Index", true)]
|
||||
[TestCase("/Umbraco/RenderMvc/Index/1234", true)]
|
||||
[TestCase("/Umbraco/RenderMvc/Index/1234/9876", false)]
|
||||
[TestCase("/api", true)]
|
||||
[TestCase("/api/WebApiTest", true)]
|
||||
[TestCase("/api/WebApiTest/1234", true)]
|
||||
[TestCase("/api/WebApiTest/Index/1234", false)]
|
||||
public void Is_Reserved_By_Route(string url, bool shouldMatch)
|
||||
{
|
||||
//reset the app config, we only want to test routes not the hard coded paths
|
||||
ConfigurationManager.AppSettings.Set("umbracoReservedPaths", "");
|
||||
ConfigurationManager.AppSettings.Set("umbracoReservedUrls", "");
|
||||
|
||||
var routes = new RouteCollection();
|
||||
|
||||
routes.MapRoute(
|
||||
"Umbraco_default",
|
||||
"Umbraco/RenderMvc/{action}/{id}",
|
||||
new { controller = "RenderMvc", action = "Index", id = UrlParameter.Optional });
|
||||
routes.MapRoute(
|
||||
"WebAPI",
|
||||
"api/{controller}/{id}",
|
||||
new { controller = "WebApiTestController", action = "Index", id = UrlParameter.Optional });
|
||||
|
||||
|
||||
var context = new FakeHttpContextFactory(url);
|
||||
|
||||
|
||||
Assert.AreEqual(
|
||||
shouldMatch,
|
||||
Umbraco.Core.Configuration.GlobalSettings.IsReservedPathOrUrl(url, context.HttpContext, routes));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
|
||||
namespace Umbraco.Tests
|
||||
{
|
||||
[TestFixture]
|
||||
public class HashCodeCombinerTests : PartialTrust.AbstractPartialTrustFixture<HashCodeCombinerTests>
|
||||
{
|
||||
|
||||
private DirectoryInfo PrepareFolder()
|
||||
{
|
||||
var assDir = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory;
|
||||
var dir = Directory.CreateDirectory(Path.Combine(assDir.FullName, "HashCombiner", Guid.NewGuid().ToString("N")));
|
||||
foreach (var f in dir.GetFiles())
|
||||
{
|
||||
f.Delete();
|
||||
}
|
||||
return dir;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void HashCombiner_Test_String()
|
||||
{
|
||||
var combiner1 = new HashCodeCombiner();
|
||||
combiner1.AddCaseInsensitiveString("Hello");
|
||||
|
||||
var combiner2 = new HashCodeCombiner();
|
||||
combiner2.AddCaseInsensitiveString("hello");
|
||||
|
||||
Assert.AreEqual(combiner1.GetCombinedHashCode(), combiner2.GetCombinedHashCode());
|
||||
|
||||
combiner2.AddCaseInsensitiveString("world");
|
||||
|
||||
Assert.AreNotEqual(combiner1.GetCombinedHashCode(), combiner2.GetCombinedHashCode());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void HashCombiner_Test_Int()
|
||||
{
|
||||
var combiner1 = new HashCodeCombiner();
|
||||
combiner1.AddInt(1234);
|
||||
|
||||
var combiner2 = new HashCodeCombiner();
|
||||
combiner2.AddInt(1234);
|
||||
|
||||
Assert.AreEqual(combiner1.GetCombinedHashCode(), combiner2.GetCombinedHashCode());
|
||||
|
||||
combiner2.AddInt(1);
|
||||
|
||||
Assert.AreNotEqual(combiner1.GetCombinedHashCode(), combiner2.GetCombinedHashCode());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void HashCombiner_Test_DateTime()
|
||||
{
|
||||
var dt = DateTime.Now;
|
||||
var combiner1 = new HashCodeCombiner();
|
||||
combiner1.AddDateTime(dt);
|
||||
|
||||
var combiner2 = new HashCodeCombiner();
|
||||
combiner2.AddDateTime(dt);
|
||||
|
||||
Assert.AreEqual(combiner1.GetCombinedHashCode(), combiner2.GetCombinedHashCode());
|
||||
|
||||
combiner2.AddDateTime(DateTime.Now);
|
||||
|
||||
Assert.AreNotEqual(combiner1.GetCombinedHashCode(), combiner2.GetCombinedHashCode());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void HashCombiner_Test_File()
|
||||
{
|
||||
var dir = PrepareFolder();
|
||||
var file1Path = Path.Combine(dir.FullName, "hastest1.txt");
|
||||
File.Delete(file1Path);
|
||||
using (var file1 = File.CreateText(Path.Combine(dir.FullName, "hastest1.txt")))
|
||||
{
|
||||
file1.WriteLine("hello");
|
||||
}
|
||||
var file2Path = Path.Combine(dir.FullName, "hastest2.txt");
|
||||
File.Delete(file2Path);
|
||||
using (var file2 = File.CreateText(Path.Combine(dir.FullName, "hastest2.txt")))
|
||||
{
|
||||
//even though files are the same, the dates are different
|
||||
file2.WriteLine("hello");
|
||||
}
|
||||
|
||||
var combiner1 = new HashCodeCombiner();
|
||||
combiner1.AddFile(new FileInfo(file1Path));
|
||||
|
||||
var combiner2 = new HashCodeCombiner();
|
||||
combiner2.AddFile(new FileInfo(file1Path));
|
||||
|
||||
var combiner3 = new HashCodeCombiner();
|
||||
combiner3.AddFile(new FileInfo(file2Path));
|
||||
|
||||
Assert.AreEqual(combiner1.GetCombinedHashCode(), combiner2.GetCombinedHashCode());
|
||||
Assert.AreNotEqual(combiner1.GetCombinedHashCode(), combiner3.GetCombinedHashCode());
|
||||
|
||||
combiner2.AddFile(new FileInfo(file2Path));
|
||||
|
||||
Assert.AreNotEqual(combiner1.GetCombinedHashCode(), combiner2.GetCombinedHashCode());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void HashCombiner_Test_Folder()
|
||||
{
|
||||
var dir = PrepareFolder();
|
||||
var file1Path = Path.Combine(dir.FullName, "hastest1.txt");
|
||||
File.Delete(file1Path);
|
||||
using (var file1 = File.CreateText(Path.Combine(dir.FullName, "hastest1.txt")))
|
||||
{
|
||||
file1.WriteLine("hello");
|
||||
}
|
||||
|
||||
//first test the whole folder
|
||||
var combiner1 = new HashCodeCombiner();
|
||||
combiner1.AddFolder(dir);
|
||||
|
||||
var combiner2 = new HashCodeCombiner();
|
||||
combiner2.AddFolder(dir);
|
||||
|
||||
Assert.AreEqual(combiner1.GetCombinedHashCode(), combiner2.GetCombinedHashCode());
|
||||
|
||||
//now add a file to the folder
|
||||
|
||||
var file2Path = Path.Combine(dir.FullName, "hastest2.txt");
|
||||
File.Delete(file2Path);
|
||||
using (var file2 = File.CreateText(Path.Combine(dir.FullName, "hastest2.txt")))
|
||||
{
|
||||
//even though files are the same, the dates are different
|
||||
file2.WriteLine("hello");
|
||||
}
|
||||
|
||||
var combiner3 = new HashCodeCombiner();
|
||||
combiner3.AddFolder(dir);
|
||||
|
||||
Assert.AreNotEqual(combiner1.GetCombinedHashCode(), combiner3.GetCombinedHashCode());
|
||||
}
|
||||
|
||||
public override void TestSetup()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void TestTearDown()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ namespace Umbraco.Tests
|
||||
TestHelper.SetupLog4NetForTests();
|
||||
|
||||
//this ensures its reset
|
||||
PluginManager.Current = new PluginManager();
|
||||
PluginManager.Current = new PluginManager(false);
|
||||
|
||||
//for testing, we'll specify which assemblies are scanned for the PluginTypeResolver
|
||||
PluginManager.Current.AssembliesToScan = new[]
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace Umbraco.Tests
|
||||
TestHelper.SetupLog4NetForTests();
|
||||
|
||||
//this ensures its reset
|
||||
PluginManager.Current = new PluginManager();
|
||||
PluginManager.Current = new PluginManager(false);
|
||||
|
||||
//for testing, we'll specify which assemblies are scanned for the PluginTypeResolver
|
||||
PluginManager.Current.AssembliesToScan = new[]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
@@ -67,7 +68,8 @@ namespace Umbraco.Tests
|
||||
{"FALSE", false},
|
||||
{"False", false},
|
||||
{"false", false},
|
||||
{"0", false}
|
||||
{"0", false},
|
||||
{"", false}
|
||||
};
|
||||
|
||||
foreach (var testCase in testCases)
|
||||
@@ -79,6 +81,34 @@ namespace Umbraco.Tests
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestOnlyInFullTrust]
|
||||
public virtual void CanConvertStringToDateTime()
|
||||
{
|
||||
var dateTime = new DateTime(2012, 11, 10, 13, 14, 15);
|
||||
var testCases = new Dictionary<string, bool>
|
||||
{
|
||||
{"2012-11-10", true},
|
||||
{"2012/11/10", true},
|
||||
{"10/11/2012", true},
|
||||
{"11/10/2012", false},
|
||||
{"Sat 10, Nov 2012", true},
|
||||
{"Saturday 10, Nov 2012", true},
|
||||
{"Sat 10, November 2012", true},
|
||||
{"Saturday 10, November 2012", true},
|
||||
{"2012-11-10 13:14:15", true},
|
||||
{"", false}
|
||||
};
|
||||
|
||||
foreach (var testCase in testCases)
|
||||
{
|
||||
var result = testCase.Key.TryConvertTo<DateTime>();
|
||||
|
||||
Assert.IsTrue(result.Success);
|
||||
Assert.AreEqual(DateTime.Equals(dateTime.Date, result.Result.Date), testCase.Value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Run once before each test in derived test fixtures.
|
||||
/// </summary>
|
||||
|
||||
@@ -1,37 +1,44 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Web.Compilation;
|
||||
using NUnit.Framework;
|
||||
using SqlCE4Umbraco;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Web;
|
||||
using umbraco;
|
||||
using umbraco.DataLayer;
|
||||
using umbraco.MacroEngines;
|
||||
using umbraco.MacroEngines.Iron;
|
||||
using umbraco.businesslogic;
|
||||
using umbraco.cms.businesslogic;
|
||||
using umbraco.editorControls;
|
||||
using umbraco.interfaces;
|
||||
using umbraco.uicontrols;
|
||||
using umbraco.cms;
|
||||
|
||||
namespace Umbraco.Tests
|
||||
{
|
||||
|
||||
[TestFixture]
|
||||
public class PluginManagerTests
|
||||
{
|
||||
[TestFixture]
|
||||
public class PluginManagerTests
|
||||
{
|
||||
|
||||
[SetUp]
|
||||
public void Initialize()
|
||||
{
|
||||
TestHelper.SetupLog4NetForTests();
|
||||
[SetUp]
|
||||
public void Initialize()
|
||||
{
|
||||
TestHelper.SetupLog4NetForTests();
|
||||
|
||||
//this ensures its reset
|
||||
PluginManager.Current = new PluginManager();
|
||||
//this ensures its reset
|
||||
PluginManager.Current = new PluginManager(false);
|
||||
|
||||
//for testing, we'll specify which assemblies are scanned for the PluginTypeResolver
|
||||
//TODO: Should probably update this so it only searches this assembly and add custom types to be found
|
||||
PluginManager.Current.AssembliesToScan = new[]
|
||||
//for testing, we'll specify which assemblies are scanned for the PluginTypeResolver
|
||||
//TODO: Should probably update this so it only searches this assembly and add custom types to be found
|
||||
PluginManager.Current.AssembliesToScan = new[]
|
||||
{
|
||||
this.GetType().Assembly,
|
||||
typeof(ApplicationStartupHandler).Assembly,
|
||||
@@ -47,132 +54,318 @@ namespace Umbraco.Tests
|
||||
typeof(System.Web.Mvc.ActionResult).Assembly,
|
||||
typeof(TypeFinder).Assembly,
|
||||
typeof(ISqlHelper).Assembly,
|
||||
typeof(DLRScriptingEngine).Assembly,
|
||||
typeof(ICultureDictionary).Assembly,
|
||||
typeof(UmbracoContext).Assembly,
|
||||
typeof(BaseDataType).Assembly
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Ensure_Only_One_Type_List_Created()
|
||||
{
|
||||
var foundTypes1 = PluginManager.Current.ResolveFindMeTypes();
|
||||
var foundTypes2 = PluginManager.Current.ResolveFindMeTypes();
|
||||
Assert.AreEqual(1,
|
||||
PluginManager.Current.GetTypeLists()
|
||||
.Count(x => x.IsTypeList<IFindMe>(PluginManager.TypeResolutionKind.FindAllTypes)));
|
||||
}
|
||||
private DirectoryInfo PrepareFolder()
|
||||
{
|
||||
var assDir = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory;
|
||||
var dir = Directory.CreateDirectory(Path.Combine(assDir.FullName, "PluginManager", Guid.NewGuid().ToString("N")));
|
||||
foreach (var f in dir.GetFiles())
|
||||
{
|
||||
f.Delete();
|
||||
}
|
||||
return dir;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Resolves_Types()
|
||||
{
|
||||
var foundTypes1 = PluginManager.Current.ResolveFindMeTypes();
|
||||
Assert.AreEqual(2, foundTypes1.Count());
|
||||
}
|
||||
//[Test]
|
||||
//public void Scan_Vs_Load_Benchmark()
|
||||
//{
|
||||
// var pluginManager = new PluginManager(false);
|
||||
// var watch = new Stopwatch();
|
||||
// watch.Start();
|
||||
// for (var i = 0; i < 1000; i++)
|
||||
// {
|
||||
// var type2 = Type.GetType("umbraco.macroCacheRefresh, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null");
|
||||
// var type3 = Type.GetType("umbraco.templateCacheRefresh, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null");
|
||||
// var type4 = Type.GetType("umbraco.presentation.cache.MediaLibraryRefreshers, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null");
|
||||
// var type5 = Type.GetType("umbraco.presentation.cache.pageRefresher, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null");
|
||||
// }
|
||||
// watch.Stop();
|
||||
// Debug.WriteLine("TOTAL TIME (1st round): " + watch.ElapsedMilliseconds);
|
||||
// watch.Start();
|
||||
// for (var i = 0; i < 1000; i++)
|
||||
// {
|
||||
// var type2 = BuildManager.GetType("umbraco.macroCacheRefresh, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null", true);
|
||||
// var type3 = BuildManager.GetType("umbraco.templateCacheRefresh, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null", true);
|
||||
// var type4 = BuildManager.GetType("umbraco.presentation.cache.MediaLibraryRefreshers, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null", true);
|
||||
// var type5 = BuildManager.GetType("umbraco.presentation.cache.pageRefresher, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null", true);
|
||||
// }
|
||||
// watch.Stop();
|
||||
// Debug.WriteLine("TOTAL TIME (1st round): " + watch.ElapsedMilliseconds);
|
||||
// watch.Reset();
|
||||
// watch.Start();
|
||||
// for (var i = 0; i < 1000; i++)
|
||||
// {
|
||||
// var refreshers = pluginManager.ResolveTypes<ICacheRefresher>(false);
|
||||
// }
|
||||
// watch.Stop();
|
||||
// Debug.WriteLine("TOTAL TIME (2nd round): " + watch.ElapsedMilliseconds);
|
||||
//}
|
||||
|
||||
[Test]
|
||||
public void Resolves_Attributed_Trees()
|
||||
{
|
||||
var trees = PluginManager.Current.ResolveAttributedTrees();
|
||||
Assert.AreEqual(27, trees.Count());
|
||||
}
|
||||
////NOTE: This test shows that Type.GetType is 100% faster than Assembly.Load(..).GetType(...) so we'll use that :)
|
||||
//[Test]
|
||||
//public void Load_Type_Benchmark()
|
||||
//{
|
||||
// var watch = new Stopwatch();
|
||||
// watch.Start();
|
||||
// for (var i = 0; i < 1000; i++)
|
||||
// {
|
||||
// var type2 = Type.GetType("umbraco.macroCacheRefresh, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null");
|
||||
// var type3 = Type.GetType("umbraco.templateCacheRefresh, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null");
|
||||
// var type4 = Type.GetType("umbraco.presentation.cache.MediaLibraryRefreshers, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null");
|
||||
// var type5 = Type.GetType("umbraco.presentation.cache.pageRefresher, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null");
|
||||
// }
|
||||
// watch.Stop();
|
||||
// Debug.WriteLine("TOTAL TIME (1st round): " + watch.ElapsedMilliseconds);
|
||||
// watch.Reset();
|
||||
// watch.Start();
|
||||
// for (var i = 0; i < 1000; i++)
|
||||
// {
|
||||
// var type2 = Assembly.Load("umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null")
|
||||
// .GetType("umbraco.macroCacheRefresh");
|
||||
// var type3 = Assembly.Load("umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null")
|
||||
// .GetType("umbraco.templateCacheRefresh");
|
||||
// var type4 = Assembly.Load("umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null")
|
||||
// .GetType("umbraco.presentation.cache.MediaLibraryRefreshers");
|
||||
// var type5 = Assembly.Load("umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null")
|
||||
// .GetType("umbraco.presentation.cache.pageRefresher");
|
||||
// }
|
||||
// watch.Stop();
|
||||
// Debug.WriteLine("TOTAL TIME (2nd round): " + watch.ElapsedMilliseconds);
|
||||
// watch.Reset();
|
||||
// watch.Start();
|
||||
// for (var i = 0; i < 1000; i++)
|
||||
// {
|
||||
// var type2 = BuildManager.GetType("umbraco.macroCacheRefresh, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null", true);
|
||||
// var type3 = BuildManager.GetType("umbraco.templateCacheRefresh, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null", true);
|
||||
// var type4 = BuildManager.GetType("umbraco.presentation.cache.MediaLibraryRefreshers, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null", true);
|
||||
// var type5 = BuildManager.GetType("umbraco.presentation.cache.pageRefresher, umbraco, Version=1.0.4698.259, Culture=neutral, PublicKeyToken=null", true);
|
||||
// }
|
||||
// watch.Stop();
|
||||
// Debug.WriteLine("TOTAL TIME (1st round): " + watch.ElapsedMilliseconds);
|
||||
//}
|
||||
|
||||
[Test]
|
||||
public void Resolves_Actions()
|
||||
{
|
||||
var actions = PluginManager.Current.ResolveActions();
|
||||
Assert.AreEqual(37, actions.Count());
|
||||
}
|
||||
[Test]
|
||||
public void Detect_Legacy_Plugin_File_List()
|
||||
{
|
||||
var tempFolder = IOHelper.MapPath("~/App_Data/TEMP/PluginCache");
|
||||
var manager = new PluginManager(false);
|
||||
var filePath = Path.Combine(tempFolder, "umbraco-plugins.list");
|
||||
File.WriteAllText(filePath, @"<?xml version=""1.0"" encoding=""utf-8""?>
|
||||
<plugins>
|
||||
<baseType type=""umbraco.interfaces.ICacheRefresher"">
|
||||
<add type=""umbraco.macroCacheRefresh, umbraco, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null"" />
|
||||
</baseType>
|
||||
</plugins>");
|
||||
|
||||
[Test]
|
||||
public void Resolves_Trees()
|
||||
{
|
||||
var trees = PluginManager.Current.ResolveTrees();
|
||||
Assert.AreEqual(36, trees.Count());
|
||||
}
|
||||
Assert.IsTrue(manager.DetectLegacyPluginListFile());
|
||||
|
||||
[Test]
|
||||
public void Resolves_Applications()
|
||||
{
|
||||
var apps = PluginManager.Current.ResolveApplications();
|
||||
Assert.AreEqual(7, apps.Count());
|
||||
}
|
||||
File.Delete(filePath);
|
||||
|
||||
[Test]
|
||||
public void Resolves_Action_Handlers()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveActionHandlers();
|
||||
Assert.AreEqual(1, types.Count());
|
||||
}
|
||||
//now create a valid one
|
||||
File.WriteAllText(filePath, @"<?xml version=""1.0"" encoding=""utf-8""?>
|
||||
<plugins>
|
||||
<baseType type=""umbraco.interfaces.ICacheRefresher"" resolutionType=""FindAllTypes"">
|
||||
<add type=""umbraco.macroCacheRefresh, umbraco, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null"" />
|
||||
</baseType>
|
||||
</plugins>");
|
||||
|
||||
[Test]
|
||||
public void Resolves_DataTypes()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveDataTypes();
|
||||
Assert.AreEqual(37, types.Count());
|
||||
}
|
||||
Assert.IsFalse(manager.DetectLegacyPluginListFile());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Resolves_RazorDataTypeModels()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveRazorDataTypeModels();
|
||||
Assert.AreEqual(2, types.Count());
|
||||
}
|
||||
[Test]
|
||||
public void Create_Cached_Plugin_File()
|
||||
{
|
||||
var types = new[] { typeof(PluginManager), typeof(PluginManagerTests), typeof(UmbracoContext) };
|
||||
|
||||
[Test]
|
||||
public void Resolves_RestExtensions()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveRestExtensions();
|
||||
Assert.AreEqual(2, types.Count());
|
||||
}
|
||||
var manager = new PluginManager(false);
|
||||
//yes this is silly, none of these types inherit from string, but this is just to test the xml file format
|
||||
manager.UpdateCachedPluginsFile<string>(types, PluginManager.TypeResolutionKind.FindAllTypes);
|
||||
|
||||
[Test]
|
||||
public void Resolves_LegacyRestExtensions()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveLegacyRestExtensions();
|
||||
Assert.AreEqual(1, types.Count());
|
||||
}
|
||||
var plugins = manager.TryGetCachedPluginsFromFile<string>(PluginManager.TypeResolutionKind.FindAllTypes);
|
||||
var diffType = manager.TryGetCachedPluginsFromFile<string>(PluginManager.TypeResolutionKind.FindAttributedTypes);
|
||||
|
||||
[Test]
|
||||
public void Resolves_XsltExtensions()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveXsltExtensions();
|
||||
Assert.AreEqual(1, types.Count());
|
||||
}
|
||||
Assert.IsTrue(plugins.Success);
|
||||
//this will be false since there is no cache of that type resolution kind
|
||||
Assert.IsFalse(diffType.Success);
|
||||
|
||||
[XsltExtension("Blah.Blah")]
|
||||
public class MyXsltExtension
|
||||
{
|
||||
Assert.AreEqual(3, plugins.Result.Count());
|
||||
var shouldContain = types.Select(x => x.AssemblyQualifiedName);
|
||||
//ensure they are all found
|
||||
Assert.IsTrue(plugins.Result.ContainsAll(shouldContain));
|
||||
}
|
||||
|
||||
}
|
||||
[Test]
|
||||
public void PluginHash_From_String()
|
||||
{
|
||||
var s = "hello my name is someone".GetHashCode().ToString("x", CultureInfo.InvariantCulture);
|
||||
var output = PluginManager.ConvertPluginsHashFromHex(s);
|
||||
Assert.AreNotEqual(0, output);
|
||||
}
|
||||
|
||||
[umbraco.presentation.umbracobase.RestExtension("Blah")]
|
||||
public class MyLegacyRestExtension
|
||||
{
|
||||
|
||||
}
|
||||
[Test]
|
||||
public void Get_Plugins_Hash()
|
||||
{
|
||||
//Arrange
|
||||
var dir = PrepareFolder();
|
||||
var d1 = dir.CreateSubdirectory("1");
|
||||
var d2 = dir.CreateSubdirectory("2");
|
||||
var d3 = dir.CreateSubdirectory("3");
|
||||
var d4 = dir.CreateSubdirectory("4");
|
||||
var f1 = new FileInfo(Path.Combine(d1.FullName, "test1.dll"));
|
||||
var f2 = new FileInfo(Path.Combine(d1.FullName, "test2.dll"));
|
||||
var f3 = new FileInfo(Path.Combine(d2.FullName, "test1.dll"));
|
||||
var f4 = new FileInfo(Path.Combine(d2.FullName, "test2.dll"));
|
||||
var f5 = new FileInfo(Path.Combine(d3.FullName, "test1.dll"));
|
||||
var f6 = new FileInfo(Path.Combine(d3.FullName, "test2.dll"));
|
||||
var f7 = new FileInfo(Path.Combine(d4.FullName, "test1.dll"));
|
||||
f1.CreateText().Close();
|
||||
f2.CreateText().Close();
|
||||
f3.CreateText().Close();
|
||||
f4.CreateText().Close();
|
||||
f5.CreateText().Close();
|
||||
f6.CreateText().Close();
|
||||
f7.CreateText().Close();
|
||||
var list1 = new[] { f1, f2, f3, f4, f5, f6 };
|
||||
var list2 = new[] { f1, f3, f5 };
|
||||
var list3 = new[] { f1, f3, f5, f7 };
|
||||
|
||||
[Umbraco.Web.BaseRest.RestExtension("Blah")]
|
||||
public class MyRestExtesion
|
||||
{
|
||||
|
||||
}
|
||||
//Act
|
||||
var hash1 = PluginManager.GetAssembliesHash(list1);
|
||||
var hash2 = PluginManager.GetAssembliesHash(list2);
|
||||
var hash3 = PluginManager.GetAssembliesHash(list3);
|
||||
|
||||
public interface IFindMe
|
||||
{
|
||||
//Assert
|
||||
Assert.AreNotEqual(hash1, hash2);
|
||||
Assert.AreNotEqual(hash1, hash3);
|
||||
Assert.AreNotEqual(hash2, hash3);
|
||||
|
||||
}
|
||||
Assert.AreEqual(hash1, PluginManager.GetAssembliesHash(list1));
|
||||
}
|
||||
|
||||
public class FindMe1 : IFindMe
|
||||
{
|
||||
[Test]
|
||||
public void Ensure_Only_One_Type_List_Created()
|
||||
{
|
||||
var foundTypes1 = PluginManager.Current.ResolveFindMeTypes();
|
||||
var foundTypes2 = PluginManager.Current.ResolveFindMeTypes();
|
||||
Assert.AreEqual(1,
|
||||
PluginManager.Current.GetTypeLists()
|
||||
.Count(x => x.IsTypeList<IFindMe>(PluginManager.TypeResolutionKind.FindAllTypes)));
|
||||
}
|
||||
|
||||
}
|
||||
[Test]
|
||||
public void Resolves_Types()
|
||||
{
|
||||
var foundTypes1 = PluginManager.Current.ResolveFindMeTypes();
|
||||
Assert.AreEqual(2, foundTypes1.Count());
|
||||
}
|
||||
|
||||
public class FindMe2 : IFindMe
|
||||
{
|
||||
[Test]
|
||||
public void Resolves_Attributed_Trees()
|
||||
{
|
||||
var trees = PluginManager.Current.ResolveAttributedTrees();
|
||||
Assert.AreEqual(27, trees.Count());
|
||||
}
|
||||
|
||||
}
|
||||
[Test]
|
||||
public void Resolves_Actions()
|
||||
{
|
||||
var actions = PluginManager.Current.ResolveActions();
|
||||
Assert.AreEqual(37, actions.Count());
|
||||
}
|
||||
|
||||
}
|
||||
[Test]
|
||||
public void Resolves_Trees()
|
||||
{
|
||||
var trees = PluginManager.Current.ResolveTrees();
|
||||
Assert.AreEqual(36, trees.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Resolves_Applications()
|
||||
{
|
||||
var apps = PluginManager.Current.ResolveApplications();
|
||||
Assert.AreEqual(7, apps.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Resolves_Action_Handlers()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveActionHandlers();
|
||||
Assert.AreEqual(1, types.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Resolves_DataTypes()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveDataTypes();
|
||||
Assert.AreEqual(37, types.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Resolves_RazorDataTypeModels()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveRazorDataTypeModels();
|
||||
Assert.AreEqual(2, types.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Resolves_RestExtensions()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveRestExtensions();
|
||||
Assert.AreEqual(2, types.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Resolves_LegacyRestExtensions()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveLegacyRestExtensions();
|
||||
Assert.AreEqual(1, types.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Resolves_XsltExtensions()
|
||||
{
|
||||
var types = PluginManager.Current.ResolveXsltExtensions();
|
||||
Assert.AreEqual(1, types.Count());
|
||||
}
|
||||
|
||||
[XsltExtension("Blah.Blah")]
|
||||
public class MyXsltExtension
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[umbraco.presentation.umbracobase.RestExtension("Blah")]
|
||||
public class MyLegacyRestExtension
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[Umbraco.Web.BaseRest.RestExtension("Blah")]
|
||||
public class MyRestExtesion
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public interface IFindMe
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class FindMe1 : IFindMe
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class FindMe2 : IFindMe
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
|
||||
namespace Umbraco.Tests.PropertyEditors
|
||||
{
|
||||
[TestFixture]
|
||||
public class PropertyEditorValueConverterTests
|
||||
{
|
||||
[Test]
|
||||
public void CanConvertDatePickerPropertyEditor()
|
||||
{
|
||||
var converter = new DatePickerPropertyEditorValueConverter();
|
||||
var dateTime = new DateTime(2012, 11, 10, 13, 14, 15);
|
||||
var testCases = new Dictionary<string, bool>
|
||||
{
|
||||
{"2012-11-10", true},
|
||||
{"2012/11/10", true},
|
||||
{"10/11/2012", true},
|
||||
{"11/10/2012", false},
|
||||
{"Sat 10, Nov 2012", true},
|
||||
{"Saturday 10, Nov 2012", true},
|
||||
{"Sat 10, November 2012", true},
|
||||
{"Saturday 10, November 2012", true},
|
||||
{"2012-11-10 13:14:15", true},
|
||||
{"", false}
|
||||
};
|
||||
|
||||
foreach (var testCase in testCases)
|
||||
{
|
||||
var result = converter.ConvertPropertyValue(testCase.Key);
|
||||
|
||||
Assert.IsTrue(result.Success);
|
||||
Assert.AreEqual(DateTime.Equals(dateTime.Date, ((DateTime)result.Result).Date), testCase.Value);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CanConvertYesNoPropertyEditor()
|
||||
{
|
||||
var converter = new YesNoPropertyEditorValueConverter();
|
||||
var testCases = new Dictionary<string, bool>
|
||||
{
|
||||
{"TRUE", true},
|
||||
{"True", true},
|
||||
{"true", true},
|
||||
{"1", true},
|
||||
{"FALSE", false},
|
||||
{"False", false},
|
||||
{"false", false},
|
||||
{"0", false},
|
||||
{"", false}
|
||||
};
|
||||
|
||||
foreach (var testCase in testCases)
|
||||
{
|
||||
var result = converter.ConvertPropertyValue(testCase.Key);
|
||||
|
||||
Assert.IsTrue(result.Success);
|
||||
Assert.AreEqual(testCase.Value, result.Result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-2
@@ -6,10 +6,9 @@ using System.Web;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Dynamics;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
|
||||
namespace Umbraco.Tests.DynamicDocument
|
||||
namespace Umbraco.Tests.PublishedContent
|
||||
{
|
||||
[TestFixture]
|
||||
public abstract class DynamicDocumentTestsBase<TDocument, TDocumentList> : BaseRoutingTest
|
||||
+1
-6
@@ -5,17 +5,12 @@ using Umbraco.Core;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Web;
|
||||
using Umbraco.Web.Models;
|
||||
using umbraco.BusinessLogic;
|
||||
using umbraco.IO;
|
||||
using umbraco.MacroEngines;
|
||||
using umbraco.NodeFactory;
|
||||
using umbraco.cms.businesslogic;
|
||||
using umbraco.cms.businesslogic.template;
|
||||
using System.Linq;
|
||||
using umbraco.cms.businesslogic.web;
|
||||
|
||||
namespace Umbraco.Tests.DynamicDocument
|
||||
namespace Umbraco.Tests.PublishedContent
|
||||
{
|
||||
[TestFixture]
|
||||
public class DynamicNodeTests : DynamicDocumentTestsBase<DynamicNode, DynamicNodeList>
|
||||
+1
-3
@@ -1,9 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Dynamics;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Web.Models;
|
||||
|
||||
namespace Umbraco.Tests.DynamicDocument
|
||||
namespace Umbraco.Tests.PublishedContent
|
||||
{
|
||||
public static class DynamicPublishedContentCustomExtensionMethods
|
||||
{
|
||||
+4
-12
@@ -1,22 +1,13 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core.Dynamics;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
using Umbraco.Tests.Routing;
|
||||
using Umbraco.Web;
|
||||
using Umbraco.Web.Models;
|
||||
using Umbraco.Web.Routing;
|
||||
using umbraco.BusinessLogic;
|
||||
using umbraco.cms.businesslogic;
|
||||
using umbraco.cms.businesslogic.template;
|
||||
using umbraco.cms.businesslogic.web;
|
||||
|
||||
namespace Umbraco.Tests.DynamicDocument
|
||||
namespace Umbraco.Tests.PublishedContent
|
||||
{
|
||||
[TestFixture]
|
||||
public class DynamicPublishedContentTests : DynamicDocumentTestsBase<DynamicPublishedContent, DynamicPublishedContentList>
|
||||
@@ -34,7 +25,7 @@ namespace Umbraco.Tests.DynamicDocument
|
||||
});
|
||||
|
||||
//need to specify a custom callback for unit tests
|
||||
DynamicPublishedContent.GetDataTypeCallback = (docTypeAlias, propertyAlias) =>
|
||||
PublishedContentHelper.GetDataTypeCallback = (docTypeAlias, propertyAlias) =>
|
||||
{
|
||||
if (propertyAlias == "content")
|
||||
{
|
||||
@@ -86,6 +77,7 @@ namespace Umbraco.Tests.DynamicDocument
|
||||
Assert.AreEqual("Hello world!" + 123 + false, asDynamic.DynamicDocumentMultiParam("Hello world!", 123, false));
|
||||
Assert.AreEqual("Hello world!" + 123 + false, asDynamic.Children.DynamicDocumentListMultiParam("Hello world!", 123, false));
|
||||
Assert.AreEqual("Hello world!" + 123 + false, asDynamic.Children.DynamicDocumentEnumerableMultiParam("Hello world!", 123, false));
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -0,0 +1,145 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using Microsoft.CSharp.RuntimeBinder;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core.Dynamics;
|
||||
using System.Linq;
|
||||
|
||||
namespace Umbraco.Tests.PublishedContent
|
||||
{
|
||||
[TestFixture]
|
||||
public class DynamicXmlTests
|
||||
{
|
||||
|
||||
[Test]
|
||||
public void Custom_Extension_Method_Legacy()
|
||||
{
|
||||
var xml = "<DAMP fullMedia=\"\"><mediaItem><Image id=\"1057\" version=\"d58d5c16-153e-4896-892f-a722e45a69af\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:55:29\" updateDate=\"2012-11-05T16:55:44\" nodeName=\"test12\" urlName=\"test12\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1057\"><umbracoFile>/media/54/tulips.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>620888</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:55:34\"><crop name=\"thumbCrop\" x=\"154\" y=\"1\" x2=\"922\" y2=\"768\" url=\"/media/54/tulips_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem><mediaItem><Image id=\"1055\" version=\"4df1f08a-3552-45f2-b4bf-fa980c762f4a\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:29:58\" updateDate=\"2012-11-05T16:30:27\" nodeName=\"Test\" urlName=\"test\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1055\"><umbracoFile>/media/41/hydrangeas.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>595284</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:30:18\"><crop name=\"thumbCrop\" x=\"133\" y=\"0\" x2=\"902\" y2=\"768\" url=\"/media/41/hydrangeas_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem></DAMP>";
|
||||
var typedXml = new global::umbraco.MacroEngines.DynamicXml(xml);
|
||||
dynamic dynamicXml = typedXml;
|
||||
|
||||
//we haven't explicitly defined ElementAt so this will dynamically invoke this method
|
||||
var element = dynamicXml.ElementAt(0);
|
||||
|
||||
Assert.AreEqual("1057", Enumerable.First(element.BaseElement.Elements()).Attribute("id").Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Custom_Extension_Method()
|
||||
{
|
||||
var xml = "<DAMP fullMedia=\"\"><mediaItem><Image id=\"1057\" version=\"d58d5c16-153e-4896-892f-a722e45a69af\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:55:29\" updateDate=\"2012-11-05T16:55:44\" nodeName=\"test12\" urlName=\"test12\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1057\"><umbracoFile>/media/54/tulips.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>620888</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:55:34\"><crop name=\"thumbCrop\" x=\"154\" y=\"1\" x2=\"922\" y2=\"768\" url=\"/media/54/tulips_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem><mediaItem><Image id=\"1055\" version=\"4df1f08a-3552-45f2-b4bf-fa980c762f4a\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:29:58\" updateDate=\"2012-11-05T16:30:27\" nodeName=\"Test\" urlName=\"test\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1055\"><umbracoFile>/media/41/hydrangeas.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>595284</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:30:18\"><crop name=\"thumbCrop\" x=\"133\" y=\"0\" x2=\"902\" y2=\"768\" url=\"/media/41/hydrangeas_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem></DAMP>";
|
||||
var typedXml = new DynamicXml(xml);
|
||||
|
||||
dynamic dynamicXml = typedXml;
|
||||
|
||||
//we haven't explicitly defined ElementAt so this will dynamically invoke this method
|
||||
var element = dynamicXml.ElementAt(0);
|
||||
|
||||
Assert.AreEqual("1057", Enumerable.First(element.BaseElement.Elements()).Attribute("id").Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Take_Legacy()
|
||||
{
|
||||
var xml = "<DAMP fullMedia=\"\"><mediaItem><Image id=\"1057\" version=\"d58d5c16-153e-4896-892f-a722e45a69af\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:55:29\" updateDate=\"2012-11-05T16:55:44\" nodeName=\"test12\" urlName=\"test12\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1057\"><umbracoFile>/media/54/tulips.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>620888</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:55:34\"><crop name=\"thumbCrop\" x=\"154\" y=\"1\" x2=\"922\" y2=\"768\" url=\"/media/54/tulips_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem><mediaItem><Image id=\"1055\" version=\"4df1f08a-3552-45f2-b4bf-fa980c762f4a\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:29:58\" updateDate=\"2012-11-05T16:30:27\" nodeName=\"Test\" urlName=\"test\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1055\"><umbracoFile>/media/41/hydrangeas.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>595284</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:30:18\"><crop name=\"thumbCrop\" x=\"133\" y=\"0\" x2=\"902\" y2=\"768\" url=\"/media/41/hydrangeas_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem></DAMP>";
|
||||
var typedXml = new global::umbraco.MacroEngines.DynamicXml(xml);
|
||||
dynamic dynamicXml = typedXml;
|
||||
var typedTaken = typedXml.Take(1);
|
||||
var dynamicTaken = dynamicXml.Take(1);
|
||||
|
||||
Assert.AreEqual(1, typedTaken.Count());
|
||||
Assert.AreEqual(1, Enumerable.Count(dynamicTaken));
|
||||
|
||||
Assert.AreEqual("1057", typedTaken.ElementAt(0).BaseElement.Elements().First().Attribute("id").Value);
|
||||
Assert.AreEqual("1057", Enumerable.First(Enumerable.ElementAt(dynamicTaken, 0).BaseElement.Elements()).Attribute("id").Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Take()
|
||||
{
|
||||
var xml = "<DAMP fullMedia=\"\"><mediaItem><Image id=\"1057\" version=\"d58d5c16-153e-4896-892f-a722e45a69af\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:55:29\" updateDate=\"2012-11-05T16:55:44\" nodeName=\"test12\" urlName=\"test12\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1057\"><umbracoFile>/media/54/tulips.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>620888</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:55:34\"><crop name=\"thumbCrop\" x=\"154\" y=\"1\" x2=\"922\" y2=\"768\" url=\"/media/54/tulips_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem><mediaItem><Image id=\"1055\" version=\"4df1f08a-3552-45f2-b4bf-fa980c762f4a\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:29:58\" updateDate=\"2012-11-05T16:30:27\" nodeName=\"Test\" urlName=\"test\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1055\"><umbracoFile>/media/41/hydrangeas.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>595284</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:30:18\"><crop name=\"thumbCrop\" x=\"133\" y=\"0\" x2=\"902\" y2=\"768\" url=\"/media/41/hydrangeas_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem></DAMP>";
|
||||
var typedXml = new DynamicXml(xml);
|
||||
dynamic dynamicXml = typedXml;
|
||||
var typedTaken = typedXml.Take(1);
|
||||
var dynamicTaken = dynamicXml.Take(1);
|
||||
|
||||
Assert.AreEqual(1, typedTaken.Count());
|
||||
Assert.AreEqual(1, Enumerable.Count(dynamicTaken));
|
||||
|
||||
Assert.AreEqual("1057", typedTaken.ElementAt(0).BaseElement.Elements().First().Attribute("id").Value);
|
||||
Assert.AreEqual("1057", Enumerable.First(Enumerable.ElementAt(dynamicTaken, 0).BaseElement.Elements()).Attribute("id").Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Ensure_Legacy_Objects_Are_Returned()
|
||||
{
|
||||
var xml = "<DAMP fullMedia=\"\"><mediaItem><Image id=\"1057\" version=\"d58d5c16-153e-4896-892f-a722e45a69af\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:55:29\" updateDate=\"2012-11-05T16:55:44\" nodeName=\"test12\" urlName=\"test12\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1057\"><umbracoFile>/media/54/tulips.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>620888</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:55:34\"><crop name=\"thumbCrop\" x=\"154\" y=\"1\" x2=\"922\" y2=\"768\" url=\"/media/54/tulips_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem><mediaItem><Image id=\"1055\" version=\"4df1f08a-3552-45f2-b4bf-fa980c762f4a\" parentID=\"-1\" level=\"1\" writerID=\"0\" nodeType=\"1032\" template=\"0\" sortOrder=\"1\" createDate=\"2012-11-05T16:29:58\" updateDate=\"2012-11-05T16:30:27\" nodeName=\"Test\" urlName=\"test\" writerName=\"admin\" nodeTypeAlias=\"Image\" path=\"-1,1055\"><umbracoFile>/media/41/hydrangeas.jpg</umbracoFile><umbracoWidth>1024</umbracoWidth><umbracoHeight>768</umbracoHeight><umbracoBytes>595284</umbracoBytes><umbracoExtension>jpg</umbracoExtension><newsCrops><crops date=\"2012-11-05T16:30:18\"><crop name=\"thumbCrop\" x=\"133\" y=\"0\" x2=\"902\" y2=\"768\" url=\"/media/41/hydrangeas_thumbCrop.jpg\" /></crops></newsCrops></Image></mediaItem></DAMP>";
|
||||
var mediaItems = new global::umbraco.MacroEngines.DynamicXml(xml);
|
||||
//Debug.WriteLine("full xml = {0}", mediaItems.ToXml());
|
||||
|
||||
if (mediaItems.Count() != 0)
|
||||
{
|
||||
foreach (dynamic item in mediaItems)
|
||||
{
|
||||
Type itemType = item.GetType();
|
||||
Debug.WriteLine("item type = {0}", itemType);
|
||||
dynamic image = item.Image;
|
||||
|
||||
Type imageType = image.GetType();
|
||||
Debug.WriteLine("image type = {0}", imageType);
|
||||
|
||||
//ensure they are the same
|
||||
Assert.AreEqual(itemType, imageType);
|
||||
|
||||
//ensure they are legacy
|
||||
Assert.AreEqual(typeof(global::umbraco.MacroEngines.DynamicXml), itemType);
|
||||
Assert.AreEqual(typeof(global::umbraco.MacroEngines.DynamicXml), imageType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test the current Core class
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Find_Test_Core_Class()
|
||||
{
|
||||
RunFindTest(x => new DynamicXml(x));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tests the macroEngines legacy class
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void Find_Test_Legacy_Class()
|
||||
{
|
||||
RunFindTest(x => new global::umbraco.MacroEngines.DynamicXml(x));
|
||||
}
|
||||
|
||||
private void RunFindTest(Func<string, dynamic> getDynamicXml)
|
||||
{
|
||||
var xmlstring = @"<test>
|
||||
<item id='1' name='test 1' value='found 1'/>
|
||||
<item id='2' name='test 2' value='found 2'/>
|
||||
<item id='3' name='test 3' value='found 3'/>
|
||||
</test>";
|
||||
|
||||
dynamic dXml = getDynamicXml(xmlstring);
|
||||
|
||||
var result1 = dXml.Find("@name", "test 1");
|
||||
var result2 = dXml.Find("@name", "test 2");
|
||||
var result3 = dXml.Find("@name", "test 3");
|
||||
var result4 = dXml.Find("@name", "dont find");
|
||||
|
||||
Assert.AreEqual("found 1", result1.value);
|
||||
Assert.AreEqual("found 2", result2.value);
|
||||
Assert.AreEqual("found 3", result3.value);
|
||||
Assert.Throws<RuntimeBinderException>(() =>
|
||||
{
|
||||
//this will throw because result4 is not found
|
||||
var temp = result4.value;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -9,7 +9,7 @@ using Umbraco.Core.Models;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Web;
|
||||
|
||||
namespace Umbraco.Tests.DynamicDocument
|
||||
namespace Umbraco.Tests.PublishedContent
|
||||
{
|
||||
/// <summary>
|
||||
/// Unit tests for IPublishedContent and extensions
|
||||
+22
-18
@@ -1,17 +1,17 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Web;
|
||||
using Umbraco.Web.Models;
|
||||
|
||||
namespace Umbraco.Tests.DynamicDocument
|
||||
namespace Umbraco.Tests.PublishedContent
|
||||
{
|
||||
/// <summary>
|
||||
/// Tests the typed extension methods on IPublishedContent the same way we test the dynamic ones
|
||||
/// Tests the methods on IPublishedContent using the DefaultPublishedContentStore
|
||||
/// </summary>
|
||||
[TestFixture]
|
||||
public class PublishedContentTests : BaseWebTest
|
||||
@@ -72,7 +72,7 @@ namespace Umbraco.Tests.DynamicDocument
|
||||
});
|
||||
|
||||
//need to specify a custom callback for unit tests
|
||||
DynamicPublishedContent.GetDataTypeCallback = (docTypeAlias, propertyAlias) =>
|
||||
PublishedContentHelper.GetDataTypeCallback = (docTypeAlias, propertyAlias) =>
|
||||
{
|
||||
if (propertyAlias == "content")
|
||||
{
|
||||
@@ -105,6 +105,20 @@ namespace Umbraco.Tests.DynamicDocument
|
||||
return doc;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Get_Property_Value_Uses_Converter()
|
||||
{
|
||||
var doc = GetNode(1173);
|
||||
|
||||
var propVal = doc.GetPropertyValue("content");
|
||||
Assert.IsTrue(TypeHelper.IsTypeAssignableFrom<IHtmlString>(propVal.GetType()));
|
||||
Assert.AreEqual("<div>This is some content</div>", propVal.ToString());
|
||||
|
||||
var propVal2 = doc.GetPropertyValue<IHtmlString>("content");
|
||||
Assert.IsTrue(TypeHelper.IsTypeAssignableFrom<IHtmlString>(propVal2.GetType()));
|
||||
Assert.AreEqual("<div>This is some content</div>", propVal2.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Complex_Linq()
|
||||
{
|
||||
@@ -113,7 +127,7 @@ namespace Umbraco.Tests.DynamicDocument
|
||||
var result = doc.Ancestors().OrderBy(x => x.Level)
|
||||
.Single()
|
||||
.Descendants()
|
||||
.FirstOrDefault(x => x.GetPropertyValue("selectedNodes", "").Split(',').Contains("1173"));
|
||||
.FirstOrDefault(x => x.GetPropertyValue<string>("selectedNodes", "").Split(',').Contains("1173"));
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
}
|
||||
@@ -255,17 +269,7 @@ namespace Umbraco.Tests.DynamicDocument
|
||||
Assert.IsTrue(visible.IsVisible());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Ensure_TinyMCE_Converted_Type_User_Property()
|
||||
{
|
||||
var doc = GetNode(1173);
|
||||
|
||||
throw new NotImplementedException("We currently don't have an extension method to return the formatted value using IPropertyValueConverter! This currently only works in the dynamic implementation");
|
||||
|
||||
//Assert.IsTrue(TypeHelper.IsTypeAssignableFrom<IHtmlString>(doc.GetPropertyValue().Content.GetType()));
|
||||
//Assert.AreEqual("<div>This is some content</div>", doc.Content.ToString());
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void Ancestor_Or_Self()
|
||||
{
|
||||
@@ -326,8 +330,8 @@ namespace Umbraco.Tests.DynamicDocument
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
|
||||
Assert.AreEqual(6, result.Count());
|
||||
Assert.IsTrue(result.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1173, 1174, 1176, 1175 }));
|
||||
Assert.AreEqual(7, result.Count());
|
||||
Assert.IsTrue(result.Select(x => ((dynamic)x).Id).ContainsAll(new dynamic[] { 1173, 1174, 1176, 1175, 4444 }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -0,0 +1,343 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.XPath;
|
||||
using Examine;
|
||||
using Examine.LuceneEngine;
|
||||
using Examine.LuceneEngine.Providers;
|
||||
using Lucene.Net.Analysis.Standard;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Tests.TestHelpers.ExamineHelpers;
|
||||
using Umbraco.Web;
|
||||
using UmbracoExamine;
|
||||
using UmbracoExamine.DataServices;
|
||||
using umbraco.BusinessLogic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Umbraco.Tests.PublishedContent
|
||||
{
|
||||
/// <summary>
|
||||
/// Tests the typed extension methods on IPublishedContent using the DefaultPublishedMediaStore
|
||||
/// </summary>
|
||||
[TestFixture]
|
||||
public class PublishedMediaTests : BaseWebTest
|
||||
{
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
DoInitialization(GetUmbracoContext("/test", 1234));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shared with PublishMediaStoreTests
|
||||
/// </summary>
|
||||
/// <param name="umbContext"></param>
|
||||
internal static void DoInitialization(UmbracoContext umbContext)
|
||||
{
|
||||
PropertyEditorValueConvertersResolver.Current = new PropertyEditorValueConvertersResolver(
|
||||
new[]
|
||||
{
|
||||
typeof(DatePickerPropertyEditorValueConverter),
|
||||
typeof(TinyMcePropertyEditorValueConverter),
|
||||
typeof(YesNoPropertyEditorValueConverter)
|
||||
});
|
||||
|
||||
//need to specify a custom callback for unit tests
|
||||
PublishedContentHelper.GetDataTypeCallback = (docTypeAlias, propertyAlias) =>
|
||||
{
|
||||
if (propertyAlias == "content")
|
||||
{
|
||||
//return the rte type id
|
||||
return Guid.Parse("5e9b75ae-face-41c8-b47e-5f4b0fd82f83");
|
||||
}
|
||||
return Guid.Empty;
|
||||
};
|
||||
|
||||
UmbracoSettings.ForceSafeAliases = true;
|
||||
UmbracoSettings.UmbracoLibraryCacheDuration = 1800;
|
||||
|
||||
UmbracoContext.Current = umbContext;
|
||||
PublishedMediaStoreResolver.Current = new PublishedMediaStoreResolver(new DefaultPublishedMediaStore());
|
||||
|
||||
UmbracoSettings.ForceSafeAliases = true;
|
||||
}
|
||||
|
||||
public override void TearDown()
|
||||
{
|
||||
base.TearDown();
|
||||
|
||||
DoTearDown();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shared with PublishMediaStoreTests
|
||||
/// </summary>
|
||||
internal static void DoTearDown()
|
||||
{
|
||||
PropertyEditorValueConvertersResolver.Reset();
|
||||
UmbracoContext.Current = null;
|
||||
PublishedMediaStoreResolver.Reset();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shared with PublishMediaStoreTests
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="umbracoContext"></param>
|
||||
/// <returns></returns>
|
||||
internal static IPublishedContent GetNode(int id, UmbracoContext umbracoContext)
|
||||
{
|
||||
var ctx = umbracoContext;
|
||||
var mediaStore = new DefaultPublishedMediaStore();
|
||||
var doc = mediaStore.GetDocumentById(ctx, id);
|
||||
Assert.IsNotNull(doc);
|
||||
return doc;
|
||||
}
|
||||
|
||||
private IPublishedContent GetNode(int id)
|
||||
{
|
||||
return GetNode(id, GetUmbracoContext("/test", 1234));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Children_With_Examine()
|
||||
{
|
||||
var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString()));
|
||||
var indexInit = new IndexInitializer();
|
||||
var indexer = indexInit.GetUmbracoIndexer(newIndexFolder);
|
||||
indexer.RebuildIndex();
|
||||
|
||||
var store = new DefaultPublishedMediaStore(indexInit.GetUmbracoSearcher(newIndexFolder));
|
||||
|
||||
//we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace
|
||||
var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 1111);
|
||||
var rootChildren = publishedMedia.Children();
|
||||
Assert.IsTrue(rootChildren.Select(x => x.Id).ContainsAll(new[] { 2222, 1113, 1114, 1115, 1116 }));
|
||||
|
||||
var publishedChild1 = store.GetDocumentById(GetUmbracoContext("/test", 1234), 2222);
|
||||
var subChildren = publishedChild1.Children();
|
||||
Assert.IsTrue(subChildren.Select(x => x.Id).ContainsAll(new[] { 2112 }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Descendants_With_Examine()
|
||||
{
|
||||
var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString()));
|
||||
var indexInit = new IndexInitializer();
|
||||
var indexer = indexInit.GetUmbracoIndexer(newIndexFolder);
|
||||
indexer.RebuildIndex();
|
||||
|
||||
var store = new DefaultPublishedMediaStore(indexInit.GetUmbracoSearcher(newIndexFolder));
|
||||
|
||||
//we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace
|
||||
var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 1111);
|
||||
var rootDescendants = publishedMedia.Descendants();
|
||||
Assert.IsTrue(rootDescendants.Select(x => x.Id).ContainsAll(new[] { 2112, 2222, 1113, 1114, 1115, 1116 }));
|
||||
|
||||
var publishedChild1 = store.GetDocumentById(GetUmbracoContext("/test", 1234), 2222);
|
||||
var subDescendants = publishedChild1.Descendants();
|
||||
Assert.IsTrue(subDescendants.Select(x => x.Id).ContainsAll(new[] { 2112, 3113 }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DescendantsOrSelf_With_Examine()
|
||||
{
|
||||
var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString()));
|
||||
var indexInit = new IndexInitializer();
|
||||
var indexer = indexInit.GetUmbracoIndexer(newIndexFolder);
|
||||
indexer.RebuildIndex();
|
||||
|
||||
var store = new DefaultPublishedMediaStore(indexInit.GetUmbracoSearcher(newIndexFolder));
|
||||
|
||||
//we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace
|
||||
var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 1111);
|
||||
var rootDescendants = publishedMedia.DescendantsOrSelf();
|
||||
Assert.IsTrue(rootDescendants.Select(x => x.Id).ContainsAll(new[] { 1111, 2112, 2222, 1113, 1114, 1115, 1116 }));
|
||||
|
||||
var publishedChild1 = store.GetDocumentById(GetUmbracoContext("/test", 1234), 2222);
|
||||
var subDescendants = publishedChild1.DescendantsOrSelf();
|
||||
Assert.IsTrue(subDescendants.Select(x => x.Id).ContainsAll(new[] { 2222, 2112, 3113 }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Ancestors_With_Examine()
|
||||
{
|
||||
var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString()));
|
||||
var indexInit = new IndexInitializer();
|
||||
var indexer = indexInit.GetUmbracoIndexer(newIndexFolder);
|
||||
indexer.RebuildIndex();
|
||||
|
||||
var store = new DefaultPublishedMediaStore(indexInit.GetUmbracoSearcher(newIndexFolder));
|
||||
|
||||
//we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace
|
||||
var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 3113);
|
||||
var ancestors = publishedMedia.Ancestors();
|
||||
Assert.IsTrue(ancestors.Select(x => x.Id).ContainsAll(new[] { 2112, 2222, 1111 }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AncestorsOrSelf_With_Examine()
|
||||
{
|
||||
var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString()));
|
||||
var indexInit = new IndexInitializer();
|
||||
var indexer = indexInit.GetUmbracoIndexer(newIndexFolder);
|
||||
indexer.RebuildIndex();
|
||||
|
||||
var store = new DefaultPublishedMediaStore(indexInit.GetUmbracoSearcher(newIndexFolder));
|
||||
|
||||
//we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace
|
||||
var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 3113);
|
||||
var ancestors = publishedMedia.AncestorsOrSelf();
|
||||
Assert.IsTrue(ancestors.Select(x => x.Id).ContainsAll(new[] { 3113, 2112, 2222, 1111 }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Children_Without_Examine()
|
||||
{
|
||||
var user = new User(0);
|
||||
var mType = global::umbraco.cms.businesslogic.media.MediaType.MakeNew(user, "TestMediaType");
|
||||
var mRoot = global::umbraco.cms.businesslogic.media.Media.MakeNew("MediaRoot", mType, user, -1);
|
||||
|
||||
var mChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child1", mType, user, mRoot.Id);
|
||||
var mChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child2", mType, user, mRoot.Id);
|
||||
var mChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child3", mType, user, mRoot.Id);
|
||||
|
||||
var mSubChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild1", mType, user, mChild1.Id);
|
||||
var mSubChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild2", mType, user, mChild1.Id);
|
||||
var mSubChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild3", mType, user, mChild1.Id);
|
||||
|
||||
var publishedMedia = GetNode(mRoot.Id);
|
||||
var rootChildren = publishedMedia.Children();
|
||||
Assert.IsTrue(rootChildren.Select(x => x.Id).ContainsAll(new[] {mChild1.Id, mChild2.Id, mChild3.Id}));
|
||||
|
||||
var publishedChild1 = GetNode(mChild1.Id);
|
||||
var subChildren = publishedChild1.Children();
|
||||
Assert.IsTrue(subChildren.Select(x => x.Id).ContainsAll(new[] { mSubChild1.Id, mSubChild2.Id, mSubChild3.Id }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Descendants_Without_Examine()
|
||||
{
|
||||
var user = new User(0);
|
||||
var mType = global::umbraco.cms.businesslogic.media.MediaType.MakeNew(user, "TestMediaType");
|
||||
var mRoot = global::umbraco.cms.businesslogic.media.Media.MakeNew("MediaRoot", mType, user, -1);
|
||||
|
||||
var mChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child1", mType, user, mRoot.Id);
|
||||
var mChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child2", mType, user, mRoot.Id);
|
||||
var mChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child3", mType, user, mRoot.Id);
|
||||
|
||||
var mSubChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild1", mType, user, mChild1.Id);
|
||||
var mSubChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild2", mType, user, mChild1.Id);
|
||||
var mSubChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild3", mType, user, mChild1.Id);
|
||||
|
||||
var publishedMedia = GetNode(mRoot.Id);
|
||||
var rootDescendants = publishedMedia.Descendants();
|
||||
Assert.IsTrue(rootDescendants.Select(x => x.Id).ContainsAll(new[] { mChild1.Id, mChild2.Id, mChild3.Id, mSubChild1.Id, mSubChild2.Id, mSubChild3.Id }));
|
||||
|
||||
var publishedChild1 = GetNode(mChild1.Id);
|
||||
var subDescendants = publishedChild1.Descendants();
|
||||
Assert.IsTrue(subDescendants.Select(x => x.Id).ContainsAll(new[] { mSubChild1.Id, mSubChild2.Id, mSubChild3.Id }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DescendantsOrSelf_Without_Examine()
|
||||
{
|
||||
var user = new User(0);
|
||||
var mType = global::umbraco.cms.businesslogic.media.MediaType.MakeNew(user, "TestMediaType");
|
||||
var mRoot = global::umbraco.cms.businesslogic.media.Media.MakeNew("MediaRoot", mType, user, -1);
|
||||
|
||||
var mChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child1", mType, user, mRoot.Id);
|
||||
var mChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child2", mType, user, mRoot.Id);
|
||||
var mChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child3", mType, user, mRoot.Id);
|
||||
|
||||
var mSubChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild1", mType, user, mChild1.Id);
|
||||
var mSubChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild2", mType, user, mChild1.Id);
|
||||
var mSubChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild3", mType, user, mChild1.Id);
|
||||
|
||||
var publishedMedia = GetNode(mRoot.Id);
|
||||
var rootDescendantsOrSelf = publishedMedia.DescendantsOrSelf();
|
||||
Assert.IsTrue(rootDescendantsOrSelf.Select(x => x.Id).ContainsAll(
|
||||
new[] { mRoot.Id, mChild1.Id, mChild2.Id, mChild3.Id, mSubChild1.Id, mSubChild2.Id, mSubChild3.Id }));
|
||||
|
||||
var publishedChild1 = GetNode(mChild1.Id);
|
||||
var subDescendantsOrSelf = publishedChild1.DescendantsOrSelf();
|
||||
Assert.IsTrue(subDescendantsOrSelf.Select(x => x.Id).ContainsAll(
|
||||
new[] { mChild1.Id, mSubChild1.Id, mSubChild2.Id, mSubChild3.Id }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parent_Without_Examine()
|
||||
{
|
||||
var user = new User(0);
|
||||
var mType = global::umbraco.cms.businesslogic.media.MediaType.MakeNew(user, "TestMediaType");
|
||||
var mRoot = global::umbraco.cms.businesslogic.media.Media.MakeNew("MediaRoot", mType, user, -1);
|
||||
|
||||
var mChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child1", mType, user, mRoot.Id);
|
||||
var mChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child2", mType, user, mRoot.Id);
|
||||
var mChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child3", mType, user, mRoot.Id);
|
||||
|
||||
var mSubChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild1", mType, user, mChild1.Id);
|
||||
var mSubChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild2", mType, user, mChild1.Id);
|
||||
var mSubChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild3", mType, user, mChild1.Id);
|
||||
|
||||
var publishedRoot = GetNode(mRoot.Id);
|
||||
Assert.AreEqual(null, publishedRoot.Parent);
|
||||
|
||||
var publishedChild1 = GetNode(mChild1.Id);
|
||||
Assert.AreEqual(mRoot.Id, publishedChild1.Parent.Id);
|
||||
|
||||
var publishedSubChild1 = GetNode(mSubChild1.Id);
|
||||
Assert.AreEqual(mChild1.Id, publishedSubChild1.Parent.Id);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Ancestors_Without_Examine()
|
||||
{
|
||||
var user = new User(0);
|
||||
var mType = global::umbraco.cms.businesslogic.media.MediaType.MakeNew(user, "TestMediaType");
|
||||
var mRoot = global::umbraco.cms.businesslogic.media.Media.MakeNew("MediaRoot", mType, user, -1);
|
||||
|
||||
var mChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child1", mType, user, mRoot.Id);
|
||||
var mChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child2", mType, user, mRoot.Id);
|
||||
var mChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child3", mType, user, mRoot.Id);
|
||||
|
||||
var mSubChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild1", mType, user, mChild1.Id);
|
||||
var mSubChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild2", mType, user, mChild1.Id);
|
||||
var mSubChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild3", mType, user, mChild1.Id);
|
||||
|
||||
var publishedSubChild1 = GetNode(mSubChild1.Id);
|
||||
Assert.IsTrue(publishedSubChild1.Ancestors().Select(x => x.Id).ContainsAll(new[] {mChild1.Id, mRoot.Id}));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AncestorsOrSelf_Without_Examine()
|
||||
{
|
||||
var user = new User(0);
|
||||
var mType = global::umbraco.cms.businesslogic.media.MediaType.MakeNew(user, "TestMediaType");
|
||||
var mRoot = global::umbraco.cms.businesslogic.media.Media.MakeNew("MediaRoot", mType, user, -1);
|
||||
|
||||
var mChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child1", mType, user, mRoot.Id);
|
||||
var mChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child2", mType, user, mRoot.Id);
|
||||
var mChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("Child3", mType, user, mRoot.Id);
|
||||
|
||||
var mSubChild1 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild1", mType, user, mChild1.Id);
|
||||
var mSubChild2 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild2", mType, user, mChild1.Id);
|
||||
var mSubChild3 = global::umbraco.cms.businesslogic.media.Media.MakeNew("SubChild3", mType, user, mChild1.Id);
|
||||
|
||||
var publishedSubChild1 = GetNode(mSubChild1.Id);
|
||||
Assert.IsTrue(publishedSubChild1.AncestorsOrSelf().Select(x => x.Id).ContainsAll(
|
||||
new[] { mSubChild1.Id, mChild1.Id, mRoot.Id }));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
@@ -9,7 +8,7 @@ using Umbraco.Core.Models;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Web;
|
||||
|
||||
namespace Umbraco.Tests.DynamicDocument
|
||||
namespace Umbraco.Tests.PublishedContent
|
||||
{
|
||||
[TestFixture]
|
||||
public class StronglyTypedQueryTests : BaseWebTest
|
||||
@@ -18,7 +18,7 @@ namespace Umbraco.Tests.Resolvers
|
||||
TestHelper.SetupLog4NetForTests();
|
||||
|
||||
//this ensures its reset
|
||||
PluginManager.Current = new PluginManager();
|
||||
PluginManager.Current = new PluginManager(false);
|
||||
|
||||
//for testing, we'll specify which assemblies are scanned for the PluginTypeResolver
|
||||
PluginManager.Current.AssembliesToScan = new[]
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace Umbraco.Tests.Resolvers
|
||||
TestHelper.SetupLog4NetForTests();
|
||||
|
||||
//this ensures its reset
|
||||
PluginManager.Current = new PluginManager();
|
||||
PluginManager.Current = new PluginManager(false);
|
||||
|
||||
//for testing, we'll specify which assemblies are scanned for the PluginTypeResolver
|
||||
PluginManager.Current.AssembliesToScan = new[]
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace Umbraco.Tests.Resolvers
|
||||
TestHelper.SetupLog4NetForTests();
|
||||
|
||||
//this ensures its reset
|
||||
PluginManager.Current = new PluginManager();
|
||||
PluginManager.Current = new PluginManager(false);
|
||||
|
||||
//for testing, we'll specify which assemblies are scanned for the PluginTypeResolver
|
||||
PluginManager.Current.AssembliesToScan = new[]
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Web.Routing;
|
||||
using System.Xml;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Core.ObjectResolution;
|
||||
using Umbraco.Tests.Stubs;
|
||||
@@ -41,6 +42,7 @@ namespace Umbraco.Tests.TestHelpers
|
||||
public virtual void TearDown()
|
||||
{
|
||||
//reset the app context
|
||||
ApplicationContext.ApplicationCache.ClearAllCache();
|
||||
ApplicationContext.Current = null;
|
||||
Resolution.IsFrozen = false;
|
||||
if (RequiresDbSetup)
|
||||
@@ -49,6 +51,8 @@ namespace Umbraco.Tests.TestHelpers
|
||||
AppDomain.CurrentDomain.SetData("DataDirectory", null);
|
||||
|
||||
Cache.ClearAllCache();
|
||||
|
||||
UmbracoSettings.ResetSetters();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.17929
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Umbraco.Tests.TestHelpers.ExamineHelpers {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class ExamineResources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal ExamineResources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Umbraco.Tests.TestHelpers.ExamineHelpers.ExamineResources", typeof(ExamineResources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?>
|
||||
///<media>
|
||||
/// <node id="1111" version="902e13f7-5793-482a-9e06-cd94eebd1de0" parentID="-1" level="1" writerID="0" nodeType="1031" template="0" sortOrder="2" createDate="2010-05-19T15:26:08" updateDate="2010-05-19T15:26:09" nodeName="Product Images" urlName="productimages" writerName="Administrator" nodeTypeAlias="Folder" path="-1,1111">
|
||||
/// <data alias="contents"></data>
|
||||
/// <node id="2222" version="902e13f7-5793-482a-9e06-cd94eebd1de0" parentID="-1" level="1" writerID="0" [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string media {
|
||||
get {
|
||||
return ResourceManager.GetString("media", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?>
|
||||
///<!DOCTYPE root[
|
||||
/// <!ELEMENT CWS_Contact ANY>
|
||||
/// <!ATTLIST CWS_Contact id ID #REQUIRED>
|
||||
/// <!ELEMENT CWS_EmailAFriend ANY>
|
||||
/// <!ATTLIST CWS_EmailAFriend id ID #REQUIRED>
|
||||
/// <!ELEMENT CWS_EventItem ANY>
|
||||
/// <!ATTLIST CWS_EventItem id ID #REQUIRED>
|
||||
/// <!ELEMENT CWS_Galleries ANY>
|
||||
/// <!ATTLIST CWS_Galleries id ID #REQUIRED>
|
||||
/// <!ELEMENT CWS_Gallery ANY>
|
||||
/// <!ATTLIST CWS_Gallery id ID #REQUIRED>
|
||||
/// <!ELEMENT CWS_Home ANY>
|
||||
/// <!ATTLIST CWS_Home id ID #REQUIRED>
|
||||
/// <!ELEMENT CWS_NewsEven [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string umbraco {
|
||||
get {
|
||||
return ResourceManager.GetString("umbraco", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="media" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>media.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
<data name="umbraco" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>umbraco.config;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,360 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.XPath;
|
||||
using Examine;
|
||||
using Examine.LuceneEngine;
|
||||
using Examine.LuceneEngine.Providers;
|
||||
using Lucene.Net.Analysis.Standard;
|
||||
using UmbracoExamine;
|
||||
using UmbracoExamine.DataServices;
|
||||
|
||||
namespace Umbraco.Tests.TestHelpers.ExamineHelpers
|
||||
{
|
||||
/// <summary>
|
||||
/// Used internally by test classes to initialize a new index from the template
|
||||
/// </summary>
|
||||
internal class IndexInitializer
|
||||
{
|
||||
|
||||
public IndexInitializer()
|
||||
{
|
||||
//ensure the umbraco.config and media.xml files exist at the location where we need to load them
|
||||
var appData = Path.Combine(TestHelper.CurrentAssemblyDirectory, "App_Data");
|
||||
Directory.CreateDirectory(appData);
|
||||
var umbConfig = Path.Combine(appData, "umbraco.config");
|
||||
File.Delete(umbConfig);
|
||||
using (var s = File.CreateText(umbConfig))
|
||||
{
|
||||
s.Write(ExamineResources.umbraco);
|
||||
}
|
||||
|
||||
var umbMedia = Path.Combine(appData, "media.xml");
|
||||
File.Delete(umbMedia);
|
||||
using (var s = File.CreateText(umbMedia))
|
||||
{
|
||||
s.Write(ExamineResources.media);
|
||||
}
|
||||
}
|
||||
|
||||
public UmbracoContentIndexer GetUmbracoIndexer(DirectoryInfo d)
|
||||
{
|
||||
var i = new UmbracoContentIndexer(new IndexCriteria(
|
||||
new[]
|
||||
{
|
||||
new TestIndexField { Name = "id", EnableSorting = true, Type = "Number" },
|
||||
new TestIndexField { Name = "nodeName", EnableSorting = true },
|
||||
new TestIndexField { Name = "updateDate", EnableSorting = true, Type = "DateTime" },
|
||||
new TestIndexField { Name = "writerName" },
|
||||
new TestIndexField { Name = "path" },
|
||||
new TestIndexField { Name = "nodeTypeAlias" },
|
||||
new TestIndexField { Name = "parentID" }
|
||||
},
|
||||
Enumerable.Empty<IIndexField>(),
|
||||
//new[]
|
||||
// {
|
||||
// new TestIndexField { Name = "headerText" },
|
||||
// new TestIndexField { Name = "bodyText" },
|
||||
// new TestIndexField { Name = "metaDescription" },
|
||||
// new TestIndexField { Name = "metaKeywords" },
|
||||
// new TestIndexField { Name = "bodyTextColOne" },
|
||||
// new TestIndexField { Name = "bodyTextColTwo" },
|
||||
// new TestIndexField { Name = "xmlStorageTest" }
|
||||
// },
|
||||
Enumerable.Empty<string>(),
|
||||
//new[]
|
||||
// {
|
||||
// "CWS_Home",
|
||||
// "CWS_Textpage",
|
||||
// "CWS_TextpageTwoCol",
|
||||
// "CWS_NewsEventsList",
|
||||
// "CWS_NewsItem",
|
||||
// "CWS_Gallery",
|
||||
// "CWS_EventItem",
|
||||
// "Image",
|
||||
// },
|
||||
new string[] { },
|
||||
-1),
|
||||
d,
|
||||
new TestDataService(),
|
||||
new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29),
|
||||
false);
|
||||
|
||||
//i.IndexSecondsInterval = 1;
|
||||
|
||||
i.IndexingError += IndexingError;
|
||||
|
||||
return i;
|
||||
}
|
||||
public UmbracoExamineSearcher GetUmbracoSearcher(DirectoryInfo d)
|
||||
{
|
||||
return new UmbracoExamineSearcher(d, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
|
||||
}
|
||||
//public SimpleDataIndexer GetSimpleIndexer(DirectoryInfo d)
|
||||
//{
|
||||
// var i = new SimpleDataIndexer(new IndexCriteria(
|
||||
// new IIndexField[] { },
|
||||
// new[]
|
||||
// {
|
||||
// new TestIndexField { Name = "Author" },
|
||||
// new TestIndexField { Name = "DateCreated", EnableSorting = true, Type = "DateTime" },
|
||||
// new TestIndexField { Name = "Title" },
|
||||
// new TestIndexField { Name = "Photographer" },
|
||||
// new TestIndexField { Name = "YearCreated", Type = "Date.Year" },
|
||||
// new TestIndexField { Name = "MonthCreated", Type = "Date.Month" },
|
||||
// new TestIndexField { Name = "DayCreated", Type = "Date.Day" },
|
||||
// new TestIndexField { Name = "HourCreated", Type = "Date.Hour" },
|
||||
// new TestIndexField { Name = "MinuteCreated", Type = "Date.Minute" },
|
||||
// new TestIndexField { Name = "SomeNumber", Type = "Number" },
|
||||
// new TestIndexField { Name = "SomeFloat", Type = "Float" },
|
||||
// new TestIndexField { Name = "SomeDouble", Type = "Double" },
|
||||
// new TestIndexField { Name = "SomeLong", Type = "Long" }
|
||||
// },
|
||||
// new string[] { },
|
||||
// new string[] { },
|
||||
// -1),
|
||||
// d,
|
||||
// new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29),
|
||||
// new TestSimpleDataProvider(),
|
||||
// new[] { "Documents", "Pictures" },
|
||||
// false);
|
||||
// i.IndexingError += IndexingError;
|
||||
|
||||
// return i;
|
||||
//}
|
||||
public LuceneSearcher GetLuceneSearcher(DirectoryInfo d)
|
||||
{
|
||||
return new LuceneSearcher(d, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
|
||||
}
|
||||
//public PDFIndexer GetPdfIndexer(DirectoryInfo d)
|
||||
//{
|
||||
// var i = new PDFIndexer(d,
|
||||
// new TestDataService(),
|
||||
// new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29),
|
||||
// false);
|
||||
|
||||
// i.IndexingError += IndexingError;
|
||||
|
||||
// return i;
|
||||
//}
|
||||
public MultiIndexSearcher GetMultiSearcher(DirectoryInfo pdfDir, DirectoryInfo simpleDir, DirectoryInfo conventionDir, DirectoryInfo cwsDir)
|
||||
{
|
||||
var i = new MultiIndexSearcher(new[] { pdfDir, simpleDir, conventionDir, cwsDir }, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
internal void IndexingError(object sender, IndexingErrorEventArgs e)
|
||||
{
|
||||
throw new ApplicationException(e.Message, e.InnerException);
|
||||
}
|
||||
|
||||
internal class TestIndexField : IIndexField
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public bool EnableSorting { get; set; }
|
||||
public string Type { get; set; }
|
||||
}
|
||||
|
||||
internal class TestDataService : IDataService
|
||||
{
|
||||
|
||||
public TestDataService()
|
||||
{
|
||||
ContentService = new TestContentService();
|
||||
LogService = new TestLogService();
|
||||
MediaService = new TestMediaService();
|
||||
}
|
||||
|
||||
#region IDataService Members
|
||||
|
||||
public IContentService ContentService { get; private set; }
|
||||
|
||||
public ILogService LogService { get; private set; }
|
||||
|
||||
public IMediaService MediaService { get; private set; }
|
||||
|
||||
public string MapPath(string virtualPath)
|
||||
{
|
||||
return new DirectoryInfo(TestHelper.CurrentAssemblyDirectory) + "\\" + virtualPath.Replace("/", "\\");
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A mock data service used to return content from the XML data file created with CWS
|
||||
/// </summary>
|
||||
internal class TestContentService : IContentService
|
||||
{
|
||||
public const int ProtectedNode = 1142;
|
||||
|
||||
public TestContentService()
|
||||
{
|
||||
var xmlFile = new DirectoryInfo(TestHelper.CurrentAssemblyDirectory).GetDirectories("App_Data")
|
||||
.Single()
|
||||
.GetFiles("umbraco.config")
|
||||
.Single();
|
||||
|
||||
_xDoc = XDocument.Load(xmlFile.FullName);
|
||||
}
|
||||
|
||||
#region IContentService Members
|
||||
|
||||
/// <summary>
|
||||
/// Return the XDocument containing the xml from the umbraco.config xml file
|
||||
/// </summary>
|
||||
/// <param name="xpath"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// This is no different in the test suite as published content
|
||||
/// </remarks>
|
||||
public XDocument GetLatestContentByXPath(string xpath)
|
||||
{
|
||||
var xdoc = XDocument.Parse("<content></content>");
|
||||
xdoc.Root.Add(_xDoc.XPathSelectElements(xpath));
|
||||
|
||||
return xdoc;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Return the XDocument containing the xml from the umbraco.config xml file
|
||||
/// </summary>
|
||||
/// <param name="xpath"></param>
|
||||
/// <returns></returns>
|
||||
public XDocument GetPublishedContentByXPath(string xpath)
|
||||
{
|
||||
var xdoc = XDocument.Parse("<content></content>");
|
||||
xdoc.Root.Add(_xDoc.XPathSelectElements(xpath));
|
||||
|
||||
return xdoc;
|
||||
}
|
||||
|
||||
public string StripHtml(string value)
|
||||
{
|
||||
const string pattern = @"<(.|\n)*?>";
|
||||
return Regex.Replace(value, pattern, string.Empty);
|
||||
}
|
||||
|
||||
public bool IsProtected(int nodeId, string path)
|
||||
{
|
||||
// single node is marked as protected for test indexer
|
||||
// hierarchy is not important for this test
|
||||
return nodeId == ProtectedNode;
|
||||
}
|
||||
|
||||
public IEnumerable<string> GetAllUserPropertyNames()
|
||||
{
|
||||
return GetPublishedContentByXPath("//*[count(@id)>0]")
|
||||
.Root
|
||||
.Elements()
|
||||
.Select(x => x.Name.LocalName)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public IEnumerable<string> GetAllSystemPropertyNames()
|
||||
{
|
||||
return new Dictionary<string, FieldIndexTypes>()
|
||||
{
|
||||
{"id", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"version", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"parentID", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"level", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"writerID", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"creatorID", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"nodeType", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"template", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"sortOrder", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"createDate", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"updateDate", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"nodeName", FieldIndexTypes.ANALYZED},
|
||||
{"urlName", FieldIndexTypes.NOT_ANALYZED},
|
||||
{"writerName", FieldIndexTypes.ANALYZED},
|
||||
{"creatorName", FieldIndexTypes.ANALYZED},
|
||||
{"nodeTypeAlias", FieldIndexTypes.ANALYZED},
|
||||
{"path", FieldIndexTypes.NOT_ANALYZED}
|
||||
}.Select(x => x.Key);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private readonly XDocument _xDoc;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
internal class TestLogService : ILogService
|
||||
{
|
||||
#region ILogService Members
|
||||
|
||||
public string ProviderName { get; set; }
|
||||
|
||||
public void AddErrorLog(int nodeId, string msg)
|
||||
{
|
||||
Trace.WriteLine("ERROR: (" + nodeId.ToString() + ") " + msg);
|
||||
}
|
||||
|
||||
public void AddInfoLog(int nodeId, string msg)
|
||||
{
|
||||
Trace.WriteLine("INFO: (" + nodeId.ToString() + ") " + msg);
|
||||
}
|
||||
|
||||
public void AddVerboseLog(int nodeId, string msg)
|
||||
{
|
||||
if (LogLevel == LoggingLevel.Verbose)
|
||||
Trace.WriteLine("VERBOSE: (" + nodeId.ToString() + ") " + msg);
|
||||
}
|
||||
|
||||
public LoggingLevel LogLevel
|
||||
{
|
||||
get
|
||||
{
|
||||
return LoggingLevel.Verbose;
|
||||
}
|
||||
set
|
||||
{
|
||||
//do nothing
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
internal class TestMediaService : IMediaService
|
||||
{
|
||||
|
||||
public TestMediaService()
|
||||
{
|
||||
var xmlFile = new DirectoryInfo(TestHelper.CurrentAssemblyDirectory).GetDirectories("App_Data")
|
||||
.Single()
|
||||
.GetFiles("media.xml")
|
||||
.Single();
|
||||
|
||||
m_Doc = XDocument.Load(xmlFile.FullName);
|
||||
}
|
||||
|
||||
#region IMediaService Members
|
||||
|
||||
public System.Xml.Linq.XDocument GetLatestMediaByXpath(string xpath)
|
||||
{
|
||||
var xdoc = XDocument.Parse("<media></media>");
|
||||
xdoc.Root.Add(m_Doc.XPathSelectElements(xpath));
|
||||
return xdoc;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private XDocument m_Doc;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<media>
|
||||
<node id="1111" version="902e13f7-5793-482a-9e06-cd94eebd1de0" parentID="-1" level="1" writerID="0" nodeType="1031" template="0" sortOrder="2" createDate="2010-05-19T15:26:08" updateDate="2010-05-19T15:26:09" nodeName="Product Images" urlName="productimages" writerName="Administrator" nodeTypeAlias="Folder" path="-1,1111">
|
||||
<data alias="contents"></data>
|
||||
<node id="2222" version="902e13f7-5793-482a-9e06-cd94eebd1de0" parentID="1111" level="1" writerID="0" nodeType="1031" template="0" sortOrder="2" createDate="2010-05-19T15:26:08" updateDate="2010-05-19T15:26:09" nodeName="Product Images" urlName="productimages" writerName="Administrator" nodeTypeAlias="Folder" path="-1,1111,2222">
|
||||
<data alias="contents"></data>
|
||||
<node id="2112" version="5b3e46ab-3e37-4cfa-ab70-014234b5bd39" parentID="2222" level="2" writerID="0" nodeType="1032" template="0" sortOrder="1" createDate="2010-05-19T17:32:46" updateDate="2010-05-19T17:32:46" nodeName="Sam's Umbraco Image" urlName="acnestressscrub" writerName="Administrator" nodeTypeAlias="Image" path="-1,1111,2222,2112">
|
||||
<data alias="umbracoFile"><![CDATA[/media/1234/blah.pdf]]></data>
|
||||
<data alias="umbracoWidth">115</data>
|
||||
<data alias="umbracoHeight">268</data>
|
||||
<data alias="umbracoBytes">10726</data>
|
||||
<data alias="umbracoExtension">jpg</data>
|
||||
<node id="3113" version="5b3e46ab-3e37-4cfa-ab70-014234b5bd33" parentID="2112" level="3" writerID="0" nodeType="1032" template="0" sortOrder="2" createDate="2010-05-19T17:32:46" updateDate="2010-05-19T17:32:46" nodeName="Another Umbraco Image" urlName="acnestressscrub" writerName="Administrator" nodeTypeAlias="Image" path="-1,1111,2222,2112,3113">
|
||||
<data alias="umbracoFile"><![CDATA[/media/1234/blah.pdf]]></data>
|
||||
<data alias="umbracoWidth">115</data>
|
||||
<data alias="umbracoHeight">268</data>
|
||||
<data alias="umbracoBytes">10726</data>
|
||||
<data alias="umbracoExtension">jpg</data>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node id="1113" version="5b3e46ab-3e37-4cfa-ab70-014234b5bd39" parentID="1111" level="2" writerID="0" nodeType="1032" template="0" sortOrder="1" createDate="2010-05-19T17:32:46" updateDate="2010-05-19T17:32:46" nodeName="Acne Stress Scrub" urlName="acnestressscrub" writerName="Administrator" nodeTypeAlias="File" path="-1,1111,1113">
|
||||
<data alias="umbracoFile"><![CDATA[/App_Data/VS2010CSharp.pdf]]></data>
|
||||
<data alias="umbracoWidth">115</data>
|
||||
<data alias="umbracoHeight">268</data>
|
||||
<data alias="umbracoBytes">10726</data>
|
||||
<data alias="umbracoExtension">jpg</data>
|
||||
</node>
|
||||
<node id="1114" version="5b3e46ab-3e37-4cfa-ab70-014234b5bd39" parentID="1111" level="2" writerID="0" nodeType="1032" template="0" sortOrder="1" createDate="2010-05-19T17:32:46" updateDate="2010-05-19T17:32:46" nodeName="String thoery" urlName="stringtheory" writerName="Administrator" nodeTypeAlias="File" path="-1,1111,1114">
|
||||
<data alias="umbracoFile"><![CDATA[/App_Data/StringTheory.pdf]]></data>
|
||||
<data alias="umbracoWidth">115</data>
|
||||
<data alias="umbracoHeight">268</data>
|
||||
<data alias="umbracoBytes">10726</data>
|
||||
<data alias="umbracoExtension">jpg</data>
|
||||
</node>
|
||||
<node id="1115" version="5b3e46ab-3e37-4cfa-ab70-014234b5bd39" parentID="1111" level="2" writerID="0" nodeType="1032" template="0" sortOrder="1" createDate="2010-05-19T17:32:46" updateDate="2010-05-19T17:32:46" nodeName="Umbraco Contour" urlName="umbracocontour" writerName="Administrator" nodeTypeAlias="File" path="-1,1111,1115">
|
||||
<data alias="umbracoFile"><![CDATA[/App_Data/UmbracoContour.pdf]]></data>
|
||||
<data alias="umbracoWidth">115</data>
|
||||
<data alias="umbracoHeight">268</data>
|
||||
<data alias="umbracoBytes">10726</data>
|
||||
<data alias="umbracoExtension">jpg</data>
|
||||
</node>
|
||||
<node id="1116" version="5b3e46ab-3e37-4cfa-ab70-014234b5bd39" parentID="1111" level="2" writerID="0" nodeType="1032" template="0" sortOrder="1" createDate="2010-05-19T17:32:46" updateDate="2010-05-19T17:32:46" nodeName="PDF Standards" urlName="pdfstandards" writerName="Administrator" nodeTypeAlias="File" path="-1,1111,1116">
|
||||
<data alias="umbracoFile"><![CDATA[/App_Data/PDFStandards.pdf]]></data>
|
||||
<data alias="umbracoWidth">115</data>
|
||||
<data alias="umbracoHeight">268</data>
|
||||
<data alias="umbracoBytes">10726</data>
|
||||
<data alias="umbracoExtension">jpg</data>
|
||||
</node>
|
||||
</node>
|
||||
</media>
|
||||
@@ -0,0 +1,656 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE root[
|
||||
<!ELEMENT CWS_Contact ANY>
|
||||
<!ATTLIST CWS_Contact id ID #REQUIRED>
|
||||
<!ELEMENT CWS_EmailAFriend ANY>
|
||||
<!ATTLIST CWS_EmailAFriend id ID #REQUIRED>
|
||||
<!ELEMENT CWS_EventItem ANY>
|
||||
<!ATTLIST CWS_EventItem id ID #REQUIRED>
|
||||
<!ELEMENT CWS_Galleries ANY>
|
||||
<!ATTLIST CWS_Galleries id ID #REQUIRED>
|
||||
<!ELEMENT CWS_Gallery ANY>
|
||||
<!ATTLIST CWS_Gallery id ID #REQUIRED>
|
||||
<!ELEMENT CWS_Home ANY>
|
||||
<!ATTLIST CWS_Home id ID #REQUIRED>
|
||||
<!ELEMENT CWS_NewsEventsList ANY>
|
||||
<!ATTLIST CWS_NewsEventsList id ID #REQUIRED>
|
||||
<!ELEMENT CWS_NewsItem ANY>
|
||||
<!ATTLIST CWS_NewsItem id ID #REQUIRED>
|
||||
<!ELEMENT CWS_Photo ANY>
|
||||
<!ATTLIST CWS_Photo id ID #REQUIRED>
|
||||
<!ELEMENT CWS_Textpage ANY>
|
||||
<!ATTLIST CWS_Textpage id ID #REQUIRED>
|
||||
<!ELEMENT CWS_TextpageTwoCol ANY>
|
||||
<!ATTLIST CWS_TextpageTwoCol id ID #REQUIRED>
|
||||
]>
|
||||
<root id="-1">
|
||||
<CWS_Home id="1139" parentID="-1" level="1" writerID="0" creatorID="0" nodeType="1125" template="1110" sortOrder="2" createDate="2009-02-26T18:39:39" updateDate="2010-05-03T20:34:27" nodeName="Home" urlName="home" writerName="Administrator" creatorName="Administrator" path="-1,1139" isDoc="">
|
||||
<CWS_Textpage id="1140" parentID="1139" level="2" writerID="0" creatorID="0" nodeType="1129" template="1117" sortOrder="1" createDate="2009-02-26T18:47:46" updateDate="2010-04-22T02:19:21" nodeName="About" urlName="about" writerName="Administrator" creatorName="Administrator" path="-1,1139,1140" isDoc="">
|
||||
<CWS_Textpage id="1141" parentID="1140" level="3" writerID="0" creatorID="0" nodeType="1129" template="1117" sortOrder="1" createDate="2009-02-26T18:51:52" updateDate="2010-04-22T02:18:30" nodeName="About Umbraco" urlName="about-umbraco" writerName="Administrator" creatorName="Administrator" path="-1,1139,1140,1141" isDoc="">
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
<headerText>
|
||||
<![CDATA[
|
||||
<p>It's the <strong>KING</strong> of all CMS's, what more do you
|
||||
need to know about it?</p>
|
||||
]]>
|
||||
</headerText>
|
||||
<articlePhoto>/media/171/umbraco_tshirt.jpg</articlePhoto>
|
||||
<bodyText>
|
||||
<![CDATA[
|
||||
<h3>Umbraco CMS is free</h3>
|
||||
|
||||
<p>It means that you are not bound and locked to the licensing
|
||||
rules about the number of content items / processors / web /
|
||||
domains, etc. Many products are very expensive as the license cost
|
||||
escalates with the number of websites. In many cases, one is soon
|
||||
up in the 500' before one can even start to implement the
|
||||
solution.</p>
|
||||
|
||||
<h3>Umbraco is Open Source</h3>
|
||||
|
||||
<p>In an Open Source product one has at any time full access to
|
||||
source code. This provides insight and leads to better quality, as
|
||||
"shortcuts" and bad code can easily be penetrated. Moreover, one
|
||||
has the ability to influence and further develop the product.</p>
|
||||
|
||||
<p>Umbraco is based on open source and is therefore not
|
||||
lisence-plated or subject to an enterprise's ownership. The Umbraco
|
||||
publishing tool places great emphasis on simplicity, standards,
|
||||
flexibility and integration. Umbraco was launched in 2005 and has
|
||||
had a tremendous growth since that time. Umbraco is today among the
|
||||
most popular systems based on open source for Microsoft. NET
|
||||
platform.</p>
|
||||
|
||||
<h3>100% Microsoft .NET</h3>
|
||||
|
||||
<p>Umbraco is built 100% on the Microsoft. NET 2.0. This means that
|
||||
you can use 3rd party .NET components directly in Umbraco.
|
||||
Moreover, integration with other .NET-based solutions is well
|
||||
adapted from Umbracos part. Umbraco won an award for the
|
||||
Integration possibilities on BNP Awards 2006.</p>
|
||||
|
||||
<h3>Fast results</h3>
|
||||
|
||||
<p>Umbraco is a powerful tool with a focus on core functionality
|
||||
and openness. This efficiently allows you to achieve exactly what
|
||||
you want - rather than be restricted to a "finished" module, which
|
||||
makes only half of what you really wanted.</p>
|
||||
|
||||
<h3>Easy-to-use</h3>
|
||||
|
||||
<p>Umbraco has a focus on content and facilitate rapid and
|
||||
intuitive content management. The system strives to be elegant,
|
||||
usable and effective.</p>
|
||||
|
||||
<h3>Based on standards</h3>
|
||||
|
||||
<p>Umbraco is based on standards from the W3C as XHTML, CSS, XML
|
||||
and XSLT. This gives a greater flexibility and independence, which
|
||||
in turn provides more value for the money.</p>
|
||||
|
||||
<h3>Integration</h3>
|
||||
|
||||
<p>Umbraco is known to be among the best CMS on integration. Much
|
||||
of the reason for this is the way to expose Microsoft ASP.NET
|
||||
components as elements of, or so-called "macro's" for use in
|
||||
templates, as well as in the WYSIWYG editor that writers and
|
||||
editors use. Elements is also possible to "cache" on several levels
|
||||
and is based on standard Microsoft .NET technology. Below are some
|
||||
examples:</p>
|
||||
|
||||
<ul>
|
||||
<li>External XML sources (ex RSS) can be directly implemented via
|
||||
XSLT elements (macros).</li>
|
||||
|
||||
<li>ASP.NET controls that retrieve data from external or internal
|
||||
posterior systems via standard Web Services.</li>
|
||||
</ul>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p> </p>
|
||||
]]>
|
||||
</bodyText>
|
||||
</CWS_Textpage>
|
||||
<CWS_TextpageTwoCol id="1142" parentID="1140" level="3" writerID="0" creatorID="0" nodeType="1130" template="1118" sortOrder="2" createDate="2009-02-26T18:56:06" updateDate="2010-04-22T02:18:30" nodeName="About this project" urlName="about-this-project" writerName="Administrator" creatorName="Administrator" path="-1,1139,1140,1142" isDoc="">
|
||||
<articlePhotoColOne>/media/227/warren-buckley.jpg</articlePhotoColOne>
|
||||
<articlePhotoColTwo>/media/228/sam-grady.jpg</articlePhotoColTwo>
|
||||
<bodyTextColTwo>
|
||||
<![CDATA[
|
||||
<h3>Sam Grady</h3>
|
||||
|
||||
<p>Sam Grady, me, is a graphic designer. I loves graphic design.
|
||||
Great graphic design and simple solutions makes this man very
|
||||
happy. Photography is also very close to my heart and I'd like to
|
||||
be better, so I practice a lot and annoy people with my
|
||||
requests.<br />
|
||||
<br />
|
||||
I haven't got a blog, yet, don't Twitter and cancelled my Facebook
|
||||
account as I felt uncomfortable with people knowing my business.
|
||||
Anyone else feel that way? I do, however, have a Flickr account, so
|
||||
go check it out: <a
|
||||
href="http://www.flickr.com/photos/mrgrady">www.flickr.com/photos/mrgrady</a><br />
|
||||
<br />
|
||||
I also have my own business, G72, which has a website that
|
||||
desperately needs updating. Also, as of today (03/03/09), it's
|
||||
currently down due to inept web hosts. Hopefully it won't be if you
|
||||
want to take a look: <a
|
||||
href="http://www.g-72.co.uk">www.g-72.co.uk</a><br />
|
||||
<br />
|
||||
Regarding this project, Warren asked me if I wanted to design his
|
||||
website starter package for the fantastic Umbraco CMS, which I
|
||||
jumped at the chance to do. Hopefully you'll find the design
|
||||
appropriate and the package very useful, as that's what we really
|
||||
want from this project.<br />
|
||||
<br />
|
||||
Finally, Warren says the layout is work in progress and I have a,
|
||||
typically fussy, list of designer layout requests that I've asked
|
||||
Warren to do, but time being what it is, these changes won't be
|
||||
made on version 2.0, so if you spot anything, do mail the man as
|
||||
we'll be compiling a list of tweaks to be made.<br />
|
||||
<br />
|
||||
Enjoy.</p>
|
||||
]]>
|
||||
</bodyTextColTwo>
|
||||
<bodyTextColOne>
|
||||
<![CDATA[
|
||||
<h3>Warren Buckley</h3>
|
||||
|
||||
<p>Warren Buckley is a web developer who specialises in using the
|
||||
Umbraco CMS platform to build content managed websites for Xeed in
|
||||
Norway. I run a blog called <a
|
||||
href="http://www.creativewebspecialist.co.uk">Creative Web
|
||||
Specialist</a>, where I mainly write tips and tutorial articles
|
||||
around Umbraco.</p>
|
||||
|
||||
<p>I have teamed up with ex-collegue Sam Grady to help me design
|
||||
the new version of CWS as he produces wonderfully sexy designs for
|
||||
the web. If you have seen my previous version/s of CWS you will
|
||||
know that my design skills are far from stunning.</p>
|
||||
|
||||
<p>I decided to create this website starter site nicknamed CWS
|
||||
(Creative Website Starter site) as a learning tool to help you
|
||||
understand how all the elements of a site work together in
|
||||
Umbraco.</p>
|
||||
|
||||
<p>From this <strong>NEW</strong> CWS package comes the
|
||||
following:</p>
|
||||
|
||||
<ul>
|
||||
<li>Obviously a <strong>BRAND NEW</strong> spanking design from
|
||||
ex-collegue Sam Grady of G-72</li>
|
||||
|
||||
<li>A focus for this site to be used to help teach new users to the
|
||||
Umbraco CMS platform.</li>
|
||||
|
||||
<li>.NET usercontrols written in C#</li>
|
||||
|
||||
<li>XSLT & .NET code heavily commented to help understand what
|
||||
is going on.</li>
|
||||
|
||||
<li>With supporting documentation coming in the near future.</li>
|
||||
</ul>
|
||||
|
||||
<p>Want to see where else you can find me on the net?<br />
|
||||
Blog - <a
|
||||
href="http://www.creativewebspecialist.co.uk">www.creativewebspecialist.co.uk</a><br />
|
||||
Flickr - <a
|
||||
href="http://www.flickr.com/photos/warrenbuckley">www.flickr.com/photos/warrenbuckley</a><br />
|
||||
Last.FM - <a
|
||||
href="http://www.last.fm/user/warrenbuckley">www.last.fm/user/warrenbuckley</a><br />
|
||||
Twitter - <a
|
||||
href="http://twitter.com/warrenbuckley">twitter.com/warrenbuckley</a></p>
|
||||
]]>
|
||||
</bodyTextColOne>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<xmlStorageTest>
|
||||
<XmlStorage>
|
||||
<Nodes>
|
||||
<Node>1</Node>
|
||||
<Node>2</Node>
|
||||
<Node>3</Node>
|
||||
<Node>4</Node>
|
||||
<Node>5</Node>
|
||||
</Nodes>
|
||||
</XmlStorage>
|
||||
</xmlStorageTest>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
<headerText>
|
||||
<![CDATA[
|
||||
<p>This website has been produced to help you understand
|
||||
Umbraco.</p>
|
||||
]]>
|
||||
</headerText>
|
||||
</CWS_TextpageTwoCol>
|
||||
<umbracoUrlName />
|
||||
<umbracoUrlAlias />
|
||||
<metaDescription><![CDATA[This is the META description for the about page.]]></metaDescription>
|
||||
<metaKeywords><![CDATA[about, creative web specialist, umbraco, warren buckley, sam grady]]></metaKeywords>
|
||||
<umbracoRedirect />
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
<headerText><![CDATA[<p>This is a good place to put a service message or something to help define your site or company.</p>]]></headerText>
|
||||
<articlePhoto />
|
||||
<bodyText>
|
||||
<![CDATA[<p><strong>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ullamcorper condimentum lorem. Curabitur placerat nunc ut leo. Integer eros ligula, vestibulum at, eleifend id, dignissim vel, est.</strong></p>
|
||||
<p>Fusce tristique. Cras faucibus porta nunc. Aliquam ultrices, arcu quis ornare sagittis, lectus augue ornare nulla, eu lobortis velit lectus id nibh. Aliquam condimentum aliquet purus. Quisque blandit ante non sapien. Sed justo libero, sollicitudin ac, pretium et, luctus nec, nisl. Nulla semper neque nec magna. Cras ut nibh ut urna bibendum sodales. Quisque venenatis euismod lacus. Pellentesque dapibus turpis at urna.</p>
|
||||
<h3>Sub Header</h3>
|
||||
<p>Sed scelerisque adipiscing mauris. Mauris egestas dapibus quam. Integer in libero eget eros dignissim pretium. Proin luctus sem nec lorem. Praesent lorem. Vivamus eget nunc quis sapien condimentum egestas. Maecenas facilisis, nunc at sodales facilisis, quam magna pretium nibh, vel ultrices lectus lorem quis neque. Nam sit amet leo ac lectus gravida convallis. Phasellus at enim vel dui porta porttitor. Morbi id dolor adipiscing erat egestas consequat.</p>
|
||||
<p><a href="http://www.google.co.uk">Phasellus diam. Morbi dolor.</a> Donec consequat sodales nunc. Nam dapibus lectus id lectus. Sed ultrices metus sit amet est. Morbi porttitor. Proin vel risus. Phasellus sodales convallis justo. <em>Sed luctus hendrerit risus. Sed est lorem, feugiat et, rutrum quis, condimentum non, nunc.</em> Aenean urna leo, sagittis a, commodo eget, lobortis nec, eros. Vivamus pharetra, lectus eu ultrices pulvinar, nunc quam consectetur nibh, sed pulvinar leo dolor ut felis.</p>
|
||||
<ol>
|
||||
<li>Item one</li>
|
||||
<li>Item two</li>
|
||||
<li>Item three</li>
|
||||
</ol>
|
||||
<p>Nullam lobortis, mi nec feugiat congue, dolor diam cursus lacus, a elementum ligula dolor vitae sem. Suspendisse at quam. Praesent neque. Vestibulum at justo. Nulla rutrum velit et eros.</p>
|
||||
<ul>
|
||||
<li>Integer convallis augue in tellus</li>
|
||||
<li>Magna quam sollicitudin mauris</li>
|
||||
</ul>
|
||||
<p>Nullam lobortis, mi nec feugiat congue, dolor diam cursus lacus, a elementum ligula dolor vitae sem. Suspendisse at quam.</p>]]>
|
||||
</bodyText>
|
||||
</CWS_Textpage>
|
||||
<CWS_Galleries id="1143" parentID="1139" level="2" writerID="0" creatorID="0" nodeType="1123" template="1108" sortOrder="2" createDate="2009-02-27T09:39:54" updateDate="2010-04-22T02:34:59" nodeName="Gallery" urlName="gallery" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143" isDoc="">
|
||||
<CWS_Gallery id="1144" parentID="1143" level="3" writerID="0" creatorID="0" nodeType="1124" template="1109" sortOrder="1" createDate="2009-03-02T17:58:22" updateDate="2010-04-22T02:18:30" nodeName="The Bookhouse Boys" urlName="the-bookhouse-boys" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1144" isDoc="">
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[I am the description]]></metaDescription>
|
||||
<metaKeywords><![CDATA[keywords, here]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
<headerText>
|
||||
<![CDATA[
|
||||
<p>The Bookhouse Boys. Live at the ICA, London.</p>
|
||||
]]>
|
||||
</headerText>
|
||||
<sortBy><![CDATA[sortOrder]]></sortBy>
|
||||
<sortOrder><![CDATA[ascending]]></sortOrder>
|
||||
<galleryThumbnail>/media/1239/bookhouse-boys_gallery.jpg</galleryThumbnail>
|
||||
<CWS_Photo id="1145" parentID="1144" level="4" writerID="0" creatorID="0" nodeType="1128" template="1114" sortOrder="1" createDate="2009-03-03T18:08:55" updateDate="2010-04-22T02:18:30" nodeName="Catherine Turner and Paul Van Oestren" urlName="catherine-turner-and-paul-van-oestren" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1144,1145" isDoc="">
|
||||
<photoText>Credit: Sam Grady</photoText>
|
||||
<photo>/media/1277/bookhouse-boys_3.jpg</photo>
|
||||
<photoThumbnail>/media/1314/bookhouse-boys_3_thumb.jpg</photoThumbnail>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
</CWS_Photo>
|
||||
<CWS_Photo id="1146" parentID="1144" level="4" writerID="0" creatorID="0" nodeType="1128" template="1114" sortOrder="2" createDate="2009-03-03T18:08:19" updateDate="2010-04-22T02:18:30" nodeName="J.P.Fellows" urlName="jpfellows" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1144,1146" isDoc="">
|
||||
<photoText>Credit: Sam Grady</photoText>
|
||||
<photo>/media/1250/bookhouse-boys_1.jpg</photo>
|
||||
<photoThumbnail>/media/1296/bookhouse-boys_1_thumb.jpg</photoThumbnail>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
</CWS_Photo>
|
||||
<CWS_Photo id="1147" parentID="1144" level="4" writerID="0" creatorID="0" nodeType="1128" template="1114" sortOrder="3" createDate="2009-03-03T18:08:48" updateDate="2010-04-22T02:18:30" nodeName="Catherine Turner" urlName="catherine-turner" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1144,1147" isDoc="">
|
||||
<photoText>Credit: Sam Grady</photoText>
|
||||
<photo>/media/1331/bookhouse-boys_2.jpg</photo>
|
||||
<photoThumbnail>/media/1350/bookhouse-boys_2_thumb.jpg</photoThumbnail>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
</CWS_Photo>
|
||||
</CWS_Gallery>
|
||||
<CWS_Gallery id="1148" parentID="1143" level="3" writerID="0" creatorID="0" nodeType="1124" template="1109" sortOrder="2" createDate="2009-02-27T09:48:12" updateDate="2010-04-22T02:18:30" nodeName="Codegarden 08" urlName="codegarden-08" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1148" isDoc="">
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
<headerText>
|
||||
<![CDATA[
|
||||
<p>Where all the great minds of umbraco meet!</p>
|
||||
]]>
|
||||
</headerText>
|
||||
<sortBy><![CDATA[sortOrder]]></sortBy>
|
||||
<sortOrder><![CDATA[ascending]]></sortOrder>
|
||||
<galleryThumbnail>/media/993/codegarden-08_gallery.jpg</galleryThumbnail>
|
||||
<CWS_Photo id="1149" parentID="1148" level="4" writerID="0" creatorID="0" nodeType="1128" template="1114" sortOrder="1" createDate="2009-03-02T15:40:01" updateDate="2010-04-22T02:18:30" nodeName="Darren and David have a chat" urlName="darren-and-david-have-a-chat" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1148,1149" isDoc="">
|
||||
<photoText>Credit: Douglas Robar</photoText>
|
||||
<photo>/media/825/darren-ferguson_david-conlisk.jpg</photo>
|
||||
<photoThumbnail>/media/835/darren-ferguson_david-conlisk_thumb.jpg</photoThumbnail>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
</CWS_Photo>
|
||||
<CWS_Photo id="1150" parentID="1148" level="4" writerID="0" creatorID="0" nodeType="1128" template="1114" sortOrder="2" createDate="2009-02-27T09:54:07" updateDate="2010-04-22T02:18:31" nodeName="Codegarden 08 T-Shirt" urlName="codegarden-08-t-shirt" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1148,1150" isDoc="">
|
||||
<photoText>Credit: Warren Buckley</photoText>
|
||||
<photo>/media/394/codegarden08-t-shirt.jpg</photo>
|
||||
<photoThumbnail>/media/799/codegarden08-t-shirt_thumb.jpg</photoThumbnail>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
</CWS_Photo>
|
||||
<CWS_Photo id="1151" parentID="1148" level="4" writerID="0" creatorID="0" nodeType="1128" template="1114" sortOrder="3" createDate="2009-03-02T15:43:43" updateDate="2010-04-22T02:18:31" nodeName="The Umbraco BINGO callers" urlName="the-umbraco-bingo-callers" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1148,1151" isDoc="">
|
||||
<photoText>Credit: Douglas Robar</photoText>
|
||||
<photo>/media/852/bingo-callers.jpg</photo>
|
||||
<photoThumbnail>/media/871/bingo-callers_thumb.jpg</photoThumbnail>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
</CWS_Photo>
|
||||
<CWS_Photo id="1152" parentID="1148" level="4" writerID="0" creatorID="0" nodeType="1128" template="1114" sortOrder="4" createDate="2009-03-02T15:59:24" updateDate="2010-04-22T02:18:31" nodeName="Christian Palm chatting" urlName="christian-palm-chatting" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1148,1152" isDoc="">
|
||||
<photoText>Credit: Douglas Robar</photoText>
|
||||
<photo>/media/879/christian-palm.jpg</photo>
|
||||
<photoThumbnail>/media/889/christian-palm_thumb.jpg</photoThumbnail>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
</CWS_Photo>
|
||||
</CWS_Gallery>
|
||||
<CWS_Gallery id="1153" parentID="1143" level="3" writerID="0" creatorID="0" nodeType="1124" template="1109" sortOrder="3" createDate="2009-03-02T16:02:14" updateDate="2010-04-22T02:18:31" nodeName="Bath, UK" urlName="bath,-uk" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1153" isDoc="">
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
<headerText>
|
||||
<![CDATA[
|
||||
<p>Photos from a trip to Bath in November 2008</p>
|
||||
]]>
|
||||
</headerText>
|
||||
<sortBy><![CDATA[updateDate]]></sortBy>
|
||||
<sortOrder><![CDATA[ascending]]></sortOrder>
|
||||
<galleryThumbnail>/media/935/bath_gallery.jpg</galleryThumbnail>
|
||||
<CWS_Photo id="1154" parentID="1153" level="4" writerID="0" creatorID="0" nodeType="1128" template="1114" sortOrder="1" createDate="2009-03-02T16:27:17" updateDate="2010-04-22T02:18:31" nodeName="Royal Crescent" urlName="royal-crescent" writerName="Administrator" creatorName="Administrator" path="-1,1139,1143,1153,1154" isDoc="">
|
||||
<photoText>Credit: Warren Buckley</photoText>
|
||||
<photo>/media/995/royal-crescent.jpg</photo>
|
||||
<photoThumbnail>/media/1014/royal-crescent_thumb.jpg</photoThumbnail>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
</CWS_Photo>
|
||||
</CWS_Gallery>
|
||||
<umbracoUrlName />
|
||||
<umbracoUrlAlias />
|
||||
<metaDescription><![CDATA[dfg]]></metaDescription>
|
||||
<metaKeywords><![CDATA[dsfg]]></metaKeywords>
|
||||
<umbracoRedirect />
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
<headerText><![CDATA[<p>This first page displays all the albums featured within your site.<br /> Please have a browse through.</p>]]></headerText>
|
||||
<sortBy><![CDATA[sortOrder]]></sortBy>
|
||||
<sortOrder><![CDATA[ascending]]></sortOrder>
|
||||
</CWS_Galleries>
|
||||
<CWS_NewsEventsList id="1155" parentID="1139" level="2" writerID="0" creatorID="0" nodeType="1126" template="1112" sortOrder="3" createDate="2009-02-27T09:57:30" updateDate="2010-04-22T02:18:31" nodeName="News and Events" urlName="news-and-events" writerName="Administrator" creatorName="Administrator" path="-1,1139,1155" isDoc="">
|
||||
<CWS_EventItem id="1156" parentID="1155" level="3" writerID="0" creatorID="0" nodeType="1122" template="1107" sortOrder="1" createDate="2009-02-27T10:00:53" updateDate="2010-04-22T02:18:31" nodeName="Codegarden 09" urlName="codegarden-09" writerName="Administrator" creatorName="Administrator" path="-1,1139,1155,1156" isDoc="">
|
||||
<eventDate>2009-06-22T00:00:00</eventDate>
|
||||
<bodyText>
|
||||
<![CDATA[
|
||||
<h3>Come join the annual umbraco developer conference in Wonderful
|
||||
Copenhagen on June 22nd - 23rd. Two days for insights, eye-openers,
|
||||
great conversations and friendly people.</h3>
|
||||
|
||||
<p>The who's who of umbraco will be gathered and share their
|
||||
knowledge through talks, tutorials and via un-conference formats
|
||||
like open space or hacking sessions. We have booked a cool, old and
|
||||
huge industrial venue in central Copenhagen where we'll have one
|
||||
huge room, three rooms for breakout sessions and a Café that
|
||||
serves your taste of espresso.</p>
|
||||
|
||||
<p>Come join the annual umbraco developer conference in Wonderful
|
||||
Copenhagen on June 22nd - 23rd. Two days for insights, eye-openers,
|
||||
great conversations and friendly people.</p>
|
||||
|
||||
<p>We've planned a program that fits both experienced umbraco users
|
||||
as well as new comers. The conference is kicked off with a Keynote
|
||||
and after that we'll have two or three tracks of sessions and the
|
||||
first day is rounded with an open Q/A session with the umbraco core
|
||||
team.</p>
|
||||
|
||||
<p>The second day features an un-conference format called open
|
||||
space, which we also used with great success at last year's
|
||||
conference. It's a format where everybody can suggest a topic and
|
||||
as we have plenty of break-out rooms rest assured that there'll be
|
||||
room for your topic as well. Last year's more than 20 topics
|
||||
covered Silverlight, High performance websites with umbraco,
|
||||
building custom data types and much more.</p>
|
||||
|
||||
<p>But it doesn't ends there. We've ensured that we can stay at the
|
||||
venue until midnight both days which means that when the first day
|
||||
ends, the fun begins. With more than hundred people gathered at a
|
||||
place with loads of umbraco knowledge, wifi, great food and plenty
|
||||
of space, who knows what could happen. A BBQ, new packages,
|
||||
improvised demos and talks, or...?</p>
|
||||
|
||||
<p> </p>
|
||||
]]>
|
||||
</bodyText>
|
||||
<articlePhoto>/media/445/umbraco_tshirt.jpg</articlePhoto>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
</CWS_EventItem>
|
||||
<CWS_NewsItem id="1157" parentID="1155" level="3" writerID="0" creatorID="0" nodeType="1127" template="1113" sortOrder="2" createDate="2009-03-02T16:32:06" updateDate="2010-04-22T02:18:31" nodeName="CWS2 is released" urlName="cws2-is-released" writerName="Administrator" creatorName="Administrator" path="-1,1139,1155,1157" isDoc="">
|
||||
<bodyText>
|
||||
<![CDATA[
|
||||
<h3>After Warren Buckley's success of the first Creative Website
|
||||
Starter site package, with over 20K downloads he has decided to
|
||||
work on CWS2.</h3>
|
||||
|
||||
<p>As of today Wednesday the 4th March 2009, the CWS2 package is
|
||||
now available to download from the built in package repository
|
||||
inside Umbraco.</p>
|
||||
|
||||
<p>With this new version comes the following:</p>
|
||||
|
||||
<ul>
|
||||
<li>A <strong>BRAND NEW</strong> spanking design from ex-collegue
|
||||
<a href="http://www.g-72.co.uk"
|
||||
title="Designer Sam Grady of G72">Sam Grady of G-72</a></li>
|
||||
|
||||
<li>A focus for this site to be used to help teach new users to the
|
||||
Umbraco CMS platform.</li>
|
||||
|
||||
<li>.NET usercontrols written in C#</li>
|
||||
|
||||
<li>XSLT & .NET code heavily commented to help understand what
|
||||
is going on.</li>
|
||||
|
||||
<li>With supporting documentation coming in the near future.</li>
|
||||
</ul>
|
||||
]]>
|
||||
</bodyText>
|
||||
<articlePhoto>
|
||||
</articlePhoto>
|
||||
<umbracoUrlName>
|
||||
</umbracoUrlName>
|
||||
<umbracoUrlAlias>
|
||||
</umbracoUrlAlias>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect>
|
||||
</umbracoRedirect>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
</CWS_NewsItem>
|
||||
<umbracoUrlName />
|
||||
<umbracoUrlAlias />
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect />
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
<sortBy><![CDATA[sortOrder]]></sortBy>
|
||||
<sortOrder><![CDATA[ascending]]></sortOrder>
|
||||
<headerText>
|
||||
<![CDATA[
|
||||
<p>Please browse through our news archive and event listings
|
||||
below.</p>
|
||||
]]>
|
||||
</headerText>
|
||||
</CWS_NewsEventsList>
|
||||
<CWS_Contact id="1158" parentID="1139" level="2" writerID="0" creatorID="0" nodeType="1120" template="1105" sortOrder="4" createDate="2009-02-27T10:03:12" updateDate="2010-04-22T02:18:31" nodeName="Contact" urlName="contact" writerName="Administrator" creatorName="Administrator" path="-1,1139,1158" isDoc="">
|
||||
<emailTo>you@yourcompany.co.uk</emailTo>
|
||||
<emailSubject>Email from Contact form on website</emailSubject>
|
||||
<emailBody>
|
||||
<![CDATA[Hello a user of your site has filled in your contact form on [Date] @ [Time]
|
||||
|
||||
Name: [Name]
|
||||
Address: [AddressLine1], [AddressLine2]
|
||||
Email: [Email]
|
||||
Message: [Message]]]>
|
||||
</emailBody>
|
||||
<emailReplyFrom>you@yourcompany.co.uk</emailReplyFrom>
|
||||
<emailReplySubject>Thank you for your message</emailReplySubject>
|
||||
<emailReplyBody>
|
||||
<![CDATA[Hello [Name]
|
||||
Thanks for contacting us, we will reply shortly.
|
||||
|
||||
Your Company Name
|
||||
www.yourcompany.co.uk]]>
|
||||
</emailReplyBody>
|
||||
<enableSSL>0</enableSSL>
|
||||
<umbracoUrlName />
|
||||
<umbracoUrlAlias />
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect />
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
<headerText>
|
||||
<![CDATA[
|
||||
<p>Everything you need to<br />
|
||||
get in touch.</p>
|
||||
]]>
|
||||
</headerText>
|
||||
<formText>
|
||||
<![CDATA[
|
||||
<h3>Enquiry Form</h3>
|
||||
|
||||
<p>If you have a particular enquiry, please fill out the form below
|
||||
and provide as much information as you can, so that one of our
|
||||
representatives can deal with your enquiry as effciently as
|
||||
possible.</p>
|
||||
]]>
|
||||
</formText>
|
||||
<thankYouHeaderText>
|
||||
<![CDATA[
|
||||
<p><strong>Thank you.</strong> We will be in touch shortly.</p>
|
||||
]]>
|
||||
</thankYouHeaderText>
|
||||
<thankYouMessageText>
|
||||
<![CDATA[
|
||||
<p>Thanks for filling out our contact form we will get back to you
|
||||
shortly.</p>
|
||||
|
||||
<p>Regards,<br />
|
||||
My Company</p>
|
||||
]]>
|
||||
</thankYouMessageText>
|
||||
</CWS_Contact>
|
||||
<CWS_EmailAFriend id="1159" parentID="1139" level="2" writerID="0" creatorID="0" nodeType="1121" template="1106" sortOrder="5" createDate="2009-02-27T10:05:57" updateDate="2010-04-22T02:18:31" nodeName="Email a Friend" urlName="email-a-friend" writerName="Administrator" creatorName="Administrator" path="-1,1139,1159" isDoc="">
|
||||
<emailFrom>you@yourcompany.co.uk</emailFrom>
|
||||
<emailSubjectToFriend>[YourName] has sent you a link to read</emailSubjectToFriend>
|
||||
<emailMessageToFriend>
|
||||
<![CDATA[Hello [FriendName], [YourName] has sent you this link to read.
|
||||
|
||||
URL: [URL]
|
||||
Message: [Message]
|
||||
|
||||
--------------------------------------------------------
|
||||
Your Company Name
|
||||
www.yourcompany.co.uk]]>
|
||||
</emailMessageToFriend>
|
||||
<enableSSL>0</enableSSL>
|
||||
<umbracoUrlName />
|
||||
<umbracoUrlAlias />
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoRedirect />
|
||||
<umbracoNaviHide>1</umbracoNaviHide>
|
||||
<headerText><![CDATA[<p>Send a page onto your friend.</p>]]></headerText>
|
||||
<thankYouHeaderText><![CDATA[<p><strong>Thank you.</strong> We appreciate the love you are giving our site.</p>]]></thankYouHeaderText>
|
||||
<thankYouMessageText><![CDATA[<p>Thanks for sending that link onto your friend, we really appreciate it here at My Company.</p>]]></thankYouMessageText>
|
||||
</CWS_EmailAFriend>
|
||||
<metaDescription><![CDATA[]]></metaDescription>
|
||||
<metaKeywords><![CDATA[]]></metaKeywords>
|
||||
<umbracoNaviHide>0</umbracoNaviHide>
|
||||
<siteName>Your logo/name</siteName>
|
||||
<headerText><![CDATA[<p><strong>Sam Grady designed this for Warren Buckley.</strong> "This" idea was first created by the incredible Robert Brownjohn and has been copied many times since.</p>]]></headerText>
|
||||
<homepagePhoto><![CDATA[]]></homepagePhoto>
|
||||
<bodyText>
|
||||
<![CDATA[<p>Thank you for installing the umbraco website package created and developed by Warren Buckley. This should website package be used to help you understand how all the components of an Umbraco site works.</p>
|
||||
<p><img src="/media/1670/clientdependencylogo.png" width="89" height="89" alt="test1"/></p>]]>
|
||||
</bodyText>
|
||||
<MediaPickerTest />
|
||||
<umbracoUrlName />
|
||||
<umbracoUrlAlias />
|
||||
<umbracoRedirect>0</umbracoRedirect>
|
||||
</CWS_Home>
|
||||
</root>
|
||||
@@ -51,7 +51,7 @@ namespace Umbraco.Tests.TestHelpers
|
||||
{
|
||||
get
|
||||
{
|
||||
var codeBase = Assembly.GetCallingAssembly().CodeBase;
|
||||
var codeBase = typeof(TestHelper).Assembly.CodeBase;
|
||||
var uri = new Uri(codeBase);
|
||||
var path = uri.LocalPath;
|
||||
return Path.GetDirectoryName(path);
|
||||
|
||||
@@ -35,6 +35,10 @@
|
||||
<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\log4net.2.0.0\lib\net40-full\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\Umbraco.Web.UI\bin\Lucene.Net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="nunit.framework">
|
||||
<HintPath>..\packages\NUnit.2.6.0.12054\lib\nunit.framework.dll</HintPath>
|
||||
</Reference>
|
||||
@@ -51,27 +55,34 @@
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="UmbracoExamine, Version=0.1.42.2941, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\Umbraco.Web.UI\bin\UmbracoExamine.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="BusinessLogic\DictionaryTest.cs" />
|
||||
<Compile Include="ContentStores\PublishMediaStoreTests.cs" />
|
||||
<Compile Include="DynamicDocument\DynamicXmlTests.cs" />
|
||||
<Compile Include="DynamicDocument\PublishedContentDataTableTests.cs" />
|
||||
<Compile Include="DynamicDocument\PublishedContentTests.cs" />
|
||||
<Compile Include="DynamicDocument\StronglyTypedQueryTests.cs" />
|
||||
<Compile Include="PublishedContent\DynamicXmlTests.cs" />
|
||||
<Compile Include="PublishedContent\PublishedContentDataTableTests.cs" />
|
||||
<Compile Include="PublishedContent\PublishedContentTests.cs" />
|
||||
<Compile Include="PublishedContent\PublishedMediaTests.cs" />
|
||||
<Compile Include="PublishedContent\StronglyTypedQueryTests.cs" />
|
||||
<Compile Include="HashCodeCombinerTests.cs" />
|
||||
<Compile Include="HtmlHelperExtensionMethodsTests.cs" />
|
||||
<Compile Include="IO\IOHelperTest.cs" />
|
||||
<Compile Include="LibraryTests.cs" />
|
||||
<Compile Include="PropertyEditors\PropertyEditorValueConverterTests.cs" />
|
||||
<Compile Include="Resolvers\ActionsResolverTests.cs" />
|
||||
<Compile Include="AsynchronousRollingFileAppenderTests.cs" />
|
||||
<Compile Include="BusinessLogic\ApplicationTest.cs" />
|
||||
<Compile Include="BusinessLogic\ApplicationTreeTest.cs" />
|
||||
<Compile Include="BusinessLogic\BaseTest.cs" />
|
||||
<Compile Include="CacheRefresherFactoryTests.cs" />
|
||||
<Compile Include="DynamicDocument\DynamicPublishedContentCustomExtensionMethods.cs" />
|
||||
<Compile Include="DynamicDocument\DynamicPublishedContentTests.cs" />
|
||||
<Compile Include="DynamicDocument\DynamicDocumentTestsBase.cs" />
|
||||
<Compile Include="DynamicDocument\DynamicNodeTests.cs" />
|
||||
<Compile Include="PublishedContent\DynamicPublishedContentCustomExtensionMethods.cs" />
|
||||
<Compile Include="PublishedContent\DynamicPublishedContentTests.cs" />
|
||||
<Compile Include="PublishedContent\DynamicDocumentTestsBase.cs" />
|
||||
<Compile Include="PublishedContent\DynamicNodeTests.cs" />
|
||||
<Compile Include="ObjectExtensionsTests.cs" />
|
||||
<Compile Include="ContentStores\PublishContentStoreTests.cs" />
|
||||
<Compile Include="DataTypeFactoryTests.cs" />
|
||||
@@ -93,6 +104,12 @@
|
||||
<Compile Include="Routing\RouteTestExtensions.cs" />
|
||||
<Compile Include="Stubs\TestControllerFactory.cs" />
|
||||
<Compile Include="TestHelpers\BaseWebTest.cs" />
|
||||
<Compile Include="TestHelpers\ExamineHelpers\ExamineResources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>ExamineResources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="TestHelpers\ExamineHelpers\IndexInitializer.cs" />
|
||||
<Compile Include="UriUtilityTests.cs" />
|
||||
<Compile Include="Resolvers\MacroFieldEditorsResolverTests.cs" />
|
||||
<Compile Include="MacroEngineFactoryTests.cs" />
|
||||
@@ -124,6 +141,7 @@
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="TestHelpers\ExamineHelpers\umbraco.config" />
|
||||
<None Include="unit-test-log4net.config">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
@@ -174,9 +192,15 @@
|
||||
<Name>Umbraco.Web</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="TestHelpers\ExamineHelpers\ExamineResources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>ExamineResources.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Masterpages\dummy.txt" />
|
||||
<Content Include="TestHelpers\ExamineHelpers\media.xml" />
|
||||
<Content Include="Views\dummy.txt" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Configuration;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.Web;
|
||||
|
||||
namespace Umbraco.Tests
|
||||
@@ -10,6 +11,13 @@ namespace Umbraco.Tests
|
||||
[TestFixture]
|
||||
public class UriUtilityTests
|
||||
{
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
UmbracoSettings.ResetSetters();
|
||||
}
|
||||
|
||||
// test normal urls
|
||||
[TestCase("http://LocalHost/", "http://localhost/")]
|
||||
[TestCase("http://LocalHost/?x=y", "http://localhost/?x=y")]
|
||||
|
||||
@@ -93,9 +93,9 @@
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="ClientDependency.Core, Version=1.5.0.0, Culture=neutral, PublicKeyToken=7a99a55a05d191a8, processorArchitecture=MSIL">
|
||||
<Reference Include="ClientDependency.Core, Version=1.5.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\ClientDependency.Core.dll</HintPath>
|
||||
<HintPath>..\packages\ClientDependency.1.5.1.0\lib\ClientDependency.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="CookComputing.XmlRpcV2, Version=2.5.0.0, Culture=neutral, PublicKeyToken=a7d6e17aa302004d, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
@@ -147,10 +147,12 @@
|
||||
<Reference Include="System.Data.SqlServerCe, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\SQLCE4\System.Data.SqlServerCe.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Data.SqlServerCe.Entity, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\SQLCE4\System.Data.SqlServerCe.Entity.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Design" />
|
||||
<Reference Include="System.Drawing">
|
||||
@@ -286,6 +288,7 @@
|
||||
</Compile>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Umbraco\developer\Macros\EditMacro.aspx.cs">
|
||||
<DependentUpon>editMacro.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Umbraco\developer\Macros\EditMacro.aspx.designer.cs">
|
||||
@@ -412,6 +415,7 @@
|
||||
<DependentUpon>UI.xml</DependentUpon>
|
||||
</None>
|
||||
<Content Include="Global.asax" />
|
||||
<Content Include="Umbraco\config\lang\en_us.xml" />
|
||||
<Content Include="Umbraco\config\lang\he.xml" />
|
||||
<Content Include="Umbraco\config\lang\ja.xml" />
|
||||
<Content Include="Umbraco\config\lang\pl.xml" />
|
||||
@@ -982,6 +986,10 @@
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracocss\js\dialog.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracocss\langs\en.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracocss\langs\en_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracocss\langs\en_us.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracocss\langs\en_us_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracocss\langs\it.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracocss\langs\it_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracocss\langs\ru.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracocss\langs\ru_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracocss\langs\zh.js" />
|
||||
@@ -992,8 +1000,14 @@
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\img\ajax-loader.gif" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\img\embed.gif" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\js\dialog.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\de.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\de_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\en.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\en_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\en_us.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\en_us_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\it.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\it_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\ru.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\ru_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoembed\langs\zh.js" />
|
||||
@@ -1001,6 +1015,7 @@
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoimg\editor_plugin_src.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoimg\js\image.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoimg\langs\en_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoimg\langs\en_us_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoimg\langs\he_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoimg\langs\ja_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracoimg\langs\ru_dlg.js" />
|
||||
@@ -1008,6 +1023,7 @@
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracolink\editor_plugin_src.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracolink\js\umbracolink.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracolink\langs\en_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracolink\langs\en_us_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracolink\langs\he_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracolink\langs\ja_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracolink\langs\ru_dlg.js" />
|
||||
@@ -1018,6 +1034,8 @@
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracomacro\js\dialog.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracomacro\langs\en.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracomacro\langs\en_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracomacro\langs\en_us.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracomacro\langs\en_us_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracomacro\langs\he.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracomacro\langs\he_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\plugins\umbracomacro\langs\ja.js" />
|
||||
@@ -1185,6 +1203,8 @@
|
||||
<Content Include="umbraco_client\tinymce3\themes\umbraco\langs\de_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\themes\umbraco\langs\en.js" />
|
||||
<Content Include="umbraco_client\tinymce3\themes\umbraco\langs\en_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\themes\umbraco\langs\en_us.js" />
|
||||
<Content Include="umbraco_client\tinymce3\themes\umbraco\langs\en_us_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\themes\umbraco\langs\es.js" />
|
||||
<Content Include="umbraco_client\tinymce3\themes\umbraco\langs\es_dlg.js" />
|
||||
<Content Include="umbraco_client\tinymce3\themes\umbraco\langs\fr.js" />
|
||||
@@ -1440,6 +1460,7 @@
|
||||
<Content Include="umbraco_client\ui\base2.js" />
|
||||
<Content Include="umbraco_client\ui\jquery.alphanumeric.js" />
|
||||
<Content Include="umbraco_client\ui\jquery.tooltip.min.js" />
|
||||
<Content Include="umbraco_client\ui\json2.js" />
|
||||
<Content Include="umbraco_client\ui\knockout.js" />
|
||||
<Content Include="umbraco_client\ui\knockout.mapping.js" />
|
||||
<Content Include="umbraco_client\ui\ui-lightness\images\ui-bg_diagonals-thick_18_b81900_40x40.png" />
|
||||
@@ -2320,6 +2341,10 @@
|
||||
<None Include="web.Template.NILSJO.Debug.config">
|
||||
<DependentUpon>web.Template.config</DependentUpon>
|
||||
</None>
|
||||
<None Include="web.Template.wulff-Pc.Debug.config">
|
||||
<DependentUpon>web.Template.config</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="App_Code\" />
|
||||
|
||||
@@ -10,19 +10,28 @@ NOTES:
|
||||
* Compression/Combination/Minification is not enabled unless debug="false" is specified on the 'compiliation' element in the web.config
|
||||
* A new version will invalidate both client and server cache and create new persisted files
|
||||
-->
|
||||
<clientDependency version="37">
|
||||
|
||||
<fileRegistration defaultProvider="LoaderControlProvider" fileDependencyExtensions=".js,.css">
|
||||
<providers>
|
||||
<add name="PageHeaderProvider" type="ClientDependency.Core.FileRegistration.Providers.PageHeaderProvider, ClientDependency.Core"/>
|
||||
<add name="LazyLoadProvider" type="ClientDependency.Core.FileRegistration.Providers.LazyLoadProvider, ClientDependency.Core"/>
|
||||
<add name="LoaderControlProvider" type="ClientDependency.Core.FileRegistration.Providers.LoaderControlProvider, ClientDependency.Core"/>
|
||||
<!-- Used for loading dependencies in Canvas mode -->
|
||||
<add name="CanvasProvider" type="umbraco.presentation.LiveEditing.CanvasClientDependencyProvider, umbraco" />
|
||||
</providers>
|
||||
</fileRegistration>
|
||||
<clientDependency version="40" fileDependencyExtensions=".js,.css">
|
||||
|
||||
<!--
|
||||
<fileRegistration defaultProvider="LoaderControlProvider">
|
||||
<providers>
|
||||
<add name="PageHeaderProvider" type="ClientDependency.Core.FileRegistration.Providers.PageHeaderProvider, ClientDependency.Core"/>
|
||||
<add name="LazyLoadProvider" type="ClientDependency.Core.FileRegistration.Providers.LazyLoadProvider, ClientDependency.Core"/>
|
||||
<add name="LoaderControlProvider" type="ClientDependency.Core.FileRegistration.Providers.LoaderControlProvider, ClientDependency.Core"/>
|
||||
<add name="PlaceHolderProvider" type="ClientDependency.Core.FileRegistration.Providers.PlaceHolderProvider, ClientDependency.Core" enableCompositeFiles="true" javascriptPlaceHolderId="JavaScriptPlaceHolder" cssPlaceHolderId="CssPlaceHolder"/>
|
||||
<!-- Used for loading dependencies in Canvas mode -->
|
||||
<add name="CanvasProvider" type="umbraco.presentation.LiveEditing.CanvasClientDependencyProvider, umbraco" />
|
||||
</providers>
|
||||
</fileRegistration>
|
||||
|
||||
<!-- This section is used for MVC only -->
|
||||
<mvc defaultRenderer="StandardRenderer">
|
||||
<renderers>
|
||||
<add name="StandardRenderer" type="ClientDependency.Core.FileRegistration.Providers.StandardRenderer, ClientDependency.Core"/>
|
||||
<add name="LazyLoadRenderer" type="ClientDependency.Core.FileRegistration.Providers.LazyLoadRenderer, ClientDependency.Core"/>
|
||||
</renderers>
|
||||
</mvc>
|
||||
|
||||
<!--
|
||||
The composite file section configures the compression/combination/minification of files.
|
||||
You can enable/disable minification of either JS/CSS files and you can enable/disable the
|
||||
persistence of composite files. By default, minification and persistence is enabled. Persisting files
|
||||
@@ -30,39 +39,35 @@ NOTES:
|
||||
to disk so that on any subsequent request (when output cache expires) that these files don't have
|
||||
to be recreated again and will be based on the persisted file on disk. This saves on processing time.
|
||||
-->
|
||||
<compositeFiles defaultProvider="CompositeFileProcessor" compositeFileHandlerPath="DependencyHandler.axd">
|
||||
<providers>
|
||||
<add name="CompositeFileProcessor"
|
||||
<compositeFiles defaultProvider="defaultFileProcessingProvider" compositeFileHandlerPath="~/DependencyHandler.axd">
|
||||
<fileProcessingProviders>
|
||||
<add name="CompositeFileProcessor"
|
||||
type="ClientDependency.Core.CompositeFiles.Providers.CompositeFileProcessingProvider, ClientDependency.Core"
|
||||
enableCssMinify="true"
|
||||
enableJsMinify="true"
|
||||
persistFiles="true"
|
||||
compositeFilePath="~/App_Data/TEMP/ClientDependency" />
|
||||
</providers>
|
||||
|
||||
<!--
|
||||
compositeFilePath="~/App_Data/TEMP/ClientDependency"
|
||||
urlType="Base64QueryStrings" />
|
||||
</fileProcessingProviders>
|
||||
|
||||
<!-- A file map provider stores references to dependency files by an id to be used in the handler URL when using the MappedId Url type -->
|
||||
<fileMapProviders>
|
||||
<add name="XmlFileMap"
|
||||
type="ClientDependency.Core.CompositeFiles.Providers.XmlFileMapper, ClientDependency.Core"
|
||||
mapPath="~/App_Data/TEMP/ClientDependency"/>
|
||||
</fileMapProviders>
|
||||
|
||||
<!--
|
||||
Defines the mime types to compress when requested by the client.
|
||||
Path is a regex selector, or a * can be used as in place of 'any'.
|
||||
Generally mime types are only set by client browsers in the request for things
|
||||
such as JSON or XML ajax requests.
|
||||
-->
|
||||
<mimeTypeCompression>
|
||||
<!-- Compress all json requests for the tree -->
|
||||
<add type="application/json" path="^.*?/webservices/Tree.*" />
|
||||
</mimeTypeCompression>
|
||||
<mimeTypeCompression>
|
||||
<!-- Compress all json requests for the tree -->
|
||||
<add type="application/json" path="^.*?/webservices/Tree.*" />
|
||||
</mimeTypeCompression>
|
||||
|
||||
</compositeFiles>
|
||||
|
||||
|
||||
</compositeFiles>
|
||||
|
||||
<!-- ClientDependency also supports the ASP.Net MVC framework, see codeplex URL for full details -->
|
||||
<!--
|
||||
<mvc defaultRenderer="StandardRenderer">
|
||||
<renderers>
|
||||
<add name="StandardRenderer" type="ClientDependency.Core.Mvc.Providers.StandardRenderer, ClientDependency.Core"/>
|
||||
<add name="LazyLoadRenderer" type="ClientDependency.Core.Mvc.Providers.LazyLoadRenderer, ClientDependency.Core"/>
|
||||
</renderers>
|
||||
</mvc>
|
||||
-->
|
||||
|
||||
</clientDependency>
|
||||
|
||||
@@ -2,19 +2,19 @@
|
||||
<!-- this is the pre-4.10 rest configuration -->
|
||||
<!-- you should use BaseRestExtensions.config instead -->
|
||||
<RestExtensions>
|
||||
<!-- available for backward compatibility only -->
|
||||
<ext assembly="umbraco" type="umbraco.presentation.umbracobase.library.member" alias="currentMember">
|
||||
<permission method="login" allowAll="true" />
|
||||
<permission method="logout" allowAll="true" />
|
||||
<permission method="id" allowAll="true" />
|
||||
<permission method="data" allowAll="true" />
|
||||
<permission method="logout" allowAll="true" />
|
||||
<permission method="setProperty" allowAll="false" />
|
||||
</ext>
|
||||
<!-- here for backward compatibility only -->
|
||||
<!-- because really, it should not be enabled by default -->
|
||||
<ext assembly="Runway.Blog" type="Runway.Blog.Library.Base" alias="umbBlog">
|
||||
<permission method="CreateComment" returnXml="false" allowAll="true" />
|
||||
<permission method="GetGravatarImage" returnXml="false" allowAll="true" />
|
||||
</ext>
|
||||
<!-- available for backward compatibility only -->
|
||||
<ext assembly="umbraco" type="umbraco.presentation.umbracobase.library.member" alias="currentMember">
|
||||
<permission method="login" allowAll="true" />
|
||||
<permission method="logout" allowAll="true" />
|
||||
<permission method="id" allowAll="true" />
|
||||
<permission method="data" allowAll="true" />
|
||||
<permission method="logout" allowAll="true" />
|
||||
<permission method="setProperty" allowAll="false" />
|
||||
</ext>
|
||||
<!-- here for backward compatibility only -->
|
||||
<!-- because really, it should not be enabled by default -->
|
||||
<ext assembly="Runway.Blog" type="Runway.Blog.Library.Base" alias="umbBlog">
|
||||
<permission method="CreateComment" returnXml="false" allowAll="true" />
|
||||
<permission method="GetGravatarImage" returnXml="false" allowAll="true" />
|
||||
</ext>
|
||||
</RestExtensions>
|
||||
@@ -5,7 +5,7 @@
|
||||
<!-- what file extension that should cause umbraco to create thumbnails -->
|
||||
<imageFileTypes>jpeg,jpg,gif,bmp,png,tiff,tif</imageFileTypes>
|
||||
<!-- what attributes that are allowed in the editor on an img tag -->
|
||||
<allowedAttributes>alt,border,class,style,align,id,name,onclick,usemap</allowedAttributes>
|
||||
<allowedAttributes>src,alt,border,class,style,align,id,name,onclick,usemap</allowedAttributes>
|
||||
<!-- automatically updates dimension, filesize and extension attributes on upload -->
|
||||
<autoFillImageProperties>
|
||||
<uploadField alias="umbracoFile">
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<!-- what file extension that should cause umbraco to create thumbnails -->
|
||||
<imageFileTypes>jpeg,jpg,gif,bmp,png,tiff,tif</imageFileTypes>
|
||||
<!-- what attributes that are allowed in the editor on an img tag -->
|
||||
<allowedAttributes>alt,border,class,style,align,id,name,onclick,usemap</allowedAttributes>
|
||||
<allowedAttributes>src,alt,border,class,style,align,id,name,onclick,usemap</allowedAttributes>
|
||||
<!-- automatically updates dimension, filesize and extension attributes on upload -->
|
||||
<autoFillImageProperties>
|
||||
<uploadField alias="umbracoFile">
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<!--<package id="ClientDependency" version="1.5.1.0" targetFramework="net40" />
|
||||
<package id="ClientDependency-Mvc" version="1.5.1.0" targetFramework="net40" />-->
|
||||
<package id="log4net" version="2.0.0" targetFramework="net40" />
|
||||
<package id="Microsoft.AspNet.Mvc" version="3.0.20105.1" targetFramework="net40" />
|
||||
<package id="Microsoft.AspNet.Razor" version="1.0.20105.408" targetFramework="net40" />
|
||||
|
||||
@@ -11,5 +11,14 @@ namespace Umbraco.Web.UI.Umbraco {
|
||||
|
||||
|
||||
public partial class Umbraco {
|
||||
|
||||
/// <summary>
|
||||
/// JSON2 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::ClientDependency.Core.Controls.JsInclude JSON2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,6 @@
|
||||
<key alias="saveAndPublish">Gem og udgiv</key>
|
||||
<key alias="saveToPublish">Gem og send til udgivelse</key>
|
||||
<key alias="showPage">Se siden</key>
|
||||
<key alias="showPageDisabled">Se siden (du kan ikke se siden, da der ikke er valgt nogen skabelon)</key>
|
||||
<key alias="styleChoose">Vælg formattering</key>
|
||||
<key alias="styleShow">Vis koder</key>
|
||||
<key alias="tableInsert">Indsæt tabel</key>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<language alias="en" intName="English (uk)" localName="English" lcid="" culture="en-GB">
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<language alias="en" intName="English (UK)" localName="English (UK)" lcid="" culture="en-GB">
|
||||
<creator>
|
||||
<name>umbraco</name>
|
||||
<link>http://umbraco.org</link>
|
||||
@@ -23,6 +23,7 @@
|
||||
<key alias="notify">Notifications</key>
|
||||
<key alias="protect">Public access</key>
|
||||
<key alias="publish">Publish</key>
|
||||
<key alias="unpublish">Unpublish</key>
|
||||
<key alias="refreshNode">Reload nodes</key>
|
||||
<key alias="republish">Republish entire site</key>
|
||||
<key alias="rights">Permissions</key>
|
||||
@@ -36,11 +37,16 @@
|
||||
</area>
|
||||
<area alias="assignDomain">
|
||||
<key alias="addNew">Add new Domain</key>
|
||||
<key alias="invalidDomain">Invalid hostname</key>
|
||||
<key alias="domain">Domain</key>
|
||||
<key alias="domainCreated">New domain '%0%' has been created</key>
|
||||
<key alias="domainDeleted">Domain '%0%' is deleted</key>
|
||||
<key alias="domainExists">Domain '%0%' has already been assigned</key>
|
||||
<key alias="domainHelp">ei: yourdomain.com, www.yourdomain.com</key>
|
||||
<key alias="domainHelp">
|
||||
<![CDATA[eg: example.com, www.example.com, example.com:8080,<br/>
|
||||
https://www.example.com/, example.com/en, etc. Use * to match<br/>
|
||||
any domain and just set the culture.]]>
|
||||
</key>
|
||||
<key alias="domainUpdated">Domain '%0%' has been updated</key>
|
||||
<key alias="orEdit">Edit Current Domains</key>
|
||||
</area>
|
||||
@@ -89,7 +95,7 @@
|
||||
<key alias="itemNotPublished">This item is not published</key>
|
||||
<key alias="lastPublished">Last published</key>
|
||||
<key alias="mediatype">Media Type</key>
|
||||
<key alias="mediaLinks">Link to media item(s)</key>
|
||||
<key alias="mediaLinks">Link to media item(s)</key>
|
||||
<key alias="membergroup">Member Group</key>
|
||||
<key alias="memberrole">Role</key>
|
||||
<key alias="membertype">Member Type</key>
|
||||
@@ -165,18 +171,24 @@
|
||||
<key alias="siterepublishHelp">The website cache will be refreshed. All published content will be updated, while unpublished content will stay unpublished.</key>
|
||||
<key alias="tableColumns">Number of columns</key>
|
||||
<key alias="tableRows">Number of rows</key>
|
||||
<key alias="templateContentAreaHelp"><![CDATA[<strong>Set a placeholder id</strong> by setting an ID on your placeholder you can inject content into this template from child templates,
|
||||
by refering this ID using a <code><asp:content /></code> element.]]></key>
|
||||
<key alias="templateContentPlaceHolderHelp"><![CDATA[<strong>Select a placeholder id</strong> from the list below. You can only
|
||||
choose Id's from the current template's master.]]></key>
|
||||
<key alias="templateContentAreaHelp">
|
||||
<![CDATA[<strong>Set a placeholder id</strong> by setting an ID on your placeholder you can inject content into this template from child templates,
|
||||
by refering this ID using a <code><asp:content /></code> element.]]>
|
||||
</key>
|
||||
<key alias="templateContentPlaceHolderHelp">
|
||||
<![CDATA[<strong>Select a placeholder id</strong> from the list below. You can only
|
||||
choose Id's from the current template's master.]]>
|
||||
</key>
|
||||
<key alias="thumbnailimageclickfororiginal">Click on the image to see full size</key>
|
||||
<key alias="treepicker">Pick item</key>
|
||||
<key alias="viewCacheItem">View Cache Item</key>
|
||||
</area>
|
||||
<area alias="dictionaryItem">
|
||||
<key alias="description"><![CDATA[
|
||||
<key alias="description">
|
||||
<![CDATA[
|
||||
Edit the different language versions for the dictionary item '<em>%0%</em>' below<br/>You can add additional languages under the 'languages' in the menu on the left
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="displayName">Culture Name</key>
|
||||
</area>
|
||||
<area alias="editcontenttype">
|
||||
@@ -324,6 +336,7 @@
|
||||
<key alias="welcome">Welcome...</key>
|
||||
<key alias="width">Width</key>
|
||||
<key alias="yes">Yes</key>
|
||||
<key alias="folder">Folder</key>
|
||||
</area>
|
||||
<area alias="graphicheadline">
|
||||
<key alias="backgroundcolor">Background color</key>
|
||||
@@ -340,34 +353,45 @@
|
||||
<key alias="databaseErrorWebConfig">Could not save the web.config file. Please modify the connection string manually.</key>
|
||||
<key alias="databaseFound">Your database has been found and is identified as</key>
|
||||
<key alias="databaseHeader">Database configuration</key>
|
||||
<key alias="databaseInstall"><![CDATA[
|
||||
<key alias="databaseInstall">
|
||||
<![CDATA[
|
||||
Press the <strong>install</strong> button to install the Umbraco %0% database
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="databaseInstallDone"><![CDATA[Umbraco %0% has now been copied to your database. Press <strong>Next</strong> to proceed.]]></key>
|
||||
<key alias="databaseNotFound"><![CDATA[<p>Database not found! Please check that the information in the "connection string" of the “web.config” file is correct.</p>
|
||||
<key alias="databaseNotFound">
|
||||
<![CDATA[<p>Database not found! Please check that the information in the "connection string" of the “web.config” file is correct.</p>
|
||||
<p>To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "umbracoDbDSN" and save the file. </p>
|
||||
<p>
|
||||
Click the <strong>retry</strong> button when
|
||||
done.<br /><a href="http://umbraco.org/redir/installWebConfig" target="_blank">
|
||||
More information on editing web.config here.</a></p>]]></key>
|
||||
<key alias="databaseText"><![CDATA[To complete this step, you must know some information regarding your database server ("connection string").<br />
|
||||
More information on editing web.config here.</a></p>]]>
|
||||
</key>
|
||||
<key alias="databaseText">
|
||||
<![CDATA[To complete this step, you must know some information regarding your database server ("connection string").<br />
|
||||
Please contact your ISP if necessary.
|
||||
If you're installing on a local machine or server you might need information from your system administrator.]]></key>
|
||||
<key alias="databaseUpgrade"><![CDATA[
|
||||
If you're installing on a local machine or server you might need information from your system administrator.]]>
|
||||
</key>
|
||||
<key alias="databaseUpgrade">
|
||||
<![CDATA[
|
||||
<p>
|
||||
Press the <strong>upgrade</strong> button to upgrade your database to Umbraco %0%</p>
|
||||
<p>
|
||||
Don't worry - no content will be deleted and everything will continue working afterwards!
|
||||
</p>
|
||||
]]></key>
|
||||
<key alias="databaseUpgradeDone"><![CDATA[Your database has been upgraded to the final version %0%.<br />Press <strong>Next</strong> to
|
||||
proceed. ]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="databaseUpgradeDone">
|
||||
<![CDATA[Your database has been upgraded to the final version %0%.<br />Press <strong>Next</strong> to
|
||||
proceed. ]]>
|
||||
</key>
|
||||
<key alias="databaseUpToDate"><![CDATA[Your current database is up-to-date!. Click <strong>next</strong> to continue the configuration wizard]]></key>
|
||||
<key alias="defaultUserChangePass"><![CDATA[<strong>The Default users’ password needs to be changed!</strong>]]></key>
|
||||
<key alias="defaultUserDisabled"><![CDATA[<strong>The Default user has been disabled or has no access to umbraco!</strong></p><p>No further actions needs to be taken. Click <b>Next</b> to proceed.]]></key>
|
||||
<key alias="defaultUserPassChanged"><![CDATA[<strong>The Default user's password has been successfully changed since the installation!</strong></p><p>No further actions needs to be taken. Click <strong>Next</strong> to proceed.]]></key>
|
||||
<key alias="defaultUserPasswordChanged">The password is changed!</key>
|
||||
<key alias="defaultUserText"><![CDATA[
|
||||
<key alias="defaultUserText">
|
||||
<![CDATA[
|
||||
<p>
|
||||
umbraco creates a default user with a login <strong>('admin')</strong> and password <strong>('default')</strong>. It's <strong>important</strong> that the password is
|
||||
changed to something unique.
|
||||
@@ -375,48 +399,64 @@
|
||||
<p>
|
||||
This step will check the default user's password and suggest if it needs to be changed.
|
||||
</p>
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="greatStart">Get a great start, watch our introduction videos</key>
|
||||
<key alias="licenseText">By clicking the next button (or modifying the umbracoConfigurationStatus in web.config), you accept the license for this software as specified in the box below. Notice that this umbraco distribution consists of two different licenses, the open source MIT license for the framework and the umbraco freeware license that covers the UI.</key>
|
||||
<key alias="None">Not installed yet.</key>
|
||||
<key alias="permissionsAffectedFolders">Affected files and folders</key>
|
||||
<key alias="permissionsAffectedFoldersMoreInfo">More information on setting up permissions for umbraco here</key>
|
||||
<key alias="permissionsAffectedFoldersText">You need to grant ASP.NET modify permissions to the following files/folders</key>
|
||||
<key alias="permissionsAlmostPerfect"><![CDATA[<strong>Your permission settings are almost perfect!</strong><br /><br />
|
||||
You can run umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of umbraco.]]></key>
|
||||
<key alias="permissionsAlmostPerfect">
|
||||
<![CDATA[<strong>Your permission settings are almost perfect!</strong><br /><br />
|
||||
You can run umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of umbraco.]]>
|
||||
</key>
|
||||
<key alias="permissionsHowtoResolve">How to Resolve</key>
|
||||
<key alias="permissionsHowtoResolveLink">Click here to read the text version</key>
|
||||
<key alias="permissionsHowtoResolveText"><![CDATA[Watch our <strong>video tutorial</strong> on setting up folder permissions for umbraco or read the text version.]]></key>
|
||||
<key alias="permissionsMaybeAnIssue"><![CDATA[<strong>Your permission settings might be an issue!</strong>
|
||||
<key alias="permissionsMaybeAnIssue">
|
||||
<![CDATA[<strong>Your permission settings might be an issue!</strong>
|
||||
<br/><br />
|
||||
You can run umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of umbraco.]]></key>
|
||||
<key alias="permissionsNotReady"><![CDATA[<strong>Your permission settings are not ready for umbraco!</strong>
|
||||
You can run umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of umbraco.]]>
|
||||
</key>
|
||||
<key alias="permissionsNotReady">
|
||||
<![CDATA[<strong>Your permission settings are not ready for umbraco!</strong>
|
||||
<br /><br />
|
||||
In order to run umbraco, you'll need to update your permission settings.]]></key>
|
||||
<key alias="permissionsPerfect"><![CDATA[<strong>Your permission settings are perfect!</strong><br /><br />
|
||||
You are ready to run umbraco and install packages!]]></key>
|
||||
In order to run umbraco, you'll need to update your permission settings.]]>
|
||||
</key>
|
||||
<key alias="permissionsPerfect">
|
||||
<![CDATA[<strong>Your permission settings are perfect!</strong><br /><br />
|
||||
You are ready to run umbraco and install packages!]]>
|
||||
</key>
|
||||
<key alias="permissionsResolveFolderIssues">Resolving folder issue</key>
|
||||
<key alias="permissionsResolveFolderIssuesLink">Follow this link for more information on problems with ASP.NET and creating folders</key>
|
||||
<key alias="permissionsSettingUpPermissions">Setting up folder permissions</key>
|
||||
<key alias="permissionsText"><![CDATA[
|
||||
<key alias="permissionsText">
|
||||
<![CDATA[
|
||||
umbraco needs write/modify access to certain directories in order to store files like pictures and PDF's.
|
||||
It also stores temporary data (aka: cache) for enhancing the performance of your website.
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="runwayFromScratch">I want to start from scratch</key>
|
||||
<key alias="runwayFromScratchText"><![CDATA[
|
||||
<key alias="runwayFromScratchText">
|
||||
<![CDATA[
|
||||
Your website is completely empty at the moment, so that’s perfect if you want to start from scratch and create your own document types and templates.
|
||||
(<a href="http://umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">learn how</a>)
|
||||
You can still choose to install Runway later on. Please go to the Developer section and choose Packages.
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="runwayHeader">You’ve just set up a clean Umbraco platform. What do you want to do next?</key>
|
||||
<key alias="runwayInstalled">Runway is installed</key>
|
||||
<key alias="runwayInstalledText"><![CDATA[
|
||||
<key alias="runwayInstalledText">
|
||||
<![CDATA[
|
||||
You have the foundation in place. Select what modules you wish to install on top of it.<br />
|
||||
This is our list of recommended modules, check off the ones you would like to install, or view the <a href="#" onclick="toggleModules(); return false;" id="toggleModuleList">full list of modules</a>
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="runwayOnlyProUsers">Only recommended for experienced users</key>
|
||||
<key alias="runwaySimpleSite">I want to start with a simple website</key>
|
||||
<key alias="runwaySimpleSiteText"><![CDATA[
|
||||
<key alias="runwaySimpleSiteText">
|
||||
<![CDATA[
|
||||
<p>
|
||||
"Runway" is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically,
|
||||
but you can easily edit, extend or remove it. It’s not necessary and you can perfectly use Umbraco without it. However,
|
||||
@@ -427,7 +467,8 @@
|
||||
<em>Included with Runway:</em> Home page, Getting Started page, Installing Modules page.<br />
|
||||
<em>Optional Modules:</em> Top Navigation, Sitemap, Contact, Gallery.
|
||||
</small>
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="runwayWhatIsRunway">What is Runway</key>
|
||||
<key alias="step1">Step 1/5 Accept license</key>
|
||||
<key alias="step2">Step 2/5: Database configuration</key>
|
||||
@@ -435,24 +476,36 @@
|
||||
<key alias="step4">Step 4/5: Check umbraco security</key>
|
||||
<key alias="step5">Step 5/5: Umbraco is ready to get you started</key>
|
||||
<key alias="thankYou">Thank you for choosing umbraco</key>
|
||||
<key alias="theEndBrowseSite"><![CDATA[<h3>Browse your new site</h3>
|
||||
You installed Runway, so why not see how your new website looks.]]></key>
|
||||
<key alias="theEndFurtherHelp"><![CDATA[<h3>Further help and information</h3>
|
||||
Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the umbraco terminology]]></key>
|
||||
<key alias="theEndBrowseSite">
|
||||
<![CDATA[<h3>Browse your new site</h3>
|
||||
You installed Runway, so why not see how your new website looks.]]>
|
||||
</key>
|
||||
<key alias="theEndFurtherHelp">
|
||||
<![CDATA[<h3>Further help and information</h3>
|
||||
Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the umbraco terminology]]>
|
||||
</key>
|
||||
<key alias="theEndHeader">Umbraco %0% is installed and ready for use</key>
|
||||
<key alias="theEndInstallFailed"><![CDATA[To finish the installation, you'll need to
|
||||
manually edit the <strong>/web.config file</strong> and update the AppSetting key <strong>umbracoConfigurationStatus</strong> in the bottom to the value of <strong>'%0%'</strong>.]]></key>
|
||||
<key alias="theEndInstallSuccess"><![CDATA[You can get <strong>started instantly</strong> by clicking the "Launch Umbraco" button below. <br />If you are <strong>new to umbraco</strong>,
|
||||
you can find plenty of resources on our getting started pages.]]></key>
|
||||
<key alias="theEndOpenUmbraco"><![CDATA[<h3>Launch Umbraco</h3>
|
||||
To manage your website, simply open the umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]></key>
|
||||
<key alias="theEndInstallFailed">
|
||||
<![CDATA[To finish the installation, you'll need to
|
||||
manually edit the <strong>/web.config file</strong> and update the AppSetting key <strong>umbracoConfigurationStatus</strong> in the bottom to the value of <strong>'%0%'</strong>.]]>
|
||||
</key>
|
||||
<key alias="theEndInstallSuccess">
|
||||
<![CDATA[You can get <strong>started instantly</strong> by clicking the "Launch Umbraco" button below. <br />If you are <strong>new to umbraco</strong>,
|
||||
you can find plenty of resources on our getting started pages.]]>
|
||||
</key>
|
||||
<key alias="theEndOpenUmbraco">
|
||||
<![CDATA[<h3>Launch Umbraco</h3>
|
||||
To manage your website, simply open the umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]>
|
||||
</key>
|
||||
<key alias="Unavailable">Connection to database failed.</key>
|
||||
<key alias="Version3">Umbraco Version 3</key>
|
||||
<key alias="Version4">Umbraco Version 4</key>
|
||||
<key alias="watch">Watch</key>
|
||||
<key alias="welcomeIntro"><![CDATA[This wizard will guide you through the process of configuring <strong>umbraco %0%</strong> for a fresh install or upgrading from version 3.0.
|
||||
<key alias="welcomeIntro">
|
||||
<![CDATA[This wizard will guide you through the process of configuring <strong>umbraco %0%</strong> for a fresh install or upgrading from version 3.0.
|
||||
<br /><br />
|
||||
Press <strong>"next"</strong> to start the wizard.]]></key>
|
||||
Press <strong>"next"</strong> to start the wizard.]]>
|
||||
</key>
|
||||
</area>
|
||||
<area alias="language">
|
||||
<key alias="cultureCode">Culture Code</key>
|
||||
@@ -486,7 +539,8 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
</area>
|
||||
<area alias="notifications">
|
||||
<key alias="editNotifications">Edit your notification for %0%</key>
|
||||
<key alias="mailBody"><![CDATA[
|
||||
<key alias="mailBody">
|
||||
<![CDATA[
|
||||
Hi %0%
|
||||
|
||||
This is an automated mail to inform you that the task '%1%'
|
||||
@@ -498,8 +552,10 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
Have a nice day!
|
||||
|
||||
Cheers from the umbraco robot
|
||||
]]></key>
|
||||
<key alias="mailBodyHtml"><![CDATA[<p>Hi %0%</p>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="mailBodyHtml">
|
||||
<![CDATA[<p>Hi %0%</p>
|
||||
|
||||
<p>This is an automated mail to inform you that the task <strong>'%1%'</strong>
|
||||
has been performed on the page <a href="%7%"><strong>'%2%'</strong></a>
|
||||
@@ -529,23 +585,28 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
|
||||
<p>Have a nice day!<br /><br />
|
||||
Cheers from the umbraco robot
|
||||
</p>]]></key>
|
||||
</p>]]>
|
||||
</key>
|
||||
<key alias="mailSubject">[%0%] Notification about %1% performed on %2%</key>
|
||||
<key alias="notifications">Notifications</key>
|
||||
</area>
|
||||
<area alias="packager">
|
||||
<key alias="chooseLocalPackageText"><![CDATA[
|
||||
<key alias="chooseLocalPackageText">
|
||||
<![CDATA[
|
||||
Choose Package from your machine, by clicking the Browse<br />
|
||||
button and locating the package. umbraco packages usually have a ".umb" or ".zip" extension.
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="packageAuthor">Author</key>
|
||||
<key alias="packageDemonstration">Demonstration</key>
|
||||
<key alias="packageDocumentation">Documentation</key>
|
||||
<key alias="packageMetaData">Package meta data</key>
|
||||
<key alias="packageName">Package name</key>
|
||||
<key alias="packageNoItemsHeader">Package doesn't contain any items</key>
|
||||
<key alias="packageNoItemsText"><![CDATA[This package file doesn't contain any items to uninstall.<br/><br/>
|
||||
You can safely remove this from the system by clicking "uninstall package" below.]]></key>
|
||||
<key alias="packageNoItemsText">
|
||||
<![CDATA[This package file doesn't contain any items to uninstall.<br/><br/>
|
||||
You can safely remove this from the system by clicking "uninstall package" below.]]>
|
||||
</key>
|
||||
<key alias="packageNoUpgrades">No upgrades available</key>
|
||||
<key alias="packageOptions">Package options</key>
|
||||
<key alias="packageReadme">Package readme</key>
|
||||
@@ -554,9 +615,11 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
<key alias="packageUninstalledHeader">Package was uninstalled</key>
|
||||
<key alias="packageUninstalledText">The package was successfully uninstalled</key>
|
||||
<key alias="packageUninstallHeader">Uninstall package</key>
|
||||
<key alias="packageUninstallText"><![CDATA[You can unselect items you do not wish to remove, at this time, below. When you click "confirm uninstall" all checked-off items will be removed.<br />
|
||||
<key alias="packageUninstallText">
|
||||
<![CDATA[You can unselect items you do not wish to remove, at this time, below. When you click "confirm uninstall" all checked-off items will be removed.<br />
|
||||
<span style="color: Red; font-weight: bold;">Notice:</span> any documents, media etc depending on the items you remove, will stop working, and could lead to system instability,
|
||||
so uninstall with caution. If in doubt, contact the package author.]]></key>
|
||||
so uninstall with caution. If in doubt, contact the package author.]]>
|
||||
</key>
|
||||
<key alias="packageUpgradeDownload">Download update from the repository</key>
|
||||
<key alias="packageUpgradeHeader">Upgrade package</key>
|
||||
<key alias="packageUpgradeInstructions">Upgrade instructions</key>
|
||||
@@ -589,18 +652,27 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
<key alias="paSimpleHelp">If you just want to setup simple protection using a single login and password</key>
|
||||
</area>
|
||||
<area alias="publish">
|
||||
<key alias="contentPublishedFailedByEvent"><![CDATA[
|
||||
<key alias="contentPublishedFailedByEvent">
|
||||
<![CDATA[
|
||||
%0% could not be published, due to a 3rd party extension cancelling the action.
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="contentPublishedFailedByParent">
|
||||
<![CDATA[
|
||||
%0% can not be published, because a parent page is not published.
|
||||
]]>
|
||||
</key>
|
||||
<key alias="includeUnpublished">Include unpublished child pages</key>
|
||||
<key alias="inProgress">Publishing in progress - please wait...</key>
|
||||
<key alias="inProgressCounter">%0% out of %1% pages have been published...</key>
|
||||
<key alias="nodePublish">%0% has been published</key>
|
||||
<key alias="nodePublishAll">%0% and subpages have been published</key>
|
||||
<key alias="publishAll">Publish %0% and all its subpages</key>
|
||||
<key alias="publishHelp"><![CDATA[Click <em>ok</em> to publish <strong>%0%</strong> and thereby making it's content publicly available.<br/><br />
|
||||
<key alias="publishHelp">
|
||||
<![CDATA[Click <em>ok</em> to publish <strong>%0%</strong> and thereby making it's content publicly available.<br/><br />
|
||||
You can publish this page and all it's sub-pages by checking <em>publish all children</em> below.
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
</area>
|
||||
<area alias="relatedlinks">
|
||||
<key alias="addExternal">Add external link</key>
|
||||
@@ -655,7 +727,6 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
<key alias="contentTypeEnabled">Master Content Type enabled</key>
|
||||
<key alias="contentTypeUses">This Content Type uses</key>
|
||||
<key alias="asAContentMasterType">as a Master Content Type. Tabs from Master Content Types are not shown and can only be edited on the Master Content Type itself</key>
|
||||
|
||||
</area>
|
||||
<area alias="sort">
|
||||
<key alias="sortDone">Sorting complete.</key>
|
||||
@@ -709,6 +780,11 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
<key alias="xsltPermissionErrorText">Xslt could not be saved, check file permissions</key>
|
||||
<key alias="xsltSavedHeader">Xslt saved</key>
|
||||
<key alias="xsltSavedText">No errors in xslt</key>
|
||||
<key alias="contentUnpublished">Content unpublished</key>
|
||||
<key alias="partialViewSavedHeader">Partial view saved</key>
|
||||
<key alias="partialViewSavedText">Partial view saved without any errors!</key>
|
||||
<key alias="partialViewErrorHeader">Partial view not saved</key>
|
||||
<key alias="partialViewErrorText">An error occurred saving the file.</key>
|
||||
</area>
|
||||
<area alias="stylesheet">
|
||||
<key alias="aliasHelp">Uses CSS syntax ex: h1, .redHeader, .blueTex</key>
|
||||
@@ -736,7 +812,7 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
<key alias="chooseField">Choose field</key>
|
||||
<key alias="convertLineBreaks">Convert Linebreaks</key>
|
||||
<key alias="convertLineBreaksHelp">Replaces linebreaks with html-tag &lt;br&gt;</key>
|
||||
<key alias="customFields">Custom Fields</key>
|
||||
<key alias="customFields">Custom Fields</key>
|
||||
<key alias="dateOnly">Yes, Date only</key>
|
||||
<key alias="formatAsDate">Format as date</key>
|
||||
<key alias="htmlEncode">HTML encode</key>
|
||||
@@ -750,7 +826,7 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
<key alias="recursive">Recursive</key>
|
||||
<key alias="removeParagraph">Remove Paragraph tags</key>
|
||||
<key alias="removeParagraphHelp">Will remove any &lt;P&gt; in the beginning and end of the text</key>
|
||||
<key alias="standardFields">Standard Fields</key>
|
||||
<key alias="standardFields">Standard Fields</key>
|
||||
<key alias="uppercase">Uppercase</key>
|
||||
<key alias="urlEncode">URL encode</key>
|
||||
<key alias="urlEncodeHelp">Will format special characters in URLs</key>
|
||||
@@ -760,10 +836,12 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
</area>
|
||||
<area alias="translation">
|
||||
<key alias="assignedTasks">Tasks assigned to you</key>
|
||||
<key alias="assignedTasksHelp"><![CDATA[ The list below shows translation tasks <strong>assigned to you</strong>. To see a detailed view including comments, click on "Details" or just the page name.
|
||||
<key alias="assignedTasksHelp">
|
||||
<![CDATA[ The list below shows translation tasks <strong>assigned to you</strong>. To see a detailed view including comments, click on "Details" or just the page name.
|
||||
You can also download the page as XML directly by clicking the "Download Xml" link. <br/>
|
||||
To close a translation task, please go to the Details view and click the "Close" button.
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="closeTask">close task</key>
|
||||
<key alias="details">Translation details</key>
|
||||
<key alias="downloadAllAsXml">Download all translation tasks as xml</key>
|
||||
@@ -771,7 +849,8 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
<key alias="DownloadXmlDTD">Download xml DTD</key>
|
||||
<key alias="fields">Fields</key>
|
||||
<key alias="includeSubpages">Include subpages</key>
|
||||
<key alias="mailBody"><![CDATA[
|
||||
<key alias="mailBody">
|
||||
<![CDATA[
|
||||
Hi %0%
|
||||
|
||||
This is an automated mail to inform you that the document '%1%'
|
||||
@@ -785,14 +864,17 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
Have a nice day!
|
||||
|
||||
Cheers from the umbraco robot
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="mailSubject">[%0%] Translation task for %1%</key>
|
||||
<key alias="noTranslators">No translator users found. Please create a translator user before you start sending content to translation</key>
|
||||
<key alias="ownedTasks">Tasks created by you</key>
|
||||
<key alias="ownedTasksHelp"><![CDATA[ The list below shows pages <strong>created by you</strong>. To see a detailed view including comments,
|
||||
<key alias="ownedTasksHelp">
|
||||
<![CDATA[ The list below shows pages <strong>created by you</strong>. To see a detailed view including comments,
|
||||
click on "Details" or just the page name. You can also download the page as XML directly by clicking the "Download Xml" link.
|
||||
To close a translation task, please go to the Details view and click the "Close" button.
|
||||
]]></key>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="pageHasBeenSendToTranslation">The page '%0%' has been send to translation</key>
|
||||
<key alias="sendToTranslate">Send the page '%0%' to translation</key>
|
||||
<key alias="taskAssignedBy">Assigned by</key>
|
||||
@@ -825,7 +907,7 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
<key alias="memberType">Member Types</key>
|
||||
<key alias="nodeTypes">Document Types</key>
|
||||
<key alias="packager">Packages</key>
|
||||
<key alias="packages">Packages</key>
|
||||
<key alias="packages">Packages</key>
|
||||
<key alias="python">Python Files</key>
|
||||
<key alias="repositories">Install from repository</key>
|
||||
<key alias="runway">Install Runway</key>
|
||||
@@ -865,9 +947,9 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
<key alias="passwordChanged">Your password has been changed!</key>
|
||||
<key alias="passwordConfirm">Please confirm the new password</key>
|
||||
<key alias="passwordEnterNew">Enter your new password</key>
|
||||
<key alias="passwordIsBlank">Your new password cannot be blank!</key>
|
||||
<key alias="passwordCurrent">Current password</key>
|
||||
<key alias="passwordInvalid">Invalid current password</key>
|
||||
<key alias="passwordIsBlank">Your new password cannot be blank!</key>
|
||||
<key alias="passwordCurrent">Current password</key>
|
||||
<key alias="passwordInvalid">Invalid current password</key>
|
||||
<key alias="passwordIsDifferent">There was a difference between the new password and the confirmed password. Please try again!</key>
|
||||
<key alias="passwordMismatch">The confirmed password doesn't match the new password!</key>
|
||||
<key alias="permissionReplaceChildren">Replace child node permssions</key>
|
||||
@@ -881,4 +963,4 @@ To manage your website, simply open the umbraco back office and start adding con
|
||||
<key alias="userTypes">User types</key>
|
||||
<key alias="writer">Writer</key>
|
||||
</area>
|
||||
</language>
|
||||
</language>
|
||||
|
||||
@@ -0,0 +1,964 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
|
||||
<creator>
|
||||
<name>umbraco</name>
|
||||
<link>http://umbraco.org</link>
|
||||
</creator>
|
||||
<area alias="actions">
|
||||
<key alias="assignDomain">Manage hostnames</key>
|
||||
<key alias="auditTrail">Audit Trail</key>
|
||||
<key alias="browse">Browse Node</key>
|
||||
<key alias="copy">Copy</key>
|
||||
<key alias="create">Create</key>
|
||||
<key alias="createPackage">Create Package</key>
|
||||
<key alias="delete">Delete</key>
|
||||
<key alias="disable">Disable</key>
|
||||
<key alias="emptyTrashcan">Empty recycle bin</key>
|
||||
<key alias="exportDocumentType">Export Document Type</key>
|
||||
<key alias="importDocumentType">Import Document Type</key>
|
||||
<key alias="importPackage">Import Package</key>
|
||||
<key alias="liveEdit">Edit in Canvas</key>
|
||||
<key alias="logout">Exit</key>
|
||||
<key alias="move">Move</key>
|
||||
<key alias="notify">Notifications</key>
|
||||
<key alias="protect">Public access</key>
|
||||
<key alias="publish">Publish</key>
|
||||
<key alias="refreshNode">Reload nodes</key>
|
||||
<key alias="republish">Republish entire site</key>
|
||||
<key alias="rights">Permissions</key>
|
||||
<key alias="rollback">Rollback</key>
|
||||
<key alias="sendtopublish">Send To Publish</key>
|
||||
<key alias="sendToTranslate">Send To Translation</key>
|
||||
<key alias="sort">Sort</key>
|
||||
<key alias="toPublish">Send to publication</key>
|
||||
<key alias="translate">Translate</key>
|
||||
<key alias="update">Update</key>
|
||||
</area>
|
||||
<area alias="assignDomain">
|
||||
<key alias="addNew">Add new Domain</key>
|
||||
<key alias="invalidDomain">Invalid hostname</key>
|
||||
<key alias="domain">Domain</key>
|
||||
<key alias="domainCreated">New domain '%0%' has been created</key>
|
||||
<key alias="domainDeleted">Domain '%0%' is deleted</key>
|
||||
<key alias="domainExists">Domain '%0%' has already been assigned</key>
|
||||
<key alias="domainHelp">
|
||||
<![CDATA[eg: example.com, www.example.com, example.com:8080,<br/>
|
||||
https://www.example.com/, example.com/en, etc. Use * to match<br/>
|
||||
any domain and just set the culture.]]>
|
||||
</key>
|
||||
<key alias="domainUpdated">Domain '%0%' has been updated</key>
|
||||
<key alias="orEdit">Edit Current Domains</key>
|
||||
</area>
|
||||
<area alias="auditTrails">
|
||||
<key alias="atViewingFor">Viewing for</key>
|
||||
</area>
|
||||
<area alias="buttons">
|
||||
<key alias="bold">Bold</key>
|
||||
<key alias="deindent">Cancel Paragraph Indent</key>
|
||||
<key alias="formFieldInsert">Insert form field</key>
|
||||
<key alias="graphicHeadline">Insert graphic headline</key>
|
||||
<key alias="htmlEdit">Edit Html</key>
|
||||
<key alias="indent">Indent Paragraph</key>
|
||||
<key alias="italic">Italic</key>
|
||||
<key alias="justifyCenter">Center</key>
|
||||
<key alias="justifyLeft">Justify Left</key>
|
||||
<key alias="justifyRight">Justify Right</key>
|
||||
<key alias="linkInsert">Insert Link</key>
|
||||
<key alias="linkLocal">Insert local link (anchor)</key>
|
||||
<key alias="listBullet">Bullet List</key>
|
||||
<key alias="listNumeric">Numeric List</key>
|
||||
<key alias="macroInsert">Insert macro</key>
|
||||
<key alias="pictureInsert">Insert picture</key>
|
||||
<key alias="relations">Edit relations</key>
|
||||
<key alias="save">Save</key>
|
||||
<key alias="saveAndPublish">Save and publish</key>
|
||||
<key alias="saveToPublish">Save and send for approval</key>
|
||||
<key alias="showPage">Preview</key>
|
||||
<key alias="showPageDisabled">Preview is disabled because there's no template assigned</key>
|
||||
<key alias="styleChoose">Choose style</key>
|
||||
<key alias="styleShow">Show styles</key>
|
||||
<key alias="tableInsert">Insert table</key>
|
||||
</area>
|
||||
<area alias="content">
|
||||
<key alias="about">About this page</key>
|
||||
<key alias="alias">Alias</key>
|
||||
<key alias="alternativeTextHelp">(how would you describe the picture over the phone)</key>
|
||||
<key alias="alternativeUrls">Alternative Links</key>
|
||||
<key alias="clickToEdit">Click to edit this item</key>
|
||||
<key alias="createBy">Created by</key>
|
||||
<key alias="createDate">Created</key>
|
||||
<key alias="documentType">Document Type</key>
|
||||
<key alias="editing">Editing</key>
|
||||
<key alias="expireDate">Remove at</key>
|
||||
<key alias="itemChanged">This item has been changed after publication</key>
|
||||
<key alias="itemNotPublished">This item is not published</key>
|
||||
<key alias="lastPublished">Last published</key>
|
||||
<key alias="mediatype">Media Type</key>
|
||||
<key alias="mediaLinks">Link to media item(s)</key>
|
||||
<key alias="membergroup">Member Group</key>
|
||||
<key alias="memberrole">Role</key>
|
||||
<key alias="membertype">Member Type</key>
|
||||
<key alias="noDate">No date chosen</key>
|
||||
<key alias="nodeName">Page Title</key>
|
||||
<key alias="otherElements">Properties</key>
|
||||
<key alias="parentNotPublished">This document is published but is not visible because the parent '%0%' is unpublished</key>
|
||||
<key alias="publish">Publish</key>
|
||||
<key alias="publishStatus">Publication Status</key>
|
||||
<key alias="releaseDate">Publish at</key>
|
||||
<key alias="removeDate">Clear Date</key>
|
||||
<key alias="sortDone">Sortorder is updated</key>
|
||||
<key alias="sortHelp">To sort the nodes, simply drag the nodes or click one of the column headers. You can select multiple nodes by holding the "shift" or "control" key while selecting</key>
|
||||
<key alias="statistics">Statistics</key>
|
||||
<key alias="titleOptional">Title (optional)</key>
|
||||
<key alias="type">Type</key>
|
||||
<key alias="unPublish">Unpublish</key>
|
||||
<key alias="updateDate">Last edited</key>
|
||||
<key alias="uploadClear">Remove file</key>
|
||||
<key alias="urls">Link to document</key>
|
||||
</area>
|
||||
<area alias="create">
|
||||
<key alias="chooseNode">Where do you want to create the new %0%</key>
|
||||
<key alias="createUnder">Create at</key>
|
||||
<key alias="updateData">Choose a type and a title</key>
|
||||
</area>
|
||||
<area alias="dashboard">
|
||||
<key alias="browser">Browse your website</key>
|
||||
<key alias="dontShowAgain">- Hide</key>
|
||||
<key alias="nothinghappens">If umbraco isn't opening, you might need to allow popups from this site</key>
|
||||
<key alias="openinnew">has opened in a new window</key>
|
||||
<key alias="restart">Restart</key>
|
||||
<key alias="visit">Visit</key>
|
||||
<key alias="welcome">Welcome</key>
|
||||
</area>
|
||||
<area alias="defaultdialogs">
|
||||
<key alias="anchorInsert">Name</key>
|
||||
<key alias="assignDomain">Manage hostnames</key>
|
||||
<key alias="closeThisWindow">Close this window</key>
|
||||
<key alias="confirmdelete">Are you sure you want to delete</key>
|
||||
<key alias="confirmdisable">Are you sure you want to disable</key>
|
||||
<key alias="confirmEmptyTrashcan">Please check this box to confirm deletion of %0% item(s)</key>
|
||||
<key alias="confirmlogout">Are you sure?</key>
|
||||
<key alias="confirmSure">Are you sure?</key>
|
||||
<key alias="cut">Cut</key>
|
||||
<key alias="editdictionary">Edit Dictionary Item</key>
|
||||
<key alias="editlanguage">Edit Language</key>
|
||||
<key alias="insertAnchor">Insert local link</key>
|
||||
<key alias="insertCharacter">Insert character</key>
|
||||
<key alias="insertgraphicheadline">Insert graphic headline</key>
|
||||
<key alias="insertimage">Insert picture</key>
|
||||
<key alias="insertlink">Insert link</key>
|
||||
<key alias="insertMacro">Click to add a Macro</key>
|
||||
<key alias="inserttable">Insert table</key>
|
||||
<key alias="lastEdited">Last Edited</key>
|
||||
<key alias="link">Link</key>
|
||||
<key alias="linkinternal">Internal link:</key>
|
||||
<key alias="linklocaltip">When using local links, insert "#" infront of link</key>
|
||||
<key alias="linknewwindow">Open in new window?</key>
|
||||
<key alias="macroContainerSettings">Macro Settings</key>
|
||||
<key alias="macroDoesNotHaveProperties">This macro does not contain any properties you can edit</key>
|
||||
<key alias="paste">Paste</key>
|
||||
<key alias="permissionsEdit">Edit Permissions for</key>
|
||||
<key alias="recycleBinDeleting">The items in the recycle bin is now being deleted. Please do not close this window while this operation takes place</key>
|
||||
<key alias="recycleBinIsEmpty">The recycle bin is now empty</key>
|
||||
<key alias="recycleBinWarning">When items are deleted from the recycle bin, they will be gone forever</key>
|
||||
<key alias="regexSearchError"><![CDATA[<a target='_blank' href='http://regexlib.com'>regexlib.com</a>'s webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.]]></key>
|
||||
<key alias="regexSearchHelp">Search for a regular expression to add validation to a form field. Exemple: 'email, 'zip-code' 'url'</key>
|
||||
<key alias="removeMacro">Remove Macro</key>
|
||||
<key alias="requiredField">Required Field</key>
|
||||
<key alias="sitereindexed">Site is reindexed</key>
|
||||
<key alias="siterepublished">The website cache has been refreshed. All publish content is now uptodate. While all unpublished content is still unpublished</key>
|
||||
<key alias="siterepublishHelp">The website cache will be refreshed. All published content will be updated, while unpublished content will stay unpublished.</key>
|
||||
<key alias="tableColumns">Number of columns</key>
|
||||
<key alias="tableRows">Number of rows</key>
|
||||
<key alias="templateContentAreaHelp">
|
||||
<![CDATA[<strong>Set a placeholder id</strong> by setting an ID on your placeholder you can inject content into this template from child templates,
|
||||
by refering this ID using a <code><asp:content /></code> element.]]>
|
||||
</key>
|
||||
<key alias="templateContentPlaceHolderHelp">
|
||||
<![CDATA[<strong>Select a placeholder id</strong> from the list below. You can only
|
||||
choose Id's from the current template's master.]]>
|
||||
</key>
|
||||
<key alias="thumbnailimageclickfororiginal">Click on the image to see full size</key>
|
||||
<key alias="treepicker">Pick item</key>
|
||||
<key alias="viewCacheItem">View Cache Item</key>
|
||||
</area>
|
||||
<area alias="dictionaryItem">
|
||||
<key alias="description">
|
||||
<![CDATA[
|
||||
Edit the different language versions for the dictionary item '<em>%0%</em>' below<br/>You can add additional languages under the 'languages' in the menu on the left
|
||||
]]>
|
||||
</key>
|
||||
<key alias="displayName">Culture Name</key>
|
||||
</area>
|
||||
<area alias="editcontenttype">
|
||||
<key alias="allowedchildnodetypes">Allowed child nodetypes</key>
|
||||
<key alias="create">Create</key>
|
||||
<key alias="deletetab">Delete tab</key>
|
||||
<key alias="description">Description</key>
|
||||
<key alias="newtab">New tab</key>
|
||||
<key alias="tab">Tab</key>
|
||||
<key alias="thumbnail">Thumbnail</key>
|
||||
</area>
|
||||
<area alias="editdatatype">
|
||||
<key alias="addPrevalue">Add prevalue</key>
|
||||
<key alias="dataBaseDatatype">Database datatype</key>
|
||||
<key alias="guid">Data Editor GUID</key>
|
||||
<key alias="renderControl">Render control</key>
|
||||
<key alias="rteButtons">Buttons</key>
|
||||
<key alias="rteEnableAdvancedSettings">Enable advanced settings for</key>
|
||||
<key alias="rteEnableContextMenu">Enable context menu</key>
|
||||
<key alias="rteMaximumDefaultImgSize">Maximum default size of inserted images</key>
|
||||
<key alias="rteRelatedStylesheets">Related stylesheets</key>
|
||||
<key alias="rteShowLabel">Show label</key>
|
||||
<key alias="rteWidthAndHeight">Width and height</key>
|
||||
</area>
|
||||
<area alias="errorHandling">
|
||||
<key alias="errorButDataWasSaved">Your data has been saved, but before you can publish this page there are some errors you need to fix first:</key>
|
||||
<key alias="errorChangingProviderPassword">The current MemberShip Provider does not support changing password (EnablePasswordRetrieval need to be true)</key>
|
||||
<key alias="errorExistsWithoutTab">%0% already exists</key>
|
||||
<key alias="errorHeader">There were errors:</key>
|
||||
<key alias="errorHeaderWithoutTab">There were errors:</key>
|
||||
<key alias="errorInPasswordFormat">The password should be a minimum of %0% characters long and contain at least %1% non-alpha numeric character(s)</key>
|
||||
<key alias="errorIntegerWithoutTab">%0% must be an integer</key>
|
||||
<key alias="errorMandatory">The %0% field in the %1% tab is mandatory</key>
|
||||
<key alias="errorMandatoryWithoutTab">%0% is a mandatory field</key>
|
||||
<key alias="errorRegExp">%0% at %1% is not in a correct format</key>
|
||||
<key alias="errorRegExpWithoutTab">%0% is not in a correct format</key>
|
||||
</area>
|
||||
<area alias="errors">
|
||||
<key alias="codemirroriewarning">NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough.</key>
|
||||
<key alias="contentTypeAliasAndNameNotNull">Please fill both alias and name on the new propertytype!</key>
|
||||
<key alias="filePermissionsError">There is a problem with read/write access to a specific file or folder</key>
|
||||
<key alias="missingTitle">Please enter a title</key>
|
||||
<key alias="missingType">Please choose a type</key>
|
||||
<key alias="pictureResizeBiggerThanOrg">You're about to make the picture larger than the original size. Are you sure that you want to proceed?</key>
|
||||
<key alias="pythonErrorHeader">Error in python script</key>
|
||||
<key alias="pythonErrorText">The python script has not been saved, because it contained error(s)</key>
|
||||
<key alias="startNodeDoesNotExists">Startnode deleted, please contact your administrator</key>
|
||||
<key alias="stylesMustMarkBeforeSelect">Please mark content before changing style</key>
|
||||
<key alias="stylesNoStylesOnPage">No active styles available</key>
|
||||
<key alias="tableColMergeLeft">Please place cursor at the left of the two cells you wish to merge</key>
|
||||
<key alias="tableSplitNotSplittable">You cannot split a cell that hasn't been merged.</key>
|
||||
<key alias="xsltErrorHeader">Error in xslt source</key>
|
||||
<key alias="xsltErrorText">The XSLT has not been saved, because it contained error(s)</key>
|
||||
</area>
|
||||
<area alias="general">
|
||||
<key alias="about">About</key>
|
||||
<key alias="action">Action</key>
|
||||
<key alias="add">Add</key>
|
||||
<key alias="alias">Alias</key>
|
||||
<key alias="areyousure">Are you sure?</key>
|
||||
<key alias="border">Border</key>
|
||||
<key alias="by">or</key>
|
||||
<key alias="cancel">Cancel</key>
|
||||
<key alias="cellMargin">Cell margin</key>
|
||||
<key alias="choose">Choose</key>
|
||||
<key alias="close">Close</key>
|
||||
<key alias="closewindow">Close Window</key>
|
||||
<key alias="comment">Comment</key>
|
||||
<key alias="confirm">Confirm</key>
|
||||
<key alias="constrainProportions">Constrain proportions</key>
|
||||
<key alias="continue">Continue</key>
|
||||
<key alias="copy">Copy</key>
|
||||
<key alias="create">Create</key>
|
||||
<key alias="database">Database</key>
|
||||
<key alias="date">Date</key>
|
||||
<key alias="default">Default</key>
|
||||
<key alias="delete">Delete</key>
|
||||
<key alias="deleted">Deleted</key>
|
||||
<key alias="deleting">Deleting...</key>
|
||||
<key alias="design">Design</key>
|
||||
<key alias="dimensions">Dimensions</key>
|
||||
<key alias="down">Down</key>
|
||||
<key alias="download">Download</key>
|
||||
<key alias="edit">Edit</key>
|
||||
<key alias="edited">Edited</key>
|
||||
<key alias="elements">Elements</key>
|
||||
<key alias="email">Email</key>
|
||||
<key alias="error">Error</key>
|
||||
<key alias="findDocument">Find</key>
|
||||
<key alias="height">Height</key>
|
||||
<key alias="help">Help</key>
|
||||
<key alias="icon">Icon</key>
|
||||
<key alias="import">Import</key>
|
||||
<key alias="innerMargin">Inner margin</key>
|
||||
<key alias="insert">Insert</key>
|
||||
<key alias="install">Install</key>
|
||||
<key alias="justify">Justify</key>
|
||||
<key alias="language">Language</key>
|
||||
<key alias="layout">Layout</key>
|
||||
<key alias="loading">Loading</key>
|
||||
<key alias="locked">Locked</key>
|
||||
<key alias="login">Login</key>
|
||||
<key alias="logoff">Log off</key>
|
||||
<key alias="logout">Logout</key>
|
||||
<key alias="macro">Macro</key>
|
||||
<key alias="move">Move</key>
|
||||
<key alias="name">Name</key>
|
||||
<key alias="new">New</key>
|
||||
<key alias="next">Next</key>
|
||||
<key alias="no">No</key>
|
||||
<key alias="of">of</key>
|
||||
<key alias="ok">OK</key>
|
||||
<key alias="open">Open</key>
|
||||
<key alias="or">or</key>
|
||||
<key alias="password">Password</key>
|
||||
<key alias="path">Path</key>
|
||||
<key alias="placeHolderID">Placeholder ID</key>
|
||||
<key alias="pleasewait">One moment please...</key>
|
||||
<key alias="previous">Previous</key>
|
||||
<key alias="properties">Properties</key>
|
||||
<key alias="reciept">Email to receive form data</key>
|
||||
<key alias="recycleBin">Recycle Bin</key>
|
||||
<key alias="remaining">Remaining</key>
|
||||
<key alias="rename">Rename</key>
|
||||
<key alias="renew">Renew</key>
|
||||
<key alias="retry">Retry</key>
|
||||
<key alias="rights">Permissions</key>
|
||||
<key alias="search">Search</key>
|
||||
<key alias="server">Server</key>
|
||||
<key alias="show">Show</key>
|
||||
<key alias="showPageOnSend">Show page on Send</key>
|
||||
<key alias="size">Size</key>
|
||||
<key alias="sort">Sort</key>
|
||||
<key alias="type">Type</key>
|
||||
<key alias="typeToSearch">Type to search...</key>
|
||||
<key alias="up">Up</key>
|
||||
<key alias="update">Update</key>
|
||||
<key alias="upgrade">Upgrade</key>
|
||||
<key alias="upload">Upload</key>
|
||||
<key alias="url">Url</key>
|
||||
<key alias="user">User</key>
|
||||
<key alias="username">Username</key>
|
||||
<key alias="value">Value</key>
|
||||
<key alias="view">View</key>
|
||||
<key alias="welcome">Welcome...</key>
|
||||
<key alias="width">Width</key>
|
||||
<key alias="yes">Yes</key>
|
||||
<key alias="folder">Folder</key>
|
||||
</area>
|
||||
<area alias="graphicheadline">
|
||||
<key alias="backgroundcolor">Background color</key>
|
||||
<key alias="bold">Bold</key>
|
||||
<key alias="color">Text color</key>
|
||||
<key alias="font">Font</key>
|
||||
<key alias="text">Text</key>
|
||||
</area>
|
||||
<area alias="headers">
|
||||
<key alias="page">Page</key>
|
||||
</area>
|
||||
<area alias="installer">
|
||||
<key alias="databaseErrorCannotConnect">The installer cannot connect to the database.</key>
|
||||
<key alias="databaseErrorWebConfig">Could not save the web.config file. Please modify the connection string manually.</key>
|
||||
<key alias="databaseFound">Your database has been found and is identified as</key>
|
||||
<key alias="databaseHeader">Database configuration</key>
|
||||
<key alias="databaseInstall">
|
||||
<![CDATA[
|
||||
Press the <strong>install</strong> button to install the Umbraco %0% database
|
||||
]]>
|
||||
</key>
|
||||
<key alias="databaseInstallDone"><![CDATA[Umbraco %0% has now been copied to your database. Press <strong>Next</strong> to proceed.]]></key>
|
||||
<key alias="databaseNotFound">
|
||||
<![CDATA[<p>Database not found! Please check that the information in the "connection string" of the “web.config” file is correct.</p>
|
||||
<p>To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "umbracoDbDSN" and save the file. </p>
|
||||
<p>
|
||||
Click the <strong>retry</strong> button when
|
||||
done.<br /><a href="http://umbraco.org/redir/installWebConfig" target="_blank">
|
||||
More information on editing web.config here.</a></p>]]>
|
||||
</key>
|
||||
<key alias="databaseText">
|
||||
<![CDATA[To complete this step, you must know some information regarding your database server ("connection string").<br />
|
||||
Please contact your ISP if necessary.
|
||||
If you're installing on a local machine or server you might need information from your system administrator.]]>
|
||||
</key>
|
||||
<key alias="databaseUpgrade">
|
||||
<![CDATA[
|
||||
<p>
|
||||
Press the <strong>upgrade</strong> button to upgrade your database to Umbraco %0%</p>
|
||||
<p>
|
||||
Don't worry - no content will be deleted and everything will continue working afterwards!
|
||||
</p>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="databaseUpgradeDone">
|
||||
<![CDATA[Your database has been upgraded to the final version %0%.<br />Press <strong>Next</strong> to
|
||||
proceed. ]]>
|
||||
</key>
|
||||
<key alias="databaseUpToDate"><![CDATA[Your current database is up-to-date!. Click <strong>next</strong> to continue the configuration wizard]]></key>
|
||||
<key alias="defaultUserChangePass"><![CDATA[<strong>The Default users’ password needs to be changed!</strong>]]></key>
|
||||
<key alias="defaultUserDisabled"><![CDATA[<strong>The Default user has been disabled or has no access to umbraco!</strong></p><p>No further actions needs to be taken. Click <b>Next</b> to proceed.]]></key>
|
||||
<key alias="defaultUserPassChanged"><![CDATA[<strong>The Default user's password has been successfully changed since the installation!</strong></p><p>No further actions needs to be taken. Click <strong>Next</strong> to proceed.]]></key>
|
||||
<key alias="defaultUserPasswordChanged">The password is changed!</key>
|
||||
<key alias="defaultUserText">
|
||||
<![CDATA[
|
||||
<p>
|
||||
umbraco creates a default user with a login <strong>('admin')</strong> and password <strong>('default')</strong>. It's <strong>important</strong> that the password is
|
||||
changed to something unique.
|
||||
</p>
|
||||
<p>
|
||||
This step will check the default user's password and suggest if it needs to be changed.
|
||||
</p>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="greatStart">Get a great start, watch our introduction videos</key>
|
||||
<key alias="licenseText">By clicking the next button (or modifying the umbracoConfigurationStatus in web.config), you accept the license for this software as specified in the box below. Notice that this umbraco distribution consists of two different licenses, the open source MIT license for the framework and the umbraco freeware license that covers the UI.</key>
|
||||
<key alias="None">Not installed yet.</key>
|
||||
<key alias="permissionsAffectedFolders">Affected files and folders</key>
|
||||
<key alias="permissionsAffectedFoldersMoreInfo">More information on setting up permissions for umbraco here</key>
|
||||
<key alias="permissionsAffectedFoldersText">You need to grant ASP.NET modify permissions to the following files/folders</key>
|
||||
<key alias="permissionsAlmostPerfect">
|
||||
<![CDATA[<strong>Your permission settings are almost perfect!</strong><br /><br />
|
||||
You can run umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of umbraco.]]>
|
||||
</key>
|
||||
<key alias="permissionsHowtoResolve">How to Resolve</key>
|
||||
<key alias="permissionsHowtoResolveLink">Click here to read the text version</key>
|
||||
<key alias="permissionsHowtoResolveText"><![CDATA[Watch our <strong>video tutorial</strong> on setting up folder permissions for umbraco or read the text version.]]></key>
|
||||
<key alias="permissionsMaybeAnIssue">
|
||||
<![CDATA[<strong>Your permission settings might be an issue!</strong>
|
||||
<br/><br />
|
||||
You can run umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of umbraco.]]>
|
||||
</key>
|
||||
<key alias="permissionsNotReady">
|
||||
<![CDATA[<strong>Your permission settings are not ready for umbraco!</strong>
|
||||
<br /><br />
|
||||
In order to run umbraco, you'll need to update your permission settings.]]>
|
||||
</key>
|
||||
<key alias="permissionsPerfect">
|
||||
<![CDATA[<strong>Your permission settings are perfect!</strong><br /><br />
|
||||
You are ready to run umbraco and install packages!]]>
|
||||
</key>
|
||||
<key alias="permissionsResolveFolderIssues">Resolving folder issue</key>
|
||||
<key alias="permissionsResolveFolderIssuesLink">Follow this link for more information on problems with ASP.NET and creating folders</key>
|
||||
<key alias="permissionsSettingUpPermissions">Setting up folder permissions</key>
|
||||
<key alias="permissionsText">
|
||||
<![CDATA[
|
||||
umbraco needs write/modify access to certain directories in order to store files like pictures and PDF's.
|
||||
It also stores temporary data (aka: cache) for enhancing the performance of your website.
|
||||
]]>
|
||||
</key>
|
||||
<key alias="runwayFromScratch">I want to start from scratch</key>
|
||||
<key alias="runwayFromScratchText">
|
||||
<![CDATA[
|
||||
Your website is completely empty at the moment, so that’s perfect if you want to start from scratch and create your own document types and templates.
|
||||
(<a href="http://umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">learn how</a>)
|
||||
You can still choose to install Runway later on. Please go to the Developer section and choose Packages.
|
||||
]]>
|
||||
</key>
|
||||
<key alias="runwayHeader">You’ve just set up a clean Umbraco platform. What do you want to do next?</key>
|
||||
<key alias="runwayInstalled">Runway is installed</key>
|
||||
<key alias="runwayInstalledText">
|
||||
<![CDATA[
|
||||
You have the foundation in place. Select what modules you wish to install on top of it.<br />
|
||||
This is our list of recommended modules, check off the ones you would like to install, or view the <a href="#" onclick="toggleModules(); return false;" id="toggleModuleList">full list of modules</a>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="runwayOnlyProUsers">Only recommended for experienced users</key>
|
||||
<key alias="runwaySimpleSite">I want to start with a simple website</key>
|
||||
<key alias="runwaySimpleSiteText">
|
||||
<![CDATA[
|
||||
<p>
|
||||
"Runway" is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically,
|
||||
but you can easily edit, extend or remove it. It’s not necessary and you can perfectly use Umbraco without it. However,
|
||||
Runway offers an easy foundation based on best practices to get you started faster than ever.
|
||||
If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.
|
||||
</p>
|
||||
<small>
|
||||
<em>Included with Runway:</em> Home page, Getting Started page, Installing Modules page.<br />
|
||||
<em>Optional Modules:</em> Top Navigation, Sitemap, Contact, Gallery.
|
||||
</small>
|
||||
]]>
|
||||
</key>
|
||||
<key alias="runwayWhatIsRunway">What is Runway</key>
|
||||
<key alias="step1">Step 1/5 Accept license</key>
|
||||
<key alias="step2">Step 2/5: Database configuration</key>
|
||||
<key alias="step3">Step 3/5: Validating File Permissions</key>
|
||||
<key alias="step4">Step 4/5: Check umbraco security</key>
|
||||
<key alias="step5">Step 5/5: Umbraco is ready to get you started</key>
|
||||
<key alias="thankYou">Thank you for choosing umbraco</key>
|
||||
<key alias="theEndBrowseSite">
|
||||
<![CDATA[<h3>Browse your new site</h3>
|
||||
You installed Runway, so why not see how your new website looks.]]>
|
||||
</key>
|
||||
<key alias="theEndFurtherHelp">
|
||||
<![CDATA[<h3>Further help and information</h3>
|
||||
Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the umbraco terminology]]>
|
||||
</key>
|
||||
<key alias="theEndHeader">Umbraco %0% is installed and ready for use</key>
|
||||
<key alias="theEndInstallFailed">
|
||||
<![CDATA[To finish the installation, you'll need to
|
||||
manually edit the <strong>/web.config file</strong> and update the AppSetting key <strong>umbracoConfigurationStatus</strong> in the bottom to the value of <strong>'%0%'</strong>.]]>
|
||||
</key>
|
||||
<key alias="theEndInstallSuccess">
|
||||
<![CDATA[You can get <strong>started instantly</strong> by clicking the "Launch Umbraco" button below. <br />If you are <strong>new to umbraco</strong>,
|
||||
you can find plenty of resources on our getting started pages.]]>
|
||||
</key>
|
||||
<key alias="theEndOpenUmbraco">
|
||||
<![CDATA[<h3>Launch Umbraco</h3>
|
||||
To manage your website, simply open the umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]>
|
||||
</key>
|
||||
<key alias="Unavailable">Connection to database failed.</key>
|
||||
<key alias="Version3">Umbraco Version 3</key>
|
||||
<key alias="Version4">Umbraco Version 4</key>
|
||||
<key alias="watch">Watch</key>
|
||||
<key alias="welcomeIntro">
|
||||
<![CDATA[This wizard will guide you through the process of configuring <strong>umbraco %0%</strong> for a fresh install or upgrading from version 3.0.
|
||||
<br /><br />
|
||||
Press <strong>"next"</strong> to start the wizard.]]>
|
||||
</key>
|
||||
</area>
|
||||
<area alias="language">
|
||||
<key alias="cultureCode">Culture Code</key>
|
||||
<key alias="displayName">Culture Name</key>
|
||||
</area>
|
||||
<area alias="lockout">
|
||||
<key alias="lockoutWillOccur">You've been idle and logout will automatically occur in</key>
|
||||
<key alias="renewSession">Renew now to save your work</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="bottomText"><![CDATA[<p style="text-align:right;">© 2001 - %0% <br /><a href="http://umbraco.org" style="text-decoration: none" target="_blank">umbraco.org</a></p> ]]></key>
|
||||
<key alias="topText">Welcome to umbraco, type your username and password in the boxes below:</key>
|
||||
</area>
|
||||
<area alias="main">
|
||||
<key alias="dashboard">Dashboard</key>
|
||||
<key alias="sections">Sections</key>
|
||||
<key alias="tree">Content</key>
|
||||
</area>
|
||||
<area alias="moveOrCopy">
|
||||
<key alias="choose">Choose page above...</key>
|
||||
<key alias="copyDone">%0% has been copied to %1%</key>
|
||||
<key alias="copyTo">Select where the document %0% should be copied to below</key>
|
||||
<key alias="moveDone">%0% has been moved to %1%</key>
|
||||
<key alias="moveTo">Select where the document %0% should be moved to below</key>
|
||||
<key alias="nodeSelected">has been selected as the root of your new content, click 'ok' below.</key>
|
||||
<key alias="noNodeSelected">No node selected yet, please select a node in the list above before clicking 'ok'</key>
|
||||
<key alias="notAllowedByContentType">The current node is not allowed under the chosen node because of its type</key>
|
||||
<key alias="notAllowedByPath">The current node cannot be moved to one of its subpages</key>
|
||||
<key alias="notValid">The action isn't allowed since you have insufficient permissions on 1 or more child documents.</key>
|
||||
<key alias="relateToOriginal">Relate copied items to original</key>
|
||||
</area>
|
||||
<area alias="notifications">
|
||||
<key alias="editNotifications">Edit your notification for %0%</key>
|
||||
<key alias="mailBody">
|
||||
<![CDATA[
|
||||
Hi %0%
|
||||
|
||||
This is an automated mail to inform you that the task '%1%'
|
||||
has been performed on the page '%2%'
|
||||
by the user '%3%'
|
||||
|
||||
Go to http://%4%/actions/editContent.aspx?id=%5% to edit.
|
||||
|
||||
Have a nice day!
|
||||
|
||||
Cheers from the umbraco robot
|
||||
]]>
|
||||
</key>
|
||||
<key alias="mailBodyHtml">
|
||||
<![CDATA[<p>Hi %0%</p>
|
||||
|
||||
<p>This is an automated mail to inform you that the task <strong>'%1%'</strong>
|
||||
has been performed on the page <a href="%7%"><strong>'%2%'</strong></a>
|
||||
by the user <strong>'%3%'</strong>
|
||||
</p>
|
||||
<div style="margin: 8px 0; padding: 8px; display: block;">
|
||||
<br />
|
||||
<a style="color: white; font-weight: bold; background-color: #66cc66; text-decoration : none; margin-right: 20px; border: 8px solid #66cc66; width: 150px;" href="http://%4%/actions/publish.aspx?id=%5%"> PUBLISH </a>
|
||||
<a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/actions/editContent.aspx?id=%5%"> EDIT </a>
|
||||
<a style="color: white; font-weight: bold; background-color: #ca4a4a; text-decoration : none; margin-right: 20px; border: 8px solid #ca4a4a; width: 150px;" href="http://%4%/actions/delete.aspx?id=%5%"> DELETE </a>
|
||||
<br />
|
||||
</div>
|
||||
<p>
|
||||
<h3>Update summary:</h3>
|
||||
<table style="width: 100%;">
|
||||
%6%
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<div style="margin: 8px 0; padding: 8px; display: block;">
|
||||
<br />
|
||||
<a style="color: white; font-weight: bold; background-color: #66cc66; text-decoration : none; margin-right: 20px; border: 8px solid #66cc66; width: 150px;" href="http://%4%/actions/publish.aspx?id=%5%"> PUBLISH </a>
|
||||
<a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/actions/editContent.aspx?id=%5%"> EDIT </a>
|
||||
<a style="color: white; font-weight: bold; background-color: #ca4a4a; text-decoration : none; margin-right: 20px; border: 8px solid #ca4a4a; width: 150px;" href="http://%4%/actions/delete.aspx?id=%5%"> DELETE </a>
|
||||
<br />
|
||||
</div>
|
||||
|
||||
<p>Have a nice day!<br /><br />
|
||||
Cheers from the umbraco robot
|
||||
</p>]]>
|
||||
</key>
|
||||
<key alias="mailSubject">[%0%] Notification about %1% performed on %2%</key>
|
||||
<key alias="notifications">Notifications</key>
|
||||
</area>
|
||||
<area alias="packager">
|
||||
<key alias="chooseLocalPackageText">
|
||||
<![CDATA[
|
||||
Choose Package from your machine, by clicking the Browse<br />
|
||||
button and locating the package. umbraco packages usually have a ".umb" or ".zip" extension.
|
||||
]]>
|
||||
</key>
|
||||
<key alias="packageAuthor">Author</key>
|
||||
<key alias="packageDemonstration">Demonstration</key>
|
||||
<key alias="packageDocumentation">Documentation</key>
|
||||
<key alias="packageMetaData">Package meta data</key>
|
||||
<key alias="packageName">Package name</key>
|
||||
<key alias="packageNoItemsHeader">Package doesn't contain any items</key>
|
||||
<key alias="packageNoItemsText">
|
||||
<![CDATA[This package file doesn't contain any items to uninstall.<br/><br/>
|
||||
You can safely remove this from the system by clicking "uninstall package" below.]]>
|
||||
</key>
|
||||
<key alias="packageNoUpgrades">No upgrades available</key>
|
||||
<key alias="packageOptions">Package options</key>
|
||||
<key alias="packageReadme">Package readme</key>
|
||||
<key alias="packageRepository">Package repository</key>
|
||||
<key alias="packageUninstallConfirm">Confirm uninstall</key>
|
||||
<key alias="packageUninstalledHeader">Package was uninstalled</key>
|
||||
<key alias="packageUninstalledText">The package was successfully uninstalled</key>
|
||||
<key alias="packageUninstallHeader">Uninstall package</key>
|
||||
<key alias="packageUninstallText">
|
||||
<![CDATA[You can unselect items you do not wish to remove, at this time, below. When you click "confirm uninstall" all checked-off items will be removed.<br />
|
||||
<span style="color: Red; font-weight: bold;">Notice:</span> any documents, media etc depending on the items you remove, will stop working, and could lead to system instability,
|
||||
so uninstall with caution. If in doubt, contact the package author.]]>
|
||||
</key>
|
||||
<key alias="packageUpgradeDownload">Download update from the repository</key>
|
||||
<key alias="packageUpgradeHeader">Upgrade package</key>
|
||||
<key alias="packageUpgradeInstructions">Upgrade instructions</key>
|
||||
<key alias="packageUpgradeText"> There's an upgrade available for this package. You can download it directly from the umbraco package repository.</key>
|
||||
<key alias="packageVersion">Package version</key>
|
||||
<key alias="viewPackageWebsite">View package website</key>
|
||||
</area>
|
||||
<area alias="paste">
|
||||
<key alias="doNothing">Paste with full formatting (Not recommended)</key>
|
||||
<key alias="errorMessage">The text you're trying to paste contains special characters or formatting. This could be caused by copying text from Microsoft Word. umbraco can remove special characters or formatting automatically, so the pasted content will be more suitable for the web.</key>
|
||||
<key alias="removeAll">Paste as raw text without any formatting at all</key>
|
||||
<key alias="removeSpecialFormattering">Paste, but remove formatting (Recommended)</key>
|
||||
</area>
|
||||
<area alias="publicAccess">
|
||||
<key alias="paAdvanced">Role based protection</key>
|
||||
<key alias="paAdvancedHelp"><![CDATA[If you wish to control access to the page using role-based authentication,<br /> using umbraco's member groups.]]></key>
|
||||
<key alias="paAdvancedNoGroups"><![CDATA[You need to create a membergroup before you can use <br />role-based authentication.]]></key>
|
||||
<key alias="paErrorPage">Error Page</key>
|
||||
<key alias="paErrorPageHelp">Used when people are logged on, but do not have access</key>
|
||||
<key alias="paHowWould">Choose how to restict access to this page</key>
|
||||
<key alias="paIsProtected">%0% is now protected</key>
|
||||
<key alias="paIsRemoved">Protection removed from %0%</key>
|
||||
<key alias="paLoginPage">Login Page</key>
|
||||
<key alias="paLoginPageHelp">Choose the page that has the login formular</key>
|
||||
<key alias="paRemoveProtection">Remove Protection</key>
|
||||
<key alias="paSelectPages">Select the pages that contain login form and error messages</key>
|
||||
<key alias="paSelectRoles">Pick the roles who have access to this page</key>
|
||||
<key alias="paSetLogin">Set the login and password for this page</key>
|
||||
<key alias="paSimple">Single user protection</key>
|
||||
<key alias="paSimpleHelp">If you just want to setup simple protection using a single login and password</key>
|
||||
</area>
|
||||
<area alias="publish">
|
||||
<key alias="contentPublishedFailedByEvent">
|
||||
<![CDATA[
|
||||
%0% could not be published, due to a 3rd party extension cancelling the action.
|
||||
]]>
|
||||
</key>
|
||||
<key alias="contentPublishedFailedByParent">
|
||||
<![CDATA[
|
||||
%0% can not be published, because a parent page is not published.
|
||||
]]>
|
||||
</key>
|
||||
<key alias="includeUnpublished">Include unpublished child pages</key>
|
||||
<key alias="inProgress">Publishing in progress - please wait...</key>
|
||||
<key alias="inProgressCounter">%0% out of %1% pages have been published...</key>
|
||||
<key alias="nodePublish">%0% has been published</key>
|
||||
<key alias="nodePublishAll">%0% and subpages have been published</key>
|
||||
<key alias="publishAll">Publish %0% and all its subpages</key>
|
||||
<key alias="publishHelp">
|
||||
<![CDATA[Click <em>ok</em> to publish <strong>%0%</strong> and thereby making it's content publicly available.<br/><br />
|
||||
You can publish this page and all it's sub-pages by checking <em>publish all children</em> below.
|
||||
]]>
|
||||
</key>
|
||||
</area>
|
||||
<area alias="relatedlinks">
|
||||
<key alias="addExternal">Add external link</key>
|
||||
<key alias="addInternal">Add internal link</key>
|
||||
<key alias="addlink">Add</key>
|
||||
<key alias="caption">Caption</key>
|
||||
<key alias="internalPage">Internal page</key>
|
||||
<key alias="linkurl">URL</key>
|
||||
<key alias="modeDown">Move Down</key>
|
||||
<key alias="modeUp">Move Up</key>
|
||||
<key alias="newWindow">Open in new window</key>
|
||||
<key alias="removeLink">Remove link</key>
|
||||
</area>
|
||||
<area alias="rollback">
|
||||
<key alias="currentVersion">Current version</key>
|
||||
<key alias="diffHelp"><![CDATA[This shows the differences between the current version and the selected version<br /><del>Red</del> text will not be shown in the selected version. , <ins>green means added</ins>]]></key>
|
||||
<key alias="documentRolledBack">Document has been rolled back</key>
|
||||
<key alias="htmlHelp">This displays the selected version as html, if you wish to see the difference between 2 versions at the same time, use the diff view</key>
|
||||
<key alias="rollbackTo">Rollback to</key>
|
||||
<key alias="selectVersion">Select version</key>
|
||||
<key alias="view">View</key>
|
||||
</area>
|
||||
<area alias="scripts">
|
||||
<key alias="editscript">Edit script file</key>
|
||||
</area>
|
||||
<area alias="sections">
|
||||
<key alias="concierge">Concierge</key>
|
||||
<key alias="content">Content</key>
|
||||
<key alias="courier">Courier</key>
|
||||
<key alias="developer">Developer</key>
|
||||
<key alias="installer">Umbraco Configuration Wizard</key>
|
||||
<key alias="media">Media</key>
|
||||
<key alias="member">Members</key>
|
||||
<key alias="newsletters">Newsletters</key>
|
||||
<key alias="settings">Settings</key>
|
||||
<key alias="statistics">Statistics</key>
|
||||
<key alias="translation">Translation</key>
|
||||
<key alias="users">Users</key>
|
||||
</area>
|
||||
<area alias="settings">
|
||||
<key alias="defaulttemplate">Default template</key>
|
||||
<key alias="dictionary editor egenskab">Dictionary Key</key>
|
||||
<key alias="importDocumentTypeHelp">To import a document type, find the ".udt" file on your computer by clicking the "Browse" button and click "Import" (you'll be asked for confirmation on the next screen)</key>
|
||||
<key alias="newtabname">New Tab Title</key>
|
||||
<key alias="nodetype">Nodetype</key>
|
||||
<key alias="objecttype">Type</key>
|
||||
<key alias="stylesheet">Stylesheet</key>
|
||||
<key alias="stylesheet editor egenskab">Stylesheet property</key>
|
||||
<key alias="tab">Tab</key>
|
||||
<key alias="tabname">Tab Title</key>
|
||||
<key alias="tabs">Tabs</key>
|
||||
<key alias="contentTypeEnabled">Master Content Type enabled</key>
|
||||
<key alias="contentTypeUses">This Content Type uses</key>
|
||||
<key alias="asAContentMasterType">as a Master Content Type. Tabs from Master Content Types are not shown and can only be edited on the Master Content Type itself</key>
|
||||
</area>
|
||||
<area alias="sort">
|
||||
<key alias="sortDone">Sorting complete.</key>
|
||||
<key alias="sortHelp">Drag the different items up or down below to set how they should be arranged. Or click the column headers to sort the entire collection of items</key>
|
||||
<key alias="sortPleaseWait"><![CDATA[ Please wait. Items are being sorted, this can take a while.<br/> <br/> Do not close this window during sorting]]></key>
|
||||
</area>
|
||||
<area alias="speechBubbles">
|
||||
<key alias="contentPublishedFailedByEvent">Publising was cancelled by a 3rd party add-in</key>
|
||||
<key alias="contentTypeDublicatePropertyType">Property type already exists</key>
|
||||
<key alias="contentTypePropertyTypeCreated">Property type created</key>
|
||||
<key alias="contentTypePropertyTypeCreatedText"><![CDATA[Name: %0% <br /> DataType: %1%]]></key>
|
||||
<key alias="contentTypePropertyTypeDeleted">Propertytype deleted</key>
|
||||
<key alias="contentTypeSavedHeader">Document Type saved</key>
|
||||
<key alias="contentTypeTabCreated">Tab created</key>
|
||||
<key alias="contentTypeTabDeleted">Tab deleted</key>
|
||||
<key alias="contentTypeTabDeletedText">Tab with id: %0% deleted</key>
|
||||
<key alias="cssErrorHeader">Stylesheet not saved</key>
|
||||
<key alias="cssSavedHeader">Stylesheet saved</key>
|
||||
<key alias="cssSavedText">Stylesheet saved without any errors</key>
|
||||
<key alias="dataTypeSaved">Datatype saved</key>
|
||||
<key alias="dictionaryItemSaved">Dictionary item saved</key>
|
||||
<key alias="editContentPublishedFailedByParent">Publising failed because the parent page isn't published</key>
|
||||
<key alias="editContentPublishedHeader">Content published</key>
|
||||
<key alias="editContentPublishedText">and visible at the website</key>
|
||||
<key alias="editContentSavedHeader">Content saved</key>
|
||||
<key alias="editContentSavedText">Remember to publish to make changes visible</key>
|
||||
<key alias="editContentSendToPublish">Sent For Approval</key>
|
||||
<key alias="editContentSendToPublishText">Changes have been sent for approval</key>
|
||||
<key alias="editMemberSaved">Member saved</key>
|
||||
<key alias="editStylesheetPropertySaved">Stylesheet Property Saved</key>
|
||||
<key alias="editStylesheetSaved">Stylesheet saved</key>
|
||||
<key alias="editTemplateSaved">Template saved</key>
|
||||
<key alias="editUserError">Error saving user (check log)</key>
|
||||
<key alias="editUserSaved">User Saved</key>
|
||||
<key alias="editUserTypeSaved">User type saved</key>
|
||||
<key alias="fileErrorHeader">File not saved</key>
|
||||
<key alias="fileErrorText">file could not be saved. Please check file permissions</key>
|
||||
<key alias="fileSavedHeader">File saved</key>
|
||||
<key alias="fileSavedText">File saved without any errors</key>
|
||||
<key alias="languageSaved">Language saved</key>
|
||||
<key alias="pythonErrorHeader">Python script not saved</key>
|
||||
<key alias="pythonErrorText">Python script could not be saved due to error</key>
|
||||
<key alias="pythonSavedHeader">Python script saved</key>
|
||||
<key alias="pythonSavedText">No errors in python script</key>
|
||||
<key alias="templateErrorHeader">Template not saved</key>
|
||||
<key alias="templateErrorText">Please make sure that you do not have 2 templates with the same alias</key>
|
||||
<key alias="templateSavedHeader">Template saved</key>
|
||||
<key alias="templateSavedText">Template saved without any errors!</key>
|
||||
<key alias="xsltErrorHeader">Xslt not saved</key>
|
||||
<key alias="xsltErrorText">Xslt contained an error</key>
|
||||
<key alias="xsltPermissionErrorText">Xslt could not be saved, check file permissions</key>
|
||||
<key alias="xsltSavedHeader">Xslt saved</key>
|
||||
<key alias="xsltSavedText">No errors in xslt</key>
|
||||
<key alias="partialViewSavedHeader">Partial view saved</key>
|
||||
<key alias="partialViewSavedText">Partial view saved without any errors!</key>
|
||||
<key alias="partialViewErrorHeader">Partial view not saved</key>
|
||||
<key alias="partialViewErrorText">An error occurred saving the file.</key>
|
||||
</area>
|
||||
<area alias="stylesheet">
|
||||
<key alias="aliasHelp">Uses CSS syntax ex: h1, .redHeader, .blueTex</key>
|
||||
<key alias="editstylesheet">Edit stylesheet</key>
|
||||
<key alias="editstylesheetproperty">Edit stylesheet property</key>
|
||||
<key alias="nameHelp">Name to identify the style property in the rich text editor </key>
|
||||
<key alias="preview">Preview</key>
|
||||
<key alias="styles">Styles</key>
|
||||
</area>
|
||||
<area alias="template">
|
||||
<key alias="edittemplate">Edit template</key>
|
||||
<key alias="insertContentArea">Insert content area</key>
|
||||
<key alias="insertContentAreaPlaceHolder">Insert content area placeholder</key>
|
||||
<key alias="insertDictionaryItem">Insert dictionary item</key>
|
||||
<key alias="insertMacro">Insert Macro</key>
|
||||
<key alias="insertPageField">Insert umbraco page field</key>
|
||||
<key alias="mastertemplate">Master template</key>
|
||||
<key alias="quickGuide">Quick Guide to umbraco template tags</key>
|
||||
<key alias="template">Template</key>
|
||||
</area>
|
||||
<area alias="templateEditor">
|
||||
<key alias="alternativeField">Alternative field</key>
|
||||
<key alias="alternativeText">Alternative Text</key>
|
||||
<key alias="casing">Casing</key>
|
||||
<key alias="chooseField">Choose field</key>
|
||||
<key alias="convertLineBreaks">Convert Linebreaks</key>
|
||||
<key alias="convertLineBreaksHelp">Replaces linebreaks with html-tag &lt;br&gt;</key>
|
||||
<key alias="customFields">Custom Fields</key>
|
||||
<key alias="dateOnly">Yes, Date only</key>
|
||||
<key alias="formatAsDate">Format as date</key>
|
||||
<key alias="htmlEncode">HTML encode</key>
|
||||
<key alias="htmlEncodeHelp">Will replace special characters by their HTML equivalent.</key>
|
||||
<key alias="insertedAfter">Will be inserted after the field value</key>
|
||||
<key alias="insertedBefore">Will be inserted before the field value</key>
|
||||
<key alias="lowercase">Lowercase</key>
|
||||
<key alias="none">None</key>
|
||||
<key alias="postContent">Insert after field</key>
|
||||
<key alias="preContent">Insert before field</key>
|
||||
<key alias="recursive">Recursive</key>
|
||||
<key alias="removeParagraph">Remove Paragraph tags</key>
|
||||
<key alias="removeParagraphHelp">Will remove any &lt;P&gt; in the beginning and end of the text</key>
|
||||
<key alias="standardFields">Standard Fields</key>
|
||||
<key alias="uppercase">Uppercase</key>
|
||||
<key alias="urlEncode">URL encode</key>
|
||||
<key alias="urlEncodeHelp">Will format special characters in URLs</key>
|
||||
<key alias="usedIfAllEmpty">Will only be used when the field values above are empty</key>
|
||||
<key alias="usedIfEmpty">This field will only be used if the primary field is empty</key>
|
||||
<key alias="withTime">Yes, with time. Seperator: </key>
|
||||
</area>
|
||||
<area alias="translation">
|
||||
<key alias="assignedTasks">Tasks assigned to you</key>
|
||||
<key alias="assignedTasksHelp">
|
||||
<![CDATA[ The list below shows translation tasks <strong>assigned to you</strong>. To see a detailed view including comments, click on "Details" or just the page name.
|
||||
You can also download the page as XML directly by clicking the "Download Xml" link. <br/>
|
||||
To close a translation task, please go to the Details view and click the "Close" button.
|
||||
]]>
|
||||
</key>
|
||||
<key alias="closeTask">close task</key>
|
||||
<key alias="details">Translation details</key>
|
||||
<key alias="downloadAllAsXml">Download all translation tasks as xml</key>
|
||||
<key alias="downloadTaskAsXml">Download xml</key>
|
||||
<key alias="DownloadXmlDTD">Download xml DTD</key>
|
||||
<key alias="fields">Fields</key>
|
||||
<key alias="includeSubpages">Include subpages</key>
|
||||
<key alias="mailBody">
|
||||
<![CDATA[
|
||||
Hi %0%
|
||||
|
||||
This is an automated mail to inform you that the document '%1%'
|
||||
has been requested for translation into '%5%' by %2%.
|
||||
|
||||
Go to http://%3%/translation/details.aspx?id=%4% to edit.
|
||||
|
||||
Or log into umbraco to get an overview of your translation tasks
|
||||
http://%3%/umbraco.aspx
|
||||
|
||||
Have a nice day!
|
||||
|
||||
Cheers from the umbraco robot
|
||||
]]>
|
||||
</key>
|
||||
<key alias="mailSubject">[%0%] Translation task for %1%</key>
|
||||
<key alias="noTranslators">No translator users found. Please create a translator user before you start sending content to translation</key>
|
||||
<key alias="ownedTasks">Tasks created by you</key>
|
||||
<key alias="ownedTasksHelp">
|
||||
<![CDATA[ The list below shows pages <strong>created by you</strong>. To see a detailed view including comments,
|
||||
click on "Details" or just the page name. You can also download the page as XML directly by clicking the "Download Xml" link.
|
||||
To close a translation task, please go to the Details view and click the "Close" button.
|
||||
]]>
|
||||
</key>
|
||||
<key alias="pageHasBeenSendToTranslation">The page '%0%' has been send to translation</key>
|
||||
<key alias="sendToTranslate">Send the page '%0%' to translation</key>
|
||||
<key alias="taskAssignedBy">Assigned by</key>
|
||||
<key alias="taskOpened">Task opened</key>
|
||||
<key alias="totalWords">Total words</key>
|
||||
<key alias="translateTo">Translate to</key>
|
||||
<key alias="translationDone">Translation completed.</key>
|
||||
<key alias="translationDoneHelp">You can preview the pages, you've just translated, by clicking below. If the original page is found, you will get a comparison of the 2 pages.</key>
|
||||
<key alias="translationFailed">Translation failed, the xml file might be corrupt</key>
|
||||
<key alias="translationOptions">Translation options</key>
|
||||
<key alias="translator">Translator</key>
|
||||
<key alias="uploadTranslationXml">Upload translation xml</key>
|
||||
</area>
|
||||
<area alias="treeHeaders">
|
||||
<key alias="cacheBrowser">Cache Browser</key>
|
||||
<key alias="contentRecycleBin">Recycle Bin</key>
|
||||
<key alias="createdPackages">Created packages</key>
|
||||
<key alias="datatype">Data Types</key>
|
||||
<key alias="dictionary">Dictionary</key>
|
||||
<key alias="installedPackages">Installed packages</key>
|
||||
<key alias="installSkin">Install skin</key>
|
||||
<key alias="installStarterKit">Install starter kit</key>
|
||||
<key alias="languages">Languages</key>
|
||||
<key alias="localPackage">Install local package</key>
|
||||
<key alias="macros">Macros</key>
|
||||
<key alias="mediaTypes">Media Types</key>
|
||||
<key alias="member">Members</key>
|
||||
<key alias="memberGroup">Member Groups</key>
|
||||
<key alias="memberRoles">Roles</key>
|
||||
<key alias="memberType">Member Types</key>
|
||||
<key alias="nodeTypes">Document Types</key>
|
||||
<key alias="packager">Packages</key>
|
||||
<key alias="packages">Packages</key>
|
||||
<key alias="python">Python Files</key>
|
||||
<key alias="repositories">Install from repository</key>
|
||||
<key alias="runway">Install Runway</key>
|
||||
<key alias="runwayModules">Runway modules</key>
|
||||
<key alias="scripting">Scripting Files</key>
|
||||
<key alias="scripts">Scripts</key>
|
||||
<key alias="stylesheets">Stylesheets</key>
|
||||
<key alias="templates">Templates</key>
|
||||
<key alias="xslt">XSLT Files</key>
|
||||
</area>
|
||||
<area alias="update">
|
||||
<key alias="updateAvailable">New update ready</key>
|
||||
<key alias="updateDownloadText">%0% is ready, click here for download</key>
|
||||
<key alias="updateNoServer">No connection to server</key>
|
||||
<key alias="updateNoServerError">Error checking for update. Please review trace-stack for further information</key>
|
||||
</area>
|
||||
<area alias="user">
|
||||
<key alias="administrators">Administrator</key>
|
||||
<key alias="categoryField">Category field</key>
|
||||
<key alias="changePassword">Change Your Password</key>
|
||||
<key alias="newPassword">Change Your Password</key>
|
||||
<key alias="confirmNewPassword">Confirm new password</key>
|
||||
<key alias="changePasswordDescription">You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button</key>
|
||||
<key alias="contentChannel">Content Channel</key>
|
||||
<key alias="defaultToLiveEditing">Redirect to canvas on login</key>
|
||||
<key alias="descriptionField">Description field</key>
|
||||
<key alias="disabled">Disable User</key>
|
||||
<key alias="documentType">Document Type</key>
|
||||
<key alias="editors">Editor</key>
|
||||
<key alias="excerptField">Excerpt field</key>
|
||||
<key alias="language">Language</key>
|
||||
<key alias="loginname">Login</key>
|
||||
<key alias="mediastartnode">Start Node in Media Library</key>
|
||||
<key alias="modules">Sections</key>
|
||||
<key alias="noConsole">Disable Umbraco Access</key>
|
||||
<key alias="password">Password</key>
|
||||
<key alias="passwordChanged">Your password has been changed!</key>
|
||||
<key alias="passwordConfirm">Please confirm the new password</key>
|
||||
<key alias="passwordEnterNew">Enter your new password</key>
|
||||
<key alias="passwordIsBlank">Your new password cannot be blank!</key>
|
||||
<key alias="passwordCurrent">Current password</key>
|
||||
<key alias="passwordInvalid">Invalid current password</key>
|
||||
<key alias="passwordIsDifferent">There was a difference between the new password and the confirmed password. Please try again!</key>
|
||||
<key alias="passwordMismatch">The confirmed password doesn't match the new password!</key>
|
||||
<key alias="permissionReplaceChildren">Replace child node permssions</key>
|
||||
<key alias="permissionSelectedPages">You are currently modifying permissions for the pages:</key>
|
||||
<key alias="permissionSelectPages">Select pages to modify their permissions</key>
|
||||
<key alias="searchAllChildren">Search all children</key>
|
||||
<key alias="startnode">Start Node in Content</key>
|
||||
<key alias="username">Username</key>
|
||||
<key alias="userPermissions">User permissions</key>
|
||||
<key alias="usertype">User type</key>
|
||||
<key alias="userTypes">User types</key>
|
||||
<key alias="writer">Writer</key>
|
||||
</area>
|
||||
</language>
|
||||
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 it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language alias="ru" intName="Russian" localName="русский" lcid="" culture="ru-RU">
|
||||
<creator>
|
||||
<name>Alexander Bryukhov (Unico Design company)</name>
|
||||
@@ -40,8 +40,13 @@
|
||||
<key alias="domainCreated">Создан новый домен '%0%'</key>
|
||||
<key alias="domainDeleted">Домен '%0%' удален</key>
|
||||
<key alias="domainExists">Домен с именем '%0%' уже существует</key>
|
||||
<key alias="domainHelp">Например: yourdomain.com, www.yourdomain.com</key>
|
||||
<key alias="domainHelp">
|
||||
<![CDATA[Например: example.com, www.example.com, example.com:8080,<br/>
|
||||
https://www.example.com/, example.com/en, и т.п. Используйте символ '*'<br/>
|
||||
если домен не важен, а нужно просто установить язык.]]>
|
||||
</key>
|
||||
<key alias="domainUpdated">Домен '%0%' обновлен</key>
|
||||
<key alias="invalidDomain">Неверное имя домена</key>
|
||||
<key alias="orEdit">Править существующие домены</key>
|
||||
</area>
|
||||
<area alias="auditTrails">
|
||||
@@ -69,13 +74,14 @@
|
||||
<key alias="saveAndPublish">Сохранить и опубликовать</key>
|
||||
<key alias="saveToPublish">Сохранить и направить на публикацию</key>
|
||||
<key alias="showPage">Предварительный просмотр</key>
|
||||
<key alias="showPageDisabled">Предварительный просмотр запрещен, так как документу не сопоставлен шаблон</key>
|
||||
<key alias="styleShow">Показать стили</key>
|
||||
<key alias="styleChoose">Выбрать стиль</key>
|
||||
<key alias="tableInsert">Вставить таблицу</key>
|
||||
</area>
|
||||
<area alias="content">
|
||||
<key alias="about">Об этой странице</key>
|
||||
<key alias="alias">Альтернативная ссылка</key>
|
||||
<key alias="alias">Алиас</key>
|
||||
<key alias="alternativeTextHelp">(как бы Вы описали изображение по телефону)</key>
|
||||
<key alias="alternativeUrls">Альтернативные ссылки</key>
|
||||
<key alias="clickToEdit">Нажмите для правки этого элемента</key>
|
||||
@@ -265,6 +271,7 @@
|
||||
<key alias="email">Email адрес</key>
|
||||
<key alias="error">Ошибка</key>
|
||||
<key alias="findDocument">Найти</key>
|
||||
<key alias="folder">Папка</key>
|
||||
<key alias="height">Высота</key>
|
||||
<key alias="help">Справка</key>
|
||||
<key alias="icon">Иконка</key>
|
||||
@@ -591,6 +598,11 @@
|
||||
<key alias="contentPublishedFailedByEvent"><![CDATA[
|
||||
Документ %0% не может быть опубликован. Операцию отменил установленный в системе пакет дополнений.
|
||||
]]></key>
|
||||
<key alias="contentPublishedFailedByParent">
|
||||
<![CDATA[
|
||||
Документ %0% не может быть опубликован, так как не опубликован его родительский документ.
|
||||
]]>
|
||||
</key>
|
||||
<key alias="includeUnpublished">Включая неопубликованные дочерние документы</key>
|
||||
<key alias="inProgress">Идет публикация. Пожалуйста, подождите...</key>
|
||||
<key alias="inProgressCounter">%0% из %1% документов опубликованы...</key>
|
||||
@@ -640,6 +652,9 @@
|
||||
<key alias="users">Пользователи</key>
|
||||
</area>
|
||||
<area alias="settings">
|
||||
<key alias="contentTypeEnabled">Родительский тип контента разрешен</key>
|
||||
<key alias="contentTypeUses">Данный тип контента использует</key>
|
||||
<key alias="asAContentMasterType">в качестве родительского типа. Вкладки родительского типа не показаны и могут быть изменены непосредственно в родительском типе</key>
|
||||
<key alias="defaulttemplate">Шаблон по-умолчанию</key>
|
||||
<key alias="dictionary editor egenskab">Словарная статья</key>
|
||||
<key alias="importDocumentTypeHelp">Чтобы импортировать тип документа, найдите файл ".udt" на своем компьютере, нажав на кнопку "Обзор", затем нажмите "Импортировать" (на следующем экране будет запрошено подтверждение для этой операции).</key>
|
||||
@@ -842,6 +857,7 @@
|
||||
<key alias="categoryField">Поле категории</key>
|
||||
<key alias="changePassword">Изменить пароль</key>
|
||||
<key alias="changePasswordDescription">Вы можете сменить свой пароль для доступа к административной панели Umbraco, заполнив нижеследующие поля и нажав на кнопку 'Изменить пароль'</key>
|
||||
<key alias="confirmNewPassword">Подтверждение нового пароля</key>
|
||||
<key alias="contentChannel">Канал содержимого</key>
|
||||
<key alias="defaultToLiveEditing">При входе перевести в режим редактирования "на месте"</key>
|
||||
<key alias="descriptionField">Поле описания</key>
|
||||
@@ -853,6 +869,7 @@
|
||||
<key alias="loginname">Имя входа (логин)</key>
|
||||
<key alias="mediastartnode">Начальный узел в Медиа-библиотеке</key>
|
||||
<key alias="modules">Разделы</key>
|
||||
<key alias="newPassword">Сменить пароль</key>
|
||||
<key alias="noConsole">Отключить доступ к административной панели Umbraco</key>
|
||||
<key alias="password">Пароль</key>
|
||||
<key alias="passwordChanged">Ваш пароль доступа изменен!</key>
|
||||
@@ -875,4 +892,4 @@
|
||||
<key alias="userTypes">Типы пользователей</key>
|
||||
<key alias="writer">Автор</key>
|
||||
</area>
|
||||
</language>
|
||||
</language>
|
||||
@@ -32,6 +32,7 @@
|
||||
<key alias="sort">排序</key>
|
||||
<key alias="toPublish">提交至发布者</key>
|
||||
<key alias="translate">翻译</key>
|
||||
<key alias="unpublish">取消发布</key>
|
||||
<key alias="update">更新</key>
|
||||
</area>
|
||||
<area alias="assignDomain">
|
||||
@@ -40,8 +41,13 @@
|
||||
<key alias="domainCreated">新域名 '%0%' 已创建</key>
|
||||
<key alias="domainDeleted">域名 '%0%' 已删除</key>
|
||||
<key alias="domainExists">域名 '%0%' 已使用</key>
|
||||
<key alias="domainHelp">例如:yourdomain.com、www.yourdomain.com</key>
|
||||
<key alias="domainHelp">
|
||||
<![CDATA[例如:example.com、www.example.com、example.com:8080、<br/>
|
||||
https://www.example.com/、example.com/en、……使用 * 代表任意域名,<br/>
|
||||
只需要设置语言部分即可。]]>
|
||||
</key>
|
||||
<key alias="domainUpdated">域名 '%0%' 已更新</key>
|
||||
<key alias="invalidDomain">域名错误</key>
|
||||
<key alias="orEdit">编辑当前域名</key>
|
||||
</area>
|
||||
<area alias="auditTrails">
|
||||
@@ -69,6 +75,7 @@
|
||||
<key alias="saveAndPublish">保存并发布</key>
|
||||
<key alias="saveToPublish">保存并提交审核</key>
|
||||
<key alias="showPage">预览</key>
|
||||
<key alias="showPageDisabled">因未设置模板无法预览</key>
|
||||
<key alias="styleChoose">选择样式</key>
|
||||
<key alias="styleShow">显示样式</key>
|
||||
<key alias="tableInsert">插入表格</key>
|
||||
@@ -261,6 +268,7 @@
|
||||
<key alias="email">邮箱</key>
|
||||
<key alias="error">错误</key>
|
||||
<key alias="findDocument">查找文档</key>
|
||||
<key alias="folder">文件夹</key>
|
||||
<key alias="height">高</key>
|
||||
<key alias="help">帮助</key>
|
||||
<key alias="icon">图标</key>
|
||||
@@ -579,6 +587,11 @@
|
||||
<area alias="publish">
|
||||
<key alias="contentPublishedFailedByEvent"><![CDATA[%0% 无法发布,第三方组件造成失败。
|
||||
]]></key>
|
||||
<key alias="contentPublishedFailedByParent">
|
||||
<![CDATA[
|
||||
%0% 不能发布,因为上级页面没有发布。
|
||||
]]>
|
||||
</key>
|
||||
<key alias="includeUnpublished">包含未发布的子项</key>
|
||||
<key alias="inProgress">正在发布,请稍候…</key>
|
||||
<key alias="inProgressCounter">%0% 中的 %1% 页面已发布…</key>
|
||||
@@ -628,6 +641,9 @@
|
||||
<key alias="users">用户</key>
|
||||
</area>
|
||||
<area alias="settings">
|
||||
<key alias="asAContentMasterType">作为主控文档类型. 主控文档类型的标签只能在主控文档类型里修改。</key>
|
||||
<key alias="contentTypeEnabled">主控文档类型激活</key>
|
||||
<key alias="contentTypeUses">该文档类型使用</key>
|
||||
<key alias="defaulttemplate">默认模板</key>
|
||||
<key alias="dictionary editor egenskab">字典键</key>
|
||||
<key alias="importDocumentTypeHelp">要导入文档类型,请点击“浏览”按钮,再点击“导入”,然后在您电脑上查找 ".udt"文件导入(下一页中需要您再次确认)</key>
|
||||
@@ -655,6 +671,7 @@
|
||||
<key alias="contentTypeTabCreated">选项卡已创建</key>
|
||||
<key alias="contentTypeTabDeleted">选项卡已删除</key>
|
||||
<key alias="contentTypeTabDeletedText">id为%0%的选项卡已删除</key>
|
||||
<key alias="contentUnpublished">内容已取消发布</key>
|
||||
<key alias="cssErrorHeader">样式表未保存</key>
|
||||
<key alias="cssSavedHeader">样式表已保存</key>
|
||||
<key alias="cssSavedText">样式表保存,无错误。</key>
|
||||
@@ -827,6 +844,7 @@
|
||||
<key alias="categoryField">分类字段</key>
|
||||
<key alias="changePassword">更改密码</key>
|
||||
<key alias="changePasswordDescription">要改变密码,请在框中输入新密码,然后单击“更改密码”。</key>
|
||||
<key alias="confirmNewPassword">确认新密码</key>
|
||||
<key alias="contentChannel">内容频道</key>
|
||||
<key alias="defaultToLiveEditing">登录后进入实时编辑模式</key>
|
||||
<key alias="descriptionField">描述字段</key>
|
||||
@@ -838,6 +856,7 @@
|
||||
<key alias="loginname">登录</key>
|
||||
<key alias="mediastartnode">默认打开媒体项</key>
|
||||
<key alias="modules">区域</key>
|
||||
<key alias="newPassword">更改密码</key>
|
||||
<key alias="noConsole">禁用后台管理界面</key>
|
||||
<key alias="password">密码</key>
|
||||
<key alias="passwordChanged">您的密码已更改!</key>
|
||||
@@ -859,4 +878,4 @@
|
||||
<key alias="userTypes">用户类型</key>
|
||||
<key alias="writer">撰稿人</key>
|
||||
</area>
|
||||
</language>
|
||||
</language>
|
||||
|
||||
@@ -2,13 +2,12 @@
|
||||
|
||||
<input type="hidden" name="nodeType" value="-1"/>
|
||||
|
||||
Name: <asp:RequiredFieldValidator id="RequiredFieldValidator1" ErrorMessage="*" ControlToValidate="rename" runat="server">*</asp:RequiredFieldValidator><br />
|
||||
<%=umbraco.ui.Text("name")%>: <asp:RequiredFieldValidator id="RequiredFieldValidator1" ErrorMessage="*" ControlToValidate="rename" runat="server">*</asp:RequiredFieldValidator><br />
|
||||
<asp:TextBox id="rename" Runat="server" Width="350" CssClass="bigInput"></asp:TextBox>
|
||||
|
||||
<div style="MARGIN-TOP: 10px">
|
||||
Type:<br />
|
||||
<%=umbraco.ui.Text("type")%>:<br />
|
||||
<asp:ListBox id="scriptType" Runat="server" Width="350" CssClass="bigInput" Rows="1" SelectionMode="Single">
|
||||
<asp:ListItem Selected="True" Value="">Folder</asp:ListItem>
|
||||
</asp:ListBox>
|
||||
</div>
|
||||
|
||||
@@ -17,6 +16,6 @@ Type:<br />
|
||||
|
||||
<div style="MARGIN-TOP: 15px;">
|
||||
<asp:Button id="sbmt" Runat="server" style="MARGIN-TOP: 14px" Width="90"></asp:Button>
|
||||
<em> or </em>
|
||||
<em> <%=umbraco.ui.Text("or")%> </em>
|
||||
<a href="#" style="color: Blue; margin-left: 6px;" onclick="UmbClientMgr.closeModalWindow()"><%=umbraco.ui.Text("cancel")%></a>
|
||||
</div>
|
||||
@@ -1,11 +1,121 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Web;
|
||||
using System.Web.UI.WebControls;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Core;
|
||||
using umbraco.cms.businesslogic.macro;
|
||||
|
||||
namespace Umbraco.Web.UI.Umbraco.Developer.Macros
|
||||
{
|
||||
public partial class EditMacro : global::umbraco.cms.presentation.developer.editMacro
|
||||
{
|
||||
|
||||
protected override void OnLoad(EventArgs e)
|
||||
{
|
||||
base.OnLoad(e);
|
||||
|
||||
PopulatePartialViewFiles();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This ensures that the SelectedPartialView txt box value is set correctly when the m_macro object's
|
||||
/// ScriptingFile property contains a full virtual path beginning with the MacroPartials path
|
||||
/// </summary>
|
||||
/// <param name="macro"> </param>
|
||||
/// <param name="macroAssemblyValue"></param>
|
||||
/// <param name="macroTypeValue"></param>
|
||||
protected override void PopulateFieldsOnLoad(Macro macro, string macroAssemblyValue, string macroTypeValue)
|
||||
{
|
||||
base.PopulateFieldsOnLoad(macro, macroAssemblyValue, macroTypeValue);
|
||||
//check if the ScriptingFile property contains the MacroPartials path
|
||||
if (macro.ScriptingFile.StartsWith(SystemDirectories.MvcViews + "/MacroPartials/")
|
||||
|| (Regex.IsMatch(macro.ScriptingFile, "~/App_Plugins/.+?/Views/MacroPartials", RegexOptions.Compiled)))
|
||||
{
|
||||
macroPython.Text = "";
|
||||
SelectedPartialView.Text = macro.ScriptingFile;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This changes the macro type to a PartialViewMacro if the SelectedPartialView txt box has a value.
|
||||
/// This then also updates the file path saved for the partial view to be the full virtual path, not just the file name.
|
||||
/// </summary>
|
||||
/// <param name="macro"> </param>
|
||||
/// <param name="macroCachePeriod"></param>
|
||||
/// <param name="macroAssemblyValue"></param>
|
||||
/// <param name="macroTypeValue"></param>
|
||||
protected override void SetMacroValuesFromPostBack(Macro macro, int macroCachePeriod, string macroAssemblyValue, string macroTypeValue)
|
||||
{
|
||||
base.SetMacroValuesFromPostBack(macro, macroCachePeriod, macroAssemblyValue, macroTypeValue);
|
||||
if (!SelectedPartialView.Text.IsNullOrWhiteSpace())
|
||||
{
|
||||
macro.ScriptingFile = SelectedPartialView.Text;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Populate the drop down list for partial view files
|
||||
/// </summary>
|
||||
private void PopulatePartialViewFiles()
|
||||
{
|
||||
var partialsDir = IOHelper.MapPath(SystemDirectories.MvcViews + "/MacroPartials");
|
||||
//get all the partials in the normal /MacroPartials folder
|
||||
var foundMacroPartials = GetPartialViewFiles(partialsDir, partialsDir, SystemDirectories.MvcViews + "/MacroPartials");
|
||||
//now try to find all of them int he App_Plugins/[PackageName]/Views/MacroPartials folder
|
||||
var partialPluginsDir = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.AppPlugins));
|
||||
foreach(var d in partialPluginsDir.GetDirectories())
|
||||
{
|
||||
var viewsFolder = d.GetDirectories("Views");
|
||||
if (viewsFolder.Any())
|
||||
{
|
||||
var macroPartials = viewsFolder.First().GetDirectories("MacroPartials");
|
||||
if (macroPartials.Any())
|
||||
{
|
||||
foundMacroPartials = foundMacroPartials.Concat(
|
||||
GetPartialViewFiles(macroPartials.First().FullName, macroPartials.First().FullName, SystemDirectories.AppPlugins + "/" + d.Name + "/Views/MacroPartials"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
PartialViewList.DataSource = foundMacroPartials;
|
||||
PartialViewList.DataBind();
|
||||
PartialViewList.Items.Insert(0, new ListItem("Browse partial view files on server...", string.Empty));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the list of partial view files in the ~/Views/MacroPartials folder and in all
|
||||
/// folders of ~/App_Plugins/[PackageName]/Views/MacroPartials
|
||||
/// </summary>
|
||||
/// <param name="orgPath"></param>
|
||||
/// <param name="path"></param>
|
||||
/// <param name="prefixVirtualPath"> </param>
|
||||
/// <returns></returns>
|
||||
private IEnumerable<string> GetPartialViewFiles(string orgPath, string path, string prefixVirtualPath)
|
||||
{
|
||||
var files = new List<string>();
|
||||
var dirInfo = new DirectoryInfo(path);
|
||||
|
||||
// Populate subdirectories
|
||||
var dirInfos = dirInfo.GetDirectories();
|
||||
foreach (var dir in dirInfos)
|
||||
{
|
||||
files.AddRange(GetPartialViewFiles(orgPath, path + "/" + dir.Name, prefixVirtualPath));
|
||||
}
|
||||
|
||||
var fileInfo = dirInfo.GetFiles("*.*");
|
||||
|
||||
files.AddRange(
|
||||
fileInfo.Select(file =>
|
||||
prefixVirtualPath.TrimEnd('/') + "/" + (path.Replace(orgPath, string.Empty).Trim('/') + "/" + file.Name).Trim('/')));
|
||||
return files;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -11,5 +11,23 @@ namespace Umbraco.Web.UI.Umbraco.Developer.Macros {
|
||||
|
||||
|
||||
public partial class EditMacro {
|
||||
|
||||
/// <summary>
|
||||
/// SelectedPartialView control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox SelectedPartialView;
|
||||
|
||||
/// <summary>
|
||||
/// PartialViewList control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.DropDownList PartialViewList;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,10 +3,27 @@
|
||||
|
||||
<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
|
||||
<asp:Content ContentPlaceHolderID="head" runat="server">
|
||||
<script language="javascript">
|
||||
<script type="text/javascript">
|
||||
function doSubmit() {
|
||||
document.forms.aspnetForm.submit();
|
||||
}
|
||||
|
||||
//handles the change selection of the drop downs to populate the text box
|
||||
(function($) {
|
||||
$(document).ready(function () {
|
||||
//on drop down change, update the text box and clear other text boxes
|
||||
$("#Table2 td.propertyContent select").change(function() {
|
||||
//update the txt box
|
||||
var txt = $(this).prev("input[type='text']");
|
||||
txt.val($(this).val());
|
||||
//clear other text boxes
|
||||
$("#Table2 td.propertyContent input[type='text']").not(txt).val("");
|
||||
//reset other drop downs
|
||||
$("#Table2 td.propertyContent select").not($(this)).val("");
|
||||
});
|
||||
});
|
||||
})(jQuery);
|
||||
|
||||
</script>
|
||||
</asp:Content>
|
||||
<asp:Content ContentPlaceHolderID="body" runat="server">
|
||||
@@ -32,11 +49,22 @@
|
||||
</table>
|
||||
</cc1:Pane>
|
||||
<cc1:Pane ID="Pane1_2" BackColor="mediumaquamarine" runat="server">
|
||||
<table id="Table2" cellspacing="0" cellpadding="4" width="98%" border="0" runat="server">
|
||||
<table id="Table2" cellspacing="0" cellpadding="4" width="98%" border="0">
|
||||
<tr>
|
||||
<td class="propertyHeader" width="30%">
|
||||
<img alt="Xslt Icon" src="../../images/umbraco/developerXslt.gif" align="absMiddle">
|
||||
Use XSLT file
|
||||
<img alt="python Icon" src="../../images/umbraco/developerScript.gif" align="absMiddle" />
|
||||
Use MVC Partial View
|
||||
</td>
|
||||
<td class="propertyContent">
|
||||
<asp:TextBox ID="SelectedPartialView" runat="server" Width="230px" CssClass="guiInputText"></asp:TextBox>
|
||||
<asp:DropDownList ID="PartialViewList" runat="server" >
|
||||
</asp:DropDownList>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="propertyHeader" width="30%">
|
||||
<img alt="Xslt Icon" src="../../images/umbraco/developerXslt.gif" align="absMiddle"/>
|
||||
or XSLT file
|
||||
</td>
|
||||
<td class="propertyContent">
|
||||
<asp:TextBox ID="macroXslt" runat="server" Width="230px" CssClass="guiInputText"></asp:TextBox>
|
||||
@@ -46,7 +74,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="propertyHeader" width="30%">
|
||||
<img alt="User control Icon" src="../../images/developer/userControlIcon.png" align="absMiddle">
|
||||
<img alt="User control Icon" src="../../images/developer/userControlIcon.png" align="absMiddle"/>
|
||||
or .NET User Control
|
||||
</td>
|
||||
<td class="propertyContent">
|
||||
@@ -58,8 +86,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="propertyHeader" valign="top" width="30%">
|
||||
<img alt="Custom Control Icon" src="../../images/developer/customControlIcon.png"
|
||||
align="absMiddle">
|
||||
<img alt="Custom Control Icon" src="../../images/developer/customControlIcon.png" align="absMiddle"/>
|
||||
or .NET Custom Control
|
||||
</td>
|
||||
<td class="propertyContent">
|
||||
@@ -72,7 +99,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="propertyHeader" width="30%">
|
||||
<img alt="python Icon" src="../../images/umbraco/developerScript.gif" align="absMiddle">
|
||||
<img alt="python Icon" src="../../images/umbraco/developerScript.gif" align="absMiddle"/>
|
||||
or script file
|
||||
</td>
|
||||
<td class="propertyContent">
|
||||
|
||||
@@ -21,14 +21,14 @@
|
||||
<cc1:Pane runat="server" ID="pane_addnew">
|
||||
<cc1:PropertyPanel runat="server" ID="prop_domain" Text="Domain">
|
||||
<asp:TextBox ID="DomainName" runat="server" Width="252px"></asp:TextBox>
|
||||
<asp:RequiredFieldValidator ControlToValidate="Languages" ErrorMessage="*" ID="DomainValidator" runat="server" Display="Dynamic" />
|
||||
<br /><small><%= umbraco.ui.Text("assignDomain", "domainHelp") %></small>
|
||||
<asp:RequiredFieldValidator ControlToValidate="DomainName" ErrorMessage="*" ID="DomainValidator" runat="server" Display="Dynamic" />
|
||||
<asp:RegularExpressionValidator ControlToValidate="DomainName" ErrorMessage="*" ID="DomainValidator2" runat="server" Display="Dynamic" />
|
||||
<br /><small><%= umbraco.ui.Text("assignDomain", "domainHelp") %></small>
|
||||
</cc1:PropertyPanel>
|
||||
|
||||
<cc1:PropertyPanel ID="prop_lang" runat="server" Text="language">
|
||||
<asp:RequiredFieldValidator ControlToValidate="Languages" ErrorMessage="*" ID="LanguageValidator"
|
||||
runat="server" Display="Dynamic" />
|
||||
<asp:DropDownList ID="Languages" runat="server" />
|
||||
<asp:DropDownList ID="Languages" runat="server" />
|
||||
<asp:RequiredFieldValidator ControlToValidate="Languages" ErrorMessage="*" ID="LanguageValidator" runat="server" Display="Dynamic" />
|
||||
</cc1:PropertyPanel>
|
||||
|
||||
<cc1:PropertyPanel runat="server" Text=" ">
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
<%@ Register TagPrefix="ui" Namespace="umbraco.uicontrols" Assembly="controls" %>
|
||||
<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
|
||||
<%@ Register TagPrefix="asp" Namespace="System.Web.UI" Assembly="System.Web" %>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head runat="server">
|
||||
@@ -100,6 +101,7 @@
|
||||
<form id="Form1" runat="server">
|
||||
<asp:ScriptManager ID="ScriptManager1" runat="server">
|
||||
</asp:ScriptManager>
|
||||
|
||||
<input type="hidden" name="macroMode" value="<%=Request["mode"]%>" />
|
||||
<%if (Request["umb_macroID"] != null || Request["umb_macroAlias"] != null)
|
||||
{%>
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
<%@ Page Trace="false" Language="c#" CodeBehind="umbraco.aspx.cs" AutoEventWireup="True"
|
||||
Inherits="Umbraco.Web.UI.Umbraco.Umbraco" %>
|
||||
|
||||
<%@ Import Namespace="System.Web.Script.Serialization" %>
|
||||
|
||||
<%@ Register Src="controls/Tree/TreeControl.ascx" TagName="TreeControl" TagPrefix="umbraco" %>
|
||||
<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
|
||||
<%@ Register TagPrefix="uc1" TagName="quickSearch" Src="Search/QuickSearch.ascx" %>
|
||||
@@ -16,6 +18,8 @@
|
||||
<umb:CssInclude ID="CssInclude2" runat="server" FilePath="modal/style.css" PathNameAlias="UmbracoClient" />
|
||||
<umb:JsInclude ID="JsInclude1" runat="server" FilePath="Application/NamespaceManager.js"
|
||||
PathNameAlias="UmbracoClient" Priority="0" />
|
||||
<umb:JsInclude ID="JSON2" runat="server" FilePath="ui/json2.js" PathNameAlias="UmbracoClient"
|
||||
Priority="0" />
|
||||
<umb:JsInclude ID="JsInclude2" runat="server" FilePath="ui/jquery.js" PathNameAlias="UmbracoClient"
|
||||
Priority="0" />
|
||||
<umb:JsInclude ID="JsInclude3" runat="server" FilePath="ui/jqueryui.js" PathNameAlias="UmbracoClient"
|
||||
@@ -289,14 +293,20 @@
|
||||
}
|
||||
|
||||
function umbracoSessionRenewCheckPassword() {
|
||||
var password = jQuery("#sessionrefreshpassword input").val();
|
||||
|
||||
if (password != "") {
|
||||
|
||||
var data = {
|
||||
username: <%= new JavaScriptSerializer().Serialize(this.getUser().LoginName) %>,
|
||||
password: password
|
||||
};
|
||||
|
||||
if (jQuery("#sessionrefreshpassword input").val() != "") {
|
||||
jQuery.ajax({
|
||||
type: "POST",
|
||||
url: "<%=umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) %>/webservices/legacyAjaxCalls.asmx/ValidateUser",
|
||||
data: "{'username': '<%=this.getUser().LoginName%>', 'password': '" + jQuery("#sessionrefreshpassword input").val() + "'}",
|
||||
data: JSON.stringify(data),
|
||||
processData: false,
|
||||
success: function (result) {
|
||||
|
||||
if (result.d == true) {
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
tinyMCE.addI18n('en_us.example',{
|
||||
desc : 'This is just a template button'
|
||||
});
|
||||
@@ -0,0 +1,3 @@
|
||||
tinyMCE.addI18n('en_us.example_dlg',{
|
||||
title : 'This is just a example title'
|
||||
});
|
||||
@@ -0,0 +1,3 @@
|
||||
tinyMCE.addI18n('it.example',{
|
||||
desc : 'Esempio di pulsante'
|
||||
});
|
||||
@@ -0,0 +1,3 @@
|
||||
tinyMCE.addI18n('it.example_dlg',{
|
||||
title : 'Esempio di titolo'
|
||||
});
|
||||
@@ -0,0 +1,10 @@
|
||||
tinyMCE.addI18n('de.embed_dlg', {
|
||||
title: 'Medien von Drittanbietern einbetten',
|
||||
general: 'Allgemein',
|
||||
url: 'Url:',
|
||||
size: 'Abmessungen:',
|
||||
constrain_proportions: 'Proportionen beibehalten',
|
||||
preview: 'Vorschau',
|
||||
source: 'Quellcode'
|
||||
|
||||
});
|
||||
@@ -0,0 +1,10 @@
|
||||
tinyMCE.addI18n('de.embed_dlg', {
|
||||
title: 'Medien von Drittanbietern einbetten',
|
||||
general: 'Allgemein',
|
||||
url: 'Url:',
|
||||
size: 'Abmessungen:',
|
||||
constrain_proportions: 'Proportionen beibehalten',
|
||||
preview: 'Vorschau',
|
||||
source: 'Quellcode'
|
||||
|
||||
});
|
||||
@@ -0,0 +1,10 @@
|
||||
tinyMCE.addI18n('en_us.embed_dlg', {
|
||||
title: 'Embed third party media',
|
||||
general: 'General',
|
||||
url: 'Url:',
|
||||
size: 'Size:',
|
||||
constrain_proportions: 'Constrain',
|
||||
preview: 'Preview',
|
||||
source: 'Source'
|
||||
|
||||
});
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user