From 622f6958692346c6097c45cf864b718a17502bb7 Mon Sep 17 00:00:00 2001 From: ajwaka Date: Thu, 9 Jul 2020 12:07:56 -0500 Subject: [PATCH 01/45] Abstracted AllowIndex logic into TabInfo property Updated usage in TabIndexer.cs Used same logic for check in CoreSitemapProvider.cs --- DNN Platform/Library/Entities/Tabs/TabInfo.cs | 10 ++++++++++ DNN Platform/Library/Services/Search/TabIndexer.cs | 5 +---- .../Library/Services/Sitemap/CoreSitemapProvider.cs | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/DNN Platform/Library/Entities/Tabs/TabInfo.cs b/DNN Platform/Library/Entities/Tabs/TabInfo.cs index ed87840c606..1f32e5ae10b 100644 --- a/DNN Platform/Library/Entities/Tabs/TabInfo.cs +++ b/DNN Platform/Library/Entities/Tabs/TabInfo.cs @@ -115,6 +115,16 @@ public bool HasAVisibleVersion } } + [XmlIgnore] + public bool AllowIndex + { + get + { + return this.TabSettings["AllowIndex"] == null + || "true".Equals(this.TabSettings["AllowIndex"].ToString(), StringComparison.CurrentCultureIgnoreCase); + } + } + [XmlIgnore] public Dictionary ChildModules { diff --git a/DNN Platform/Library/Services/Search/TabIndexer.cs b/DNN Platform/Library/Services/Search/TabIndexer.cs index 034e12196fe..c3de7d28167 100644 --- a/DNN Platform/Library/Services/Search/TabIndexer.cs +++ b/DNN Platform/Library/Services/Search/TabIndexer.cs @@ -49,10 +49,7 @@ public override int IndexSearchDocuments( var searchDocuments = new List(); var tabs = ( from t in TabController.Instance.GetTabsByPortal(portalId).AsList() - where t.LastModifiedOnDate > startDateLocal && (t.TabSettings["AllowIndex"] == null || - "true".Equals( - t.TabSettings["AllowIndex"].ToString(), - StringComparison.CurrentCultureIgnoreCase)) + where t.LastModifiedOnDate > startDateLocal && (t.AllowIndex) select t).OrderBy(t => t.LastModifiedOnDate).ThenBy(t => t.TabID).ToArray(); if (tabs.Any()) diff --git a/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs b/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs index 8eaee9baa18..0a082bca03a 100644 --- a/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs +++ b/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs @@ -65,7 +65,7 @@ public override List GetUrls(int portalId, PortalSettings ps, string (Null.IsNull(tab.StartDate) || tab.StartDate < DateTime.Now) && (Null.IsNull(tab.EndDate) || tab.EndDate > DateTime.Now) && this.IsTabPublic(tab.TabPermissions)) { - if ((this.includeHiddenPages || tab.IsVisible) && tab.HasBeenPublished && tab.Indexed) + if ((this.includeHiddenPages || tab.IsVisible) && tab.HasBeenPublished && tab.AllowIndex) { try { From edb7401ea858164e804d390a69a6c4f2cb52e383 Mon Sep 17 00:00:00 2001 From: Daniel Valadas Date: Mon, 13 Jul 2020 03:51:49 -0400 Subject: [PATCH 02/45] Fixes stylecop warnings in Foldermanager.cs --- .../Library/DotNetNuke.Library.csproj | 1 + .../Services/FileSystem/FolderManager.cs | 230 ++++++++++++++---- .../Services/FileSystem/SyncFolderData.cs | 29 +++ 3 files changed, 217 insertions(+), 43 deletions(-) create mode 100644 DNN Platform/Library/Services/FileSystem/SyncFolderData.cs diff --git a/DNN Platform/Library/DotNetNuke.Library.csproj b/DNN Platform/Library/DotNetNuke.Library.csproj index 70b6796ad3e..e6e282bb54e 100644 --- a/DNN Platform/Library/DotNetNuke.Library.csproj +++ b/DNN Platform/Library/DotNetNuke.Library.csproj @@ -770,6 +770,7 @@ + diff --git a/DNN Platform/Library/Services/FileSystem/FolderManager.cs b/DNN Platform/Library/Services/FileSystem/FolderManager.cs index ded6cc7c30c..e9d78447ec6 100644 --- a/DNN Platform/Library/Services/FileSystem/FolderManager.cs +++ b/DNN Platform/Library/Services/FileSystem/FolderManager.cs @@ -42,8 +42,11 @@ public class FolderManager : ComponentBase, IFold private const string DefaultMappedPathSetting = "DefaultMappedPath"; private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(FolderManager)); private static readonly Dictionary SyncFoldersData = new Dictionary(); - private static readonly object _threadLocker = new object(); + private static readonly object ThreadLocker = new object(); + /// + /// Gets the localization key for MyfolderName. + /// public virtual string MyFolderName { get @@ -174,6 +177,10 @@ public virtual void DeleteFolder(IFolderInfo folder) this.DeleteFolderInternal(folder, false); } + /// + /// Removes the database reference to a folder on disk. + /// + /// The folder to unlink. public virtual void UnlinkFolder(IFolderInfo folder) { this.DeleteFolderRecursive(folder, new Collection(), true, true); @@ -276,8 +283,9 @@ public virtual IEnumerable GetFileSystemFolders(UserInfo user, stri folder.DisplayPath = this.MyFolderName + "/"; folder.DisplayName = this.MyFolderName; } - else if (!folder.FolderPath.StartsWith(userFolder.FolderPath, StringComparison.InvariantCultureIgnoreCase)) // Allow UserFolder children + else if (!folder.FolderPath.StartsWith(userFolder.FolderPath, StringComparison.InvariantCultureIgnoreCase)) { + // Allow UserFolder children continue; } } @@ -297,7 +305,7 @@ public virtual IFolderInfo GetFolder(int folderId) { // Try and get the folder from the portal cache IFolderInfo folder = null; - var portalSettings = PortalController.Instance.GetCurrentPortalSettings(); + var portalSettings = PortalController.Instance.GetCurrentSettings(); if (portalSettings != null) { var folders = this.GetFolders(portalSettings.PortalId); @@ -426,8 +434,9 @@ public virtual IEnumerable GetFolders(UserInfo user, string permiss folder.DisplayPath = Localization.GetString("MyFolderName") + "/"; folder.DisplayName = Localization.GetString("MyFolderName"); } - else if (!folder.FolderPath.StartsWith(userFolder.FolderPath, StringComparison.InvariantCultureIgnoreCase)) // Allow UserFolder children + else if (!folder.FolderPath.StartsWith(userFolder.FolderPath, StringComparison.InvariantCultureIgnoreCase)) { + // Allow UserFolder children continue; } } @@ -438,6 +447,11 @@ public virtual IEnumerable GetFolders(UserInfo user, string permiss return userFolders; } + /// + /// Gets the folder that belongs to a specific user. + /// + /// The user to get the folder for. + /// The informaiton about the the user folder, . public virtual IFolderInfo GetUserFolder(UserInfo userInfo) { // always use _default portal for a super user @@ -447,6 +461,12 @@ public virtual IFolderInfo GetUserFolder(UserInfo userInfo) return this.GetFolder(portalId, userFolderPath) ?? this.AddUserFolder(userInfo); } + /// + /// Moves a folder to a new location. + /// + /// The folder to move. + /// Where to move the new folder. + /// The information about the moved folder, . public virtual IFolderInfo MoveFolder(IFolderInfo folder, IFolderInfo destinationFolder) { Requires.NotNull("folder", folder); @@ -464,7 +484,9 @@ public virtual IFolderInfo MoveFolder(IFolderInfo folder, IFolderInfo destinatio throw new InvalidOperationException(string.Format( Localization.GetExceptionMessage( "CannotMoveFolderAlreadyExists", - "The folder with name '{0}' cannot be moved. A folder with that name already exists under the folder '{1}'.", folder.FolderName, destinationFolder.FolderName))); + "The folder with name '{0}' cannot be moved. A folder with that name already exists under the folder '{1}'.", + folder.FolderName, + destinationFolder.FolderName))); } var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); @@ -475,7 +497,8 @@ public virtual IFolderInfo MoveFolder(IFolderInfo folder, IFolderInfo destinatio throw new InvalidOperationException(string.Format( Localization.GetExceptionMessage( "CannotMoveFolderBetweenFolderType", - "The folder with name '{0}' cannot be moved. Move Folder operation between this two folder types is not allowed", folder.FolderName))); + "The folder with name '{0}' cannot be moved. Move Folder operation between this two folder types is not allowed", + folder.FolderName))); } if (!this.IsMoveOperationValid(folder, destinationFolder, newFolderPath)) @@ -563,6 +586,7 @@ public virtual void RenameFolder(IFolderInfo folder, string newFolderName) /// /// The folder from which to retrieve the files. /// The patter to search for. + /// Shoud the search be recursive. /// The list of files contained in the specified folder. public virtual IEnumerable SearchFiles(IFolderInfo folder, string pattern, bool recursive) { @@ -621,7 +645,7 @@ public virtual int Synchronize(int portalId, string relativePath, bool isRecursi int? scriptTimeOut = null; - Monitor.Enter(_threadLocker); + Monitor.Enter(ThreadLocker); try { if (HttpContext.Current != null) @@ -659,7 +683,7 @@ public virtual int Synchronize(int portalId, string relativePath, bool isRecursi } finally { - Monitor.Exit(_threadLocker); + Monitor.Exit(ThreadLocker); // Restore original time-out if (HttpContext.Current != null && scriptTimeOut != null) @@ -676,7 +700,7 @@ public virtual int Synchronize(int portalId, string relativePath, bool isRecursi /// /// The folder to update. /// Thrown when folder is null. - /// + /// The information about the updated folder, . public virtual IFolderInfo UpdateFolder(IFolderInfo folder) { var updatedFolder = this.UpdateFolderInternal(folder, true); @@ -838,23 +862,41 @@ public virtual IFolderInfo MoveFolder(IFolderInfo folder, string newFolderPath) return this.MoveFolder(folder, parentFolder); } + /// + /// Checks if a given folder path is valid. + /// + /// The folder path. + /// A value indicating whether the folder path is valid. internal virtual bool IsValidFolderPath(string folderPath) { var illegalInFolderPath = new Regex(string.Format("[{0}]", Regex.Escape(new string(Path.GetInvalidPathChars()))), RegexOptions.Compiled); return !illegalInFolderPath.IsMatch(folderPath) && !folderPath.TrimEnd('/', '\\').EndsWith("."); } + /// + /// Adds a log entry. + /// + /// The folder to log about. + /// The type of the log entry. internal virtual void AddLogEntry(IFolderInfo folder, EventLogController.EventLogType eventLogType) { - EventLogController.Instance.AddLog(folder, PortalController.Instance.GetCurrentPortalSettings(), this.GetCurrentUserId(), string.Empty, eventLogType); + EventLogController.Instance.AddLog(folder, (PortalSettings)PortalController.Instance.GetCurrentSettings(), this.GetCurrentUserId(), string.Empty, eventLogType); } + /// + /// Adds a log entry. + /// + /// The name of the property. + /// The value of the property. + /// The type of log entry. internal virtual void AddLogEntry(string propertyName, string propertyValue, EventLogController.EventLogType eventLogType) { - EventLogController.Instance.AddLog(propertyName, propertyValue, PortalController.Instance.GetCurrentPortalSettings(), this.GetCurrentUserId(), eventLogType); + EventLogController.Instance.AddLog(propertyName, propertyValue, (PortalSettings)PortalController.Instance.GetCurrentSettings(), this.GetCurrentUserId(), eventLogType); } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The new folder path. internal void DeleteFilesFromCache(int portalId, string newFolderPath) { var folders = this.GetFolders(portalId).Where(f => f.FolderPath.StartsWith(newFolderPath)); @@ -869,7 +911,8 @@ internal void DeleteFilesFromCache(int portalId, string newFolderPath) } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The added folder information, . + /// the user to add a forder for. internal virtual IFolderInfo AddUserFolder(UserInfo user) { // user _default portal for all super users @@ -882,6 +925,7 @@ internal virtual IFolderInfo AddUserFolder(UserInfo user) this.AddFolder(folderMapping, DefaultUsersFoldersPath); } + // GetUserFolderPathElement is depreced without a replacement, it should have been internal only and will be removed in Dnn10, hence the warning disable here #pragma warning disable 612,618 var rootFolder = PathUtils.Instance.GetUserFolderPathElement(user.UserID, PathUtils.UserFolderElement.Root); #pragma warning restore 612,618 @@ -893,6 +937,7 @@ internal virtual IFolderInfo AddUserFolder(UserInfo user) this.AddFolder(folderMapping, folderPath); } + // GetUserFolderPathElement is depreced without a replacement, it should have been internal only and will be removed in Dnn10, hence the warning disable here #pragma warning disable 612,618 folderPath = PathUtils.Instance.FormatFolderPath(string.Concat(folderPath, PathUtils.Instance.GetUserFolderPathElement(user.UserID, PathUtils.UserFolderElement.SubFolder))); #pragma warning restore 612,618 @@ -938,7 +983,10 @@ internal virtual IFolderInfo AddUserFolder(UserInfo user) } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// A value indicating whether there are any folder mappings that required network connectivity. + /// The site (Portal) ID. + /// The relative path. + /// A value indicating whether the check should be recursive or not. internal virtual bool AreThereFolderMappingsRequiringNetworkConnectivity(int portalId, string relativePath, bool isRecursive) { var folder = this.GetFolder(portalId, relativePath); @@ -969,6 +1017,7 @@ internal virtual bool AreThereFolderMappingsRequiringNetworkConnectivity(int por } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. internal void ClearFolderProviderCachedLists(int portalId) { foreach (var folderMapping in FolderMappingController.Instance.GetFolderMappings(portalId)) @@ -988,18 +1037,30 @@ internal void ClearFolderProviderCachedLists(int portalId) } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. internal virtual void ClearFolderCache(int portalId) { DataCache.ClearFolderCache(portalId); } + /// + /// Creates a folder in the database. + /// + /// The site (portal) ID. + /// The folder path to create. + /// The folder mapping id, . + /// The created folder ID. internal virtual int CreateFolderInDatabase(int portalId, string folderPath, int folderMappingId) { return this.CreateFolderInDatabase(portalId, folderPath, folderMappingId, folderPath); } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The site (portal) ID. + /// The folder path to create. + /// The id for the folder mapping. + /// The mapped path. + /// The created folder ID. internal virtual int CreateFolderInDatabase(int portalId, string folderPath, int folderMappingId, string mappedPath) { var isProtected = PathUtils.Instance.IsDefaultProtectedPath(folderPath); @@ -1045,6 +1106,7 @@ internal virtual int CreateFolderInDatabase(int portalId, string folderPath, int } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The physical path to create the folder in. internal virtual void CreateFolderInFileSystem(string physicalPath) { var di = new DirectoryInfo(physicalPath); @@ -1056,6 +1118,8 @@ internal virtual void CreateFolderInFileSystem(string physicalPath) } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The folder path. internal virtual void DeleteFolder(int portalId, string folderPath) { DataProvider.Instance().DeleteFolder(portalId, PathUtils.Instance.FormatFolderPath(folderPath)); @@ -1065,6 +1129,8 @@ internal virtual void DeleteFolder(int portalId, string folderPath) } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder mapping affected. + /// A list of folders to delete. internal virtual void DeleteFoldersFromExternalStorageLocations(Dictionary folderMappings, IEnumerable foldersToDelete) { foreach (var folderToDelete in foldersToDelete) @@ -1091,21 +1157,24 @@ internal virtual void DeleteFoldersFromExternalStorageLocations(DictionaryThis member is reserved for internal use and is not intended to be used directly from your code. - /// + /// A value representing the current script timeout. internal virtual int GetCurrentScriptTimeout() { return HttpContext.Current.Server.ScriptTimeout; } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The id of the current user. internal virtual int GetCurrentUserId() { return UserController.Instance.GetCurrentUserInfo().UserID; } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The site (portal) ID. + /// The relative path. + /// A value indicating whether to return folders recursively. + /// A sorted list of folders. internal virtual SortedList GetDatabaseFolders(int portalId, string relativePath, bool isRecursive) { var databaseFolders = new SortedList(new IgnoreCaseStringComparer()); @@ -1137,7 +1206,8 @@ internal virtual SortedList GetDatabaseFolders(int porta } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The folder to get. + /// A sorted list of folders. internal virtual SortedList GetDatabaseFoldersRecursive(IFolderInfo folder) { var result = new SortedList(new IgnoreCaseStringComparer()); @@ -1173,7 +1243,10 @@ internal virtual SortedList GetDatabaseFoldersRecursive( } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The site (portal) ID. + /// The relative path. + /// A value indicating whether to return the folders recursively. + /// A sorted list of folders. internal virtual SortedList GetFileSystemFolders(int portalId, string relativePath, bool isRecursive) { var fileSystemFolders = new SortedList(new IgnoreCaseStringComparer()); @@ -1211,7 +1284,9 @@ internal virtual SortedList GetFileSystemFolders(int por } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The site (portal) ID. + /// The physical path of the folder. + /// A sorted list of folders. internal virtual SortedList GetFileSystemFoldersRecursive(int portalId, string physicalPath) { var result = new SortedList(new IgnoreCaseStringComparer()); @@ -1258,7 +1333,9 @@ internal virtual SortedList GetFileSystemFoldersRecursiv } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The folder mapping to search in. + /// The folder mapping id to return. + /// A single folder mapping, . internal virtual FolderMappingInfo GetFolderMapping(Dictionary folderMappings, int folderMappingId) { if (!folderMappings.ContainsKey(folderMappingId)) @@ -1270,7 +1347,9 @@ internal virtual FolderMappingInfo GetFolderMapping(DictionaryThis member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The folder mapping to use. + /// The folder base path. + /// A sorted list of folder mappings. internal virtual SortedList GetFolderMappingFoldersRecursive(FolderMappingInfo folderMapping, IFolderInfo folder) { var result = new SortedList(new IgnoreCaseStringComparer()); @@ -1323,7 +1402,8 @@ internal virtual SortedList GetFolderMappingFoldersRecur } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The cached items arguments, . + /// A list of folders. internal virtual object GetFoldersByPermissionSortedCallBack(CacheItemArgs cacheItemArgs) { var portalId = (int)cacheItemArgs.ParamList[0]; @@ -1333,7 +1413,8 @@ internal virtual object GetFoldersByPermissionSortedCallBack(CacheItemArgs cache } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The cache item arguments, . + /// A list of folders. internal virtual object GetFoldersSortedCallBack(CacheItemArgs cacheItemArgs) { var portalId = (int)cacheItemArgs.ParamList[0]; @@ -1341,7 +1422,10 @@ internal virtual object GetFoldersSortedCallBack(CacheItemArgs cacheItemArgs) } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The site (portal) ID. + /// The relative path. + /// A vavlue indicating whether the search should be recursive. + /// A sorted list of . internal virtual SortedList GetMergedTree(int portalId, string relativePath, bool isRecursive) { var fileSystemFolders = this.GetFileSystemFolders(portalId, relativePath, isRecursive); @@ -1395,14 +1479,18 @@ internal virtual SortedList GetMergedTree(int portalId, } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The folder mapping. + /// A value indicating whether the folder mapping is editable. internal virtual bool IsFolderMappingEditable(FolderMappingInfo folderMapping) { return folderMapping.IsEditable; } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The folder to move. + /// The destination folder to move the folder to. + /// The new folder path. + /// A value indicating whether the move operation would be valid. internal virtual bool IsMoveOperationValid(IFolderInfo folderToMove, IFolderInfo destinationFolder, string newFolderPath) { // FolderMapping cases @@ -1426,7 +1514,9 @@ internal virtual bool IsMoveOperationValid(IFolderInfo folderToMove, IFolderInfo } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The folder to move. + /// The distination folder to move the folder into. + /// A value indicating if the move operation would be valid. internal virtual bool IsMoveOperationValid(IFolderInfo folderToMove, string newFolderPath) { // Root folder cannot be moved @@ -1445,14 +1535,16 @@ internal virtual bool IsMoveOperationValid(IFolderInfo folderToMove, string newF } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// A value indicating whether the network is available. internal virtual bool IsNetworkAvailable() { return NetworkInterface.GetIsNetworkAvailable(); } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The first list for the merge. + /// The second list for the merge. + /// A merged sorted list of MergedTreeItems, . internal virtual SortedList MergeFolderLists(SortedList list1, SortedList list2) { foreach (var item in list2.Values) @@ -1489,6 +1581,8 @@ internal virtual SortedList MergeFolderLists(SortedList< } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The source directory. + /// The target directory. internal virtual void MoveDirectory(string source, string target) { var stack = new Stack(); @@ -1521,6 +1615,8 @@ internal virtual void MoveDirectory(string source, string target) } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to move. + /// The destination folder. internal virtual void MoveFolderWithinProvider(IFolderInfo folder, IFolderInfo destinationFolder) { var newFolderPath = destinationFolder.FolderPath + folder.FolderName + "/"; @@ -1537,6 +1633,8 @@ internal virtual void MoveFolderWithinProvider(IFolderInfo folder, IFolderInfo d } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to move. + /// The target folder for the move. internal virtual void MoveFolderBetweenProviders(IFolderInfo folder, string newFolderPath) { this.RenameFolderInFileSystem(folder, newFolderPath); @@ -1556,6 +1654,10 @@ internal virtual void MoveFolderBetweenProviders(IFolderInfo folder, string newF } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The source folder. + /// The destination folder. + /// The folder mappings. + /// The folders to delete. internal virtual void OverwriteFolder(IFolderInfo sourceFolder, IFolderInfo destinationFolder, Dictionary folderMappings, SortedList foldersToDelete) { var fileManager = FileManager.Instance; @@ -1578,6 +1680,8 @@ internal virtual void OverwriteFolder(IFolderInfo sourceFolder, IFolderInfo dest } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The item to process. + /// The site (portal) ID. internal virtual void ProcessMergedTreeItemInAddMode(MergedTreeItem item, int portalId) { try @@ -1599,8 +1703,9 @@ internal virtual void ProcessMergedTreeItemInAddMode(MergedTreeItem item, int po this.CreateFolderInFileSystem(PathUtils.Instance.GetPhysicalPath(portalId, item.FolderPath)); } } - else // by exclusion it exists in the Folder Mapping + else { + // by exclusion it exists in the Folder Mapping this.CreateFolderInFileSystem(PathUtils.Instance.GetPhysicalPath(portalId, item.FolderPath)); this.CreateFolderInDatabase(portalId, item.FolderPath, item.FolderMappingID, item.MappedPath); } @@ -1613,6 +1718,8 @@ internal virtual void ProcessMergedTreeItemInAddMode(MergedTreeItem item, int po } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// . + /// The site (portal) ID. internal virtual void ProcessMergedTreeItemInDeleteMode(MergedTreeItem item, int portalId) { if (item.ExistsInFileSystem) @@ -1646,6 +1753,7 @@ internal virtual void ProcessMergedTreeItemInDeleteMode(MergedTreeItem item, int } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to cleanup. internal virtual void RemoveOrphanedFiles(IFolderInfo folder) { var files = this.GetFiles(folder, false, true); @@ -1674,6 +1782,8 @@ internal virtual void RemoveOrphanedFiles(IFolderInfo folder) } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to rename. + /// The new folder path. internal virtual void RenameFolderInFileSystem(IFolderInfo folder, string newFolderPath) { var source = folder.PhysicalPath; @@ -1689,18 +1799,22 @@ internal virtual void RenameFolderInFileSystem(IFolderInfo folder, string newFol } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to save the permissions for. internal virtual void SaveFolderPermissions(IFolderInfo folder) { FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The timeout in seconds. internal virtual void SetScriptTimeout(int timeout) { HttpContext.Current.Server.ScriptTimeout = timeout; } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The item to synchronize. + /// The site (portal) ID. internal virtual void SynchronizeFiles(MergedTreeItem item, int portalId) { var folder = this.GetFolder(portalId, item.FolderPath); @@ -1763,6 +1877,8 @@ internal virtual void SynchronizeFiles(MergedTreeItem item, int portalId) } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The folder path to update. internal virtual void UpdateParentFolder(int portalId, string folderPath) { if (!string.IsNullOrEmpty(folderPath)) @@ -1778,6 +1894,8 @@ internal virtual void UpdateParentFolder(int portalId, string folderPath) } /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to update. + /// The new folder path. internal virtual void UpdateChildFolders(IFolderInfo folder, string newFolderPath) { var originalFolderPath = folder.FolderPath; @@ -1829,7 +1947,9 @@ internal virtual void UpdateChildFolders(IFolderInfo folder, string newFolderPat } /// This member is reserved for internal use and is not intended to be used directly from your code. - /// + /// The source folder mapping. + /// The destination folder mapping. + /// A value indicating whether a folder mapping can be moved to another one. internal virtual bool CanMoveBetweenFolderMappings(FolderMappingInfo sourceFolderMapping, FolderMappingInfo destinationFolderMapping) { // If Folder Mappings are exactly the same @@ -2262,18 +2382,39 @@ private void RemoveSyncFoldersData(string relativePath) /// internal class MergedTreeItem { + /// + /// Gets or sets a value indicating whether the item exists in the file system. + /// public bool ExistsInFileSystem { get; set; } + /// + /// Gets or sets a value indicating whether the item exists in the database. + /// public bool ExistsInDatabase { get; set; } + /// + /// Gets or sets a value indicating whether the item exists in the folder mappings. + /// public bool ExistsInFolderMapping { get; set; } + /// + /// Gets or sets the folder id. + /// public int FolderID { get; set; } + /// + /// Gets or sets the folder path. + /// public int FolderMappingID { get; set; } + /// + /// Gets or sets the folder path. + /// public string FolderPath { get; set; } + /// + /// Gets or sets the mapped path. + /// public string MappedPath { get; set; } } @@ -2281,7 +2422,8 @@ internal class MergedTreeItem /// This class and its members are reserved for internal use and are not intended to be used in your code. /// internal class IgnoreCaseStringComparer : IComparer - { + { + /// public int Compare(string x, string y) { return string.Compare(x.ToLowerInvariant(), y.ToLowerInvariant(), StringComparison.Ordinal); @@ -2292,25 +2434,27 @@ public int Compare(string x, string y) /// This class and its members are reserved for internal use and are not intended to be used in your code. /// internal class MoveFoldersInfo - { + { + /// + /// Initializes a new instance of the class. + /// + /// The source folder. + /// The destination folder. public MoveFoldersInfo(string source, string target) { this.Source = source; this.Target = target; } + /// + /// Gets the Souce folder. + /// public string Source { get; private set; } + /// + /// Gets the target folder. + /// public string Target { get; private set; } } } - - internal class SyncFolderData - { - public int PortalId { get; set; } - - public string FolderPath { get; set; } - - public FolderPermissionCollection Permissions { get; set; } - } } diff --git a/DNN Platform/Library/Services/FileSystem/SyncFolderData.cs b/DNN Platform/Library/Services/FileSystem/SyncFolderData.cs new file mode 100644 index 00000000000..26bf54a1570 --- /dev/null +++ b/DNN Platform/Library/Services/FileSystem/SyncFolderData.cs @@ -0,0 +1,29 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Services.FileSystem +{ + using DotNetNuke.Security.Permissions; + + /// + /// Represents the data about a folder to be synced. + /// + internal class SyncFolderData + { + /// + /// Gets or sets the site (portal) ID. + /// + public int PortalId { get; set; } + + /// + /// Gets or sets the folder path. + /// + public string FolderPath { get; set; } + + /// + /// Gets or sets the folder permissions. + /// + public FolderPermissionCollection Permissions { get; set; } + } +} From 4e90e245c1fc7cbaf4bdadf86d43caba59c4dd39 Mon Sep 17 00:00:00 2001 From: Jay Mathis Date: Mon, 6 Jul 2020 15:12:34 -0400 Subject: [PATCH 03/45] Add InjectSvg property to Logo theme object Resolves #3893 Co-authored-by: Daniel Valadas Co-authored-by: Brian Dukes --- DNN Platform/Website/admin/Skins/Logo.ascx.cs | 121 ++++++++++++++---- .../Website/admin/Skins/Logo.ascx.designer.cs | 29 +++-- DNN Platform/Website/admin/Skins/Logo.xml | 20 +++ DNN Platform/Website/admin/Skins/logo.ascx | 7 +- 4 files changed, 141 insertions(+), 36 deletions(-) diff --git a/DNN Platform/Website/admin/Skins/Logo.ascx.cs b/DNN Platform/Website/admin/Skins/Logo.ascx.cs index 59467fda11b..903019cd83a 100644 --- a/DNN Platform/Website/admin/Skins/Logo.ascx.cs +++ b/DNN Platform/Website/admin/Skins/Logo.ascx.cs @@ -1,37 +1,46 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information namespace DotNetNuke.UI.Skins.Controls { using System; + using System.Linq; using System.Web.UI.WebControls; + using System.Xml; + using System.Xml.Linq; using DotNetNuke.Abstractions; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Host; using DotNetNuke.Services.Exceptions; using DotNetNuke.Services.FileSystem; + using Microsoft.Extensions.DependencyInjection; - /// ----------------------------------------------------------------------------- - /// - /// - /// - /// ----------------------------------------------------------------------------- + /// Logo Skin Object public partial class Logo : SkinObjectBase { - private readonly INavigationManager _navigationManager; + private readonly INavigationManager navigationManager; + /// Initializes a new instance of the class. public Logo() { - this._navigationManager = Globals.DependencyProvider.GetRequiredService(); + this.navigationManager = Globals.DependencyProvider.GetRequiredService(); } + /// Gets or sets the width of the border around the image. public string BorderWidth { get; set; } + /// Gets or sets the CSS class for the image. public string CssClass { get; set; } + /// Gets or sets the CSS class for the hyperlink. + public string LinkCssClass { get; set; } + + /// Gets or sets a value indicating whether to inject the SVG content inline instead of wrapping it in an img tag. + public bool InjectSvg { get; set; } + + /// protected override void OnLoad(EventArgs e) { base.OnLoad(e); @@ -47,33 +56,43 @@ protected override void OnLoad(EventArgs e) this.imgLogo.CssClass = this.CssClass; } - bool logoVisible = false; + if (!string.IsNullOrEmpty(this.LinkCssClass)) + { + this.hypLogo.CssClass = this.LinkCssClass; + } + + this.litLogo.Visible = false; + this.imgLogo.Visible = false; if (!string.IsNullOrEmpty(this.PortalSettings.LogoFile)) { var fileInfo = this.GetLogoFileInfo(); if (fileInfo != null) { - string imageUrl = FileManager.Instance.GetUrl(fileInfo); - if (!string.IsNullOrEmpty(imageUrl)) + if (this.InjectSvg && "svg".Equals(fileInfo.Extension, StringComparison.OrdinalIgnoreCase)) + { + this.litLogo.Text = this.GetSvgContent(fileInfo); + this.litLogo.Visible = !string.IsNullOrEmpty(this.litLogo.Text); + } + + if (this.litLogo.Visible == false) { - this.imgLogo.ImageUrl = imageUrl; - logoVisible = true; + string imageUrl = FileManager.Instance.GetUrl(fileInfo); + if (!string.IsNullOrEmpty(imageUrl)) + { + this.imgLogo.ImageUrl = imageUrl; + this.imgLogo.Visible = true; + } } } } - this.imgLogo.Visible = logoVisible; this.imgLogo.AlternateText = this.PortalSettings.PortalName; this.hypLogo.ToolTip = this.PortalSettings.PortalName; - - if (!this.imgLogo.Visible) - { - this.hypLogo.Attributes.Add("aria-label", this.PortalSettings.PortalName); - } + this.hypLogo.Attributes.Add("aria-label", this.PortalSettings.PortalName); if (this.PortalSettings.HomeTabId != -1) { - this.hypLogo.NavigateUrl = this._navigationManager.NavigateURL(this.PortalSettings.HomeTabId); + this.hypLogo.NavigateUrl = this.navigationManager.NavigateURL(this.PortalSettings.HomeTabId); } else { @@ -100,5 +119,61 @@ private IFileInfo GetLogoFileInfoCallBack(CacheItemArgs itemArgs) { return FileManager.Instance.GetFile(this.PortalSettings.PortalId, this.PortalSettings.LogoFile); } + + private string GetSvgContent(IFileInfo svgFile) + { + var cacheKey = string.Format(DataCache.PortalCacheKey, this.PortalSettings.PortalId, this.PortalSettings.CultureCode) + "LogoSvg"; + return CBO.GetCachedObject( + new CacheItemArgs(cacheKey, DataCache.PortalCacheTimeOut, DataCache.PortalCachePriority, svgFile), + (_) => + { + try + { + XDocument svgDocument; + using (var fileContent = FileManager.Instance.GetFileContent(svgFile)) + { + svgDocument = XDocument.Load(fileContent); + } + + var svgXmlNode = svgDocument.Descendants() + .SingleOrDefault(x => x.Name.LocalName.Equals("svg", StringComparison.Ordinal)); + if (svgXmlNode == null) + { + throw new InvalidFileContentException("The svg file has no svg node."); + } + + if (!string.IsNullOrEmpty(this.CssClass)) + { + // Append the css class. + var classes = svgXmlNode.Attribute("class")?.Value; + svgXmlNode.SetAttributeValue("class", string.IsNullOrEmpty(classes) ? this.CssClass : $"{classes} {this.CssClass}"); + } + + if (svgXmlNode.Descendants().FirstOrDefault(x => x.Name.LocalName.Equals("title", StringComparison.Ordinal)) == null) + { + // Add the title for ADA compliance. + var ns = svgXmlNode.GetDefaultNamespace(); + var titleNode = new XElement( + ns + "title", + new XAttribute("id", this.litLogo.ClientID), + this.PortalSettings.PortalName); + + svgXmlNode.AddFirst(titleNode); + + // Link the title to the svg node. + svgXmlNode.SetAttributeValue("aria-labelledby", this.litLogo.ClientID); + } + + // Ensure we have the image role for ADA Compliance + svgXmlNode.SetAttributeValue("role", "img"); + + return svgDocument.ToString(); + } + catch (XmlException ex) + { + throw new InvalidFileContentException("Invalid SVG file: " + ex.Message); + } + }); + } } } diff --git a/DNN Platform/Website/admin/Skins/Logo.ascx.designer.cs b/DNN Platform/Website/admin/Skins/Logo.ascx.designer.cs index 3e66ce34888..6b21e7d604b 100644 --- a/DNN Platform/Website/admin/Skins/Logo.ascx.designer.cs +++ b/DNN Platform/Website/admin/Skins/Logo.ascx.designer.cs @@ -1,8 +1,4 @@ -// -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See LICENSE file in the project root for full license information. -// -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. // @@ -11,11 +7,13 @@ // //------------------------------------------------------------------------------ -namespace DotNetNuke.UI.Skins.Controls { - - - public partial class Logo { - +namespace DotNetNuke.UI.Skins.Controls +{ + + + public partial class Logo + { + /// /// hypLogo control. /// @@ -24,7 +22,7 @@ public partial class Logo { /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.WebControls.HyperLink hypLogo; - + /// /// imgLogo control. /// @@ -33,5 +31,14 @@ public partial class Logo { /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.WebControls.Image imgLogo; + + /// + /// litLogo control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litLogo; } } diff --git a/DNN Platform/Website/admin/Skins/Logo.xml b/DNN Platform/Website/admin/Skins/Logo.xml index 1d134a29973..5efd91598a1 100644 --- a/DNN Platform/Website/admin/Skins/Logo.xml +++ b/DNN Platform/Website/admin/Skins/Logo.xml @@ -5,4 +5,24 @@ Sets the border width of the logo image + + CssClass + String + Sets a CSS class on the logo + + + + LinkCssClass + String + Sets a CSS class on the hyperlink + + + + InjectSvg + Boolean + + If set to true, the control will read the contents of the Logo file, look for an svg tag, and inject it directly into the hyperlink + + + diff --git a/DNN Platform/Website/admin/Skins/logo.ascx b/DNN Platform/Website/admin/Skins/logo.ascx index 2922fd4d030..f90ddf01c9b 100644 --- a/DNN Platform/Website/admin/Skins/logo.ascx +++ b/DNN Platform/Website/admin/Skins/logo.ascx @@ -1,2 +1,5 @@ -<%@ Control Language="C#" AutoEventWireup="false" Inherits="DotNetNuke.UI.Skins.Controls.Logo" ViewStateMode="Disabled" Codebehind="Logo.ascx.cs" %> - \ No newline at end of file +<%@ Control Language="C#" AutoEventWireup="false" Inherits="DotNetNuke.UI.Skins.Controls.Logo" ViewStateMode="Disabled" CodeBehind="Logo.ascx.cs" %> + \ No newline at end of file From 39299ca2bf868d625f79ac80177c0f65c78835b3 Mon Sep 17 00:00:00 2001 From: David Poindexter Date: Sun, 12 Jul 2020 19:55:38 -0400 Subject: [PATCH 04/45] Move using statements inside namespace for DotNetNuke.Abstractions project --- .../DotNetNuke.Abstractions/INavigationManager.cs | 5 +---- .../DotNetNuke.Abstractions/Portals/IPortalAliasInfo.cs | 8 ++++---- .../DotNetNuke.Abstractions/Portals/IPortalSettings.cs | 8 +++----- .../DotNetNuke.Abstractions/Prompt/ICommandHelp.cs | 4 ++-- .../DotNetNuke.Abstractions/Prompt/ICommandRepository.cs | 4 ++-- .../DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs | 4 ++-- DNN Platform/DotNetNuke.Abstractions/Users/IUserInfo.cs | 8 ++++---- 7 files changed, 18 insertions(+), 23 deletions(-) diff --git a/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs b/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs index ce5582076d4..d87bed58c5e 100644 --- a/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs +++ b/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs @@ -4,10 +4,7 @@ namespace DotNetNuke.Abstractions { -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information -using DotNetNuke.Abstractions.Portals; + using DotNetNuke.Abstractions.Portals; public interface INavigationManager { diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalAliasInfo.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalAliasInfo.cs index 236a2573e81..0ad7259c3a5 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalAliasInfo.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalAliasInfo.cs @@ -1,12 +1,12 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -using System.Data; -using System.Xml; -using System.Xml.Schema; - namespace DotNetNuke.Abstractions.Portals { + using System.Data; + using System.Xml; + using System.Xml.Schema; + public interface IPortalAliasInfo { //BrowserTypes BrowserType { get; set; } diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs index 4b4f374011e..71b1fb52166 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs @@ -1,12 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -using System; -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information namespace DotNetNuke.Abstractions.Portals -{ +{ + using System; + public interface IPortalSettings { //TabInfo ActiveTab { get; set; } diff --git a/DNN Platform/DotNetNuke.Abstractions/Prompt/ICommandHelp.cs b/DNN Platform/DotNetNuke.Abstractions/Prompt/ICommandHelp.cs index 8ff708de153..746664dd163 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Prompt/ICommandHelp.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Prompt/ICommandHelp.cs @@ -1,10 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -using System.Collections.Generic; - namespace DotNetNuke.Abstractions.Prompt { + using System.Collections.Generic; + /// /// This is used to send the result back to the client when a user asks help for a command /// diff --git a/DNN Platform/DotNetNuke.Abstractions/Prompt/ICommandRepository.cs b/DNN Platform/DotNetNuke.Abstractions/Prompt/ICommandRepository.cs index 499150c6fcd..f8a7067b26e 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Prompt/ICommandRepository.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Prompt/ICommandRepository.cs @@ -1,10 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -using System.Collections.Generic; - namespace DotNetNuke.Abstractions.Prompt { + using System.Collections.Generic; + /// /// The repository handles retrieving of commands from the entire DNN installation /// diff --git a/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs b/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs index 410e5ff56fc..d713e6dde1e 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs @@ -1,10 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -using DotNetNuke.Abstractions.Users; - namespace DotNetNuke.Abstractions.Prompt { + using DotNetNuke.Abstractions.Users; + /// /// Interface implemented by all commands /// diff --git a/DNN Platform/DotNetNuke.Abstractions/Users/IUserInfo.cs b/DNN Platform/DotNetNuke.Abstractions/Users/IUserInfo.cs index 9bfb77ea68d..18887049254 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Users/IUserInfo.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Users/IUserInfo.cs @@ -1,12 +1,12 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -using System; -using System.Collections.Generic; -using System.Text; - namespace DotNetNuke.Abstractions.Users { + using System; + using System.Collections.Generic; + using System.Text; + public interface IUserInfo { int AffiliateID { get; set; } From 5ebc4b4afcd519b3d67e991d3250fa4e8e1cb57a Mon Sep 17 00:00:00 2001 From: Daniel Valadas Date: Mon, 13 Jul 2020 12:19:46 -0400 Subject: [PATCH 05/45] Delete 09.06.03.SqlDataProvider --- .../SqlDataProvider/09.06.03.SqlDataProvider | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.06.03.SqlDataProvider diff --git a/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.06.03.SqlDataProvider b/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.06.03.SqlDataProvider deleted file mode 100644 index 33a259d05fa..00000000000 --- a/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.06.03.SqlDataProvider +++ /dev/null @@ -1,9 +0,0 @@ -/************************************************************/ -/***** SqlDataProvider *****/ -/***** *****/ -/***** *****/ -/***** Note: To manually execute this script you must *****/ -/***** perform a search and replace operation *****/ -/***** for {databaseOwner} and {objectQualifier} *****/ -/***** *****/ -/************************************************************/ From 30d51f298506749d933d06bb888f54b1f34e0576 Mon Sep 17 00:00:00 2001 From: Mitchel Sellers Date: Mon, 13 Jul 2020 13:19:00 -0500 Subject: [PATCH 06/45] Update DNN Platform/Library/Services/FileSystem/FolderManager.cs Co-authored-by: Brian Dukes --- .../Services/FileSystem/FolderManager.cs | 4832 ++++++++--------- 1 file changed, 2416 insertions(+), 2416 deletions(-) diff --git a/DNN Platform/Library/Services/FileSystem/FolderManager.cs b/DNN Platform/Library/Services/FileSystem/FolderManager.cs index e9d78447ec6..73701ce6a9e 100644 --- a/DNN Platform/Library/Services/FileSystem/FolderManager.cs +++ b/DNN Platform/Library/Services/FileSystem/FolderManager.cs @@ -2,2459 +2,2459 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Services.FileSystem -{ - using System; - using System.Collections.Generic; - using System.Collections.ObjectModel; - using System.ComponentModel; - using System.Globalization; - using System.IO; - using System.Linq; - using System.Net.NetworkInformation; - using System.Reflection; - using System.Text.RegularExpressions; - using System.Threading; - using System.Web; - - using DotNetNuke.Common; - using DotNetNuke.Common.Internal; - using DotNetNuke.Common.Utilities; - using DotNetNuke.ComponentModel; - using DotNetNuke.Data; - using DotNetNuke.Entities; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Users; - using DotNetNuke.Instrumentation; - using DotNetNuke.Security.Permissions; - using DotNetNuke.Services.FileSystem.EventArgs; - using DotNetNuke.Services.FileSystem.Internal; - using DotNetNuke.Services.Log.EventLog; - - using Localization = DotNetNuke.Services.Localization.Localization; - - /// - /// Exposes methods to manage folders. - /// - public class FolderManager : ComponentBase, IFolderManager - { - private const string DefaultUsersFoldersPath = "Users"; - private const string DefaultMappedPathSetting = "DefaultMappedPath"; - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(FolderManager)); - private static readonly Dictionary SyncFoldersData = new Dictionary(); - private static readonly object ThreadLocker = new object(); - +namespace DotNetNuke.Services.FileSystem +{ + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.ComponentModel; + using System.Globalization; + using System.IO; + using System.Linq; + using System.Net.NetworkInformation; + using System.Reflection; + using System.Text.RegularExpressions; + using System.Threading; + using System.Web; + + using DotNetNuke.Common; + using DotNetNuke.Common.Internal; + using DotNetNuke.Common.Utilities; + using DotNetNuke.ComponentModel; + using DotNetNuke.Data; + using DotNetNuke.Entities; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Users; + using DotNetNuke.Instrumentation; + using DotNetNuke.Security.Permissions; + using DotNetNuke.Services.FileSystem.EventArgs; + using DotNetNuke.Services.FileSystem.Internal; + using DotNetNuke.Services.Log.EventLog; + + using Localization = DotNetNuke.Services.Localization.Localization; + + /// + /// Exposes methods to manage folders. + /// + public class FolderManager : ComponentBase, IFolderManager + { + private const string DefaultUsersFoldersPath = "Users"; + private const string DefaultMappedPathSetting = "DefaultMappedPath"; + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(FolderManager)); + private static readonly Dictionary SyncFoldersData = new Dictionary(); + private static readonly object ThreadLocker = new object(); + /// /// Gets the localization key for MyfolderName. - /// - public virtual string MyFolderName - { - get - { - return Localization.GetString("MyFolderName"); - } - } - - /// - /// Creates a new folder using the provided folder path. - /// - /// The folder mapping to use. - /// The path of the new folder. - /// Thrown when folderPath or folderMapping are null. - /// Thrown when the underlying system throw an exception. - /// The added folder. - public virtual IFolderInfo AddFolder(FolderMappingInfo folderMapping, string folderPath) - { - return this.AddFolder(folderMapping, folderPath, folderPath); - } - - /// - /// Creates a new folder using the provided folder path and mapping. - /// - /// The folder mapping to use. - /// The path of the new folder. - /// The mapped path of the new folder. - /// Thrown when folderPath or folderMapping are null. - /// Thrown when the underlying system throw an exception. - /// The added folder. - public virtual IFolderInfo AddFolder(FolderMappingInfo folderMapping, string folderPath, string mappedPath) - { - Requires.PropertyNotNull("folderPath", folderPath); - Requires.NotNull("folderMapping", folderMapping); - - folderPath = folderPath.Trim(); - - if (this.FolderExists(folderMapping.PortalID, folderPath)) - { - throw new FolderAlreadyExistsException(Localization.GetExceptionMessage("AddFolderAlreadyExists", "The provided folder path already exists. The folder has not been added.")); - } - - if (!this.IsValidFolderPath(folderPath)) - { - throw new InvalidFolderPathException(Localization.GetExceptionMessage("AddFolderNotAllowed", "The folder path '{0}' is not allowed. The folder has not been added.", folderPath)); - } - - var parentFolder = this.GetParentFolder(folderMapping.PortalID, folderPath); - if (parentFolder != null) - { - var parentFolderMapping = FolderMappingController.Instance.GetFolderMapping( - parentFolder.PortalID, - parentFolder.FolderMappingID); - if (FolderProvider.Instance(parentFolderMapping.FolderProviderType).SupportsMappedPaths) - { - folderMapping = parentFolderMapping; - mappedPath = string.IsNullOrEmpty(parentFolder.FolderPath) ? PathUtils.Instance.FormatFolderPath(parentFolder.MappedPath + folderPath) - : PathUtils.Instance.FormatFolderPath(parentFolder.MappedPath + folderPath.Replace(parentFolder.FolderPath, string.Empty)); - } - else if (!FolderProvider.Instance(folderMapping.FolderProviderType).SupportsMappedPaths) - { - mappedPath = folderPath; - } - else - { - // Parent foldermapping DOESN'T support mapped path - // abd current foldermapping YES support mapped path - mappedPath = PathUtils.Instance.FormatFolderPath(this.GetDefaultMappedPath(folderMapping) + mappedPath); - } - } - else if (FolderProvider.Instance(folderMapping.FolderProviderType).SupportsMappedPaths) - { - mappedPath = PathUtils.Instance.FormatFolderPath(this.GetDefaultMappedPath(folderMapping) + mappedPath); - } - - try - { - FolderProvider.Instance(folderMapping.FolderProviderType).AddFolder(folderPath, folderMapping, mappedPath); - } - catch (Exception ex) - { - Logger.Error(ex); - - throw new FolderProviderException(Localization.GetExceptionMessage("AddFolderUnderlyingSystemError", "The underlying system threw an exception. The folder has not been added."), ex); - } - - this.CreateFolderInFileSystem(PathUtils.Instance.GetPhysicalPath(folderMapping.PortalID, folderPath)); - var folderId = this.CreateFolderInDatabase(folderMapping.PortalID, folderPath, folderMapping.FolderMappingID, mappedPath); - - var folder = this.GetFolder(folderId); - - // Notify add folder event - this.OnFolderAdded(folder, this.GetCurrentUserId()); - - return folder; - } - - /// - /// Creates a new folder in the given portal using the provided folder path. - /// The same mapping than the parent folder will be used to create this folder. So this method have to be used only to create subfolders. - /// - /// The portal identifier. - /// The path of the new folder. - /// Thrown when folderPath is null or empty. - /// The added folder. - public virtual IFolderInfo AddFolder(int portalId, string folderPath) - { - Requires.NotNullOrEmpty("folderPath", folderPath); - - folderPath = PathUtils.Instance.FormatFolderPath(folderPath); - - var parentFolderPath = folderPath.Substring(0, folderPath.Substring(0, folderPath.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1); - var parentFolder = this.GetFolder(portalId, parentFolderPath) ?? this.AddFolder(portalId, parentFolderPath); - - var folderMapping = FolderMappingController.Instance.GetFolderMapping(portalId, parentFolder.FolderMappingID); - - return this.AddFolder(folderMapping, folderPath); - } - - /// - /// Deletes the specified folder. - /// - /// The folder to delete. - /// Thrown when folder is null. - /// Thrown when the underlying system throw an exception. - public virtual void DeleteFolder(IFolderInfo folder) - { - this.DeleteFolderInternal(folder, false); - } - + /// + public virtual string MyFolderName + { + get + { + return Localization.GetString("MyFolderName"); + } + } + + /// + /// Creates a new folder using the provided folder path. + /// + /// The folder mapping to use. + /// The path of the new folder. + /// Thrown when folderPath or folderMapping are null. + /// Thrown when the underlying system throw an exception. + /// The added folder. + public virtual IFolderInfo AddFolder(FolderMappingInfo folderMapping, string folderPath) + { + return this.AddFolder(folderMapping, folderPath, folderPath); + } + + /// + /// Creates a new folder using the provided folder path and mapping. + /// + /// The folder mapping to use. + /// The path of the new folder. + /// The mapped path of the new folder. + /// Thrown when folderPath or folderMapping are null. + /// Thrown when the underlying system throw an exception. + /// The added folder. + public virtual IFolderInfo AddFolder(FolderMappingInfo folderMapping, string folderPath, string mappedPath) + { + Requires.PropertyNotNull("folderPath", folderPath); + Requires.NotNull("folderMapping", folderMapping); + + folderPath = folderPath.Trim(); + + if (this.FolderExists(folderMapping.PortalID, folderPath)) + { + throw new FolderAlreadyExistsException(Localization.GetExceptionMessage("AddFolderAlreadyExists", "The provided folder path already exists. The folder has not been added.")); + } + + if (!this.IsValidFolderPath(folderPath)) + { + throw new InvalidFolderPathException(Localization.GetExceptionMessage("AddFolderNotAllowed", "The folder path '{0}' is not allowed. The folder has not been added.", folderPath)); + } + + var parentFolder = this.GetParentFolder(folderMapping.PortalID, folderPath); + if (parentFolder != null) + { + var parentFolderMapping = FolderMappingController.Instance.GetFolderMapping( + parentFolder.PortalID, + parentFolder.FolderMappingID); + if (FolderProvider.Instance(parentFolderMapping.FolderProviderType).SupportsMappedPaths) + { + folderMapping = parentFolderMapping; + mappedPath = string.IsNullOrEmpty(parentFolder.FolderPath) ? PathUtils.Instance.FormatFolderPath(parentFolder.MappedPath + folderPath) + : PathUtils.Instance.FormatFolderPath(parentFolder.MappedPath + folderPath.Replace(parentFolder.FolderPath, string.Empty)); + } + else if (!FolderProvider.Instance(folderMapping.FolderProviderType).SupportsMappedPaths) + { + mappedPath = folderPath; + } + else + { + // Parent foldermapping DOESN'T support mapped path + // abd current foldermapping YES support mapped path + mappedPath = PathUtils.Instance.FormatFolderPath(this.GetDefaultMappedPath(folderMapping) + mappedPath); + } + } + else if (FolderProvider.Instance(folderMapping.FolderProviderType).SupportsMappedPaths) + { + mappedPath = PathUtils.Instance.FormatFolderPath(this.GetDefaultMappedPath(folderMapping) + mappedPath); + } + + try + { + FolderProvider.Instance(folderMapping.FolderProviderType).AddFolder(folderPath, folderMapping, mappedPath); + } + catch (Exception ex) + { + Logger.Error(ex); + + throw new FolderProviderException(Localization.GetExceptionMessage("AddFolderUnderlyingSystemError", "The underlying system threw an exception. The folder has not been added."), ex); + } + + this.CreateFolderInFileSystem(PathUtils.Instance.GetPhysicalPath(folderMapping.PortalID, folderPath)); + var folderId = this.CreateFolderInDatabase(folderMapping.PortalID, folderPath, folderMapping.FolderMappingID, mappedPath); + + var folder = this.GetFolder(folderId); + + // Notify add folder event + this.OnFolderAdded(folder, this.GetCurrentUserId()); + + return folder; + } + + /// + /// Creates a new folder in the given portal using the provided folder path. + /// The same mapping than the parent folder will be used to create this folder. So this method have to be used only to create subfolders. + /// + /// The portal identifier. + /// The path of the new folder. + /// Thrown when folderPath is null or empty. + /// The added folder. + public virtual IFolderInfo AddFolder(int portalId, string folderPath) + { + Requires.NotNullOrEmpty("folderPath", folderPath); + + folderPath = PathUtils.Instance.FormatFolderPath(folderPath); + + var parentFolderPath = folderPath.Substring(0, folderPath.Substring(0, folderPath.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1); + var parentFolder = this.GetFolder(portalId, parentFolderPath) ?? this.AddFolder(portalId, parentFolderPath); + + var folderMapping = FolderMappingController.Instance.GetFolderMapping(portalId, parentFolder.FolderMappingID); + + return this.AddFolder(folderMapping, folderPath); + } + + /// + /// Deletes the specified folder. + /// + /// The folder to delete. + /// Thrown when folder is null. + /// Thrown when the underlying system throw an exception. + public virtual void DeleteFolder(IFolderInfo folder) + { + this.DeleteFolderInternal(folder, false); + } + /// /// Removes the database reference to a folder on disk. /// - /// The folder to unlink. - public virtual void UnlinkFolder(IFolderInfo folder) - { - this.DeleteFolderRecursive(folder, new Collection(), true, true); - } - - /// - /// Deletes the specified folder. - /// - /// The folder identifier. - public virtual void DeleteFolder(int folderId) - { - var folder = this.GetFolder(folderId); - - this.DeleteFolder(folder); - } - - /// - /// Deletes the specified folder and all its content. - /// - /// The folder to delete. - /// A collection with all not deleted subfolders after processiong the action. - public void DeleteFolder(IFolderInfo folder, ICollection notDeletedSubfolders) - { - this.DeleteFolderRecursive(folder, notDeletedSubfolders, true, this.GetOnlyUnmap(folder)); - } - - /// - /// Checks the existence of the specified folder in the specified portal. - /// - /// The portal where to check the existence of the folder. - /// The path of folder to check the existence of. - /// A bool value indicating whether the folder exists or not in the specified portal. - public virtual bool FolderExists(int portalId, string folderPath) - { - Requires.PropertyNotNull("folderPath", folderPath); - - return this.GetFolder(portalId, folderPath) != null; - } - - /// - /// Gets the files contained in the specified folder. - /// - /// The folder from which to retrieve the files. - /// The list of files contained in the specified folder. - public virtual IEnumerable GetFiles(IFolderInfo folder) - { - return this.GetFiles(folder, false); - } - - /// - /// Gets the files contained in the specified folder. - /// - /// The folder from which to retrieve the files. - /// Whether or not to include all the subfolders. - /// The list of files contained in the specified folder. - public virtual IEnumerable GetFiles(IFolderInfo folder, bool recursive) - { - return this.GetFiles(folder, recursive, false); - } - - /// - /// Gets the files contained in the specified folder. - /// - /// The folder from which to retrieve the files. - /// Whether or not to include all the subfolders. - /// Indicates if the file is retrieved from All files or from Published files. - /// The list of files contained in the specified folder. - public virtual IEnumerable GetFiles(IFolderInfo folder, bool recursive, bool retrieveUnpublishedFiles) - { - Requires.NotNull("folder", folder); - - return CBO.Instance.FillCollection(DataProvider.Instance().GetFiles(folder.FolderID, retrieveUnpublishedFiles, recursive)); - } - - /// - /// Gets the list of Standard folders the specified user has the provided permissions. - /// - /// The user info. - /// The permissions the folders have to met. - /// The list of Standard folders the specified user has the provided permissions. - /// This method is used to support legacy behaviours and situations where we know the file/folder is in the file system. - public virtual IEnumerable GetFileSystemFolders(UserInfo user, string permissions) - { - var userFolders = new List(); - - var portalId = user.PortalID; - - var userFolder = this.GetUserFolder(user); - - var defaultFolderMaping = FolderMappingController.Instance.GetDefaultFolderMapping(portalId); - - var folders = this.GetFolders(portalId, permissions, user.UserID).Where(f => f.FolderPath != null && f.FolderMappingID == defaultFolderMaping.FolderMappingID); - - foreach (var folder in folders) - { - if (folder.FolderPath.StartsWith(DefaultUsersFoldersPath + "/", StringComparison.InvariantCultureIgnoreCase)) - { - if (folder.FolderID == userFolder.FolderID) - { - folder.DisplayPath = this.MyFolderName + "/"; - folder.DisplayName = this.MyFolderName; - } - else if (!folder.FolderPath.StartsWith(userFolder.FolderPath, StringComparison.InvariantCultureIgnoreCase)) - { - // Allow UserFolder children - continue; - } - } - - userFolders.Add(folder); - } - - return userFolders; - } - - /// - /// Gets a folder entity by providing a folder identifier. - /// - /// The identifier of the folder. - /// The folder entity or null if the folder cannot be located. - public virtual IFolderInfo GetFolder(int folderId) - { - // Try and get the folder from the portal cache - IFolderInfo folder = null; - var portalSettings = PortalController.Instance.GetCurrentSettings(); - if (portalSettings != null) - { - var folders = this.GetFolders(portalSettings.PortalId); - folder = folders.SingleOrDefault(f => f.FolderID == folderId) ?? CBO.Instance.FillObject(DataProvider.Instance().GetFolder(folderId)); - } - - return folder ?? CBO.Instance.FillObject(DataProvider.Instance().GetFolder(folderId)); - } - - /// - /// Gets a folder entity by providing a portal identifier and folder path. - /// - /// The portal where the folder exists. - /// The path of the folder. - /// The folder entity or null if the folder cannot be located. - public virtual IFolderInfo GetFolder(int portalId, string folderPath) - { - Requires.PropertyNotNull("folderPath", folderPath); - - folderPath = PathUtils.Instance.FormatFolderPath(folderPath); - - var folders = this.GetFolders(portalId); - return folders.SingleOrDefault(f => f.FolderPath == folderPath) ?? CBO.Instance.FillObject(DataProvider.Instance().GetFolder(portalId, folderPath)); - } - - /// - /// Gets a folder entity by providing its unique id. - /// - /// The unique id of the folder. - /// The folder entity or null if the folder cannot be located. - public virtual IFolderInfo GetFolder(Guid uniqueId) - { - return CBO.Instance.FillObject(DataProvider.Instance().GetFolderByUniqueID(uniqueId)); - } - - /// - /// Gets the list of subfolders for the specified folder. - /// - /// The folder to get the list of subfolders. - /// The list of subfolders for the specified folder. - /// Thrown when parentFolder is null. - public virtual IEnumerable GetFolders(IFolderInfo parentFolder) - { - return this.GetFolders(parentFolder, false); - } - - /// - /// Gets the sorted list of folders of the provided portal. - /// - /// The portal identifier. - /// True = Read from Cache, False = Read from DB. - /// The sorted list of folders of the provided portal. - public virtual IEnumerable GetFolders(int portalId, bool useCache) - { - if (!useCache) - { - this.ClearFolderCache(portalId); - } - - return this.GetFolders(portalId); - } - - /// - /// Gets the sorted list of folders of the provided portal. - /// - /// The portal identifier. - /// The sorted list of folders of the provided portal. - public virtual IEnumerable GetFolders(int portalId) - { - var folders = new List(); - - var cacheKey = string.Format(DataCache.FolderCacheKey, portalId); - CBO.Instance.GetCachedObject>(new CacheItemArgs(cacheKey, DataCache.FolderCacheTimeOut, DataCache.FolderCachePriority, portalId), this.GetFoldersSortedCallBack, false).ForEach(folders.Add); - - return folders; - } - - /// - /// Gets the sorted list of folders that match the provided permissions in the specified portal. - /// - /// The portal identifier. - /// The permissions to match. - /// The user identifier to be used to check permissions. - /// The list of folders that match the provided permissions in the specified portal. - public virtual IEnumerable GetFolders(int portalId, string permissions, int userId) - { - var folders = new List(); - - var cacheKey = string.Format(DataCache.FolderUserCacheKey, portalId, permissions, userId); - var cacheItemArgs = new CacheItemArgs(cacheKey, DataCache.FolderUserCacheTimeOut, DataCache.FolderUserCachePriority, portalId, permissions, userId); - CBO.Instance.GetCachedObject>(cacheItemArgs, this.GetFoldersByPermissionSortedCallBack, false).ForEach(folders.Add); - - return folders; - } - - /// - /// Gets the list of folders the specified user has read permissions. - /// - /// The user info. - /// The list of folders the specified user has read permissions. - public virtual IEnumerable GetFolders(UserInfo user) - { - return this.GetFolders(user, "READ"); - } - - /// - /// Gets the list of folders the specified user has the provided permissions. - /// - /// The user info. - /// The permissions the folders have to met. - /// The list of folders the specified user has the provided permissions. - public virtual IEnumerable GetFolders(UserInfo user, string permissions) - { - var userFolders = new List(); - - var portalId = user.PortalID; - - var userFolder = this.GetUserFolder(user); - - foreach (var folder in this.GetFolders(portalId, permissions, user.UserID).Where(folder => folder.FolderPath != null)) - { - if (folder.FolderPath.StartsWith(DefaultUsersFoldersPath + "/", StringComparison.InvariantCultureIgnoreCase)) - { - if (folder.FolderID == userFolder.FolderID) - { - folder.DisplayPath = Localization.GetString("MyFolderName") + "/"; - folder.DisplayName = Localization.GetString("MyFolderName"); - } - else if (!folder.FolderPath.StartsWith(userFolder.FolderPath, StringComparison.InvariantCultureIgnoreCase)) - { - // Allow UserFolder children - continue; - } - } - - userFolders.Add(folder); - } - - return userFolders; - } - + /// The folder to unlink. + public virtual void UnlinkFolder(IFolderInfo folder) + { + this.DeleteFolderRecursive(folder, new Collection(), true, true); + } + + /// + /// Deletes the specified folder. + /// + /// The folder identifier. + public virtual void DeleteFolder(int folderId) + { + var folder = this.GetFolder(folderId); + + this.DeleteFolder(folder); + } + + /// + /// Deletes the specified folder and all its content. + /// + /// The folder to delete. + /// A collection with all not deleted subfolders after processiong the action. + public void DeleteFolder(IFolderInfo folder, ICollection notDeletedSubfolders) + { + this.DeleteFolderRecursive(folder, notDeletedSubfolders, true, this.GetOnlyUnmap(folder)); + } + + /// + /// Checks the existence of the specified folder in the specified portal. + /// + /// The portal where to check the existence of the folder. + /// The path of folder to check the existence of. + /// A bool value indicating whether the folder exists or not in the specified portal. + public virtual bool FolderExists(int portalId, string folderPath) + { + Requires.PropertyNotNull("folderPath", folderPath); + + return this.GetFolder(portalId, folderPath) != null; + } + + /// + /// Gets the files contained in the specified folder. + /// + /// The folder from which to retrieve the files. + /// The list of files contained in the specified folder. + public virtual IEnumerable GetFiles(IFolderInfo folder) + { + return this.GetFiles(folder, false); + } + + /// + /// Gets the files contained in the specified folder. + /// + /// The folder from which to retrieve the files. + /// Whether or not to include all the subfolders. + /// The list of files contained in the specified folder. + public virtual IEnumerable GetFiles(IFolderInfo folder, bool recursive) + { + return this.GetFiles(folder, recursive, false); + } + + /// + /// Gets the files contained in the specified folder. + /// + /// The folder from which to retrieve the files. + /// Whether or not to include all the subfolders. + /// Indicates if the file is retrieved from All files or from Published files. + /// The list of files contained in the specified folder. + public virtual IEnumerable GetFiles(IFolderInfo folder, bool recursive, bool retrieveUnpublishedFiles) + { + Requires.NotNull("folder", folder); + + return CBO.Instance.FillCollection(DataProvider.Instance().GetFiles(folder.FolderID, retrieveUnpublishedFiles, recursive)); + } + + /// + /// Gets the list of Standard folders the specified user has the provided permissions. + /// + /// The user info. + /// The permissions the folders have to met. + /// The list of Standard folders the specified user has the provided permissions. + /// This method is used to support legacy behaviours and situations where we know the file/folder is in the file system. + public virtual IEnumerable GetFileSystemFolders(UserInfo user, string permissions) + { + var userFolders = new List(); + + var portalId = user.PortalID; + + var userFolder = this.GetUserFolder(user); + + var defaultFolderMaping = FolderMappingController.Instance.GetDefaultFolderMapping(portalId); + + var folders = this.GetFolders(portalId, permissions, user.UserID).Where(f => f.FolderPath != null && f.FolderMappingID == defaultFolderMaping.FolderMappingID); + + foreach (var folder in folders) + { + if (folder.FolderPath.StartsWith(DefaultUsersFoldersPath + "/", StringComparison.InvariantCultureIgnoreCase)) + { + if (folder.FolderID == userFolder.FolderID) + { + folder.DisplayPath = this.MyFolderName + "/"; + folder.DisplayName = this.MyFolderName; + } + else if (!folder.FolderPath.StartsWith(userFolder.FolderPath, StringComparison.InvariantCultureIgnoreCase)) + { + // Allow UserFolder children + continue; + } + } + + userFolders.Add(folder); + } + + return userFolders; + } + + /// + /// Gets a folder entity by providing a folder identifier. + /// + /// The identifier of the folder. + /// The folder entity or null if the folder cannot be located. + public virtual IFolderInfo GetFolder(int folderId) + { + // Try and get the folder from the portal cache + IFolderInfo folder = null; + var portalSettings = PortalController.Instance.GetCurrentSettings(); + if (portalSettings != null) + { + var folders = this.GetFolders(portalSettings.PortalId); + folder = folders.SingleOrDefault(f => f.FolderID == folderId) ?? CBO.Instance.FillObject(DataProvider.Instance().GetFolder(folderId)); + } + + return folder ?? CBO.Instance.FillObject(DataProvider.Instance().GetFolder(folderId)); + } + + /// + /// Gets a folder entity by providing a portal identifier and folder path. + /// + /// The portal where the folder exists. + /// The path of the folder. + /// The folder entity or null if the folder cannot be located. + public virtual IFolderInfo GetFolder(int portalId, string folderPath) + { + Requires.PropertyNotNull("folderPath", folderPath); + + folderPath = PathUtils.Instance.FormatFolderPath(folderPath); + + var folders = this.GetFolders(portalId); + return folders.SingleOrDefault(f => f.FolderPath == folderPath) ?? CBO.Instance.FillObject(DataProvider.Instance().GetFolder(portalId, folderPath)); + } + + /// + /// Gets a folder entity by providing its unique id. + /// + /// The unique id of the folder. + /// The folder entity or null if the folder cannot be located. + public virtual IFolderInfo GetFolder(Guid uniqueId) + { + return CBO.Instance.FillObject(DataProvider.Instance().GetFolderByUniqueID(uniqueId)); + } + + /// + /// Gets the list of subfolders for the specified folder. + /// + /// The folder to get the list of subfolders. + /// The list of subfolders for the specified folder. + /// Thrown when parentFolder is null. + public virtual IEnumerable GetFolders(IFolderInfo parentFolder) + { + return this.GetFolders(parentFolder, false); + } + + /// + /// Gets the sorted list of folders of the provided portal. + /// + /// The portal identifier. + /// True = Read from Cache, False = Read from DB. + /// The sorted list of folders of the provided portal. + public virtual IEnumerable GetFolders(int portalId, bool useCache) + { + if (!useCache) + { + this.ClearFolderCache(portalId); + } + + return this.GetFolders(portalId); + } + + /// + /// Gets the sorted list of folders of the provided portal. + /// + /// The portal identifier. + /// The sorted list of folders of the provided portal. + public virtual IEnumerable GetFolders(int portalId) + { + var folders = new List(); + + var cacheKey = string.Format(DataCache.FolderCacheKey, portalId); + CBO.Instance.GetCachedObject>(new CacheItemArgs(cacheKey, DataCache.FolderCacheTimeOut, DataCache.FolderCachePriority, portalId), this.GetFoldersSortedCallBack, false).ForEach(folders.Add); + + return folders; + } + + /// + /// Gets the sorted list of folders that match the provided permissions in the specified portal. + /// + /// The portal identifier. + /// The permissions to match. + /// The user identifier to be used to check permissions. + /// The list of folders that match the provided permissions in the specified portal. + public virtual IEnumerable GetFolders(int portalId, string permissions, int userId) + { + var folders = new List(); + + var cacheKey = string.Format(DataCache.FolderUserCacheKey, portalId, permissions, userId); + var cacheItemArgs = new CacheItemArgs(cacheKey, DataCache.FolderUserCacheTimeOut, DataCache.FolderUserCachePriority, portalId, permissions, userId); + CBO.Instance.GetCachedObject>(cacheItemArgs, this.GetFoldersByPermissionSortedCallBack, false).ForEach(folders.Add); + + return folders; + } + + /// + /// Gets the list of folders the specified user has read permissions. + /// + /// The user info. + /// The list of folders the specified user has read permissions. + public virtual IEnumerable GetFolders(UserInfo user) + { + return this.GetFolders(user, "READ"); + } + + /// + /// Gets the list of folders the specified user has the provided permissions. + /// + /// The user info. + /// The permissions the folders have to met. + /// The list of folders the specified user has the provided permissions. + public virtual IEnumerable GetFolders(UserInfo user, string permissions) + { + var userFolders = new List(); + + var portalId = user.PortalID; + + var userFolder = this.GetUserFolder(user); + + foreach (var folder in this.GetFolders(portalId, permissions, user.UserID).Where(folder => folder.FolderPath != null)) + { + if (folder.FolderPath.StartsWith(DefaultUsersFoldersPath + "/", StringComparison.InvariantCultureIgnoreCase)) + { + if (folder.FolderID == userFolder.FolderID) + { + folder.DisplayPath = Localization.GetString("MyFolderName") + "/"; + folder.DisplayName = Localization.GetString("MyFolderName"); + } + else if (!folder.FolderPath.StartsWith(userFolder.FolderPath, StringComparison.InvariantCultureIgnoreCase)) + { + // Allow UserFolder children + continue; + } + } + + userFolders.Add(folder); + } + + return userFolders; + } + /// /// Gets the folder that belongs to a specific user. /// /// The user to get the folder for. - /// The informaiton about the the user folder, . - public virtual IFolderInfo GetUserFolder(UserInfo userInfo) - { - // always use _default portal for a super user - int portalId = userInfo.IsSuperUser ? -1 : userInfo.PortalID; - - string userFolderPath = ((PathUtils)PathUtils.Instance).GetUserFolderPathInternal(userInfo); - return this.GetFolder(portalId, userFolderPath) ?? this.AddUserFolder(userInfo); - } - + /// The information about the the user folder, . + public virtual IFolderInfo GetUserFolder(UserInfo userInfo) + { + // always use _default portal for a super user + int portalId = userInfo.IsSuperUser ? -1 : userInfo.PortalID; + + string userFolderPath = ((PathUtils)PathUtils.Instance).GetUserFolderPathInternal(userInfo); + return this.GetFolder(portalId, userFolderPath) ?? this.AddUserFolder(userInfo); + } + /// /// Moves a folder to a new location. /// /// The folder to move. - /// Where to move the new folder. - /// The information about the moved folder, . - public virtual IFolderInfo MoveFolder(IFolderInfo folder, IFolderInfo destinationFolder) - { - Requires.NotNull("folder", folder); - Requires.NotNull("destinationFolder", destinationFolder); - - var newFolderPath = PathUtils.Instance.FormatFolderPath(destinationFolder.FolderPath + folder.FolderName + "/"); - - if (folder.FolderPath == destinationFolder.FolderPath) - { - return folder; - } - - if (this.FolderExists(folder.PortalID, newFolderPath)) - { - throw new InvalidOperationException(string.Format( - Localization.GetExceptionMessage( - "CannotMoveFolderAlreadyExists", - "The folder with name '{0}' cannot be moved. A folder with that name already exists under the folder '{1}'.", - folder.FolderName, - destinationFolder.FolderName))); - } - - var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); - var destinationFolderMapping = FolderMappingController.Instance.GetFolderMapping(destinationFolder.PortalID, destinationFolder.FolderMappingID); - - if (!this.CanMoveBetweenFolderMappings(folderMapping, destinationFolderMapping)) - { - throw new InvalidOperationException(string.Format( - Localization.GetExceptionMessage( - "CannotMoveFolderBetweenFolderType", - "The folder with name '{0}' cannot be moved. Move Folder operation between this two folder types is not allowed", - folder.FolderName))); - } - - if (!this.IsMoveOperationValid(folder, destinationFolder, newFolderPath)) - { - throw new InvalidOperationException(Localization.GetExceptionMessage("MoveFolderCannotComplete", "The operation cannot be completed.")); - } - - var currentFolderPath = folder.FolderPath; - - if ((folder.FolderMappingID == destinationFolder.FolderMappingID && FolderProvider.Instance(folderMapping.FolderProviderType).SupportsMoveFolder) || - (IsStandardFolderProviderType(folderMapping) && IsStandardFolderProviderType(destinationFolderMapping))) - { - this.MoveFolderWithinProvider(folder, destinationFolder); - } - else - { - this.MoveFolderBetweenProviders(folder, newFolderPath); - } - - // log the folder moved event. - var log = new LogInfo(); - log.AddProperty("Old Folder Path", currentFolderPath); - log.AddProperty("New Folder Path", newFolderPath); - log.AddProperty("Home Directory", folder.PortalID == Null.NullInteger ? Globals.HostPath : PortalSettings.Current.HomeDirectory); - log.LogTypeKey = EventLogController.EventLogType.FOLDER_MOVED.ToString(); - LogController.Instance.AddLog(log); - - // Files in cache are obsolete because their physical path is not correct after moving - this.DeleteFilesFromCache(folder.PortalID, newFolderPath); - var movedFolder = this.GetFolder(folder.FolderID); - - // Notify folder moved event - this.OnFolderMoved(folder, this.GetCurrentUserId(), currentFolderPath); - - return movedFolder; - } - - /// - /// Renames the specified folder by setting the new provided folder name. - /// - /// The folder to rename. - /// The new name to apply to the folder. - /// Thrown when newFolderName is null or empty. - /// Thrown when folder is null. - /// Thrown when the underlying system throw an exception. - public virtual void RenameFolder(IFolderInfo folder, string newFolderName) - { - Requires.NotNull("folder", folder); - Requires.NotNullOrEmpty("newFolderName", newFolderName); - - if (folder.FolderName.Equals(newFolderName)) - { - return; - } - - var currentFolderName = folder.FolderName; - - var newFolderPath = folder.FolderPath.Substring(0, folder.FolderPath.LastIndexOf(folder.FolderName, StringComparison.Ordinal)) + PathUtils.Instance.FormatFolderPath(newFolderName); - - if (this.FolderExists(folder.PortalID, newFolderPath)) - { - throw new FolderAlreadyExistsException(Localization.GetExceptionMessage("RenameFolderAlreadyExists", "The destination folder already exists. The folder has not been renamed.")); - } - - var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); - var provider = FolderProvider.Instance(folderMapping.FolderProviderType); - - this.RenameFolderInFileSystem(folder, newFolderPath); - - // Update Provider - provider.RenameFolder(folder, newFolderName); - - // Update database - this.UpdateChildFolders(folder, newFolderPath); - - // Files in cache are obsolete because their physical path is not correct after rename - this.DeleteFilesFromCache(folder.PortalID, newFolderPath); - - // Notify folder renamed event - this.OnFolderRenamed(folder, this.GetCurrentUserId(), currentFolderName); - } - - /// - /// Search the files contained in the specified folder, for a matching pattern. - /// - /// The folder from which to retrieve the files. - /// The patter to search for. - /// Shoud the search be recursive. - /// The list of files contained in the specified folder. - public virtual IEnumerable SearchFiles(IFolderInfo folder, string pattern, bool recursive) - { - Requires.NotNull("folder", folder); - - if (!FolderPermissionController.Instance.CanViewFolder(folder)) - { - throw new FolderProviderException("No permission to view the folder"); - } - - return this.SearchFiles(folder, WildcardToRegex(pattern), recursive); - } - - /// - /// Synchronizes the entire folder tree for the specified portal. - /// - /// The portal identifier. - /// The number of folder collisions. - public virtual int Synchronize(int portalId) - { - var folderCollisions = this.Synchronize(portalId, string.Empty, true, true); - - DataCache.ClearFolderCache(portalId); - - return folderCollisions; - } - - /// - /// Syncrhonizes the specified folder, its files and its subfolders. - /// - /// The portal identifier. - /// The relative path of the folder. - /// The number of folder collisions. - public virtual int Synchronize(int portalId, string relativePath) - { - return this.Synchronize(portalId, relativePath, true, true); - } - - /// - /// Syncrhonizes the specified folder, its files and, optionally, its subfolders. - /// - /// The portal identifier. - /// The relative path of the folder. - /// Indicates if the synchronization has to be recursive. - /// Indicates if files need to be synchronized. - /// Thrown when there are folder mappings requiring network connection but there is no network available. - /// The number of folder collisions. - public virtual int Synchronize(int portalId, string relativePath, bool isRecursive, bool syncFiles) - { - Requires.PropertyNotNull("relativePath", relativePath); - - if (this.AreThereFolderMappingsRequiringNetworkConnectivity(portalId, relativePath, isRecursive) && !this.IsNetworkAvailable()) - { - throw new NoNetworkAvailableException(Localization.GetExceptionMessage("NoNetworkAvailableError", "Network connectivity is needed but there is no network available.")); - } - - int? scriptTimeOut = null; - - Monitor.Enter(ThreadLocker); - try - { - if (HttpContext.Current != null) - { - scriptTimeOut = this.GetCurrentScriptTimeout(); - - // Synchronization could be a time-consuming process. To not get a time-out, we need to modify the request time-out value - this.SetScriptTimeout(int.MaxValue); - } - - var mergedTree = this.GetMergedTree(portalId, relativePath, isRecursive); - - // Step 1: Add Folders - this.InitialiseSyncFoldersData(portalId, relativePath); - for (var i = 0; i < mergedTree.Count; i++) - { - var item = mergedTree.Values[i]; - this.ProcessMergedTreeItemInAddMode(item, portalId); - } - - this.RemoveSyncFoldersData(relativePath); - - // Step 2: Delete Files and Folders - for (var i = mergedTree.Count - 1; i >= 0; i--) - { - var item = mergedTree.Values[i]; - - if (syncFiles) - { - this.SynchronizeFiles(item, portalId); - } - - this.ProcessMergedTreeItemInDeleteMode(item, portalId); - } - } - finally - { - Monitor.Exit(ThreadLocker); - - // Restore original time-out - if (HttpContext.Current != null && scriptTimeOut != null) - { - this.SetScriptTimeout(scriptTimeOut.Value); - } - } - - return 0; - } - - /// - /// Updates metadata of the specified folder. - /// - /// The folder to update. - /// Thrown when folder is null. - /// The information about the updated folder, . - public virtual IFolderInfo UpdateFolder(IFolderInfo folder) - { - var updatedFolder = this.UpdateFolderInternal(folder, true); - - this.AddLogEntry(updatedFolder, EventLogController.EventLogType.FOLDER_UPDATED); - - this.SaveFolderPermissions(updatedFolder); - - return updatedFolder; - } - - /// - /// Adds read permissions for all users to the specified folder. - /// - /// The folder to add the permission to. - /// Used as base class for FolderPermissionInfo when there is no read permission already defined. - public virtual void AddAllUserReadPermission(IFolderInfo folder, PermissionInfo permission) - { - var roleId = int.Parse(Globals.glbRoleAllUsers); - - var folderPermission = - (from FolderPermissionInfo p in folder.FolderPermissions - where p.PermissionKey == "READ" && p.FolderID == folder.FolderID && p.RoleID == roleId && p.UserID == Null.NullInteger - select p).SingleOrDefault(); - - if (folderPermission != null) - { - folderPermission.AllowAccess = true; - } - else - { - folderPermission = new FolderPermissionInfo(permission) - { - FolderID = folder.FolderID, - UserID = Null.NullInteger, - RoleID = roleId, - AllowAccess = true, - }; - - folder.FolderPermissions.Add(folderPermission); - } - } - - /// - /// Sets folder permissions to the given folder by copying parent folder permissions. - /// - /// The folder to copy permissions to. - public virtual void CopyParentFolderPermissions(IFolderInfo folder) - { - Requires.NotNull("folder", folder); - - if (string.IsNullOrEmpty(folder.FolderPath)) - { - return; - } - - var parentFolderPath = folder.FolderPath.Substring(0, folder.FolderPath.Substring(0, folder.FolderPath.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1); - - foreach (FolderPermissionInfo objPermission in - this.GetFolderPermissionsFromSyncData(folder.PortalID, parentFolderPath)) - { - var folderPermission = new FolderPermissionInfo(objPermission) - { - FolderID = folder.FolderID, - RoleID = objPermission.RoleID, - UserID = objPermission.UserID, - AllowAccess = objPermission.AllowAccess, - }; - folder.FolderPermissions.Add(folderPermission, true); - } - - FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); - } - - /// - /// Sets specific folder permissions for the given role to the given folder. - /// - /// The folder to set permission to. - /// The id of the permission to assign. - /// The role to assign the permission to. - public virtual void SetFolderPermission(IFolderInfo folder, int permissionId, int roleId) - { - this.SetFolderPermission(folder, permissionId, roleId, Null.NullInteger); - } - - /// - /// Sets specific folder permissions for the given role/user to the given folder. - /// - /// The folder to set permission to. - /// The id of the permission to assign. - /// The role to assign the permission to. - /// The user to assign the permission to. - public virtual void SetFolderPermission(IFolderInfo folder, int permissionId, int roleId, int userId) - { - if (folder.FolderPermissions.Cast() - .Any(fpi => fpi.FolderID == folder.FolderID && fpi.PermissionID == permissionId && fpi.RoleID == roleId && fpi.UserID == userId && fpi.AllowAccess)) - { - return; - } - - var objFolderPermissionInfo = new FolderPermissionInfo - { - FolderID = folder.FolderID, - PermissionID = permissionId, - RoleID = roleId, - UserID = userId, - AllowAccess = true, - }; - - folder.FolderPermissions.Add(objFolderPermissionInfo, true); - FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); - } - - /// - /// Sets folder permissions for administrator role to the given folder. - /// - /// The folder to set permission to. - /// The administrator role id to assign the permission to. - public virtual void SetFolderPermissions(IFolderInfo folder, int administratorRoleId) - { - Requires.NotNull("folder", folder); - - foreach (PermissionInfo objPermission in PermissionController.GetPermissionsByFolder()) - { - var folderPermission = new FolderPermissionInfo(objPermission) - { - FolderID = folder.FolderID, - RoleID = administratorRoleId, - }; - - folder.FolderPermissions.Add(folderPermission, true); - } - - FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); - } - - /// - /// Moves the specified folder and its contents to a new location. - /// - /// The folder to move. - /// The new folder path. - /// The moved folder. - [EditorBrowsable(EditorBrowsableState.Never)] - [Obsolete("Deprecated in DNN 7.1. It has been replaced by FolderManager.Instance.MoveFolder(IFolderInfo folder, IFolderInfo destinationFolder) . Scheduled removal in v10.0.0.")] - public virtual IFolderInfo MoveFolder(IFolderInfo folder, string newFolderPath) - { - Requires.NotNull("folder", folder); - Requires.NotNullOrEmpty("newFolderPath", newFolderPath); - - var nameCharIndex = newFolderPath.Substring(0, newFolderPath.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1; - var parentFolder = this.GetFolder(folder.PortalID, newFolderPath.Substring(0, nameCharIndex)); - if (parentFolder.FolderID == folder.ParentID) - { - var newFolderName = newFolderPath.Substring(nameCharIndex, newFolderPath.Length - nameCharIndex - 1); - this.RenameFolder(folder, newFolderName); - return folder; - } - - return this.MoveFolder(folder, parentFolder); - } - - /// - /// Checks if a given folder path is valid. - /// - /// The folder path. - /// A value indicating whether the folder path is valid. - internal virtual bool IsValidFolderPath(string folderPath) - { - var illegalInFolderPath = new Regex(string.Format("[{0}]", Regex.Escape(new string(Path.GetInvalidPathChars()))), RegexOptions.Compiled); - return !illegalInFolderPath.IsMatch(folderPath) && !folderPath.TrimEnd('/', '\\').EndsWith("."); - } - - /// - /// Adds a log entry. - /// - /// The folder to log about. - /// The type of the log entry. - internal virtual void AddLogEntry(IFolderInfo folder, EventLogController.EventLogType eventLogType) - { - EventLogController.Instance.AddLog(folder, (PortalSettings)PortalController.Instance.GetCurrentSettings(), this.GetCurrentUserId(), string.Empty, eventLogType); - } - - /// - /// Adds a log entry. - /// - /// The name of the property. - /// The value of the property. - /// The type of log entry. - internal virtual void AddLogEntry(string propertyName, string propertyValue, EventLogController.EventLogType eventLogType) - { - EventLogController.Instance.AddLog(propertyName, propertyValue, (PortalSettings)PortalController.Instance.GetCurrentSettings(), this.GetCurrentUserId(), eventLogType); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The site (portal) ID. - /// The new folder path. - internal void DeleteFilesFromCache(int portalId, string newFolderPath) - { - var folders = this.GetFolders(portalId).Where(f => f.FolderPath.StartsWith(newFolderPath)); - foreach (var folderInfo in folders) - { - var fileIds = this.GetFiles(folderInfo).Select(f => f.FileId); - foreach (var fileId in fileIds) - { - DataCache.RemoveCache("GetFileById" + fileId); - } - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The added folder information, . - /// the user to add a forder for. - internal virtual IFolderInfo AddUserFolder(UserInfo user) - { - // user _default portal for all super users - var portalId = user.IsSuperUser ? Null.NullInteger : user.PortalID; - - var folderMapping = FolderMappingsConfigController.Instance.GetFolderMapping(portalId, DefaultUsersFoldersPath) ?? FolderMappingController.Instance.GetDefaultFolderMapping(portalId); - - if (!this.FolderExists(portalId, DefaultUsersFoldersPath)) - { - this.AddFolder(folderMapping, DefaultUsersFoldersPath); - } - - // GetUserFolderPathElement is depreced without a replacement, it should have been internal only and will be removed in Dnn10, hence the warning disable here -#pragma warning disable 612,618 - var rootFolder = PathUtils.Instance.GetUserFolderPathElement(user.UserID, PathUtils.UserFolderElement.Root); -#pragma warning restore 612,618 - - var folderPath = PathUtils.Instance.FormatFolderPath(string.Format(DefaultUsersFoldersPath + "/{0}", rootFolder)); - - if (!this.FolderExists(portalId, folderPath)) - { - this.AddFolder(folderMapping, folderPath); - } - - // GetUserFolderPathElement is depreced without a replacement, it should have been internal only and will be removed in Dnn10, hence the warning disable here -#pragma warning disable 612,618 - folderPath = PathUtils.Instance.FormatFolderPath(string.Concat(folderPath, PathUtils.Instance.GetUserFolderPathElement(user.UserID, PathUtils.UserFolderElement.SubFolder))); -#pragma warning restore 612,618 - - if (!this.FolderExists(portalId, folderPath)) - { - this.AddFolder(folderMapping, folderPath); - } - - folderPath = PathUtils.Instance.FormatFolderPath(string.Concat(folderPath, user.UserID.ToString(CultureInfo.InvariantCulture))); - - if (!this.FolderExists(portalId, folderPath)) - { - this.AddFolder(folderMapping, folderPath); - - var folder = this.GetFolder(portalId, folderPath); - - foreach (PermissionInfo permission in PermissionController.GetPermissionsByFolder()) - { - if (permission.PermissionKey.Equals("READ", StringComparison.InvariantCultureIgnoreCase) || permission.PermissionKey.Equals("WRITE", StringComparison.InvariantCultureIgnoreCase) || permission.PermissionKey.Equals("BROWSE", StringComparison.InvariantCultureIgnoreCase)) - { - var folderPermission = new FolderPermissionInfo(permission) - { - FolderID = folder.FolderID, - UserID = user.UserID, - RoleID = int.Parse(Globals.glbRoleNothing), - AllowAccess = true, - }; - - folder.FolderPermissions.Add(folderPermission); - - if (permission.PermissionKey.Equals("READ", StringComparison.InvariantCultureIgnoreCase)) - { - this.AddAllUserReadPermission(folder, permission); - } - } - } - - FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); - } - - return this.GetFolder(portalId, folderPath); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// A value indicating whether there are any folder mappings that required network connectivity. - /// The site (Portal) ID. - /// The relative path. - /// A value indicating whether the check should be recursive or not. - internal virtual bool AreThereFolderMappingsRequiringNetworkConnectivity(int portalId, string relativePath, bool isRecursive) - { - var folder = this.GetFolder(portalId, relativePath); - - if (folder != null) - { - var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); - var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); - - if (folderProvider.RequiresNetworkConnectivity) - { - return true; - } - } - - if (isRecursive) - { - var folderMappingsRequiringNetworkConnectivity = from fm in FolderMappingController.Instance.GetFolderMappings(portalId) - where - fm.IsEditable && - FolderProvider.Instance(fm.FolderProviderType).RequiresNetworkConnectivity - select fm; - - return folderMappingsRequiringNetworkConnectivity.Any(); - } - - return false; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The site (portal) ID. - internal void ClearFolderProviderCachedLists(int portalId) - { - foreach (var folderMapping in FolderMappingController.Instance.GetFolderMappings(portalId)) - { - var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); - - if (folderMapping.MappingName != "Standard" && folderMapping.MappingName != "Secure" && folderMapping.MappingName != "Database") - { - var type = folderProvider.GetType(); - MethodInfo method = type.GetMethod("ClearCache"); - if (method != null) - { - method.Invoke(folderProvider, new object[] { folderMapping.FolderMappingID }); - } - } - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The site (portal) ID. - internal virtual void ClearFolderCache(int portalId) - { - DataCache.ClearFolderCache(portalId); - } - + /// Where to move the new folder. + /// The information about the moved folder, . + public virtual IFolderInfo MoveFolder(IFolderInfo folder, IFolderInfo destinationFolder) + { + Requires.NotNull("folder", folder); + Requires.NotNull("destinationFolder", destinationFolder); + + var newFolderPath = PathUtils.Instance.FormatFolderPath(destinationFolder.FolderPath + folder.FolderName + "/"); + + if (folder.FolderPath == destinationFolder.FolderPath) + { + return folder; + } + + if (this.FolderExists(folder.PortalID, newFolderPath)) + { + throw new InvalidOperationException(string.Format( + Localization.GetExceptionMessage( + "CannotMoveFolderAlreadyExists", + "The folder with name '{0}' cannot be moved. A folder with that name already exists under the folder '{1}'.", + folder.FolderName, + destinationFolder.FolderName))); + } + + var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); + var destinationFolderMapping = FolderMappingController.Instance.GetFolderMapping(destinationFolder.PortalID, destinationFolder.FolderMappingID); + + if (!this.CanMoveBetweenFolderMappings(folderMapping, destinationFolderMapping)) + { + throw new InvalidOperationException(string.Format( + Localization.GetExceptionMessage( + "CannotMoveFolderBetweenFolderType", + "The folder with name '{0}' cannot be moved. Move Folder operation between this two folder types is not allowed", + folder.FolderName))); + } + + if (!this.IsMoveOperationValid(folder, destinationFolder, newFolderPath)) + { + throw new InvalidOperationException(Localization.GetExceptionMessage("MoveFolderCannotComplete", "The operation cannot be completed.")); + } + + var currentFolderPath = folder.FolderPath; + + if ((folder.FolderMappingID == destinationFolder.FolderMappingID && FolderProvider.Instance(folderMapping.FolderProviderType).SupportsMoveFolder) || + (IsStandardFolderProviderType(folderMapping) && IsStandardFolderProviderType(destinationFolderMapping))) + { + this.MoveFolderWithinProvider(folder, destinationFolder); + } + else + { + this.MoveFolderBetweenProviders(folder, newFolderPath); + } + + // log the folder moved event. + var log = new LogInfo(); + log.AddProperty("Old Folder Path", currentFolderPath); + log.AddProperty("New Folder Path", newFolderPath); + log.AddProperty("Home Directory", folder.PortalID == Null.NullInteger ? Globals.HostPath : PortalSettings.Current.HomeDirectory); + log.LogTypeKey = EventLogController.EventLogType.FOLDER_MOVED.ToString(); + LogController.Instance.AddLog(log); + + // Files in cache are obsolete because their physical path is not correct after moving + this.DeleteFilesFromCache(folder.PortalID, newFolderPath); + var movedFolder = this.GetFolder(folder.FolderID); + + // Notify folder moved event + this.OnFolderMoved(folder, this.GetCurrentUserId(), currentFolderPath); + + return movedFolder; + } + + /// + /// Renames the specified folder by setting the new provided folder name. + /// + /// The folder to rename. + /// The new name to apply to the folder. + /// Thrown when newFolderName is null or empty. + /// Thrown when folder is null. + /// Thrown when the underlying system throw an exception. + public virtual void RenameFolder(IFolderInfo folder, string newFolderName) + { + Requires.NotNull("folder", folder); + Requires.NotNullOrEmpty("newFolderName", newFolderName); + + if (folder.FolderName.Equals(newFolderName)) + { + return; + } + + var currentFolderName = folder.FolderName; + + var newFolderPath = folder.FolderPath.Substring(0, folder.FolderPath.LastIndexOf(folder.FolderName, StringComparison.Ordinal)) + PathUtils.Instance.FormatFolderPath(newFolderName); + + if (this.FolderExists(folder.PortalID, newFolderPath)) + { + throw new FolderAlreadyExistsException(Localization.GetExceptionMessage("RenameFolderAlreadyExists", "The destination folder already exists. The folder has not been renamed.")); + } + + var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); + var provider = FolderProvider.Instance(folderMapping.FolderProviderType); + + this.RenameFolderInFileSystem(folder, newFolderPath); + + // Update Provider + provider.RenameFolder(folder, newFolderName); + + // Update database + this.UpdateChildFolders(folder, newFolderPath); + + // Files in cache are obsolete because their physical path is not correct after rename + this.DeleteFilesFromCache(folder.PortalID, newFolderPath); + + // Notify folder renamed event + this.OnFolderRenamed(folder, this.GetCurrentUserId(), currentFolderName); + } + + /// + /// Search the files contained in the specified folder, for a matching pattern. + /// + /// The folder from which to retrieve the files. + /// The patter to search for. + /// Shoud the search be recursive. + /// The list of files contained in the specified folder. + public virtual IEnumerable SearchFiles(IFolderInfo folder, string pattern, bool recursive) + { + Requires.NotNull("folder", folder); + + if (!FolderPermissionController.Instance.CanViewFolder(folder)) + { + throw new FolderProviderException("No permission to view the folder"); + } + + return this.SearchFiles(folder, WildcardToRegex(pattern), recursive); + } + + /// + /// Synchronizes the entire folder tree for the specified portal. + /// + /// The portal identifier. + /// The number of folder collisions. + public virtual int Synchronize(int portalId) + { + var folderCollisions = this.Synchronize(portalId, string.Empty, true, true); + + DataCache.ClearFolderCache(portalId); + + return folderCollisions; + } + + /// + /// Syncrhonizes the specified folder, its files and its subfolders. + /// + /// The portal identifier. + /// The relative path of the folder. + /// The number of folder collisions. + public virtual int Synchronize(int portalId, string relativePath) + { + return this.Synchronize(portalId, relativePath, true, true); + } + + /// + /// Syncrhonizes the specified folder, its files and, optionally, its subfolders. + /// + /// The portal identifier. + /// The relative path of the folder. + /// Indicates if the synchronization has to be recursive. + /// Indicates if files need to be synchronized. + /// Thrown when there are folder mappings requiring network connection but there is no network available. + /// The number of folder collisions. + public virtual int Synchronize(int portalId, string relativePath, bool isRecursive, bool syncFiles) + { + Requires.PropertyNotNull("relativePath", relativePath); + + if (this.AreThereFolderMappingsRequiringNetworkConnectivity(portalId, relativePath, isRecursive) && !this.IsNetworkAvailable()) + { + throw new NoNetworkAvailableException(Localization.GetExceptionMessage("NoNetworkAvailableError", "Network connectivity is needed but there is no network available.")); + } + + int? scriptTimeOut = null; + + Monitor.Enter(ThreadLocker); + try + { + if (HttpContext.Current != null) + { + scriptTimeOut = this.GetCurrentScriptTimeout(); + + // Synchronization could be a time-consuming process. To not get a time-out, we need to modify the request time-out value + this.SetScriptTimeout(int.MaxValue); + } + + var mergedTree = this.GetMergedTree(portalId, relativePath, isRecursive); + + // Step 1: Add Folders + this.InitialiseSyncFoldersData(portalId, relativePath); + for (var i = 0; i < mergedTree.Count; i++) + { + var item = mergedTree.Values[i]; + this.ProcessMergedTreeItemInAddMode(item, portalId); + } + + this.RemoveSyncFoldersData(relativePath); + + // Step 2: Delete Files and Folders + for (var i = mergedTree.Count - 1; i >= 0; i--) + { + var item = mergedTree.Values[i]; + + if (syncFiles) + { + this.SynchronizeFiles(item, portalId); + } + + this.ProcessMergedTreeItemInDeleteMode(item, portalId); + } + } + finally + { + Monitor.Exit(ThreadLocker); + + // Restore original time-out + if (HttpContext.Current != null && scriptTimeOut != null) + { + this.SetScriptTimeout(scriptTimeOut.Value); + } + } + + return 0; + } + + /// + /// Updates metadata of the specified folder. + /// + /// The folder to update. + /// Thrown when folder is null. + /// The information about the updated folder, . + public virtual IFolderInfo UpdateFolder(IFolderInfo folder) + { + var updatedFolder = this.UpdateFolderInternal(folder, true); + + this.AddLogEntry(updatedFolder, EventLogController.EventLogType.FOLDER_UPDATED); + + this.SaveFolderPermissions(updatedFolder); + + return updatedFolder; + } + + /// + /// Adds read permissions for all users to the specified folder. + /// + /// The folder to add the permission to. + /// Used as base class for FolderPermissionInfo when there is no read permission already defined. + public virtual void AddAllUserReadPermission(IFolderInfo folder, PermissionInfo permission) + { + var roleId = int.Parse(Globals.glbRoleAllUsers); + + var folderPermission = + (from FolderPermissionInfo p in folder.FolderPermissions + where p.PermissionKey == "READ" && p.FolderID == folder.FolderID && p.RoleID == roleId && p.UserID == Null.NullInteger + select p).SingleOrDefault(); + + if (folderPermission != null) + { + folderPermission.AllowAccess = true; + } + else + { + folderPermission = new FolderPermissionInfo(permission) + { + FolderID = folder.FolderID, + UserID = Null.NullInteger, + RoleID = roleId, + AllowAccess = true, + }; + + folder.FolderPermissions.Add(folderPermission); + } + } + + /// + /// Sets folder permissions to the given folder by copying parent folder permissions. + /// + /// The folder to copy permissions to. + public virtual void CopyParentFolderPermissions(IFolderInfo folder) + { + Requires.NotNull("folder", folder); + + if (string.IsNullOrEmpty(folder.FolderPath)) + { + return; + } + + var parentFolderPath = folder.FolderPath.Substring(0, folder.FolderPath.Substring(0, folder.FolderPath.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1); + + foreach (FolderPermissionInfo objPermission in + this.GetFolderPermissionsFromSyncData(folder.PortalID, parentFolderPath)) + { + var folderPermission = new FolderPermissionInfo(objPermission) + { + FolderID = folder.FolderID, + RoleID = objPermission.RoleID, + UserID = objPermission.UserID, + AllowAccess = objPermission.AllowAccess, + }; + folder.FolderPermissions.Add(folderPermission, true); + } + + FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); + } + + /// + /// Sets specific folder permissions for the given role to the given folder. + /// + /// The folder to set permission to. + /// The id of the permission to assign. + /// The role to assign the permission to. + public virtual void SetFolderPermission(IFolderInfo folder, int permissionId, int roleId) + { + this.SetFolderPermission(folder, permissionId, roleId, Null.NullInteger); + } + + /// + /// Sets specific folder permissions for the given role/user to the given folder. + /// + /// The folder to set permission to. + /// The id of the permission to assign. + /// The role to assign the permission to. + /// The user to assign the permission to. + public virtual void SetFolderPermission(IFolderInfo folder, int permissionId, int roleId, int userId) + { + if (folder.FolderPermissions.Cast() + .Any(fpi => fpi.FolderID == folder.FolderID && fpi.PermissionID == permissionId && fpi.RoleID == roleId && fpi.UserID == userId && fpi.AllowAccess)) + { + return; + } + + var objFolderPermissionInfo = new FolderPermissionInfo + { + FolderID = folder.FolderID, + PermissionID = permissionId, + RoleID = roleId, + UserID = userId, + AllowAccess = true, + }; + + folder.FolderPermissions.Add(objFolderPermissionInfo, true); + FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); + } + + /// + /// Sets folder permissions for administrator role to the given folder. + /// + /// The folder to set permission to. + /// The administrator role id to assign the permission to. + public virtual void SetFolderPermissions(IFolderInfo folder, int administratorRoleId) + { + Requires.NotNull("folder", folder); + + foreach (PermissionInfo objPermission in PermissionController.GetPermissionsByFolder()) + { + var folderPermission = new FolderPermissionInfo(objPermission) + { + FolderID = folder.FolderID, + RoleID = administratorRoleId, + }; + + folder.FolderPermissions.Add(folderPermission, true); + } + + FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); + } + + /// + /// Moves the specified folder and its contents to a new location. + /// + /// The folder to move. + /// The new folder path. + /// The moved folder. + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete("Deprecated in DNN 7.1. It has been replaced by FolderManager.Instance.MoveFolder(IFolderInfo folder, IFolderInfo destinationFolder) . Scheduled removal in v10.0.0.")] + public virtual IFolderInfo MoveFolder(IFolderInfo folder, string newFolderPath) + { + Requires.NotNull("folder", folder); + Requires.NotNullOrEmpty("newFolderPath", newFolderPath); + + var nameCharIndex = newFolderPath.Substring(0, newFolderPath.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1; + var parentFolder = this.GetFolder(folder.PortalID, newFolderPath.Substring(0, nameCharIndex)); + if (parentFolder.FolderID == folder.ParentID) + { + var newFolderName = newFolderPath.Substring(nameCharIndex, newFolderPath.Length - nameCharIndex - 1); + this.RenameFolder(folder, newFolderName); + return folder; + } + + return this.MoveFolder(folder, parentFolder); + } + + /// + /// Checks if a given folder path is valid. + /// + /// The folder path. + /// A value indicating whether the folder path is valid. + internal virtual bool IsValidFolderPath(string folderPath) + { + var illegalInFolderPath = new Regex(string.Format("[{0}]", Regex.Escape(new string(Path.GetInvalidPathChars()))), RegexOptions.Compiled); + return !illegalInFolderPath.IsMatch(folderPath) && !folderPath.TrimEnd('/', '\\').EndsWith("."); + } + + /// + /// Adds a log entry. + /// + /// The folder to log about. + /// The type of the log entry. + internal virtual void AddLogEntry(IFolderInfo folder, EventLogController.EventLogType eventLogType) + { + EventLogController.Instance.AddLog(folder, (PortalSettings)PortalController.Instance.GetCurrentSettings(), this.GetCurrentUserId(), string.Empty, eventLogType); + } + + /// + /// Adds a log entry. + /// + /// The name of the property. + /// The value of the property. + /// The type of log entry. + internal virtual void AddLogEntry(string propertyName, string propertyValue, EventLogController.EventLogType eventLogType) + { + EventLogController.Instance.AddLog(propertyName, propertyValue, (PortalSettings)PortalController.Instance.GetCurrentSettings(), this.GetCurrentUserId(), eventLogType); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The new folder path. + internal void DeleteFilesFromCache(int portalId, string newFolderPath) + { + var folders = this.GetFolders(portalId).Where(f => f.FolderPath.StartsWith(newFolderPath)); + foreach (var folderInfo in folders) + { + var fileIds = this.GetFiles(folderInfo).Select(f => f.FileId); + foreach (var fileId in fileIds) + { + DataCache.RemoveCache("GetFileById" + fileId); + } + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The added folder information, . + /// the user to add a forder for. + internal virtual IFolderInfo AddUserFolder(UserInfo user) + { + // user _default portal for all super users + var portalId = user.IsSuperUser ? Null.NullInteger : user.PortalID; + + var folderMapping = FolderMappingsConfigController.Instance.GetFolderMapping(portalId, DefaultUsersFoldersPath) ?? FolderMappingController.Instance.GetDefaultFolderMapping(portalId); + + if (!this.FolderExists(portalId, DefaultUsersFoldersPath)) + { + this.AddFolder(folderMapping, DefaultUsersFoldersPath); + } + + // GetUserFolderPathElement is depreced without a replacement, it should have been internal only and will be removed in Dnn10, hence the warning disable here +#pragma warning disable 612,618 + var rootFolder = PathUtils.Instance.GetUserFolderPathElement(user.UserID, PathUtils.UserFolderElement.Root); +#pragma warning restore 612,618 + + var folderPath = PathUtils.Instance.FormatFolderPath(string.Format(DefaultUsersFoldersPath + "/{0}", rootFolder)); + + if (!this.FolderExists(portalId, folderPath)) + { + this.AddFolder(folderMapping, folderPath); + } + + // GetUserFolderPathElement is depreced without a replacement, it should have been internal only and will be removed in Dnn10, hence the warning disable here +#pragma warning disable 612,618 + folderPath = PathUtils.Instance.FormatFolderPath(string.Concat(folderPath, PathUtils.Instance.GetUserFolderPathElement(user.UserID, PathUtils.UserFolderElement.SubFolder))); +#pragma warning restore 612,618 + + if (!this.FolderExists(portalId, folderPath)) + { + this.AddFolder(folderMapping, folderPath); + } + + folderPath = PathUtils.Instance.FormatFolderPath(string.Concat(folderPath, user.UserID.ToString(CultureInfo.InvariantCulture))); + + if (!this.FolderExists(portalId, folderPath)) + { + this.AddFolder(folderMapping, folderPath); + + var folder = this.GetFolder(portalId, folderPath); + + foreach (PermissionInfo permission in PermissionController.GetPermissionsByFolder()) + { + if (permission.PermissionKey.Equals("READ", StringComparison.InvariantCultureIgnoreCase) || permission.PermissionKey.Equals("WRITE", StringComparison.InvariantCultureIgnoreCase) || permission.PermissionKey.Equals("BROWSE", StringComparison.InvariantCultureIgnoreCase)) + { + var folderPermission = new FolderPermissionInfo(permission) + { + FolderID = folder.FolderID, + UserID = user.UserID, + RoleID = int.Parse(Globals.glbRoleNothing), + AllowAccess = true, + }; + + folder.FolderPermissions.Add(folderPermission); + + if (permission.PermissionKey.Equals("READ", StringComparison.InvariantCultureIgnoreCase)) + { + this.AddAllUserReadPermission(folder, permission); + } + } + } + + FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); + } + + return this.GetFolder(portalId, folderPath); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// A value indicating whether there are any folder mappings that required network connectivity. + /// The site (Portal) ID. + /// The relative path. + /// A value indicating whether the check should be recursive or not. + internal virtual bool AreThereFolderMappingsRequiringNetworkConnectivity(int portalId, string relativePath, bool isRecursive) + { + var folder = this.GetFolder(portalId, relativePath); + + if (folder != null) + { + var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); + var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); + + if (folderProvider.RequiresNetworkConnectivity) + { + return true; + } + } + + if (isRecursive) + { + var folderMappingsRequiringNetworkConnectivity = from fm in FolderMappingController.Instance.GetFolderMappings(portalId) + where + fm.IsEditable && + FolderProvider.Instance(fm.FolderProviderType).RequiresNetworkConnectivity + select fm; + + return folderMappingsRequiringNetworkConnectivity.Any(); + } + + return false; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + internal void ClearFolderProviderCachedLists(int portalId) + { + foreach (var folderMapping in FolderMappingController.Instance.GetFolderMappings(portalId)) + { + var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); + + if (folderMapping.MappingName != "Standard" && folderMapping.MappingName != "Secure" && folderMapping.MappingName != "Database") + { + var type = folderProvider.GetType(); + MethodInfo method = type.GetMethod("ClearCache"); + if (method != null) + { + method.Invoke(folderProvider, new object[] { folderMapping.FolderMappingID }); + } + } + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + internal virtual void ClearFolderCache(int portalId) + { + DataCache.ClearFolderCache(portalId); + } + + /// + /// Creates a folder in the database. + /// + /// The site (portal) ID. + /// The folder path to create. + /// The folder mapping id, . + /// The created folder ID. + internal virtual int CreateFolderInDatabase(int portalId, string folderPath, int folderMappingId) + { + return this.CreateFolderInDatabase(portalId, folderPath, folderMappingId, folderPath); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The folder path to create. + /// The id for the folder mapping. + /// The mapped path. + /// The created folder ID. + internal virtual int CreateFolderInDatabase(int portalId, string folderPath, int folderMappingId, string mappedPath) + { + var isProtected = PathUtils.Instance.IsDefaultProtectedPath(folderPath); + var folderMapping = FolderMappingController.Instance.GetFolderMapping(portalId, folderMappingId); + var storageLocation = (int)FolderController.StorageLocationTypes.DatabaseSecure; + if (!folderMapping.IsEditable) + { + switch (folderMapping.MappingName) + { + case "Standard": + storageLocation = (int)FolderController.StorageLocationTypes.InsecureFileSystem; + break; + case "Secure": + storageLocation = (int)FolderController.StorageLocationTypes.SecureFileSystem; + break; + default: + storageLocation = (int)FolderController.StorageLocationTypes.DatabaseSecure; + break; + } + } + + var folder = new FolderInfo(true) + { + PortalID = portalId, + FolderPath = folderPath, + MappedPath = mappedPath, + StorageLocation = storageLocation, + IsProtected = isProtected, + IsCached = false, + FolderMappingID = folderMappingId, + LastUpdated = Null.NullDate, + }; + + folder.FolderID = this.AddFolderInternal(folder); + + if (portalId != Null.NullInteger) + { + // Set Folder Permissions to inherit from parent + this.CopyParentFolderPermissions(folder); + } + + return folder.FolderID; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The physical path to create the folder in. + internal virtual void CreateFolderInFileSystem(string physicalPath) + { + var di = new DirectoryInfo(physicalPath); + + if (!di.Exists) + { + di.Create(); + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The folder path. + internal virtual void DeleteFolder(int portalId, string folderPath) + { + DataProvider.Instance().DeleteFolder(portalId, PathUtils.Instance.FormatFolderPath(folderPath)); + this.AddLogEntry("FolderPath", folderPath, EventLogController.EventLogType.FOLDER_DELETED); + this.UpdateParentFolder(portalId, folderPath); + DataCache.ClearFolderCache(portalId); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder mapping affected. + /// A list of folders to delete. + internal virtual void DeleteFoldersFromExternalStorageLocations(Dictionary folderMappings, IEnumerable foldersToDelete) + { + foreach (var folderToDelete in foldersToDelete) + { + // Delete source folder from its storage location + var folderMapping = this.GetFolderMapping(folderMappings, folderToDelete.FolderMappingID); + + try + { + var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); + + // IMPORTANT: We cannot delete the folder from its storage location when it contains other subfolders + if (!folderProvider.GetSubFolders(folderToDelete.MappedPath, folderMapping).Any()) + { + folderProvider.DeleteFolder(folderToDelete); + } + } + catch (Exception ex) + { + // The folders that cannot be deleted from its storage location will be handled during the next sync + Logger.Error(ex); + } + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// A value representing the current script timeout. + internal virtual int GetCurrentScriptTimeout() + { + return HttpContext.Current.Server.ScriptTimeout; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The id of the current user. + internal virtual int GetCurrentUserId() + { + return UserController.Instance.GetCurrentUserInfo().UserID; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The relative path. + /// A value indicating whether to return folders recursively. + /// A sorted list of folders. + internal virtual SortedList GetDatabaseFolders(int portalId, string relativePath, bool isRecursive) + { + var databaseFolders = new SortedList(new IgnoreCaseStringComparer()); + + var folder = this.GetFolder(portalId, relativePath); + + if (folder != null) + { + if (!isRecursive) + { + var item = new MergedTreeItem + { + FolderID = folder.FolderID, + FolderMappingID = folder.FolderMappingID, + FolderPath = folder.FolderPath, + ExistsInDatabase = true, + MappedPath = folder.MappedPath, + }; + + databaseFolders.Add(relativePath, item); + } + else + { + databaseFolders = this.GetDatabaseFoldersRecursive(folder); + } + } + + return databaseFolders; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to get. + /// A sorted list of folders. + internal virtual SortedList GetDatabaseFoldersRecursive(IFolderInfo folder) + { + var result = new SortedList(new IgnoreCaseStringComparer()); + var stack = new Stack(); + + stack.Push(folder); + + while (stack.Count > 0) + { + var folderInfo = stack.Pop(); + + var item = new MergedTreeItem + { + FolderID = folderInfo.FolderID, + FolderMappingID = folderInfo.FolderMappingID, + FolderPath = folderInfo.FolderPath, + ExistsInDatabase = true, + MappedPath = folderInfo.MappedPath, + }; + + if (!result.ContainsKey(item.FolderPath)) + { + result.Add(item.FolderPath, item); + } + + foreach (var subfolder in this.GetFolders(folderInfo)) + { + stack.Push(subfolder); + } + } + + return result; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The relative path. + /// A value indicating whether to return the folders recursively. + /// A sorted list of folders. + internal virtual SortedList GetFileSystemFolders(int portalId, string relativePath, bool isRecursive) + { + var fileSystemFolders = new SortedList(new IgnoreCaseStringComparer()); + + var physicalPath = PathUtils.Instance.GetPhysicalPath(portalId, relativePath); + var hideFoldersEnabled = PortalController.GetPortalSettingAsBoolean("HideFoldersEnabled", portalId, true); + + if (DirectoryWrapper.Instance.Exists(physicalPath)) + { + if (((FileWrapper.Instance.GetAttributes(physicalPath) & FileAttributes.Hidden) == FileAttributes.Hidden || physicalPath.StartsWith("_")) && hideFoldersEnabled) + { + return fileSystemFolders; + } + + if (!isRecursive) + { + var item = new MergedTreeItem + { + FolderID = -1, + FolderMappingID = -1, + FolderPath = relativePath, + ExistsInFileSystem = true, + MappedPath = string.Empty, + }; + + fileSystemFolders.Add(relativePath, item); + } + else + { + fileSystemFolders = this.GetFileSystemFoldersRecursive(portalId, physicalPath); + } + } + + return fileSystemFolders; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The physical path of the folder. + /// A sorted list of folders. + internal virtual SortedList GetFileSystemFoldersRecursive(int portalId, string physicalPath) + { + var result = new SortedList(new IgnoreCaseStringComparer()); + var stack = new Stack(); + + stack.Push(physicalPath); + + var hideFoldersEnabled = PortalController.GetPortalSettingAsBoolean("HideFoldersEnabled", portalId, true); + + while (stack.Count > 0) + { + var dir = stack.Pop(); + + try + { + var item = new MergedTreeItem + { + FolderID = -1, + FolderMappingID = -1, + FolderPath = PathUtils.Instance.GetRelativePath(portalId, dir), + ExistsInFileSystem = true, + MappedPath = string.Empty, + }; + + result.Add(item.FolderPath, item); + + foreach (var dn in DirectoryWrapper.Instance.GetDirectories(dir)) + { + if (((FileWrapper.Instance.GetAttributes(dn) & FileAttributes.Hidden) == FileAttributes.Hidden || dn.StartsWith("_")) && hideFoldersEnabled) + { + continue; + } + + stack.Push(dn); + } + } + catch (Exception ex) + { + Logger.Error(ex); + } + } + + return result; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder mapping to search in. + /// The folder mapping id to return. + /// A single folder mapping, . + internal virtual FolderMappingInfo GetFolderMapping(Dictionary folderMappings, int folderMappingId) + { + if (!folderMappings.ContainsKey(folderMappingId)) + { + folderMappings.Add(folderMappingId, FolderMappingController.Instance.GetFolderMapping(folderMappingId)); + } + + return folderMappings[folderMappingId]; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder mapping to use. + /// The folder base path. + /// A sorted list of folder mappings. + internal virtual SortedList GetFolderMappingFoldersRecursive(FolderMappingInfo folderMapping, IFolderInfo folder) + { + var result = new SortedList(new IgnoreCaseStringComparer()); + var stack = new Stack(); + var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); + + var baseMappedPath = folder.MappedPath; + var baseFolderPath = folder.FolderPath; + + stack.Push(baseMappedPath); + + while (stack.Count > 0) + { + var mappedPath = stack.Pop(); + var relativePath = string.IsNullOrEmpty(mappedPath) + ? string.Empty + : string.IsNullOrEmpty(baseMappedPath) + ? mappedPath + : RegexUtils.GetCachedRegex(Regex.Escape(baseMappedPath)).Replace(mappedPath, string.Empty, 1); + + var folderPath = baseFolderPath + relativePath; + + if (folderProvider.FolderExists(mappedPath, folderMapping)) + { + var item = new MergedTreeItem + { + FolderID = -1, + FolderMappingID = folderMapping.FolderMappingID, + FolderPath = folderPath, + ExistsInFolderMapping = true, + MappedPath = mappedPath, + }; + + if (!result.ContainsKey(item.FolderPath)) + { + result.Add(item.FolderPath, item); + } + + foreach (var subfolderPath in folderProvider.GetSubFolders(mappedPath, folderMapping)) + { + if (folderMapping.SyncAllSubFolders || folderProvider.FolderExists(subfolderPath, folderMapping)) + { + stack.Push(subfolderPath); + } + } + } + } + + return result; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The cached items arguments, . + /// A list of folders. + internal virtual object GetFoldersByPermissionSortedCallBack(CacheItemArgs cacheItemArgs) + { + var portalId = (int)cacheItemArgs.ParamList[0]; + var permissions = (string)cacheItemArgs.ParamList[1]; + var userId = (int)cacheItemArgs.ParamList[2]; + return CBO.Instance.FillCollection(DataProvider.Instance().GetFoldersByPortalAndPermissions(portalId, permissions, userId)); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The cache item arguments, . + /// A list of folders. + internal virtual object GetFoldersSortedCallBack(CacheItemArgs cacheItemArgs) + { + var portalId = (int)cacheItemArgs.ParamList[0]; + return CBO.Instance.FillCollection(DataProvider.Instance().GetFoldersByPortal(portalId)); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The relative path. + /// A vavlue indicating whether the search should be recursive. + /// A sorted list of . + internal virtual SortedList GetMergedTree(int portalId, string relativePath, bool isRecursive) + { + var fileSystemFolders = this.GetFileSystemFolders(portalId, relativePath, isRecursive); + var databaseFolders = this.GetDatabaseFolders(portalId, relativePath, isRecursive); + + var mergedTree = this.MergeFolderLists(fileSystemFolders, databaseFolders); + var mappedFolders = new SortedList(); + + // Some providers cache the list of objects for performance + this.ClearFolderProviderCachedLists(portalId); + + foreach (var mergedItem in mergedTree.Values) + { + if (mergedItem.FolderMappingID == Null.NullInteger) + { + continue; + } + + var folderMapping = FolderMappingController.Instance.GetFolderMapping(portalId, mergedItem.FolderMappingID); + + // Add any folders from non-core providers + if (folderMapping.MappingName != "Standard" && folderMapping.MappingName != "Secure" && folderMapping.MappingName != "Database") + { + if (!isRecursive) + { + mergedItem.ExistsInFolderMapping = true; + } + else + { + var folder = this.GetFolder(portalId, mergedItem.FolderPath); + mappedFolders = this.MergeFolderLists(mappedFolders, this.GetFolderMappingFoldersRecursive(folderMapping, folder)); + } + } + else + { + mergedItem.ExistsInFolderMapping = folderMapping.MappingName == "Database" ? mergedItem.ExistsInDatabase : mergedItem.ExistsInFileSystem; + } + } + + mergedTree = this.MergeFolderLists(mergedTree, mappedFolders); + + // Update ExistsInFolderMapping if the Parent Does Not ExistsInFolderMapping + var margedTreeItems = mergedTree.Values; + foreach (var mergedItem in margedTreeItems.Where(m => m.ExistsInFolderMapping + && margedTreeItems.Any(mt2 => !mt2.ExistsInFolderMapping && m.FolderPath.StartsWith(mt2.FolderPath)))) + { + mergedItem.ExistsInFolderMapping = false; + } + + return mergedTree; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder mapping. + /// A value indicating whether the folder mapping is editable. + internal virtual bool IsFolderMappingEditable(FolderMappingInfo folderMapping) + { + return folderMapping.IsEditable; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to move. + /// The destination folder to move the folder to. + /// The new folder path. + /// A value indicating whether the move operation would be valid. + internal virtual bool IsMoveOperationValid(IFolderInfo folderToMove, IFolderInfo destinationFolder, string newFolderPath) + { + // FolderMapping cases + var folderMapping = FolderMappingController.Instance.GetFolderMapping(folderToMove.PortalID, folderToMove.FolderMappingID); + if (folderToMove.FolderMappingID == destinationFolder.FolderMappingID && FolderProvider.Instance(folderMapping.FolderProviderType).SupportsMappedPaths) + { + // Root mapped folder cannot be move, when folder mappings are equal + if (folderToMove.MappedPath == string.Empty) + { + return false; + } + + // Destination folder cannot be a child mapped folder from the folder to move + if (destinationFolder.MappedPath.StartsWith(folderToMove.MappedPath)) + { + return false; + } + } + + return this.IsMoveOperationValid(folderToMove, newFolderPath); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to move. + /// The distination folder to move the folder into. + /// A value indicating if the move operation would be valid. + internal virtual bool IsMoveOperationValid(IFolderInfo folderToMove, string newFolderPath) + { + // Root folder cannot be moved + if (folderToMove.FolderPath == string.Empty) + { + return false; + } + + // newParentFolder cannot be a child of folderToMove + if (newFolderPath.StartsWith(folderToMove.FolderPath)) + { + return false; + } + + return true; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// A value indicating whether the network is available. + internal virtual bool IsNetworkAvailable() + { + return NetworkInterface.GetIsNetworkAvailable(); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The first list for the merge. + /// The second list for the merge. + /// A merged sorted list of MergedTreeItems, . + internal virtual SortedList MergeFolderLists(SortedList list1, SortedList list2) + { + foreach (var item in list2.Values) + { + if (list1.ContainsKey(item.FolderPath)) + { + var existingItem = list1[item.FolderPath]; + if (existingItem.FolderID < 0) + { + existingItem.FolderID = item.FolderID; + } + + if (existingItem.FolderMappingID < 0) + { + existingItem.FolderMappingID = item.FolderMappingID; + } + + if (string.IsNullOrEmpty(existingItem.MappedPath)) + { + existingItem.MappedPath = item.MappedPath; + } + + existingItem.ExistsInFileSystem = existingItem.ExistsInFileSystem || item.ExistsInFileSystem; + existingItem.ExistsInDatabase = existingItem.ExistsInDatabase || item.ExistsInDatabase; + existingItem.ExistsInFolderMapping = existingItem.ExistsInFolderMapping || item.ExistsInFolderMapping; + } + else + { + list1.Add(item.FolderPath, item); + } + } + + return list1; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The source directory. + /// The target directory. + internal virtual void MoveDirectory(string source, string target) + { + var stack = new Stack(); + stack.Push(new MoveFoldersInfo(source, target)); + + // ReSharper disable AssignNullToNotNullAttribute + while (stack.Count > 0) + { + var folders = stack.Pop(); + Directory.CreateDirectory(folders.Target); + foreach (var file in Directory.GetFiles(folders.Source, "*.*")) + { + var targetFile = Path.Combine(folders.Target, Path.GetFileName(file)); + if (File.Exists(targetFile)) + { + File.Delete(targetFile); + } + + File.Move(file, targetFile); + } + + foreach (var folder in Directory.GetDirectories(folders.Source)) + { + stack.Push(new MoveFoldersInfo(folder, Path.Combine(folders.Target, Path.GetFileName(folder)))); + } + } + + // ReSharper restore AssignNullToNotNullAttribute + Directory.Delete(source, true); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to move. + /// The destination folder. + internal virtual void MoveFolderWithinProvider(IFolderInfo folder, IFolderInfo destinationFolder) + { + var newFolderPath = destinationFolder.FolderPath + folder.FolderName + "/"; + this.RenameFolderInFileSystem(folder, newFolderPath); + + // Update provider + var newMappedPath = destinationFolder.MappedPath + folder.FolderName + "/"; + var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); + var provider = FolderProvider.Instance(folderMapping.FolderProviderType); + provider.MoveFolder(folder.MappedPath, newMappedPath, folderMapping); + + // Update database + this.UpdateChildFolders(folder, Path.Combine(destinationFolder.FolderPath, folder.FolderName)); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to move. + /// The target folder for the move. + internal virtual void MoveFolderBetweenProviders(IFolderInfo folder, string newFolderPath) + { + this.RenameFolderInFileSystem(folder, newFolderPath); + + var folderInfos = this.GetFolders(folder.PortalID).Where(f => f.FolderPath != string.Empty && f.FolderPath.StartsWith(folder.FolderPath)).ToArray(); + var tmpFolderPath = folder.FolderPath; + + foreach (var folderInfo in folderInfos) + { + var folderPath = newFolderPath + folderInfo.FolderPath.Substring(tmpFolderPath.Length); + + var parentFolder = this.GetParentFolder(folder.PortalID, folderPath); + folderInfo.ParentID = parentFolder.FolderID; + folderInfo.FolderPath = folderPath; + this.UpdateFolderInternal(folderInfo, true); + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The source folder. + /// The destination folder. + /// The folder mappings. + /// The folders to delete. + internal virtual void OverwriteFolder(IFolderInfo sourceFolder, IFolderInfo destinationFolder, Dictionary folderMappings, SortedList foldersToDelete) + { + var fileManager = FileManager.Instance; + var files = this.GetFiles(sourceFolder, true); + + foreach (var file in files) + { + fileManager.MoveFile(file, destinationFolder); + } + + // Delete source folder in database + this.DeleteFolder(sourceFolder.PortalID, sourceFolder.FolderPath); + + var folderMapping = this.GetFolderMapping(folderMappings, sourceFolder.FolderMappingID); + + if (this.IsFolderMappingEditable(folderMapping)) + { + foldersToDelete.Add(sourceFolder.FolderPath, sourceFolder); + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The item to process. + /// The site (portal) ID. + internal virtual void ProcessMergedTreeItemInAddMode(MergedTreeItem item, int portalId) + { + try + { + if (item.ExistsInFileSystem) + { + if (!item.ExistsInDatabase) + { + var folderMappingId = this.FindFolderMappingId(item, portalId); + this.CreateFolderInDatabase(portalId, item.FolderPath, folderMappingId); + } + } + else + { + if (item.ExistsInDatabase) + { + if (item.ExistsInFolderMapping) + { + this.CreateFolderInFileSystem(PathUtils.Instance.GetPhysicalPath(portalId, item.FolderPath)); + } + } + else + { + // by exclusion it exists in the Folder Mapping + this.CreateFolderInFileSystem(PathUtils.Instance.GetPhysicalPath(portalId, item.FolderPath)); + this.CreateFolderInDatabase(portalId, item.FolderPath, item.FolderMappingID, item.MappedPath); + } + } + } + catch (Exception ex) + { + Logger.Error(string.Format("Could not create folder {0}. EXCEPTION: {1}", item.FolderPath, ex.Message), ex); + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// . + /// The site (portal) ID. + internal virtual void ProcessMergedTreeItemInDeleteMode(MergedTreeItem item, int portalId) + { + if (item.ExistsInFileSystem) + { + if (item.ExistsInDatabase) + { + if (item.FolderPath == string.Empty) + { + return; // Do not process root folder + } + + if (!item.ExistsInFolderMapping) + { + var folderMapping = FolderMappingController.Instance.GetFolderMapping(portalId, item.FolderMappingID); + + if (folderMapping.IsEditable) + { + DirectoryWrapper.Instance.Delete(PathUtils.Instance.GetPhysicalPath(portalId, item.FolderPath), false); + this.DeleteFolder(portalId, item.FolderPath); + } + } + } + } + else + { + if (item.ExistsInDatabase && !item.ExistsInFolderMapping) + { + this.DeleteFolder(portalId, item.FolderPath); + } + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to cleanup. + internal virtual void RemoveOrphanedFiles(IFolderInfo folder) + { + var files = this.GetFiles(folder, false, true); + + var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); + + if (folderMapping != null) + { + var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); + + foreach (var file in files) + { + try + { + if (!folderProvider.FileExists(folder, file.FileName)) + { + FileDeletionController.Instance.DeleteFileData(file); + } + } + catch (Exception ex) + { + Logger.Error(ex); + } + } + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to rename. + /// The new folder path. + internal virtual void RenameFolderInFileSystem(IFolderInfo folder, string newFolderPath) + { + var source = folder.PhysicalPath; + + var di = new DirectoryInfo(source); + if (!di.Exists) + { + return; + } + + var target = PathUtils.Instance.GetPhysicalPath(folder.PortalID, newFolderPath); + this.MoveDirectory(source, target); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to save the permissions for. + internal virtual void SaveFolderPermissions(IFolderInfo folder) + { + FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The timeout in seconds. + internal virtual void SetScriptTimeout(int timeout) + { + HttpContext.Current.Server.ScriptTimeout = timeout; + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The item to synchronize. + /// The site (portal) ID. + internal virtual void SynchronizeFiles(MergedTreeItem item, int portalId) + { + var folder = this.GetFolder(portalId, item.FolderPath); + + if (folder == null) + { + return; + } + + var folderMapping = FolderMappingController.Instance.GetFolderMapping(portalId, folder.FolderMappingID); + + if (folderMapping == null) + { + return; + } + + try + { + var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); + var fileManager = FileManager.Instance; + + if (folderProvider.FolderExists(folder.MappedPath, folderMapping)) + { + var files = folderProvider.GetFiles(folder); + + files = files.Except(FileVersionController.Instance.GetFileVersionsInFolder(folder.FolderID).Select(f => f.FileName)).ToArray(); + + foreach (var fileName in files) + { + try + { + var file = fileManager.GetFile(folder, fileName, true); + + if (file == null) + { + fileManager.AddFile(folder, fileName, null, false); + } + else if (!folderProvider.IsInSync(file)) + { + fileManager.UpdateFile(file, null); + } + } + catch (InvalidFileExtensionException ex) + { + Logger.Info(ex.Message); + } + catch (Exception ex) + { + Logger.Error(ex); + } + } + } + + this.RemoveOrphanedFiles(folder); + } + catch (Exception ex) + { + Logger.Error(ex); + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The site (portal) ID. + /// The folder path to update. + internal virtual void UpdateParentFolder(int portalId, string folderPath) + { + if (!string.IsNullOrEmpty(folderPath)) + { + var parentFolderPath = folderPath.Substring(0, folderPath.Substring(0, folderPath.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1); + var objFolder = this.GetFolder(portalId, parentFolderPath); + if (objFolder != null) + { + // UpdateFolder(objFolder); + this.UpdateFolderInternal(objFolder, false); + } + } + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The folder to update. + /// The new folder path. + internal virtual void UpdateChildFolders(IFolderInfo folder, string newFolderPath) + { + var originalFolderPath = folder.FolderPath; + + var folderInfos = this.GetFolders(folder.PortalID).Where(f => f.FolderPath != string.Empty && f.FolderPath.StartsWith(originalFolderPath)).ToArray(); + + foreach (var folderInfo in folderInfos) + { + var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folderInfo.FolderMappingID); + var provider = FolderProvider.Instance(folderMapping.FolderProviderType); + + var folderPath = newFolderPath + (newFolderPath.EndsWith("/") ? string.Empty : "/") + folderInfo.FolderPath.Substring(originalFolderPath.Length); + + var parentFolder = this.GetParentFolder(folder.PortalID, folderPath); + folderInfo.ParentID = parentFolder.FolderID; + folderInfo.FolderPath = folderPath; + + var parentProvider = FolderProvider.Instance(FolderMappingController.Instance.GetFolderMapping(parentFolder.PortalID, parentFolder.FolderMappingID).FolderProviderType); + if (parentProvider.SupportsMappedPaths || !provider.SupportsMappedPaths) + { + if (provider.SupportsMappedPaths) + { + var mappedPath = parentFolder.FolderPath == string.Empty ? string.Empty : folderPath.Replace(parentFolder.FolderPath, string.Empty); + folderInfo.MappedPath = PathUtils.Instance.FormatFolderPath(parentFolder.MappedPath + mappedPath); + } + else + { + folderInfo.MappedPath = folderPath; + } + } + else if (provider.SupportsMappedPaths) + { + if (originalFolderPath == folderInfo.MappedPath) + { + folderInfo.MappedPath = folderPath; + } + else if (folderInfo.MappedPath.EndsWith("/" + originalFolderPath, StringComparison.Ordinal)) + { + var newMappedPath = PathUtils.Instance.FormatFolderPath( + folderInfo.MappedPath.Substring(0, folderInfo.MappedPath.LastIndexOf("/" + originalFolderPath, StringComparison.Ordinal)) + "/" + folderPath); + folderInfo.MappedPath = newMappedPath; + } + } + + this.UpdateFolderInternal(folderInfo, false); + } + + this.ClearFolderCache(folder.PortalID); + } + + /// This member is reserved for internal use and is not intended to be used directly from your code. + /// The source folder mapping. + /// The destination folder mapping. + /// A value indicating whether a folder mapping can be moved to another one. + internal virtual bool CanMoveBetweenFolderMappings(FolderMappingInfo sourceFolderMapping, FolderMappingInfo destinationFolderMapping) + { + // If Folder Mappings are exactly the same + if (sourceFolderMapping.FolderMappingID == destinationFolderMapping.FolderMappingID) + { + return true; + } + + return IsStandardFolderProviderType(sourceFolderMapping) && IsStandardFolderProviderType(destinationFolderMapping); + } + + private static Regex WildcardToRegex(string pattern) + { + if (!pattern.Contains("*") && !pattern.Contains("?")) + { + pattern = "^" + pattern + ".*$"; + } + else + { + pattern = "^" + Regex.Escape(pattern).Replace(@"\*", ".*").Replace(@"\?", ".") + "$"; + } + + return RegexUtils.GetCachedRegex(pattern, RegexOptions.IgnoreCase); + } + + private static bool IsStandardFolderProviderType(FolderMappingInfo folderMappingInfo) + { + var compatibleTypes = new[] { "StandardFolderProvider", "SecureFolderProvider", "DatabaseFolderProvider" }; + return compatibleTypes.Contains(folderMappingInfo.FolderProviderType); + } + + private int AddFolderInternal(IFolderInfo folder) + { + // Check this is not a duplicate + var tmpfolder = this.GetFolder(folder.PortalID, folder.FolderPath); + + if (tmpfolder != null && folder.FolderID == Null.NullInteger) + { + folder.FolderID = tmpfolder.FolderID; + } + + if (folder.FolderID == Null.NullInteger) + { + var isVersioned = folder.IsVersioned; + var workflowId = folder.WorkflowID; + + // Inherit some configuration from its Parent Folder + var parentFolder = this.GetParentFolder(folder.PortalID, folder.FolderPath); + var parentId = Null.NullInteger; + if (parentFolder != null) + { + isVersioned = parentFolder.IsVersioned; + workflowId = parentFolder.WorkflowID; + parentId = parentFolder.FolderID; + } + + folder.FolderPath = PathUtils.Instance.FormatFolderPath(folder.FolderPath); + folder.FolderID = DataProvider.Instance().AddFolder( + folder.PortalID, + folder.UniqueId, + folder.VersionGuid, + folder.FolderPath, + folder.MappedPath, + folder.StorageLocation, + folder.IsProtected, + folder.IsCached, + folder.LastUpdated, + this.GetCurrentUserId(), + folder.FolderMappingID, + isVersioned, + workflowId, + parentId); + + // Refetch folder for logging + folder = this.GetFolder(folder.PortalID, folder.FolderPath); + + this.AddLogEntry(folder, EventLogController.EventLogType.FOLDER_CREATED); + + if (parentFolder != null) + { + this.UpdateFolderInternal(parentFolder, false); + } + else + { + this.UpdateParentFolder(folder.PortalID, folder.FolderPath); + } + } + else + { + var parentFolder = this.GetParentFolder(folder.PortalID, folder.FolderPath); + if (parentFolder != null) + { + // Ensure that Parent Id is repaired + folder.ParentID = parentFolder.FolderID; + } + + this.UpdateFolderInternal(folder, false); + } + + // Invalidate Cache + this.ClearFolderCache(folder.PortalID); + + return folder.FolderID; + } + + private bool GetOnlyUnmap(IFolderInfo folder) + { + if (folder == null || folder.ParentID == Null.NullInteger) + { + return true; + } + + return FolderProvider.Instance(FolderMappingController.Instance.GetFolderMapping(folder.FolderMappingID).FolderProviderType).SupportsMappedPaths && + this.GetFolder(folder.ParentID).FolderMappingID != folder.FolderMappingID; + } + + private void UnmapFolderInternal(IFolderInfo folder, bool isCascadeDeleting) + { + Requires.NotNull("folder", folder); + + if (DirectoryWrapper.Instance.Exists(folder.PhysicalPath)) + { + DirectoryWrapper.Instance.Delete(folder.PhysicalPath, true); + } + + this.DeleteFolder(folder.PortalID, folder.FolderPath); + + // Notify folder deleted event + this.OnFolderDeleted(folder, this.GetCurrentUserId(), isCascadeDeleting); + } + + private void DeleteFolderInternal(IFolderInfo folder, bool isCascadeDeleting) + { + Requires.NotNull("folder", folder); + + var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); + + try + { + FolderProvider.Instance(folderMapping.FolderProviderType).DeleteFolder(folder); + } + catch (Exception ex) + { + Logger.Error(ex); + + throw new FolderProviderException( + Localization.GetExceptionMessage( + "DeleteFolderUnderlyingSystemError", + "The underlying system threw an exception. The folder has not been deleted."), + ex); + } + + if (DirectoryWrapper.Instance.Exists(folder.PhysicalPath)) + { + DirectoryWrapper.Instance.Delete(folder.PhysicalPath, true); + } + + this.DeleteFolder(folder.PortalID, folder.FolderPath); + + // Notify folder deleted event + this.OnFolderDeleted(folder, this.GetCurrentUserId(), isCascadeDeleting); + } + + private IFolderInfo GetParentFolder(int portalId, string folderPath) + { + if (!string.IsNullOrEmpty(folderPath)) + { + var parentFolderPath = folderPath.Substring(0, folderPath.Substring(0, folderPath.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1); + return this.GetFolder(portalId, parentFolderPath); + } + + return null; + } + + private IEnumerable SearchFiles(IFolderInfo folder, Regex regex, bool recursive) + { + var fileCollection = + CBO.Instance.FillCollection(DataProvider.Instance().GetFiles(folder.FolderID, false, false)); + + var files = (from f in fileCollection where regex.IsMatch(f.FileName) select f).Cast().ToList(); + + if (recursive) + { + foreach (var subFolder in this.GetFolders(folder)) + { + if (FolderPermissionController.Instance.CanViewFolder(subFolder)) + { + files.AddRange(this.SearchFiles(subFolder, regex, true)); + } + } + } + + return files; + } + + private IFolderInfo UpdateFolderInternal(IFolderInfo folder, bool clearCache) + { + Requires.NotNull("folder", folder); + + DataProvider.Instance().UpdateFolder( + folder.PortalID, + folder.VersionGuid, + folder.FolderID, + PathUtils.Instance.FormatFolderPath(folder.FolderPath), + folder.StorageLocation, + folder.MappedPath, + folder.IsProtected, + folder.IsCached, + folder.LastUpdated, + this.GetCurrentUserId(), + folder.FolderMappingID, + folder.IsVersioned, + folder.WorkflowID, + folder.ParentID); + + if (clearCache) + { + this.ClearFolderCache(folder.PortalID); + } + + return folder; + } + + private int FindFolderMappingId(MergedTreeItem item, int portalId) + { + if (item.ExistsInFolderMapping) + { + return item.FolderMappingID; + } + + if (item.FolderPath.IndexOf('/') != item.FolderPath.LastIndexOf('/')) + { + var parentPath = item.FolderPath.Substring(0, item.FolderPath.TrimEnd('/').LastIndexOf('/') + 1); + var folder = this.GetFolder(portalId, parentPath); + if (folder != null) + { + return folder.FolderMappingID; + } + } + + return FolderMappingController.Instance.GetDefaultFolderMapping(portalId).FolderMappingID; + } + + private bool DeleteFolderRecursive(IFolderInfo folder, ICollection notDeletedSubfolders, bool isRecursiveDeletionFolder, bool unmap) + { + Requires.NotNull("folder", folder); + + if (UserSecurityController.Instance.HasFolderPermission(folder, "DELETE")) + { + var subfolders = this.GetFolders(folder); + + var allSubFoldersHasBeenDeleted = true; + + foreach (var subfolder in subfolders) + { + if (!this.DeleteFolderRecursive(subfolder, notDeletedSubfolders, false, unmap || this.GetOnlyUnmap(subfolder))) + { + allSubFoldersHasBeenDeleted = false; + } + } + + var files = this.GetFiles(folder, false, true); + foreach (var file in files) + { + if (unmap) + { + FileDeletionController.Instance.UnlinkFile(file); + } + else + { + FileDeletionController.Instance.DeleteFile(file); + } + + this.OnFileDeleted(file, this.GetCurrentUserId(), true); + } + + if (allSubFoldersHasBeenDeleted) + { + if (unmap) + { + this.UnmapFolderInternal(folder, !isRecursiveDeletionFolder); + } + else + { + this.DeleteFolderInternal(folder, !isRecursiveDeletionFolder); + } + + return true; + } + } + + notDeletedSubfolders.Add(folder); + return false; + } + + private string GetDefaultMappedPath(FolderMappingInfo folderMapping) + { + var defaultMappedPath = folderMapping.FolderMappingSettings[DefaultMappedPathSetting]; + if (defaultMappedPath == null) + { + return string.Empty; + } + + return defaultMappedPath.ToString(); + } + + private IEnumerable GetFolders(IFolderInfo parentFolder, bool allSubFolders) + { + Requires.NotNull("parentFolder", parentFolder); + + if (allSubFolders) + { + var subFolders = + this.GetFolders(parentFolder.PortalID) + .Where( + f => + f.FolderPath.StartsWith( + parentFolder.FolderPath, + StringComparison.InvariantCultureIgnoreCase)); + + return subFolders.Where(f => f.FolderID != parentFolder.FolderID); + } + + return this.GetFolders(parentFolder.PortalID).Where(f => f.ParentID == parentFolder.FolderID); + } + + private void OnFolderMoved(IFolderInfo folderInfo, int userId, string oldFolderPath) + { + EventManager.Instance.OnFolderMoved(new FolderMovedEventArgs + { + FolderInfo = folderInfo, + UserId = userId, + OldFolderPath = oldFolderPath, + }); + } + + private void OnFolderRenamed(IFolderInfo folderInfo, int userId, string oldFolderName) + { + EventManager.Instance.OnFolderRenamed(new FolderRenamedEventArgs + { + FolderInfo = folderInfo, + UserId = userId, + OldFolderName = oldFolderName, + }); + } + + private void OnFolderDeleted(IFolderInfo folderInfo, int userId, bool isCascadeDeleting) + { + EventManager.Instance.OnFolderDeleted(new FolderDeletedEventArgs + { + FolderInfo = folderInfo, + UserId = userId, + IsCascadeDeletng = isCascadeDeleting, + }); + } + + private void OnFolderAdded(IFolderInfo folderInfo, int userId) + { + EventManager.Instance.OnFolderAdded(new FolderChangedEventArgs + { + FolderInfo = folderInfo, + UserId = userId, + }); + } + + private void OnFileDeleted(IFileInfo fileInfo, int userId, bool isCascadeDeleting) + { + EventManager.Instance.OnFileDeleted(new FileDeletedEventArgs + { + FileInfo = fileInfo, + UserId = userId, + IsCascadeDeleting = isCascadeDeleting, + }); + } + + private FolderPermissionCollection GetFolderPermissionsFromSyncData(int portalId, string relativePath) + { + var threadId = Thread.CurrentThread.ManagedThreadId; + FolderPermissionCollection permissions = null; + if (SyncFoldersData.ContainsKey(threadId)) + { + if (SyncFoldersData[threadId].FolderPath == relativePath && SyncFoldersData[threadId].PortalId == portalId) + { + return SyncFoldersData[threadId].Permissions; + } + + permissions = FolderPermissionController.GetFolderPermissionsCollectionByFolder(portalId, relativePath); + SyncFoldersData[threadId] = new SyncFolderData { PortalId = portalId, FolderPath = relativePath, Permissions = permissions }; + return permissions; + } + + permissions = FolderPermissionController.GetFolderPermissionsCollectionByFolder(portalId, relativePath); + SyncFoldersData.Add(threadId, new SyncFolderData { PortalId = portalId, FolderPath = relativePath, Permissions = permissions }); + + return permissions; + } + + private void InitialiseSyncFoldersData(int portalId, string relativePath) + { + var threadId = Thread.CurrentThread.ManagedThreadId; + var permissions = FolderPermissionController.GetFolderPermissionsCollectionByFolder(portalId, relativePath); + if (SyncFoldersData.ContainsKey(threadId)) + { + if (SyncFoldersData[threadId].FolderPath == relativePath && SyncFoldersData[threadId].PortalId == portalId) + { + SyncFoldersData[threadId].Permissions = permissions; + } + else + { + SyncFoldersData[threadId] = new SyncFolderData { PortalId = portalId, FolderPath = relativePath, Permissions = permissions }; + } + } + else + { + SyncFoldersData.Add(threadId, new SyncFolderData { PortalId = portalId, FolderPath = relativePath, Permissions = permissions }); + } + } + + private void RemoveSyncFoldersData(string relativePath) + { + var threadId = Thread.CurrentThread.ManagedThreadId; + if (SyncFoldersData.ContainsKey(threadId)) + { + SyncFoldersData.Remove(threadId); + } + } + /// - /// Creates a folder in the database. + /// This class and its members are reserved for internal use and are not intended to be used in your code. /// - /// The site (portal) ID. - /// The folder path to create. - /// The folder mapping id, . - /// The created folder ID. - internal virtual int CreateFolderInDatabase(int portalId, string folderPath, int folderMappingId) - { - return this.CreateFolderInDatabase(portalId, folderPath, folderMappingId, folderPath); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The site (portal) ID. - /// The folder path to create. - /// The id for the folder mapping. - /// The mapped path. - /// The created folder ID. - internal virtual int CreateFolderInDatabase(int portalId, string folderPath, int folderMappingId, string mappedPath) - { - var isProtected = PathUtils.Instance.IsDefaultProtectedPath(folderPath); - var folderMapping = FolderMappingController.Instance.GetFolderMapping(portalId, folderMappingId); - var storageLocation = (int)FolderController.StorageLocationTypes.DatabaseSecure; - if (!folderMapping.IsEditable) - { - switch (folderMapping.MappingName) - { - case "Standard": - storageLocation = (int)FolderController.StorageLocationTypes.InsecureFileSystem; - break; - case "Secure": - storageLocation = (int)FolderController.StorageLocationTypes.SecureFileSystem; - break; - default: - storageLocation = (int)FolderController.StorageLocationTypes.DatabaseSecure; - break; - } - } - - var folder = new FolderInfo(true) - { - PortalID = portalId, - FolderPath = folderPath, - MappedPath = mappedPath, - StorageLocation = storageLocation, - IsProtected = isProtected, - IsCached = false, - FolderMappingID = folderMappingId, - LastUpdated = Null.NullDate, - }; - - folder.FolderID = this.AddFolderInternal(folder); - - if (portalId != Null.NullInteger) - { - // Set Folder Permissions to inherit from parent - this.CopyParentFolderPermissions(folder); - } - - return folder.FolderID; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The physical path to create the folder in. - internal virtual void CreateFolderInFileSystem(string physicalPath) - { - var di = new DirectoryInfo(physicalPath); - - if (!di.Exists) - { - di.Create(); - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The site (portal) ID. - /// The folder path. - internal virtual void DeleteFolder(int portalId, string folderPath) - { - DataProvider.Instance().DeleteFolder(portalId, PathUtils.Instance.FormatFolderPath(folderPath)); - this.AddLogEntry("FolderPath", folderPath, EventLogController.EventLogType.FOLDER_DELETED); - this.UpdateParentFolder(portalId, folderPath); - DataCache.ClearFolderCache(portalId); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder mapping affected. - /// A list of folders to delete. - internal virtual void DeleteFoldersFromExternalStorageLocations(Dictionary folderMappings, IEnumerable foldersToDelete) - { - foreach (var folderToDelete in foldersToDelete) - { - // Delete source folder from its storage location - var folderMapping = this.GetFolderMapping(folderMappings, folderToDelete.FolderMappingID); - - try - { - var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); - - // IMPORTANT: We cannot delete the folder from its storage location when it contains other subfolders - if (!folderProvider.GetSubFolders(folderToDelete.MappedPath, folderMapping).Any()) - { - folderProvider.DeleteFolder(folderToDelete); - } - } - catch (Exception ex) - { - // The folders that cannot be deleted from its storage location will be handled during the next sync - Logger.Error(ex); - } - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// A value representing the current script timeout. - internal virtual int GetCurrentScriptTimeout() - { - return HttpContext.Current.Server.ScriptTimeout; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The id of the current user. - internal virtual int GetCurrentUserId() - { - return UserController.Instance.GetCurrentUserInfo().UserID; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The site (portal) ID. - /// The relative path. - /// A value indicating whether to return folders recursively. - /// A sorted list of folders. - internal virtual SortedList GetDatabaseFolders(int portalId, string relativePath, bool isRecursive) - { - var databaseFolders = new SortedList(new IgnoreCaseStringComparer()); - - var folder = this.GetFolder(portalId, relativePath); - - if (folder != null) - { - if (!isRecursive) - { - var item = new MergedTreeItem - { - FolderID = folder.FolderID, - FolderMappingID = folder.FolderMappingID, - FolderPath = folder.FolderPath, - ExistsInDatabase = true, - MappedPath = folder.MappedPath, - }; - - databaseFolders.Add(relativePath, item); - } - else - { - databaseFolders = this.GetDatabaseFoldersRecursive(folder); - } - } - - return databaseFolders; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder to get. - /// A sorted list of folders. - internal virtual SortedList GetDatabaseFoldersRecursive(IFolderInfo folder) - { - var result = new SortedList(new IgnoreCaseStringComparer()); - var stack = new Stack(); - - stack.Push(folder); - - while (stack.Count > 0) - { - var folderInfo = stack.Pop(); - - var item = new MergedTreeItem - { - FolderID = folderInfo.FolderID, - FolderMappingID = folderInfo.FolderMappingID, - FolderPath = folderInfo.FolderPath, - ExistsInDatabase = true, - MappedPath = folderInfo.MappedPath, - }; - - if (!result.ContainsKey(item.FolderPath)) - { - result.Add(item.FolderPath, item); - } - - foreach (var subfolder in this.GetFolders(folderInfo)) - { - stack.Push(subfolder); - } - } - - return result; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The site (portal) ID. - /// The relative path. - /// A value indicating whether to return the folders recursively. - /// A sorted list of folders. - internal virtual SortedList GetFileSystemFolders(int portalId, string relativePath, bool isRecursive) - { - var fileSystemFolders = new SortedList(new IgnoreCaseStringComparer()); - - var physicalPath = PathUtils.Instance.GetPhysicalPath(portalId, relativePath); - var hideFoldersEnabled = PortalController.GetPortalSettingAsBoolean("HideFoldersEnabled", portalId, true); - - if (DirectoryWrapper.Instance.Exists(physicalPath)) - { - if (((FileWrapper.Instance.GetAttributes(physicalPath) & FileAttributes.Hidden) == FileAttributes.Hidden || physicalPath.StartsWith("_")) && hideFoldersEnabled) - { - return fileSystemFolders; - } - - if (!isRecursive) - { - var item = new MergedTreeItem - { - FolderID = -1, - FolderMappingID = -1, - FolderPath = relativePath, - ExistsInFileSystem = true, - MappedPath = string.Empty, - }; - - fileSystemFolders.Add(relativePath, item); - } - else - { - fileSystemFolders = this.GetFileSystemFoldersRecursive(portalId, physicalPath); - } - } - - return fileSystemFolders; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The site (portal) ID. - /// The physical path of the folder. - /// A sorted list of folders. - internal virtual SortedList GetFileSystemFoldersRecursive(int portalId, string physicalPath) - { - var result = new SortedList(new IgnoreCaseStringComparer()); - var stack = new Stack(); - - stack.Push(physicalPath); - - var hideFoldersEnabled = PortalController.GetPortalSettingAsBoolean("HideFoldersEnabled", portalId, true); - - while (stack.Count > 0) - { - var dir = stack.Pop(); - - try - { - var item = new MergedTreeItem - { - FolderID = -1, - FolderMappingID = -1, - FolderPath = PathUtils.Instance.GetRelativePath(portalId, dir), - ExistsInFileSystem = true, - MappedPath = string.Empty, - }; - - result.Add(item.FolderPath, item); - - foreach (var dn in DirectoryWrapper.Instance.GetDirectories(dir)) - { - if (((FileWrapper.Instance.GetAttributes(dn) & FileAttributes.Hidden) == FileAttributes.Hidden || dn.StartsWith("_")) && hideFoldersEnabled) - { - continue; - } - - stack.Push(dn); - } - } - catch (Exception ex) - { - Logger.Error(ex); - } - } - - return result; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder mapping to search in. - /// The folder mapping id to return. - /// A single folder mapping, . - internal virtual FolderMappingInfo GetFolderMapping(Dictionary folderMappings, int folderMappingId) - { - if (!folderMappings.ContainsKey(folderMappingId)) - { - folderMappings.Add(folderMappingId, FolderMappingController.Instance.GetFolderMapping(folderMappingId)); - } - - return folderMappings[folderMappingId]; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder mapping to use. - /// The folder base path. - /// A sorted list of folder mappings. - internal virtual SortedList GetFolderMappingFoldersRecursive(FolderMappingInfo folderMapping, IFolderInfo folder) - { - var result = new SortedList(new IgnoreCaseStringComparer()); - var stack = new Stack(); - var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); - - var baseMappedPath = folder.MappedPath; - var baseFolderPath = folder.FolderPath; - - stack.Push(baseMappedPath); - - while (stack.Count > 0) - { - var mappedPath = stack.Pop(); - var relativePath = string.IsNullOrEmpty(mappedPath) - ? string.Empty - : string.IsNullOrEmpty(baseMappedPath) - ? mappedPath - : RegexUtils.GetCachedRegex(Regex.Escape(baseMappedPath)).Replace(mappedPath, string.Empty, 1); - - var folderPath = baseFolderPath + relativePath; - - if (folderProvider.FolderExists(mappedPath, folderMapping)) - { - var item = new MergedTreeItem - { - FolderID = -1, - FolderMappingID = folderMapping.FolderMappingID, - FolderPath = folderPath, - ExistsInFolderMapping = true, - MappedPath = mappedPath, - }; - - if (!result.ContainsKey(item.FolderPath)) - { - result.Add(item.FolderPath, item); - } - - foreach (var subfolderPath in folderProvider.GetSubFolders(mappedPath, folderMapping)) - { - if (folderMapping.SyncAllSubFolders || folderProvider.FolderExists(subfolderPath, folderMapping)) - { - stack.Push(subfolderPath); - } - } - } - } - - return result; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The cached items arguments, . - /// A list of folders. - internal virtual object GetFoldersByPermissionSortedCallBack(CacheItemArgs cacheItemArgs) - { - var portalId = (int)cacheItemArgs.ParamList[0]; - var permissions = (string)cacheItemArgs.ParamList[1]; - var userId = (int)cacheItemArgs.ParamList[2]; - return CBO.Instance.FillCollection(DataProvider.Instance().GetFoldersByPortalAndPermissions(portalId, permissions, userId)); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The cache item arguments, . - /// A list of folders. - internal virtual object GetFoldersSortedCallBack(CacheItemArgs cacheItemArgs) - { - var portalId = (int)cacheItemArgs.ParamList[0]; - return CBO.Instance.FillCollection(DataProvider.Instance().GetFoldersByPortal(portalId)); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The site (portal) ID. - /// The relative path. - /// A vavlue indicating whether the search should be recursive. - /// A sorted list of . - internal virtual SortedList GetMergedTree(int portalId, string relativePath, bool isRecursive) - { - var fileSystemFolders = this.GetFileSystemFolders(portalId, relativePath, isRecursive); - var databaseFolders = this.GetDatabaseFolders(portalId, relativePath, isRecursive); - - var mergedTree = this.MergeFolderLists(fileSystemFolders, databaseFolders); - var mappedFolders = new SortedList(); - - // Some providers cache the list of objects for performance - this.ClearFolderProviderCachedLists(portalId); - - foreach (var mergedItem in mergedTree.Values) - { - if (mergedItem.FolderMappingID == Null.NullInteger) - { - continue; - } - - var folderMapping = FolderMappingController.Instance.GetFolderMapping(portalId, mergedItem.FolderMappingID); - - // Add any folders from non-core providers - if (folderMapping.MappingName != "Standard" && folderMapping.MappingName != "Secure" && folderMapping.MappingName != "Database") - { - if (!isRecursive) - { - mergedItem.ExistsInFolderMapping = true; - } - else - { - var folder = this.GetFolder(portalId, mergedItem.FolderPath); - mappedFolders = this.MergeFolderLists(mappedFolders, this.GetFolderMappingFoldersRecursive(folderMapping, folder)); - } - } - else - { - mergedItem.ExistsInFolderMapping = folderMapping.MappingName == "Database" ? mergedItem.ExistsInDatabase : mergedItem.ExistsInFileSystem; - } - } - - mergedTree = this.MergeFolderLists(mergedTree, mappedFolders); - - // Update ExistsInFolderMapping if the Parent Does Not ExistsInFolderMapping - var margedTreeItems = mergedTree.Values; - foreach (var mergedItem in margedTreeItems.Where(m => m.ExistsInFolderMapping - && margedTreeItems.Any(mt2 => !mt2.ExistsInFolderMapping && m.FolderPath.StartsWith(mt2.FolderPath)))) - { - mergedItem.ExistsInFolderMapping = false; - } - - return mergedTree; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder mapping. - /// A value indicating whether the folder mapping is editable. - internal virtual bool IsFolderMappingEditable(FolderMappingInfo folderMapping) - { - return folderMapping.IsEditable; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder to move. - /// The destination folder to move the folder to. - /// The new folder path. - /// A value indicating whether the move operation would be valid. - internal virtual bool IsMoveOperationValid(IFolderInfo folderToMove, IFolderInfo destinationFolder, string newFolderPath) - { - // FolderMapping cases - var folderMapping = FolderMappingController.Instance.GetFolderMapping(folderToMove.PortalID, folderToMove.FolderMappingID); - if (folderToMove.FolderMappingID == destinationFolder.FolderMappingID && FolderProvider.Instance(folderMapping.FolderProviderType).SupportsMappedPaths) - { - // Root mapped folder cannot be move, when folder mappings are equal - if (folderToMove.MappedPath == string.Empty) - { - return false; - } - - // Destination folder cannot be a child mapped folder from the folder to move - if (destinationFolder.MappedPath.StartsWith(folderToMove.MappedPath)) - { - return false; - } - } - - return this.IsMoveOperationValid(folderToMove, newFolderPath); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder to move. - /// The distination folder to move the folder into. - /// A value indicating if the move operation would be valid. - internal virtual bool IsMoveOperationValid(IFolderInfo folderToMove, string newFolderPath) - { - // Root folder cannot be moved - if (folderToMove.FolderPath == string.Empty) - { - return false; - } - - // newParentFolder cannot be a child of folderToMove - if (newFolderPath.StartsWith(folderToMove.FolderPath)) - { - return false; - } - - return true; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// A value indicating whether the network is available. - internal virtual bool IsNetworkAvailable() - { - return NetworkInterface.GetIsNetworkAvailable(); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The first list for the merge. - /// The second list for the merge. - /// A merged sorted list of MergedTreeItems, . - internal virtual SortedList MergeFolderLists(SortedList list1, SortedList list2) - { - foreach (var item in list2.Values) - { - if (list1.ContainsKey(item.FolderPath)) - { - var existingItem = list1[item.FolderPath]; - if (existingItem.FolderID < 0) - { - existingItem.FolderID = item.FolderID; - } - - if (existingItem.FolderMappingID < 0) - { - existingItem.FolderMappingID = item.FolderMappingID; - } - - if (string.IsNullOrEmpty(existingItem.MappedPath)) - { - existingItem.MappedPath = item.MappedPath; - } - - existingItem.ExistsInFileSystem = existingItem.ExistsInFileSystem || item.ExistsInFileSystem; - existingItem.ExistsInDatabase = existingItem.ExistsInDatabase || item.ExistsInDatabase; - existingItem.ExistsInFolderMapping = existingItem.ExistsInFolderMapping || item.ExistsInFolderMapping; - } - else - { - list1.Add(item.FolderPath, item); - } - } - - return list1; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The source directory. - /// The target directory. - internal virtual void MoveDirectory(string source, string target) - { - var stack = new Stack(); - stack.Push(new MoveFoldersInfo(source, target)); - - // ReSharper disable AssignNullToNotNullAttribute - while (stack.Count > 0) - { - var folders = stack.Pop(); - Directory.CreateDirectory(folders.Target); - foreach (var file in Directory.GetFiles(folders.Source, "*.*")) - { - var targetFile = Path.Combine(folders.Target, Path.GetFileName(file)); - if (File.Exists(targetFile)) - { - File.Delete(targetFile); - } - - File.Move(file, targetFile); - } - - foreach (var folder in Directory.GetDirectories(folders.Source)) - { - stack.Push(new MoveFoldersInfo(folder, Path.Combine(folders.Target, Path.GetFileName(folder)))); - } - } - - // ReSharper restore AssignNullToNotNullAttribute - Directory.Delete(source, true); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder to move. - /// The destination folder. - internal virtual void MoveFolderWithinProvider(IFolderInfo folder, IFolderInfo destinationFolder) - { - var newFolderPath = destinationFolder.FolderPath + folder.FolderName + "/"; - this.RenameFolderInFileSystem(folder, newFolderPath); - - // Update provider - var newMappedPath = destinationFolder.MappedPath + folder.FolderName + "/"; - var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); - var provider = FolderProvider.Instance(folderMapping.FolderProviderType); - provider.MoveFolder(folder.MappedPath, newMappedPath, folderMapping); - - // Update database - this.UpdateChildFolders(folder, Path.Combine(destinationFolder.FolderPath, folder.FolderName)); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder to move. - /// The target folder for the move. - internal virtual void MoveFolderBetweenProviders(IFolderInfo folder, string newFolderPath) - { - this.RenameFolderInFileSystem(folder, newFolderPath); - - var folderInfos = this.GetFolders(folder.PortalID).Where(f => f.FolderPath != string.Empty && f.FolderPath.StartsWith(folder.FolderPath)).ToArray(); - var tmpFolderPath = folder.FolderPath; - - foreach (var folderInfo in folderInfos) - { - var folderPath = newFolderPath + folderInfo.FolderPath.Substring(tmpFolderPath.Length); - - var parentFolder = this.GetParentFolder(folder.PortalID, folderPath); - folderInfo.ParentID = parentFolder.FolderID; - folderInfo.FolderPath = folderPath; - this.UpdateFolderInternal(folderInfo, true); - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The source folder. - /// The destination folder. - /// The folder mappings. - /// The folders to delete. - internal virtual void OverwriteFolder(IFolderInfo sourceFolder, IFolderInfo destinationFolder, Dictionary folderMappings, SortedList foldersToDelete) - { - var fileManager = FileManager.Instance; - var files = this.GetFiles(sourceFolder, true); - - foreach (var file in files) - { - fileManager.MoveFile(file, destinationFolder); - } - - // Delete source folder in database - this.DeleteFolder(sourceFolder.PortalID, sourceFolder.FolderPath); - - var folderMapping = this.GetFolderMapping(folderMappings, sourceFolder.FolderMappingID); - - if (this.IsFolderMappingEditable(folderMapping)) - { - foldersToDelete.Add(sourceFolder.FolderPath, sourceFolder); - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The item to process. - /// The site (portal) ID. - internal virtual void ProcessMergedTreeItemInAddMode(MergedTreeItem item, int portalId) - { - try - { - if (item.ExistsInFileSystem) - { - if (!item.ExistsInDatabase) - { - var folderMappingId = this.FindFolderMappingId(item, portalId); - this.CreateFolderInDatabase(portalId, item.FolderPath, folderMappingId); - } - } - else - { - if (item.ExistsInDatabase) - { - if (item.ExistsInFolderMapping) - { - this.CreateFolderInFileSystem(PathUtils.Instance.GetPhysicalPath(portalId, item.FolderPath)); - } - } - else - { - // by exclusion it exists in the Folder Mapping - this.CreateFolderInFileSystem(PathUtils.Instance.GetPhysicalPath(portalId, item.FolderPath)); - this.CreateFolderInDatabase(portalId, item.FolderPath, item.FolderMappingID, item.MappedPath); - } - } - } - catch (Exception ex) - { - Logger.Error(string.Format("Could not create folder {0}. EXCEPTION: {1}", item.FolderPath, ex.Message), ex); - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// . - /// The site (portal) ID. - internal virtual void ProcessMergedTreeItemInDeleteMode(MergedTreeItem item, int portalId) - { - if (item.ExistsInFileSystem) - { - if (item.ExistsInDatabase) - { - if (item.FolderPath == string.Empty) - { - return; // Do not process root folder - } - - if (!item.ExistsInFolderMapping) - { - var folderMapping = FolderMappingController.Instance.GetFolderMapping(portalId, item.FolderMappingID); - - if (folderMapping.IsEditable) - { - DirectoryWrapper.Instance.Delete(PathUtils.Instance.GetPhysicalPath(portalId, item.FolderPath), false); - this.DeleteFolder(portalId, item.FolderPath); - } - } - } - } - else - { - if (item.ExistsInDatabase && !item.ExistsInFolderMapping) - { - this.DeleteFolder(portalId, item.FolderPath); - } - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder to cleanup. - internal virtual void RemoveOrphanedFiles(IFolderInfo folder) - { - var files = this.GetFiles(folder, false, true); - - var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); - - if (folderMapping != null) - { - var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); - - foreach (var file in files) - { - try - { - if (!folderProvider.FileExists(folder, file.FileName)) - { - FileDeletionController.Instance.DeleteFileData(file); - } - } - catch (Exception ex) - { - Logger.Error(ex); - } - } - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder to rename. - /// The new folder path. - internal virtual void RenameFolderInFileSystem(IFolderInfo folder, string newFolderPath) - { - var source = folder.PhysicalPath; - - var di = new DirectoryInfo(source); - if (!di.Exists) - { - return; - } - - var target = PathUtils.Instance.GetPhysicalPath(folder.PortalID, newFolderPath); - this.MoveDirectory(source, target); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder to save the permissions for. - internal virtual void SaveFolderPermissions(IFolderInfo folder) - { - FolderPermissionController.SaveFolderPermissions((FolderInfo)folder); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The timeout in seconds. - internal virtual void SetScriptTimeout(int timeout) - { - HttpContext.Current.Server.ScriptTimeout = timeout; - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The item to synchronize. - /// The site (portal) ID. - internal virtual void SynchronizeFiles(MergedTreeItem item, int portalId) - { - var folder = this.GetFolder(portalId, item.FolderPath); - - if (folder == null) - { - return; - } - - var folderMapping = FolderMappingController.Instance.GetFolderMapping(portalId, folder.FolderMappingID); - - if (folderMapping == null) - { - return; - } - - try - { - var folderProvider = FolderProvider.Instance(folderMapping.FolderProviderType); - var fileManager = FileManager.Instance; - - if (folderProvider.FolderExists(folder.MappedPath, folderMapping)) - { - var files = folderProvider.GetFiles(folder); - - files = files.Except(FileVersionController.Instance.GetFileVersionsInFolder(folder.FolderID).Select(f => f.FileName)).ToArray(); - - foreach (var fileName in files) - { - try - { - var file = fileManager.GetFile(folder, fileName, true); - - if (file == null) - { - fileManager.AddFile(folder, fileName, null, false); - } - else if (!folderProvider.IsInSync(file)) - { - fileManager.UpdateFile(file, null); - } - } - catch (InvalidFileExtensionException ex) - { - Logger.Info(ex.Message); - } - catch (Exception ex) - { - Logger.Error(ex); - } - } - } - - this.RemoveOrphanedFiles(folder); - } - catch (Exception ex) - { - Logger.Error(ex); - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The site (portal) ID. - /// The folder path to update. - internal virtual void UpdateParentFolder(int portalId, string folderPath) - { - if (!string.IsNullOrEmpty(folderPath)) - { - var parentFolderPath = folderPath.Substring(0, folderPath.Substring(0, folderPath.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1); - var objFolder = this.GetFolder(portalId, parentFolderPath); - if (objFolder != null) - { - // UpdateFolder(objFolder); - this.UpdateFolderInternal(objFolder, false); - } - } - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The folder to update. - /// The new folder path. - internal virtual void UpdateChildFolders(IFolderInfo folder, string newFolderPath) - { - var originalFolderPath = folder.FolderPath; - - var folderInfos = this.GetFolders(folder.PortalID).Where(f => f.FolderPath != string.Empty && f.FolderPath.StartsWith(originalFolderPath)).ToArray(); - - foreach (var folderInfo in folderInfos) - { - var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folderInfo.FolderMappingID); - var provider = FolderProvider.Instance(folderMapping.FolderProviderType); - - var folderPath = newFolderPath + (newFolderPath.EndsWith("/") ? string.Empty : "/") + folderInfo.FolderPath.Substring(originalFolderPath.Length); - - var parentFolder = this.GetParentFolder(folder.PortalID, folderPath); - folderInfo.ParentID = parentFolder.FolderID; - folderInfo.FolderPath = folderPath; - - var parentProvider = FolderProvider.Instance(FolderMappingController.Instance.GetFolderMapping(parentFolder.PortalID, parentFolder.FolderMappingID).FolderProviderType); - if (parentProvider.SupportsMappedPaths || !provider.SupportsMappedPaths) - { - if (provider.SupportsMappedPaths) - { - var mappedPath = parentFolder.FolderPath == string.Empty ? string.Empty : folderPath.Replace(parentFolder.FolderPath, string.Empty); - folderInfo.MappedPath = PathUtils.Instance.FormatFolderPath(parentFolder.MappedPath + mappedPath); - } - else - { - folderInfo.MappedPath = folderPath; - } - } - else if (provider.SupportsMappedPaths) - { - if (originalFolderPath == folderInfo.MappedPath) - { - folderInfo.MappedPath = folderPath; - } - else if (folderInfo.MappedPath.EndsWith("/" + originalFolderPath, StringComparison.Ordinal)) - { - var newMappedPath = PathUtils.Instance.FormatFolderPath( - folderInfo.MappedPath.Substring(0, folderInfo.MappedPath.LastIndexOf("/" + originalFolderPath, StringComparison.Ordinal)) + "/" + folderPath); - folderInfo.MappedPath = newMappedPath; - } - } - - this.UpdateFolderInternal(folderInfo, false); - } - - this.ClearFolderCache(folder.PortalID); - } - - /// This member is reserved for internal use and is not intended to be used directly from your code. - /// The source folder mapping. - /// The destination folder mapping. - /// A value indicating whether a folder mapping can be moved to another one. - internal virtual bool CanMoveBetweenFolderMappings(FolderMappingInfo sourceFolderMapping, FolderMappingInfo destinationFolderMapping) - { - // If Folder Mappings are exactly the same - if (sourceFolderMapping.FolderMappingID == destinationFolderMapping.FolderMappingID) - { - return true; - } - - return IsStandardFolderProviderType(sourceFolderMapping) && IsStandardFolderProviderType(destinationFolderMapping); - } - - private static Regex WildcardToRegex(string pattern) - { - if (!pattern.Contains("*") && !pattern.Contains("?")) - { - pattern = "^" + pattern + ".*$"; - } - else - { - pattern = "^" + Regex.Escape(pattern).Replace(@"\*", ".*").Replace(@"\?", ".") + "$"; - } - - return RegexUtils.GetCachedRegex(pattern, RegexOptions.IgnoreCase); - } - - private static bool IsStandardFolderProviderType(FolderMappingInfo folderMappingInfo) - { - var compatibleTypes = new[] { "StandardFolderProvider", "SecureFolderProvider", "DatabaseFolderProvider" }; - return compatibleTypes.Contains(folderMappingInfo.FolderProviderType); - } - - private int AddFolderInternal(IFolderInfo folder) - { - // Check this is not a duplicate - var tmpfolder = this.GetFolder(folder.PortalID, folder.FolderPath); - - if (tmpfolder != null && folder.FolderID == Null.NullInteger) - { - folder.FolderID = tmpfolder.FolderID; - } - - if (folder.FolderID == Null.NullInteger) - { - var isVersioned = folder.IsVersioned; - var workflowId = folder.WorkflowID; - - // Inherit some configuration from its Parent Folder - var parentFolder = this.GetParentFolder(folder.PortalID, folder.FolderPath); - var parentId = Null.NullInteger; - if (parentFolder != null) - { - isVersioned = parentFolder.IsVersioned; - workflowId = parentFolder.WorkflowID; - parentId = parentFolder.FolderID; - } - - folder.FolderPath = PathUtils.Instance.FormatFolderPath(folder.FolderPath); - folder.FolderID = DataProvider.Instance().AddFolder( - folder.PortalID, - folder.UniqueId, - folder.VersionGuid, - folder.FolderPath, - folder.MappedPath, - folder.StorageLocation, - folder.IsProtected, - folder.IsCached, - folder.LastUpdated, - this.GetCurrentUserId(), - folder.FolderMappingID, - isVersioned, - workflowId, - parentId); - - // Refetch folder for logging - folder = this.GetFolder(folder.PortalID, folder.FolderPath); - - this.AddLogEntry(folder, EventLogController.EventLogType.FOLDER_CREATED); - - if (parentFolder != null) - { - this.UpdateFolderInternal(parentFolder, false); - } - else - { - this.UpdateParentFolder(folder.PortalID, folder.FolderPath); - } - } - else - { - var parentFolder = this.GetParentFolder(folder.PortalID, folder.FolderPath); - if (parentFolder != null) - { - // Ensure that Parent Id is repaired - folder.ParentID = parentFolder.FolderID; - } - - this.UpdateFolderInternal(folder, false); - } - - // Invalidate Cache - this.ClearFolderCache(folder.PortalID); - - return folder.FolderID; - } - - private bool GetOnlyUnmap(IFolderInfo folder) - { - if (folder == null || folder.ParentID == Null.NullInteger) - { - return true; - } - - return FolderProvider.Instance(FolderMappingController.Instance.GetFolderMapping(folder.FolderMappingID).FolderProviderType).SupportsMappedPaths && - this.GetFolder(folder.ParentID).FolderMappingID != folder.FolderMappingID; - } - - private void UnmapFolderInternal(IFolderInfo folder, bool isCascadeDeleting) - { - Requires.NotNull("folder", folder); - - if (DirectoryWrapper.Instance.Exists(folder.PhysicalPath)) - { - DirectoryWrapper.Instance.Delete(folder.PhysicalPath, true); - } - - this.DeleteFolder(folder.PortalID, folder.FolderPath); - - // Notify folder deleted event - this.OnFolderDeleted(folder, this.GetCurrentUserId(), isCascadeDeleting); - } - - private void DeleteFolderInternal(IFolderInfo folder, bool isCascadeDeleting) - { - Requires.NotNull("folder", folder); - - var folderMapping = FolderMappingController.Instance.GetFolderMapping(folder.PortalID, folder.FolderMappingID); - - try - { - FolderProvider.Instance(folderMapping.FolderProviderType).DeleteFolder(folder); - } - catch (Exception ex) - { - Logger.Error(ex); - - throw new FolderProviderException( - Localization.GetExceptionMessage( - "DeleteFolderUnderlyingSystemError", - "The underlying system threw an exception. The folder has not been deleted."), - ex); - } - - if (DirectoryWrapper.Instance.Exists(folder.PhysicalPath)) - { - DirectoryWrapper.Instance.Delete(folder.PhysicalPath, true); - } - - this.DeleteFolder(folder.PortalID, folder.FolderPath); - - // Notify folder deleted event - this.OnFolderDeleted(folder, this.GetCurrentUserId(), isCascadeDeleting); - } - - private IFolderInfo GetParentFolder(int portalId, string folderPath) - { - if (!string.IsNullOrEmpty(folderPath)) - { - var parentFolderPath = folderPath.Substring(0, folderPath.Substring(0, folderPath.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1); - return this.GetFolder(portalId, parentFolderPath); - } - - return null; - } - - private IEnumerable SearchFiles(IFolderInfo folder, Regex regex, bool recursive) - { - var fileCollection = - CBO.Instance.FillCollection(DataProvider.Instance().GetFiles(folder.FolderID, false, false)); - - var files = (from f in fileCollection where regex.IsMatch(f.FileName) select f).Cast().ToList(); - - if (recursive) - { - foreach (var subFolder in this.GetFolders(folder)) - { - if (FolderPermissionController.Instance.CanViewFolder(subFolder)) - { - files.AddRange(this.SearchFiles(subFolder, regex, true)); - } - } - } - - return files; - } - - private IFolderInfo UpdateFolderInternal(IFolderInfo folder, bool clearCache) - { - Requires.NotNull("folder", folder); - - DataProvider.Instance().UpdateFolder( - folder.PortalID, - folder.VersionGuid, - folder.FolderID, - PathUtils.Instance.FormatFolderPath(folder.FolderPath), - folder.StorageLocation, - folder.MappedPath, - folder.IsProtected, - folder.IsCached, - folder.LastUpdated, - this.GetCurrentUserId(), - folder.FolderMappingID, - folder.IsVersioned, - folder.WorkflowID, - folder.ParentID); - - if (clearCache) - { - this.ClearFolderCache(folder.PortalID); - } - - return folder; - } - - private int FindFolderMappingId(MergedTreeItem item, int portalId) - { - if (item.ExistsInFolderMapping) - { - return item.FolderMappingID; - } - - if (item.FolderPath.IndexOf('/') != item.FolderPath.LastIndexOf('/')) - { - var parentPath = item.FolderPath.Substring(0, item.FolderPath.TrimEnd('/').LastIndexOf('/') + 1); - var folder = this.GetFolder(portalId, parentPath); - if (folder != null) - { - return folder.FolderMappingID; - } - } - - return FolderMappingController.Instance.GetDefaultFolderMapping(portalId).FolderMappingID; - } - - private bool DeleteFolderRecursive(IFolderInfo folder, ICollection notDeletedSubfolders, bool isRecursiveDeletionFolder, bool unmap) - { - Requires.NotNull("folder", folder); - - if (UserSecurityController.Instance.HasFolderPermission(folder, "DELETE")) - { - var subfolders = this.GetFolders(folder); - - var allSubFoldersHasBeenDeleted = true; - - foreach (var subfolder in subfolders) - { - if (!this.DeleteFolderRecursive(subfolder, notDeletedSubfolders, false, unmap || this.GetOnlyUnmap(subfolder))) - { - allSubFoldersHasBeenDeleted = false; - } - } - - var files = this.GetFiles(folder, false, true); - foreach (var file in files) - { - if (unmap) - { - FileDeletionController.Instance.UnlinkFile(file); - } - else - { - FileDeletionController.Instance.DeleteFile(file); - } - - this.OnFileDeleted(file, this.GetCurrentUserId(), true); - } - - if (allSubFoldersHasBeenDeleted) - { - if (unmap) - { - this.UnmapFolderInternal(folder, !isRecursiveDeletionFolder); - } - else - { - this.DeleteFolderInternal(folder, !isRecursiveDeletionFolder); - } - - return true; - } - } - - notDeletedSubfolders.Add(folder); - return false; - } - - private string GetDefaultMappedPath(FolderMappingInfo folderMapping) - { - var defaultMappedPath = folderMapping.FolderMappingSettings[DefaultMappedPathSetting]; - if (defaultMappedPath == null) - { - return string.Empty; - } - - return defaultMappedPath.ToString(); - } - - private IEnumerable GetFolders(IFolderInfo parentFolder, bool allSubFolders) - { - Requires.NotNull("parentFolder", parentFolder); - - if (allSubFolders) - { - var subFolders = - this.GetFolders(parentFolder.PortalID) - .Where( - f => - f.FolderPath.StartsWith( - parentFolder.FolderPath, - StringComparison.InvariantCultureIgnoreCase)); - - return subFolders.Where(f => f.FolderID != parentFolder.FolderID); - } - - return this.GetFolders(parentFolder.PortalID).Where(f => f.ParentID == parentFolder.FolderID); - } - - private void OnFolderMoved(IFolderInfo folderInfo, int userId, string oldFolderPath) - { - EventManager.Instance.OnFolderMoved(new FolderMovedEventArgs - { - FolderInfo = folderInfo, - UserId = userId, - OldFolderPath = oldFolderPath, - }); - } - - private void OnFolderRenamed(IFolderInfo folderInfo, int userId, string oldFolderName) - { - EventManager.Instance.OnFolderRenamed(new FolderRenamedEventArgs - { - FolderInfo = folderInfo, - UserId = userId, - OldFolderName = oldFolderName, - }); - } - - private void OnFolderDeleted(IFolderInfo folderInfo, int userId, bool isCascadeDeleting) - { - EventManager.Instance.OnFolderDeleted(new FolderDeletedEventArgs - { - FolderInfo = folderInfo, - UserId = userId, - IsCascadeDeletng = isCascadeDeleting, - }); - } - - private void OnFolderAdded(IFolderInfo folderInfo, int userId) - { - EventManager.Instance.OnFolderAdded(new FolderChangedEventArgs - { - FolderInfo = folderInfo, - UserId = userId, - }); - } - - private void OnFileDeleted(IFileInfo fileInfo, int userId, bool isCascadeDeleting) - { - EventManager.Instance.OnFileDeleted(new FileDeletedEventArgs - { - FileInfo = fileInfo, - UserId = userId, - IsCascadeDeleting = isCascadeDeleting, - }); - } - - private FolderPermissionCollection GetFolderPermissionsFromSyncData(int portalId, string relativePath) - { - var threadId = Thread.CurrentThread.ManagedThreadId; - FolderPermissionCollection permissions = null; - if (SyncFoldersData.ContainsKey(threadId)) - { - if (SyncFoldersData[threadId].FolderPath == relativePath && SyncFoldersData[threadId].PortalId == portalId) - { - return SyncFoldersData[threadId].Permissions; - } - - permissions = FolderPermissionController.GetFolderPermissionsCollectionByFolder(portalId, relativePath); - SyncFoldersData[threadId] = new SyncFolderData { PortalId = portalId, FolderPath = relativePath, Permissions = permissions }; - return permissions; - } - - permissions = FolderPermissionController.GetFolderPermissionsCollectionByFolder(portalId, relativePath); - SyncFoldersData.Add(threadId, new SyncFolderData { PortalId = portalId, FolderPath = relativePath, Permissions = permissions }); - - return permissions; - } - - private void InitialiseSyncFoldersData(int portalId, string relativePath) - { - var threadId = Thread.CurrentThread.ManagedThreadId; - var permissions = FolderPermissionController.GetFolderPermissionsCollectionByFolder(portalId, relativePath); - if (SyncFoldersData.ContainsKey(threadId)) - { - if (SyncFoldersData[threadId].FolderPath == relativePath && SyncFoldersData[threadId].PortalId == portalId) - { - SyncFoldersData[threadId].Permissions = permissions; - } - else - { - SyncFoldersData[threadId] = new SyncFolderData { PortalId = portalId, FolderPath = relativePath, Permissions = permissions }; - } - } - else - { - SyncFoldersData.Add(threadId, new SyncFolderData { PortalId = portalId, FolderPath = relativePath, Permissions = permissions }); - } - } - - private void RemoveSyncFoldersData(string relativePath) - { - var threadId = Thread.CurrentThread.ManagedThreadId; - if (SyncFoldersData.ContainsKey(threadId)) - { - SyncFoldersData.Remove(threadId); - } - } - - /// - /// This class and its members are reserved for internal use and are not intended to be used in your code. - /// - internal class MergedTreeItem - { + internal class MergedTreeItem + { /// /// Gets or sets a value indicating whether the item exists in the file system. - /// - public bool ExistsInFileSystem { get; set; } - + /// + public bool ExistsInFileSystem { get; set; } + /// /// Gets or sets a value indicating whether the item exists in the database. - /// - public bool ExistsInDatabase { get; set; } - + /// + public bool ExistsInDatabase { get; set; } + /// /// Gets or sets a value indicating whether the item exists in the folder mappings. - /// - public bool ExistsInFolderMapping { get; set; } - + /// + public bool ExistsInFolderMapping { get; set; } + /// /// Gets or sets the folder id. - /// - public int FolderID { get; set; } - + /// + public int FolderID { get; set; } + /// /// Gets or sets the folder path. - /// - public int FolderMappingID { get; set; } - + /// + public int FolderMappingID { get; set; } + /// /// Gets or sets the folder path. - /// - public string FolderPath { get; set; } - + /// + public string FolderPath { get; set; } + /// /// Gets or sets the mapped path. - /// - public string MappedPath { get; set; } - } - - /// - /// This class and its members are reserved for internal use and are not intended to be used in your code. - /// - internal class IgnoreCaseStringComparer : IComparer + /// + public string MappedPath { get; set; } + } + + /// + /// This class and its members are reserved for internal use and are not intended to be used in your code. + /// + internal class IgnoreCaseStringComparer : IComparer { /// - public int Compare(string x, string y) - { - return string.Compare(x.ToLowerInvariant(), y.ToLowerInvariant(), StringComparison.Ordinal); - } - } - - /// - /// This class and its members are reserved for internal use and are not intended to be used in your code. - /// - internal class MoveFoldersInfo + public int Compare(string x, string y) + { + return string.Compare(x.ToLowerInvariant(), y.ToLowerInvariant(), StringComparison.Ordinal); + } + } + + /// + /// This class and its members are reserved for internal use and are not intended to be used in your code. + /// + internal class MoveFoldersInfo { /// /// Initializes a new instance of the class. /// /// The source folder. - /// The destination folder. - public MoveFoldersInfo(string source, string target) - { - this.Source = source; - this.Target = target; - } - + /// The destination folder. + public MoveFoldersInfo(string source, string target) + { + this.Source = source; + this.Target = target; + } + /// /// Gets the Souce folder. - /// - public string Source { get; private set; } - + /// + public string Source { get; private set; } + /// /// Gets the target folder. - /// - public string Target { get; private set; } - } - } -} + /// + public string Target { get; private set; } + } + } +} From 8d8930388bbfc9ed59fdbd06f6e46c88c1183396 Mon Sep 17 00:00:00 2001 From: Daniel Valadas Date: Mon, 13 Jul 2020 16:36:37 -0400 Subject: [PATCH 07/45] Update DNN Platform/Library/Services/FileSystem/FolderManager.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Services/FileSystem/FolderManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DNN Platform/Library/Services/FileSystem/FolderManager.cs b/DNN Platform/Library/Services/FileSystem/FolderManager.cs index 73701ce6a9e..e5b994fd0b4 100644 --- a/DNN Platform/Library/Services/FileSystem/FolderManager.cs +++ b/DNN Platform/Library/Services/FileSystem/FolderManager.cs @@ -2447,7 +2447,8 @@ public MoveFoldersInfo(string source, string target) } /// - /// Gets the Souce folder. + /// Gets the Source folder. + /// public string Source { get; private set; } From 877b9a81b45e411440d812b4f7ddb94e2d66f2a9 Mon Sep 17 00:00:00 2001 From: Daniel Valadas Date: Tue, 14 Jul 2020 15:59:33 -0400 Subject: [PATCH 08/45] Update DNN Platform/Library/Services/FileSystem/FolderManager.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Services/FileSystem/FolderManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DNN Platform/Library/Services/FileSystem/FolderManager.cs b/DNN Platform/Library/Services/FileSystem/FolderManager.cs index e5b994fd0b4..b9cf1523e61 100644 --- a/DNN Platform/Library/Services/FileSystem/FolderManager.cs +++ b/DNN Platform/Library/Services/FileSystem/FolderManager.cs @@ -925,7 +925,7 @@ internal virtual IFolderInfo AddUserFolder(UserInfo user) this.AddFolder(folderMapping, DefaultUsersFoldersPath); } - // GetUserFolderPathElement is depreced without a replacement, it should have been internal only and will be removed in Dnn10, hence the warning disable here + // GetUserFolderPathElement is deprecated without a replacement, it should have been internal only and will be removed in DNN v10, hence the warning disable here #pragma warning disable 612,618 var rootFolder = PathUtils.Instance.GetUserFolderPathElement(user.UserID, PathUtils.UserFolderElement.Root); #pragma warning restore 612,618 From 6e60d462b1910994ddf068cb8c334bc2dbd3cbf6 Mon Sep 17 00:00:00 2001 From: Daniel Valadas Date: Tue, 14 Jul 2020 15:59:43 -0400 Subject: [PATCH 09/45] Update DNN Platform/Library/Services/FileSystem/FolderManager.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Services/FileSystem/FolderManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DNN Platform/Library/Services/FileSystem/FolderManager.cs b/DNN Platform/Library/Services/FileSystem/FolderManager.cs index b9cf1523e61..75160824bd8 100644 --- a/DNN Platform/Library/Services/FileSystem/FolderManager.cs +++ b/DNN Platform/Library/Services/FileSystem/FolderManager.cs @@ -912,7 +912,7 @@ internal void DeleteFilesFromCache(int portalId, string newFolderPath) /// This member is reserved for internal use and is not intended to be used directly from your code. /// The added folder information, . - /// the user to add a forder for. + /// the user to add a folder for. internal virtual IFolderInfo AddUserFolder(UserInfo user) { // user _default portal for all super users From 263b0ef79dd8257617d098b794c7e08d9b0986ed Mon Sep 17 00:00:00 2001 From: Daniel Valadas Date: Tue, 14 Jul 2020 15:59:53 -0400 Subject: [PATCH 10/45] Update DNN Platform/Library/Services/FileSystem/FolderManager.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Services/FileSystem/FolderManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DNN Platform/Library/Services/FileSystem/FolderManager.cs b/DNN Platform/Library/Services/FileSystem/FolderManager.cs index 75160824bd8..cfc84dfaf35 100644 --- a/DNN Platform/Library/Services/FileSystem/FolderManager.cs +++ b/DNN Platform/Library/Services/FileSystem/FolderManager.cs @@ -937,7 +937,7 @@ internal virtual IFolderInfo AddUserFolder(UserInfo user) this.AddFolder(folderMapping, folderPath); } - // GetUserFolderPathElement is depreced without a replacement, it should have been internal only and will be removed in Dnn10, hence the warning disable here + // GetUserFolderPathElement is deprecated without a replacement, it should have been internal only and will be removed in DNN v10, hence the warning disable here #pragma warning disable 612,618 folderPath = PathUtils.Instance.FormatFolderPath(string.Concat(folderPath, PathUtils.Instance.GetUserFolderPathElement(user.UserID, PathUtils.UserFolderElement.SubFolder))); #pragma warning restore 612,618 From 7cdedb99e0f58d92c2a302e11ea28885bdc2d99c Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 14 Jul 2020 17:11:59 -0500 Subject: [PATCH 11/45] Add IPortalSettings overloads to IEventLogController --- .../Log/EventLog/EventLogController.cs | 45 +++++++++++++++++-- .../Log/EventLog/IEventLogController.cs | 25 +++++++++-- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs b/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs index 8986c9154fb..c32db991915 100644 --- a/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs +++ b/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs @@ -1,6 +1,6 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information namespace DotNetNuke.Services.Log.EventLog { using System; @@ -9,6 +9,7 @@ namespace DotNetNuke.Services.Log.EventLog using System.Globalization; using System.Linq; + using DotNetNuke.Abstractions.Portals; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Modules; using DotNetNuke.Entities.Portals; @@ -190,15 +191,27 @@ public static void AddSettingLog(EventLogType logTypeKey, string idFieldName, in public void AddLog(string propertyName, string propertyValue, EventLogType logType) { - this.AddLog(propertyName, propertyValue, PortalController.Instance.GetCurrentPortalSettings(), UserController.Instance.GetCurrentUserInfo().UserID, logType); + this.AddLog(propertyName, propertyValue, PortalController.Instance.GetCurrentSettings(), UserController.Instance.GetCurrentUserInfo().UserID, logType); } + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] public void AddLog(string propertyName, string propertyValue, PortalSettings portalSettings, int userID, EventLogType logType) + { + this.AddLog(propertyName, propertyValue, (IPortalSettings)portalSettings, userID, logType); + } + + public void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, EventLogType logType) { this.AddLog(propertyName, propertyValue, portalSettings, userID, logType.ToString()); } + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] public void AddLog(string propertyName, string propertyValue, PortalSettings portalSettings, int userID, string logType) + { + this.AddLog(propertyName, propertyValue, (IPortalSettings)portalSettings, userID, logType); + } + + public void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, string logType) { var properties = new LogProperties(); var logDetailInfo = new LogDetailInfo { PropertyName = propertyName, PropertyValue = propertyValue }; @@ -206,7 +219,13 @@ public void AddLog(string propertyName, string propertyValue, PortalSettings por this.AddLog(properties, portalSettings, userID, logType, false); } + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] public void AddLog(LogProperties properties, PortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering) + { + this.AddLog(properties, (IPortalSettings)portalSettings, userID, logTypeKey, bypassBuffering); + } + + public void AddLog(LogProperties properties, IPortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering) { // supports adding a custom string for LogType var log = new LogInfo @@ -225,17 +244,35 @@ public void AddLog(LogProperties properties, PortalSettings portalSettings, int LogController.Instance.AddLog(log); } + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] public void AddLog(PortalSettings portalSettings, int userID, EventLogType logType) + { + this.AddLog((IPortalSettings)portalSettings, userID, logType); + } + + public void AddLog(IPortalSettings portalSettings, int userID, EventLogType logType) { this.AddLog(new LogProperties(), portalSettings, userID, logType.ToString(), false); } + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] public void AddLog(object businessObject, PortalSettings portalSettings, int userID, string userName, EventLogType logType) + { + this.AddLog(businessObject, (IPortalSettings)portalSettings, userID, userName, logType); + } + + public void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, EventLogType logType) { this.AddLog(businessObject, portalSettings, userID, userName, logType.ToString()); } + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] public void AddLog(object businessObject, PortalSettings portalSettings, int userID, string userName, string logType) + { + this.AddLog(businessObject, (IPortalSettings)portalSettings, userID, userName, logType); + } + + public void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, string logType) { var log = new LogInfo { LogUserID = userID, LogTypeKey = logType }; if (portalSettings != null) diff --git a/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs b/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs index 6197cae7efb..01d4e27b77b 100644 --- a/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs +++ b/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs @@ -1,9 +1,11 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information - +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information namespace DotNetNuke.Services.Log.EventLog { + using System; + + using DotNetNuke.Abstractions.Portals; using DotNetNuke.Entities.Portals; /// @@ -14,16 +16,31 @@ public interface IEventLogController : ILogController { void AddLog(string propertyName, string propertyValue, EventLogController.EventLogType logType); + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] void AddLog(string propertyName, string propertyValue, PortalSettings portalSettings, int userID, EventLogController.EventLogType logType); + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] void AddLog(string propertyName, string propertyValue, PortalSettings portalSettings, int userID, string logType); + void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, EventLogController.EventLogType logType); + + void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, string logType); + void AddLog(PortalSettings portalSettings, int userID, EventLogController.EventLogType logType); + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] void AddLog(LogProperties properties, PortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering); + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] void AddLog(object businessObject, PortalSettings portalSettings, int userID, string userName, EventLogController.EventLogType logType); + [Obsolete("Deprecated in DNN 9.7. It has been replaced by the overload taking IPortalSettings. Scheduled removal in v11.0.0.")] void AddLog(object businessObject, PortalSettings portalSettings, int userID, string userName, string logType); + + void AddLog(LogProperties properties, IPortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering); + + void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, EventLogController.EventLogType logType); + + void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, string logType); } } From 9835b8a30248fa958a6b55992c37e0656fe1bfec Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 14 Jul 2020 17:12:34 -0500 Subject: [PATCH 12/45] Use new IPortalSettings overload in FolderManager --- .../Library/Services/FileSystem/FolderManager.cs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/DNN Platform/Library/Services/FileSystem/FolderManager.cs b/DNN Platform/Library/Services/FileSystem/FolderManager.cs index cfc84dfaf35..e64992aa500 100644 --- a/DNN Platform/Library/Services/FileSystem/FolderManager.cs +++ b/DNN Platform/Library/Services/FileSystem/FolderManager.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information - namespace DotNetNuke.Services.FileSystem { using System; @@ -18,7 +17,6 @@ namespace DotNetNuke.Services.FileSystem using System.Web; using DotNetNuke.Common; - using DotNetNuke.Common.Internal; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Data; @@ -33,9 +31,7 @@ namespace DotNetNuke.Services.FileSystem using Localization = DotNetNuke.Services.Localization.Localization; - /// - /// Exposes methods to manage folders. - /// + /// Exposes methods to manage folders. public class FolderManager : ComponentBase, IFolderManager { private const string DefaultUsersFoldersPath = "Users"; @@ -44,9 +40,7 @@ public class FolderManager : ComponentBase, IFold private static readonly Dictionary SyncFoldersData = new Dictionary(); private static readonly object ThreadLocker = new object(); - /// - /// Gets the localization key for MyfolderName. - /// + /// Gets the localization key for MyFolderName. public virtual string MyFolderName { get @@ -880,7 +874,7 @@ internal virtual bool IsValidFolderPath(string folderPath) /// The type of the log entry. internal virtual void AddLogEntry(IFolderInfo folder, EventLogController.EventLogType eventLogType) { - EventLogController.Instance.AddLog(folder, (PortalSettings)PortalController.Instance.GetCurrentSettings(), this.GetCurrentUserId(), string.Empty, eventLogType); + EventLogController.Instance.AddLog(folder, PortalController.Instance.GetCurrentSettings(), this.GetCurrentUserId(), string.Empty, eventLogType); } /// @@ -891,7 +885,7 @@ internal virtual void AddLogEntry(IFolderInfo folder, EventLogController.EventLo /// The type of log entry. internal virtual void AddLogEntry(string propertyName, string propertyValue, EventLogController.EventLogType eventLogType) { - EventLogController.Instance.AddLog(propertyName, propertyValue, (PortalSettings)PortalController.Instance.GetCurrentSettings(), this.GetCurrentUserId(), eventLogType); + EventLogController.Instance.AddLog(propertyName, propertyValue, PortalController.Instance.GetCurrentSettings(), this.GetCurrentUserId(), eventLogType); } /// This member is reserved for internal use and is not intended to be used directly from your code. From 60b71874595a284525c2972f3f3d5992668b0738 Mon Sep 17 00:00:00 2001 From: sergeydryomin Date: Wed, 15 Jul 2020 17:08:36 +0300 Subject: [PATCH 13/45] fixed typo --- .../ClientSide/Prompt.Web/src/utils/__mocks__/utilities.js | 2 +- .../admin/personaBar/Dnn.Pages/App_LocalResources/Pages.resx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/src/utils/__mocks__/utilities.js b/Dnn.AdminExperience/ClientSide/Prompt.Web/src/utils/__mocks__/utilities.js index 2b0e4573a4c..67633b9a5b0 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/src/utils/__mocks__/utilities.js +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/src/utils/__mocks__/utilities.js @@ -1,3 +1,3 @@ -const utilities = JSON.parse("{\"sf\":{\"moduleRoot\":\"personaBar\",\"controller\":\"\",\"antiForgeryToken\":\"28nJydTNQzIoLgyv6yOJxg5oFN36whjok-IN6NR4PLgMlkjBA1cuicNftJclJGcvhAxR7gPj7OIY5vLF0\"},\"onTouch\":false,\"persistent\":{},\"inAnimation\":false,\"ONE_THOUSAND\":1000,\"ONE_MILLION\":1000000,\"resx\":{\"Evoq\":{\"Browse\":\"Browse to Upload\",\"ContactSupport\":\"Contact Support\",\"CustomerPortal\":\"Customer Portal\",\"Documentation\":\"Documentation\",\"DragAndDropAreaTitle\":\"Drag and Drop a File or Select an Option\",\"DragAndDropDocument\":\"Drag and Drop Your Document Here\",\"DragAndDropDocuments\":\"Drag and Drop Your Document(s) Here\",\"DragAndDropImage\":\"Drag and Drop Your Image Here\",\"DragAndDropImages\":\"Drag and Drop Your Image(s) Here\",\"EnterUrl\":\"Enter Image URL\",\"ExampleUrl\":\"http://example.com/imagename.jpg\",\"FileIsTooLargeError\":\"File size bigger than {0}.\",\"Framework\":\".Net Framework\",\"FromUrl\":\"From URL\",\"InsertDocument\":\"Insert Document\",\"InsertDocuments\":\"Insert Document(s)\",\"InsertImage\":\"Insert Image\",\"InsertImages\":\"Insert Image(s)\",\"LicenseKey\":\"License Key\",\"Or\":\"OR\",\"RecentUploads\":\"Recent Uploads\",\"Search\":\"Search\",\"SelectAFolder\":\"Select A Folder\",\"ServerName\":\"Server Name\",\"StoredLocation\":\"Stored Location\",\"SupportMailAddress\":\"dnnsupport@dnnsoftware.com\",\"SupportMailBody\":\"\\r\\n\\r\\n----------\\r\\n{URL}\\r\\n{PRODUCTNAME}\\r\\n{VERSION}\",\"SupportMailSubject\":\"Support Request: We need assistance with our Evoq!\",\"Upload\":\"Upload\",\"UploadFile\":\"Upload File\"},\"PersonaBar\":{\"nav_Analytics\":\"Analytics\",\"nav_Dashboard\":\"Dashboard\",\"nav_Logout\":\"Logout\",\"nav_Settings\":\"Settings\",\"nav_Tasks\":\"Tasks\",\"nav_Edit\":\"Edit\",\"nav_Manage\":\"Manage\",\"nav_Content\":\"Content\",\"nav_Tools\":\"Tools\",\"nav_Accounts\":\"\",\"nav_DocCenter\":\"Doc Center\",\"nav_Help\":\"Help\",\"nav_Site\":\"View Site\",\"err_BetweenMinMax\":\"Value can only be between Min Value and Max Value\",\"err_Email\":\"Only valid email is allowed\",\"err_Minimum\":\"Text must be at least {0} chars\",\"err_MinLessThanMax\":\"The Min Value shall be less than Max Value\",\"err_NoLargerThanExp\":\"Reputation points cannot be larger than experience points\",\"err_NonDecimalNumber\":\"Decimal numbers are not allowed\",\"err_NonNegativeNumber\":\"Negative numbers are not allowed\",\"err_NoUserFolder\":\"{0} does not own any assets.\",\"err_Number\":\"Only numbers are allowed\",\"err_OneActionNeeded\":\"At least one action is needed\",\"err_PositiveNumber\":\"Only positive numbers are allowed\",\"err_Required\":\"Text is required\",\"err_RoleAssignedToUser\":\"This role is already assigned to this user.\",\"nav_Home\":\"Home\",\"permissiongrid.Actions\":\"Actions\",\"permissiongrid.Add Content\":\"Add Content\",\"permissiongrid.Add User\":\"Add User\",\"permissiongrid.Add\":\"Add\",\"permissiongrid.AllRoles\":\"\",\"permissiongrid.Copy\":\"Copy\",\"permissiongrid.Delete\":\"Delete\",\"permissiongrid.Display Name\":\"Display Name:\",\"permissiongrid.Edit Content\":\"Edit Content\",\"permissiongrid.Edit Tab\":\"Full Control\",\"permissiongrid.Edit\":\"Full Control\",\"permissiongrid.Export\":\"Export\",\"permissiongrid.Filter By Group\":\"Filter By Group\",\"permissiongrid.GlobalRoles\":\"\",\"permissiongrid.Import\":\"Import\",\"permissiongrid.Manage Settings\":\"Manage Settings\",\"permissiongrid.Navigate\":\"Navigate\",\"permissiongrid.Select Role\":\"Select Role\",\"permissiongrid.Type-roles\":\"Roles\",\"permissiongrid.Type-users\":\"Users\",\"permissiongrid.View Tab\":\"View\",\"permissiongrid.View\":\"View\",\"nav_SiteAssets\":\"Site Assets\",\"nav_GlobalAssets\":\"Global Assets\",\"title_Tasks\":\"Tasks\",\"txt_ViewIndex\":\"Viewing {0} of {1}\",\"btn_LoadMore\":\"Load More\",\"Documentation\":\"Documentation\",\"Framework\":\".Net Framework\",\"LicenseKey\":\"License Key\",\"ServerName\":\"Server Name\",\"UpgradeLicense\":\"[ Upgrade to Evoq ]\",\"btn_CloseDialog\":\"OK\",\"CriticalUpdate\":\"[ Critical Update ]\",\"NormalUpdate\":\"[ New Update ]\",\"LockEditMode.Help\":\"When locked, the icon will appear blue, and you will remain in Edit Mode even when navigating to other pages.\",\"LockEditMode\":\"Click to lock Edit Mode.\",\"UnlockEditMode.Help\":\"When unlocked, you will exit Edit Mode whenever you navigate to other page or complete your changes.\",\"UnlockEditMode\":\"Click to unlock Edit Mode.\"},\"SharedResources\":{\"ErrMissPermissions\":\"You don't have permission to upload file.\",\"ErrUploadFile\":\"Error: File couldn't be uploaded.\",\"ErrUploadStream\":\"Sorry, the image could not be saved.\",\"Root\":\"Home\",\"JustNow\":\"moments ago\",\"Day\":\"day\",\"DayAgo\":\"{0} day ago\",\"Days\":\"days\",\"DaysAgo\":\"{0} days ago\",\"Hour\":\"hour\",\"HourAgo\":\"{0} hour ago\",\"Hours\":\"hours\",\"HoursAgo\":\"{0} hours ago\",\"Minute\":\"minute\",\"MinuteAgo\":\"{0} minute ago\",\"Minutes\":\"minutes\",\"MinutesAgo\":\"{0} minutes ago\",\"Month\":\"month\",\"MonthAgo\":\"{0} month ago\",\"Months\":\"months\",\"MonthsAgo\":\"{0} months ago\",\"LongTimeAgo\":\"long time ago\",\"Never\":\"Never\",\"Second\":\"second\",\"SecondAgo\":\"{0} second ago\",\"Seconds\":\"seconds\",\"SecondsAgo\":\"{0} seconds ago\",\"WeekAgo\":\"{0} week ago\",\"WeeksAgo\":\"{0} weeks ago\",\"Year\":\"year\",\"YearAgo\":\"{0} year ago\",\"Years\":\"years\",\"YearsAgo\":\"{0} years ago\",\"UserHasNoPermissionToReadFile.Error\":\"The user has no permission to read this file\",\"UserHasNoPermissionToReadFolder.Error\":\"The user has no permission to read this folder\",\"Anonymous\":\"Anonymous\",\"RegisterationFailed\":\"{0}\",\"RegistrationUsernameAlreadyPresent\":\"The username is already in use.\",\"FolderDoesNotExist.Error\":\"The folder does not exist\",\"VisibleOnPage.Header\":\"Visible on Page\",\"btnCancel\":\"Cancel\",\"btnSave\":\"Save\",\"UnauthorizedRequest\":\"Authorization has been denied for this request.\",\"GenericErrorMessage.Error\":\"An unknown error has occured. Please check the admin logs for more information.\",\"All\":\"All\",\"AllSites\":\"All Sites\",\"Prompt_FlagIsRequired\":\"'[0]' is required.\\\\n\",\"Prompt_InvalidType\":\"The value entered for '[0]' is not valid '[1]'.\\\\n\",\"Promp_MainFlagIsRequired\":\"The '[0]' is required. Please use the --[1] flag or pass it as the first argument after the command name.\\\\n\",\"Promp_PositiveValueRequired\":\"'[0]' must be greater than 0.\\\\n\"},\"Tabs\":{\"lblAdminOnly\":\"Visible to Administrators only\",\"lblEveryone\":\"Page is visible to everyone\",\"lblHome\":\"Homepage of the site\",\"lblRegistered\":\"Visible to registered users\",\"lblSecure\":\"Visible to dedicated roles only\"},\"AdminLogs\":{\"plPortalID\":\"Website\",\"plPortalID.Help\":\"Select the site you want to view.\",\"plLogType\":\"Type\",\"plLogType.Help\":\"Filter the events displayed in the log.\",\"plShowRecords\":\"Show Records\",\"plShowRecords.Help\":\"Select the records you want to view.\",\"ColorCoding\":\"Color Coding on\",\"Settings\":\"Logging Settings\",\"Legend\":\"Color Coding Legend\",\"Date\":\"Date\",\"Type\":\"Log Type\",\"Username\":\"Username\",\"Portal\":\"Website\",\"Summary\":\"Summary\",\"btnDelete\":\"Delete Selected\",\"btnClear\":\"Clear Log\",\"SendExceptions\":\"Send Log Entries\",\"ExceptionsWarning\":\"Please note: By using these features \\r\\n below, you may be sending sensitive data over the Internet in clear \\r\\n text (not encrypted). Before sending this exception, \\r\\n please review the contents of your log entry to verify that no \\r\\n sensitive data is contained within it. Only the log entries checked above \\r\\n will be sent.\",\"SendExceptionsEmail\":\"Send Log Entries via Email\",\"plEmailAddress\":\"Email Address\",\"plEmailAddress.Help\":\"Please enter the email address of the person you want to receive the log entries. Multipe email addresses should be separated by comma or semicolon.\",\"SendMessage\":\"Message (optional)\",\"SendMessage.Help\":\"Include an optional message with the log entries.\",\"btnEmail\":\"Email Selected\",\"AddContent.Action\":\"Add Log Setting\",\"NoEntries\":\"There are no log items.\",\"Showing\":\"Showing {0} to {1} of {2}\",\"DeleteSuccess\":\"The selected log entries were successfully deleted.\",\"EmailSuccess\":\"Your email has been sent.\",\"EmailFailure\":\"Your email has not been sent.\",\"ServiceUnavailable\":\"The web service at DotNetNuke.com is currently unavailable.\",\"ServerName\":\"Server Name: \",\"LogCleared\":\"The log has been cleared.\",\"ClickRow\":\"Click on a row for details.\",\"ExceptionCode\":\"Exception\",\"ItemCreatedCode\":\"Item Created\",\"ItemUpdatedCode\":\"Item Updated\",\"ItemDeletedCode\":\"Item Deleted\",\"SuccessCode\":\"Operation Success\",\"FailureCode\":\"Operation Failure\",\"AdminOpCode\":\"General Admin Operation\",\"AdminAlertCode\":\"Admin Alert\",\"HostAlertCode\":\"Host Alert\",\"ToEmail\":\"To Specified Email Address\",\"ControlTitle_\":\"Event Viewer\",\"ModuleHelp\":\"

About Log Viewer

Allows you to edit website events to log.

\",\"SecurityException\":\"Security Exception\",\"plSubject.Help\":\"Enter the subject for the email.\",\"plSubject\":\"Subject\",\"InavlidEmailAddress\":\"'{0}' is not a valid email address.\",\"Viewer\":\"Viewer\",\"ClearLog\":\"Are you sure you want to clear all log entries?\",\"SelectException\":\"Please select at least one log entry.\",\"LogEntryDefaultMsg\":\"Attached are my error log entries.\",\"LogEntryDefaultSubject\":\"Error Logs\",\"LogType.Header\":\"Log Type\",\"Portal.Header\":\"Website\",\"Active.Header\":\"Active\",\"FileName.Header\":\"File Name\",\"Edit.EditText\":\"Edit\",\"plIsActive\":\"Logging\",\"plIsActive.Help\":\"Check this box to enable logging.\",\"plLogTypeKey\":\"Log Type\",\"plLogTypeKey.Help\":\"The type of event being logged.\",\"plLogTypePortalID\":\"Website\",\"plLogTypePortalID.Help\":\"The site which this log event is associated with.\",\"plKeepMostRecent\":\"Keep Most Recent\",\"plFileName\":\"FileName\",\"plFileName.Help\":\"The file name of the log file.\",\"plEmailNotificationStatus\":\"Email Notification\",\"plEmailNotificationStatus.Help\":\"Check this box to send an email message when this event occurs.\",\"plThreshold\":\"Occurrence Threshold\",\"plMailFromAddress\":\"Mail From Address\",\"plMailFromAddress.Help\":\"The email address that the notification will be sent from.\",\"plMailToAddress\":\"Mail To Address\",\"plMailToAddress.Help\":\"The email address to send the notification to\",\"EmailSettings\":\"Email Notification Settings\",\"ConfigDeleted\":\"The log setting has been deleted.\",\"ConfigUpdated\":\"The log setting has been updated.\",\"ConfigAdded\":\"The log setting has been added.\",\"LogEntry\":\" Log Entry\",\"LogEntries\":\" Log Entries\",\"Occurence\":\" Occurence\",\"Occurences\":\" Occurences\",\"In\":\"in\",\"ControlTitle_edit\":\"Edit Log Settings\",\"DeleteError\":\"The selected log setting could not be deleted. You should delete all existing log entries for this log type first.\",\"TimeType_1\":\"Seconds\",\"TimeType_2\":\"Minutes\",\"TimeType_3\":\"Hours\",\"TimeType_4\":\"Days\",\"nav_AdminLogs\":\"Admin Logs\",\"AdminLogs.Header\":\"Admin Logs\",\"ConfigAddError\":\"The log setting could not be added. Please try again later.\",\"ConfigBtnCancel\":\"Cancel\",\"ConfigBtnDelete\":\"Delete\",\"ConfigBtnSave\":\"Save\",\"ConfigDeleteCancelled\":\"Cancelled deletion.\",\"ConfigDeletedWarning\":\"Are you sure you want to delete selected log setting?\",\"ConfigDeleteInconsistency\":\"Inconsistency error occurred. Please refresh the page and try again.\",\"ConfigUpdateError\":\"The log setting could not be updated. Please try again later.\",\"False\":\"False\",\"LogSettings.Header\":\"Log Settings\",\"no\":\"No\",\"True\":\"True\",\"yes\":\"Yes\",\"btnCancel\":\"Cancel\",\"btnSend\":\"Send\",\"EntriesPerPage\":\" entries per page\",\"LogDeleteWarning\":\"Are you sure you want to delete selected logs?\",\"ShowingOne\":\"Showing 1 entry\",\"ShowingTotal\":\"Showing {0} entries\",\"MailToAddress.Message\":\"Valid mail to address is required.\",\"Email.Message\":\"Valid email is required.\",\"UnAuthorizedToSendLog\":\"You are not authorized to send these log entries.\",\"AllTypes\":\"All Types\"},\"ConfigConsole\":{\"cmdExecute\":\"Execute Merge\",\"cmdUpload\":\"Upload XML Merge Script\",\"ERROR_Merge\":\"The system encountered an error applying the specified configuration changes. Please review the event log for error details.\",\"plScriptNote\":\"*NOTE:\",\"plScriptNoteDesc\":\"once uploaded, you may edit the script in the field below before executing\",\"plScript\":\"Merge Script\",\"cmdLoad\":\"Load\",\"Configuration\":\"Files\",\"Merge\":\"Merge Scripts\",\"plConfigHelp\":\"- Select a config file to edit -\",\"plConfig\":\"Configuration File\",\"SaveWarning\":\"Changing the web.config will cause your website to reload and may decrease site performance while the application is reloaded by the webserver. Do you want to continue?\",\"ERROR_ConfigurationFormat\":\"Your configuration file is not a valid XML file. Please correct the formatting issue and try again. {0}\",\"LoadConfigWarning\":\"Warning: You will lose your current changes if you load a new config file.\",\"MergeConfirm\":\"Are you sure you want to merge these changes to this config file?\",\"SaveConfirm\":\"Are you sure you want to save changes this config file?\",\"SelectConfig\":\"Select a config file...\",\"Success\":\"The changes were successfully made.\",\"cmdSave\":\"Save Changes\",\"fileLabel.Help\":\"You can modify the file before making changes.\",\"fileLabel\":\"File:\",\"scriptLabel.Help\":\"You can edit the merge script before executing it.\",\"scriptLabel\":\"Script:\",\"ControlTitle_\":\"Configuration Manager\",\"nav_ConfigConsole\":\"Config Manager\",\"ConfigConsole\":\"Configuration Manager\",\"SaveButton\":\"Yes\",\"CancelButton\":\"No\",\"ConfigFilesTab\":\"Config Files\",\"MergeScriptsTab\":\"Merge Scripts\"},\"Connectors\":{\"btn_Cancel\":\"Cancel\",\"btn_Checking\":\"Checking ...\",\"btn_Connect\":\"Connect\",\"btn_Edit\":\"Edit\",\"btn_Save\":\"Save\",\"nav_Connectors\":\"Connectors\",\"Save\":\"Save\",\"title_Connections\":\"Configure Connections\",\"txt_Saved\":\"Item successfully saved.\",\"txt_Deleted\":\"Item successfully deleted.\",\"txt_AddNew\":\"Add New\",\"txt_clickToEdit\":\"Click to edit connector name\",\"txt_SetupConnections\":\"Setup your connections to easily share content and more\",\"txt_DisplayNameIsNotValid\":\"A name can only contain letters and numbers.\",\"txt_DisplayNameIsNotUnique\":\"A name must be unique.\",\"ErrConnectorNotFound\":\"Connector not found.\"},\"CssEditor\":{\"StylesheetEditor\":\"Custom CSS\",\"SaveStyleSheet\":\"Save Style Sheet\",\"RestoreDefault\":\"Restore Default\",\"nav_CssEditor\":\"Custom CSS\",\"ConfirmRestore\":\"Are you sure you want to restore the default stylesheet? All changes to the current stylesheet will be lost.\",\"RestoreButton\":\"Yes\",\"CancelButton\":\"No\",\"StyleSheetSaved\":\"Style sheet successfully saved.\",\"StyleSheetRestored\":\"Style sheet successfully restored.\"},\"Extensions\":{\"nav_Extensions\":\"Extensions\",\"ControlTitle_\":\"Extensions\",\"CreateExtension.Action\":\"Create New Extension\",\"Delete\":\"Uninstall this Extension\",\"ExtensionInstall.Action\":\"Install Extension\",\"Language.Header\":\"Language\",\"Name.Header\":\"Name\",\"plPackageTypes.Help\":\"Select a single type of extension to be displayed.\",\"plPackageTypes\":\"Filter by Type:\",\"Title\":\"List of {0} Extensions Installed\",\"TreeHeader\":\"Installed Extensions\",\"Type.Header\":\"Type\",\"Upgrade.Header\":\"Upgrade?\",\"Version.Header\":\"Version\",\"Description.Header\":\"Description\",\"ImportModule.Action\":\"Import Module Definition\",\"CreateLanguagePack.Action\":\"Create New Language\",\"CreateModule.Action\":\"Create New Module\",\"LanguagePackInstall.Action\":\"Install Language Pack\",\"ModuleInstall.Action\":\"Install Module\",\"CreateSkin.Action\":\"Create New Theme\",\"EditSkins.Action\":\"Manage Themes\",\"SkinInstall.Action\":\"Install New Theme\",\"plLocales\":\"Find Available Language Packs:\",\"plLocales.Help\":\"Choose a language to display a list of the extensions that have a language pack available in the selected language. If a language pack exists, follow the link to download and install the language pack.\",\"CreateContainer.Action\":\"Create New Container\",\"InstallExtensions.Action\":\"Install Available Extensions\",\"AppTitle\":\"\",\"AppType\":\"\",\"AppDescription\":\"\",\"UpgradeMessage\":\"Click Here To Get The Upgrade\",\"LanguageMessage\":\"Click Here To Get The Language Pack\",\"Portal.Header\":\"Website\",\"lblUpdate\":\"This application contains an Update Service which displays an icon when a new version of an Extension is available. The icon displayed will contain a visual indication if a currently installed Extension contains a potential security vulnerability. If a security vulnerability is identified, it is highly recommended that you upgrade to the newer version of the Extension. Clicking the icon will redirect you to a location where you will be able to acquire the Extension for immediate installation.\",\"CheckLanguage\":\"Use Update Service to check for updated Language Packs for Extensions\",\"Language\":\"Edit Language Files\",\"Extensions\":\"Extensions\",\"NoResults\":\"No Extensions were found\",\"Edit\":\"Edit this Extension\",\"InstalledOnHost.Tooltip\":\"Installed on Host\",\"InstalledOnPortal.Tooltip\":\"Installed on {0}\",\"Auth_System.Type\":\"Authentication Systems\",\"Container.Type\":\"Containers\",\"CoreLanguagePack.Type\":\"Core Language Packs\",\"DashboardControl.Type\":\"Dashboard Controls\",\"ExtensionLanguagePack.Type\":\"Extension Language Packs\",\"Library.Type\":\"Libraries\",\"Module.Type\":\"Modules\",\"MoreExtensions\":\"More Extensions\",\"PersonaBar.Type\":\"Persona Bar\",\"Provider.Type\":\"Providers\",\"Skin.Type\":\"Themes\",\"SkinObject.Type\":\"Skin Objects\",\"Widget.Type\":\"Widgets\",\"InstalledExtensions\":\"Installed Extensions\",\"AvailableExtensions\":\"Available Extensions\",\"ExpandAll\":\"Expand All\",\"AuthSystem.Type\":\"Authentication Systems\",\"Language.Type\":\"Language Packs\",\"Catalog\":\"Extension Feed\",\"CatalogModule\":\"Module\",\"CatalogSearchTitle\":\"Search for Extensions\",\"CatalogSkin\":\"Theme\",\"SearchLabel.Help\":\"Hit Enter to search or Esc to clear and cancel.\",\"SearchLabel\":\"Search:\",\"TypeLabel.Help\":\"Select the type of extension.\",\"TypeLabel\":\"Type:\",\"ClearSearch\":\"Clear Search\",\"NameAZ\":\"Name: A-Z\",\"NameZA\":\"Name: Z-A\",\"PriceHighLow\":\"Price: High - Low\",\"PriceLowHigh\":\"Price: Low - High\",\"Search\":\"Search\",\"By\":\"By\",\"TagCloud\":\"Tag Cloud\",\"NotSpecified\":\"Not Specified\",\"MoreInformation\":\"More Information\",\"DetailsLabel\":\"Details\",\"LicenseLabel\":\"License\",\"TagLabel\":\"Tag:\",\"VendorLabel\":\"Vendor:\",\"ExtensionsLabel\":\"Extensions\",\"NoneLabel\":\"None\",\"ErrorLabel\":\"Error...\",\"LoadingLabel\":\"Loading\",\"OrderLabel\":\"Order:\",\"InUse.Header\":\"In Use\",\"PurchasedExtensions\":\"Purchased Extensions\",\"installExtension\":\"Install\",\"Version\":\"Minimum Version Required:\",\"DescriptionLabel\":\"Product Description\",\"ExtensionDetail\":\"More detail\",\"License\":\"License:\",\"ListExtensions\":\"Learn more about how to offer your extensions here.\",\"JavaScript_Library.Type\":\"JavaScript Libraries\",\"Connector.Type\":\"Connectors\",\"CollapseAll\":\"Collapse All\",\"EditExtension_OwnerDetails.Label\":\"Owner Details\",\"EditExtension_PackageDescription.HelpText\":\"A description of the package.\",\"EditExtension_PackageEmailAddress.HelpText\":\"The email address of the package's author.\",\"EditExtension_PackageFriendlyName.HelpText\":\"The friendly name of the package.\",\"EditExtension_PackageIconFile.HelpText\":\"The icon filename for this package.\",\"EditExtension_PackageLicense.HelpText\":\"The license for this package.\",\"EditExtension_PackageName.HelpText\":\"The package name (e.g. CompanyName.Name).\",\"EditExtension_PackageOrganization.HelpText\":\"The organization responsible for the package.\",\"EditExtension_PackageOwner.HelpText\":\"The owner of the package.\",\"EditExtension_PackageReleaseNotes.HelpText\":\"The release notes for this version.\",\"EditExtension_PackageType.HelpText\":\"The type of package.\",\"EditExtension_PackageURL.HelpText\":\"The author's URL.\",\"EditExtension_PackageVersion.HelpText\":\"The version of the package.\",\"Showing.Label\":\"Showing:\",\"EditAuthSystem_Enabled.Label\":\"Enabled?\",\"EditAuthSystem_Enabled.Tooltip\":\"Check to enable this Authentication System.\",\"EditAuthSystem_LoginCtrlSource.Label\":\"Login Control Source\",\"EditAuthSystem_LoginCtrlSource.Tooltip\":\"The source of the Login Control for this Authentication System\",\"EditAuthSystem_LogoffCtrlSource.Label\":\"Logoff Control Source\",\"EditAuthSystem_LogoffCtrlSource.Tooltip\":\"The source of the Logoff Control for this Authentication System\",\"EditAuthSystem_SettingsCtrlSource.Label\":\"Settings Control Source\",\"EditAuthSystem_SettingsCtrlSource.Tooltip\":\"Check to enable this Authentication System.\",\"EditAuthSystem_Type.Label\":\"Authentication Type\",\"EditAuthSystem_Type.Tooltip\":\"The type of Authentication System (eg LiveID, OpenID etc)\",\"EditExtension_PackageDescription.Label\":\"Description\",\"EditExtension_PackageEmailAddress.Label\":\"Email Address\",\"EditExtension_PackageFriendlyName.Label\":\"Friendly Name\",\"EditExtension_PackageIconFile.Label\":\"Icon\",\"EditExtension_PackageName.Label\":\"Name\",\"EditExtension_PackageOrganization.Label\":\"Organization\",\"EditExtension_PackageOwner.Label\":\"Owner\",\"EditExtension_PackageURL.Label\":\"URL\",\"EditExtension_PackageVersion.Label\":\"Version\",\"InstallExtension_Cancel.Button\":\"Cancel\",\"InstallExtension_FileUploadDefault\":\"Drag and Drop a File or Click Icon To Browse\",\"InstallExtension_FileUploadDragOver\":\"Drag and Drop a File\",\"InstallExtension_Or\":\"or\",\"InstallExtension_PackageExists.Error\":\"The package is already installed.\",\"InstallExtension_PackageExists.HelpText\":\"If you have reached this page it is because the installer needs to gather some more information before proceeding.\",\"InstallExtension_PackageExists.Warning\":\"Warning: You have selected to repair the installation of this package.
This will cause the files in the package to overwrite all files that were previously installed.\",\"InstallExtension_RepairInstall.Button\":\"Repair Install\",\"InstallExtension_Upload.Button\":\"Next\",\"InstallExtension_UploadAFile\":\"Upload a File\",\"InstallExtension_UploadComplete\":\"Upload Complete\",\"InstallExtension_UploadFailed\":\"Zip File Upload Failed with \",\"InstallExtension_Uploading\":\"Uploading\",\"InstallExtension_UploadPackage.Header\":\"Upload Extension Package\",\"InstallExtension_UploadPackage.HelpText\":\"To begin installation, upload the package by dragging the file into the field below.\",\"NewModule_AddFolder.Button\":\"Add Folder\",\"NewModule_AddTestPage.HelpText\":\"Check this box to create a test page for your new module.\",\"NewModule_AddTestPage.Label\":\"Add a Test Page:\",\"NewModule_Cancel.Button\":\"Cancel\",\"NewModule_Create.Button\":\"Create\",\"NewModule_CreateFrom.HelpText\":\"You can create a new module in three ways. Select which method to use. New - creates a new module control, Control - creates a module from an existing control, Manifest - creates a module from an existing manifest.\",\"NewModule_CreateFrom.Label\":\"Create New Module From:\",\"NewModule_Description.HelpText\":\"You can provide a description for your module.\",\"NewModule_Description.Label\":\"Description\",\"NewModule_FileName.HelpText\":\"Enter a name for the new module control\",\"NewModule_FileName.Label\":\"File Name\",\"NewModule_Language.HelpText\":\"Choose the language to use.\",\"NewModule_Language.Label\":\"Language\",\"NewModule_ModuleFolder.HelpText\":\"This is the folder where your module files and folders are populated.\",\"NewModule_ModuleFolder.Label\":\"Module Folder\",\"NewModule_ModuleName.HelpText\":\"Enter a Friendly Name for your module.\",\"NewModule_ModuleName.Label\":\"Module Name\",\"NewModule_NoneSpecified\":\"\",\"NewModule_OwnerFolder.HelpText\":\"Module Developers are encouraged to use a \\\"unique\\\" folder inside DesktopModules for all the development, to avoid potential clashes with other developers. Select the folder you would like to use for your Module Development. Note: Folders with user controls (.ascx files) and the core admin folder are excluded from this list.\",\"NewModule_OwnerFolder.Label\":\"Owner Folder\",\"AddModuleControl_Cancel.Button\":\"Cancel\",\"AddModuleControl_Definition.HelpText\":\"This is the Name of the Module Definition\",\"AddModuleControl_Definition.Label\":\"Definition\",\"AddModuleControl_HelpURL.HelpText\":\"You can provide a Help URL for this control. This will appear on the Actions menu.\",\"AddModuleControl_HelpURL.Label\":\"Help URL\",\"AddModuleControl_Icon.HelpText\":\"Choose an Icon for this control. This will displayed in the Module Header if supported by the theme.\",\"AddModuleControl_Icon.Label\":\"Icon\",\"AddModuleControl_Key.HelpText\":\"Enter a unique name to identify this control within the Module\",\"AddModuleControl_Key.Label\":\"Key\",\"AddModuleControl_Module.HelpText\":\"This is the Friendly Name of the Module.\",\"AddModuleControl_Module.Label\":\"Module\",\"AddModuleControl_Source.HelpText\":\"Select the source file or enter the typename for this control.\",\"AddModuleControl_Source.Label\":\"Source File\",\"AddModuleControl_SourceFolder.HelpText\":\"Select the source folder for the control.\",\"AddModuleControl_SourceFolder.Label\":\"Source Folder\",\"AddModuleControl_SupportsPartialRendering.HelpText\":\"This flag indicates whether the module control supports AJAX partial rendering.\",\"AddModuleControl_SupportsPartialRendering.Label\":\"Supports Partial Rendering?\",\"AddModuleControl_SupportsPopups.HelpText\":\"This flag indicates whether the module control supports modal popups.\",\"AddModuleControl_SupportsPopups.Label\":\"Supports Popups?\",\"AddModuleControl_Title.HelpText\":\"Enter a title for this control. This will be displayed in the Module Header if supported in the theme.\",\"AddModuleControl_Title.Label\":\"Title\",\"AddModuleControl_Type.HelpText\":\"Choose the type of the control from the list.\",\"AddModuleControl_Type.Label\":\"Type\",\"AddModuleControl_Update.Button\":\"Update\",\"AddModuleControl_ViewOrder.HelpText\":\"Enter the view order for the control in the list of controls for this definition.\",\"AddModuleControl_ViewOrder.Label\":\"View Order\",\"EditModule_Assigned.Label\":\"Assigned\",\"EditModule_AssignedPremiumModules.Label\":\"Assigned Premium Modules\",\"EditModule_BusinessControllerClass.HelpText\":\"The fully qualified namespace of the class that implements the Modules Features (IPortable, ISearchable etc)\",\"EditModule_BusinessControllerClass.Label\":\"Business Controller Class\",\"EditModule_Dependencies.HelpText\":\"You can list any dependencies that the module has here.\",\"EditModule_Dependencies.Label\":\"Dependencies\",\"EditModule_FolderName.HelpText\":\"Specify the folder name for this module\",\"EditModule_FolderName.Label\":\"Folder Name\",\"EditModule_IsPortable.HelpText\":\"Identifies if the module supports the IPortable interface allowing it to Export and Import content.\",\"EditModule_IsPortable.Label\":\"Is Portable?\",\"EditModule_IsPremiumModule.HelpText\":\"All Modules can be assigned/unassigned from a website. However, on website Creation Premium Modules are not auto-assigned to a new website.\",\"EditModule_IsPremiumModule.Label\":\"Is Premium Module?\",\"EditModule_IsSearchable.HelpText\":\"Identifies if the module supports the ISearchable or ModuleSearchBase interface allowing it to have its content indexed.\",\"EditModule_IsSearchable.Label\":\"Is Searchable?\",\"EditModule_IsUpgradable.HelpText\":\"Identifies if the module supports the IUpgradable interface allowing it to run custom code when upgraded.\",\"EditModule_IsUpgradable.Label\":\"Is Upgradable?\",\"EditModule_ModuleCategory.HelpText\":\"Select the Module Category for this module\",\"EditModule_ModuleCategory.Label\":\"Module Category\",\"EditModule_ModuleDefinitions.Header\":\"Module Definitions\",\"EditModule_ModuleName.HelpText\":\"The name of the Module\",\"EditModule_ModuleName.Label\":\"Module Name\",\"EditModule_ModuleSharing.HelpText\":\"Identifies whether the module supports sharing itself across multiple sites.\",\"EditModule_ModuleSharing.Label\":\"Module Sharing\",\"EditModule_Permissions.HelpText\":\"You can list any Code Access Security Permissions your module requires here.\",\"EditModule_Permissions.Label\":\"Permissions\",\"EditModule_PremiumModuleAssignment.Header\":\"Premium Module Assignment\",\"EditModule_Unassigned.Label\":\"Unassigned\",\"ModuleDefinitions_AddControl.Button\":\"Add Control\",\"ModuleDefinitions_AddDefinition.Button\":\"Add Definition\",\"ModuleDefinitions_DefaultCacheTime.HelpText\":\"This is the default Cache Time to be used for this Module Definition. A default cache time of \\\"-1\\\" indicates that the module does not support output caching.\",\"ModuleDefinitions_DefaultCacheTime.Label\":\"DefaultCacheTime\",\"ModuleDefinitions_DefinitionName.HelpText\":\"An unchanging name for the Module Definition\",\"ModuleDefinitions_DefinitionName.Label\":\"Definition Name\",\"ModuleDefinitions_FriendlyName.HelpText\":\"Enter a friendly name for the Module Definition.\",\"ModuleDefinitions_FriendlyName.Label\":\"Friendly Name\",\"ModuleDefinitions_ModuleControls.Header\":\"Module Controls\",\"ModuleDefinitions_Source.Label\":\"Source\",\"ModuleDefinitions_Title.Label\":\"Title\",\"NewModule_Resource.HelpText\":\"Select the resource to use to create your module.\",\"NewModule_Resource.Label\":\"Resource\",\"CreatePackage_Header.Header\":\"Create Package\",\"CreatePackage_PackageManifest.Header\":\"Package Manifest\",\"CreatePackage_PackageManifest.HelpText\":\"This Wizard will create a manifest for your extension. If you have already created a manifest (either by running this wizard or by manually creating a manifest file) you can select to use that manifest by checking \\\"Use Existing Manifest\\\" box and choosing the manifest that the system has found for this extension from the drop-down list of manifests.\",\"CreatePackage_UseExistingManifest.Label\":\"Using Existing Manifest:\",\"EditExtension_CreatePackage.Button\":\"Create Package\",\"EditModule_Add.Button\":\"Add\",\"ModuleDefinitions_Cancel.Button\":\"Cancel\",\"ModuleDefinitions_Save.Button\":\"Save\",\"CreatePackage_ArchiveFileName.Label\":\"Archive File Name\",\"CreatePackage_ChooseAssemblies.HelpText\":\"At this step you can add the assemblies to include in your package. If there is a project file in the Package folder, the Wizard has attempted to determine the assemblies to include, but you can add or delete assemblies from the list.\",\"CreatePackage_ChooseAssemblies.Label\":\"Choose Assemblies to Include\",\"CreatePackage_ChooseFiles.HelpText\":\"At this step you can choose the files to include in your package. The Wizard has attempted to determine the files to include, but you can add or delete files from the list. In addition, you can optionally choose to include the source files by checking the \\\"Include Source\\\" box.\",\"CreatePackage_ChooseFiles.Label\":\"Choose Files to Include\",\"CreatePackage_CreateManifest.HelpText\":\"Based on your selections the Wizard has created the manifest for the package. The manifest is displayed in the text box below. You can edit the manifest, before creating the package.\",\"CreatePackage_CreateManifest.Label\":\"Create Manifest\",\"CreatePackage_CreateManifestFile.Label\":\"Create Manifest File:\",\"CreatePackage_CreatePackage.Label\":\"Create Package\",\"CreatePackage_FinalStep.HelpText\":\"The final step is to create the package. To create a copy of the Manifest file check the \\\"Create Manifest File\\\" checkbox - the file will be created in the Package's folder. Regardless of the setting you use here, the manifest will be saved in the database and it will be added to the package.\",\"CreatePackage_FinalStep.HelpTextTwo\":\"Check the \\\"Create Package\\\" checkbox to create a package. The package will be created in the relevant Install folder (eg Install/Modules for modules, Install/Themes for Themes, etc.).\",\"CreatePackage_Folder.Label\":\"Folder:\",\"CreatePackage_Logs.HelpText\":\"The results of the package creation are shown below.\",\"CreatePackage_Logs.Label\":\"Create Package Results\",\"CreatePackage_ManifestFile.Label\":\"Manifest File:\",\"CreatePackage_ManifestFileName.Label\":\"Manifest File Name\",\"CreatePackage_RefreshFileList.Button\":\"Refresh File List\",\"CreatePackage_ReviewManifest.Label\":\"Review Manifest:\",\"EditExtension_ExtensionSettings.TabHeader\":\"Extension Settings\",\"EditExtension_License.TabHeader\":\"License\",\"EditExtension_PackageInformation.TabHeader\":\"Package Information\",\"EditExtension_ReleaseNotes.TabHeader\":\"Release Notes\",\"EditExtension_SiteSettings.TabHeader\":\"Site Settings\",\"EditContainer_ThemePackageName.HelpText\":\"Enter a name for the Theme Package\",\"EditContainer_ThemePackageName.Label\":\"Theme Package Name\",\"EditExtensionLanguagePack_Language.HelpText\":\"Choose the Language for this Language Pack\",\"EditExtensionLanguagePack_Language.Label\":\"Language\",\"EditExtensionLanguagePack_Package.HelpText\":\"Chose the Package this Language Pack is for.\",\"EditExtensionLanguagePack_Package.Label\":\"Package\",\"EditJavascriptLibrary_CustomCDN.HelpText\":\"The URL to a custom CDN location for this library which will be used instead of the default CDN\",\"EditJavascriptLibrary_CustomCDN.Label\":\"Custom CDN\",\"EditJavascriptLibrary_DefaultCDN.HelpText\":\"The URL to the default CDN to use for the library. This can be overridden by providing a custom URL.\",\"EditJavascriptLibrary_DefaultCDN.Label\":\"Default CDN\",\"EditJavascriptLibrary_DependsOn.HelpText\":\"Displays a list of all the packages that this package depends on.\",\"EditJavascriptLibrary_DependsOn.Label\":\"Depends On\",\"EditJavascriptLibrary_FileName.HelpText\":\"The filename of the JavaScript file.\",\"EditJavascriptLibrary_FileName.Label\":\"File Name\",\"EditJavascriptLibrary_LibraryName.HelpText\":\"The name of the JavaScript Library (e.g. \\\"jQuery\\\")\",\"EditJavascriptLibrary_LibraryName.Label\":\"Library Name\",\"EditJavascriptLibrary_LibraryVersion.HelpText\":\"The version of the JavaScript Library.\",\"EditJavascriptLibrary_LibraryVersion.Label\":\"Library Version\",\"EditJavascriptLibrary_ObjectName.HelpText\":\"The name of the JavaScript object to use to access the libraries methods.\",\"EditJavascriptLibrary_ObjectName.Label\":\"Object Name\",\"EditJavascriptLibrary_PreferredLocation.HelpText\":\"The preferred location to render the script. There are three possibilities: in the page head, at the top of the page body, or at the bottom of the page body.\",\"EditJavascriptLibrary_PreferredLocation.Label\":\"Preferred Location\",\"EditJavascriptLibrary_UsedBy.HelpText\":\"Displays a list of all the packages that use this package.\",\"EditJavascriptLibrary_UsedBy.Label\":\"Used By\",\"EditSkinObject_ControlKey.HelpText\":\"Enter a key for the Skin Object. The key must be unique.\",\"EditSkinObject_ControlKey.Label\":\"Control Key\",\"EditSkinObject_ControlSrc.HelpText\":\"Enter the Source for this Control. If the control is a User Control, enter the source relative to the website root.\",\"EditSkinObject_ControlSrc.Label\":\"Control SRC\",\"EditSkinObject_SupportsPartialRender.HelpText\":\"Check this box to indicate that this control supports AJAX Partial Rendering.\",\"EditSkinObject_SupportsPartialRender.Label\":\"Supports Partial Rendering\",\"LoadMore.Button\":\"Load More\",\"EditJavascriptLibrary_TableName.Header\":\"Name\",\"EditJavascriptLibrary_TableVersion.Header\":\"Version\",\"AuthSystemSiteSettings_AppEnabled.HelpText\":\"Check this box to enable this authentication provider for this site.\",\"AuthSystemSiteSettings_AppEnabled.Label\":\"Enabled\",\"AuthSystemSiteSettings_AppId.HelpText\":\"Enter the value of the APP ID/API Key/Consumer Key you configured for this authentication provider.\",\"AuthSystemSiteSettings_AppId.Label\":\"App ID\",\"AuthSystemSiteSettings_AppSecret.HelpText\":\"Enter the value of the APP Secret/Consumer Secret you configured for this authentication provider.\",\"AuthSystemSiteSettings_AppSecret.Label\":\"App Secret\",\"CreateExtension_Cancel.Button\":\"Cancel\",\"CreateExtension_Save.Button\":\"Create\",\"CreateNewModule.HelpText\":\"You can create a new module in three ways. Select which method to use. New - creates a new module control, Control - creates a module from an existing control, Manifest - creates a module from an existing manifest.\",\"CreateNewModuleFrom.Label\":\"Create New Module From:\",\"CreateNewModule_FolderName.Label\":\"Folder Name\",\"CreateNewModule_NewFolder.Label\":\"New Folder\",\"CreateNewModule_NotSpecified.Label\":\"\",\"Done.Button\":\"Done\",\"EditModule_SaveAndClose.Button\":\"Save & Close\",\"InstallExtension_AcceptLicense.Label\":\"Accept License?\",\"InstallExtension_License.Header\":\"License\",\"InstallExtension_License.HelpText\":\"Before proceeding you must accept the terms of the license for this extension. \\\\n Please review the license and check the Accept License check box.\",\"InstallExtension_Logs.Header\":\"Package Installation Report\",\"InstallExtension_Logs.HelpText\":\"Installation is complete. See details below.\",\"InstallExtension_ReleaseNotes.Header\":\"Release Notes\",\"InstallExtension_ReleaseNotes.HelpText\":\"Review the Release Notes for this package.\",\"Next.Button\":\"Next\",\"Cancel.Button\":\"Cancel\",\"EditExtensions_TabHasError\":\"This tab has an error. Package Information, Extension Settings, License and Release Notes cannot be saved.\",\"EditExtension_PackageType.Label\":\"Extension Type\",\"InstallExtension_PackageInfo.Header\":\"Package Information\",\"InstallExtension_PackageInfo.HelpText\":\"The following information was found in the package manifest.\",\"Save.Button\":\"Save\",\"UnsavedChanges.Cancel\":\"No\",\"UnsavedChanges.Confirm\":\"Yes\",\"UnsavedChanges.HelpText\":\"You have unsaved changes. Are you sure you want to proceed?\",\"CreatePackage_ArchiveFileName.HelpText\":\"Enter the file name to use for the archive (zip).\",\"CreatePackage_ManifestFileName.HelpText\":\"Enter the file name to use for the manifest.\",\"DeleteExtension.Cancel\":\"No\",\"DeleteExtension.Confirm\":\"Yes\",\"DeleteExtension.Warning\":\"Are you sure you want to delete {0}?\",\"Download.Button\":\"Download\",\"EditExtension_Notify.Success\":\"Extension updated sucessfully.\",\"EditModule_ModuleSharingSupported.Label\":\"Supported\",\"EditModule_ModuleSharingUnknown.Label\":\"Unknown\",\"EditModule_ModuleSharingUnsupported.Label\":\"Unsupported\",\"Install.Button\":\"Install\",\"Previous.Button\":\"Previous\",\"Errors\":\"errors\",\"TryAgain\":\"[Try Again]\",\"ViewErrorLog\":\"[View Error Log]\",\"Delete.Button\":\"Delete\",\"DeleteExtension.Action\":\"Delete Extensions - {0}\",\"DeleteFiles.HelpText\":\"Check this box to delete the files associated with this extension.\",\"DeleteFiles.Label\":\"Delete Files?\",\"Extension.Header\":\"Extension\",\"Container\":\"Container\",\"InstallError\":\"Error loading files from temporary folder - see below.\",\"InvalidExt\":\"Invalid File Extension - {0}\",\"InvalidFiles\":\"The package contains files with invalid File Extensions ({0})\",\"ZipCriticalError\":\"Critical error reading zip package.\",\"Deploy.Button\":\"Deploy\",\"InstallerMoreInfo\":\"If you have reached this page it is because the installer needs some more information before proceeding.\",\"InstallExtension_UploadFailedUnknown\":\"Zip File Upload Failed\",\"InstallExtension_UploadFailedUnknownLogs\":\"An unknown error has occured. Please check your installation zip file and try again.
\\r\\nCommon issues with bad installation files:\\r\\n
    \\r\\n
  • Zip file size is too large, check your IIS settings for max upload file size.
  • \\r\\n
  • Missing resources in the zip file.
  • \\r\\n
  • Invalid files in the package.
  • \\r\\n
  • File extension is not .zip.
  • \\r\\n
  • Check that you are logged in.
  • \\r\\n
\",\"InvalidDNNManifest\":\"This package does not appear to be a valid DNN Extension as it does not have a manifest. Old (legacy) Themes and Containers do not contain manifests. If this package is a legacy Theme or Container Package please check the appropriate radio button below, and click Next.\",\"InstallationError\":\"There was an error during installation. See log files below for more information.\",\"BackToEditExtension\":\"Back To Edit {0} Extension\",\"BackToExtensions\":\"Back To Extensions\",\"ModuleUsageTitle\":\"Module Usage for {0}\",\"PagesFromSite\":\"Showing Pages from Site:\",\"ModuleUsageDetail\":\"This module is used on {0} {1} page(s):\",\"NoModuleUsageDetail\":\"This module does not exist on any {0} pages.\",\"Loading\":\"One sec...We are fetching your extensions\",\"Loading.Tooltip\":\"Your extensions will be here in a just a moment\"},\"EvoqLicensing\":{\"nav_Licensing\":\"About\",\"NoLicense.Header\":\"You have no EVOQ licenses ... yet\",\"NoLicense\":\"Upgrade to EVOQ below to gain access to professional features on your sites.\",\"LicenseType.Header\":\"LICENSE TYPE\",\"InvoiceNumber.Header\":\"INVOICE NUMBER\",\"WebServer.Header\":\"WEB SERVER\",\"Activated.Header\":\"ACTIVATED\",\"Expires.Header\":\"EXPIRES\",\"CheckOutEvoq.Header\":\"CHECK OUT EVOQ\",\"CheckOutEvoq\":\"Evoq provides a comprehensive set of features your entire team will use and love. Organizations across the globe rely on Evoq to deliver powerful web experiences.\",\"UpgradeToEvoq.Header\":\"UPGRADE\",\"UpgradeToEvoq\":\"Ready to take your web presence to the next level? Start a free trial or schedule a custom demo for your team.\",\"DocumentCenter.Header\":\"DOCUMENTATION CENTER\",\"DocumentCenter\":\"No matter your questions, DNN's new \\\"Doc Center\\\" is the go-to for answers, tutorials, and product help.\",\"LicenseType.Development\":\"Development\",\"LicenseType.Production\":\"Production\",\"LicenseType.Failover\":\"Failover\",\"LicenseType.Staging\":\"Staging\",\"LicenseType.Test\":\"Test\",\"Error.Unknown.Activation\":\"Unable to process request, please try again later or use manual activation.\",\"Error.LicenseAlreadyExists\":\"License Activation failed. The host server {0} already has a {1} license.\",\"Error.ContactServer.activate\":\"Unable to activate license. Connection to license server failed. Please try again later or use manual activation. If you continue to have difficulties, please contact Technical Support.\",\"Error.ContactServer.canrenew\":\"Connection to license server failed. You will not be able to automatically activate or renew licenses. You can use manual activation to activate a license.

\\r\\nFor license renewal contact customercare@dnnsoftware.com.\",\"Error.ContactServer.deactivate\":\"Your license was deleted.

\\r\\nUnable to add activation back to your invoice as Connection to license server failed. Please contact Technical Support for license activation.\",\"Error.ContactServer.renew\":\"Unable to Renew License. Connection to license server failed. Please try again later or contact customercare@dnnsoftware.com\",\"Error.ACT1\":\"License Activation failed. The license details provided do not match a valid license.

Verify your license details on your licenses page on dnnsoftware.com and try again. If you continue to have difficulties, please contact Technical Support.\",\"Error.ACT2\":\"License activation failed. Production activation for {0} is in use.\",\"Error.ACT3\":\"You have exceeded the limit of activations from this client address\",\"Error.ACT4\":\"License activation failed. Production activation for {0} is in use.\",\"Error.ACT6\":\"License activation failed. Your service period for this license expired on {0:d}. Please contact customercare@dnnsoftware.com.\",\"Error.DEA1\":\"Delete License failed. The license was not found.\",\"WebLicenseList.url\":\"http://www.dnnsoftware.com/Support/Success-Network/License-Management\",\"Error.Unknown\":\"Unable to process request, please try again later.\",\"Error.ExpiredLicense\":\"License activation failed. Your license expired on {0:d}. Check your licenses on your licenses page on dnnsoftware.com. Log in using the account you received when you first bought the product.\",\"Success.DevLicenseActivated\":\"Development License has been activated successfully.\",\"Success.FailoverLicenseActivated\":\"Failover License has been activated successfully\",\"Success.LicenseActivated\":\"Production License has been activated successfully\",\"Success.LicenseDeactivated\":\"Your license has been deleted successfully.\",\"Success.LicenseDeactivatedContactServerErr\":\"Your license was deleted.

Unable to add activation back to your invoice as Connection to license server failed. If you need to activate as a production license, please contact Technical Support.\",\"Success.LicenseDeactivatedNoActivationIncrease\":\"Your license was deleted.

Unable to add activation back to the invoice. If you need to activate as a production license, please contact Technical Support.\",\"Success.LicenseRenewed\":\"Your license has been renewed successfully.\",\"Success.StagingLicenseActivated\":\"Staging License has been activated successfully\",\"Success.TestLicenseActivated\":\"Test License has been activated successfully\",\"Success.TrialActivation\":\"Your extended trial license has been successfully installed.\",\"Success.TrialExtensionRequest\":\"Your trial license extension request has been submitted. You should receive an email within 1 business day, with instructions for extending your license. If you have any questions about trial license extensions, please call DNN Corp. Sales Dept. at 650-288-3150.\",\"Warning.DeleteLicense\":\"Are you sure you want to delete this license?\",\"cmdManualActivation\":\"Manual Activation\",\"cmdAutoActivation\":\"Automatic Activation\",\"plAccount\":\"Account Email\",\"plAccount.Help\":\"The email address associated with your licenses. This can be found in the email you received when you purchased the license.\",\"plInvoice\":\"Invoice Number\",\"plInvoice.Help\":\"The invoice number given to you when you purchased your license.\",\"cmdAddLicense\":\"Add License\",\"plSelectLicenseType.Help\":\"Select the type of license you are activating. If this is a development environment, select Development.\",\"plSelectLicenseType\":\"License Type\",\"plMachine.Help\":\"Enter the name of the machine that is running DNN. This value is defaulted to the name of the current web server and may need to be changed when operating in a web farm.\",\"plMachine\":\"Web Server\",\"LicenseManagement.Header\":\"LICENSE MANAGEMENT\",\"LicenseManagement\":\"Access your available licenses through your DNN Software account.\",\"ContactSupport.Header\":\"CONTACT SUPPORT\",\"ContactSupport\":\"Your success is our highest priority. Access our experienced technical support team for help with development, deployment and ongoing optimization.\",\"Step1.Header\":\"STEP ONE\",\"Step2.Header\":\"STEP TWO\",\"Step3.Header\":\"STEP THREE\",\"Step4.Header\":\"STEP FOUR\",\"Step1\":\"Copy the server ID below to the clipboard\",\"Step2\":\"Click the link below to open a new browser window, login with your account information and follow the onscreen instructions to retrieve your activation key.\",\"Step3\":\"Paste the activation key to the textbox below.\",\"Step4\":\"Click the button below to parse the activation key and store the result.\",\"plServerId\":\"Server ID\",\"RequestLicx\":\"Request an activation key on dnnsoftware.com\",\"Account.Required\":\"Please enter the email address for your license. This can be found in the email you received when you purchased the license.\",\"Invoice.Required\":\"Please enter your invoice number. You can find this number on the email received with your license purchase.\",\"plActivationKey\":\"Activation Key\",\"valActivationKey\":\"An activation key is required!\",\"cmdUpload\":\"Submit Activation Key\",\"WebService.url\":\"http://www.dnnsoftware.com/desktopmodules/bring2mind/licenses/licensequery.asmx\",\"WebLicenseRequest.url\":\"http://www.dnnsoftware.com/Support/Success-Network/License-Management/ctl/RequestLicense/mid/1189\",\"BackToLicensing\":\"< BACK TO LICENSING\",\"email.extension.body\":\"

The following customer has requested an extension of their Trial License:
\\r\\n
\\r\\nProduct: {6}
\\r\\nCustomer Name: {0} {1}
\\r\\nEmail: {2}
\\r\\nCompany: {3}
\\r\\nHost Identifier: {4}
\\r\\nHost Server: {5}
\\r\\nInstallation Date: {7}
\\r\\nNumber of Days in Trial: {8}
\\r\\n

\\r\\n
This email is sent from the Customer Evoq installation. The customer should be added as an extended trial via the dnnsoftware.com Licensing system. The customer does not receive a copy of this email.
\",\"email.extension.subj\":\"{0} Trial Extension Request\",\"email.extension.to\":\"customersuccess@dnnsoftware.com\",\"Error.TrialExtensionRequest\":\"

Unable to send your request for a trial license extension. Your email server (SMTP) may not be setup or there was an error trying to send the email. Please call DNN Corp. Sales Dept. at 650-288-3150 for a trial license extension.

You may need below information when contact DNN Corp. Sales Dept:

{0}

\",\"Error.TrialActivation.AlreadyInstalled\":\"Your extended trial license has already been installed. If you continue to experience difficulties please contact customersuccess@dnnsoftware.com for assistance.\",\"Error.TrialActivation\":\"Your extended trial license is not valid. Please ensure that you have pasted the complete value into the provided field. If you continue to experience difficulties please contact customersuccess@dnnsoftware.com for assistance.\",\"Renew\":\"[ renew ]\",\"Error.DuplicateLicense\":\"The license already exists in this instance. Please check and try activate other license if needed.\",\"Error.InvalidArgument\":\"The Account Email and Invoice Number can not be empty.\"},\"Licensing\":{\"nav_Licensing\":\"About\",\"NoLicense.Header\":\"You have no EVOQ licenses ... yet\",\"NoLicense\":\"Upgrade to EVOQ below to gain access to professional features on your sites.\",\"LicenseType.Header\":\"LICENSE TYPE\",\"InvoiceNumber.Header\":\"INVOICE NUMBER\",\"WebServer.Header\":\"WEB SERVER\",\"Activated.Header\":\"ACTIVATED\",\"Expires.Header\":\"EXPIRES\",\"CheckOutEvoq.Header\":\"CHECK OUT EVOQ\",\"CheckOutEvoq\":\"Evoq provides a comprehensive set of features your entire team will use and love. Organizations across the globe rely on Evoq to deliver powerful web experiences.\",\"UpgradeToEvoq.Header\":\"UPGRADE\",\"UpgradeToEvoq\":\"Ready to take your web presence to the next level? Start a free trial or schedule a custom demo for your team.\",\"DocumentCenter.Header\":\"DOCUMENTATION CENTER\",\"DocumentCenter\":\"No matter your questions, DNN's new \\\"Doc Center\\\" is the go-to for answers, tutorials, and product help.\",\"LicenseType.Development\":\"Development\",\"LicenseType.Production\":\"Production\",\"LicenseType.Failover\":\"Failover\",\"LicenseType.Staging\":\"Staging\",\"LicenseType.Test\":\"Test\",\"Error.Unknown.Activation\":\"Unable to process request, please try again later or use manual activation.\",\"Error.LicenseAlreadyExists\":\"License Activation failed. The host server {0} already has a {1} license.\",\"Error.ContactServer.activate\":\"Unable to activate license. Connection to license server failed. Please try again later or use manual activation. If you continue to have difficulties, please contact Technical Support.\",\"Error.ContactServer.canrenew\":\"Connection to license server failed. You will not be able to automatically activate or renew licenses. You can use manual activation to activate a license.

\\r\\nFor license renewal contact customercare@dnnsoftware.com.\",\"Error.ContactServer.deactivate\":\"Your license was deleted.

\\r\\nUnable to add activation back to your invoice as Connection to license server failed. Please contact Technical Support for license activation.\",\"Error.ContactServer.renew\":\"Unable to Renew License. Connection to license server failed. Please try again later or contact customercare@dnnsoftware.com\",\"Error.ACT1\":\"License Activation failed. The license details provided do not match a valid license.

Verify your license details on your licenses page on dnnsoftware.com and try again. If you continue to have difficulties, please contact Technical Support.\",\"Error.ACT2\":\"License activation failed. Production activation for {0} is in use.\",\"Error.ACT3\":\"You have exceeded the limit of activations from this client address\",\"Error.ACT4\":\"License activation failed. Production activation for {0} is in use.\",\"Error.ACT6\":\"License activation failed. Your service period for this license expired on {0:d}. Please contact customercare@dnnsoftware.com.\",\"Error.DEA1\":\"Delete License failed. The license was not found.\",\"WebLicenseList.url\":\"http://www.dnnsoftware.com/Support/Success-Network/License-Management\",\"Error.Unknown\":\"Unable to process request, please try again later.\",\"Error.ExpiredLicense\":\"License activation failed. Your license expired on {0:d}. Check your licenses on your licenses page on dnnsoftware.com. Log in using the account you received when you first bought the product.\",\"Success.DevLicenseActivated\":\"Development License has been activated successfully.\",\"Success.FailoverLicenseActivated\":\"Failover License has been activated successfully\",\"Success.LicenseActivated\":\"Production License has been activated successfully\",\"Success.LicenseDeactivated\":\"Your license has been deleted successfully.\",\"Success.LicenseDeactivatedContactServerErr\":\"Your license was deleted.

Unable to add activation back to your invoice as Connection to license server failed. If you need to activate as a production license, please contact Technical Support.\",\"Success.LicenseDeactivatedNoActivationIncrease\":\"Your license was deleted.

Unable to add activation back to the invoice. If you need to activate as a production license, please contact Technical Support.\",\"Success.LicenseRenewed\":\"Your license has been renewed successfully.\",\"Success.StagingLicenseActivated\":\"Staging License has been activated successfully\",\"Success.TestLicenseActivated\":\"Test License has been activated successfully\",\"Success.TrialActivation\":\"Your extended trial license has been successfully installed.\",\"Success.TrialExtensionRequest\":\"Your trial license extension request has been submitted. You should receive an email within 1 business day, with instructions for extending your license. If you have any questions about trial license extensions, please call DNN Corp. Sales Dept. at 650-288-3150.\"},\"EvoqPages\":{\"errorMessageLoadingWorkflows\":\"Error loading Page Wokflows\",\"LinkTrackingTitle\":\"Link Tracking\",\"Published\":\"Published:\",\"Unpublished\":\"Unpublished\",\"WorkflowApplyOnSubPagesCheckBox\":\"Apply setting to all subpages\",\"WorkflowRunning\":\"This page has a running workflow. The workflow must be completed to be changed.\",\"WorkflowTitle\":\"Workflow\",\"WorkflowNoteApplyOnSubPages\":\"Note: This setting cannot be applied because there are one or more subpages pending to be published.\",\"EvoqPageTemplate\":\"Evoq Page Template\",\"ImportFromXml\":\"Import From Xml\",\"TemplateMode\":\"Template Mode\",\"XmlFile\":\"Xml File\",\"ExportAsXML\":\"Export as XML\",\"NoTemplates\":\"There are no templates to be shown.\",\"SetPageTabTemplate\":\"Set as template\",\"Template.Help\":\"Select the template to be applied.\",\"Template\":\"Template\",\"SaveAsTemplate\":\"Save Page Template\",\"BackToPageSettings\":\"Back to page settings\",\"Description\":\"Description\",\"TemplateName\":\"Template Name\",\"TemplateNameTooltip\":\"Enter a name for the page template.\",\"TemplateDescriptionTooltip\":\"Enter a description of this template.\",\"Error_templates_TabExists\":\"The Template Name you chose is already being used for another template.\",\"DetailViewTooltip\":\"Detail View\",\"SmallViewTooltip\":\"Small View\",\"On\":\"On\",\"Off\":\"Off\",\"FilterByPublishDateText\":\"Filter by Published Date Range\",\"FilterbyWorkflowText\":\"Filter by Workflow\",\"PublishedDateRange\":\"Published Date Range\"},\"Pages\":{\"ErrorPages\":\"You must select at least one page to be exported.\",\"nav_Pages\":\"Pages\",\"SiteDetails_Pages\":\"Pages\",\"Description.Label\":\"Description\",\"HomeDirectory.Label\":\"Home Directory\",\"Title.Label\":\"Title\",\"Delete\":\"Delete\",\"Edit\":\"Edit\",\"Settings\":\"Settings\",\"View\":\"View\",\"Hidden\":\"Page is hidden in menu\",\"Cancel\":\"Cancel\",\"DragPageTooltip\":\"Drag Page into Location\",\"DragInvalid\":\"You can't drag a page as a child of itself.\",\"DeletePageConfirm\":\"

Please confirm you wish to delete this page.

\",\"Pending\":\"Please drag the page into the desired location.\",\"Search\":\"Search\",\"page_name_tooltip\":\"Page Name\",\"page_title_tooltip\":\"Page Title\",\"AnErrorOccurred\":\"An error has occurred.\",\"DeleteModuleConfirm\":\"Are you sure you want to delete the module \\\"[MODULETITLE]\\\" from this page?\",\"SitemapPriority\":\"Sitemap Priority\",\"SitemapPriority_tooltip\":\"Enter the desired priority (between 0 and 1.0). This helps determine how this page is ranked in Google with respect to other pages on your site (0.5 is the default).\",\"PageHeaderTags\":\"Page Header Tags\",\"PageHeaderTags_tooltip\":\"Enter any tags (i.e. META tags) that should be rendered in the \\\"HEAD\\\" tag of the HTML for this page.\",\"AddUrl\":\"Add URL\",\"UrlsForThisPage\":\"URLs for this page\",\"Url\":\"URL\",\"UrlType\":\"URL Type\",\"GeneratedBy\":\"Generated By\",\"None\":\"None\",\"Include\":\"Include\",\"Exclude\":\"Exclude\",\"Security\":\"Security\",\"SecureConnection\":\"Secure Connection\",\"SecureConnection_tooltip\":\"Specify whether or not this page should be forced to use a secure connection (SSL). This option will only be enabled if the administrator has Enabled SSL in the site settings.\",\"AllowIndexing\":\"Allow Indexing\",\"AllowIndexing_tooltip\":\"This setting controls whether a page should be indexed by search crawlers. It uses the INDEX/NOINDEX values for ROBOTS meta tag.\",\"CacheSettings\":\"Cache Settings\",\"OutputCacheProvider\":\"Output Cache Provider\",\"OutputCacheProvider_tooltip\":\"Select the provider to use for this page.\",\"CacheDuration\":\"Cache Duration (seconds)\",\"CacheDuration_tooltip\":\"Enter the duration (in seconds) to cache the page for. This must be an integer.\",\"IncludeExcludeParams\":\"Include / Exclude Params by default\",\"IncludeExcludeParams_tooltip\":\"If set to INCLUDE, all querystring parameter value variations will result in a new item in the output cache. If set to EXCLUDE, querystring parameters will not be used to vary the cached page.\",\"IncludeParamsInCacheValidation\":\"Include Params In Cache Validation\",\"IncludeParamsInCacheValidation_tooltip\":\"A list of querystring parameter names (separated by commas) to be INCLUDED in the variations of cached pages. This setting is only valid when the default above is set to EXCLUDE querystring parameters from cached page variations.\",\"ExcludeParamsInCacheValidation\":\"Exclude Params In Cache Validation\",\"ExcludeParamsInCacheValidation_tooltip\":\"A list of querystring parameter names (separated by commas) to be EXCLUDED from the variations of cached pages. This setting is only valid when the default above is set to INCLUDE querystring parameters from cached page variations.\",\"VaryByLimit\":\"Vary By Limit\",\"VaryByLimit_tooltip\":\"Enter the maximum number of variations to cache for this page. This must be an integer. (Note, this feature prevents potential denial of service attacks.)\",\"ModulesOnThisPage\":\"Modules on this page\",\"NoModules\":\"This page does not have any modules.\",\"Advanced\":\"Advanced\",\"Appearance\":\"Appearance\",\"CopyAppearanceToDescendantPages\":\"Copy Appearance to Descendant Pages\",\"CopyPermissionsToDescendantPages\":\"Copy Permissions to Descendant Pages\",\"Layout\":\"Layout\",\"PageContainer\":\"Page Container\",\"PageStyleSheet\":\"Page Stylesheet\",\"PageTheme\":\"Page Theme\",\"PageThemeTooltip\":\"The selected theme will be applied to this page.\",\"PageLayoutTooltip\":\"The selected layout will be applied to this page.\",\"PageContainerTooltip\":\"The selected container will be applied to all modules on this page.\",\"PreviewThemeLayoutAndContainer\":\"Preview Theme Layout and Container\",\"NotEmptyNameError\":\"This field is required\",\"AddPage\":\"Add Page\",\"PageSettings\":\"Page Settings\",\"AddMultiplePages\":\"Add Multiple Pages\",\"NameTooltip\":\"This is the name of the Page. The text you enter will be displayed in the menu system.\",\"DisplayInMenu\":\"Display in Menu\",\"DisplayInMenuTooltip\":\"You have the choice on whether or not to include the page in the main navigation menu. If a page is not included in the menu, you can still link to it based on its page URL.\",\"Name\":\"Name\",\"EnableScheduling\":\"Enable Scheduling\",\"EnableSchedulingTooltip\":\"Enable scheduling for this page.\",\"StartDate\":\"Start Date\",\"EndDate\":\"End Date\",\"TitleTooltip\":\"Enter a title for the page. The title will be displayed in the browser window title.\",\"Keywords\":\"Keywords\",\"Tags\":\"Tags\",\"ExistingPage\":\"Existing Page\",\"ExistingPageTooltip\":\"Redirect to an existing page on your site.\",\"ExternalUrl\":\"External Url\",\"ExternalUrlTooltip\":\"Redirect to an External URL Resource.\",\"PermanentRedirect\":\"Permanent Redirect\",\"PermanentRedirectTooltip\":\"Check this box if you want to notify the client that this page should be considered as permanently moved. This would allow SearchEngines to modify their URLs to directly link to the resource. This is ignored if the LinkType is None.\",\"OpenLinkInNewWindow\":\"Open Link In New Window\",\"OpenLinkInNewWindowTooltip\":\"Open Link in New Browser Window\",\"Save\":\"Save\",\"Details\":\"Details\",\"Permissions\":\"Permissions\",\"Modules\":\"Modules\",\"SEO\":\"S.E.O.\",\"More\":\"More\",\"Created\":\"Created\",\"CreatedValue\":\"[CREATEDDATE] by [CREATEDUSER]\",\"PageParent\":\"Page Parent\",\"Status\":\"Status\",\"PageType\":\"Page Type\",\"Standard\":\"Standard\",\"Existing\":\"Existing\",\"File\":\"File\",\"PageStyleSheetTooltip\":\"A stylesheet that will only be loaded for this page. The file must be located in the home directory or a sub folder of the current website.\",\"SetPageContainer\":\"set page container\",\"SetPageLayout\":\"set page layout\",\"SetPageTheme\":\"set page theme\",\"BackToPages\":\"Back to page\",\"ChangesNotSaved\":\"Changes have not been saved\",\"Pages_Seo_GeneratedByAutomatic\":\"Automatic\",\"CopyAppearanceToDescendantPagesSuccess\":\"Appearance has been copy to descendant pages successfully\",\"CopyPermissionsToDescendantPagesSuccess\":\"Permissions have been copy to descendant pages successfully\",\"DeletePageModuleSuccess\":\"Module \\\"[MODULETITLE]\\\" has been deleted successfully\",\"BulkPageSettings\":\"Bulk page settings\",\"BulkPagesToAdd\":\"Bulk pages to add\",\"AddPages\":\"Add Page(s)\",\"ValidatePages\":\"Validate Page(s)\",\"NoContainers\":\"This Theme does not have any Containers\",\"NoLayouts\":\"This Theme does not have any Layouts\",\"NoThemes\":\"Your site does not have any Themes\",\"NoThemeSelectedForContainers\":\"Please, select a theme to load containers\",\"NoThemeSelectedForLayouts\":\"Please, select a theme to load layouts\",\"PleaseSelectLayoutContainer\":\"Please, you must select a layout and a container to perform this operation.\",\"CancelWithoutSaving\":\"Are you sure you want to close? Changes have been made and will be lost. Do you wish to continue? \",\"PathDuplicateWithAlias\":\"There is already a page with the same name, {0} at the same URL path {1}.\",\"PathDuplicateWithPage\":\"There is already a page with the same URL path {0}.\",\"TabExists\":\"The Page Name you chose is already being used for another page at the same level of the page hierarchy.\",\"TabRecycled\":\"A page with this name exists in the Recycle Bin. To restore this page use the Recycle Bin.\",\"BulkPagesLabel\":\"One page per line, prepended with \\\">\\\" to create hierarchy\",\"BulkPageResponseTotalMessage\":\"[PAGES_CREATED] of [PAGES_TOTAL] pages were created.\",\"System\":\"System\",\"EmptyTabName\":\"Tab Name is Empty\",\"InvalidTabName\":\"{0} is an invalid Page Title.\",\"CustomUrlPathCleaned.Error\":\"The Page URL entered contains characters which cannot be used in a URL or are illegal characters for a URL. These characters have been removed. Click the Update button again to accept the modified URL.
[NOTE: The illegal characters list is the following: <>\\\\?:&=+|%# ]\",\"DuplicateUrl.Error\":\"The URL is a duplicate of an existing URL.\",\"InvalidRequest.Error\":\"The request is invalid\",\"Pages_Seo_QueryString.Help\":\"Add an optional Querystring to the Redirect URL to match on a URL with a Path and any matching Querystring parameters. The Querystring is the segment of the URL to the right of the first ? in the URL. e.g. example.com/url-to-redirect?id=123\",\"Pages_Seo_QueryString\":\"Query String\",\"Pages_Seo_SelectedAliasUsage.Help\":\"If the selected site alias is different from the primary site alias, select the usage option.\",\"Pages_Seo_SelectedAliasUsage\":\"Selected Site Alias Usage\",\"Pages_Seo_SelectedAliasUsageOptionPageAndChildPages\":\"Page and Child Pages\",\"Pages_Seo_SelectedAliasUsageOptionSameAsParent\":\"Same as Parent Page\",\"Pages_Seo_SelectedAliasUsageOptionThisPageOnly\":\"This page only\",\"Pages_Seo_SiteAlias.Help\":\"Select the alias for the page to use a specific alias.\",\"Pages_Seo_SiteAlias\":\"Site Alias\",\"Pages_Seo_UrlPath.Help\":\"Specify the path for the URL. Do not enter http:// or the site alias.\",\"Pages_Seo_UrlPath\":\"URL Path\",\"Pages_Seo_UrlType.Help\":\"Select 'Active' or 'Redirect'. Active means the URL will be used as the URL for the page, and will return a HTTP status code of 200. 'Redirect' means the entered URL will be redirected to the Active URL for the current page.\",\"Pages_Seo_UrlType\":\"URL Type\",\"UrlPathNotUnique.Error\":\"The submitted URL is not available. If you wish to accept the suggested alternative, please click Save.\",\"Pages_Seo_DeleteWarningMessage\":\"Are you sure you want to remove this URL?\",\"NoneSpecified\":\"< None Specified > \",\"CannotCopyPermissionsToDescendantPages\":\"You do not have permission to copy permissions to descendant pages\",\"SaveAsTemplate\":\"Save as Template\",\"BackToPageSettings\":\"Back to page settings\",\"DuplicatePage\":\"Duplicate Page\",\"BranchParent\":\"Branch Parent\",\"ModuleSettings\":\"Module Settings\",\"TopPage\":\"Top Page\",\"Folder\":\"Folder\",\"TemplateName\":\"Template Name\",\"IncludeContent\":\"Include Content\",\"FolderTooltip\":\"Select the export folder where the template will be saved.\",\"TemplateNameTooltip\":\"Enter a name for the page template.\",\"TemplateDescriptionTooltip\":\"Enter a description of this template.\",\"IncludeContentTooltip\":\"Check this box to include the module content.\",\"SearchFolders\":\"Search Folders\",\"ExportedMessage\":\"The page template has been created to {0}\",\"MakeNeutral.ErrorMessage\":\"Page cannot be converted to a neutral culture, because there are child pages.\",\"Detached\":\"Detached {0}\",\"ModuleDeleted\":\"This module is deleted, and exists in the recycle bin.\",\"ModuleInfo\":\"Module: {0}
ModuleTitle: {1}
Pane: {2}\",\"ModuleInfoForNonAdmins\":\"You do not have enough permissions to edit the title of this module.\",\"NotTranslated\":\"Not translated {0}\",\"Reference\":\"Reference {0}\",\"ReferenceDefault\":\"Reference Default Language {0}\",\"Translated\":\"Translated {0}\",\"Default\":\"[Default Language]\",\"NotActive\":\"[Language is not Active]\",\"TranslationMessageConfirmMessage.Error\":\"Something went wrong notifying the Translators.\",\"TranslationMessageConfirmMessage\":\"Translators successfully notified.\",\"NewContentMessage.Body\":\"The following page has new content ready for translation
Page: {0}
{2}\",\"NewContentMessage.Subject\":\"New Content Ready for Translation\",\"MakePagesTranslatable\":\"Make Page Translatable\",\"MakePageNeutral\":\"Make Page Neutral\",\"Site\":\"Site\",\"BadTemplate\":\"The page template is not a valid xml document. Please select a different template and try again.\",\"AddMissingLanguages\":\"Add Missing Languages\",\"NotifyTranslators\":\"Notify Translators\",\"UpdateLocalization\":\"Update Localization\",\"NeutralPageText\":\"This is a \\\"Language Neutral\\\" page, which means that the page will be visible in every language of the site. Language Neutral pages cannot be translated.\",\"NeutralPageClickButton\":\"To change this to a translatable page, click the button here.\",\"NotifyModalHeader\":\"Send a notification to translators\",\"NotifyModalPlaceholder\":\"Enter a message to send to translators\",\"CopyModule\":\"Copy Module\",\"TranslatedCheckbox\":\"Translated\",\"PublishedCheckbox\":\"Published\",\"MakeNeutralWarning\":\"This will delete all translated version of the page. Only the default culture version of the page will remain. Are you sure you want to do this?\",\"PageUpdatedMessage\":\"Page updated successfully\",\"PageDeletedMessage\":\"Page deleted successfully\",\"DisableLink\":\"Disable Page\",\"DisableLink_tooltip\":\"If the page is disabled it cannot be clicked in any navigation menu. This option is used to provide place-holders for child menu items.\",\"Description\":\"Description\",\"Title\":\"Title\",\"AddRole\":\"Add\",\"AddRolePlaceHolder\":\"Begin typing to add a role\",\"AddUser\":\"Add\",\"AddUserPlaceHolder\":\"Begin typing to add a user\",\"AllGroups\":\"[All Roles]\",\"EditTab\":\"Edit\",\"EmptyRole\":\"Add a role to set permissions by role\",\"EmptyUser\":\"Add a user to set permissions by user\",\"FilterByGroup\":\"Filter By Group:\",\"GlobalGroups\":\"[Global Roles]\",\"PermissionsByRole\":\"PERMISSIONS BY ROLE\",\"PermissionsByUser\":\"PERMISSIONS BY USER\",\"Role\":\"Role\",\"Status_Hidden\":\"Hidden\",\"Status_Visible\":\"Visible\",\"Status_Disabled\":\"Disabled\",\"User\":\"User\",\"ViewTab\":\"View\",\"SiteDefault\":\"Site Default\",\"ClearPageCache\":\"Clear Cache - This Page\",\"lblCachedItemCount\":\"Current Cache Count: {0} variations for this page\",\"cacheDuration.ErrorMessage\":\"Cache Duration must be an integer.\",\"cacheMaxVaryByCount.ErrorMessage\":\"Vary By Limit must be an integer.\",\"addTagsPlaceholder\":\"Add Tags\",\"On\":\"On\",\"Off\":\"Off\",\"ParentPage\":\"Parent Page\",\"MethodPermissionDenied\":\"The user is not allowed to access this method.\",\"Prompt_PageNotFound\":\"Page not found.\",\"Prompt_InvalidPageId\":\"You must specify a valid number for Page ID\",\"Prompt_NoPageId\":\"No valid Page ID specified\",\"Prompt_ParameterRequired\":\"Either Page Id or Page Name with flag --name should be specified.\",\"Prompt_IfSpecifiedMustHaveValue\":\"If you specify the --{0} flag, it must be set to True or False.\",\"Prompt_ParentIdNotNumeric\":\"When specifying --{0}, you must supply a valid numeric Page (Tab) ID\",\"Prompt_NoPages\":\"No pages found.\",\"Prompt_InvalidParentId\":\"The --{0} flag's value must be a valid Page (Tab) ID;.\",\"PageNotFound\":\"Page doesn't exists.\",\"Prompt_PageCreated\":\"The page has been created\",\"Prompt_PageCreateFailed\":\"Unable to create the new page\",\"Prompt_FlagRequired\":\"--{0} is required.\",\"Prompt_TrueFalseRequired\":\"You must pass True or False for the --{0} flag.\",\"Prompt_UnableToFindSpecified\":\"Unable to find page specified for --{0} '{1}'.\",\"Prompt_FlagMatch\":\"The --{0} flag value cannot be the same as the page you are trying to update\",\"Prompt_NothingToUpdate\":\"Nothing to Update! Tell what to update with flags like --{0} --{1} --{2} --{3}, etc.\",\"Prompt_DeletePage_Description\":\"Deletes a page within the portal and sends it to the Recycle Bin. For added safety, this method will not allow deletion of pages with children, Host pages, or pages in the //Admin path.\",\"Prompt_DeletePage_FlagId\":\"Explicitly specifies the Page ID to delete. Use of the flag name is not required. You can simply provide the ID value as the first argument. Required if --parentid is not specified.\",\"Prompt_DeletePage_FlagName\":\"The name (not title) of the page to delete.\",\"Prompt_DeletePage_FlagParentId\":\"The Page/Tab ID of the page's parent in the page hierarchy. Required only if --name is specified as delete parameter and page is not at root.\",\"Prompt_DeletePage_ResultHtml\":\"
\\r\\n

Delete Page By Page ID

\\r\\n \\r\\n delete-page 999\\r\\n \\r\\n\\r\\n

Delete Page by name under another parent

\\r\\n

NOTE: At this time, Prompt will not allow you to delete any pages that have children

\\r\\n \\r\\n delete-page --name \\\"test\\\" --parentid 999\\r\\n \\r\\n
\",\"Prompt_GetPage_Description\":\"

Provides information on the specified page.

\\r\\n
\\r\\n Pages vs. Tabs: For historical reasons, DNN\\r\\n internally refers to pages as "tabs". So, whenever you see a reference to tab\\r\\n or page, remember that they are equivalent. Values returned from Prompt will usually\\r\\n use DNN's internal naming conventions (hence tab), though Prompt's own syntax will usually use the word page instead of tab.\\r\\n
\",\"Prompt_GetPage_FlagId\":\"Explicitly specifies the Page ID to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_GetPage_FlagName\":\"The name (not title) of the page.\",\"Prompt_GetPage_FlagParentId\":\"The Page/Tab ID of the page's parent in the page hierarchy. Required only if --name is specified as get parameter and page is not at root.\",\"Prompt_GetPage_ResultHtml\":\"
\\r\\n

Get Page By Page (Tab) ID

\\r\\n \\r\\n get-page pageId\\r\\n \\r\\n\\r\\n

Get Page by Page Name

\\r\\n

\\r\\n NOTE: You cannot retrieve Host pages using this method as it only retrieves pages within a portal. Host pages technically live outside the portal. You can, however, retrieve them using the page's ID (TabID in DNN parlance).\\r\\n

\\r\\n get-page --name Home\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:345
Name:Home
Title:My Website Home
ParentId:-1
Container:null
Theme:[G]Skins/Xcillion/Home.ascx
Path://Home
IncludeInMenu:true
Url:
Keywords:DNN, KnowBetter, Prompt
Description:Gnome, gnome on the range....
\\r\\n\\r\\n

Get Page by Page Name and Parent

\\r\\n\\r\\n get-page --name \\\"Page 1a\\\" --parentid 71\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:72
Name:Page 1a
Title:Page 1a
ParentId:71
Container:null
Theme:
Path://Page1//Page1a
IncludeInMenu:true
Url:
Keywords:
Description:Page 1 is my parent. I'm Page 1a
\\r\\n
\",\"Prompt_Goto_Description\":\"Navigates to the specified page within the DNN portal\",\"Prompt_Goto_FlagId\":\"Specify the Page (Tab) ID of the page to which you want to navigate. Explicit use of the --id flag is not needed. Simply pass in the Page ID as the first argument after the command name\",\"Prompt_Goto_FlagName\":\"The name (not title) of the page.\",\"Prompt_Goto_FlagParentId\":\"The Page/Tab ID of the page's parent in the page hierarchy. Required only if --name is specified as goto parameter and page is not at root.\",\"Prompt_Goto_ResultHtml\":\"
\\r\\n

Navigate to A Page Within the Site

\\r\\n

This command navigates the browser to a page with the Page ID of 74

\\r\\n \\r\\n goto 74\\r\\n \\r\\n
\",\"Prompt_ListPages_Description\":\"

Retrieves a list of pages based on the specified criteria

\\r\\n
\\r\\n Pages vs. Tabs: For historical reasons, DNN\\r\\n internally refers to pages as "tabs". So, whenever you see a reference to tab\\r\\n or page, remember that they are equivalent. Values returned from Prompt will usually\\r\\n use DNN's internal naming conventions (hence tab), though Prompt's own syntax will usually use the word page instead of tab.\\r\\n
\",\"Prompt_ListPages_FlagDeleted\":\"If true, only pages that have been deleted (i.e. in DNN's Recycle Bin) will be returned. If false then only pages that have not been deleted will be returned. If the flag is specified but has no value, then true is assumed. If the flag is not specified, both deleted and non-deleted pages will be returned.\",\"Prompt_ListPages_FlagName\":\"Retrieve only pages whose name matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters.\",\"Prompt_ListPages_FlagParentId\":\"The Page ID (Tab ID) of the parent page whose child pages you'd like to retrieve. If the first argument is a valid Page ID, you do not need to explicitly use the --parentid flag\",\"Prompt_ListPages_FlagPath\":\"Retrieve only pages whose path matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters.\",\"Prompt_ListPages_FlagSkin\":\"Retrieve only pages whose skin matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters.\",\"Prompt_ListPages_FlagTitle\":\"Retrieve only pages whose title matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters.\",\"Prompt_ListPages_ResultHtml\":\"
\\r\\n

List All Pages in Current Portal

\\r\\n \\r\\n list-pages\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabIdNameTitleParentIdThemePathIncludeInMenuIsDeleted
41HomeHome 3-1[G]Skins/Xcillion/Home.ascx//Hometruefalse
71Page 1-1//Page1truetrue
42Activity FeedActivity Feed-1//ActivityFeedfalsefalse
...
33 pages found
\\r\\n\\r\\n

List Child Pages of Parent Page

\\r\\n \\r\\n list-pages 43\\r\\n \\r\\n OR\\r\\n \\r\\n list-pages --parentid 43\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabIdNameTitleParentIdThemePathIncludeInMenuIsDeleted
49Site SettingsSite Settings43//Admin//SiteSettingstruefalse
50ExtensionsExtensions43//Admin//Extensionstruefalse
51Security RolesSecurity Roles43//Admin//SecurityRolestruefalse
...
18 pages found
\\r\\n\\r\\n

List All Pages in the Recycle Bin

\\r\\n \\r\\n list-pages --deleted\\r\\n \\r\\n OR\\r\\n \\r\\n list-pages --deleted true\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabIdNameTitleParentIdThemePathIncludeInMenuIsDeleted
71Page 1-1//Page1truetrue
1 page found
\\r\\n\\r\\n

List All "Management" Pages on the Admin Menu

\\r\\n \\r\\n list-pages --path //Admin//*Management*\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabIdNameTitleParentIdThemePathIncludeInMenuIsDeleted
53File ManagementFile Management43//Admin//FileManagementtruefalse
55Site Redirection Management43//Admin//SiteRedirectionManagementtruefalse
56Device Preview Management43//Admin//DevicePreviewManagementtruefalse
3 pages found
\\r\\n\\r\\n
\",\"Prompt_ListRoles_FlagMax\":\"Page Size for the page. Max is 500.\",\"Prompt_ListRoles_FlagPage\":\"Page number to show records.\",\"Prompt_ListRoles_FlagVisible\":\"If true, only pages that are visible in the navigation menu will be returned. If false then only pages that hidden will be returned. If the flag is specified but has no value, then true is assumed. If the flag is not specified, both visible and hidden pages will be returned.\",\"Prompt_NewPage_Description\":\"Creates a new page within the portal\",\"Prompt_NewPage_FlagDescription\":\"The description to use for the page\",\"Prompt_NewPage_FlagKeywords\":\"Keywords to use for the page\",\"Prompt_NewPage_FlagName\":\"The name to use for the page. The --name flag does not have to be explicitly declared if the first argument is a string and not a flag.\",\"Prompt_NewPage_FlagParentId\":\"If you want this to be the child of a page, specify that page's ID as the --parentid\",\"Prompt_NewPage_FlagTitle\":\"The display title to use for the page\",\"Prompt_NewPage_FlagUrl\":\"A custom URL to use for the page. If not specified, the --name is used by DNN when creating the URL\",\"Prompt_NewPage_FlagVisible\":\"If true, the page will be visible in the site's navigation menu\",\"Prompt_NewPage_ResultHtml\":\"
\\r\\n

Create a New Page (Minimum Syntax)

\\r\\n
Implicitly Use --name flag
\\r\\n \\r\\n new-page \\\"My New Page\\\"\\r\\n \\r\\n
Explicitly Use --name flag
\\r\\n \\r\\n new-page --name \\\"My New Page\\\"\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:78
Name:My New Page
Title:
ParentId:-1
Container:null
Theme:
Path://MyNewPage
IncludeInMenu:true
Url:
Keywords:
Description:
\\r\\n\\r\\n

Create a Child Page with Additional Options

\\r\\n \\r\\n new-page --name \\\"My Sub Page\\\" --parentid 78 --title \\\"This is the sub page title\\\" --keywords \\\"sample, sub-page, prompt, KnowBetter\\\"\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:79
Name:My Sub Page
Title:This is the sub page title
ParentId:78
Container:null
Theme:
Path://MyNewPage//MySubPage
IncludeInMenu:true
Url:
Keywords:sample, sub-page, prompt, KnowBetter
Description:
\\r\\n\\r\\n
\",\"Prompt_SetPage_Description\":\"Sets or updates properties of the specified page\",\"Prompt_SetPage_FlagDescription\":\"The description to use for the page\",\"Prompt_SetPage_FlagId\":\"The ID of the page you want to update.\",\"Prompt_SetPage_FlagKeywords\":\"Keywords to use for the page\",\"Prompt_SetPage_FlagName\":\"The name to use for the page\",\"Prompt_SetPage_FlagParentId\":\"If you want this to be the child of a page, specify that page's ID as the --parentid\",\"Prompt_SetPage_FlagTitle\":\"The display title to use for the page\",\"Prompt_SetPage_FlagUrl\":\"A custom URL to use for the page. If not specified, the --name is used by DNN when creating the URL\",\"Prompt_SetPage_FlagVisible\":\"If true, the page will be visible in the site's navigation menu\",\"Prompt_SetPage_ResultHtml\":\"
\\r\\n

Update Properties of a Page

\\r\\n \\r\\n set-page 78 --title \\\"My New Page Title\\\" --name Page78\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:78
Name:Page25
Title:My New Page Title
ParentId:-1
Container:null
Theme:
Path://MyNewPage
IncludeInMenu:true
Url:
Keywords:
Description:
\\r\\n\\r\\n

Change the Parent of a Page

\\r\\n \\r\\n set-page --id 72 --parentid 79\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:72
Name:Page2
Title:Page 2
ParentId:79
Container:null
Theme:
Path://Page3//Page2
IncludeInMenu:true
Url:
Keywords:sample, sub-page, prompt, KnowBetter
Description:
\\r\\n\\r\\n
\",\"Prompt_PagesCategory\":\"Page Commands\",\"NoPermissionAddPage\":\"You don't have permission to add a page.\",\"NoPermissionEditPage\":\"You don't have permission to edit this page\",\"NoPermissionCopyPage\":\"You don't have permission to copy this page.\",\"NoPermissionManagePage\":\"You don't have permissions to manage the page\",\"NoPermissionViewPage\":\"You don't have permission to view the page\",\"NoPermissionDeletePage\":\"You don't have permission to delete the page.\",\"CannotDeleteSpecialPage\":\"You cannot delete a special page.\",\"ModuleCopyType.New\":\"New\",\"ModuleCopyType.Copy\":\"Copy\",\"ModuleCopyType.Reference\":\"Reference\",\"FilterByModifiedDateText\":\"Filter by Modified Date Range\",\"FilterbyPageTypeText\":\"Filter by Page Type\",\"FilterbyPublishStatusText\":\"Filter by Publish Status\",\"lblDraft\":\"Draft\",\"lblGeneralFilters\":\"GENERAL FILTERS\",\"lblNone\":\"None\",\"lblPagesFound\":\"PAGES FOUND.\",\"lblPublished\":\"Published\",\"lblTagFilters\":\"TAG FILTERS\",\"lblCollapseAll\":\"COLLAPSE ALL\",\"lblExpandAll\":\"EXPAND ALL\",\"NoPageSelected\":\"No page is currently selected.\",\"PageCreatedMessage\":\"Page created successfully\",\"lblDateRange\":\"Date Range\",\"lblFromDate\":\"From Date\",\"lblPageFound\":\"Page Found\",\"lblPublishDate\":\"Publish Date\",\"lblPublishStatus\":\"Publish Status\",\"lblAll\":\"All\",\"lblFile\":\"File\",\"lblNormal\":\"Standard\",\"lblUrl\":\"URL\",\"lblModifiedDate\":\"Modified Date\",\"NoPageFound\":\"No page found.\",\"PagesSearchHeader\":\"Page Search Results\",\"TagsInstructions\":\"Begin typing to filter by tags.\",\"ModifiedDateRange\":\"Modified Date Range\",\"BrowseAction\":\"Press {save|[ENTER]} to save, or {cancel|[ESC]} to cancel\",\"BrowseButton\":\"Browse File System\",\"DefaultImageTitle\":\"Image\",\"DragDefault\":\"Drag and Drop a File or Select an Option\",\"DragOver\":\"Drag and Drop a File\",\"LinkButton\":\"Enter URL Link\",\"LinkInputAction\":\"Press {save|[ENTER]} to save, or {cancel|[ESC]} to cancel\",\"LinkInputPlaceholder\":\"http://example.com/imagename.jpg\",\"LinkInputTitle\":\"URL Link\",\"NotSpecified\":\"\",\"SearchFilesPlaceHolder\":\"Search Files...\",\"SearchFoldersPlaceHolder\":\"Search Folders...\",\"UploadButton\":\"Upload a File\",\"UploadComplete\":\"Upload Complete\",\"UploadDefault\":\"myImage.jpg\",\"UploadFailed\":\"Upload Failed\",\"Uploading\":\"Uploading...\",\"WrongFormat\":\"Wrong Format\",\"ExternalRedirectionUrlRequired\":\"The URL is required.\",\"NoPermissionViewRedirectPage\":\"You don't have permission to view the redirect page.\",\"TabToRedirectIsRequired\":\"Page to redirect to is required.\",\"ValidFileIsRequired\":\"Valid file is required.\",\"BulkPageValidateResponseTotalMessage\":\"[PAGES_TOTAL] pages were validated.\"},\"Prompt\":{\"nav_Prompt\":\"Prompt\",\"Prompt_InvalidData\":\"You've submitted invalid data. Your request cannot be processed.\",\"Prompt_InvalidSyntax\":\"Invalid syntax\",\"Prompt_NotAuthorized\":\"You are not authorized to access to this resource. Your session may have timed-out. If so login again.\",\"Prompt_NotImplemented\":\"This functionality has not yet been implemented.\",\"Prompt_ServerError\":\"The server has encoutered an issue and was unable to process your request. Please try again later.\",\"Prompt_SessionTimedOut\":\"Your session may have timed-out. If so login again.\",\"CommandNotFound\":\"Command '{0}' not found.\",\"CommandOptionText\":\"{0} or {1}\",\"DidYouMean\":\"Did you mean '{0}'?\",\"Prompt_NoModules\":\"No modules found.\",\"Prompt_AddModuleError\":\"An error occurred while attempting to add the module. Please see the DNN Event Viewer for details.\",\"Prompt_DesktopModuleNotFound\":\"Unable to find a desktop module with the name '{0}' for this portal\",\"Prompt_ModuleAdded\":\"Successfully added {0} new module{(1}\",\"Prompt_ModuleCopied\":\"Successfully copied the module.\",\"Prompt_ModuleDeleted\":\"Module deleted successfully.\",\"Prompt_NoModulesAdded\":\"No modules were added\",\"Prompt_SourceAndTargetPagesAreSame\":\"The source Page ID and target Page ID cannot be the same.\\\\n\",\"Prompt_ModuleMoved\":\"Successfully moved the module.\",\"Prompt_ErrorWhileCopying\":\"An error occurred while copying the copying the module. See the DNN Event Viewer for Details.\",\"Prompt_ErrorWhileMoving\":\"An error occurred while copying the moving the module. See the DNN Event Viewer for Details.\",\"Prompt_FailedtoDeleteModule\":\"Failed to delete the module with id {0}. Please see log viewer for more details.\",\"Prompt_InsufficientPermissions\":\"You do not have enough permissions to perform this operation.\",\"Prompt_ModuleNotFound\":\"Could not find module with id {0} on page with id {1}\",\"Prompt_NoModule\":\"No module found with id {0}.\",\"Prompt_PageNotFound\":\"Could not load Target Page. No page found in the portal with ID '{0}'\",\"Prompt_UserRestart\":\"User triggered an Application Restart\",\"Prompt_RestartApplication_Description\":\"Initiates a restart of the DNN instance and reloads the page.\",\"Prompt_Default\":\"Default\",\"Prompt_Description\":\"Description\",\"Prompt_Options\":\"Options\",\"Prompt_Required\":\"Required\",\"Prompt_Type\":\"Type\",\"Prompt_CommandNotFound\":\"Unable to find help for that command\",\"Prompt_CommandHelpLearn\":\"
\\r\\n\\r\\n

Understanding Prompt Commands

\\r\\n

\\r\\n As with most command line interfaces, the more commands you memorize, the more efficient you can be. Understanding the reasoning behind how Prompt commands are named and structured will make it much easier to learn and internalize them.\\r\\n

\\r\\n
    \\r\\n
  1. \\r\\n Prompt is Case-Insensitive. That means you can use lowercase, uppercase or mixed-case command names and option flag names. This is typical of most command lines and we find it makes it easier to use on a daily basis.\\r\\n
  2. \\r\\n
  3. \\r\\n Commands are either 1 word or 2 words separated by a single dash (-) and no spaces.\\r\\n
  4. \\r\\n
  5. \\r\\n One-Word Commands: These are generally reserved for commands that interact with the Prompt console itself or the browser. In other words, most of these commands take place in the browser. Some examples are: cls which clears the console screen and reload which tells the browser to reload the page. There are also two-word commands that operate on the client side such as clear-history (though there is a shortcut for clear-history: clh
  6. \\r\\n
  7. \\r\\n Two-Word Commands: These commands follow the format action-component—an action followed by a single dash followed by a component or object that the action operates on.\\r\\n
  8. \\r\\n
\\r\\n\\r\\n

Common Actions

\\r\\n

This is not a complete list of all actions but covers most of them...

\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ActionDescription
list\\r\\n Retrieves a list of objects. The assumption is that two or more objects will be returned so the component portion of the command is plural:
\\r\\n list-pages NOT list-page\\r\\n
get\\r\\n Will retrieve a single object. If the command results in multiple objects, only the fist object found will be retrieved. Since this command operates on a single item, the component is singular and not plural:
\\r\\n get-page NOT get-pages\\r\\n
new\\r\\n Creates a new object. We chose the word new since it requires less typing than 'create' and it is a more accurate than 'add', which connotes adding something to something else.\\r\\n
add\\r\\n Adds something to something else. This should not be confused with new which creates a new object. Consider add-roles and new-role. The former is used to add one or more security roles to a user (i.e. add a role to the list of roles the user already has), whereas the latter command creates a new security role in the DNN system.\\r\\n
set\\r\\n Modifies an object. This could mean 'update' or set (for the first time) a value. We chose the word 'set' not only because it's short and easy to type, but also because it is more accurate in more scenarios. 'Update' implies you are changing a value that has already been set, but is less accurate if you are setting a value for the first time. And did we mention 'set' is half the length of 'update'?\\r\\n
delete\\r\\n Deletes an object. The results of this action are contextually dependent. If DNN provides a recycle bin facility like it does for pages and users, then the command will send the object to that recycle bin, allowing it to be restored later. If there is no such facility provided, then the object would be permanently deleted\\r\\n
restore\\r\\n If an object has been previously deleted and DNN provides a recycle facility for the object, then this will restore the object.\\r\\n
purge\\r\\n If the object has been previously deleted and DNN provides a recycle facility for the object, then this command will permanently delete the object. The DNN user interface typically refers to this as 'remove' however we felt that 'purge' more accurately reflected the action.\\r\\n
\\r\\n\\r\\n

Common Components

\\r\\n

Most components should be familiar to any user with admin experience with DNN. Below are the most common:

\\r\\n

A Note on Plural vs Singular Components: Whenever a command can 1 or more items, the component will be plural. list-modules, for instance. When the command is designed to return a single object or the first object, then the component will be singular as in get-module

\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ComponentDescription
user/users\\r\\n A DNN User\\r\\n
page/pagesA page in the site. NOTE: For historical reasons, DNN refers to pages internally as Tabs while the DNN user interface refers to them as pages. We've chosen to use 'page', but you may see references to Tab or TabID returned from page-related commands. For Prompt's purposes, you should only use 'page' but understand that 'page and 'tab' are synonymous.
role/rolesA DNN Security Role
task/tasksA task is a DNN Scheduler Item or Scheduled Task. We use the word task due to its brevity.
portal/portalsA DNN site or portal
module/modulesA DNN module. Depending on the command, this could be a module definition or module instance.
\\r\\n\\r\\n

See Also

\\r\\n Basic Syntax\\r\\n Prompt Commands List\\r\\n\\r\\n
\",\"Prompt_CommandHelpSyntax\":\"
\\r\\n

Basic Syntax

\\r\\n

\\r\\n Prompt functions in a way similar to a Terminal, Bash shell, Windows CMD shell, or Powershell. You enter a command and hit ENTER and the computer responds with a result. For very simple commands like help or list-modules, that's all you need. Some commands, though, may require additional data or they may allow you to provide additional options.\\r\\n

\\r\\n

\\r\\n Specifying a target or context for a command: For commands that operate on an object like a user, or that require a context like a page, you simply provide that information after the command. For example, to find the user jsmith using the get-user command, you would type: get-user jsmith followed by the ENTER key to submit it. If you will be specifying flags (see next paragraph), those should always come after the target/context of the command.\\r\\n

\\r\\n

\\r\\n Specifying Options to Commands: Some commands require even more data or allow you to specify optional configuration information. In Prompt we call these "flags". These should come after any target/context needed by the command (see above paragraph) and must be preceded with two hyphens or dashes (--). There should be no spaces between the dashes and there should be no space between the dashes and the name of the flag. If then flag requires a value, you add that after the flag.\\r\\n

\\r\\n

\\r\\n As an example of using flags, take the get-user command. By default, you would specify the username of the user you want to find. However, you can also search by their email address. In that case, you would use the --email flag. Here's how you would use it:\\r\\n

\\r\\n \\r\\n get-user --email jsmith@sample.com\\r\\n \\r\\n

\\r\\n If the value of a flag is more than one word, enclose it in double quotes like so:\\r\\n

\\r\\n \\r\\n set-page --title \\\"My Page\\\"\\r\\n \\r\\n\\r\\n

See Also

\\r\\n Learning Prompt Commands\\r\\n Prompt Commands List\\r\\n\\r\\n
\",\"Prompt_AddModule_Description\":\"Adds a module to a page on the website.\",\"Prompt_AddModule_FlagModuleName\":\"Name of the desktop module to add. This should be unique existing module name.\",\"Prompt_AddModule_FlagModuleTitle\":\"Specify the title of the module on the page.\",\"Prompt_AddModule_FlagPageId\":\"Id of the page to add module on.\",\"Prompt_AddModule_FlagPane\":\"Specify the pane in which the module should be added. If not provided, module would be added to ContentPane.\",\"Prompt_AddModule_ResultHtml\":\"

Add a module to a page

\\r\\n add-module --name \\\"Html\\\" --pageid 23 --pane TopPane\",\"Prompt_CopyModule_Description\":\"Copies a module to the specified page.\",\"Prompt_CopyModule_FlagId\":\"Explicitly specifies the Module ID of the module to copy. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_CopyModule_FlagIncludesettings\":\"If true, Prompt will copy the source module's settings to the copied module.\",\"Prompt_CopyModule_FlagPageId\":\"The Page ID of the page that contains the module you want to copy.\",\"Prompt_CopyModule_FlagPane\":\"Specify the pane in which the module should be copied. If not provided, module would be copied to ContentPane.\",\"Prompt_CopyModule_FlagToPageId\":\"The Page ID of the target page. The page to which you want to copy the module.\",\"Prompt_DeleteModule_Description\":\"Soft-deletes a module on a specific page. The module will be sent to the DNN Recycle Bin. This will not uninstall modules or affect module definitions.\",\"Prompt_DeleteModule_FlagId\":\"Explicitly specifies the Module ID of the module to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_DeleteModule_FlagPageId\":\"Specifies the Page ID of the page on which the module to delete resides.\",\"Prompt_DeleteModule_ResultHtml\":\"

Delete and Send Module Instance to Recycle Bin

\\r\\n

This will delete a module instance on a specific page and send it to the DNN Recycle Bin

\\r\\n delete-module 345 --pageid 42\",\"Prompt_GetModule_Description\":\"Retrieves details about a single module in a specified page\",\"Prompt_GetModule_FlagId\":\"Explicitly specifies the Module ID of the module to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_GetModule_FlagPageId\":\"The Page ID of the page that contains the module.\",\"Prompt_GetModule_ResultHtml\":\"

Get Information on a Specific Module

\\r\\n

The code below retrieves the details for a module whose Module ID is 345 on a page 48

\\r\\n get-module 359 --pageid 48\\r\\n

The following version is a more explicit version of the code above, but does the same thing on a page 48.

\\r\\n get-module --id 359 --pageid 48\\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleId:359
Title:Navigation
ModuleName:Console
FriendlyName:Console
ModuleDefId:102
TabModuleId:48
AddedToPages:42, 46, 47, 48
\",\"Prompt_ListModules_Description\":\"Retrieves a list of modules based on the search criteria\",\"Prompt_ListModules_FlagDeleted\":\"When specified, the command will find all module instances in the portal that are in the Recycle Bin (if --deleted is true), or all module instances not in the Recycle Bin (if operate --deleted is false). If the flag is specified but no value is given, it will default to true. This flag may be used with --name and --title to further refine the results\",\"Prompt_ListModules_FlagMax\":\"Page Size for the page. Max is 500.\",\"Prompt_ListModules_FlagModuleName\":\"The name of the module to search for. This accepts the wildcard (*) character to do partial searches. The Module Name is not the same thing as the module's Friendly Name or the module's Title. To find the Module Name, list-modules on a page containing the module. Searches are case-insensitive\",\"Prompt_ListModules_FlagModuleTitle\":\"The title of the module to search for. This accepts wildcard (*) placeholders representing 0 or more characters. Searches are case-insensitive.\",\"Prompt_ListModules_FlagPage\":\"Page number to show records.\",\"Prompt_ListModules_FlagPageId\":\"When specified, the command will show modules from specified page only. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_ListModules_ResultHtml\":\"

List Modules in the Current Portal

\\r\\n list-modules\\r\\n\\r\\n

List Modules on Specific Page

\\r\\n list-modules 72\\r\\n\\r\\n

List Modules Filtered by Module Name

\\r\\n

This will return all XMod and XMod Pro modules in the current portal

\\r\\n list-modules --name XMod*\\r\\n\\r\\n

List Modules on a Specific Page Filtered by Module Name

\\r\\n

This will return all XMod and XMod Pro modules on the page with a Page/TabId of 72

\\r\\n list-modules 72 --name XMod*\\r\\n\\r\\n

List All Modules Filtered on Name and Title

\\r\\n

This will return all modules in the portal whose Module Name starts with Site and Title starts with Configure.

\\r\\n list-modules --title Configure* --name Site*\\r\\n

Returns

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleIdTitleModuleNameFriendlyNameModuleDefIdTabModuleIdAddedToPages
394Configure portal settings, page design and apply a template...SiteWizardSite Wizard888664
395Configure the sitemap for submission to common search enginesSitemapSitemap1068765
\\r\\n\\r\\n

List All Deleted Modules in Portal

\\r\\n

This will return all modules in the DNN Recycle Bin

\\r\\n list-modules --deleted\\r\\n

Returns

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleIdTitlePaneModuleNameFriendlyNameModuleDefIdTabModuleIdIsDeletedTabId
358Home BannerContentPaneDNN_HTMLHTML120106true74
410Module that was copiedContentPaneDNN_HTMLHTML120104true71
\\r\\n\\r\\n

List All Deleted Modules Filtered on Name and Title

\\r\\n

This will return all modules in the DNN Recycle Bin whose Module Name ends with "HTML" and whose Module Title contains "that"

\\r\\n list-modules --deleted --name *HTML --title *that*\\r\\n

Returns

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleIdTitlePaneModuleNameFriendlyNameModuleDefIdTabModuleIdIsDeletedTabId
410Module that was copiedContentPaneDNN_HTMLHTML120104true71
\",\"Prompt_MoveModule_Description\":\"Moves a module to the specified page\",\"Prompt_MoveModule_FlagId\":\"Explicitly specifies the Module ID of the module to copy. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_MoveModule_FlagPageId\":\"The Page ID of the page that contains the module you want to copy.\",\"Prompt_MoveModule_FlagPane\":\"Specify the pane in which the module should be moved. If not provided, module would be moved to ContentPane.\",\"Prompt_MoveModule_FlagToPageId\":\"The Page ID of the target page. The page to which you want to copy the module.\",\"Prompt_MoveModule_ResultHtml\":\"

Move a Module from One Page to Another

\\r\\n

This command the module with Module ID 358 on the Page with Page ID of 71 and places module on the page with a Page ID of 75

\\r\\n move-module 358 --pageid 71 --topageid 75\\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleId:358
Title:My Module
ModuleName:DNN_HTML
FriendlyName:HTML
ModuleDefId:120
TabModuleId:107
AddedToPages:71, 75
Successfully copied the module.
\",\"Prompt_ClearCache_Description\":\"Clears the server's cache and reloads the page.\",\"Prompt_ClearCache_ResultHtml\":\" \\r\\n clear-cache\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n
Cache cleared
Reloading in 3 seconds
\",\"Prompt_ClearHistory_Description\":\"Clears history of commands used in current session\",\"Prompt_ClearLog_Description\":\"Clears the Event Log for the current portal.\",\"Prompt_ClearLog_ResultHtml\":\"\\r\\n clear-log\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n
[Event Log Cleared]
\",\"Prompt_Cls_Description\":\"Clears the Prompt console. cls is a shortcut for clear-screen\",\"Prompt_Echo_Description\":\"Echos back the first argument received\",\"Prompt_Exit_Description\":\"Exits the Prompt console.\",\"Prompt_GetHost_Description\":\"Retrieves information about the DNN installation\",\"Prompt_GetHost_ResultHtml\":\"

Get Information on Current DNN Installation

\\r\\n \\r\\n get-host\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
Product:DNN Platform
Version:9.0.0.1002
UpgradeAvailable:true
Framework:4.6
IP Address:fe80::a952:8263:d357:ab90%5
Permissions:ReflectionPermission, WebPermission, AspNetHostingPermission
Site:dnnprompt.com
Title:DNN Corp
Url:http://www.dnnsoftware.com
Email:support@dnnprompt.com
Theme:Gravity (2-Col)
Container:Gravity (Title_h2)
EditTheme:Gravity (2-Col)
EditContainer:Gravity (Title_h2)
PortalCount:1
\",\"Prompt_GetPortal_Description\":\"Retrieves basic information about the current portal or specified portal\",\"Prompt_GetPortal_FlagId\":\"Portal Id to get info. Only host can get information of portals other than current.\",\"Prompt_GetPortal_ResultHtml\":\"

Get Information on Current Portal

\\r\\n \\r\\n get-portal\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
PortalId:0
PortalName:dnnsoftware.com
CdfVersion:-1
RegistrationMode:Verified
DefaultPortalAlias:dnnsoftware.com
PageCount:34
UserCount:5
SiteTheme:Xcillion (Inner)
AdminTheme:Xcillion (Admin)
Container:Xcillion (NoTitle)
AdminContainer:Xcillion (Title_h2)
Language:en-US
\",\"Prompt_GetSite_Description\":\"Retrieves basic information about the current portal or specified portal\",\"Prompt_GetSite_FlagId\":\"Site Id to get info. Only host can get information of portals other than current.\",\"Prompt_GetSite_ResultHtml\":\"

Get Information on Current Portal

\\r\\n \\r\\n get-portal\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
PortalId:0
PortalName:dnnsoftware.com
CdfVersion:-1
RegistrationMode:Verified
DefaultPortalAlias:dnnsoftware.com
PageCount:34
UserCount:5
SiteTheme:Xcillion (Inner)
AdminTheme:Xcillion (Admin)
Container:Xcillion (NoTitle)
AdminContainer:Xcillion (Title_h2)
Language:en-US
\",\"Prompt_ListCommands_Description\":\"Lists all the commands.\",\"Prompt_ListPortals_Description\":\"Retrieves a list of portals for the current DNN Installation\",\"Prompt_ListSites_Description\":\"Retrieves a list of portals for the current DNN Installation\",\"Prompt_Reload_Description\":\"Reloads the current page\",\"Prompt_PagingMessage\":\"Page {0} of {1}.\",\"Prompt_PagingMessageWithLoad\":\"Page {0} of {1}. Press any key to load next page. Press CTRL + X to end.\",\"Help_Default\":\"Default\",\"Help_Description\":\"Description\",\"Help_Flag\":\"Flag\",\"Help_Options\":\"Options\",\"Help_Required\":\"Required\",\"Help_Type\":\"Type\",\"PromptGreeting\":\"Prompt {0} Type \\\\'help\\\\' to get a list of commands\",\"ReloadingText\":\"Reloading in 3 seconds\",\"SessionHisotryCleared\":\"Session command history cleared.\",\"Prompt_GeneralCategory\":\"General Commands\",\"Prompt_HostCategory\":\"Host Commands\",\"Prompt_ModulesCategory\":\"Module Commands\",\"Prompt_PortalCategory\":\"Portal Commands\",\"Prompt_Help_Command\":\"Command\",\"Prompt_Help_Commands\":\"Commands\",\"Prompt_Help_Description\":\"Description\",\"Prompt_Help_Learn\":\"Learning Prompt Commands\",\"Prompt_Help_ListOfAvailableMsg\":\"Here is a list of available commands for Prompt.\",\"Prompt_Help_PromptCommands\":\"Prompt Commands\",\"Prompt_Help_SeeAlso\":\"See Also\",\"Prompt_Help_Syntax\":\"Overview/Basic Syntax\",\"Prompt_ClearCache_Error\":\"An error occurred while attempting to clear the cache.\",\"Prompt_ClearCache_Success\":\"Cache Cleared.\",\"Prompt_ClearLog_Error\":\"An error occurred while attempting to clear the Event Log.\",\"Prompt_ClearLog_Success\":\"Event Log Cleared.\",\"Prompt_Echo_Nothing\":\"Nothing to echo back\",\"Prompt_Echo_ResultHtml\":\"

\",\"Prompt_FlagIsRequired\":\"'[0]' is required.\",\"Prompt_GetHost_Unauthorized\":\"You do not have authorization to access this functionality.\",\"Prompt_GetHost__NoArgs\":\"The get-host command does not take any arguments or flags.\",\"Prompt_GetPortal_NoArgs\":\"The get-portal command does not take any arguments or flags.\",\"Prompt_GetPortal_NotFound\":\"Could not find a portal with ID of '{0}'\",\"Prompt_ListCommands_Error\":\"An error occurred while attempting to list the commands.\",\"Prompt_ListCommands_Found\":\"Found {0} commands.\",\"Prompt_ListCommands_H_Description\":\"Description\",\"Prompt_ListCommands_H_Name\":\"Name\",\"Prompt_ListCommands_H_Version\":\"Version\",\"Prompt_ListCommands__H_Category\":\"Category\",\"Prompt_ListPortals_NoArgs\":\"The list-portal command does not take any arguments or flags\",\"Prompt_SetMode_Description\":\"Sets the DNN View Mode. This has the same effect as clicking the appropriate options in the DNN Control Bar.\",\"Prompt_SetMode_FlagMode\":\"One of three view modes: edit, layout, or view. You do not need to specify\\r\\n the --mode flag explicitly. Simply type one of the view mode values after the command.\",\"Prompt_SetMode_ResultHtml\":\"
\\r\\n

Change the DNN View Mode

\\r\\n \\r\\n set-mode layout\\r\\n OR\\r\\n \\r\\n set-mode view\\r\\n OR\\r\\n \\r\\n set-mode edit\\r\\n \\r\\n
\",\"Prompt_UserRestart_Error\":\"An error occurred while attempting to restart the application.\",\"Prompt_UserRestart_Success\":\"Application Restarted\",\"Prompt_CopyModule_ResultHtml\":\"

Copy a Module from One Page to Another

\\r\\n

This command makes a copy of the module with Module ID 358 on the Page with Page ID of 71 and places that copy on the page with a Page ID of 75

\\r\\n copy-module 358 --pageid 71 --topageid 75\\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleId:358
Title:My Module
ModuleName:DNN_HTML
FriendlyName:HTML
ModuleDefId:120
TabModuleId:107
AddedToPages:71, 75
Successfully copied the module.
\",\"Prompt_ListCommands_ResultHtml\":\"

\",\"Prompt_ListPortals_ResultHtml\":\"

\",\"Prompt_ListSites_ResultHtml\":\"

\",\"Prompt_RestartApplication_ResultHtml\":\"

Results

\\r\\n \\r\\n \\r\\n \\r\\n
Application restarted
Reloading in 3 seconds
\"},\"EvoqRecyclebin\":{\"nav_Recyclebin\":\"Recycle Bin\",\"recyclebin_Actions\":\"Actions\",\"recyclebin_CancelConfirm\":\"No\",\"recyclebin_Delete\":\"Delete\",\"recyclebin_DeleteConfirm\":\"Yes\",\"recyclebin_DeletedDate\":\"Date\",\"recyclebin_EmptyRecycleBin\":\"Empty Recycle Bin\",\"recyclebin_EmptyRecycleBinConfirm\":\"Do you want to empty all files in the recycle bin?\",\"recyclebin_Modules\":\"Modules\",\"recyclebin_Users\":\"Users\",\"recyclebin_NoUsers\":\"No Users In Recycle Bin\",\"recyclebin_ModuleTitle\":\"Module Title\",\"recyclebin_Username\":\"Username\",\"Service_RestoreUserError\":\"Error restoring user.\",\"Service_RemoveUserError\":\"Error removing user has occurred:
{0}\",\"recyclebin_RestoreUserConfirm\":\"

Please confirm you wish to restore this user.

\",\"recyclebin_RestoreUsersConfirm\":\"

Please confirm you wish to restore selected users.

\",\"recyclebin_RemoveUserConfirm\":\"

Please confirm you wish to delete this user.

\",\"recyclebin_RemoveUsersConfirm\":\"

Please confirm you wish to delete selected users.

\",\"recyclebin_UserDisplayName\":\"Display Name\",\"recyclebin_NoConfirm\":\"No\",\"recyclebin_NoItems\":\"The recycle bin is currently empty\",\"recyclebin_NoModules\":\"No Modules In Recycle Bin\",\"recyclebin_NoPages\":\"No Pages In Recycle Bin\",\"recyclebin_NoTemplates\":\"No Templates In Recycle Bin\",\"recyclebin_Page\":\"Page\",\"recyclebin_Pages\":\"Pages\",\"recyclebin_RemoveModuleConfirm\":\"

Please confirm you wish to delete this module.

\",\"recyclebin_RemoveModulesConfirm\":\"

Please confirm you wish to delete selected modules.

\",\"recyclebin_RemovePageConfirm\":\"

Please confirm you wish to delete this page.

\",\"recyclebin_RemovePagesConfirm\":\"

Please confirm you wish to delete selected pages.

\",\"recyclebin_Restore\":\"Restore\",\"recyclebin_RestoreModuleConfirm\":\"

Please confirm you wish to restore this module.

\",\"recyclebin_RestoreModulesConfirm\":\"

Please confirm you wish to restore selected modules.

\",\"recyclebin_RestorePageConfirm\":\"

Please confirm you wish to restore this page.

\",\"recyclebin_RestorePageInvalid\":\"You need restore this page's parent at first.\",\"recyclebin_RestorePagesConfirm\":\"

Please confirm you wish to restore selected pages.

\",\"recyclebin_RestorePagesInvalid\":\"The page(s) you tried to restore should select their parent in same time.\",\"recyclebin_Title\":\"Recycle Bin\",\"recyclebin_UnableToSelectAllModules\":\"Cannot permanently delete or restore a module's who's page is in the Recycle Bin.\",\"recyclebin_YesConfirm\":\"Yes\",\"Service_RemoveTabError\":\"Page {0} cannot be deleted until its children have been deleted first.
\",\"Service_RemoveTabModuleError\":\"Error removing page has occurred:
{0}\",\"Service_RestoreModuleError\":\"Error restoring module {0} on page {1}. Page is deleted.\",\"Service_RestoreTabError\":\"Page {0} cannot be restored until its parent is restored first.
\",\"Service_RestoreTabModuleError\":\"Error restoring page has occurred:
{0}\",\"recyclebin_RemoveTemplateConfirm\":\"

Please confirm you wish to delete this template.

\",\"recyclebin_RemoveTemplatesConfirm\":\"

Please confirm you wish to delete selected templates.

\",\"recyclebin_RestoreTemplateConfirm\":\"

Please confirm you wish to restore this template.

\",\"recyclebin_RestoreTemplatesConfirm\":\"

Please confirm you wish to restore selected templates.

\",\"recyclebin_Template\":\"Template\",\"recyclebin_Templates\":\"Templates\"},\"Recyclebin\":{\"nav_Recyclebin\":\"Recycle Bin\",\"recyclebin_Actions\":\"Actions\",\"recyclebin_CancelConfirm\":\"No\",\"recyclebin_Delete\":\"Delete\",\"recyclebin_DeleteConfirm\":\"Yes\",\"recyclebin_DeletedDate\":\"Date\",\"recyclebin_EmptyRecycleBin\":\"Empty Recycle Bin\",\"recyclebin_EmptyRecycleBinConfirm\":\"Do you want to empty all files in the recycle bin?\",\"recyclebin_Modules\":\"Modules\",\"recyclebin_Users\":\"Users\",\"recyclebin_ModuleTitle\":\"Module Title\",\"recyclebin_Username\":\"Username\",\"recyclebin_UserDisplayName\":\"Display Name\",\"recyclebin_NoConfirm\":\"No\",\"recyclebin_NoItems\":\"The recycle bin is currently empty\",\"recyclebin_NoModules\":\"No Modules In Recycle Bin\",\"recyclebin_NoPages\":\"No Pages In Recycle Bin\",\"recyclebin_NoUsers\":\"No Users In Recycle Bin\",\"recyclebin_Page\":\"Page\",\"recyclebin_Pages\":\"Pages\",\"recyclebin_RemoveModuleConfirm\":\"

Please confirm you wish to delete this module.

\",\"recyclebin_RemoveModulesConfirm\":\"

Please confirm you wish to delete selected modules.

\",\"recyclebin_RemovePageConfirm\":\"

Please confirm you wish to delete this page.

\",\"recyclebin_RemovePagesConfirm\":\"

Please confirm you wish to delete selected pages.

\",\"recyclebin_Restore\":\"Restore\",\"recyclebin_RestoreModuleConfirm\":\"

Please confirm you wish to restore this module.

\",\"recyclebin_RestoreModulesConfirm\":\"

Please confirm you wish to restore selected modules.

\",\"recyclebin_RestorePageConfirm\":\"

Please confirm you wish to restore this page.

\",\"recyclebin_RestorePageInvalid\":\"You need to restore this page's parent first.\",\"recyclebin_RestorePagesConfirm\":\"

Please confirm you wish to restore selected pages.

\",\"recyclebin_RestorePagesInvalid\":\"The page(s) you tried to restore should select their parent in same time.\",\"recyclebin_RestoreUserConfirm\":\"

Please confirm you wish to restore this user.

\",\"recyclebin_RestoreUsersConfirm\":\"

Please confirm you wish to restore selected users.

\",\"recyclebin_RemoveUserConfirm\":\"

Please confirm you wish to delete this user.

\",\"recyclebin_RemoveUsersConfirm\":\"

Please confirm you wish to delete selected users.

\",\"recyclebin_Title\":\"Recycle Bin\",\"recyclebin_UnableToSelectAllModules\":\"Cannot permanently delete or restore a module's who's page is in the Recycle Bin.\",\"recyclebin_YesConfirm\":\"Yes\",\"Service_RemoveTabError\":\"Error removing page has occurred:{0}\",\"Service_RemoveTabModuleError\":\"Error removing page modules has occurred:{0}\",\"Service_RemoveUserError\":\"Error removing user has occurred:{0}\",\"Service_RestoreModuleError\":\"Error restoring module {0} on page {1}. Page is deleted.\",\"Service_RestoreTabError\":\"Page {0} cannot be restored until its parent is restored first.\",\"Service_RestoreTabModuleError\":\"Error restoring page has occurred:{0}\",\"Service_EmptyRecycleBinError\":\"Some of the items were not deleted.\",\"Service_RestoreUserError\":\"Error restoring user.\",\"CanNotDeleteModule\":\"You do not have permissions to delete module with id \\\"{0}\\\".\",\"ModuleNotSoftDeleted\":\"Module with id \\\"{0}\\\" is not soft deleted.\",\"Prompt_FlagNotInt\":\"--{0} must be an integer\\\\n\",\"Prompt_FlagNotPositiveInt\":\"--{0} must be greater than 0\\\\n\",\"Prompt_MainParamRequired\":\"The {0} is required. Please use the --{1} flag or pass it as the first argument after the command name\\\\n\",\"ModuleNotFound\":\"Module with id \\\"{0}\\\" not found.\",\"Prompt_ModulePurgedSuccessfully\":\"Module with id \\\"{0}\\\" purged successfully.\",\"Service_RemoveTabWithChildError\":\"Page {0} cannot be deleted until its children have been deleted first.\",\"Prompt_FlagRequired\":\"--{0} is required\\\\n\",\"Prompt_ModuleRestoredSuccessfully\":\"Module with id \\\"{0}\\\" restored successfully.\",\"CanNotDeleteTab\":\"You do not have permissions to delete page with id \\\"{0}\\\".\",\"PageNotFound\":\"Page with id \\\"{0}\\\" not found.>br/>\",\"Prompt_PagePurgedSuccessfully\":\"Page with id \\\"{0}\\\" purged successfully.\",\"Prompt_PageRestoredSuccessfully\":\"Page with id \\\"{0}\\\" and name \\\"{1}\\\" restored successfully.\",\"TabNotSoftDeleted\":\"Page with id \\\"{0}\\\" is not soft deleted.\",\"PageNotFoundWithName\":\"Page with name \\\"{0}\\\" not found.>br/>\",\"Prompt_RestorePageNoParams\":\"You must specify either a Page ID or Page Name.\",\"UserNotFound\":\"User with id \\\"{0}\\\" not found.\",\"Prompt_PurgeModule_Description\":\"Permanently deletes a module. The module should be soft deleted first.\",\"Prompt_PurgeModule_FlagId\":\"Explicitly specifies the Module ID of the module to delete permanently. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_PurgeModule_FlagPageId\":\"Explicitly specifies the Page Id on which the module was added originally.\",\"Prompt_PurgeModule_ResultHtml\":\"

Purge a Specific Module

\\r\\n

The code below purges the module whose Module ID is 359

\\r\\n purge-module 359 --pageid 20\\r\\n\\r\\n

Results

\\r\\n Module with id \\\"359\\\" purged successfully.\",\"Prompt_PurgePage_Description\":\"Permanently deletes a page from the portal that had previously been deleted and sent to DNN's Recycle Bin.\",\"Prompt_PurgePage_FlagDeleteChildren\":\"Specifies that if a page has children, should the command delete them all or show error.\",\"Prompt_PurgePage_FlagId\":\"Explicitly specifies the Page ID to purge. Use of the flag name is not required. You can simply provide the ID value as the first argument.\",\"Prompt_PurgePage_ResultHtml\":\"
\\r\\n

Purge a Deleted Page By Page ID

\\r\\n \\r\\n purge-page 999\\r\\n \\r\\n OR\\r\\n \\r\\n purge-page --id 999\\r\\n \\r\\n\\r\\n

Purge a Deleted Page and All It's Child Pages

\\r\\n \\r\\n purge-page --id 999 --deletechildren true\\r\\n \\r\\n
\",\"Prompt_PurgeUser_Description\":\"Permanently deletes the specified user from the portal. The user must be deleted already. If you issue a get-user command and the IsDeleted property isn't true, then you will get an error when attempting this command. You must use the delete-user command on the user first.\",\"Prompt_PurgeUser_FlagId\":\"The user's User ID. If the flag is not used, then the user's ID must be the first argument.\",\"Prompt_PurgeUser_ResultHtml\":\"

Permanently Delete a User

\\r\\n

Permanently delete's the user with a User ID of 345. If you issue the command: get-user 345 you will receive a 'user not found' message.

\\r\\n purge-user 345\\r\\n

This is the more explicit form of the above code.

\\r\\n purge-user --id 345\",\"Prompt_RestoreModule_Description\":\"Restores a module from the DNN Recycle Bin.\",\"Prompt_RestoreModule_FlagId\":\"Explicitly specifies the Module ID of the module to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_RestoreModule_FlagPageId\":\"The Page ID of the page on which the module you want to restore resided prior to deletion.\",\"Prompt_RestoreModule_ResultHtml\":\"

Restore A Module from the Recycle Bin

\\r\\n restore-module 359 --pageid 71\\r\\n\\r\\n

Results

\\r\\n Module with id \\\"359\\\" restored successfully.\",\"Prompt_RestorePage_Description\":\"Restores a page from the DNN Recycle Bin.\",\"Prompt_RestorePage_FlagId\":\"Explicitly specifies the Page ID to delete. Use of the flag name is not required. You can simply provide the ID value as the first argument. Required if --parentid and --name are not specified.\",\"Prompt_RestorePage_FlagName\":\"Specifies the name (not title) of the page that should be restored. This can be combined with --parentid to target a page name with a specific Parent page. Required if --parentid and --name are not specified.\",\"Prompt_RestorePage_FlagParentId\":\"Required if you want to delete a page by name and page is child of some other page. In that case provide the id of the parent page.\",\"Prompt_RestorePage_ResultHtml\":\"
\\r\\n

Restore a Deleted Page By Page ID

\\r\\n \\r\\n restore-page 999\\r\\n \\r\\n OR\\r\\n \\r\\n restore-page --id 999\\r\\n \\r\\n\\r\\n

Restore a Page With A Specific Page Name

\\r\\n \\r\\n restore-page --name \\\"Page1\\\"\\r\\n \\r\\n\\r\\n

Restore a Page With A Specific Page Name and Parent

\\r\\n \\r\\n restore-page --name \\\"Page1\\\" --parentid 30\\r\\n \\r\\n
\",\"Prompt_RestoreUser_Description\":\"Recovers a user that has been deleted but not purged.\",\"Prompt_RestoreUser_FlagId\":\"The user's User ID. If the flag is not used, then the user's ID must be the first argument.\",\"Prompt_RestoreUser_ResultHtml\":\"

Recover a Deleted User

\\r\\n

Restores the user with a User ID of 345. If the user hasn't been deleted, you will receive a message indicating there is nothing to restore. If the user has already been purged (or 'removed' via DNN's user interface, you will receive a 'user not found' message.

\\r\\n restore-user 345\\r\\n

This is the more explicit form of the above code.

\\r\\n restore-user --id 345\",\"Prompt_RecylcleBinCategory\":\"Recycle Bin Commands\",\"UserRestored\":\"User restored successfully.\",\"Prompt_RestoreNotRequired\":\"User not deleted. Restore not required.\",\"Service_RemoveTabParentTabError\":\"Page {0} cannot be deleted until its children have been deleted first.\"},\"Roles\":{\"Create\":\"Create New Role\",\"DuplicateRole\":\"The Role Name Already Exists.\",\"nav_Roles\":\"Roles\",\"SearchPlaceHolder\":\"Search Roles by Keyword\",\"Actions.Header\":\"\",\"AllGroups\":\"[All Groups]\",\"Auto.Header\":\"Auto\",\"GlobalRolesGroup\":\"[Global Roles]\",\"GroupName.Header\":\"Group\",\"LoadMore\":\"Load More\",\"RoleName.Header\":\"Role Name\",\"Users.Header\":\"Users\",\"AutoAssignment\":\"Auto Assignment\",\"Cancel\":\"Cancel\",\"Delete\":\"Delete\",\"Description\":\"Description\",\"NewGroup\":\"New Group\",\"Public\":\"Public\",\"plRoleGroups\":\"Role Group\",\"Save\":\"Save\",\"DuplicateRoleGroup\":\"The Group Name Already Exists.\",\"GroupName.Required\":\"This is a require field.\",\"GroupName\":\"Group Name\",\"RoleName\":\"Role Name\",\"securityModeListLabel\":\"Security Mode\",\"statusListLabel\":\"Status\",\"DeleteRole.Confirm\":\"Are you sure you want to delete this role?\",\"NoData\":\"There are no roles in this role group.\",\"RoleName.Required\":\"This is a require field.\",\"UpdateGroup\":\"Update Group\",\"Add\":\"Add\",\"AddUserPlaceHolder\":\"Begin typing to add a user to this role\",\"Expires.Header\":\"Expires\",\"Members.Header\":\"Members\",\"PageInfo\":\"Page {0} of {1}\",\"PageSummary\":\"Showing {0}-{1} of {2}\",\"Start.Header\":\"Start\",\"Users\":\"Users\",\"NoUsers\":\"There are no users in this role.\",\"Search\":\"Search\",\"DeleteUser.Confirm\":\"Are you sure you want to remove this user from the role?\",\"DeleteRoleGroup.Confirm\":\"Are you sure you want to delete this role group?\",\"Approved\":\"Approved\",\"Both\":\"Both\",\"Disabled\":\"Disabled\",\"Pending\":\"Pending\",\"SecurityRole\":\"Security Role\",\"SocialGroup\":\"Social Group\",\"AssignToExistUsers\":\"Assign to Existing Users\",\"ActionCancelled.Message\":\"Cancelled.\",\"AssignToExistUsers.Help\":\"Assign this role to all existing users.\",\"DeleteInconsistency.Error\":\"Inconsistency occurred. Please refresh the page and try again.\",\"DeleteRole.Error\":\"Failed to delete the role. Please try later\",\"DeleteRole.Message\":\"Role deleted successfully.\",\"DeleteRoleGroup.Error\":\"Failed to delete the role group. Please try later.\",\"DeleteRoleGroup.Message\":\"Role Group deleted successfully.\",\"Description.Help\":\"Enter a description of the role.\",\"lblNewGroup\":\"[New Group]\",\"plRoleGroups.Help\":\"Select the role group to which this role belongs.\",\"PublicRole.Help\":\"Check this box if users can subscribe to this role via the Manage Services page of their user account.\",\"RoleAdded.Error\":\"Failed to create the role. Please try later.\",\"RoleAdded.Message\":\"Role created successfully.\",\"RoleName.Help\":\"Enter the name of the role.\",\"RoleUpdated.Error\":\"Failed to update the role. Please try later.\",\"RoleUpdated.Message\":\"Role updated successfully.\",\"securityModeListLabel.Help\":\"Choose the security mode for this role/group.\",\"statusListLabel.Help\":\"Select the status for this role/group.\",\"RoleGroupUpdated.Error\":\"Failed to update the role group. Please try later.\",\"RoleGroupUpdated.Message\":\"Role Group updated successfully.\",\"AutoAssignment.Help\":\"Check this box if users are automatically assigned to this role.\",\"GroupDescription.Help\":\"Enter a description of the role group.\",\"GroupDescription\":\"Description\",\"GroupName.Help\":\"Enter a name of the role group.\",\"PermissionsByRole\":\"Users In Role\",\"SendEmail\":\"Send Email\",\"isOwner\":\"Is Owner\",\"InSufficientPermissions\":\"You do not have enough permissions to perform this action.\",\"UserNotFound\":\"User not found.\",\"InvalidRequest\":\"Invalid request.\",\"SecurityRoleDeleteNotAllowed\":\"System roles cannot be deleted.\",\"CannotAssginUserToUnApprovedRole\":\"Cannot assign user to an un-approved role.\",\"EditRole\":\"Edit Role\",\"UsersInRole\":\"Users in Role\",\"Prompt_ListRolesFailed\":\"Failed to list the roles.\",\"Prompt_NoRoles\":\"No roles found.\",\"Prompt_FlagEmpty\":\"--{0} cannot be empty.\",\"Prompt_InvalidRoleStatus\":\"Invalid value passed for --{0}. Expecting 'pending', 'approved', or 'disabled'\",\"Prompt_NoRoleWithId\":\"No role found with the ID {0}\",\"Prompt_NothingToUpdate\":\"Nothing to Update!\",\"Prompt_RoleIdIsRequired\":\"You must specify a valid Role ID as either the first argument or using the --id flag.\",\"Prompt_RoleIdNegative\":\"The RoleId value must be greater than zero (0)\",\"Prompt_RoleIdNotInt\":\"The RoleId must be integer.\",\"Prompt_RoleNameRequired\":\"You must specify a name for the role as the first argument or by using the --{0} flag. Names with spaces And special characters should be enclosed in double quotes.\",\"Prompt_UnableToParseBool\":\"Unable to parse the --{0} flag value '{1}'. Value should be True or False\",\"plRSVPCode\":\"RSVP Code\",\"plRSVPCode.Help\":\"Enter an RSVP Code for the role. Users can easily subscribe to this role by entering this code on the Manage Services page of their user account.\",\"plRSVPLink\":\"RSVP Link\",\"plRSVPLink.Help\":\"A link that allows users to subscribe to this role will be displayed when an RSVP Code is saved for this role.\",\"Prompt_DeleteRole_Description\":\"Permanently deletes the given DNN Security Role. You cannot delete the built-in DNN security roles of Administrator, RegisteredUser,\\r\\n Subscriber, or UnverifiedUser. WARNING: This is a permanent action and cannot be undone\",\"Prompt_DeleteRole_FlagId\":\"The ID of the security role to delete. This value is required. However, if you pass the id as the first argument after the command, you do not need to explicitly use the --id flag.\",\"Prompt_DeleteRole_ResultHtml\":\"

Permanently Delete A DNN Security Role

\\r\\n \\r\\n delete-role 11\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
Successfully deleted role 'Public' (11)
\",\"Prompt_GetRole_Description\":\"Retrieves the details of a given DNN Security Role.\",\"Prompt_GetRole_FlagId\":\"The ID of the security role. This value is required. However, if you pass the id as the first argument after the command, you do not need to explicitly use the --id flag.\",\"Prompt_GetRole_ResultHtml\":\"

Get A DNN Security Role

\\r\\n \\r\\n get-role 11\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
RoleId:11
RoleGroupId:-1
RoleName:Public
Description:Role for all users
IsPublic:true
AutoAssign:true
UserCount:5
CreatedDate:2016-12-31T14:53:44.033
CreatedBy:1
ModifiedDate:2017-01-02T08:07:39.233
ModifiedBy:1
1 role found
\",\"Prompt_ListRoles_Description\":\"Retrieves a list of DNN security roles for the portal.\",\"Prompt_ListRoles_FlagMax\":\"Page Size for the page. Max is 500.\",\"Prompt_ListRoles_FlagPage\":\"Page number to show records.\",\"Prompt_ListRoles_ResultHtml\":\"
\\r\\n

Get Information on Current Portal

\\r\\n \\r\\n list-roles\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
RoleIdRoleGroupIdRoleNameDescriptionIsPublicAutoAssignUserCountCreatedDate
0-1AdministratorsAdministrators of this Websitefalsefalse12016-12-01T06:03:11.35
5-1My New RoleA test rolefalsefalse02016-12-15T07:28:16.49
1-1Registered UsersRegistered Usersfalsetrue52016-12-01T06:03:11.357
2-1SubscribersA public role for site subscriptionstruetrue52016-12-01T06:03:11.39
3-1Translator (en-US)A role for English (United States) translatorsfalsefalse02016-12-01T06:03:11.39
4-1Unverified UsersUnverified Usersfalsefalse02016-12-01T06:03:11.393
\\r\\n
\",\"Prompt_NewRole_Description\":\"Creates a new DNN security role for the portal.\",\"Prompt_NewRole_FlagAutoAssign\":\"When true, this role will be automatically assigned to users of the site including existing users.\",\"Prompt_NewRole_FlagDescription\":\"A description of the role.\",\"Prompt_NewRole_FlagIsPublic\":\"When true, users will be able to see the role and assign themselves to the role.\",\"Prompt_NewRole_FlagRoleName\":\"The name of the security role. This value is required. However, if you pass the name as the first argument after the command, you do not need to explicitly use the --name flag.\",\"Prompt_NewRole_FlagStatus\":\"Status of the role. Possible values are \\\"approved\\\", \\\"pending\\\" and \\\"disabled\\\".\",\"Prompt_NewRole_ResultHtml\":\"

Create A New DNN Security Role (Minimum Syntax)

\\r\\n \\r\\n new-role Role1\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
RoleId:9
RoleGroupId:-1
RoleName:Role1
Description:
IsPublic:false
AutoAssign:false
UserCount:0
CreatedDate:2016-12-31T14:53:44.033
Role successfully created.
\\r\\n\\r\\n\\r\\n

Create A New DNN Security Role

\\r\\n \\r\\n new-role \\\"General Public\\\" --description \\\"Role for all users\\\" --public true --autoassign true\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
RoleId:10
RoleGroupId:-1
RoleName:General Public
Description:Role for all users
IsPublic:true
AutoAssign:true
UserCount:5
CreatedDate:2016-12-31T15:06:02.563
Role successfully created.
\",\"Prompt_SetRole_Description\":\"Sets or updates properties of a DNN Security Role. Only properties you specify will be updated on the role.\",\"Prompt_SetRole_FlagAutoAssign\":\"When true, this role will be automatically assigned to users of the site including existing users.\",\"Prompt_SetRole_FlagDescription\":\"A description of the role.\",\"Prompt_SetRole_FlagId\":\"The ID of the security role. This value is required. However, if you pass the id as the first argument after the command, you do not need to explicitly use the --id flag.\",\"Prompt_SetRole_FlagIsPublic\":\"When true, users will be able to see the role and assign themselves to the role.\",\"Prompt_SetRole_FlagRoleName\":\"The name of the security role.\",\"Prompt_SetRole_FlagStatus\":\"Status of the role. Possible values are \\\"approved\\\", \\\"pending\\\" and \\\"disabled\\\".\",\"Prompt_SetRole_ResultHtml\":\"

Update A DNN Security Role

\\r\\n \\r\\n set-role 10 --name Public\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
RoleId:10
RoleGroupId:-1
RoleName:Public
Description:Role for all users
IsPublic:true
AutoAssign:true
UserCount:5
CreatedDate:2016-12-31T14:53:44.033
Role successfully created.
\",\"Prompt_RolesCategory\":\"Role Commands\"},\"Security\":{\"nav_Security\":\"Security\",\"cmdAdd\":\"Add New Filter\",\"cmdCancel\":\"Cancel Edit\",\"Delete\":\"Delete Filter\",\"Edit\":\"Edit Filter\",\"saveRule\":\"Update Filter\",\"Actions.Header\":\"Actions\",\"IPFilter.Header\":\"IP Filter\",\"AllowIP\":\"Allow\",\"DenyIP\":\"Deny\",\"CannotDelete\":\"You cannot delete that rule, as it would cause the current IP address to be locked out.\",\"TabLoginSettings\":\"Login Settings\",\"TabMoreSecuritySettings\":\"MORE SECURITY SETTINGS\",\"TabMore\":\"More\",\"TabSecurityBulletins\":\"Security Bulletins\",\"TabSecurityAnalyzer\":\"Security Analyzer\",\"TabSslSettings\":\"SSL SETTINGS\",\"TabMemberAccounts\":\"Member Accounts\",\"TabBasicLoginSettings\":\"BASIC LOGIN SETTINGS\",\"TabMemberSettings\":\"MEMBER MANAGEMENT\",\"TabRegistrationSettings\":\"REGISTRATION SETTINGS\",\"TabIpFilters\":\"LOGIN IP FILTERS\",\"DefaultAuthProvider\":\"Default Authentication Provider\",\"DefaultAuthProvider.Help\":\"You can select a default authentication provider for user login. Only providers that support forms authentication can be selected.\",\"plAdministrator\":\"Primary Administrator\",\"plAdministrator.Help\":\"The Primary Administrator who will receive email notification of member activities.\",\"Redirect_AfterLogin.Help\":\"Optionally select the page that users will be redirected to upon successful login.\",\"Redirect_AfterLogin\":\"Redirect After Login\",\"Redirect_AfterLogout.Help\":\"Optionally select the page that users will be redirected to upon logout.\",\"Redirect_AfterLogout\":\"Redirect After Logout\",\"Security_RequireValidProfileAtLogin.Help\":\"Check this box to require users to update their profile prior to login if the fields required for a valid profile have been modified.\",\"Security_RequireValidProfileAtLogin\":\"Require a valid Profile for Login\",\"Security_CaptchaLogin.Help\":\"Check this box to use CAPTCHA for associating logins. E.g. OpenID, LiveID, CardSpace\",\"Security_CaptchaLogin\":\"Use CAPTCHA for Associating Logins\",\"Security_CaptchaRetrivePassword.Help\":\"Check this box to use CAPTCHA when retrieving passwords.\",\"Security_CaptchaRetrivePassword\":\"Use CAPTCHA to Retrieve Password\",\"Security_CaptchaChangePassword.Help\":\"Check this box to use CAPTCHA to change passwords.\",\"Security_CaptchaChangePassword\":\"Use CAPTCHA to Change Password\",\"plHideLoginControl.Help\":\"Check this box to hide the login link in page.\",\"plHideLoginControl\":\"Hide Login Control\",\"BasicLoginSettingsUpdateSuccess\":\"Login settings have been updated.\",\"BasicLoginSettingsError\":\"Could not update login settings. Please try later.\",\"Save\":\"Save\",\"Cancel\":\"Cancel\",\"FilterType.Header\":\"FILTER TYPE\",\"IpAddress.Header\":\"IP ADDRESS\",\"DeleteSuccess\":\"The IP filter has been deleted.\",\"DeleteError\":\"Could not delete the IP filter. Please try later.\",\"IpFilterDeletedWarning\":\"Are you sure you want to delete this IP filter?\",\"Yes\":\"Yes\",\"No\":\"No\",\"plRuleSpecifity.Help\":\"Determines whether the rule applies to a single IP address or a range of IP addresses.\",\"plRuleSpecifity\":\"Rule Specificity\",\"plRuleType.Help\":\"Determines whether this rule allows or denies access.\",\"plRuleType\":\"Rule Type\",\"SingleIP\":\"Single IP\",\"IPRange\":\"IP Range\",\"plFirstIP\":\"First IP\",\"plFirstIP.Help\":\"This will either be the single IP to filter, or else will be used with the subnet mask to calculate a range of IP addresses.\",\"plSubnet\":\"Mask\",\"plSubnet.Help\":\"The subnet mask will be combined with the first IP address to calculate a range of IP addresses for filtering.\",\"IpFilterUpdateSuccess\":\"The IP filter has been updated.\",\"IpFilterUpdateError\":\"Could not update the IP filter. Please try later.\",\"IPFiltersDisabled\":\"Login IP filtering is current disabled. Enable IP address checking under Member Accounts to activate\",\"IPValidation.ErrorMessage\":\"Please use a valid IP address/mask.\",\"LoginSettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"SslSettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"plResetLinkValidity\":\"Reset Link Timeout (in Minutes)\",\"plResetLinkValidity.Help\":\"Password reset links are only valid for (in minutes).\",\"plAdminResetLinkValidity\":\"Administrator Reset Link Timeout (in Minutes)\",\"plAdminResetLinkValidity.Help\":\"Time in minutes that password reset links sent by the Site Administrator will be valid for.\",\"plEnablePasswordHistory.Help\":\"Sets whether a list of recently used passwords is maintained and checked to prevent re-use.\",\"plEnablePasswordHistory\":\"Enable Password History\",\"plNumberPasswords\":\"Number of Passwords to Store\",\"plNumberPasswords.Help\":\"Enter the number of passwords to store for reuse check\",\"plPasswordDays\":\"Number of Days Before Password Reuse\",\"plPasswordDays.Help\":\"Enter the length of time, in days, that must pass before a password can be reused\",\"plEnableBannedList\":\"Enable Password Banned List\",\"plEnableBannedList.Help\":\"Check this box to check passwords against a list of banned items.\",\"plEnableStrengthMeter\":\"Enable Password Strength Checking\",\"plEnableStrengthMeter.Help\":\"Sets whether the password strength meter is shown on registration screen\",\"plEnableIPChecking\":\"Enable IP Address Checking\",\"plEnableIPChecking.Help\":\"Sets whether IP address is checked during login\",\"PasswordConfig_PasswordExpiry.Help\":\"Enter the number of days before a user must change their password. Enter 0 (zero) if the password should never expire.\",\"PasswordConfig_PasswordExpiry\":\"Password Expiry (in Days)\",\"PasswordConfig_PasswordExpiryReminder.Help\":\"Enter the number of days warning users will receive that their password is about to expires.\",\"PasswordConfig_PasswordExpiryReminder\":\"Password Expiry Reminder (in Days)\",\"MemberSettingsUpdateSuccess\":\"The member settings has been updated.\",\"MemberSettingsError\":\"Could not update the member settings. Please try later.\",\"SslSettingsUpdateSuccess\":\"The SSL settings has been updated.\",\"SslSettingsError\":\"Could not update the SSL settings. Please try later.\",\"MemberSettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"MembershipResetLinkValidity.ErrorMessage\":\"Reset link timeouts must be an integer greater than 0 and less than 10000\",\"AdminMembershipResetLinkValidity.ErrorMessage\":\"Administrator reset link timeouts must be an integer greater than 0 and less than 10000.\",\"MembershipNumberPasswords.ErrorMessage\":\"Number of passwords to store must be an integer greater than or equal to 0 and less than 10000.\",\"MembershipDaysBeforePasswordReuse.ErrorMessage\":\"Number of Days Before Password Reuse must be an integer greater than or equal to 0 and less than 10000.\",\"AutoAccountUnlockDuration.ErrorMessage\":\"Auto account unlock duration must be an integer greater than or equal to 0 and less than 1000.\",\"AsyncTimeout.ErrorMessage\":\"Time before timeout must be an integer greater than or equal to 90 and less than 10000.\",\"PasswordExpiry.ErrorMessage\":\"Password expiry must be an integer greater than or equal to 0 and less than 10000.\",\"PasswordExpiryReminder.ErrorMessage\":\"Password expiry reminder must be an integer greater than or equal to 0 and less than 10000.\",\"None\":\"None\",\"Private\":\"Private\",\"Public\":\"Public\",\"Verified\":\"Verified\",\"Standard\":\"Standard\",\"Custom\":\"Custom\",\"plUserRegistration\":\"User Registration\",\"plUserRegistration.Help\":\"Select the type of user registration, if any, allowed for this site. Private registration requires users to be authorized by the Site Administrator before gaining access to the Registered Users role. Public registration provides immediate access and Verified registration requires verification of the email address provided.\",\"NoEmail\":\"The \\\"Email\\\" field, at minimum, must be included.\",\"NoDisplayName\":\"You have selected the Require Unique Display Name option but you have not included the Display Name in the list of fields.\",\"ContainsDuplicateAddresses\":\"The user base of this site contains duplicate email addresses. If you want to use email addresses as user names you must fix those entries first.\",\"registrationFormTypeLabel.Help\":\"Select the type of Registration Form that you want to use.\",\"registrationFormTypeLabel\":\"Registration Form Type\",\"Security_DisplayNameFormat.Help\":\"Optionally specify a format for display names. The format can include tokens for dynamic substitution such as [FIRSTNAME] [LASTNAME]. If a display name format is specified, the display name will no longer be editable through the user interface.\",\"Security_DisplayNameFormat\":\"Display Name Format\",\"Security_UserNameValidation.Help\":\"Add your own Validation Expression, which is used to check the validity of the user name provided. If you change this from the default you should update the message that a user would see when they enter an invalid user name using the localization editor in Settings - Site Settings - Languages.\",\"Security_UserNameValidation\":\"User Name Validation\",\"Security_EmailValidation.Help\":\"Optionally modify the Email Validation Expression which is used to check the validity of the email address provided.\",\"Security_EmailValidation\":\"Email Address Validation\",\"Registration_ExcludeTerms.Help\":\"You can define a comma-delimited list of terms that a user cannot use in their user name or display name.\",\"Registration_ExcludeTerms\":\"Excluded Terms\",\"Redirect_AfterRegistration.Help\":\"Optionally select the page that users will be redirected to upon successful registration.\",\"Redirect_AfterRegistration\":\"Redirect After Registration\",\"plEnableRegisterNotification.Help\":\"Check this box to send email notification of new user registrations to the Primary Administrator.\",\"plEnableRegisterNotification\":\"Receive User Registration Notification\",\"Registration_UseAuthProviders.Help\":\"Select this option to use authentication providers during registration. Note that not all providers support this option.\",\"Registration_UseAuthProviders\":\"Use Authentication Providers\",\"Registration_UseProfanityFilter.Help\":\"Check this box to enforce the profanity filter for the user name and display name fields during registration.\",\"Registration_UseProfanityFilter\":\"Use Profanity Filter\",\"Registration_UseEmailAsUserName.Help\":\"Check this box to use the email address as the user name. If this option is enabled then the user name entry field will not be shown in the registration form.\",\"Registration_UseEmailAsUserName\":\"Use Email Address as Username\",\"Registration_RequireUniqueDisplayName.Help\":\"Optionally require users to use a unique display name. If a user chooses a name that already exists then a modified name will be suggested.\",\"Registration_RequireUniqueDisplayName\":\"Require Unique Display Name\",\"Registration_RandomPassword.Help\":\"Check this box to generate random passwords during registration, rather than displaying a password entry field.\",\"Registration_RandomPassword\":\"Use Random Password\",\"Registration_RequireConfirmPassword.Help\":\"Check this box to display a password confirmation box on the registration form.\",\"Registration_RequireConfirmPassword\":\"Require Password Confirmation\",\"Security_RequireValidProfile.Help\":\"Check this box if users must complete all required fields including the User Name, First Name, Last Name, Display Name, Email Address and Password fields during registration.\",\"Security_RequireValidProfile\":\"Require a Valid Profile for Registration\",\"Security_CaptchaRegister.Help\":\"Indicate whether this site should use CAPTCHA for registration.\",\"Security_CaptchaRegister\":\"Use CAPTCHA for Registration\",\"RequiresUniqueEmail.Help\":\"Check this box to require each user to provide a unique email address. This prevents users from registering multiple times with the same email address.\",\"RequiresUniqueEmail\":\"Requires Unique Email\",\"PasswordFormat.Help\":\"The password format.\",\"PasswordFormat\":\"Password Format\",\"PasswordRetrievalEnabled.Help\":\"Indicates whether users can retrieve their password.\",\"PasswordRetrievalEnabled\":\"Password Retrieval Enabled\",\"PasswordResetEnabledTitle.Help\":\"Indicates whether or not a user can request their password to be reset. This can only be changed in web.config file.\",\"PasswordResetEnabledTitle\":\"Password Reset Enabled\",\"MinNonAlphanumericCharactersTitle.Help\":\"Indicates the minimum number of special characters in the password. This can only be changed in web.config file.\",\"MinNonAlphanumericCharactersTitle\":\"Min Non Alphanumeric Characters\",\"RequiresQuestionAndAnswerTitle.Help\":\"Indicates whether a question and answer system is used as part of the registration process. Can only be changed in web.config file.\",\"RequiresQuestionAndAnswerTitle\":\"Requires Question and Answer\",\"PasswordStrengthRegularExpressionTitle.Help\":\"The regular expression used to evaluate password complexity from the provider specified in the Provider property. This can only be changed in web.config file by adding/altering the passwordStrengthRegularExpression node of AspNetSqlMembershipProvider. Note: this server validation is different from the password strength meter introduced in 7.1.0 which only advises on password strength, whereas this expression is a requirement for new passwords (if it is defined).\",\"PasswordStrengthRegularExpressionTitle\":\"Password Strength Regular Expression\",\"MaxInvalidPasswordAttemptsTitle.Help\":\"Indicates the number of times the wrong password can be entered before account is locked. This can only be changed in web.config file.\",\"MaxInvalidPasswordAttemptsTitle\":\"Max Invalid Password Attempts\",\"PasswordAttemptWindowTitle.Help\":\"Indicates the length of time an account is locked after failed login attempts. Can only be changed in web.config file.\",\"PasswordAttemptWindowTitle\":\"Password Attempt Window\",\"RegistrationSettingsUpdateSuccess\":\"The registration settings has been updated.\",\"RegistrationSettingsError\":\"Could not update the registration settings. Please try later.\",\"RegistrationSettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"registrationFieldsLabel.Help\":\"You can specify the list of fields you want to include as a comma-delimited list. If this setting is used, this will take precedence over the other settings. The possible fields include user name, email, password, confirm password, display name and all the Profile Properties.\",\"registrationFieldsLabel\":\"Registration Fields:\",\"GlobalSettingsTab\":\"This is a global settings Tab. Changes to the settings will affect all of your sites.\",\"GlobalSetting\":\"This is a global setting. Changes to this setting will affect all of your sites.\",\"plSSLEnabled\":\"SSL Enabled\",\"plSSLEnabled.Help\":\"Check the box if an SSL certificate has been installed for use on this site.\",\"plSSLEnforced\":\"SSL Enforced\",\"plSSLEnforced.Help\":\"Check the box if unsecure pages will not be accessible with SSL (HTTPS).\",\"plSSLURL\":\"SSL URL\",\"plSSLURL.Help\":\"Optionally specify a URL which will be used for secure connections for this site. This is only necessary if you do not have an SSL Certificate installed for your standard site URL. An example would be a shared hosting account where the host provides you with a Shared SSL URL.\",\"plSTDURL\":\"Standard URL\",\"plSTDURL.Help\":\"If an SSL URL is specified above, then specify the Standard URL for unsecure connections.\",\"plShowCriticalErrors.Help\":\"This setting determines if error messages sent via the error querystring parameter should be shown inline in the page.\",\"plShowCriticalErrors\":\"Show Critical Errors on Screen\",\"plDebugMode.Help\":\"Check this box to run the installation in \\\"debug mode\\\". This causes various parts of the application to write more verbose error logs etc. Note: This may lead to performance degradation.\",\"plDebugMode\":\"Debug Mode\",\"plRememberMe\":\"Enable Remember Me on Login Control\",\"plRememberMe.Help\":\"Check this box to display the Remember Login check box on the login control that allows users to stay logged in for multiple visits.\",\"plAutoAccountUnlock\":\"Auto-Unlock Accounts After (Minutes)\",\"plAutoAccountUnlock.Help\":\"After an account is locked out due to unsuccessful login attempts, it can be automatically unlocked with a successful authentication after a certain period of time has elapsed. Enter the number of minutes to wait until the account can be automatically unlocked. Enter \\\"0\\\" to disable the auto-unlock feature.\",\"plAsyncTimeout.Help\":\"Set a value that indicates the time, in seconds, before asynchronous postbacks time out if no response is received, the value should between 90-9999 seconds.\",\"plAsyncTimeout\":\"Time Before Timeout (Seconds)\",\"plMaxUploadSize.Help\":\"Maximum size of files that can be uploaded to the site. The minimum is 12 MB.\",\"plMaxUploadSize\":\"Max Upload Size (MB)\",\"maxUploadSize.Error\":\"Maximum upload size must be between 12 and {0}\",\"plFileExtensions.Help\":\"Enter the file extensions (separated by commas) that can be uploaded to the site.\",\"plFileExtensions\":\"Allowable File Extensions:\",\"OtherSettingsUpdateSuccess\":\"Settings has been updated.\",\"OtherSettingsError\":\"Could not update settings. Please try later.\",\"OtherSettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"Bulletins\":\"BULLETINS\",\"BulletinsDoNotExist\":\"There are currently no Security Bulletins for DotNetNuke Platform version {0}.\",\"BulletinsExist\":\"There are currently {0} Security Bulletins for DotNetNuke Platform version {1}:\",\"RequestFailed_Admin\":\"Could Not Connect To {0}. You Should Verify The Source Address Is Valid And That Your Hosting Provider Has Configured Their Proxy Server Settings Correctly.\",\"RequestFailed_User\":\"News Feed Is Not Available At This Time. Error message: \",\"TabAuditChecks\":\"AUDIT CHECKS\",\"TabScannerCheck\":\"SCANNER CHECK\",\"TabSuperuserActivity\":\"SUPERUSER ACTIVITY\",\"SuperUserActivityExplaination\":\"Below are the SuperUser activities. Look for suspicious activities here. Pay close attention to the Creation and Last Login Dates. \",\"Username\":\"USERNAME\",\"CreatedDate\":\"CREATED DATE\",\"LastLogin\":\"LAST LOGIN\",\"LastActivityDate\":\"LAST ACTIVITY DATE\",\"SecurityCheck\":\"SECURITY CHECK\",\"Result\":\"RESULT\",\"Notes\":\"NOTES\",\"AuditChecks\":\"Audit Checks\",\"SuperuserActivity\":\"Super User Activity\",\"CheckDebugFailure\":\"debug is set to true - consider editing web.config and setting it to false (or use the configuration manager)\",\"CheckDebugReason\":\"If the debug attribute is set to true it impacts performance and can reveal security exception details useful to hackers\",\"CheckDebugSuccess\":\"Not in debug mode. This setting depends on debug value in web.config file.\",\"cmdCheck\":\"Check\",\"cmdSearch\":\"Search\",\"plSearchTerm\":\"Search term\",\"cmdModifiedFiles\":\"Find Recently Modified Files\",\"ScannerChecks\":\"Search Filesystem and Database\",\"AuditExplanation\":\"Note: the system automatically perform scans for security best practices\",\"Authorized.Header\":\"Authorized\",\"CheckTracing\":\"Tracing is set to true - consider editing web.config and setting it to false (or use the configuration manager)\",\"CheckTracingReason\":\"If the tracing attribute is set to true it allows potential hackers to view site activity\",\"CheckTracingSuccess\":\"Tracing is not enabled\",\"CreatedDate.Header\":\"Created date\",\"DisplayName.Header\":\"Display name\",\"Email.Header\":\"Email\",\"FirstName.Header\":\"First name\",\"LastActivityDate.Header\":\"Last Activity Date\",\"LastLogin.Header\":\"Last login\",\"LastName.Header\":\"Last name\",\"ScannerExplanation\":\"\",\"Username.Header\":\"Username\",\"CheckBiographyFailure\":\"The field is richtext. Spammers may put links to their website in their biography field.\",\"CheckBiographyReason\":\"The biography field is a common target for spammers as they can add links/html to it. In DNN 7.2.0 this was changed to a multiline textbox which removes this risk.\",\"CheckBiographySuccess\":\"The field is a multiline textbox\",\"CheckRarelyUsedSuperuserFailure\":\"We have found 1 or more superuser accounts that have not been logged in or had activity in six months. Consider deleting them as a best practice\",\"CheckRarelyUsedSuperuserReason\":\"Superuser accounts are the most powerful DNN accounts. As a best practice these should be limited.\",\"CheckRarelyUsedSuperuserSuccess\":\"All superusers are regular users of the system.\",\"CheckSiteRegistrationFailure\":\"One or more websites are using public registration\",\"CheckSiteRegistrationReason\":\"Sites that have public registration enabled are a prime target for spammers.\",\"CheckSiteRegistrationSuccess\":\"All the websites are using non-public registration\",\"CheckSuperuserOldPasswordFailure\":\"At least one superuser account has a password that has not been changed in more than 6 months.\",\"CheckSuperuserOldPasswordReason\":\"Superuser accounts are the most powerful DNN accounts. As a best practice these accounts should have their passwords changed regularly.\",\"CheckSuperuserOldPasswordSuccess\":\"No superuser has a password older than 6 months.\",\"CheckUnexpectedExtensionsFailure\":\"An asp or php extension was found - these may be harmless, but sometimes indicate a site has been exploited and these files are tools. We recommend you evaluate these files carefully.\",\"CheckUnexpectedExtensionsReason\":\"DNN is an asp.net web application. Under normal circumstances other server application extensions such as asp and php should not be in use.\",\"CheckUnexpectedExtensionsSuccess\":\"No unexpected extensions found\",\"CheckViewstatemacFailure\":\"viewstatemac validation is not enabled\",\"CheckViewstatemacReason\":\"A view-state MAC is an encrypted version of the hidden variable that a page's view state is persisted to when the page is sent to the browser. When this property is set to true, the encrypted view state is checked to verify that it has not been tampered with on the client. \\r\\n\",\"CheckViewstatemacSuccess\":\"The viewstate is protected via the usage of a MAC\",\"CheckPurpose.Header\":\"Purpose of the check\",\"Result.Header\":\"Result\",\"Severity.Header\":\"Severity\",\"CheckBiographyName\":\"Check if public profile fields use richtext\",\"CheckDebugName\":\"Check Debug status\",\"CheckRarelyUsedSuperuserName\":\"Check if superuser accounts are rarely active\",\"CheckSiteRegistrationName\":\"Check if site(s) use public registration\",\"CheckSuperuserOldPasswordName\":\"Check if superusers are not regularly changing passwords\",\"CheckTracingName\":\"Check if asp.net tracing is enabled\",\"CheckUnexpectedExtensionsName\":\"Check if asp/php files are found\",\"CheckDefaultPageName\":\"Check if default.aspx or default.aspx.cs files have been modified\",\"CheckDefaultPageFailure\":\"The default page(s) have been modified. We recommend you evaluate these files carefully, they may be modified by a hacker and may contain malicious code. It is best to compare these files with that from a standard install of your product. Ensure that the DNN or Evoq version of your current site matches with the standard site prior to comparison. Either remove the malicious code or restore these files from standard installation.\",\"CheckDefaultPageReason\":\"DNN use default.aspx to load everything, so all requests will load this file when user browse the site, if someone modify this file, it may cause huge risk.\",\"CheckDefaultPageSuccess\":\"The default.aspx and default.aspx.cs pages haven't been modified.\",\"CheckViewstatemacName\":\"Check if viewstate is protected\",\"NoDatabaseResults\":\"Search term was not found in the database\",\"NoFileResults\":\"Search term was not found in any files\",\"SearchTermRequired\":\"Search term is required\",\"CheckTracingFailure\":\"Tracing is enabled - this allows potential hackers to view site activity.\",\"Filename.Header\":\"File Name\",\"LastModifiedDate.Header\":\"Last Modification Date\",\"ModifiedFiles\":\"Recently Modified Files\",\"CheckModuleHeaderAndFooterFailure\":\"There are modules in your system that have header and footer settings, please review them to make sure no phishing code is present.\",\"CheckModuleHeaderAndFooterName\":\"Check Modules have Header or Footer settings\",\"CheckModuleHeaderAndFooterReason\":\"Hackers may use module's header or footer settings to inject content for phishing attacks.\",\"CheckModuleHeaderAndFooterSuccess\":\"No modules were found that had header or footer values configured.\",\"CheckDiskAccessName\":\"Checks extra drives/folders access permission outside the website folder\",\"CheckDiskAccessFailure\":\"Hackers could access drives/folders outside the website\",\"CheckDiskAccessReason\":\"The user which your website is running under has access to drives and folders outside the website location. A hacker could access these files and either read, write, or do both activities.\",\"CheckDiskAccessSuccess\":\"Hackers cannot access drives/folders outside the website\",\"HostSettings\":\"Host Settings\",\"ModifiedSettings\":\"Recently Modified Settings\",\"ModuleSettings\":\"Module Settings\",\"PortalSettings\":\"Portal Settings\",\"TabSettings\":\"Tab Settings\",\"ModifiedSettingsExplaination\":\"\",\"ModifiedFilesExplaination\":\"\",\"ModifiedFilesLoadWarning\":\"Tool will enumerate all files in your system to show the recently changed files. It may take a while on a site with lots of files.\",\"CheckPasswordFormatName\":\"Check Password Format Setting\",\"CheckPasswordFormatFailure\":\"The setting passwordFormat is not set to Hashed in web.config - consider editing web.config and setting it to Hashed (or use the configuration manager). More information can be found here.\",\"CheckPasswordFormatReason\":\"If the value is Clear or Encrypters, hacker can retrieve password from user's password from database.\",\"CheckPasswordFormatSuccess\":\"The passwordFormat is set as Hashed in web.config\",\"CheckAllowableFileExtensionsFailure\":\"Either aspx, asp or php files were found in allowable file extensions setting. This will allow hackers to upload code. Remove these extensions at Settings > More > More security settings > Allowable File Extensions\",\"CheckAllowableFileExtensionsName\":\"Check if there are any harmful extensions allowed by the file uploader\",\"CheckAllowableFileExtensionsReason\":\"Either aspx, asp or php files were found in allowable file extensions setting. This will allow hackers to upload code. Remove these extensions at Settings > More > More security settings > Allowable File Extensions\",\"CheckAllowableFileExtensionsSuccess\":\"The allowable file extensions is setup correctly.\",\"CheckFileExists.Error\":\"Current SQL Server account can execute xp_fileexist which can detect whether files exist on server.\",\"CheckSqlRiskFailure\":\"The current SQL connection can execute dangerous command(s) on your SQL Server.\",\"CheckSqlRiskName\":\"Check Current SQL Account Permission\",\"CheckSqlRiskReason\":\"If the SQL Server account isn't configured properly, it may leave risk and hackers can exploit the server by running special script.\",\"CheckSqlRiskSuccess\":\"The SQL Server account configured correctly.\",\"ExecuteCommand.Error\":\"Current SQL Server account can execute xp_cmdshell which will running command line in sql server system.\",\"GetFolderTree.Error\":\"Current SQL Server account can execute xp_dirtree which can see the server's folders structure.\",\"RegRead.Error\":\"Current SQL Server account can read registry values. You need to check the permissions of xp_regread, xp_regwrite, xp_regenumkeys, xp_regenumvalues, xp_regdeletekey, xp_regdeletekey, xp_regdeletevalue, xp_instance_regread, xp_instance_regwrite, xp_instance_regenumkeys, xp_instance_regenumvalues, xp_instance_regdeletekey, xp_instance_regdeletekey, xp_instance_regdeletevalue stored procedures.\",\"SysAdmin.Error\":\"Current SQL Server account is 'sysadmin'.\",\"HighRiskFiles\":\"High Risk Files\",\"LowRiskFiles\":\"Low Risk Files\",\"Pass\":\"PASS\",\"Fail\":\"FAIL\",\"Alert\":\"ALERT\",\"FileName\":\"FILE NAME\",\"LastWriteTime\":\"LAST MODIFIED DATE\",\"PortalId\":\"PORTAL ID\",\"TabId\":\"TAB ID\",\"ModuleId\":\"MODULE ID\",\"SettingName\":\"SETTING NAME\",\"SettingValue\":\"SETTING VALUE\",\"UserId\":\"USER ID\",\"SearchPlaceHolder\":\"Search\",\"SearchFileSystemResult\":\"File System: {0} Files Found\",\"SearchDatabaseResult\":\"Database: {0} Instances Found\",\"DatabaseInstance\":\"DATABASE INSTANCE\",\"DatabaseValue\":\"VALUE\",\"plSSLOffload\":\"SSL Offload Header Value\",\"plSSLOffload.Help\":\"Set the name of the HTTP header that will be checked to see if a network balancer has used SSL Offloading\",\"BulletinDescription\":\"DESCRIPTION\",\"BulletinLink\":\"LINK\",\"NoneSpecified\":\"None Specified\",\"MinPasswordLengthTitle.Help\":\"Indicates the minimum number of characters in the password. This can only be changed in web.config file.\",\"MinPasswordLengthTitle\":\"Min Password Length\",\"CheckHiddenSystemFilesFailure\":\"There are files marked as system file or hidden in the website folder.\",\"CheckHiddenSystemFilesName\":\"Check Hidden Files\",\"CheckHiddenSystemFilesReason\":\"Hackers may upload rootkits into the website, they marked them as system file or hidden in file system, then you can not see these files in file explorer.\",\"CheckHiddenSystemFilesSuccess\":\"There are no files marked as system file or hidden in the website folder.\",\"plDisplayCopyright.Help\":\"Check this box to add the DNN copyright credits to the page source.\",\"plDisplayCopyright\":\"Show Copyright Credits\",\"CheckTelerikVulnerabilityFailure\":\"The Telerik component vulnerability has not been patched, please go to http://www.dnnsoftware.com/community-blog/cid/155449/critical-security-update--september2017 for detailed information and to download the patch.\",\"CheckTelerikVulnerabilityName\":\"Check if Telerik component has vulnerability.\",\"CheckTelerikVulnerabilityReason\":\"Third party components referenced in core may have vulnerability in old versions and need to be patched.\",\"CheckTelerikVulnerabilitySuccess\":\"Telerik Component already patched.\",\"UserNotMemberOfRole\":\"User not member of {0} role.\",\"NotValid\":\"{0} {1} is not valid.\",\"Empty\":\"{0} should not be empty.\",\"DeletedTab\":\"The tab with this id {0} is deleted.\",\"Disabled\":\"The tab with this id {0} is disable.\",\"Check\":\"[ Check ]\"},\"Seo\":{\"nav_Seo\":\"S E O\",\"URLManagementTab\":\"URL Management\",\"GeneralSettingsTab\":\"GENERAL SETTINGS\",\"ExtensionUrlProvidersTab\":\"EXTENSION URL PROVIDERS\",\"ExpressionsTab\":\"EXPRESSIONS\",\"TestURLTab\":\"TEST URL\",\"SitemapSettingsTab\":\"Sitemap Settings\",\"minusCharacter\":\"\\\"-\\\" e.g. page-name\",\"underscoreCharacter\":\"\\\"_\\\" e.g. page_name\",\"Do301RedirectToPortalHome\":\"Site Home Page\",\"Do404Error\":\"404 Error\",\"ReplacementCharacter\":\"Standard Replacement Character\",\"ReplacementCharacter.Help\":\"Standard Replacement Character\",\"enableSystemGeneratedUrlsLabel\":\"Concatenate Page URLs\",\"enableSystemGeneratedUrlsLabel.Help\":\"You can configure how the system will generate URLs.\",\"enableLowerCaseLabel.Help\":\"Check this box to force URLs to be converted to lowercase.\",\"enableLowerCaseLabel\":\"Convert URLs to Lowercase\",\"autoAsciiConvertLabel.Help\":\"When checked, any accented (diacritic) characters such as å and è will be converted to their plain-ascii equivalent. Example : å -> a and è -> e.\",\"autoAsciiConvertLabel\":\"Convert Accented Characters\",\"setDefaultSiteLanguageLabel.Help\":\"When checked, the default language for this site will always be set in the rewritten URL when no other language is found.\",\"setDefaultSiteLanguageLabel\":\"Set Default Site Language\",\"UrlRewriter\":\"URL REWRITER\",\"UrlRedirects\":\"URL REDIRECTS\",\"plDeletedPages.Help\":\"Select the behavior that should occur when a user browses to a deleted, expired or disabled page.\",\"plDeletedPages\":\"Redirect deleted, expired, disabled pages to\",\"enable301RedirectsLabel.Help\":\"Check this box if you want old \\\"non-friendly\\\" URLs to be redirected to the new URLs.\",\"enable301RedirectsLabel\":\"Redirect to Friendly URLs\",\"redirectOnWrongCaseLabel.Help\":\"When checked, any URL that is not in lower case will be redirected to the lower case version of that URL.\",\"redirectOnWrongCaseLabel\":\"Redirect Mixed Case URLs\",\"GlobalSetting\":\"This is a global setting. Changes to this setting will affect all of your sites.\",\"ignoreRegExLabel.Help\":\"The Ignore URL Regex pattern is used to stop processing of URLs by the URL Rewriting module. This should be used when the URL in question doesn’t need to be rewritten, redirected or otherwise processed through the URL Rewriter. Examples include images, css files, pdf files, service requests and requests for resources not associated with DotNetNuke.\",\"ignoreRegExLabel\":\"Ignore URL Regular Expression\",\"ignoreRegExInvalidPattern\":\"Ignore URL Regular Expression is invalid\",\"RegularExpressions\":\"REGULAR EXPRESSIONS\",\"ExtensionUrlProviders\":\"EXTENSION URL PROVIDERS\",\"SettingsUpdateSuccess\":\"The settings have been updated.\",\"SettingsError\":\"Could not update the settings. Please try later.\",\"SettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"Yes\":\"Yes\",\"No\":\"No\",\"doNotRewriteRegExLabel.Help\":\"The Do Not Rewrite URL regular expression stops URL Rewriting from occurring on any URL that matches. Use this value when a URL is being interpreted as a DotNetNuke page, but should not be.\",\"doNotRewriteRegExLabel\":\"Do Not Rewrite URL Regular Expression\",\"doNotRewriteRegExInvalidPattern\":\"Do Not Rewrite URL Regular Expression is invalid\",\"siteUrlsOnlyRegExInvalidPattern\":\"Site URLs Only Regular Expression is invalid\",\"siteUrlsOnlyRegExLabel.Help\":\"The Site URLs Only regular expression pattern changes the processing order for matching URLs. When matched, the URLs are evaluated against any of the regular expressions in the siteURLs.config file, without first being checked against the list of friendly URLs for the site. Use this pattern to force processing through the siteURLs.config file for an explicit URL Rewrite or Redirect located within that file.\",\"siteUrlsOnlyRegExLabel\":\"Site URLs Only Regular Expression\",\"doNotRedirectUrlRegExInvalidPattern\":\"Do Not Redirect URL Regular Expression is invalid\",\"doNotRedirectUrlRegExLabel.Help\":\"The Do Not Redirect URL regular expression pattern prevents matching URLs from being redirected in all cases. Use this pattern when a URL is being redirected incorrectly.\",\"doNotRedirectUrlRegExLabel\":\"Do Not Redirect URL Regular Expression\",\"doNotRedirectHttpsUrlRegExInvalidPattern\":\"Do Not Redirect Https URL Regular Expression is invalid\",\"doNotRedirectHttpsUrlRegExLabel.Help\":\"The Do Not Redirect https URL regular expression is used to stop unwanted redirects between http and https URLs. It prevents the redirect for any matching URLs, and works both for http->https and https->http redirects.\",\"doNotRedirectHttpsUrlRegExLabel\":\"Do Not Redirect Https URL Regular Expression\",\"preventLowerCaseUrlRegExLabel.Help\":\"The Prevent Lowercase URL regular expression stops the automatic conversion to lower case for any matching URLs. Use this pattern to prevent the lowercase conversion of any URLs which need to remain in mixed/upper case. This is frequently used to stop the conversion of URLs where the contents of the URL contain an encoded character or case-sensitive value.\",\"preventLowerCaseUrlRegExLabel\":\"Prevent Lowercase URL Regular Expression\",\"preventLowerCaseUrlRegExInvalidPattern\":\"Prevent Lowercase URL Regular Expression is invalid\",\"doNotUseFriendlyUrlsRegExLabel.Help\":\"The Do Not Use Friendly URLs regular expression pattern is used to force certain DotNetNuke pages into using a longer URL for the page. This is normally used to generate behaviour for backwards compatibility.\",\"doNotUseFriendlyUrlsRegExLabel\":\"Do Not Use Friendly URLs Regular Expression\",\"doNotUseFriendlyUrlsRegExInvalidPattern\":\"Do Not Use Friendly URLs Regular Expression is invalid\",\"keepInQueryStringRegExInvalidPattern\":\"Keep In Querystring Regular Expression is invalid\",\"keepInQueryStringRegExLabel.Help\":\"The Keep in Querystring regular expression allows the matching of part of the friendly URL Path and ensuring that it stays in the querystring. When a DotNetNuke URL of /pagename/key/value is generated, a ‘Keep in Querystring Regular Expression’ pattern of /key/value will match that part of the path and leave it as part of the querystring for the generated URL; e.g. /pagename?key=value.\",\"keepInQueryStringRegExLabel\":\"Keep in Querystring Regular Expression\",\"urlsWithNoExtensionRegExLabel.Help\":\"The URLs with no Extension regular expression pattern is used to validate URLs that do not refer to a resource on the server, are not DotNetNuke pages, but can be requested with no URL extension. URLs matching this regular expression will not be treated as a 404 when a matching DotNetNuke page can not be found for the URL.\",\"urlsWithNoExtensionRegExLabel\":\"URLs With No Extension Regular Expression\",\"urlsWithNoExtensionRegExInvalidPattern\":\"URLs With No Extension Regular Expression is invalid\",\"validFriendlyUrlRegExLabel.Help\":\"This pattern is used to determine whether the characters that make up a page name or URL segment are valid for forming a friendly URL path. Characters that do not match the pattern will be removed from page names\",\"validFriendlyUrlRegExLabel\":\"Valid Friendly URL Regular Expression\",\"validFriendlyUrlRegExInvalidPattern\":\"Valid Friendly URL Regular Expression is invalid\",\"TestPageUrl\":\"TEST A PAGE URL\",\"TestUrlRewriting\":\"TEST URL REWRITING\",\"selectPageToTestLabel.Help\":\"Select a page for this site to test out the URL generation. You can use the ‘Search’ box to filter the list of pages.\",\"selectPageToTestLabel\":\"Page to Test\",\"NoneSpecified\":\"None Specified\",\"None\":\"None\",\"queryStringLabel.Help\":\"To generate a URL which includes extra information in the path, add on the path information in the form of a querystring. For example, entering &key=value will change the generated URL to include/key/value in the URL path. Use this feature to test out the example URLs generated by third party URLs.\",\"queryStringLabel\":\"Add Query String (optional)\",\"pageNameLabel.Help\":\"Some modules generate a friendly URL by defining the last part of the URL explicitly. If this is the case, enter the value for the ‘pagename’ value that is used when generating the URL. If you have no explicit value, or do not know when to use this value, leave the value empty.\",\"pageNameLabel\":\"Custom Page Name / URL End String (optional)\",\"resultingUrlsLabel\":\"Resulting URLs\",\"resultingUrlsLabel.Help\":\"Shows the list of URLs that can be generated from the selected page, depending on alias and/or language.\",\"TestUrlButtonCaption\":\"Test URL\",\"testUrlRewritingButton\":\"Test URL Rewriting\",\"testUrlRewritingLabel\":\"URL to Test\",\"testUrlRewritingLabel.Help\":\"Enter a fully-qualified URL (including http:// or https://) into this box in order to test out the URL Rewriting / Redirecting.\",\"rewritingResultLabel.Help\":\"Shows the rewritten URL, in the raw format that will be seen by the DNN platform and third-party extensions.\",\"rewritingResultLabel\":\"Rewriting Result\",\"languageLabel.Help\":\"Shows the culture code as identified during the URL Rewriting process.\",\"languageLabel\":\"Identified Language / Culture\",\"identifiedTabLabel.Help\":\"The name of the DNN page that has been identified during the URL Rewriting process.\",\"identifiedTabLabel\":\"Identified Page\",\"redirectionResultLabel.Help\":\"If the tested URL is to be redirected, shows the redirect location of the URL.\",\"redirectionResultLabel\":\"Redirection Result\",\"redirectionReasonLabel.Help\":\"Reason that this URL was redirected\",\"redirectionReasonLabel\":\"Redirection Reason\",\"operationMessagesLabel.Help\":\"Any debug messages created during the test URL Rewriting process.\",\"operationMessagesLabel\":\"Operation Messages\",\"Alias_In_Url\":\"Alias In Url\",\"Built_In_Url\":\"Built In Url\",\"Custom_Tab_Alias\":\"Custom Tab Alias\",\"Deleted_Page\":\"Deleted Page\",\"Diacritic_Characters\":\"Diacritic Characters\",\"Disabled_Page\":\"Disabled Page\",\"Error_Event\":\"Error Event\",\"Exception\":\"Exception\",\"File_Url\":\"File Url\",\"Host_Portal_Used\":\"Host Portal Used\",\"Module_Provider_Redirect\":\"Module Provider Redirect\",\"Module_Provider_Rewrite_Redirect\":\"Module Provider Rewrite Redirect\",\"Not_Redirected\":\"Not Redirected\",\"No_Portal_Alias\":\"No Portal Alias\",\"Page_404\":\"Page 404\",\"Requested_404\":\"Requested 404\",\"Requested_404_In_Url\":\"Requested 404 In Url\",\"Requested_SplashPage\":\"Requested SplashPage\",\"Secure_Page_Requested\":\"Secure Page Requested\",\"SiteUrls_Config_Rule\":\"SiteUrls Config Rule\",\"Site_Root_Home\":\"Site Root Home\",\"Spaces_Replaced\":\"Spaces Replaced\",\"Tab_External_Url\":\"Tab External Url\",\"Tab_Permanent_Redirect\":\"Tab Permanent Redirect\",\"Unfriendly_Url_Child_Portal\":\"Unfriendly Url Child Portal\",\"Unfriendly_Url_TabId\":\"Unfriendly Url TabId\",\"User_Profile_Url\":\"User Profile Url\",\"Wrong_Portal_Alias\":\"Wrong Portal Alias\",\"Wrong_Portal_Alias_For_Browser_Type\":\"Wrong Portal Alias For Browser Type\",\"Wrong_Portal_Alias_For_Culture\":\"Wrong Portal Alias For Culture\",\"Wrong_Portal_Alias_For_Culture_And_Browser\":\"Wrong Portal Alias For Culture And Browser\",\"Wrong_Sub_Domain\":\"Wrong Sub Domain\",\"SitemapSettings\":\"GENERAL SITEMAP SETTINGS\",\"SitemapProviders\":\"SITEMAP PROVIDERS\",\"SiteSubmission\":\"SITE SUBMISSION\",\"sitemapUrlLabel.Help\":\"Submit the Site Map to Google for better search optimization. Click Submit to get a Google Search Console account and verify your site ownership ( using the Verification option below ). Once verified, you can select the Add General Web Sitemap option on the Google Sitemaps tab and paste in the Site Map URL displayed.\",\"sitemapUrlLabel\":\"Sitemap URL\",\"lblCache.Help\":\"Enable this option if you want to cache the Sitemap so it is not generated every time it is requested. This is specially necessary for big sites. If your site has more than 50.000 URLs the Sitemap will be cached with a default value of 1 day. Set this value to 0 to disable the caching.\",\"lblCache\":\"Days to Cache Sitemap For\",\"lnkResetCache\":\"Clear Cache\",\"lblExcludePriority.Help\":\"This option can be used to remove certain pages from the Sitemap. For example you can setup a priority of -1 for a page and enter -1 here to cause the page to not being included in the generated Sitemap.\",\"lblExcludePriority\":\"Exclude URLs With a Priority Lower Than\",\"lblMinPagePriority.Help\":\"When \\\"page level based priorities\\\" is used, minimum priority for pages can be used to set the lowest priority that will be used on low level pages\",\"lblMinPagePriority\":\"Minimum Priority for Pages\",\"lblIncludeHidden.Help\":\"When checked hidden pages (not visible in the menu) will also be included in the Sitemap. The default is not to include hidden pages.\",\"lblIncludeHidden\":\"Include Hidden Pages\",\"lblLevelPriority.Help\":\"When checked, the priority for each page will be computed from the hierarchy level of the page. Top level pages will have a value of 1, second level 0.9, third level 0.8, ... This setting will not change the value stored in the actual page but it will use the computed value when required.\",\"lblLevelPriority\":\"Use Page Level Based Priorities\",\"1Day\":\"1 Day\",\"2Days\":\"2 Days\",\"3Days\":\"3 Days\",\"4Days\":\"4 Days\",\"5Days\":\"5 Days\",\"6Days\":\"6 Days\",\"7Days\":\"7 Days\",\"DisableCaching\":\"Disable Caching\",\"enableSitemapProvider.Help\":\"Enable Sitemap Provider\",\"enableSitemapProvider\":\"Enable Sitemap Provider\",\"overridePriority.Help\":\"Override Priority\",\"overridePriority\":\"Override Priority\",\"Name.Header\":\"NAME\",\"Enabled.Header\":\"Enabled\",\"Priority.Header\":\"Priority\",\"lblSearchEngine.Help\":\"Submit your site to the selected search engine for indexing.\",\"lblSearchEngine\":\"Search Engine\",\"lblVerification.Help\":\"When signing up with Google Search Console you will need to verify your site ownership. Choose the \\\"Upload an HTML File\\\" method from the Google Verification screen. Enter the file name displayed (ie. google53c0cef435b2b81e.html) into the Verification text box and click Create. Return to Google and select the Verify button.\",\"lblVerification\":\"Verification\",\"Submit\":\"Submit\",\"Create\":\"Create\",\"VerificationValidity.ErrorMessage\":\"Valid file name must has an extension .html (ie. google53c0cef435b2b81e.html)\",\"NoExtensionUrlProviders\":\"No extension URL providers found\"},\"Servers\":{\"nav_Servers\":\"Servers\",\"Servers\":\"Servers\",\"tabApplicationTitle\":\"Application\",\"tabDatabaseTitle\":\"Database\",\"tabLogsTitle\":\"Logs\",\"tabPerformanceTitle\":\"Performance\",\"tabServerSettingsTitle\":\"Server Settings\",\"tabSmtpServerTitle\":\"Smtp Server\",\"tabSystemInfoTitle\":\"System Info\",\"tabWebTitle\":\"Web\",\"ServerInfo_Framework.Help\":\"The version of .NET.\",\"ServerInfo_Framework\":\".NET Framework Version:\",\"ServerInfo_HostName.Help\":\"The name of the Host computer.\",\"ServerInfo_HostName\":\"Host Name:\",\"ServerInfo_Identity.Help\":\"The Windows user account under which the application is running. This is the account which needs to be granted folder permissions on the server.\",\"ServerInfo_Identity\":\"ASP.NET Identity:\",\"ServerInfo_IISVersion.Help\":\"The version of Internet Information Server (IIS).\",\"ServerInfo_IISVersion\":\"Web Server Version:\",\"ServerInfo_OSVersion.Help\":\"The version of Windows on the server.\",\"ServerInfo_OSVersion\":\"OS Version:\",\"ServerInfo_PhysicalPath.Help\":\"The physical location of the site root on the server.\",\"ServerInfo_PhysicalPath\":\"Physical Path:\",\"ServerInfo_RelativePath.Help\":\"The relative location of the application in relation to the root of the site.\",\"ServerInfo_RelativePath\":\"Relative Path:\",\"ServerInfo_ServerTime.Help\":\"The current date and time for the web server.\",\"ServerInfo_ServerTime\":\"Server Time:\",\"ServerInfo_Url.Help\":\"The principal URL for this site.\",\"ServerInfo_Url\":\"Site URL:\",\"errorMessageLoadingWebTab\":\"Error loading Web tab\",\"clearCacheButtonLabel\":\"Clear Cache\",\"errorMessageClearingCache\":\"Error trying to Clear Cache\",\"errorMessageLoadingApplicationTab\":\"Error loading Application tab\",\"errorMessageRestartingApplication\":\"Error trying to Restart Application\",\"HostInfo_CachingProvider.Help\":\"The default caching provider for the site.\",\"HostInfo_CachingProvider\":\"Caching Provider:\",\"HostInfo_FriendlyUrlEnabled.Help\":\"Displays whether Friendly URLs are enabled for the site.\",\"HostInfo_FriendlyUrlEnabled\":\"Friendly URLs Enabled:\",\"HostInfo_FriendlyUrlProvider.Help\":\"The default Friendly URL provider for the site.\",\"HostInfo_FriendlyUrlProvider\":\"Friendly URL Provider:\",\"HostInfo_FriendlyUrlType.Help\":\"Displays the type of Friendly URLs used for the site.\",\"HostInfo_FriendlyUrlType\":\"Friendly URL Type:\",\"HostInfo_HtmlEditorProvider.Help\":\"The default HTML Editor provider for the site.\",\"HostInfo_HtmlEditorProvider\":\"HTML Editor Provider:\",\"HostInfo_LoggingProvider.Help\":\"The default logging provider for the site.\",\"HostInfo_LoggingProvider\":\"Logging Provider:\",\"HostInfo_Permissions.Help\":\"The Code Access Security (CAS) Permissions available for this site.\",\"HostInfo_Permissions\":\"CAS Permissions:\",\"HostInfo_SchedulerMode.Help\":\"The mode set for the Schedule. The Timer Method maintains a separate thread to execute scheduled tasks while the worker process is alive. Alternatively, the Request Method executes tasks when HTTP Requests are made. The scheduler can also be disabled.\",\"HostInfo_SchedulerMode\":\"Scheduler Mode:\",\"HostInfo_WebFarmEnabled.Help\":\"Indicates whether the site operates in Web Farm mode. \",\"HostInfo_WebFarmEnabled\":\"Web Farm Enabled:\",\"infoMessageClearingCache\":\"Clearing Cache\",\"infoMessageRestartingApplication\":\"Restarting Application\",\"plDataProvider.Help\":\"The default data provider for this application.\",\"plDataProvider\":\"Data Provider:\",\"plGUID.Help\":\"The globally unique identifier which can be used to identify this application.\",\"plGUID\":\"Host GUID:\",\"plProduct.Help\":\"The application you are running\",\"plProduct\":\"Product:\",\"plVersion.Help\":\"The version of this application.\",\"plVersion\":\"Version:\",\"restartApplicationButtonLabel\":\"Restart Application\",\"UserRestart\":\"User triggered an Application Restart\",\"DbInfo_ProductEdition.Help\":\"The edition of SQL Server installed.\",\"DbInfo_ProductEdition\":\"Product Edition:\",\"DbInfo_ProductVersion.Help\":\"The version of SQL Server\",\"DbInfo_ProductVersion\":\"Database Version:\",\"DbInfo_ServicePack.Help\":\"Installed service pack(s).\",\"DbInfo_ServicePack\":\"Service Pack:\",\"DbInfo_SoftwarePlatform.Help\":\"The full description of the SQL Server Software Platform installed.\",\"DbInfo_SoftwarePlatform\":\"Software Platform:\",\"errorMessageLoadingDatabaseTab\":\"Error loading Database tab\",\"BackupFinished\":\"Finished\",\"BackupName\":\" Backup Name\",\"BackupSize\":\"Size (Kb)\",\"BackupStarted\":\"Started\",\"BackupType\":\"Backup Type\",\"FileName\":\"File Name\",\"FileType\":\"File Type\",\"Name\":\"Name\",\"NoBackups\":\"This database has not been backed up.\",\"plBackups\":\"Database Backup History:\",\"plFiles\":\"Database Files:\",\"Size\":\"Size\",\"EmailTest\":\"Test SMTP Settings\",\"errorMessageLoadingSmtpServerTab\":\"Error loading Smtp Server tab\",\"GlobalSettings\":\"These are global settings. Changes to the settings will affect all of your sites.\",\"GlobalSmtpHostSetting\":\"Global\",\"plBatch.Help\":\"The number of messages sent by the messaging scheduler in each batch.\",\"plBatch\":\"Number of messages sent in each batch:\",\"plConnectionLimit.Help\":\"The maximum number of connections allowed on this ServicePoint object. Max value is 2147483647. Default is 2.\",\"plConnectionLimit\":\"Connection Limit:\",\"plMaxIdleTime.Help\":\"The length of time, in milliseconds, that a connection associated with the ServicePoint object can remain idle before it is closed and reused for another connection. Max value is 2147483647. Default is 100,000 (100 seconds).\",\"plMaxIdleTime\":\"Max Idle Time:\",\"plSMTPAuthentication.Help\":\"Enter the SMTP server authentication method. Default is Anonymous.\",\"plSMTPAuthentication\":\"SMTP Authentication:\",\"plSMTPEnableSSL.Help\":\"Used for SMTP services that require secure connection. This setting is typically not required.\",\"plSMTPEnableSSL\":\"SMTP Enable SSL:\",\"plSMTPMode.Help\":\"Host mode utilizes all SMTP settings set at the application level. Site level allows you to select your own SMTP server, port and authentication method.\",\"plSMTPMode\":\"SMTP Server Mode:\",\"plSMTPPassword.Help\":\"Enter the password for the SMTP server.\",\"plSMTPPassword\":\"SMTP Password:\",\"plSMTPServer.Help\":\"Please enter the name (address) and port of the SMTP server to be used for sending mails from this site.\",\"plSMTPServer\":\"SMTP Server and port:\",\"plSMTPUsername.Help\":\"Enter the user name for the SMTP server.\",\"plSMTPUsername\":\"SMTP Username:\",\"SaveButtonText\":\"Save\",\"SiteSmtpHostSetting\":\"{0}\",\"SMTPAnonymous\":\"Anonymous\",\"SMTPBasic\":\"Basic\",\"SMTPNTLM\":\"NTLM\",\"errorMessageLoadingLog\":\"Error loading log.\",\"errorMessageLoadingLogsTab\":\"Error loading Logs Tab\",\"Logs_LogFiles\":\"Log Files:\",\"Logs_LogFilesDefaultOption\":\"Please select a log file to view\",\"Logs_LogFilesTooltip\":\"List of log files available to view.\",\"errorMessageUpdatingSmtpServerTab\":\"Error updating Smtp Server settings\",\"errorMessageLoadingPerformanceTab\":\"Error loading Performance Tab\",\"PerformanceTab_CacheSetting.Help\":\"Select how to optimize performance.\",\"PerformanceTab_CacheSetting\":\"Cache Setting\",\"PerformanceTab_Heavy\":\"Heavy\",\"PerformanceTab_Light\":\"Light\",\"PerformanceTab_Memory\":\"Memory\",\"PerformanceTab_Moderate\":\"Moderate\",\"PerformanceTab_None\":\"None\",\"PerformanceTab_Page\":\"Page\",\"PerformanceTab_PageStatePersistenceMode.Help\":\"Select the mode to use to persist a page's state. This can either be a hidden field on the Page (Default) or in Memory (Cache).\",\"PerformanceTab_PageStatePersistenceMode\":\"Page State Persistence:\",\"PerformanceTab_AuthCacheability.Help\":\"Sets the Cache-Control HTTP header value for authenticated users.\",\"PerformanceTab_AuthCacheability\":\"Authenticated Cacheability\",\"PerformanceTab_CachingProvider.Help\":\"Caching Provider\",\"PerformanceTab_CachingProvider\":\"Caching Provider\",\"PerformanceTab_ClientResourceManagementInfo\":\"The Super User dictates the default Client Resource Management behavior, but if you choose to do so, you may configure your site to behave differently. The host-level settings are currently set as follows:\",\"PerformanceTab_ClientResourceManagementTitle\":\"Client Resource Management\",\"PerformanceTab_ClientResourcesManagementMode.Help\":\"Host mode utilizes all Client Resources Management settings set at the application level. Site level allows you to select your own Client Resources Management settings.\",\"PerformanceTab_ClientResourcesManagementMode\":\"Client Resources Management Mode\",\"PerformanceTab_CurrentHostVersion\":\"Current Host Version:\",\"PerformanceTab_EnableCompositeFiles.Help\":\"Composite files are combinations of resources (JavaScript and CSS) created to reduce the number of file requests by the browser. This will significantly increase the page loading speed.\",\"PerformanceTab_EnableCompositeFiles\":\"Enable Composite Files\",\"PerformanceTab_GlobalClientResourcesManagementMode\":\"Global\",\"PerformanceTab_IncrementVersion\":\"Increment Version\",\"PerformanceTab_MinifyCss.Help\":\"CSS minification will reduce the size of the CSS code by using regular expressions to remove comments, whitespace and \\\"dead CSS\\\". It is only available when composite files are enabled.\",\"PerformanceTab_MinifyCss\":\"Minify CSS\",\"PerformanceTab_MinifyJs.Help\":\"JS minification will reduce the size of the JavaScript code using JSMin. It is only available when composite files are enabled.\",\"PerformanceTab_MinifyJs\":\"Minify JS\",\"PerformanceTab_ModuleCacheProviders.Help\":\"Select the default module caching provider. This setting can be overridden by each individual module.\",\"PerformanceTab_ModuleCacheProviders\":\"Module Cache Provider\",\"PerformanceTab_PageCacheProviders.Help\":\"Select the default Page Caching Provider. The caching provider must be enabled by setting the cache timeout on each page.\",\"PerformanceTab_PageCacheProviders\":\"Page Output Cache Provider\",\"PerformanceTab_SiteClientResourcesManagementMode\":\"My Website {0}\",\"PerformanceTab_SslForCacheSyncrhonization.Help\":\"By default, cache synchronization will happen over http. To use SSL for cache synchronization messages, please check this.\",\"PerformanceTab_SslForCacheSyncrhonization\":\"SSL for Cache Synchronization\",\"PerformanceTab_UnauthCacheability.Help\":\"Sets the Cache-Control HTTP header value for unauthenticated users.\",\"PerformanceTab_UnauthCacheability\":\"Unauthenticated Cacheability\",\"EmailSentMessage\":\"Email sent successfully from {0} to {1}\",\"errorMessageSendingTestEmail\":\"There has been an error trying to send the test email\",\"NoIntegerValueError\":\"Must be a positive integer value.\",\"PerformanceTab_CurrentPortalVersion\":\"Site Version:\",\"errorMessageIncrementingVersion\":\"Error incrementing the version number.\",\"errorMessageSavingPerformanceSettingsTab\":\"Error saving performance settings\",\"PerformanceTab_AjaxWarning\":\"Warning: Memory page state persistence can cause Ajax issues.\",\"PerformanceTab_MinifactionWarning\":\"Important note regarding minification settings.
\\r\\nIf minification settings are changed when composite files are enabled, you must first save the minification settings by clicking Save and then increment the version number. This will issue new composite files using the new minification settings.\",\"PerformanceTab_PortalVersionConfirmMessage\":\"This action will force all site visitors to download new versions of CSS and JavaScript files. You should only do this if you are certain that the files have changed and you want those changes to be reflected on the client's browser.\\r\\n\\r\\nAre you sure you want to increment the version number for your site?\",\"PerformanceTab_PortalVersionConfirmNo\":\"No\",\"PerformanceTab_PortalVersionConfirmYes\":\"Yes\",\"SaveConfirmationMessage\":\"Saved successfully\",\"VersionIncrementedConfirmation\":\"Version incremented successfully\"},\"SiteImportExport\":{\"nav_SiteImportExport\":\"Import / Export\",\"SiteImportExport.Header\":\"Import / Export\",\"ImportButton\":\"Import Data\",\"ExportButton\":\"Export Data\",\"LastImport\":\"Last Import\",\"LastExport\":\"Last Export\",\"LastUpdate\":\"Last Update\",\"JobDate.Header\":\"Date\",\"JobType.Header\":\"Type\",\"JobUser.Header\":\"Username\",\"JobPortal.Header\":\"Website\",\"JobStatus.Header\":\"Status\",\"LegendExport\":\"Site Export\",\"LegendImport\":\"Site Import\",\"LogSection\":\"Import / Export Log\",\"ShowSiteLabel\":\"Site: \",\"ShowFilterLabel\":\"Filter: \",\"JobTypeAll\":\"All Imports and Exports\",\"JobTypeImport\":\"All Imports\",\"JobTypeExport\":\"All Exports\",\"SearchPlaceHolder\":\"Search by Keyword\",\"SummaryNoteTitle\":\"*Note:\",\"SummaryNoteDescription\":\"Your site export files are securely stored within your website's App_Data/ExportImport folder.\",\"ExportSummary\":\"Export Summary\",\"NoJobs\":\"No jobs found\",\"BackToImportExport\":\"Back to Import / Export\",\"Export\":\"Export Data\",\"Import\":\"Import Data\",\"ExportSettings\":\"Export Settings\",\"Site\":\"Site\",\"Description\":\"Description\",\"Name\":\"Name\",\"IncludeInExport\":\"Include in Export\",\"PagesInExport\":\"Pages in Export\",\"BeginExport\":\"Begin Export\",\"Cancel\":\"Cancel\",\"Content\":\"Content\",\"ProfileProperties\":\"Profile Properties\",\"Permissions\":\"Permissions\",\"Extensions\":\"Extensions\",\"DeletionsInExport\":\"Include Deletions\",\"ExportName.ErrorMessage\":\"Name is required.\",\"ExportRequestSubmitted\":\"Your data export has been placed in the queue, and will begin shortly.\",\"ExportRequestSubmit.ErrorMessage\":\"Failed to submit the export site request. Please try again.\",\"ImportRequestSubmitted\":\"Your data import has been placed in the queue, and will begin shortly.\",\"ImportRequestSubmit.ErrorMessage\":\"Failed to submit the import site request. Please try again.\",\"JobStatus0\":\"Submitted\",\"JobStatus1\":\"In Progress\",\"JobStatus2\":\"Completed\",\"JobStatus3\":\"Failed\",\"JobStatus4\":\"Cancelled\",\"CreatedOn\":\"Created On\",\"CompletedOn\":\"Completed On\",\"ExportFile\":\"Export File\",\"lblLanguages.Help\":\"Select each of the secondary languages to be included in a multi-language template, or select the language of a single language site.\",\"lblLanguages\":\"Export Languages\",\"lblSelectLanguages\":\"-- Select Languages --\",\"lblNote\":\"The default language ({0}) will always be exported.\",\"AllSites\":\"--ALL SITES--\",\"SelectImportPackage\":\"Select Package to Import\",\"ClicktoSelect\":\"click to select package\",\"ClicktoDeselect\":\"click to deselect package\",\"PackageDescription\":\"Package Description\",\"Continue\":\"Continue\",\"NoPackages\":\"No import packages found\",\"SelectException\":\"Please select an import package and try again.\",\"AnalyzingPackage\":\"Analyzing Package for Site Import ...\",\"AnalyzedPackage\":\"Files Verified\",\"ImportSummary\":\"Import Summary\",\"Pages\":\"Pages\",\"Users\":\"Users\",\"UsersStep1\":\"Users (Step 1 / 2)\",\"UsersStep2\":\"Users (Step 2 / 2)\",\"Roles\":\"Roles and Groups\",\"Vocabularies\":\"Vocabularies\",\"PageTemplates\":\"Page Templates\",\"IncludeProfileProperties\":\"Include Profile Properties\",\"IncludePermissions\":\"Include Permissions\",\"IncludeExtensions\":\"Include Extensions\",\"IncludeDeletions\":\"Include Deletions\",\"IncludeContent\":\"Include Content\",\"FolderName\":\"Folder Name\",\"Timestamp\":\"Timestamp\",\"Assets\":\"Assets\",\"TotalExportSize\":\"Total Export Size\",\"ExportMode\":\"Export Mode\",\"OverwriteCollisions\":\"Overwrite Collisions\",\"FinishImporting\":\"To finish importing data to your site, click continue below, or click cancel to abort import.\",\"ExportModeComplete\":\"Full\",\"ExportModeDifferential\":\"Differential\",\"ConfirmCancel\":\"Yes, Cancel\",\"ConfirmDelete\":\"Yes, Remove\",\"KeepImport\":\"No\",\"Yes\":\"Yes\",\"No\":\"No\",\"CancelExport\":\"Cancel Export\",\"CancelImport\":\"Cancel Import\",\"CancelImportMessage\":\"Cancelling will abort the import process. Are you sure you want to cancel?\",\"Delete\":\"Delete\",\"JobCancelled\":\"Job has been cancelled.\",\"JobDeleted\":\"Job has been removed.\",\"JobCancel.ErrorMessage\":\"Failed to cancel this job, please try again.\",\"JobDelete.ErrorMessage\":\"Failed to remove this job, please try again.\",\"CancelJobMessage\":\"Cancelling will abort the process. Are you sure you want to cancel?\",\"DeleteJobMessage\":\"Are you sure you want to remove this job?\",\"SortByDateNewest\":\"Date (Newest)\",\"SortByDateOldest\":\"Date (Oldest)\",\"SortByName\":\"Name (Alphabetical)\",\"ShowSortLabel\":\"Sort By:\",\"Website\":\"Website\",\"Mode\":\"Mode\",\"FileSize\":\"Size\",\"VerifyPackage\":\"Just a moment, we are checking the package ...\",\"DeletedPortal\":\"Deleted\",\"RunNow\":\"Run Now\",\"NoExportItem.ErrorMessage\":\"Failed to submit the export site request. Please select export item(s) and try again.\",\"EmptyDateTime\":\"-- --\",\"SwitchOn\":\"On\",\"SwitchOff\":\"Off\"},\"EvoqSites\":{\"BasicSettings\":\"Basic configuration\",\"cmdCancel\":\"Cancel\",\"cmdExport\":\"Create Template\",\"ControlTitle_template\":\"Create Site Template\",\"DefaultLanguage\":\"{0} is the default language of the selected site\",\"ErrorPages\":\"You must select at least one page to be exported.\",\"ExportedMessage\":\"The new site template has been saved in folder:
{0}\",\"lblAdminOnly\":\"Visible to Administrators only\",\"lblDisabled\":\"Page is disabled\",\"lblEveryone\":\"Page is visible to everyone\",\"lblFiles.Help\":\"Check this box to export all site files and folders when creating the new template.\",\"lblFiles\":\"Include Files\",\"lblHidden\":\"Page is hidden in menu\",\"lblHome\":\"Homepage of the site\",\"lblLanguages.Help\":\"Select each of the secondary languages to be included in a multi-language template, or select the language of a single language site.\",\"lblLanguages\":\"Export Languages\",\"lblModules.Help\":\"Check this box to include module deploy permissions in the exported template. If this option is selected, it may also be necessary to export Roles if any custom roles has deployment permissions.\",\"lblModules\":\"Include Module Deployment Permissions\",\"lblMultilanguage.Help\":\"Check this box to create a template for a multi-language site and select each language to be included in addition to the default language.\",\"lblMultilanguage\":\"Export As Multilingual Site\",\"lblNote\":\"The default language ({0}) will always be exported.\",\"lblNoteSingleLanguage\":\"Note: the default language is {0}\",\"lblPages.Help\":\"Select the pages to be exported.
If you intend to use the exported template to create a new site, please be sure to select all, or selected Admin pages. If no Admin pages are available in the template, the new site will not have an Admin menu.\",\"lblPages\":\"Pages to Export\",\"lblProfile.Help\":\"Check this box to include custom profile property definitions in the template.\",\"lblProfile\":\"Include Profile Properties\",\"lblRedirect\":\"Page redirection\",\"lblRegistered\":\"Visible to registered users\",\"lblRoles.Help\":\"Check this box to export all security roles when creating the new template.\",\"lblRoles\":\"Include Roles\",\"lblSecure\":\"Visible to dedicated roles only\",\"lblSelectLanguages\":\"-- Select Languages --\",\"ModuleHelp\":\"

About Templates

Allows you to export a site template to be used to build new sites.

\",\"nav_Sites\":\"Sites\",\"plContent.Help\":\"Check this box to include the content within iPortable modules.\",\"plContent\":\"Include Content\",\"plDescription.Help\":\"Enter a description for the template file.\",\"plDescription\":\"Template Description\",\"plPortals.Help\":\"Select the site to export.\",\"plPortals\":\"Site\",\"plTemplateName.Help\":\"Enter a name for the template file to be created.\",\"plTemplateName\":\"Template File Name\",\"PortalSetup\":\"Site Setup\",\"Settings\":\"Advanced Configuration\",\"titleTemplateInfo\":\"Site Template Info\",\"valDescription.ErrorMessage\":\"Template description is required.\",\"valFileName.ErrorMessage\":\"Template file name is required.\",\"SiteDetails_Pages\":\"Pages\",\"SiteDetails_SiteID\":\"Site ID\",\"SiteDetails_Updated\":\"Updated\",\"SiteDetails_Users\":\"Users\",\"CancelPortalDelete\":\"No\",\"ConfirmPortalDelete\":\"Yes\",\"deletePortal\":\"Are you sure you want to delete {0}?\",\"AddNewSite.Header\":\"Add New Site\",\"AssignCurrentUserAsAdmin.Label\":\"Assign Current User as Administrator\",\"cmdCreateSite\":\"Create Site\",\"Description.Label\":\"Description\",\"Directory\":\"Directory\",\"Domain\":\"Domain\",\"HomeDirectory.Label\":\"Home Directory\",\"SiteTemplate.Label\":\"Site Template\",\"SiteType.Label\":\"Site Type:\",\"SiteUrl.Label\":\"Site URL\",\"Title.Label\":\"Title\",\"SiteGroups.TabHeader\":\"Site Groups\",\"SiteGroups_AdditionalSites.ErrorMessage\":\"You will need to create additional sites in order to create a Site Group.\",\"SiteGroups_Info.HelpText\":\"A Site Group will allow you to connect multiple sites for the purpose of sharing user account and profile information. Users will be able to access each site with a single account and also remain authenticated when navigating between sites. Before you create your first Site Group, please make sure that you have created the necessary sites and that if you want to use Single Sign On those sites use the same top-level domain name.\",\"Sites.TabHeader\":\"Sites\",\"SiteDetails_SiteGroup\":\"Site Group\",\"CreateSiteGroup_Create.Button\":\"Create Site Group\",\"EditSiteGroup_AddNew.Button\":\"Add Site Group\",\"EditSiteGroup_AuthenticationDomain.HelpText\":\"If you want to provide a single sign on (SSO) between the different sites in the site group, enter the common domain here. \\r\\nNB: SSO only works if all member sites share a common domain.\",\"EditSiteGroup_AuthenticationDomain.Label\":\"Authentication Domain\",\"EditSiteGroup_Delete.Button\":\"Delete\",\"EditSiteGroup_DeletePortalGroup.Cancel\":\"Cancel\",\"EditSiteGroup_DeletePortalGroup.Confirm\":\"Delete\",\"EditSiteGroup_DeletePortalGroup.Warning\":\"Are you sure you want to delete the portal group {0}?\",\"EditSiteGroup_Description.HelpText\":\"Enter a description for the Site Group\",\"EditSiteGroup_Description.Label\":\"Description\",\"EditSiteGroup_MasterSite.HelpText\":\"The master site is the site which is used to authenticate the shared users.\",\"EditSiteGroup_MasterSite.Label\":\"Master Site\",\"EditSiteGroup_MemberSites.HelpText\":\"You can manage the members of this site group using the list boxes on the right.\",\"EditSiteGroup_MemberSites.Label\":\"Member Sites\",\"EditSiteGroup_Name.HelpText\":\"Enter a name for the Site Group\",\"EditSiteGroup_Name.Label\":\"Name\",\"EditSiteGroup_Save.Button\":\"Save\",\"EditSiteGroup_ConfirmRemoval.Warning\":\"The following changes will be made when removing the site. Are you sure you want to continue?\",\"EditSiteGroup_RemoveUsersFromGroup.Cancel\":\"No\",\"EditSiteGroup_RemoveUsersFromGroup.Confirm\":\"Yes\",\"EditSiteGroup_RemoveUsersFromGroup.Warning\":\"Do you want to remove all users from Member Site when removing the site?\",\"EditSiteGroup_RemoveWithoutUsers.Info\":\"
    \\r\\n
  • Remove all modules shared by this site
  • \\r\\n
  • Remove all modules added to this site from another group sites
  • \\r\\n
\",\"EditSiteGroup_RemoveWithUsers.Info\":\"
    \\r\\n
  • Remove all users from the Member Site
  • \\r\\n
  • Remove all modules shared by this site
  • \\r\\n
  • Remove all modules added to this site from another group sites
  • \\r\\n
\",\"SiteGroup_FormDirty.Cancel\":\"No\",\"SiteGroup_FormDirty.Confirm\":\"Yes\",\"SiteGroup_FormDirty.Warning\":\"You have unsaved changes. Are you sure you want to continue?\",\"Close\":\"Close\",\"SiteExport\":\"Site Export\",\"SiteImport\":\"Site Import\",\"AddNewSite\":\"Add New Site\",\"Description\":\"Description\",\"Sites\":\"Sites\",\"None\":\"None\",\"AddToSiteGroup\":\"Add To Site Group\",\"NoSiteGroupsYet\":\"You don't have any site groups yet\",\"OnceAddedYouCanView\":\"Once added you can view all your site groups here.\",\"NoneSpecified\":\"None Specified\",\"valGroupName.ErrorMessage\":\"Group name is required.\",\"valGroupDescription.ErrorMessage\":\"Group description is required.\",\"AddRemoveSites\":\"Add / Remove Sites\"},\"Sites\":{\"BasicSettings\":\"Basic configuration\",\"cmdCancel\":\"Cancel\",\"cmdExport\":\"Create Template\",\"ControlTitle_template\":\"Create Site Template\",\"DefaultLanguage\":\"{0} is the default language of the selected site\",\"ErrorPages\":\"You must select at least one page to be exported.\",\"ExportedMessage\":\"The new site template has been saved in folder:
{0}\",\"ErrorAncestorPages\":\"You must select all ancestors from root level in order to include a child page.\",\"ChildExists\":\"The child site name you specified already exists. Please enter a different child site name.\",\"DuplicatePortalAlias\":\"The site alias name you specified already exists. Please choose a different site alias.\",\"DuplicateWithTab\":\"There is already a page with the same name as you entered for the site alias for this site. Please change the site alias and try again.\",\"InvalidHomeFolder\":\"The home folder you specified is not valid.\",\"InvalidName\":\"The site alias must not contain spaces or punctuation.\",\"InvalidPassword\":\"The password values entered do not match.\",\"SendMail.Error\":\"There was an error sending confirmation emails - {0} However, the site was created. Click Here To Access The New Site\",\"UnknownEmailAddress.Error\":\"There is no email address set on Site and/or Host level.\",\"UnknownSendMail.Error\":\"There was an error sending confirmation emails, however the site was still created. Click Here To Access The New Site\",\"lblAdminOnly\":\"Visible to Administrators only\",\"lblDisabled\":\"Page is disabled\",\"lblEveryone\":\"Page is visible to everyone\",\"lblFiles.Help\":\"Check this box to export all site files and folders when creating the new template.\",\"lblFiles\":\"Include Files\",\"lblHidden\":\"Page is hidden in menu\",\"lblHome\":\"Homepage of the site\",\"lblLanguages.Help\":\"Select each of the secondary languages to be included in a multi-language template, or select the language of a single language site.\",\"lblLanguages\":\"Export Languages\",\"lblModules.Help\":\"Check this box to include module deploy permissions in the exported template. If this option is selected, it may also be necessary to export Roles if any custom roles has deployment permissions.\",\"lblModules\":\"Include Module Deployment Permissions\",\"lblMultilanguage.Help\":\"Check this box to create a template for a multi-language site and select each language to be included in addition to the default language.\",\"lblMultilanguage\":\"Export As Multilingual Site\",\"lblNote\":\"The default language ({0}) will always be exported.\",\"lblNoteSingleLanguage\":\"Note: the default language is {0}\",\"lblPages.Help\":\"Select the pages to be exported.
If you intend to use the exported template to create a new site, please be sure to select all, or selected Admin pages. If no Admin pages are available in the template, the new site will not have an Admin menu.\",\"lblPages\":\"Pages to Export\",\"lblProfile.Help\":\"Check this box to include custom profile property definitions in the template.\",\"lblProfile\":\"Include Profile Properties\",\"lblRedirect\":\"Page redirection\",\"lblRegistered\":\"Visible to registered users\",\"lblRoles.Help\":\"Check this box to export all security roles when creating the new template.\",\"lblRoles\":\"Include Roles\",\"lblSecure\":\"Visible to dedicated roles only\",\"lblSelectLanguages\":\"-- Select Languages --\",\"ModuleHelp\":\"

About Templates

Allows you to export a site template to be used to build new sites.

\",\"nav_Sites\":\"Sites\",\"plContent.Help\":\"Check this box to include the content within iPortable modules.\",\"plContent\":\"Include Content\",\"plDescription.Help\":\"Enter a description for the template file.\",\"plDescription\":\"Template Description\",\"plPortals.Help\":\"Select the site to export.\",\"plPortals\":\"Site\",\"plTemplateName.Help\":\"Enter a name for the template file to be created.\",\"plTemplateName\":\"Template File Name\",\"PortalSetup\":\"Site Setup\",\"Settings\":\"Advanced Configuration\",\"titleTemplateInfo\":\"Site Template Info\",\"valDescription.ErrorMessage\":\"Template description is required.\",\"valFileName.ErrorMessage\":\"Template file name is required.\",\"SiteDetails_Pages\":\"Pages\",\"SiteDetails_SiteID\":\"Site ID\",\"SiteDetails_Updated\":\"Updated\",\"SiteDetails_Users\":\"Users\",\"CancelPortalDelete\":\"No\",\"ConfirmPortalDelete\":\"Yes\",\"deletePortal\":\"Are you sure you want to delete {0}?\",\"AddNewSite.Header\":\"Add New Site\",\"AssignCurrentUserAsAdmin.Label\":\"Assign Current User as Administrator\",\"cmdCreateSite\":\"Create Site\",\"Description.Label\":\"Description\",\"Directory\":\"Directory\",\"Domain\":\"Domain\",\"HomeDirectory.Label\":\"Home Directory\",\"SiteTemplate.Label\":\"Site Template\",\"SiteType.Label\":\"Site Type:\",\"SiteUrl.Label\":\"Site URL\",\"Title.Label\":\"Title\",\"CreateSite_AdminEmail.Label\":\"Email\",\"CreateSite_AdminFirstName.Label\":\"First Name\",\"CreateSite_AdminLastName.Label\":\"Last Name\",\"CreateSite_AdminPassword.Label\":\"Password\",\"CreateSite_AdminPasswordConfirm.Label\":\"Confirm Password\",\"CreateSite_AdminUserName.Label\":\"Administrator User Name\",\"CreateSite_SelectTemplate.Overlay\":\"click to select template\",\"EmailRequired.Error\":\"Email is required.\",\"FirstNameRequired.Error\":\"First name is required.\",\"LastNameRequired.Error\":\"Last name is required.\",\"PasswordConfirmRequired.Error\":\"Password confirmation is required.\",\"PasswordRequired.Error\":\"Password is required. Please enter a minimum of 7 characters.\",\"SiteAliasRequired.Error\":\"Site Alias is required.
  • Domain requirements: No spaces, no special characters (: , . only).
  • Directory requirements: No spaces, no special characters (_ , - only).
\",\"SiteTitleRequired.Error\":\"Site Title is required.\",\"UsernameRequired.Error\":\"User name is required.\",\"PortalDeletionDenied\":\"Site deletion not allowed.\",\"PortalNotFound\":\"Site not found.\",\"LoadMore.Button\":\"Load More\",\"BackToSites\":\"Back To Sites\",\"DeleteSite\":\"Delete Site\",\"ExportTemplate\":\"Export Template\",\"SiteSettings\":\"Site Settings\",\"ViewSite\":\"View Site\",\"SiteExport\":\"Site Export\",\"SiteImport\":\"Site Import\",\"AddNewSite\":\"Add New Site\",\"Sites\":\"Sites\",\"Description\":\"Description\"},\"EvoqSiteSettings\":{\"SitemapFileInvalid\":\"Unable to validate Sitemap file. Check the Sitemap is available, well formed and a valid Sitemap file. You can see Sitemap format on http://www.sitemaps.org/protocol.php\",\"SitemapUrlInvalid\":\"Invalid Sitemap URL format (use: 'http://www.site.com/sitemap.aspx')\",\"UrlAlreadyExists.ErrorMessage\":\"URL already exists. Please enter a different URL.\",\"valUrl.ErrorMessage\":\"Invalid URL format (use: 'http://www.site.com')\",\"VersioningGetError\":\"Failed to get versioning details\",\"VersioningSaveError\":\"Failed to save the versioning details\",\"DupFileNotExists\":\"Duplicates file not found.\",\"DupPatternAlreadyExists\":\"Duplicate pattern already exists.\",\"valDup.ErrorMessage\":\"Invalid Regular Expression pattern\",\"errorDuplicateDirectory\":\"Directory duplicated. This directory '{0}' is already added\",\"errorDuplicateFileExtension\":\"This file extension has been added\",\"errorExcludeDirectory\":\"Directory excluded. This directory '{0}' is already excluded by an ancestor directory\",\"errorIncludeDirectory\":\"Directory included. This directory '{0}' is already included by an ancestor directory\",\"errorNotAllowedFileExtension\":\"The file type you are trying to add is not allowable for upload within the system. Please first add this to the allowable file extensions in your host settings or contact your host administrator for assistance.\",\"errorRequiredDirectory\":\"Directory required\",\"errorRequiredFileExtension\":\"File extension required\",\"tooltipContentCrawlingAvailable\":\"Content Crawling is available\",\"tooltipContentCrawlingUnavailable\":\"Content Crawling is unavailable\",\"AddDirectory.Label\":\"Add Directory\",\"AddDuplicate.Label\":\"Add Regex Pattern\",\"AddFileType.Label\":\"Add File Type\",\"AddUrl.Label\":\"Add Url\",\"Cancel.Button\":\"Cancel\",\"DeleteCancel\":\"No\",\"DeleteConfirm\":\"Yes\",\"DeleteWarning\":\"Are you sure you want to delete {0}?\",\"Description.HelpText\":\"Decription of the regex (usually the module name that will allow spidering of)\",\"Description.Label\":\"Description\",\"Directory.Label\":\"Directory\",\"DnnImpersonation.Label\":\"DNN Impersonation\",\"DnnRoleImpersonation.HelpText\":\"For Local Site Only: you can tell the spider to impersonate a DNN role (make sure there exists a valid user for the role selected), in order to spider pages that otherwise would require a login.\",\"DnnRoleImpersonation.Label\":\"DNN Role Impersonation\",\"Duplicates.Header\":\"Duplicates\",\"Duplicates.HelpText\":\"Many modules use the same page to post dynamic content. This feature allows you exclude particular URLs ( or parts thereof ) from being indexed by regular expression patterns.\",\"EnableFileVersioning.HelpText\":\"Set whether or not File versioning is enabled or disabled for the site\",\"EnableFileVersioning\":\"Enable File Versioning:\",\"EnablePageVersioning.HelpText\":\"Set whether or not Page versioning is enabled or disabled for the site\",\"EnablePageVersioning\":\"Enable Page Versioning:\",\"EnableSpidering.HelpText\":\"Enable Spidering of this URL. If checked, the spider will create a new index for this site on its next run. If Unchecked, teh site will not be indexed, but any existing index will still be available for searches.\",\"EnableSpidering.Label\":\"Enable Spidering\",\"ExcludedDirectories.HelpText\":\"This feature allows you to manage directories that you would like to be excluded from the main search box. These are still searchable from within the DAM module.\",\"ExcludedDirectories.Label\":\"Excluded Directories\",\"ExcludedFileExtensions.HelpText\":\"This feature allows you to specify file extensions for files that you do not want to be displayed in search results.\",\"ExcludedFileExtensions.Label\":\"Excluded File Extensions\",\"FileExtension.Label\":\"File Extension\",\"FileType.Label\":\"File Type\",\"IncludedDirectories.HelpText\":\"This feature allows you to manage directories that you would like to be indexed by the search.\",\"IncludedDirectories.Label\":\"Included Directories\",\"IncludedFileExtensions.HelpText\":\"This feature makes the content of the documents in your system available to search. Here you may add file type extensions. Provided you have the appropriate iFilters installed on your system, the content will be crawled and available to be searched.\",\"IncludedFileExtensions.Label\":\"Included File Extensions\",\"MaxNumFileVersions.HelpText\":\"Set the number of file versions to keep. It must be between 5 and 25\",\"MaxNumFileVersions\":\"Maximum Number of File Versions Kept\",\"MaxNumPageVersions.HelpText\":\"Set the number of page versions to keep. It must be between 1 and 20\",\"MaxNumPageVersions\":\"Maximum Number of Page Versions Kept\",\"NoFolderSelected.Label\":\"< Select A Directory >\",\"RegexPattern.HelpText\":\"The regular expression that will allow the spider to recognize the parameters that the module uses to post to the same page and create dynamic content.\",\"RegexPattern.Label\":\"Regex Pattern\",\"Save.Button\":\"Save\",\"SelectFolder.Notify\":\"Please select a folder.\",\"SitemapUrl.HelpText\":\"Enter the URL of the sitemap file to use\",\"SitemapUrl.Label\":\"Sitemap URL\",\"UnsavedChanges\":\"You have unsaved changes. Are you sure you want to continue?\",\"Url.HelpText\":\"URL of the site to be spidered.\",\"Url.Label\":\"Url\",\"UrlPaths.Header\":\"Url Paths\",\"UrlPaths.HelpText\":\"This feature allows you to specify sites to be searchable.\",\"Versioning.Header\":\"Versioning\",\"WindowsAuth.Label\":\"Windows Auth\",\"WindowsAuthentication.HelpText\":\"Check this option if the Site's IIS security settings use Integrated Windows Authentication. If you leave user name and password blank, the Default Credentials Cache of the local server will be used.\",\"WindowsAuthentication.Label\":\"Windows Authentication\",\"WindowsDomain.HelpText\":\"Enter the Computer Domain of the user account that will be used.\",\"WindowsDomain.Label\":\"Windows Domain (optional)\",\"WindowsUserAccount.HelpText\":\"Enter the Login Name (user account) that will be used.\",\"WindowsUserAccount.Label\":\"Windows User Account (optional)\",\"WindowsUserPassword.HelpText\":\"Enter the Password that will be used.\",\"WindowsUserPassword.Label\":\"Windows User Password (optional)\",\"ContentCrawlingUnavailable\":\"Content crawling is unavailable.\"},\"SiteSettings\":{\"nav_SiteSettings\":\"Site Settings\",\"TabSiteInfo\":\"Site Info\",\"TabSiteBehavior\":\"Site Behavior\",\"TabLanguage\":\"Languages\",\"TabSearch\":\"Search\",\"TabDefaultPages\":\"Default Pages\",\"TabMessaging\":\"Messaging\",\"TabUserProfiles\":\"User Profiles\",\"TabSiteAliases\":\"Site Aliases\",\"TabMore\":\"More\",\"TabBasicSettings\":\"Basic Settings\",\"TabSynonyms\":\"Synonyms\",\"TabIgnoreWords\":\"Ignore Words\",\"TabCrawling\":\"Crawling\",\"TabFileExtensions\":\"File Extensions\",\"plPortalName\":\"Site Title\",\"plPortalName.Help\":\"Enter a site title. This title will show up in the Web browser Title Bar and will be a tooltip on the site Logo.\",\"plDescription\":\"Description\",\"plDescription.Help\":\"Enter a description for the site here.\",\"plKeyWords\":\"Keywords\",\"plKeyWords.Help\":\"Enter some keywords for your site (separated by commas). These keywords are used by search engines to help index the site.\",\"plTimeZone\":\"Site Time Zone\",\"plTimeZone.Help\":\"The TimeZone for the location of the site.\",\"plGUID\":\"GUID\",\"plGUID.Help\":\"The globally unique identifier which can be used to identify this site.\",\"plFooterText\":\"Copyright\",\"plFooterText.Help\":\"If supported by the theme this Copyright text is displayed on your site.\",\"plHomeDirectory\":\"Home Directory\",\"plHomeDirectory.Help\":\"The location used for the storage of files in this site.\",\"plLogoIcon\":\"LOGO AND ICONS\",\"plLogo\":\"Site Logo\",\"plLogo.Help\":\"Depending on the theme chosen, this image will typically appear in the top left corner of the page.\",\"plFavIcon\":\"Favicon\",\"plFavIcon.Help\":\"The selected favicon will be applied to all pages in the site.\",\"plIconSet\":\"Icon Set\",\"plIconSet.Help\":\"The selected iconset will be applied to all icons on the site.\",\"Save\":\"Save\",\"Cancel\":\"Cancel\",\"Yes\":\"Yes\",\"No\":\"No\",\"SettingsUpdateSuccess\":\"Settings have been updated.\",\"SettingsError\":\"Could not update settings. Please try later.\",\"SettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"valPortalName.ErrorMessage\":\"You must provide a title for your site.\",\"PageOutputSettings\":\"PAGE OUTPUT SETTINGS\",\"plPageHeadText.Help\":\"Enter any tags (i.e. META tags) that should be rendered in the \\\"HEAD\\\" tag of the HTML for this page.\",\"plPageHeadText\":\"HTML Page Header Tags\",\"plSplashTabId\":\"Splash Page\",\"plSplashTabId.Help\":\"The Splash Page for your site.\",\"plHomeTabId\":\"Home Page\",\"plHomeTabId.Help\":\"The Home Page for your site.\",\"plLoginTabId\":\"Login Page\",\"plLoginTabId.Help\":\"The Login Page for your site. Only pages with the Account Login module are listed.\",\"plUserTabId\":\"User Profile Page\",\"plUserTabId.Help\":\"The User Profile Page for your site.\",\"plRegisterTabId.Help\":\"The user registration page for your site.\",\"plRegisterTabId\":\"Registration Page\",\"plSearchTabId.Help\":\"The search results page for your site.\",\"plSearchTabId\":\"Search Results Page\",\"pl404TabId.Help\":\"The 404 Error Page for your site. Users will be redirected to this page if the URL they are navigating to results in a \\\"Page Not Found\\\" error.\",\"pl404TabId\":\"404 Error Page\",\"pl500TabId.Help\":\"The 500 Error Page for your site. Users will be redirected to this page if the URL they are navigating to results in an unexpected error.\",\"pl500TabId\":\"500 Error Page\",\"NoneSpecified\":\"None Specified\",\"plDisablePrivateMessage.Help\":\"Select to prevent users from sending messages to specific users or groups. This restriction doesn't apply to Administrators or Super Users.\",\"plDisablePrivateMessage\":\"Disable Private Message\",\"plMsgThrottlingInterval\":\"Throttling Interval in Minutes\",\"plMsgThrottlingInterval.Help\":\"Enter the number of minutes after which a user can send the next message. Zero indicates no restrictions. This restriction doesn't apply to Administrators or Super Users.\",\"plMsgRecipientLimit\":\"Recipient Limit\",\"plMsgRecipientLimit.Help\":\"Maximum number of recipients allowed in To field. A message sent to a Role is considered as a single recipient.\",\"plMsgProfanityFilters\":\"Enable Profanity Filters\",\"plMsgProfanityFilters.Help\":\"Enable to automatically convert profane (inappropriate) words and phrases into something equivalent. The list is managed on the Host->List->ProfanityFilters and the Admin->List->ProfanityFilters pages.\",\"plMsgAllowAttachments\":\"Allow Attachments\",\"plMsgAllowAttachments.Help\":\"Choose whether attachments can be attached to messages.\",\"plIncludeAttachments\":\"Include Attachments\",\"plIncludeAttachments.Help\":\"Choose whether attachments are to be included with outgoing email.\",\"plMsgSendEmail\":\"Send Emails\",\"plMsgSendEmail.Help\":\"Select if emails are to be sent to recipients for every message and notification.\",\"UserProfileSettings\":\"USER PROFILE SETTINGS\",\"UserProfileFields\":\"USER PROFILE FIELDS\",\"Profile_DefaultVisibility.Help\":\"Select default profile visibility mode for user profile.\",\"Profile_DefaultVisibility\":\"Default Profile Visibility Mode\",\"Profile_DisplayVisibility.Help\":\"Check this box to display the profile visibility control on the User Profile page.\",\"Profile_DisplayVisibility\":\"Display Profile Visibility\",\"redirectOldProfileUrlsLabel.Help\":\"Check this box to force old style profile URLs to be redirected to custom URLs.\",\"redirectOldProfileUrlsLabel\":\"Redirect Old Profile URLs\",\"vanilyUrlPrefixLabel.Help\":\"Enter a string to use to prefix vanity URLs.\",\"vanilyUrlPrefixLabel\":\"Vanity URL Prefix\",\"AllUsers\":\"All Users\",\"MembersOnly\":\"Members Only\",\"AdminOnly\":\"Admin Only\",\"FriendsAndGroups\":\"Friends and Groups\",\"VanityUrlExample\":\"myVanityURL\",\"Name.Header\":\"Name\",\"DataType.Header\":\"Data Type\",\"DefaultVisibility.Header\":\"Default Visibility\",\"Required.Header\":\"Required\",\"Visible.Header\":\"Visible\",\"ProfilePropertyDefinition_PropertyName\":\"Field Name\",\"ProfilePropertyDefinition_PropertyName.Help\":\"Enter a name for the property.\",\"ProfilePropertyDefinition_DataType\":\"Data Type\",\"ProfilePropertyDefinition_DataType.Help\":\"Select the data type for this field.\",\"ProfilePropertyDefinition_PropertyCategory\":\"Property Category\",\"ProfilePropertyDefinition_PropertyCategory.Help\":\"Enter the category for this property. This will allow the related properties to be grouped when dislayed to the user.\",\"ProfilePropertyDefinition_Length\":\"Length\",\"ProfilePropertyDefinition_Length.Help\":\"Enter the maximum length for this property. This will only be applicable for specific data types.\",\"ProfilePropertyDefinition_DefaultValue\":\"Default Value\",\"ProfilePropertyDefinition_DefaultValue.Help\":\"Optionally provide a default value for this property.\",\"ProfilePropertyDefinition_ValidationExpression\":\"Validation Expression\",\"ProfilePropertyDefinition_ValidationExpression.Help\":\"You can provide a regular expression to validate the data entered for this property.\",\"ProfilePropertyDefinition_Required\":\"Required\",\"ProfilePropertyDefinition_Required.Help\":\"Set whether this property is required.\",\"ProfilePropertyDefinition_ReadOnly.Help\":\"Read only profile properties can be edited by the Administrator but are read-only to the user.\",\"ProfilePropertyDefinition_ReadOnly\":\"Read Only\",\"ProfilePropertyDefinition_Visible\":\"Visible\",\"ProfilePropertyDefinition_Visible.Help\":\"Check this box if this property can be viewed and edited by the user or leave it unchecked if it is visible to Administrators only.\",\"ProfilePropertyDefinition_ViewOrder\":\"View Order\",\"ProfilePropertyDefinition_ViewOrder.Help\":\"Enter a number to determine the view order for this property or leave blank to add.\",\"ProfilePropertyDefinition_DefaultVisibility.Help\":\"You can set the default visibility of the profile property. This is the initial value of the visibility and applies if the user does not modify it, when editing their profile.\",\"ProfilePropertyDefinition_DefaultVisibility\":\"Default Visibility\",\"ProfilePropertyDefinition_PropertyCategory.Required\":\"The category is required.\",\"ProfilePropertyDefinition_PropertyName.Required\":\"The field name is required.\",\"ProfilePropertyDefinition_DataType.Required\":\"The data type is required.\",\"Next\":\"Next\",\"Localization.Help\":\"LOCALIZATION: The next step is to manage the localization of this property. Select the language you want to update, add new text or modify the existing text and then click Update.\",\"plLocales.Help\":\"Select the language.\",\"plLocales\":\"Choose Language\",\"plPropertyHelp.Help\":\"Enter the Help for this property in the selected language.\",\"plPropertyHelp\":\"Field Help\",\"plPropertyName.Help\":\"Enter the text for the property's name in the selected language.\",\"plPropertyName\":\"Field Name\",\"plCategoryName.Help\":\"Enter the text for the category's name in the selected language.\",\"plCategoryName\":\"Category Name\",\"plPropertyRequired.Help\":\"Enter the error message to display for this field when the property is Required but not present.\",\"plPropertyRequired\":\"Required Error Message\",\"plPropertyValidation.Help\":\"Enter the error message to display for this field when the property fails the Regular Expression Validation.\",\"plPropertyValidation\":\"Validation Error Message\",\"valPropertyName.ErrorMessage\":\"You need enter a name for this property.\",\"PropertyDefinitionDeletedWarning\":\"Are you sure you want to delete this profile field?\",\"DeleteSuccess\":\"The profile field has been deleted.\",\"DeleteError\":\"Could not delete the profile field. Please try later.\",\"DuplicateName\":\"This property already exists. Property names must be unique. Please select a different name for this property.\",\"RequiredTextBox\":\"The required length must be an integer greater than or equal to 0. If you use a TextBox field, the required length must be greater than 0.\",\"portalAliasModeButtonListLabel.Help\":\"This setting determines how the site responds to URLs which are defined as alias, but are not the default alias. Canonical (the alias URL is handled as a Canonical URL), Redirect (redirects to default alias) or None (no additional action is taken).\",\"portalAliasModeButtonListLabel\":\"Site Alias Mapping Mode\",\"plAutoAddPortalAlias.Help\":\"This setting determines how the site responds to URLs which are mapped to the site but are not currently in the list of aliases. This setting is effective in single-site configuration only. Select this option to automatically map new URL.\",\"plAutoAddPortalAlias\":\"Auto Add Site Alias\",\"InvalidAlias\":\"The site alias is invalid. Please choose a different Site Alias.\",\"DuplicateAlias\":\"The Site Alias you specified already exists. Please choose a different Site Alias.\",\"SetPrimary\":\"Set Primary\",\"UnassignPrimary\":\"Unassign Primary\",\"UrlMappingSettings\":\"URL MAPPING\",\"Alias.Header\":\"ALIAS\",\"Browser.Header\":\"BROWSER\",\"Theme.Header\":\"THEME\",\"Language.Header\":\"LANGUAGE\",\"Primary.Header\":\"PRIMARY\",\"Canonical\":\"Canonical\",\"Redirect\":\"Redirect\",\"None\":\"None\",\"SiteAliases\":\"SITE ALIASES\",\"SiteAlias\":\"Site Alias\",\"Language\":\"Language\",\"Browser\":\"Browser\",\"Theme\":\"Theme\",\"SiteAliasUpdateSuccess\":\"The site alias has been updated.\",\"SiteAliasCreateSuccess\":\"The site alias has been added.\",\"SiteAliasDeletedWarning\":\"Are you sure you want to delete this site alias?\",\"SiteAliasDeleteSuccess\":\"The site alias has been deleted.\",\"SiteAliasDeleteError\":\"Could not delete the site alias. Please try later.\",\"lblIndexWordMaxLength.Help\":\"Enter the maximum word size to be included in the Index.\",\"lblIndexWordMaxLength\":\"Maximum Word Length\",\"lblIndexWordMinLength.Help\":\"Enter the minimum word size to be included in the Index.\",\"lblIndexWordMinLength\":\"Minimum Word Length\",\"valIndexWordMaxLengthRequired.Error\":\"Maximum length of index word is required. Integer must be greater than the minimum length.\",\"valIndexWordMinLengthRequired.Error\":\"Minimum length of index word is required. Integer must be greater than 0.\",\"lblCustomAnalyzer.Help\":\"If this is empty, system will use standard analyzer to index content. if you want to use custom analyzer, please type the full name of analyzer class in this field. Note: If you want existing content to index with the new analyzer, you must visit Settings -> Site Settings -> Search in the Persona Bar for each site and click the \\\"Re-index Content\\\" button.\",\"lblCustomAnalyzer\":\"Custom Analyzer Type\",\"lblAllowLeadingWildcard.Help\":\"Check this box to return search criteria that occurs within a word rather than only at the beginning of the word. Warning: Enabling wildcard searching may cause performance issues.\",\"lblAllowLeadingWildcard\":\"Enable Partial-Word Search (Slow)\",\"SearchPriorities\":\"SEARCH PRIORITIES\",\"SearchIndex\":\"SEARCH INDEX\",\"lblAuthorBoost.Help\":\"Author boost value is associated with the author as it is indexed. The higher the value, the more relevant the field will be for determining the order of the results.\",\"lblAuthorBoost\":\"Author Boost\",\"lblContentBoost.Help\":\"Content boost value is associated with the content as it is indexed. The higher the value, the more relevant the field will be for determining the order of the results.\",\"lblContentBoost\":\"Content Boost\",\"lblDescriptionBoost.Help\":\"Description boost value is associated with the description as it is indexed. The higher the value, the more relevant the field will be for determining the order of the results.\",\"lblDescriptionBoost\":\"Description Boost\",\"lblTagBoost.Help\":\"Tag boost value is associated with the tag as it is indexed. The higher the value, the more relevant the field will be for determining the order of the results.\",\"lblTagBoost\":\"Tag Boost\",\"lblTitleBoost.Help\":\"Title boost value is associated with the title as it is indexed. The higher the value, the more relevant the field will be for determining the order of the results.\",\"lblTitleBoost\":\"Title Boost\",\"lblSearchIndexPath.Help\":\"Location where Search Index is stored. This location can be manually changed by creating a Host Setting \\\"Search_IndexFolder\\\" in database. It is advised to stop the App Pool prior to making this change. Content from the old folder must be manually copied to new location or a manual re-index must be triggered. \",\"lblSearchIndexPath\":\"Search Index Path\",\"lblSearchIndexDbSize.Help\":\"The total size of search index database files.\",\"lblSearchIndexDbSize\":\"Search Index Size\",\"lblSearchIndexActiveDocuments.Help\":\"The number of active documents in search index files\",\"lblSearchIndexActiveDocuments\":\"Active Documents\",\"lblSearchIndexDeletedDocuments.Help\":\"The number of deleted documents in search index files\",\"lblSearchIndexDeletedDocuments\":\"Deleted Documents\",\"lblSearchIndexLastModifiedOn.Help\":\"Last modified time of search index files.\",\"lblSearchIndexLastModifiedOn\":\"Last Modified On\",\"MessageIndexWarning\":\"Warning: Compacting or Re-Indexing should be done during non-peak hours as the process can be CPU intensive.\",\"CompactIndex\":\"Compact Index\",\"ReindexContent\":\"Re-index Content\",\"ReindexHostContent\":\"Re-index Host Content\",\"ReIndexConfirmationMessage\":\"Re-Index will cause existing content in the Index Store to be deleted. Re-index is done by search crawler(s) and depends on their scheduling frequency. Are you sure you want to continue?\",\"CompactIndexConfirmationMessage\":\"Compacting Index can be CPU consuming and may require twice the space of the current Index Store for processing. Compacting is done by site search crawler and depends on its scheduling frequency. Are you sure you want to continue?\",\"SynonymsTagDuplicated\":\"is already being used in another synonyms group.\",\"Synonyms\":\"Synonyms\",\"SynonymsGroup.Header\":\"Synonyms Group\",\"SynonymsGroupUpdateSuccess\":\"The synonyms group has been updated.\",\"SynonymsGroupCreateSuccess\":\"The synonyms group has been added.\",\"SynonymsGroupDeletedWarning\":\"Are you sure you want to delete this synonyms group?\",\"SynonymsGroupDeleteSuccess\":\"The synonyms group has been deleted.\",\"SynonymsGroupDeleteError\":\"Could not delete the synonyms group. Please try later.\",\"IgnoreWords\":\"Ignore Words\",\"IgnoreWordsUpdateSuccess\":\"The ignore words has been updated.\",\"IgnoreWordsCreateSuccess\":\"The ignore words has been added.\",\"IgnoreWordsDeletedWarning\":\"Are you sure you want to delete the ignore words?\",\"IgnoreWordsDeleteSuccess\":\"The ignore words has been deleted.\",\"IgnoreWordsDeleteError\":\"Could not delete the ignore words. Please try later.\",\"HtmlEditor\":\"Html Editor Manager\",\"OpenHtmlEditor\":\"Open HTML Editor Manager\",\"HtmlEditorWarning\":\"The HTML Editor Manager allows you to easily change your site's HTML editor or configure settings.\",\"BackToSiteBehavior\":\"BACK TO SITE BEHAVIOR\",\"BackToLanguages\":\"BACK TO LANGUAGES\",\"NativeName\":\"Native Name\",\"EnglishName\":\"English Name\",\"LanguageSettings\":\"SETTINGS\",\"Languages\":\"LANGUAGES\",\"systemDefaultLabel.Help\":\"The SystemDefault Language is the language that the application uses if no other language is available. It is the ultimate fallback.\",\"systemDefaultLabel\":\"System Default\",\"siteDefaultLabel.Help\":\"Select the default language for the site here. If the language is not enabled yet, it will be enabled automatically. The default language cannot be changed once Content Localization is enabled.\",\"siteDefaultLabel\":\"Site Default\",\"plUrl.Help\":\"Check this box to enable the Language Parameter in the URL.\",\"plUrl\":\"Enable Language Parameter in URLs\",\"detectBrowserLable.Help\":\"Check this box to detect the language selected on the user's browser and switch the site to that language.\",\"detectBrowserLable\":\"Enable Browser Language Detection\",\"allowUserCulture.Help\":\"Check this box to allow site users to select a different language for the interface than the one used for content.\",\"allowUserCulture\":\"Users May Choose Interface Language\",\"NeutralCulture\":\"Neutral Culture\",\"Culture.Header\":\"CULTURE\",\"Enabled.Header\":\"ENABLED\",\"fallBackLabel.Help\":\"Select the fallback language to be used if the selected language is not available.\",\"fallBackLabel\":\"Fallback Language\",\"enableLanguageLabel\":\"Enable Language\",\"languageLabel.Help\":\"Select the language.\",\"languageLabel\":\"Language\",\"LanguageUpdateSuccess\":\"The language has been updated.\",\"LanguageCreateSuccess\":\"The language has been added.\",\"DefaultLanguage\":\"*NOTE: This Language is the Site Default\",\"plEnableContentLocalization.Help\":\"Check this box to allow Administrators to enable content localization for their site.\",\"plEnableContentLocalization\":\"Allow Content Localization\",\"GlobalSetting\":\"This is a global setting. Changes to this setting will affect all of your sites.\",\"CreateLanguagePack\":\"Create Language Pack\",\"ResourceFileVerifier\":\"Resource File Verifier\",\"VerifyLanguageResources\":\"Verify Language Resource Files\",\"MissingFiles\":\"Missing Resource files: \",\"MissingEntries\":\"Files With Missing Entries: \",\"ObsoleteEntries\":\"Files With Obsolete Entries: \",\"ControlTitle_verify\":\"Resource File Verifier\",\"OldFiles\":\"Files Older Than System Default: \",\"DuplicateEntries\":\"Files With Duplicate Entries: \",\"ErrorFiles\":\"Malformed Resource Files: \",\"LanguagePackCreateSuccess\":\"The Language Pack(s) were created and can be found in the {0}/Install/Language folder.\",\"LanguagePackCreateFailure\":\"You must create resource files before you can create a language pack.\",\"lbLocale\":\"Resource Locale\",\"lbLocale.Help\":\"Select the locale for which you want to generate the language pack\",\"lblType\":\"Resource Pack Type\",\"lblType.Help\":\"Select the type of resource pack to generate.\",\"lblName\":\"Resource Pack Name\",\"lblName.Help\":\"The name of the generated resource pack can be modified. Notice that part of the name is fixed.\",\"valName.ErrorMessage\":\"The resource pack name is required.\",\"SelectModules\":\"Include module(s) in resource pack\",\"Core.LangPackType\":\"Core\",\"Module.LangPackType\":\"Module\",\"Provider.LangPackType\":\"Provider\",\"Full.LangPackType\":\"Full\",\"AuthSystem.LangPackType\":\"Auth System\",\"ModuleRequired.Error\":\"Please select at least one module from the list.\",\"BackToSiteSettings\":\"BACK TO SITE SETTINGS\",\"DefaultValue\":\"Default Value\",\"Global\":\"Global\",\"HighlightPendingTranslations\":\"Highlight Pending Translations\",\"LanguageEditor.Header\":\"Translate Resource Files\",\"LocalizedValue\":\"Localized Value\",\"ResourceFile\":\"Resource File\",\"ResourceFolder\":\"Resource Folder\",\"ResourceName\":\"Resource Name\",\"SaveTranslationsToFile\":\"Save Translations To File\",\"GlobalRoles\":\"Global Roles\",\"AllRoles\":\"All Roles\",\"RoleName.Header\":\"ROLE\",\"Select.Header\":\"SELECT\",\"Translators\":\"TRANSLATORS\",\"translatorsLabel.Help\":\"The selected roles will be granted explicit Edit Rights to all new pages and localized modules for this language.\",\"GlobalResources\":\"Global Resources\",\"LocalResources\":\"Local Resources\",\"SiteTemplates\":\"Site Templates\",\"Exceptions\":\"Exceptions\",\"HostSkins\":\"Host Themes\",\"PortalSkins\":\"Site Themes\",\"Template\":\"Template\",\"Updated\":\"File {0} has been saved.\",\"ResourceUpdated\":\"Resource file has been updated.\",\"InvalidLocale.ErrorMessage\":\"Current site does not support this locale ({0}).\",\"MicroServices\":\"MicroServices\",\"MicroServicesDescription\":\"Warning: once you enable a microservice, you will need contact support to disable it.\",\"SaveConfirm\":\"Are you sure you want to save the changes?\",\"MessageReIndexWarning\":\"Re-Index deletes existing content from the Index Store and then re-indexes everything. Re-Indexing is done as part of search crawler(s) scheduled task. To re-index immediately, the Search Crawler should be run manually from the scheduler.\",\"CurrentSiteDefault\":\"Current Site Default:\",\"CurrentSiteDefault.Help\":\"Once localized content is enabled, the default site culture will be permanently set and cannot be changed. Click Cancel now if you want to change the current site default.\",\"AllPagesTranslatable\":\"Make All Pages Translatable: \",\"AllPagesTranslatable.Help\":\"Check this box to make all pages within the default language translatable and created a copy of all translatable pages for each enabled language.\",\"EnableLocalizedContent\":\"Enable Localized Content\",\"EnableLocalizedContentHelpText\":\"Enabling localized content allows you to provide translated module content in addition to displaying translated static text. Once localized contetnt is enabled the default site culture will be permanently set and cannot be changed.\",\"EnableLocalizedContentClickCancel\":\"Click Cancel now if you want to change the current site default.\",\"TranslationProgressBarText\":\"[number] new pages are beign created for each language. Please wait as you localized pages are generated...\",\"TotalProgress\":\"Total Progress [number]%\",\"TotalLanguages\":\"Total Languages [number]\",\"Progress\":\"Progress [number]%\",\"ElapsedTime\":\"Elapsed Time: \",\"ProcessingPage\":\"{0}: Page {1} of {2} - {3}\",\"MessageCompactIndexWarning\":\"Compacting of Index reclaims space from deleted items in the Index Store. Compacting is recommended only when there are many 'Deleted Documents' in Index Store. Compacting may require twice the size of current Index Store during processing.\",\"cmdCreateLanguage\":\"Add New Language\",\"cmdAddWord\":\"Add Word\",\"cmdAddField\":\"Add Field\",\"cmdAddAlias\":\"Add Alias\",\"cmdAddGroup\":\"Add Group\",\"DisableLocalizedContent\":\"Disable Localized Content\",\"TranslatePageContent\":\"Translate Page Content\",\"AddAllUnlocalizedPages\":\"Add All Unlocalized Pages\",\"ViewPage\":\"[ View Page ]\",\"EditPageSettings\":\"[ Edit Page Settings ]\",\"ActivatePages\":\"Activate Pages in This Language: \",\"ActivatePages.Help\":\"A language must be enabled before it can be activated and it must be deactivated before it can be disabled.\",\"MarkAllPagesAsTranslated\":\"Mark All Pages As Translated\",\"EraseAllLocalizedPages\":\"Erase All Localized Pages\",\"PublishTranslatedPages\":\"Publish All Pages\",\"UnpublishTranslatedPages\":\"Unpublish All Pages\",\"PagesToTranslate\":\"Pages To Translate:\",\"plImprovementProgram.Help\":\"Check this box to participate in the DNN Improvement Program. Learn More.\",\"plImprovementProgram\":\"Participate in DNN Improvement Program:\",\"plUpgrade\":\"Check for Software Upgrades\",\"plUpgrade.Help\":\"Check this box to have the application check if there are upgrades available.\",\"Pages.Header\":\"PAGES\",\"Translated.Header\":\"TRANSLATED\",\"Active.Header\":\"ACTIVE\",\"PropertyDefinitionUpdateSuccess\":\"Property Definitions have been updated.\",\"ViewOrderUpdateSuccess\":\"View orders have been updated.\",\"SaveOrCancelWarning\":\"You have unsaved changes. Please save or cancel your changes first.\",\"DeactivateLanguageWarning\":\"Are you sure you want to deactivate {0}?\",\"DeletedAllLocalizedPages\":\"Localized pages deleted successfully.\",\"EraseTranslatedPagesWarning\":\"You are about to permanently remove all translations for the '{0}' language. Are you sure you want to continue?\",\"Mode.HelpText\":\"Select Global to edit the base file for a given language; the other option will only affect the selected site.\",\"Mode.Label\":\"Mode\",\"PagesSuccessfullyLocalized\":\"Pages successfully localized.\",\"PublishedAllTranslatedPages\":\"Pages published successfully.\",\"UnPublishedAllTranslatedPages\":\"Pages successfully unpublished.\",\"SelectResourcePlaceholder\":\"-- Select --\",\"PagesSuccessfullyTranslated\":\"Pages successfully translated.\",\"DisableLanguageWarning\":\"Are you sure you want to disable the language {0}\",\"MakeNeutralWarning\":\"This will delete all translated versions of the page. Only the default culture version of the page will remain. Are you sure you want to do this?\",\"SiteSelectionLabel\":\"EDITING SITE\",\"LanguageSelectionLabel\":\"LANGUAGE\",\"ListEntryText\":\"Text\",\"ListEntryValue\":\"Value\",\"NoData\":\"No records to display\",\"cmdAddEntry\":\"Add Entry\",\"ListEntries\":\"List Entries\",\"ListEntries.Help\":\"MANAGE LIST ENTRIES: The property details have been updated. This property is a List type property. The next step is to define the list entries.\",\"ListEntryCreateSuccess\":\"The list entry has been created.\",\"ListEntryUpdateSuccess\":\"The list entry has been updated.\",\"ListEntryDeleteSuccess\":\"The list entry has been deleted.\",\"ListEntryDeleteError\":\"Could not delete the list entry. Please try later.\",\"ListEntryDeletedWarning\":\"Are you sure you want to delete the list entry?\",\"InvalidEntryText\":\"Text is required\",\"InvalidEntryValue\":\"Value is required\",\"EnableSortOrder\":\"Enable Sort Order\",\"EnableSortOrder.Help\":\"Check this box to enable custom sorting of entries in this list.\",\"BrowseAction\":\"Press {save|[ENTER]} to save, or {cancel|[ESC]} to cancel\",\"BrowseButton\":\"Browse File System\",\"DefaultImageTitle\":\"Image\",\"DragDefault\":\"Drag and Drop a File or Select an Option\",\"DragOver\":\"Drag and Drop a File\",\"File\":\"File\",\"Folder\":\"Folder\",\"LinkButton\":\"Enter URL Link\",\"LinkInputAction\":\"Press {save|[ENTER]} to save, or {cancel|[ESC]} to cancel\",\"LinkInputPlaceholder\":\"http://example.com/imagename.jpg\",\"LinkInputTitle\":\"URL Link\",\"NotSpecified\":\"\",\"SearchFilesPlaceHolder\":\"Search Files...\",\"SearchFoldersPlaceHolder\":\"Search Folders...\",\"UploadButton\":\"Upload a File\",\"UploadComplete\":\"Upload Complete\",\"UploadDefault\":\"myImage.jpg\",\"UploadFailed\":\"Upload Failed\",\"Uploading\":\"Uploading...\",\"WrongFormat\":\"Wrong Format\",\"Host\":\"Host\"},\"SqlConsole\":{\"Connection\":\"Connection:\",\"nav_SqlConsole\":\"SQL Console\",\"Query\":\"Query:\",\"RunScript\":\"Run Script\",\"SaveQuery\":\"Save Query\",\"Title\":\"Sql Console\",\"UploadFile\":\"Upload a File\",\"AllEntries\":\"All Entries\",\"Export\":\"Export\",\"NewQuery\":\"\",\"PageInfo\":\"Showing {0}-{1} of {2} items\",\"QueryTabTitle\":\"Query {0}\",\"SaveQueryInfo\":\"Enter a name for this query:\",\"Search\":\"Search\",\"PageSize\":\"{0} Entries\",\"ExportClipboard\":\"Copy to Clipboard\",\"ExportClipboardFailed\":\"Copy to Clipboard Failed!\",\"ExportClipboardSuccessful\":\"Copied to Clipboard!\",\"ExportCSV\":\"Export to CSV\",\"ExportExcel\":\"Export to Excel\",\"ExportPDF\":\"Export to PDF\",\"NoData\":\"The query did not return any data.\",\"QueryFailed\":\"The query failed!\",\"QuerySuccessful\":\"The query completed successfully!\",\"EmptyName\":\"Can't save query with empty name.\",\"DeleteConfirm\":\"Please confirm you wish to delete this query.\",\"Cancel\":\"Cancel\",\"Delete\":\"Delete\"},\"TaskScheduler\":{\"ContentOptions.Action\":\"View Schedule Status\",\"ScheduleHistory.Action\":\"View Schedule History\",\"plType\":\"Full Class Name and Assembly\",\"plEnabled\":\"Enable Schedule\",\"plTimeLapse\":\"Frequency\",\"plTimeLapse.Help\":\"Set the time period to determine how frequently this task will run.\",\"Minutes\":\"Minutes\",\"Days\":\"Days\",\"Hours\":\"Hours\",\"Weeks\":\"Weeks\",\"Months\":\"Months\",\"Years\":\"Years\",\"plRetryTimeLapse\":\"Retry Time Lapse\",\"plRetryTimeLapse.Help\":\"Set the time period to rerun this task after a failure.\",\"plRetainHistoryNum\":\"Retain Schedule History\",\"plRetainHistoryNum.Help\":\"Select the number of items to be retained in the schedule history.\",\"plAttachToEvent\":\"Run on Event\",\"plAttachToEvent.Help\":\"Select \\\"Application Start\\\" to run this event when the web app starts. Note that events run on APPLICATION_END may not run reliably on some hosts.\",\"None\":\"None\",\"All\":\"All\",\"APPLICATION_START\":\"APPLICATION_START\",\"plCatchUpEnabled\":\"Catch Up Tasks\",\"plCatchUpEnabled.Help\":\"Check this box to run this event once for each frequency that was missed during any server downtime.\",\"plObjectDependencies\":\"Object Dependencies\",\"plObjectDependencies.Help\":\"Enter the tables or other objects that this event is dependent on. E.g. \\\"Users,UsersOnline\\\"\",\"UpdateSuccess\":\"Your changes have been saved.\",\"DeleteSuccess\":\"The schedule item has been deleted.\",\"DeleteError\":\"Could not delete the schedule item. Please try later.\",\"ControlTitle_edit\":\"Edit Task\",\"ModuleHelp\":\"

About Schedule

Allows you to schedule tasks to be run at specified intervals.

\",\"plType.Help\":\"This is the full class name followed by the assembly name. E.g. \\\"DotNetNuke.Entities.Users.PurgeUsersOnline, DOTNETNUKE\\\"\",\"plServers\":\"Server Name:\",\"plServers.Help\":\"Filter scheduled tasks by a single server or choose All to view all tasks.\",\"Seconds\":\"Seconds\",\"plEnabled.Help\":\"Check this box to enable the schedule for this job.\",\"plFriendlyName.Help\":\"Enter a name for the scheduled job.\",\"plFriendlyName\":\"Friendly Name\",\"cmdRun\":\"Run Now\",\"cmdDelete\":\"Delete\",\"RunNow\":\"Item added to schedule for immediate execution.\",\"TypeRequired\":\"The type of schedule item is required.\",\"TimeLapseValidator.ErrorMessage\":\"Frequency range is from 1 to 999999.\",\"TimeLapseRequired.ErrorMessage\":\"You must set Frequency value from 1 to 999999.\",\"RetryTimeLapseValidator.ErrorMessage\":\"Retry Frequency range is from 1 to 999999.\",\"plScheduleStartDate\":\"Schedule Start Date/Time\",\"plScheduleStartDate.Help\":\"Enter the start date/time for scheduled job. Note: If the server is down at the scheduled time or other jobs are already running, then the job will run as soon as the server comes back on online.\",\"InvalidFrequencyAndRetry\":\"The values for frequency and retry are invalid as the retry interval exceeds the frequency interval.\",\"AddContent.Action\":\"Add Item To Schedule\",\"Type.Header\":\"Type\",\"Enabled.Header\":\"ENABLED\",\"Enabled.Label\":\"Enabled\",\"Frequency.Header\":\"FREQUENCY\",\"RetryTimeLapse.Header\":\"RETRY TIME LAPSE\",\"NextStart.Header\":\"Next Start\",\"NextStart.Label\":\"Next Start\",\"lnkHistory\":\"History\",\"TimeLapsePrefix\":\"Every\",\"Minute\":\"Minute\",\"Hour\":\"Hour\",\"Day\":\"Day\",\"n/a\":\"n/a\",\"ControlTitle_\":\"Schedule\",\"Name.Header\":\"Task Name\",\"History\":\"View History\",\"Status\":\"View Status\",\"ViewLog.Header\":\"Log\",\"plSchedulerMode\":\"Scheduler Mode:\",\"plSchedulerMode.Help\":\"The Timer Method maintains a separate thread to execute scheduled tasks while the worker process is alive. Alternatively, the Request Method executes tasks when HTTP Requests are made. You can also disable the scheduler by selecting Disabled.\",\"Disabled\":\"Disabled\",\"TimerMethod\":\"Timer Method\",\"RequestMethod\":\"Request Method\",\"Settings\":\"Settings\",\"plScheduleAppStartDelay\":\"Schedule Delay:\",\"plScheduleAppStartDelay.Help\":\"Number of minutes the system should wait before it runs any scheduled jobs after a restart. Default is 1 min.\",\"ScheduleAppStartDelayValidation\":\"Value should be in minutes.\",\"Started.Header\":\"Started\",\"Ended.Header\":\"Ended\",\"Duration.Header\":\"Duration (seconds)\",\"Succeeded.Header\":\"Succeeded\",\"Start/End/Next Start.Header\":\"Start/End/Next Start\",\"Notes.Header\":\"Notes\",\"ControlTitle_history\":\"Task History\",\"Description.Header\":\"Description\",\"Start.Header\":\"Start/End/Next\",\"Server.Header\":\"Ran On Server\",\"lblStatusLabel\":\"Status:\",\"lblMaxThreadsLabel\":\"Max Threads:\",\"lblActiveThreadsLabel\":\"Active Threads:\",\"lblFreeThreadsLabel\":\"Free Threads:\",\"lblCommand\":\"Command:\",\"lblProcessing\":\"Items Processing\",\"ScheduleID.Header\":\"ID: \",\"ObjectDependencies.Header\":\"Object Dependencies: \",\"TriggeredBy.Header\":\"Triggered By: \",\"Thread.Header\":\"Thread: \",\"Servers.Header\":\"Servers: \",\"lblQueue\":\"Items in Queue\",\"Overdue.Header\":\"Overdue (seconds): \",\"TimeRemaining.Header\":\"Time Remaining: \",\"NoTasks\":\"There are no tasks in the queue\",\"NoTasksMessage\":\"Whenever you have tasks in queue or processing, they will appear here.\",\"DisabledMessage\":\"Scheduler is currently disabled.\",\"ManuallyStopped\":\"Manually stopped from scheduler status page\",\"cmdStart\":\"Start\",\"cmdStop\":\"Stop\",\"cmdSave\":\"Save\",\"ControlTitle_status\":\"Schedule Status\",\"Stop.Header\":\"Stop\",\"TabTaskQueue\":\"TASK QUEUE\",\"TabScheduler\":\"SCHEDULER\",\"TabHistory\":\"HISTORY\",\"TabHistoryTitle\":\"Schedule History\",\"HistoryModalTitle\":\"Task History: \",\"Cancel\":\"Cancel\",\"Update\":\"Update\",\"NOT_SET\":\"NOT SET\",\"WAITING_FOR_OPEN_THREAD\":\"WAITING FOR OPEN THREAD\",\"RUNNING_EVENT_SCHEDULE\":\"RUNNING EVENT SCHEDULE\",\"RUNNING_TIMER_SCHEDULE\":\"RUNNING TIMER SCHEDULE\",\"RUNNING_REQUEST_SCHEDULE\":\"RUNNING REQUEST SCHEDULE\",\"WAITING_FOR_REQUEST\":\"WAITING FOR REQUEST\",\"SHUTTING_DOWN\":\"SHUTTING DOWN\",\"STOPPED\":\"STOPPED\",\"SchedulerUpdateSuccess\":\"Scheduler settings updated successfully.\",\"SchedulerUpdateError\":\"Could not update schedule settings. Please try later.\",\"SchedulerStartSuccess\":\"Scheduler started successfully.\",\"SchedulerStartError\":\"Could not start scheduler. Please try later.\",\"SchedulerStopSuccess\":\"Scheduler stopped successfully.\",\"SchedulerStopError\":\"Could not stop scheduler. Please try later.\",\"StartSchedule\":\"Start Schedule\",\"StopSchedule\":\"Stop Schedule\",\"lblStartDelay\":\"Schedule Start Delay (mins):\",\"processing\":\"Processing ...\",\"RunNowError\":\"Could not add this item to schedule. Please try later.\",\"DescriptionColumn\":\"DESCRIPTION\",\"RanOnServerColumn\":\"RAN ON SERVER\",\"DurationColumn\":\"DURATION (SECS)\",\"SucceededColumn\":\"SUCCEEDED\",\"StartEndColumn\":\"START/END\",\"nav_TaskScheduler\":\"Scheduler\",\"ScheduleItemUpdateSuccess\":\"Schedule item updated successfully.\",\"ScheduleItemUpdateError\":\"Could not update the schedule item. Please try later.\",\"ScheduleItemCreateSuccess\":\"Schedule item created successfully.\",\"ScheduleItemCreateError\":\"Could not create the schedule item. Please try later.\",\"ScheduleItemDeletedWarning\":\"Are you sure you want to delete this schedule item?\",\"Yes\":\"Yes\",\"No\":\"No\",\"SettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"ServerTime\":\"Server Time:\",\"cmdAddTask\":\"Add Task\",\"pageSizeOption\":\"{0} results per page\",\"pagerSummary\":\"Showing {0}-{1} of {2} results\",\"Servers\":\"Servers\",\"LessThanMinute\":\"less than a minute\",\"MinuteSingular\":\"minute\",\"MinutePlural\":\"minutes\",\"HourSingular\":\"hour\",\"HourPlural\":\"hours\",\"DaySingular\":\"day\",\"DayPlural\":\"days\",\"Prompt_FetchTaskFailed\":\"Failed to fetch the task details. Please see event log for more details.\",\"Prompt_FlagCantBeEmpty\":\"When specified, the --{0} flag cannot be empty.\\\\n\",\"Prompt_FlagMustBeNumber\":\"When specified, the --{0} flag must be a number.\\\\n\",\"Prompt_FlagMustBeTrueFalse\":\"When specified, the --{0} flag must be True or False.\\\\n\",\"Prompt_FlagRequired\":\"The --{0} flag is required.\\\\n\",\"Prompt_ScheduleFlagRequired\":\"You must specify the scheduled item's ID using the --{0} flag or by passing the number as the first argument.\\\\n\",\"Prompt_TaskAlreadyDisabled\":\"Task is already disabled.\",\"Prompt_TaskAlreadyEnabled\":\"Task is already enabled.\",\"Prompt_TaskNotFound\":\"No task not found with id {0}.\",\"Prompt_TasksFound\":\"{0} tasks found.\",\"Prompt_TaskUpdated\":\"Task updated successfully.\",\"Prompt_TaskUpdateFailed\":\"Failed to update the task.\",\"Prompt_GetTask_Description\":\"Retrieves details for the specified Scheduler Task. DNN refers to these as schedules or scheduler items. Prompt refers to them as tasks.\",\"Prompt_GetTask_FlagId\":\"The Schedule ID for the item you want to retrieve. If you pass the ID as the first value after the command name, you do not need to explicitly use the --id flag name.\",\"Prompt_GetTask_ResultHtml\":\"

Get A Task

\\r\\n \\r\\n get-task 11\\r\\n \\r\\n OR\\r\\n \\r\\n get-task --id 11\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleId:11
FreindlyName:Messaging Dispatch
TypeName:DotNteNuke.Services.Social.Messaging.Scheduler.CoreMessagingScheduler,DotNetNuke
NextStart:2017-01-02T08:19:49.53
Enabled:true
CatchUp:false
Created:0001-01-01T00:00:00
StartDate:0001-01-01T00:00:00
\",\"Prompt_ListTasks_Description\":\"Retrieves a list of scheduled tasks based on the specified criteria. DNN refers to these as schedules or scheduler items. Prompt refers to them as tasks.\",\"Prompt_ListTasks_FlagEnabled\":\"When specified, Prompt will return tasks that are enabled (if this flag is set to true) or disabled (if this is set to false). If this flag is not specified, Prompt will return tasks regardless of their enabled status.\",\"Prompt_ListTasks_FlagName\":\"When specified, Prompt will return tasks whose Friendly Name matches the expression. This supports wildcard matching via the asterisk ( * ) to represent zero (0) or more characters.\",\"Prompt_ListTasks_ResultHtml\":\"

List All Tasks

\\r\\n \\r\\n list-tasks\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleIdFriendlyNameNextStartEnabled
11MessagingDispatch2017-01-02T08:19:49.53true
9Purge Cache2017-01-02T08:08:07.4342281-07:00false
12Purge Client Dependency Files2017-01-02T08:08:07.4342281-07:00false
4Purge Log Buffer2017-01-02T08:08:07.4342281-07:00false
10Purge Module Cache2017-01-02T08:19:50.533true
...
10 tasks found
\\r\\n\\r\\n

List All Enabled Tasks

\\r\\n \\r\\n list-tasks true\\r\\n \\r\\n OR\\r\\n \\r\\n list-tasks --enabled true\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleIdFriendlyNameNextStartEnabled
11MessagingDispatch2017-01-02T08:19:49.53true
10Purge Module Cache2017-01-02T08:19:50.533true
3Purge Schedule History2017-01-03T08:08:10.45true
6Search: Site Crawler2017-01-02T09:09:09.94true
4 tasks found
\\r\\n\\r\\n

List All Tasks Whose Name Begins With "purge"

\\r\\n \\r\\n list-tasks purge*\\r\\n \\r\\n OR\\r\\n \\r\\n list-tasks --name purge*\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleIdFriendlyNameNextStartEnabled
9Purge Cache2017-01-02T09:08:55.2867143-07:00false
12Purge Client Dependency Files2017-01-02T09:08:55.2867143-07:00false
4Purge Log Buffer2017-01-02T09:08:55.2867143-07:00false
10Purge Module Cache2017-01-02T09:17:20.48true
13Purge Output Cache2017-01-02T09:08:55.2867143-07:00false
3Purge Schedule History2017-01-03T08:08:10.45true
1Purge Users Online2017-01-02T09:08:55.2867143-07:00false
7 tasks found
\\r\\n\\r\\n

List All Enabled Tasks Whose Name Begins With "purge"

\\r\\n \\r\\n list-tasks purge* --enabled true\\r\\n \\r\\n OR\\r\\n \\r\\n list-tasks true --name purge*\\r\\n \\r\\n OR\\r\\n \\r\\n list-tasks --enabled true --name purge*\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleIdFriendlyNameNextStartEnabled
10Purge Module Cache2017-01-02T09:17:20.48true
3Purge Schedule History2017-01-03T08:08:10.45true
2 tasks found
\",\"Prompt_SetTask_Description\":\"Set or update properties on the specified Scheduled task.\",\"Prompt_SetTask_FlagEnabled\":\"When true, the specified task will be enabled. When false, the specified task will be disabled.\",\"Prompt_SetTask_FlagId\":\"The Schedule ID of the task you want to update. You can avoid explicitly typing the --id flag by just passing the Schedule ID as the first argument.\",\"Prompt_SetTask_ResultHtml\":\"

Disable the "Purge Schedule History" Task

\\r\\n \\r\\n set-task 3 --enabled false\\r\\n \\r\\n OR\\r\\n \\r\\n set-task --id 3 --enabled false\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleId:3
FreindlyName:Purge Schedule History
TypeName:DotNetNuke.Services.Scheduling.PurgeScheduleHistory, DOTNETNUKE
NextStart:2017-01-02T09:08:55.2867143-07:00
Enabled:false
CatchUp:false
Created:0001-01-01T00:00:00
StartDate:2017-01-02T09:47:31.79
\\r\\n 1 task updated\\r\\n
\",\"Prompt_SchedulerCategory\":\"Scheduler Commands\"},\"Themes\":{\"Containers\":\"Containers\",\"Layouts\":\"Layouts\",\"nav_Themes\":\"Themes\",\"Settings\":\"Settings\",\"SiteTheme\":\"Site Theme:\",\"Themes\":\"Themes\",\"Apply\":\"Apply\",\"Cancel\":\"Cancel\",\"Container\":\"Container\",\"EditThemeAttributes\":\"Edit Theme Attributes\",\"File\":\"File\",\"Layout\":\"Layout\",\"Localized\":\"Localized\",\"ParseThemePackage\":\"Parse Theme Package\",\"Portable\":\"Portable\",\"SetEditContainer\":\"Set Edit Container\",\"SetEditLayout\":\"Set Edit Layout\",\"SetSiteContainer\":\"Set Site Container\",\"SetSiteLayout\":\"Set Site Layout\",\"Setting\":\"Setting\",\"StatusEdit\":\"E\",\"StatusSite\":\"S\",\"Theme\":\"Theme\",\"Token\":\"Token\",\"Value\":\"Value\",\"RestoreTheme\":\"[ Restore Default Theme ]\",\"Confirm\":\"Confirm\",\"RestoreThemeConfirm\":\"Are you sure you want to restore default theme?\",\"ApplyConfirm\":\"Are you sure you want to apply this theme?\",\"DeleteConfirm\":\"Are you sure you want to delete this theme?\",\"UsePackageUninstall\":\"This theme is installed as a package, please go to Extensions and uninstall it from there.\",\"SearchPlaceHolder\":\"Search\",\"Successful\":\"Operation Complete!\",\"NoPermission\":\"You don't have permission to perform this action.\",\"NoThemeFile\":\"No theme files exist in this theme.\",\"ThemeNotFound\":\"Can't find the specific theme.\",\"NoneSpecified\":\"-- Select --\",\"ApplyTheme\":\"Apply\",\"DeleteTheme\":\"Delete\",\"PreviewTheme\":\"Preview\",\"InstallTheme\":\"Install New Theme\",\"BackToThemes\":\"Back to Themes\",\"GlobalThemes\":\"Global Themes\",\"SiteThemes\":\"Site Themes\",\"ThemeLevelAll\":\"All Themes\",\"ThemeLevelGlobal\":\"Global Themes\",\"ThemeLevelSite\":\"Site Themes\",\"ShowFilterLabel\":\"Showing:\",\"NoThemes\":\"No Themes Found.\",\"NoThemesMessage\":\"Try adjusting your search filters or install a new theme to your library.\"},\"EvoqUsers\":{\"btnCreateUser\":\"Add User\",\"lblContributions\":\"{0} Total Contributions\",\"lblEngagement\":\"Engagement\",\"lblExperience\":\"Experience\",\"lblInfluenece\":\"Influence\",\"lblLastActive\":\"Last Active:\",\"lblRank\":\"Rank\",\"lblReputation\":\"Reputation\",\"lblTimeOnSite\":\"Time On Site:\",\"LoginAsUser\":\"Login As User\",\"nav_Users\":\"Users\",\"RecentActivity\":\"Recent Activity\",\"RecentActivityPagingSummaryText\":\"Showing {0}-{1} of {2} entries\",\"ShowUserActivity.title\":\"User Activity\",\"usersPageSizeOptionText\":\"{0} users per page\",\"usersSummaryText\":\"Showing {0}-{1} of {2} entries\",\"ViewAssets\":\"View Assets\",\"err_NoUserFolder\":\"{0} does not own any assets.\",\"CannotFindScoringActionDefinition\":\"Cannot Find Scoring Action Definition\",\"NegativeExperiencePoints\":\"Experience points can not be negative\",\"ReputationGreaterThanExperience\":\"Reputation points can not be more than experience\",\"Cancel\":\"Cancel\",\"editPoints\":\"Edit Points\",\"lblNotes\":\"Notes\",\"Save\":\"Save\"},\"Users\":{\"All\":\"All\",\"Deleted\":\"Deleted\",\"nav_Users\":\"Users\",\"RegisteredUsers\":\"Registered Users\",\"SuperUsers\":\"Superusers\",\"UnAuthorized\":\"Unauthorized\",\"SearchPlaceHolder\":\"Search Users\",\"AccountSettings\":\"Account Settings\",\"Add\":\"Add\",\"AddRolePlaceHolder\":\"Begin typing to add a role to this user.\",\"Approved.Help\":\"Indicates whether this user is authorized for the site.\",\"Approved\":\"Authorized:\",\"Authorized.Header\":\"Status\",\"Authorized\":\"Authorized\",\"btnApply\":\"Apply\",\"btnCancel\":\"Cancel\",\"btnCreate\":\"Create\",\"btnSave\":\"Save\",\"Cancel\":\"Cancel\",\"CannotAddUser\":\"This site is configured to require users to enter a Question and Answer receive password reminders. This configuration is incompatible with Administrators adding users, so has been disabled for this site.\",\"CannotChangePassword\":\"Your configuration requires the user to enter a Question and Answer for the Password reminder. When this setting is applied Administrators are unable to change a user's password, so the feature has been disabled for this site.\",\"ChangePassword\":\"Change Password\",\"ChangeSuccessful\":\"Password Changed Successfully\",\"cmdAuthorize\":\"Authorize User\",\"cmdPassword\":\"Force Password Change\",\"cmdUnAuthorize\":\"Un-Authorize User\",\"cmdUnLock\":\"Unlock Account\",\"Created.Header\":\"Joined\",\"CreatedDate.Help\":\"The date this user account was created.\",\"CreatedDate\":\"Created Date:\",\"Delete\":\"Delete\",\"DeleteRole.Confirm\":\"Are you sure you want to remove the '{0}' role from '{1}'?\",\"DeleteUser.Confirm\":\"Are you sure you want to delete this user?\",\"DeleteUser\":\"Delete User\",\"DemoteFromSuperUser\":\"Make Regular User\",\"DisplayName.Help\":\"Enter a display name.\",\"DisplayName\":\"Display Name:\",\"Email.Header\":\"Email\",\"Email.Help\":\"Enter a valid email address.\",\"Email\":\"Email Address:\",\"Expires.Header\":\"Expires\",\"FirstName.Help\":\"Enter a first name.\",\"FirstName\":\"First Name:\",\"ForceChangePassword\":\"Force Password Change\",\"IsDeleted.Help\":\"Indicates whether this user is deleted.\",\"IsDeleted\":\"Deleted:\",\"IsOnLine.Help\":\"Indicates whether the user is currently online.\",\"IsOnLine\":\"User Is Online:\",\"IsOwner\":\"Is Owner\",\"LastActivityDate.Help\":\"The date this user was last active on the site.\",\"LastActivityDate\":\"Last Activity Date:\",\"LastLockoutDate.Help\":\"The date this user was last locked out of the site due to repetitive failed logins.\",\"LastLockoutDate\":\"Last Lock-Out Date:\",\"LastLoginDate.Help\":\"The date this user last logged into the site.\",\"LastLoginDate\":\"Last Login Date:\",\"LastPasswordChangeDate.Help\":\"The date this user last changed their password.\",\"LastPasswordChangeDate\":\"Last Password Change:\",\"LockedOut.Help\":\"Indicates whether the user is currently locked out of the site due to repetitive failed logins.\",\"LockedOut\":\"Locked Out:\",\"ManageProfile.title\":\"Profile Settings\",\"ManageRoles.title\":\"User Roles\",\"ManageSettings.title\":\"Account Settings\",\"Name.Header\":\"Name\",\"Never\":\"Never\",\"NoRoles\":\"No roles found.\",\"OptionUnavailable\":\"Reset Password option is currently unavailable.\",\"PasswordInvalid\":\"You must enter a valid password. Please check with the Site Administrator if you do not know the password requirements.\",\"PasswordManagement\":\"Password Management\",\"PasswordResetFailed\":\"Your new password was not accepted for security reasons. Please enter a password that you haven't used before and is long and complex enough to meet the site's password complexity requirements.\",\"PasswordResetFailed_PasswordInHistory\":\"Your new password was not accepted for security reasons. Please choose a password that hasn't been used before.\",\"PasswordSent\":\"If the user name entered was correct, you should receive a new email shortly with a link to reset your password.\",\"NewConfirmMismatch.ErrorMessage\":\"The New Password and Confirmation Password must match.\",\"NewConfirm.Help\":\"Re-enter your new password to confirm.\",\"NewConfirm\":\"Confirm Password:\",\"NewPassword.Help\":\"Enter your new password.\",\"NewPassword\":\"New Password:\",\"PromoteToSuperUser\":\"Make Super User\",\"RemoveUser.Confirm\":\"Are you sure you want to permanently remove this user?\",\"RemoveUser\":\"Remove User Permanently\",\"ResetPassword\":\"Send Password Reset Link\",\"RestoreUser\":\"Restore User\",\"Role.Header\":\"Role\",\"Roles.Title\":\"Roles\",\"rolesPageInfoText\":\"Page {0} of {1}\",\"rolesSummaryText\":\"Showing {0}-{1} of {2}\",\"SendEmail\":\"Send Email\",\"Start.Header\":\"Start\",\"UpdatePassword.Help\":\"Indicates whether this user is forced to update their password.\",\"UpdatePassword\":\"Update Password:\",\"UserAuthorized\":\"User successfully authorized.\",\"UserDeleted\":\"User deleted successfully.\",\"UserFolder.Help\":\"The folder that stores this user's files.\",\"UserFolder\":\"User Folder:\",\"Username.Help\":\"Enter a user name. It must be at least five characters long and is must be an alphanumeric value.\",\"Username\":\"User Name:\",\"UserPasswordUpdateChanged\":\"User must update password on next login.\",\"UserRestored\":\"User restored successfully\",\"usersPageSizeOptionText\":\"{0} users per page\",\"usersSummaryText\":\"Showing {0}-{1} of {2}\",\"UserUnAuthorized\":\"User successfully un-authorized.\",\"UserUpdated\":\"User updated successfully.\",\"ViewProfile\":\"View Profile\",\"btnCreateUser\":\"Add User\",\"Confirm.Help\":\"Re-enter the password to confirm.\",\"Confirm\":\"Confirm Password:\",\"ConfirmMismatch.ErrorMessage\":\"The Password and Confirmation Password must match.\",\"LastName.Help\":\"Enter a last name.\",\"LastName\":\"Last Name:\",\"Notify\":\"Send An Email To New User.\",\"Password.Help\":\"Enter a password for this user.\",\"Password\":\"Password:\",\"Random.Help\":\"Check this box to generate a random password.\",\"Random\":\"Random Password\",\"UserCreated\":\"User created successfully.\",\"Confirm.Required\":\"You must provide a password confirmation.\",\"DisplayName.RegExError\":\"The display name is invalid.\",\"DisplayName.Required\":\"Display name is required.\",\"Email.RegExError\":\"You must enter a valid email address.\",\"Email.Required\":\"Email is required.\",\"FirstName.RegExError\":\"First name is invalid.\",\"FirstName.Required\":\"First name is required.\",\"LastName.RegExError\":\"Last name is invalid.\",\"LastName.Required\":\"Last name is required.\",\"NewConfirm.Required\":\"You must provide a password confirmation.\",\"NewPassword.Required\":\"You must provide a password.\",\"Password.Required\":\"You must provide a password.\",\"Username.RegExError\":\"The user name entered is invalid.\",\"Username.Required\":\"Username is required.\",\"noUsers\":\"No users found.\",\"ShowLabel\":\"Show: \",\"DemoteToRegularUser\":\"Make Regular User\",\"InSufficientPermissions\":\"You do not have enough permissions to perform this action.\",\"InvalidPasswordAnswer\":\"Password answer is invalid.\",\"RegisterationFailed\":\"Registeration failed. Please try later.\",\"UserDeleteError\":\"Failed to delete the user.\",\"UsernameNotUnique\":\"Username must be unique.\",\"UserNotFound\":\"User not found.\",\"UserRemoveError\":\"Can not remove the user.\",\"UserRestoreError\":\"Can not restore the user.\",\"RoleIsNotApproved\":\"Cannot assign a role which is not approved.\",\"UserUnlockError\":\"Failed to unlcok the user.\",\"cmUnlockUser\":\"Unlock User\",\"UserUnLocked\":\"User un-locked successfully.\",\"AccountData\":\"Account Data\",\"False\":\"False\",\"SwitchOff\":\"Off\",\"SwitchOn\":\"On\",\"True\":\"True\",\"Prompt_CannotPurgeUser\":\"Cannot purge user that has not been deleted first. Try delete-user.\",\"Prompt_DateParseError\":\"Unable to parse the {0} Date '{1}'. Try using YYYY-MM-DD format.\",\"Prompt_EmailSent\":\"An email has been sent to the user.\",\"Prompt_IfSpecifiedMustHaveValue\":\"If you specify the --{0} flag, it must be set to True or False.\",\"Prompt_InvalidFlag\":\"Invalid flag '--{0}'. Did you mean --{1} ?\",\"Prompt_NothingToSetUser\":\"Nothing to update. Please pass-in one or more flags with values to update on the user or type 'help set-user' for more help\",\"Prompt_NoUserId\":\"No User ID passed. Nothing to do.\",\"Prompt_OnlyOneFlagRequired\":\"You must specify one and only one flag: --{0}, --{1}, or --{2}.\",\"Prompt_PasswordReset\":\"User password has been reset.\",\"Prompt_RestoreNotRequired\":\"This user has not been deleted. Nothing to restore.\",\"Prompt_RolesEmpty\":\"--roles cannot be empty.\",\"Prompt_SearchUserParameterRequired\":\"To search for a user, you must specify either --id (UserId), --email (User Email), or --name (Username).\",\"Prompt_StartDateGreaterThanEnd\":\"Start Date cannot be less than End Date.\",\"Prompt_UserAlreadyDeleted\":\"User is already deleted. Want to delete permanently? Use \\\\\\\"purge-user\\\\\\\"\",\"Prompt_UserDeletionFailed\":\"The user was found but the system is unable to delete it.\",\"Prompt_UserIdIsRequired\":\"You must specify a valid User ID as either the first argument or using the --id flag.\",\"Prompt_UserPurged\":\"The User has been permanently removed from the site.\",\"Prompt_AddRoles_ResultHtml\":\"

Add a Role to a User

\\r\\n add-roles --id 23 --roles Editor OR\\r\\n add-roles 23 --roles Editor OR\\r\\n add-roles --id 23 \\\"Editor\\\"\\r\\n

Add a Multi-Word Role to a User

\\r\\n add-roles --id 23 --roles \\\"Article Reviewer\\\"\\r\\n\\r\\n

Add Multiple Roles to a User

\\r\\n add-roles --id 23 --roles \\\"Editor, Writer, Article Reviewer\\\"\",\"Prompt_AddRoles_Description\":\"Add one or more DNN security roles to a user.\",\"Prompt_AddRoles_FlagEnd\":\"End date of the role.\",\"Prompt_AddRoles_FlagId\":\"User ID of user to which the roles will be added. If a number is passed as the first argument, you do not need\\r\\n to use the --id flag explicitly\",\"Prompt_AddRoles_FlagRoles\":\"Comma-delimited string of DNN role names to apply to user.\",\"Prompt_AddRoles_FlagStart\":\"Effective date of the role.\",\"Prompt_DeleteUser_Description\":\"Deletes the specified user from the portal. After deletion, the user can still be recovered. To delete the user permanently, follow this command with the purge-user command.\",\"Prompt_DeleteUser_FlagId\":\"The user's User ID. If the flag is not used, then the user's ID must be the first argument.\",\"Prompt_DeleteUser_FlagNotify\":\"If true, the "Unregister User" notification email will be sent (typically to the site Admin)\",\"Prompt_DeleteUser_ResultHtml\":\"

Delete a User

\\r\\n

This delete's the user with a User ID of 345. The user is not permanently deleted at this point. It is in a kind of recycle bin. You can use get-user 345 to see the user details and you'll see that the IsDeleted property is now True. So, you can use the restore-user command to recover the user record or you can recover the user using DNN's user interface. If you want to permanently delete the user, then you'll need to execute a second command: purge-user

\\r\\n delete-user 345\\r\\n

This is the more explicit form of the above code.

\\r\\n delete-user --id 345\\r\\n\\r\\n

Delete a User and Send Notification

\\r\\n

This delete's the user with a User ID of 345 and sends an email notification. Like above, the user is not permanently deleted at this point. If you want to permanently delete the user, then you'll need to execute a second command: purge-user

\\r\\n delete-user 345 --notify true\\r\\n

This is the more explicit form of the above code.

\\r\\n delete-user --id 345 --notify true\",\"Prompt_GetUser_FlagEmail\":\"The email address for the user being retrieved. You can use the asterisk ( * ) as a wildcard\\r\\n to signify 0 or more characters.\",\"Prompt_GetUser_FlagId\":\"Explicitly specifies the UserId for the user being retrieved.\",\"Prompt_GetUser_FlagUsername\":\"The username for the user being retrieved. You can use the asterisk ( * ) as a wildcard\\r\\n to signify 0 or more characters.\",\"Prompt_GetUser_ResultHtml\":\"
\\r\\n

Get Current User

\\r\\n \\r\\n get-user\\r\\n \\r\\n\\r\\n

Get User by User ID

\\r\\n\\r\\n
Implicit Use of --id flag
\\r\\n

When specifying a single value after the command name, if it is an integer, Prompt will assume it is a User ID

\\r\\n get-user 345\\r\\n\\r\\n
Explicit use of --id flag
\\r\\n

You can explicitly use the --id flag to avoid any confusion

\\r\\n get-user --id 345\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
\\r\\n\\r\\n

Get User by Email

\\r\\n\\r\\n
Implicit Use of --email flag
\\r\\n

When specifying a single value after the command name, if it contains the at symbol ( @ ),\\r\\n Prompt will assume it is an Email

\\r\\n get-user jsmith@sample.com\\r\\n\\r\\n
Explicit Use of --email flag
\\r\\n

You can explicitly use the --email flag to avoid any confusion

\\r\\n get-user --email jsmith@sample.com\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
\\r\\n\\r\\n

Search for User by Email Using Wildcards

\\r\\n
Implicit Use of --email flag
\\r\\n

\\r\\n When specifying a single value after the command name, if it contains the at symbol ( @ ),\\r\\n Prompt will assume it is an Email. Only the first matched user record will be returned. Try using list-users if you would like to find all matching users.\\r\\n

\\r\\n get-user jsmith*@sample.com\\r\\n
Explicit Use of --email flag
\\r\\n get-user --email jsmith*@sample.com\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
\\r\\n\\r\\n

Get User by Username

\\r\\n
Implicit Use of --username flag
\\r\\n

When specifying a single value after the command name, if it is not a number and does not contain the at symbol (\\r\\n @ ), Prompt will assume it is a Username

\\r\\n get-user jsmith\\r\\n\\r\\n
Explicit Use of --username flag
\\r\\n

You can explicitly use the --username flag to avoid any confusion

\\r\\n get-user --username jsmith\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
\\r\\n\\r\\n

Search for User by Username Using Wildcards

\\r\\n
Implicit Use of --username flag
\\r\\n

When specifying a single value after the command name, if it is not a number and does not contain the at symbol (\\r\\n @ ), Prompt will assume it is a Username

\\r\\n get-user --username jsmith*\\r\\n
Explicit Use of --username flag
\\r\\n get-user jsmith* (value cannot have an @ symbol or be interpreted as an Integer for this to\\r\\n work)\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
\\r\\n
\",\"Prompt_ListUsers_Description\":\"Find users based on email or username. Supports partial matching on Email or Username. You can only search by on flag at a time. Flags may not be combined.\",\"Prompt_ListUsers_FlagEmail\":\"A search pattern to search for in the user's email address. You can use the asterisk ( * ) as a wildcard to signify 0 or more characters\",\"Prompt_ListUsers_FlagMax\":\"Page Size for the page. Max is 500.\",\"Prompt_ListUsers_FlagPage\":\"Page number to show records.\",\"Prompt_ListUsers_FlagRole\":\"The name of the DNN Security Role whose members you'd like to list. IMPORTANT: wildcard searching is NOT enabled for this flag at this time. Role names are case-insensitive but spacing must match.\",\"Prompt_ListUsers_FlagUsername\":\"A search pattern to search for in the username. You can use the asterisk ( * ) as a wildcard to signify 0 or more characters\",\"Prompt_ListUsers_ResultHtml\":\"
\\r\\n

List All Users in Current Portal

\\r\\n \\r\\n list-users\\r\\n \\r\\n\\r\\n

Search for Users by Email

\\r\\n
Implicit Use of --email flag
\\r\\n

When specifying a single value after the command name, if it contains the at symbol ( @ ), Prompt will assume it is an Email

\\r\\n list-users jsmith@sample.com\\r\\n
Explicit use of --email flag
\\r\\n list-users --email jsmith@sample.com\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
\\r\\n\\r\\n

Search for Users by Email Using Wildcards

\\r\\n
Implicit Use of --email flag
\\r\\n

When specifying a single value after the command name, if it contains the at symbol ( @ ), Prompt will assume it is an Email

\\r\\n list-users jsmith*@sample.com\\r\\n
Explicit use of --email flag
\\r\\n list-users --email jsmith*@sample.com\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserIdUsernameEmailDisplayNameFirstNameLastNameLastLoginIsAuthorized
345jsmithjsmith@sample.comJohn SmithJohnSmith2016-12-06T09:31:38.413-07:00true
1095jsmithsonjsmithson@sample.comJerry SmithsonJerrySmithson2016-12-063T08:15:28.123-07:00true
\\r\\n\\r\\n

Search for Users by Username

\\r\\n
Implicit Use of --username flag
\\r\\n

When specifying a single value after the command name, if it is not a number and does not contain the at symbol ( @ ), Prompt will assume it is a Username

\\r\\n list-users jsmith\\r\\n
Explicit Use of --username flag
\\r\\n list-users --username jsmith\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
Created:2016-12-06T09:31:38
IsDeleted:false
\\r\\n\\r\\n

Search for User by Username Using Wildcards

\\r\\n
Implicit Use of --username flag
\\r\\n

When specifying a single value after the command name, if it is not a number and does not contain the at symbol ( @ ), Prompt will assume it is a Username

\\r\\n list-users jsmith*\\r\\n
Explicit Use of --username flag
\\r\\n list-users --username jsmith*\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserIdUsernameEmailLastLoginIsDeletedIsAuthorized
345jsmithjsmith@sample.com2016-12-06T09:31:38.413-07:00falsetrue
1095jsmithsonjsmithson@sample.com2016-12-063T08:15:28.123-07:00falsetrue
\\r\\n\\r\\n

List Users In a DNN Security Role

\\r\\n list-users --role \\\"Registered Users\\\"\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserIdUsernameEmailLastLoginIsDeletedIsAuthorized
2adminadmin@mysite.com2016-12-01T06:03:10-07:00falsetrue
3tuser1tuser1@mysite.com2016-12-01T09:31:38.413-07:00falsetrue
31jsmithjsmith@mysite.com2016-12-19T12:23:39-07:00falsetrue
\\r\\n
\",\"Prompt_NewUser_Description\":\"Creates a new User record in the portal\",\"Prompt_NewUser_FlagApproved\":\"Whether the user account is authorized. Defaults to true if not specified.\",\"Prompt_NewUser_FlagEmail\":\"The user's Email address\",\"Prompt_NewUser_FlagFirstname\":\"The user's First Name\",\"Prompt_NewUser_FlagLastname\":\"The user's Last Name\",\"Prompt_NewUser_FlagNotify\":\"If true, the system email will be sent to the user at the user's email address. The type of email is determined\\r\\n by the registration type. If this is not passed, the default portal settings will be observed. If the site's\\r\\n registration mode is set to None, no email will be sent regardless of the value of --notify.\",\"Prompt_NewUser_FlagPassword\":\"The Password for the user account. If not specified, a random password will be generated. Note that unless you\\r\\n are forcing the user to reset their password, you should ensure that someone is notified of the password.\",\"Prompt_NewUser_FlagUsername\":\"The user's Username\",\"Prompt_NewUser_ResultHtml\":\"

Create a New User with Just the Required Values

\\r\\n

This generates a random password and assigns it to the newly created user. Display name is generated by concatenating\\r\\n the first and last name. Note that because \\\"van Doorne\\\" contains a space, we need to enclose it in double-quotes. The\\r\\n resulting Display name will be \\\"Erik van Doorne\\\".

\\r\\n new-user --username edoorne --email edoorne@myemail.com --firstname Erik --lastname \\\"van Doorne\\\"\",\"Prompt_ResetPassword_Description\":\"Sets the reset password token for the user. It does not automatically reset the user's password. By default,\\r\\n this command will send the reset password email to the user. You can override this behavior by specifying the --notify flag with a value of false\",\"Prompt_ResetPassword_FlagId\":\"User ID of user to send Reset Password link to.\",\"Prompt_ResetPassword_FlagNotify\":\"If true, the system email will be sent to the user at the user's email address.\",\"Prompt_ResetPassword_ResultHtml\":\"\\r\\n reset-password userId\\r\\n \",\"Prompt_SetUser_Description\":\"Enables you to set various values related to the specified user.\",\"Prompt_SetUser_FlagApproved\":\"Approval status of the user.\",\"Prompt_SetUser_FlagDisplayname\":\"The name to be displayed for the user.\",\"Prompt_SetUser_FlagEmail\":\"The email address to set for the user.\",\"Prompt_SetUser_FlagFirstname\":\"The first name of the user.\",\"Prompt_SetUser_FlagId\":\"The UserId for the user being updated. This value is required, but if you pass the value as the first argument after the\\r\\n command name, you do not need to explicitly use the --id flag. (see the examples below)\",\"Prompt_SetUser_FlagLastname\":\"The last name of the user.\",\"Prompt_SetUser_FlagPassword\":\"The new password to assign to the user. The password must be valid according to the site's password rules.\",\"Prompt_SetUser_FlagUsername\":\"The username to set for the user.\",\"Prompt_SetUser_ResultHtml\":\"
\\r\\n

Approve/UnApprove a User

\\r\\n

\\r\\n Approves/UnApproves the user with a User ID of 345. In this example, true is passed for the --approve flag.\\r\\n

\\r\\n \\r\\n set-user 345 --approve true\\r\\n \\r\\n\\r\\n

Change a User's Username

\\r\\n

Changes the username of the user with a User ID of 345 to john.smith.

\\r\\n \\r\\n set-user 345 --username \\\"john.smith\\\"\\r\\n \\r\\n\\r\\n

Change a User's Name Properties

\\r\\n

\\r\\n Sets the first, last, and display name for the user with an ID of 345. Note that John and Smith do not need to be surrounded by quotes but Johnny Smith does since it is more than one word.\\r\\n

\\r\\n \\r\\n set-user 345 --firstname John --lastname Smith --displayname \\\"Johnny Smith\\\"\\r\\n \\r\\n\\r\\n
\",\"Prompt_GetUser_Description\":\"Enables you to display the current user's information, or retrieve a user by their User ID, Username or Email address.\\r\\n Supports partial searching. Returns the first user found.\",\"Prompt_UsersCategory\":\"User Commands\"},\"Vocabularies\":{\"cancelCreate\":\"Cancel\",\"ControlTitle_createvocabulary\":\"Create New Vocabulary\",\"ControlTitle_editvocabulary\":\"Edit Vocabulary\",\"SaveVocabulary\":\"Update\",\"CurrentTerm\":\"Edit Term\",\"DeleteVocabulary\":\"Delete\",\"Terms\":\"Terms\",\"Title\":\"Edit Vocabulary\",\"DeleteTerm\":\"Delete\",\"SaveTerm\":\"Update\",\"AddTerm\":\"Add Term\",\"CreateTerm\":\"Save\",\"NewTerm\":\"Create New Term\",\"TermValidationError.Message\":\"There was an error validating the term. Terms must include a name.\",\"TermValidationError.MessageHeader\":\"Term Validation Error\",\"ControlTitle_edit\":\"Edit Vocabulary\",\"ParentTerm\":\"Parent Term\",\"ParentTerm.ToolTip\":\"The parent term for this heirarchical term.\",\"TermName\":\"Name\",\"TermName.ToolTip\":\"The name of the term.\",\"TermName.Required\":\"The term name is a required field.\",\"Application\":\"Application\",\"Description\":\"Description\",\"Description.ToolTip\":\"The description for the vocabulary.\",\"Hierarchy\":\"Hierarchy\",\"Name.Required\":\"A name is required for a vocabulary.\",\"Name\":\"Name\",\"Name.ToolTip\":\"The name for the vocabulary.\",\"Portal\":\"Website\",\"Scope\":\"Scope\",\"Scope.ToolTip\":\"The scope for this vocabulary, application-wide or site-specific.\",\"Simple\":\"Simple\",\"Type\":\"Type\",\"Type.ToolTip\":\"The type of vocabulary, simple or heirarchical.\",\"VocabularyExists.Error\":\"The vocabulary \\\"{0}\\\" exists in the list.\",\"Create\":\"Create New Vocabulary\",\"Description.Header\":\"Description\",\"Name.Header\":\"Name\",\"Scope.Header\":\"Scope\",\"Type.Header\":\"Type\",\"Create.ToolTip\":\"Click on this button to create a new vocabulary.\",\"Edit\":\"Edit\",\"Confirm\":\"Are you sure you want to add a vocabulary?\",\"ControlTitle_\":\"Vocabularies\",\"nav_Vocabularies\":\"Vocabularies\",\"TermExists.Error\":\"The term \\\"{0}\\\" exists in the list.\",\"ConfirmDeletion_Vocabulary\":\"Are you sure you want to delete \\\"{0}\\\"?\",\"ConfirmDeletion_Term\":\"Are you sure you want to delete the term \\\"{0}\\\"?\",\"LoadMore\":\"Load More\",\"RequiredField\":\"Required Field\",\"CreateVocabulary\":\"Create\",\"NoVocabularyTerms.Error\":\"No vocabularies found.\",\"Close\":\"Close\",\"All\":\"All\",\"BackToVocabularies\":\"Back To Vocabularies\",\"EditFieldHelper\":\"Press ENTER when done, or ESC to cancel\"},\"AccountSettings\":{\"nav_AccountSettings\":\"Accounts\"},\"Assets\":{\"assets_AddAsset\":\"Add Asset\",\"assets_AddFolder\":\"Add Folder\",\"assets_BrowseToUpload\":\"Browse to Upload\",\"assets_Details\":\"Details\",\"assets_emptySubtitle\":\"Use the tools above to add an asset or create a folder\",\"assets_emptyTitle\":\"This Folder is Empty\",\"assets_FolderName\":\"Name\",\"assets_FolderNamePlaceholder\":\"Enter folder name\",\"assets_FolderParent\":\"Folder Parent:\",\"assets_FolderType\":\"Type\",\"assets_In\":\"In: \",\"assets_Location\":\"Location: \",\"assets_MappedName\":\"Mapped Path\",\"assets_noSearchResults\":\"Your Search Produced No Results\",\"assets_Permissions\":\"Permissions\",\"assets_Search\":\"Search\",\"assets_SearchBoxPlaceholder\":\"Search Files\",\"nav_Assets\":\"Assets\",\"assets_Sync\":\"Sync this folder and subfolders\",\"btn_Cancel\":\"Cancel\",\"btn_Close\":\"Close\",\"btn_Delete\":\"Delete\",\"btn_Save\":\"Save\",\"btn_Replace\":\"Replace\",\"btn_Preview\":\"Preview\",\"label_MoveFile\":\"Move file to (select a destination)\",\"label_MoveFolder\":\"Move folder to (select a destination)\",\"btn_Move\":\"Move\",\"label_CopyFile\":\"Copy file to (select a destination)\",\"label_CopyFolder\":\"Copy folder to (select a destination)\",\"btn_Copy\":\"Copy\",\"label_By\":\"by\",\"label_Created\":\"Created:\",\"label_Description\":\"Description\",\"label_DiscardAll\":\"Discard All\",\"label_FolderType\":\"Folder type:\",\"label_LastModified\":\"Last Modified:\",\"label_Name\":\"Name\",\"label_PendingItems\":\"Pending Items\",\"label_PublishAll\":\"Publish All\",\"label_Size\":\"Size:\",\"label_Subscribe\":\"Subscribe:\",\"label_Tag\":\"Tag\",\"label_Tags\":\"Tags\",\"label_Title\":\"Title\",\"label_Url\":\"URL:\",\"label_Versioning\":\"Versioning\",\"label_Workflow\":\"Workflow\",\"lbl_Root\":\"Home\",\"txt_ConfirmDeleteAsset\":\"Are you sure you want to delete the asset '[NAME]'?\",\"txt_ConfirmDeleteFolder\":\"Are you sure you want to delete the folder '[NAME]'?\",\"txt_ConfirmReplace\":\"Item '[NAME]' already exists in destination folder. Do you want to replace?\",\"folderPicker_clearButtonTooltip\":\"Clear\",\"folderPicker_loadingResultText\":\"...Loading Results\",\"folderPicker_resultsText\":\"Results\",\"folderPicker_searchButtonTooltip\":\"Search\",\"folderPicker_searchInputPlaceHolder\":\"Folder Name\",\"folderPicker_selectedItemCollapseTooltip\":\"Click to collapse\",\"folderPicker_selectedItemExpandTooltip\":\"Click to expand\",\"folderPicker_selectItemDefaultText\":\"Search Folders\",\"folderPicker_sortAscendingButtonTitle\":\"A-Z\",\"folderPicker_sortAscendingButtonTooltip\":\"Sort in ascending order\",\"folderPicker_sortDescendingButtonTooltip\":\"Sort in descending order\",\"folderPicker_unsortedOrderButtonTooltip\":\"Remove sorting\",\"assets_Versioning\":\"Versioning\",\"assets_Workflow\":\"Workflow\",\"UserHasNoPermissionToDownload.Error\":\"The user does not have permission to download this file.\",\"DestinationFolderCannotMatchSourceFolder.Error\":\"Destination folder cannot match the source folder.\",\"UserHasNoPermissionToCopyFolder.Error\":\"The user does not have permission to copy from this folder\",\"UserHasNoPermissionToMoveFolder.Error\":\"The user does not have permission to move from this folder.\",\"FolderDoesNotExists.Error\":\"The folder does not exist.\",\"MaxFileVersions\":\"Maximun number of versions\",\"col_Date\":\"Date\",\"col_State\":\"State\",\"col_User\":\"User\",\"col_Version\":\"Version\",\"pager_ItemDesc\":\"Showing {0} versions\",\"pager_ItemPagedDesc\":\"Showing {0}-{1} of {2} versions\",\"pager_PageDesc\":\"Page {0} of {1}\",\"Published\":\"Published\",\"Unpublished\":\"Unpublished\",\"sort_LastModified\":\"Last Modified\",\"sort_DateUploaded\":\"Date Uploaded\",\"sort_Alphabetical\":\"Alphabetical\",\"btn_Rollback\":\"Rollback\",\"btn_Approve\":\"Approve\",\"btn_Reject\":\"Reject\",\"btn_Publish\":\"Publish\",\"btn_Submit\":\"Submit\",\"btn_Discard\":\"Discard\",\"ConfirmDeleteFileVersion\":\"Are you sure you want to delete this version?\",\"ConfirmRollbackFileVersion\":\"Are you sure you want to rollback to version [VERSION]?\",\"SuccessFileVersionDeletion\":\"The version has been deleted successfully\",\"SuccessFileVersionRollback\":\"The version has been rollback successfully\",\"label_ModifiedOnDate\":\"Modified:\",\"label_ModifiedByUser\":\"Modified By:\",\"label_WorkflowName\":\"Workflow:\",\"label_WorkflowState\":\"State:\",\"label_WorkflowComment\":\"Workflow Comment\",\"WorkflowCommentPlaceholder\":\"Enter a comment\",\"UserHasNoPermissionToAddFileInFolder.Error\":\"The user does not have permission to add files in this folder.\",\"UserHasNoPermissionToDeleteFile.Error\":\"The user does not have permission to delete file.\",\"UserHasNoPermissionToDeleteFolder.Error\":\"The user does not have permission to delete folder.\",\"UserHasNoPermissionToManageVersions.Error\":\"The user does not have permission to manage the file versions.\",\"UserHasNoPermissionToReadFileProperties.Error\":\"The user does not have permission to read file details.\",\"UserHasNoPermissionToSaveFileProperties.Error\":\"The user does not have permission to save the file details.\",\"UserHasNoPermissionToSaveFolderProperties.Error\":\"The user does not have permission to save the folder details.\",\"ZoomPendingVersionAltText\":\"See the 'Pending for Approval' file version.\",\"WorkflowOperationProcessedSuccessfully\":\"The operation has been processed successfully.\",\"Action.Header\":\"Action\",\"Comment.Header\":\"Comment\",\"Date.Header\":\"Date\",\"User.Header\":\"User\",\"FolderDoesNotExist.Error\":\"The folder does not exist.\",\"NOTIFY_BodyFileAdded\":\"The file [FILE] has been added to the folder [FOLDERPATH]. Click the following link to download the file [URL]\",\"NOTIFY_BodyFileContentChanged\":\"The content of the file [FILEPATH] has changed. Click the following link to download the file [URL]\",\"NOTIFY_BodyFileDeleted\":\"The file [FILEPATH] has been deleted.\",\"NOTIFY_BodyFileDeletedOnFolder\":\"The file [FILE] has been deleted from the folder [OLDPATH]\",\"NOTIFY_BodyFileExpired\":\"The file [FILE] is close to expire on [FOLDERPATH]. The End Date is [ENDDATE]. Click the following link to download the file [URL]\",\"NOTIFY_BodyFileMoved\":\"The file [FILE] has been moved from [OLDPATH] to [FOLDERPATH] folder. Click the following link to download the file [URL]\",\"NOTIFY_BodyFileRenamed\":\"The file [FILE] has been renamed to [NEWFILE]. Click the following link to download the file [URL]\",\"NOTIFY_BodyFolderAdded\":\"A folder called [SUBFOLDER] has been added into the folder [FOLDERPATH]\",\"NOTIFY_BodyFolderDeleted\":\"The folder [FOLDERPATH] has been deleted.\",\"NOTIFY_BodyFolderMoved\":\"The folder [FOLDER] has been moved at the following location [FOLDERPATH]\",\"NOTIFY_BodyFolderRenamed\":\"The folder [FOLDER] has been rename to [NEWFOLDER].\",\"NOTIFY_BodySubFolderDeleted\":\"The folder [SUBFOLDER] has been deleted from [FOLDERPATH]\",\"NOTIFY_FileManagementReference\":\"Click {0} to go to File Management\",\"NOTIFY_FileManagementReferenceLink\":\"here\",\"NOTIFY_SubjectFileAdded\":\"A new file has been added to the folder [FOLDER]\",\"NOTIFY_SubjectFileContentChanged\":\"The content of the file [FILE] has changed.\",\"NOTIFY_SubjectFileDeleted\":\"The file [FILE] has been deleted.\",\"NOTIFY_SubjectFileDeletedOnFolder\":\"A contained file has been deleted from folder [FOLDER]\",\"NOTIFY_SubjectFileExpired\":\"The file [FILE] is close to expire\",\"NOTIFY_SubjectFileExpiredOnFolder\":\"A file is close to expire on folder [FOLDER].\",\"NOTIFY_SubjectFileMoved\":\"The file [FILE] has been moved.\",\"NOTIFY_SubjectFileRenamed\":\"The file [FILE] has been renamed.\",\"NOTIFY_SubjectFileRenamedOnFolder\":\"A file has been renamed on folder [FOLDER]\",\"NOTIFY_SubjectFolderAdded\":\"A new folder has been added into [FOLDER].\",\"NOTIFY_SubjectFolderDeleted\":\"The folder [FOLDER] has been deleted.\",\"NOTIFY_SubjectFolderMoved\":\"The folder [FOLDER] has been moved.\",\"NOTIFY_SubjectFolderRenamed\":\"The folder [FOLDER] has been renamed.\",\"NOTIFY_SubjectSubFolderDeleted\":\"A contained folder has been deleted from folder [FOLDER].\",\"WORKFLOW_DocumentApprovedNotificationBody\":\"The document [FILEPATH] has been approved. Click here to open the document.\",\"WORKFLOW_DocumentApprovedNotificationSubject\":\"Document changes approved.\",\"WORKFLOW_DocumentDiscartedNotificationBody\":\"The document [FILEPATH] has been discarted.\",\"WORKFLOW_DocumentDiscartedNotificationSubject\":\"Document Discarded\",\"WORKFLOW_DocumentPendingToBeApprovedNotificationBody\":\"The document '{0}' is in '{1}' and requires your review and approval.

{2}\",\"WORKFLOW_DocumentPendingToBeApprovedNotificationSubject\":\"Document awaiting approval.\",\"WORKFLOW_DocumentPendingToBeSubmitedNotificationBody\":\"The document '{0}' is in '{1}' and requires your review and submission.
\",\"WORKFLOW_DocumentPendingToBeSubmitedNotificationSubject\":\"Document awaiting submission.\",\"WORKFLOW_DocumentRejectedNotificationBody\":\"Changes for the document '{0}' has been rejected. It is now in state '{1}'.

{2}\",\"WORKFLOW_DocumentRejectedNotificationSubject\":\"Document changes rejected.\",\"ZoomImageAltText\":\"Preview\",\"Host\":\"Global Assets\",\"label_Archive\":\"Archive\",\"label_EndDate\":\"End Date\",\"label_Hidden\":\"Hidden\",\"label_PublishPeriod\":\"Publish Period\",\"label_ReadOnly\":\"Read-Only\",\"label_StartDate\":\"Start Date\",\"label_System\":\"System\",\"label_Locked\":\"File is locked because it is not within a valid start and end date for publication.\",\"assets_FileType\":\"Type:\"},\"CommunityAnalytics\":{\"analytics_Apply\":\"Apply\",\"analytics_AverageTime\":\"Time On Page\",\"analytics_BounceRate\":\"Bounce Rate\",\"analytics_Channels\":\"Channels\",\"analytics_ComparativeTerm\":\"Comparative Term\",\"analytics_Custom\":\"Custom\",\"analytics_Dashboard\":\"Dashboard\",\"analytics_Day\":\"Day\",\"analytics_Devices\":\"Devices\",\"analytics_direct\":\"Direct\",\"analytics_direct_referral\":\"Direct Referral\",\"analytics_exitpages\":\"Exit Pages\",\"analytics_external\":\"External\",\"analytics_From\":\"From\",\"analytics_internal\":\"Internal\",\"analytics_Month\":\"Month\",\"analytics_NavigationSummary\":\"Navigation Summary\",\"analytics_NoDataAvailable\":\"No data available\",\"analytics_PageActivities\":\"Page Activities\",\"analytics_PageTraffic\":\"Page Analytics\",\"analytics_PageViewActivity\":\"Page Traffic\",\"analytics_PageViews\":\"Page Views\",\"analytics_Page_Events\":\"Page Events\",\"analytics_Referrers\":\"Referrers\",\"analytics_search\":\"Search\",\"analytics_Sessions\":\"Sessions\",\"analytics_SiteActivities\":\"Site Activities\",\"analytics_SiteViewActivity\":\"Site Traffic\",\"analytics_Site_Events\":\"Site Events\",\"analytics_social\":\"Social\",\"analytics_To\":\"To\",\"analytics_TopOperatingSystems\":\"Top OS's\",\"analytics_TopPages\":\"Top Pages\",\"analytics_TopReferrers\":\"Top Referrers\",\"analytics_UniqueSessions\":\"Unique Sessions\",\"analytics_UniqueVisitors\":\"Unique Visitors\",\"analytics_Visitors\":\"Visitors\",\"analytics_Week\":\"Week\",\"analytics_Year\":\"Year\",\"btn_Add\":\"Add\",\"btn_Apply\":\"Apply\",\"btn_Authenticate\":\"Authenticate\",\"btn_Cancel\":\"Cancel\",\"btn_Checking\":\"Checking ...\",\"btn_Close\":\"Close\",\"btn_Connect\":\"Connect\",\"btn_CreateBadge\":\"Create a Badge\",\"btn_CreateNew\":\"Create New\",\"btn_CreateUser\":\"Create User\",\"btn_Delete\":\"Delete\",\"btn_DemoteUser\":\"Demote User\",\"btn_Edit\":\"Edit\",\"btn_EditPoints\":\"Edit Points\",\"btn_Keep\":\"Keep\",\"btn_LoadMore\":\"Load More\",\"btn_Next\":\"Next\",\"btn_Prev\":\"Previous\",\"btn_PromoteUser\":\"Promote User\",\"btn_Replace\":\"Replace\",\"btn_Save\":\"Save\",\"btn_Saving\":\"Saving ...\",\"btn_ShowMore\":\"SHOW MORE\",\"btn_ViewFiles\":\"Assets\",\"btn_ViewProfile\":\"Profile\",\"calendar_apply\":\"Apply\",\"calendar_cancel\":\"Cancel\",\"calendar_end\":\"Ends:\",\"calendar_start\":\"Starts:\",\"calendar_time\":\"Time:\",\"cmx_Edition\":\"Community Manager Edition\",\"col_Actions\":\"Actions\",\"col_Activity\":\"Activity\",\"col_Badge\":\"Badge\",\"col_Email\":\"Email\",\"col_EXP\":\"EXP PTS\",\"col_EXPAbbreviation\":\"EXP\",\"col_Goals\":\"Goals\",\"col_GoalType\":\"Goal Type\",\"col_Joined\":\"Joined\",\"col_Limits\":\"Limits\",\"col_MaxValue\":\"Max Value\",\"col_MinValue\":\"Min Value\",\"col_Module\":\"Module\",\"col_MostActiveUsers\":\"Most Active\",\"col_Name\":\"Name\",\"col_PowerRankings\":\"Reputation\",\"col_Privilege\":\"Privilege\",\"col_Pts\":\"Pts\",\"col_REP\":\"REP PTS\",\"col_REPAbbreviation\":\"REP\",\"col_RoleExpiry\":\"Expires\",\"col_RoleStart\":\"Start\",\"col_Tier\":\"Tier\",\"col_Time\":\"Time\",\"col_Timeframe\":\"Timeframe\",\"col_TopSpectators\":\"Top Spectators\",\"col_Value\":\"Value\",\"col_Views\":\"Views\",\"col_Weight\":\"Weight\",\"desc_EditBadge\":\"Define basic information for the badge\",\"desc_Goal\":\"Set the goals for the badge\",\"desc_Scoring\":\"Assign scoring actions to the badge\",\"gaming_Badges\":\"Badges\",\"gaming_Privileges\":\"Privileges\",\"gaming_Scoring\":\"Actions\",\"label_Activities\":\"Activities\",\"label_Adoptions\":\"Adoption\",\"label_AvailableActions\":\"Available Actions\",\"label_AverageTime\":\"Average Time\",\"label_BadgeBanner\":\"Badge Banner\",\"label_BadgeDesc\":\"Description\",\"label_BadgeName\":\"Badge Name\",\"label_BadgeTier\":\"Badge Tier\",\"label_BounceRate\":\"Bounce Rate\",\"label_By\":\"by\",\"label_CommentModeration\":\"Comment Moderation\",\"label_CommentsPageSize\":\"Comments Page Size\",\"label_ComparativeTerm\":\"Comparative Term\",\"label_ContentModeration\":\"Content Moderation\",\"label_Count\":\"Count\",\"label_Create\":\"Creates\",\"label_Created\":\"Created:\",\"label_Date\":\"Date\",\"label_Days\":\"Number of Days\",\"label_Description\":\"Description\",\"label_DiscardAll\":\"Discard All\",\"label_DropFile\":\"Drop File(s) Here\",\"label_Email\":\"Email\",\"label_Engagement\":\"Engagement\",\"label_Experience\":\"Experience Points\",\"label_ExperienceAbbreviation\":\"Experience\",\"label_FirstName\":\"First Name\",\"label_FolderType\":\"Folder type:\",\"label_From\":\"From\",\"label_GroupHomePage\":\"Group Home Page\",\"label_Influence\":\"Influence\",\"label_LastActive\":\"Last active: \",\"label_LastModified\":\"Last Modified:\",\"label_LastName\":\"Last Name\",\"label_Maximum\":\"Maximum Times\",\"label_MemberOf\":\"Member of\",\"label_Minutes\":\"Min\",\"label_NA\":\"N/A\",\"label_Name\":\"Name\",\"label_NoActivities\":\"No Activities\",\"label_NotApplicable\":\"N/A\",\"label_OneMillionSufix\":\"M\",\"label_OneThousandSufix\":\"K\",\"label_PageSize\":\"Page Size\",\"label_Participation\":\"Participation\",\"label_PendingItems\":\"Pending Items\",\"label_Percent\":\"Percent\",\"label_Period\":\"Period\",\"label_Profanity\":\"Profanity Filtering\",\"label_PublishAll\":\"Publish All\",\"label_Rank\":\"Rank\",\"label_RecentActivity\":\"Recent Activity\",\"label_Reputation\":\"Reputation Points\",\"label_ReputationAbbreviation\":\"Reputation\",\"label_Role\":\"Role\",\"label_SelectedActions\":\"Selected Actions\",\"label_Size\":\"Size:\",\"label_Spectators\":\"Spectators\",\"label_Subscribe\":\"Subscribe:\",\"label_Tag\":\"Tag\",\"label_Tags\":\"Tags\",\"label_Timeframe\":\"Timeframe\",\"label_TimeOnSite\":\"Time on site: \",\"label_Title\":\"Title\",\"label_To\":\"To\",\"label_TotalContributions\":\"total content contributions\",\"label_TotalCreate\":\"Total Creates\",\"label_Totals\":\"Totals\",\"label_TotalViews\":\"Total Views\",\"label_Url\":\"URL:\",\"label_UserName\":\"User Name\",\"label_UserRemoved\":\"User Removed\",\"label_Users\":\"Users\",\"label_Versioning\":\"Versioning\",\"label_View\":\"VIEWS\",\"label_Views\":\"Views\",\"label_Workflow\":\"Workflow\",\"label_WYSIWYG\":\"Enable WYSIWYG\",\"lbl_Root\":\"Home\",\"menu_Dashboard_Answers\":\"Answers\",\"menu_Dashboard_Blogs\":\"Blogs\",\"menu_Dashboard_Connections\":\"Connections\",\"menu_Dashboard_Discussions\":\"Discussions\",\"menu_Dashboard_Events\":\"Events\",\"menu_Dashboard_Experiments\":\"Experiments\",\"menu_Dashboard_Ideas\":\"Ideas\",\"menu_Dashboard_Overview\":\"Overview\",\"menu_Dashboard_PageTraffic\":\"Page Traffic\",\"menu_Dashboard_SiteTraffic\":\"Site Traffic\",\"menu_Dashboard_Wiki\":\"Wiki\",\"nav_CommunityAnalytics\":\"Community Analytics\",\"opt_Activity\":\"Activity\",\"opt_Bronze\":\"Bronze\",\"opt_Custom\":\"Custom\",\"opt_Daily\":\"Daily\",\"opt_Day\":\"Day\",\"opt_FilterByModule\":\"Filter by module\",\"opt_FilterContent\":\"Filter Content\",\"opt_Gold\":\"Gold\",\"opt_Lifetime\":\"Lifetime\",\"opt_Members\":\"Members\",\"opt_Month\":\"Month\",\"opt_Monthly\":\"Monthly\",\"opt_NoFiltering\":\"No Filtering\",\"opt_NoLimit\":\"No Limit\",\"opt_ProhibitContent\":\"Prohibit Content\",\"opt_Silver\":\"Silver\",\"opt_Week\":\"Week\",\"opt_Weekly\":\"Weekly\",\"opt_Year\":\"Year\",\"opt_Yearly\":\"Yearly\",\"pager_ItemDesc\":\"Showing {0} items\",\"pager_ItemPagedDesc\":\"Showing {0}-{1} of {2} items\",\"pager_PageDesc\":\"Page {0} of {1}\",\"pager_RoleDesc\":\"Showing {0} roles\",\"pager_RolePagedDesc\":\"Showing {0}-{1} of {2} roles\",\"pager_UserDesc\":\"Showing {0} users\",\"pager_UserPagedDesc\":\"Showing {0}-{1} of {2} users\",\"placeholder_AddDescription\":\"Add description\",\"placeholder_AddTitle\":\"Add title\",\"placeholder_Search\":\"Filter by name\",\"placeholder_Tags\":\"separate tags with a comma\",\"title_ActivityByModule\":\"Activity\",\"title_AdoptionsAndParticipation\":\"Adoption, Participation & Spectators\",\"title_Badges\":\"Badge Management\",\"title_Community\":\"Community\",\"title_Connections\":\"Configure Connections\",\"title_Create\":\"Creates & Views\",\"title_CreateUser\":\"Create a User\",\"title_Dashboard\":\"Dashboard\",\"title_Engagement\":\"Engagement\",\"title_FindAnAsset\":\"Find an Asset\",\"title_FindUser\":\"Find a User\",\"title_Gaming\":\"Gaming\",\"title_Influence\":\"Influence\",\"title_ManageItem\":\"Manage:\",\"title_ModulePerformance\":\"Module Performance\",\"title_ModuleSettings\":\"Miscellaneous Community Settings\",\"title_PopularContent\":\"Popular Content\",\"title_Privilege\":\"Privilege Management\",\"title_ProblemsArea\":\"Community Health\",\"title_Scoring\":\"Scoring Action Management\",\"title_Settings\":\"Settings\",\"title_Tasks\":\"Tasks\",\"title_TopCommunityUsers\":\"Top Community Users\",\"title_TrendingTags\":\"Trending Tags\",\"title_Users\":\"Users\",\"tooltip_ActivityByModule\":\"[COUNT] Activities\",\"tooltip_AdoptionsAndParticipations\":\"[COUNT] Users\",\"tooltip_CreateSeries\":\"[COUNT] Creations\",\"tooltip_Down_Custom\":\"Down {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Down_Day_OnDay\":\"Down {0}% today compared to yesterday\",\"tooltip_Down_Day_OnMonth\":\"Down {0}% compared to this day a month ago\",\"tooltip_Down_Day_OnWeek\":\"Down {0}% compared to this day a week ago\",\"tooltip_Down_Day_OnYear\":\"Down {0}% compared to this day a year ago\",\"tooltip_Down_Month_OnMonth\":\"Down {0}% this month compared to last month\",\"tooltip_Down_Month_OnYear\":\"Down {0}% compared to this month a year ago\",\"tooltip_Down_Week_OnMonth\":\"Down {0}% compared to this week a month ago\",\"tooltip_Down_Week_OnWeek\":\"Down {0}% this week compared to last week\",\"tooltip_Down_Week_OnYear\":\"Down {0}% compared to this week a year ago\",\"tooltip_Down_Year_OnYear\":\"Down {0}% this year compared to last year\",\"tooltip_ShowAll\":\"Show All\",\"tooltip_Up_Custom\":\"Up {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Up_Day_OnDay\":\"Up {0}% today compared to yesterday\",\"tooltip_Up_Day_OnMonth\":\"Up {0}% compared to this day a month ago\",\"tooltip_Up_Day_OnWeek\":\"Up {0}% compared to this day a week ago\",\"tooltip_Up_Day_OnYear\":\"Up {0}% compared to this day a year ago\",\"tooltip_Up_Month_OnMonth\":\"Up {0}% this month compared to last month\",\"tooltip_Up_Month_OnYear\":\"Up {0}% compared to this month a year ago\",\"tooltip_Up_Week_OnMonth\":\"Up {0}% compared to this week a month ago\",\"tooltip_Up_Week_OnWeek\":\"Up {0}% this week compared to last week\",\"tooltip_Up_Week_OnYear\":\"Up {0}% compared to this week a year ago\",\"tooltip_Up_Year_OnYear\":\"Up {0}% this year compared to last year\",\"topCommunity_NoDataAvailable\":\"No data available\",\"txt_ConfirmDelete\":\"Are you sure you want to delete this item?\",\"txt_ConfirmDeleteAsset\":\"Are you sure you want to delete the asset '[NAME]'?\",\"txt_ConfirmDeleteFolder\":\"Are you sure you want to delete the folder '[NAME]'?\",\"txt_Deleted\":\"Item successfully deleted.\",\"txt_Items\":\"{0} items\",\"txt_NoPopularContent\":\"No popular content available in selected period\",\"txt_NoTrendingTags\":\"No trending tags available in selected period\",\"txt_PleaseTypeRoleName\":\"Please type a role name.\",\"txt_RoleSuccessfullyAdded\":\"Role successfully added\",\"txt_Saved\":\"Item successfully saved.\",\"txt_SetupConnections\":\"Setup your connections to easily share content and more\",\"txt_UserSaved\":\"User successfully saved.\",\"txt_ViewIndex\":\"Viewing {0} of {1}\",\"Answers\":\"Answers\",\"Blogs\":\"Blogs\",\"Discussions\":\"Discussions\",\"Events\":\"Events\",\"Export\":\"Export\",\"Ideas\":\"Ideas\",\"Wiki\":\"Wiki\"},\"CommunitySettings\":{\"btn_Add\":\"Add\",\"btn_Apply\":\"Apply\",\"btn_Authenticate\":\"Authenticate\",\"btn_Cancel\":\"Cancel\",\"btn_Checking\":\"Checking ...\",\"btn_Close\":\"Close\",\"btn_Connect\":\"Connect\",\"btn_CreateBadge\":\"Create a Badge\",\"btn_CreateNew\":\"Create New\",\"btn_CreateUser\":\"Create User\",\"btn_Delete\":\"Delete\",\"btn_DemoteUser\":\"Demote User\",\"btn_Edit\":\"Edit\",\"btn_EditPoints\":\"Edit Points\",\"btn_Keep\":\"Keep\",\"btn_LoadMore\":\"Load More\",\"btn_Next\":\"Next\",\"btn_Prev\":\"Previous\",\"btn_PromoteUser\":\"Promote User\",\"btn_Replace\":\"Replace\",\"btn_Save\":\"Save\",\"btn_Saving\":\"Saving ...\",\"btn_ShowMore\":\"SHOW MORE\",\"btn_ViewFiles\":\"Assets\",\"btn_ViewProfile\":\"Profile\",\"cmx_Edition\":\"Community Manager Edition\",\"col_Actions\":\"Actions\",\"col_Activity\":\"Activity\",\"col_Badge\":\"Badge\",\"col_Email\":\"Email\",\"col_EXP\":\"EXP PTS\",\"col_EXPAbbreviation\":\"EXP\",\"col_Goals\":\"Goals\",\"col_GoalType\":\"Goal Type\",\"col_Joined\":\"Joined\",\"col_Limits\":\"Limits\",\"col_MaxValue\":\"Max Value\",\"col_MinValue\":\"Min Value\",\"col_Module\":\"Module\",\"col_MostActiveUsers\":\"Most Active\",\"col_Name\":\"Name\",\"col_PowerRankings\":\"Reputation\",\"col_Privilege\":\"Privilege\",\"col_Pts\":\"Pts\",\"col_REP\":\"REP PTS\",\"col_REPAbbreviation\":\"REP\",\"col_RoleExpiry\":\"Expires\",\"col_RoleStart\":\"Start\",\"col_Tier\":\"Tier\",\"col_Time\":\"Time\",\"col_Timeframe\":\"Timeframe\",\"col_TopSpectators\":\"Top Spectators\",\"col_Value\":\"Value\",\"col_Views\":\"Views\",\"col_Weight\":\"Weight\",\"desc_EditBadge\":\"Define basic information for the badge\",\"desc_Goal\":\"Set the goals for the badge\",\"desc_Scoring\":\"Assign scoring actions to the badge\",\"label_Activities\":\"Activities\",\"label_Adoptions\":\"Adoption\",\"label_AvailableActions\":\"Available Actions\",\"label_AverageTime\":\"Average Time\",\"label_BadgeBanner\":\"Badge Banner\",\"label_BadgeDesc\":\"Description\",\"label_BadgeName\":\"Badge Name\",\"label_BadgeTier\":\"Badge Tier\",\"label_BounceRate\":\"Bounce Rate\",\"label_By\":\"by\",\"label_CommentModeration\":\"Comment Moderation\",\"label_CommentsPageSize\":\"Comments Page Size\",\"label_ComparativeTerm\":\"Comparative Term\",\"label_ContentModeration\":\"Content Moderation\",\"label_Count\":\"Count\",\"label_Create\":\"Creates\",\"label_Created\":\"Created:\",\"label_Date\":\"Date\",\"label_Days\":\"Number of Days\",\"label_Description\":\"Description\",\"label_DiscardAll\":\"Discard All\",\"label_DropFile\":\"Drop File(s) Here\",\"label_Email\":\"Email\",\"label_Engagement\":\"Engagement\",\"label_Experience\":\"Experience Points\",\"label_ExperienceAbbreviation\":\"Experience\",\"label_FirstName\":\"First Name\",\"label_FolderType\":\"Folder type:\",\"label_From\":\"From\",\"label_GroupHomePage\":\"Group Home Page\",\"label_Influence\":\"Influence\",\"label_LastActive\":\"Last active: \",\"label_LastModified\":\"Last Modified:\",\"label_LastName\":\"Last Name\",\"label_Maximum\":\"Maximum Times\",\"label_MemberOf\":\"Member of\",\"label_Minutes\":\"Min\",\"label_NA\":\"N/A\",\"label_Name\":\"Name\",\"label_NoActivities\":\"No Activities\",\"label_NotApplicable\":\"N/A\",\"label_OneMillionSufix\":\"M\",\"label_OneThousandSufix\":\"K\",\"label_PageSize\":\"Page Size\",\"label_Participation\":\"Participation\",\"label_PendingItems\":\"Pending Items\",\"label_Percent\":\"Percent\",\"label_Period\":\"Period\",\"label_Profanity\":\"Profanity Filtering\",\"label_PublishAll\":\"Publish All\",\"label_Rank\":\"Rank\",\"label_RecentActivity\":\"Recent Activity\",\"label_Reputation\":\"Reputation Points\",\"label_ReputationAbbreviation\":\"Reputation\",\"label_Role\":\"Role\",\"label_SelectedActions\":\"Selected Actions\",\"label_Size\":\"Size:\",\"label_Spectators\":\"Spectators\",\"label_Subscribe\":\"Subscribe:\",\"label_Tag\":\"Tag\",\"label_Tags\":\"Tags\",\"label_Timeframe\":\"Timeframe\",\"label_TimeOnSite\":\"Time on site: \",\"label_Title\":\"Title\",\"label_To\":\"To\",\"label_TotalContributions\":\"total content contributions\",\"label_TotalCreate\":\"Total Creates\",\"label_Totals\":\"Totals\",\"label_TotalViews\":\"Total Views\",\"label_Url\":\"URL:\",\"label_UserName\":\"User Name\",\"label_UserRemoved\":\"User Removed\",\"label_Users\":\"Users\",\"label_Versioning\":\"Versioning\",\"label_View\":\"VIEWS\",\"label_Views\":\"Views\",\"label_Workflow\":\"Workflow\",\"label_WYSIWYG\":\"Enable WYSIWYG\",\"lbl_Root\":\"Home\",\"nav_Community\":\"Community\",\"nav_CommunitySettings\":\"Community\",\"opt_Activity\":\"Activity\",\"opt_Bronze\":\"Bronze\",\"opt_Custom\":\"Custom\",\"opt_Daily\":\"Daily\",\"opt_Day\":\"Day\",\"opt_FilterByModule\":\"Filter by module\",\"opt_FilterContent\":\"Filter Content\",\"opt_Gold\":\"Gold\",\"opt_Lifetime\":\"Lifetime\",\"opt_Members\":\"Members\",\"opt_Month\":\"Month\",\"opt_Monthly\":\"Monthly\",\"opt_NoFiltering\":\"No Filtering\",\"opt_NoLimit\":\"No Limit\",\"opt_ProhibitContent\":\"Prohibit Content\",\"opt_Silver\":\"Silver\",\"opt_Week\":\"Week\",\"opt_Weekly\":\"Weekly\",\"opt_Year\":\"Year\",\"opt_Yearly\":\"Yearly\",\"pager_ItemDesc\":\"Showing {0} items\",\"pager_ItemPagedDesc\":\"Showing {0}-{1} of {2} items\",\"pager_PageDesc\":\"Page {0} of {1}\",\"pager_RoleDesc\":\"Showing {0} roles\",\"pager_RolePagedDesc\":\"Showing {0}-{1} of {2} roles\",\"pager_UserDesc\":\"Showing {0} users\",\"pager_UserPagedDesc\":\"Showing {0}-{1} of {2} users\",\"placeholder_AddDescription\":\"Add description\",\"placeholder_AddTitle\":\"Add title\",\"placeholder_Search\":\"Filter by name\",\"placeholder_Tags\":\"separate tags with a comma\",\"tooltip_ActivityByModule\":\"[COUNT] Activities\",\"tooltip_AdoptionsAndParticipations\":\"[COUNT] Users\",\"tooltip_CreateSeries\":\"[COUNT] Creations\",\"tooltip_Down_Custom\":\"Down {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Down_Day_OnDay\":\"Down {0}% today compared to yesterday\",\"tooltip_Down_Day_OnMonth\":\"Down {0}% compared to this day a month ago\",\"tooltip_Down_Day_OnWeek\":\"Down {0}% compared to this day a week ago\",\"tooltip_Down_Day_OnYear\":\"Down {0}% compared to this day a year ago\",\"tooltip_Down_Month_OnMonth\":\"Down {0}% this month compared to last month\",\"tooltip_Down_Month_OnYear\":\"Down {0}% compared to this month a year ago\",\"tooltip_Down_Week_OnMonth\":\"Down {0}% compared to this week a month ago\",\"tooltip_Down_Week_OnWeek\":\"Down {0}% this week compared to last week\",\"tooltip_Down_Week_OnYear\":\"Down {0}% compared to this week a year ago\",\"tooltip_Down_Year_OnYear\":\"Down {0}% this year compared to last year\",\"tooltip_ShowAll\":\"Show All\",\"tooltip_Up_Custom\":\"Up {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Up_Day_OnDay\":\"Up {0}% today compared to yesterday\",\"tooltip_Up_Day_OnMonth\":\"Up {0}% compared to this day a month ago\",\"tooltip_Up_Day_OnWeek\":\"Up {0}% compared to this day a week ago\",\"tooltip_Up_Day_OnYear\":\"Up {0}% compared to this day a year ago\",\"tooltip_Up_Month_OnMonth\":\"Up {0}% this month compared to last month\",\"tooltip_Up_Month_OnYear\":\"Up {0}% compared to this month a year ago\",\"tooltip_Up_Week_OnMonth\":\"Up {0}% compared to this week a month ago\",\"tooltip_Up_Week_OnWeek\":\"Up {0}% this week compared to last week\",\"tooltip_Up_Week_OnYear\":\"Up {0}% compared to this week a year ago\",\"tooltip_Up_Year_OnYear\":\"Up {0}% this year compared to last year\",\"topCommunity_NoDataAvailable\":\"No data available\",\"txt_ConfirmDelete\":\"Are you sure you want to delete this item?\",\"txt_ConfirmDeleteAsset\":\"Are you sure you want to delete the asset '[NAME]'?\",\"txt_ConfirmDeleteFolder\":\"Are you sure you want to delete the folder '[NAME]'?\",\"txt_Deleted\":\"Item successfully deleted.\",\"txt_Items\":\"{0} items\",\"txt_NoPopularContent\":\"No popular content available in selected period\",\"txt_NoTrendingTags\":\"No trending tags available in selected period\",\"txt_PleaseTypeRoleName\":\"Please type a role name.\",\"txt_RoleSuccessfullyAdded\":\"Role successfully added\",\"txt_Saved\":\"Item successfully saved.\",\"txt_SetupConnections\":\"Setup your connections to easily share content and more\",\"txt_UserSaved\":\"User successfully saved.\",\"txt_ViewIndex\":\"Viewing {0} of {1}\",\"title_Influence\":\"Influence\",\"title_ModuleSettings\":\"Miscellaneous Community Settings\"},\"Forms\":{\"nav_Forms\":\"Forms\"},\"Gamification\":{\"btn_Add\":\"Add\",\"btn_Apply\":\"Apply\",\"btn_Authenticate\":\"Authenticate\",\"btn_Cancel\":\"Cancel\",\"btn_Checking\":\"Checking ...\",\"btn_Close\":\"Close\",\"btn_Connect\":\"Connect\",\"btn_CreateBadge\":\"Create a Badge\",\"btn_CreateNew\":\"Create New\",\"btn_CreateUser\":\"Create User\",\"btn_Delete\":\"Delete\",\"btn_DemoteUser\":\"Demote User\",\"btn_Edit\":\"Edit\",\"btn_EditPoints\":\"Edit Points\",\"btn_Keep\":\"Keep\",\"btn_LoadMore\":\"Load More\",\"btn_Next\":\"Next\",\"btn_Prev\":\"Previous\",\"btn_PromoteUser\":\"Promote User\",\"btn_Replace\":\"Replace\",\"btn_Save\":\"Save\",\"btn_Saving\":\"Saving ...\",\"btn_ShowMore\":\"SHOW MORE\",\"btn_ViewFiles\":\"Assets\",\"btn_ViewProfile\":\"Profile\",\"cmx_Edition\":\"Community Manager Edition\",\"col_Actions\":\"Actions\",\"col_Activity\":\"Activity\",\"col_Badge\":\"Badge\",\"col_Email\":\"Email\",\"col_EXP\":\"EXP PTS\",\"col_EXPAbbreviation\":\"EXP\",\"col_Goals\":\"Goals\",\"col_GoalType\":\"Goal Type\",\"col_Joined\":\"Joined\",\"col_Limits\":\"Limits\",\"col_MaxValue\":\"Max Value\",\"col_MinValue\":\"Min Value\",\"col_Module\":\"Module\",\"col_MostActiveUsers\":\"Most Active\",\"col_Name\":\"Name\",\"col_PowerRankings\":\"Reputation\",\"col_Privilege\":\"Privilege\",\"col_Pts\":\"Pts\",\"col_REP\":\"REP PTS\",\"col_REPAbbreviation\":\"REP\",\"col_RoleExpiry\":\"Expires\",\"col_RoleStart\":\"Start\",\"col_Tier\":\"Tier\",\"col_Time\":\"Time\",\"col_Timeframe\":\"Timeframe\",\"col_TopSpectators\":\"Top Spectators\",\"col_Value\":\"Value\",\"col_Views\":\"Views\",\"col_Weight\":\"Weight\",\"desc_EditBadge\":\"Define basic information for the badge\",\"desc_Goal\":\"Set the goals for the badge\",\"desc_Scoring\":\"Assign scoring actions to the badge\",\"label_Activities\":\"Activities\",\"label_Adoptions\":\"Adoption\",\"label_AvailableActions\":\"Available Actions\",\"label_AverageTime\":\"Average Time\",\"label_BadgeBanner\":\"Badge Banner\",\"label_BadgeDesc\":\"Description\",\"label_BadgeName\":\"Badge Name\",\"label_BadgeTier\":\"Badge Tier\",\"label_BounceRate\":\"Bounce Rate\",\"label_By\":\"by\",\"label_CommentModeration\":\"Comment Moderation\",\"label_CommentsPageSize\":\"Comments Page Size\",\"label_ComparativeTerm\":\"Comparative Term\",\"label_ContentModeration\":\"Content Moderation\",\"label_Count\":\"Count\",\"label_Create\":\"Creates\",\"label_Created\":\"Created:\",\"label_Date\":\"Date\",\"label_Days\":\"Number of Days\",\"label_Description\":\"Description\",\"label_DiscardAll\":\"Discard All\",\"label_DropFile\":\"Drop File(s) Here\",\"label_Email\":\"Email\",\"label_Engagement\":\"Engagement\",\"label_Experience\":\"Experience Points\",\"label_ExperienceAbbreviation\":\"Experience\",\"label_FirstName\":\"First Name\",\"label_FolderType\":\"Folder type:\",\"label_From\":\"From\",\"label_GroupHomePage\":\"Group Home Page\",\"label_Influence\":\"Influence\",\"label_LastActive\":\"Last active: \",\"label_LastModified\":\"Last Modified:\",\"label_LastName\":\"Last Name\",\"label_Maximum\":\"Maximum Times\",\"label_MemberOf\":\"Member of\",\"label_Minutes\":\"Min\",\"label_NA\":\"N/A\",\"label_Name\":\"Name\",\"label_NoActivities\":\"No Activities\",\"label_NotApplicable\":\"N/A\",\"label_OneMillionSufix\":\"M\",\"label_OneThousandSufix\":\"K\",\"label_PageSize\":\"Page Size\",\"label_Participation\":\"Participation\",\"label_PendingItems\":\"Pending Items\",\"label_Percent\":\"Percent\",\"label_Period\":\"Period\",\"label_Profanity\":\"Profanity Filtering\",\"label_PublishAll\":\"Publish All\",\"label_Rank\":\"Rank\",\"label_RecentActivity\":\"Recent Activity\",\"label_Reputation\":\"Reputation Points\",\"label_ReputationAbbreviation\":\"Reputation\",\"label_Role\":\"Role\",\"label_SelectedActions\":\"Selected Actions\",\"label_Size\":\"Size:\",\"label_Spectators\":\"Spectators\",\"label_Subscribe\":\"Subscribe:\",\"label_Tag\":\"Tag\",\"label_Tags\":\"Tags\",\"label_Timeframe\":\"Timeframe\",\"label_TimeOnSite\":\"Time on site: \",\"label_Title\":\"Title\",\"label_To\":\"To\",\"label_TotalContributions\":\"total content contributions\",\"label_TotalCreate\":\"Total Creates\",\"label_Totals\":\"Totals\",\"label_TotalViews\":\"Total Views\",\"label_Url\":\"URL:\",\"label_UserName\":\"User Name\",\"label_UserRemoved\":\"User Removed\",\"label_Users\":\"Users\",\"label_Versioning\":\"Versioning\",\"label_View\":\"VIEWS\",\"label_Views\":\"Views\",\"label_Workflow\":\"Workflow\",\"label_WYSIWYG\":\"Enable WYSIWYG\",\"lbl_Root\":\"Home\",\"nav_Community\":\"Community\",\"nav_CommunitySettings\":\"Community\",\"nav_Gamification\":\"Gamification\",\"opt_Activity\":\"Activity\",\"opt_Bronze\":\"Bronze\",\"opt_Custom\":\"Custom\",\"opt_Daily\":\"Daily\",\"opt_Day\":\"Day\",\"opt_FilterByModule\":\"Filter by module\",\"opt_FilterContent\":\"Filter Content\",\"opt_Gold\":\"Gold\",\"opt_Lifetime\":\"Lifetime\",\"opt_Members\":\"Members\",\"opt_Month\":\"Month\",\"opt_Monthly\":\"Monthly\",\"opt_NoFiltering\":\"No Filtering\",\"opt_NoLimit\":\"No Limit\",\"opt_ProhibitContent\":\"Prohibit Content\",\"opt_Silver\":\"Silver\",\"opt_Week\":\"Week\",\"opt_Weekly\":\"Weekly\",\"opt_Year\":\"Year\",\"opt_Yearly\":\"Yearly\",\"pager_ItemDesc\":\"Showing {0} items\",\"pager_ItemPagedDesc\":\"Showing {0}-{1} of {2} items\",\"pager_PageDesc\":\"Page {0} of {1}\",\"pager_RoleDesc\":\"Showing {0} roles\",\"pager_RolePagedDesc\":\"Showing {0}-{1} of {2} roles\",\"pager_UserDesc\":\"Showing {0} users\",\"pager_UserPagedDesc\":\"Showing {0}-{1} of {2} users\",\"placeholder_AddDescription\":\"Add description\",\"placeholder_AddTitle\":\"Add title\",\"placeholder_Search\":\"Filter by name\",\"placeholder_Tags\":\"separate tags with a comma\",\"tooltip_ActivityByModule\":\"[COUNT] Activities\",\"tooltip_AdoptionsAndParticipations\":\"[COUNT] Users\",\"tooltip_CreateSeries\":\"[COUNT] Creations\",\"tooltip_Down_Custom\":\"Down {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Down_Day_OnDay\":\"Down {0}% today compared to yesterday\",\"tooltip_Down_Day_OnMonth\":\"Down {0}% compared to this day a month ago\",\"tooltip_Down_Day_OnWeek\":\"Down {0}% compared to this day a week ago\",\"tooltip_Down_Day_OnYear\":\"Down {0}% compared to this day a year ago\",\"tooltip_Down_Month_OnMonth\":\"Down {0}% this month compared to last month\",\"tooltip_Down_Month_OnYear\":\"Down {0}% compared to this month a year ago\",\"tooltip_Down_Week_OnMonth\":\"Down {0}% compared to this week a month ago\",\"tooltip_Down_Week_OnWeek\":\"Down {0}% this week compared to last week\",\"tooltip_Down_Week_OnYear\":\"Down {0}% compared to this week a year ago\",\"tooltip_Down_Year_OnYear\":\"Down {0}% this year compared to last year\",\"tooltip_ShowAll\":\"Show All\",\"tooltip_Up_Custom\":\"Up {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Up_Day_OnDay\":\"Up {0}% today compared to yesterday\",\"tooltip_Up_Day_OnMonth\":\"Up {0}% compared to this day a month ago\",\"tooltip_Up_Day_OnWeek\":\"Up {0}% compared to this day a week ago\",\"tooltip_Up_Day_OnYear\":\"Up {0}% compared to this day a year ago\",\"tooltip_Up_Month_OnMonth\":\"Up {0}% this month compared to last month\",\"tooltip_Up_Month_OnYear\":\"Up {0}% compared to this month a year ago\",\"tooltip_Up_Week_OnMonth\":\"Up {0}% compared to this week a month ago\",\"tooltip_Up_Week_OnWeek\":\"Up {0}% this week compared to last week\",\"tooltip_Up_Week_OnYear\":\"Up {0}% compared to this week a year ago\",\"tooltip_Up_Year_OnYear\":\"Up {0}% this year compared to last year\",\"topCommunity_NoDataAvailable\":\"No data available\",\"txt_ConfirmDelete\":\"Are you sure you want to delete this item?\",\"txt_ConfirmDeleteAsset\":\"Are you sure you want to delete the asset '[NAME]'?\",\"txt_ConfirmDeleteFolder\":\"Are you sure you want to delete the folder '[NAME]'?\",\"txt_Deleted\":\"Item successfully deleted.\",\"txt_Items\":\"{0} items\",\"txt_NoPopularContent\":\"No popular content available in selected period\",\"txt_NoTrendingTags\":\"No trending tags available in selected period\",\"txt_PleaseTypeRoleName\":\"Please type a role name.\",\"txt_RoleSuccessfullyAdded\":\"Role successfully added\",\"txt_Saved\":\"Item successfully saved.\",\"txt_SetupConnections\":\"Setup your connections to easily share content and more\",\"txt_UserSaved\":\"User successfully saved.\",\"txt_ViewIndex\":\"Viewing {0} of {1}\",\"gaming_Badges\":\"Badges\",\"gaming_Privileges\":\"Privileges\",\"gaming_Scoring\":\"Actions\",\"nav_Gaming\":\"Gaming\",\"step_CreateBadge\":\"Create Badge\",\"step_EditBadge\":\"Edit Badge\",\"step_Goal\":\"Define Goals\",\"step_Scoring\":\"Scoring Actions\",\"err_NoLargerThanExp\":\"Reputation points cannot be larger than experience points\",\"err_NonDecimalNumber\":\"Decimal numbers are not allowed\",\"err_NonNegativeNumber\":\"Negative numbers are not allowed\",\"err_OneActionNeeded\":\"At least one action is needed\",\"err_PositiveNumber\":\"Only positive numbers are allowed\",\"err_Required\":\"Text is required\",\"String1\":\"\",\"title_Badges\":\"Badges\",\"title_Privilege\":\"Privilege\",\"title_Scoring\":\"Scoring\"},\"Microservices\":{\"TenantIdDescription\":\"Note: once you enable a microservice, you will need to contact support to disable it.\",\"TenantIdTitle\":\"Services Tenant Group ID:\",\"Microservices.Header\":\"Microservices\",\"CopyToClipboardNotify\":\"Copied to your clipboard successfully\",\"CopyToClipboardTooltip\":\"Copy to clipboard\",\"nav_Microservices\":\"Services\"},\"PageAnalytics\":{\"analytics_Apply\":\"Apply\",\"analytics_AverageTime\":\"Time On Page\",\"analytics_BounceRate\":\"Bounce Rate\",\"analytics_Channels\":\"Channels\",\"analytics_ComparativeTerm\":\"Comparative Term\",\"analytics_Custom\":\"Custom\",\"analytics_Dashboard\":\"Dashboard\",\"analytics_Day\":\"Day\",\"analytics_Devices\":\"Devices\",\"analytics_direct\":\"Direct\",\"analytics_direct_referral\":\"Direct Referral\",\"analytics_exitpages\":\"Exit Pages\",\"analytics_external\":\"External\",\"analytics_From\":\"From\",\"analytics_internal\":\"Internal\",\"analytics_Month\":\"Month\",\"analytics_NavigationSummary\":\"Navigation Summary\",\"analytics_NoDataAvailable\":\"No data available\",\"analytics_PageActivities\":\"Page Activities\",\"analytics_PageTraffic\":\"Page Analytics\",\"analytics_PageViewActivity\":\"Page Traffic\",\"analytics_PageViews\":\"Page Views\",\"analytics_Page_Events\":\"Page Events\",\"analytics_Referrers\":\"Referrers\",\"analytics_search\":\"Search\",\"analytics_Sessions\":\"Sessions\",\"analytics_SiteActivities\":\"Site Activities\",\"analytics_SiteViewActivity\":\"Site Traffic\",\"analytics_Site_Events\":\"Site Events\",\"analytics_social\":\"Social\",\"analytics_TimeOnPage\":\"Time On Page\",\"analytics_To\":\"To\",\"analytics_TopOperatingSystems\":\"Top OS's\",\"analytics_TopPages\":\"Top Pages\",\"analytics_TopReferrers\":\"Top Referrers\",\"analytics_UniqueSessions\":\"Unique Sessions\",\"analytics_UniqueVisitors\":\"Unique Visitors\",\"analytics_Visitors\":\"Visitors\",\"analytics_Week\":\"Week\",\"analytics_Year\":\"Year\",\"AvgTimeOnPage\":\"Ang Time On Page\",\"BounceRate\":\"Bounce Rate\",\"CurrentPage\":\"Current Page\",\"Dashboard\":\"Dashboard\",\"Minute\":\"min\",\"nav_PageAnalytics\":\"Page Analytics\",\"pager_ItemDesc\":\"Showing {0} items\",\"pager_ItemPagedDesc\":\"Showing {0}-{1} of {2} items\",\"pager_PageDesc\":\"Page {0} of {1}\",\"pager_RoleDesc\":\"Showing {0} roles\",\"pager_RolePagedDesc\":\"Showing {0}-{1} of {2} roles\",\"pager_UserDesc\":\"Showing {0} users\",\"pager_UserPagedDesc\":\"Showing {0}-{1} of {2} users\",\"TotalPageViews\":\"Total Page Views\"},\"EvoqServers\":{\"errorMessageLoadingWebServersTab\":\"Error loading Web Servers tab\",\"Servers\":\"Servers\",\"tabWebServersTitle\":\"Web Servers\",\"errorMessageSavingWebRequestAdapter\":\"Error saving Server Web Request Adapter\",\"filterLabel\":\"Filter : \",\"filterOptionAll\":\"All\",\"filterOptionDisabled\":\"Disabled\",\"filterOptionEnabled\":\"Enabled\",\"plWebRequestAdapter.Help\":\"The Web Request Adapter is used to get the server's default url when a new server is added to the server collection, process request/response when send sync cache message to server or detect whether server is available.\",\"plWebRequestAdapter\":\"Server Web Request Adapter:\",\"saveButtonText\":\"Save\",\"CreatedDate\":\"Created:\",\"Enabled\":\"Enabled:\",\"errorMessageSavingWebServer\":\"Error saving Web Server\",\"IISAppName\":\"IIS App Name:\",\"LastActivityDate\":\"Last Restart:\",\"MemoryUsage\":\"Memory Usage\",\"plCount.Help\":\"Total Number Of Objects In Memory\",\"plCount\":\"Cache Objects\",\"plLimit.Help\":\"Percentage of available memory that can be consumed before cache items are ejected from memory\",\"plLimit\":\"Available for Caching\",\"plPrivateBytes.Help\":\"Total Memory Available To The Application For Caching\",\"plPrivateBytes\":\"Total Available Memory\",\"Server\":\"Server:\",\"ServerGroup\":\"Server Group:\",\"URL\":\"URL:\",\"cancelButtonText\":\"Cancel\",\"confirmMessageDeleteWebServer\":\"Are you sure you want to delete the server '{0}'?\",\"deleteButtonText\":\"Delete\",\"errorMessageDeletingWebServer\":\"Error deleting Web Server\",\"cacheItemSize\":\"{0} Bytes\",\"cacheItemsTitle\":\"Cache Items\",\"errorExpiringCacheItem\":\"Error trying to expire Cache Item\",\"errorMessageLoadingCacheItem\":\"Error loading the selected Cache Item\",\"errorMessageLoadingCacheItemsList\":\"Error loading Cache Items List\",\"expireCacheItemButtonTitle\":\"Expire Cache Item\",\"loadCacheItemsLink\":\"[ Load Cache Items ]\",\"CacheItemExpiredConfirmationMessage\":\"Cache Item expired sucessfully\",\"SaveConfirmationMessage\":\"Saved successfully\",\"ServerDeleteConfirmation\":\"Server deleted sucessfully\",\"pageSizeOptionText\":\"{0} results per page\",\"summaryText\":\"Showing {0}-{1} of {2} results\",\"InvalidUrl.ErrorMessage\":\"The URL is not valid, please make sure the input URL can be visited, you only need input the domain name.\"},\"SiteAnalytics\":{\"nav_Dashboard\":\"Dashboard\",\"nav_SiteAnalytics\":\"Site Analytics\"},\"StructuredContent\":{\"nav_StructuredContent\":\"Content Library\",\"StructuredContentOptions\":\"Enable Structured Content:\",\"MicroServicesDescription\":\"Once you enable a microservice, you will need to contact support to disable it.\",\"StructuredContentMicroservice.Header\":\"Structured Content Microservice\"},\"Templates\":{\"nav_Pages\":\"Pages\",\"nav_Templates\":\"Templates\",\"pagesettings_Actions_Duplicate\":\"Duplicate Page\",\"pagesettings_Actions_SaveAsTemplate\":\"Save as Template\",\"pagesettings_AddPage\":\"Add Page\",\"pagesettings_AddTemplate\":\"New Template\",\"pagesettings_AddTemplateCompleted\":\"Created New Template\",\"pagesettings_Caption\":\"Pages\",\"pagesettings_ContentChanged\":\"Changes have not been saved\",\"pagesettings_CopyPage\":\"Create Copy\",\"pagesettings_CopyPermission\":\"Copy Permissions to Descendant Pages\",\"pagesettings_Created\":\"Created:\",\"pagesettings_CreatePage\":\"Create\",\"pagesettings_CreateTemplate\":\"Create\",\"pagesettings_DateTimeSeparator\":\"at\",\"pagesettings_Done\":\"Done\",\"pagesettings_Enable_Scheduling\":\"Enable Scheduling\",\"pagesettings_Errors_EmptyTabName\":\"The page name can't be empty.\",\"pagesettings_Errors_NoTemplate\":\"Please select a page template before creating a new page.\",\"pagesettings_Errors_PathDuplicateWithAlias\":\"There is a site domain identical to your page path.\",\"pagesettings_Errors_StartDateAfterEndDate\":\"The start date cannot be after end date.\",\"pagesettings_Errors_TabExists\":\"The Page Name you chose is already being used for another page at the same level of the page hierarchy.\",\"pagesettings_Errors_TabRecycled\":\"A page with this name exists in the Recycle Bin. To restore this page use the Recycle Bin.\",\"pagesettings_Errors_templates_EmptyTabName\":\"The template name can't be empty.\",\"pagesettings_Errors_templates_NoTemplate\":\"You need select a template to create new template.\",\"pagesettings_Errors_templates_NoTemplateExisting\":\"You must save an existing page as a template prior to create a new template.\",\"pagesettings_Errors_templates_PathDuplicateWithAlias\":\"There is a site domain identical to your page template.\",\"pagesettings_Errors_templates_TabExists\":\"The Template Name you chose is already being used for another template.\",\"pagesettings_Errors_templates_TabRecycled\":\"A template with this name exists in the Recycle Bin. To restore this template use the Recycle Bin.\",\"pagesettings_Errors_UrlPathCleaned\":\"The Page URL entered contains characters which cannot be used in a URL or are illegal characters for a URL.<br>[NOTE: The illegal characters list is the following: <>\\\\?:&=+|%# ]\",\"pagesettings_Errors_UrlPathNotUnique\":\"The submitted URL is not available as there is another page already use this URL.\",\"pagesettings_Fields_AddInMenu\":\"Add Page to Site Menu\",\"pagesettings_Fields_Description\":\"Description\",\"pagesettings_Fields_Keywords\":\"Keywords\",\"pagesettings_Fields_Layout\":\"Page Template\",\"pagesettings_Fields_Links\":\"Link Tracking\",\"pagesettings_Fields_Menu\":\"Display in Menu\",\"pagesettings_Fields_Name\":\"Name\",\"pagesettings_Fields_Name_Required\":\"Name (required)\",\"pagesettings_Fields_PageTemplates\":\"Page Templates\",\"pagesettings_Fields_Tags\":\"Tags\",\"pagesettings_Fields_TemplateName\":\"Template Name\",\"pagesettings_Fields_Title\":\"Title\",\"pagesettings_Fields_Type\":\"Type\",\"pagesettings_Fields_Type_ContentPage\":\"Content Page\",\"pagesettings_Fields_URL\":\"URL\",\"pagesettings_Fields_Workflow\":\"Workflow\",\"pagesettings_NewTemplate\":\"New Template\",\"pagesettings_Parent\":\"Page Parent:\",\"pagesettings_Save\":\"Save\",\"pagesettings_SaveAsTemplate\":\"Save As Template\",\"pagesettings_ShowInPageManagement\":\"Page Management\",\"pagesettings_Tabs_Details\":\"Details\",\"pagesettings_Tabs_Permissions\":\"Permissions\",\"pagesettings_TopLevel\":\"Top Level\",\"pagesettings_Update\":\"Update\",\"pages_AddPage\":\"Add Page\",\"pages_AddTemplate\":\"Add Template\",\"pages_Cancel\":\"Cancel\",\"pages_Delete\":\"Delete\",\"pages_DeletePageConfirm\":\"

Please confirm you wish to delete this page.

\",\"pages_DeleteTemplateConfirm\":\"

Please confirm you wish to delete this template.

\",\"pages_DetailView\":\"Detail View\",\"pages_Discard\":\"Discard\",\"pages_DragInvalid\":\"You can't drag a page as a child of itself.\",\"pages_DragPageTooltip\":\"Drag Page into Location\",\"pages_Edit\":\"Edit\",\"pages_end_date\":\"End Date\",\"pages_Hidden\":\"Page is hidden in menu\",\"pages_No\":\"No\",\"pages_Pending\":\"Please drag the page into the desired location.\",\"pages_Published\":\"Published:\",\"pages_ReturnToMain\":\"Page Management\",\"pages_Settings\":\"Settings\",\"pages_SmallView\":\"Small View\",\"pages_start_date\":\"Start Date\",\"pages_Status\":\"Status:\",\"pages_Title\":\"Page Management\",\"pages_View\":\"View\",\"pages_ViewPageTemplate\":\"Page Templates\",\"pages_ViewRecycleBin\":\"Recycle Bin\",\"pages_ViewTemplateManagement\":\"Template Management\",\"pages_Yes\":\"Yes\",\"pb_Edition\":\"Content Manager Edition\",\"permissiongrid.Actions\":\"Actions\",\"permissiongrid.Add Content\":\"Add Content\",\"permissiongrid.Add User\":\"Add User\",\"permissiongrid.Add\":\"Add\",\"permissiongrid.AllRoles\":\"\",\"permissiongrid.Copy\":\"Copy\",\"permissiongrid.Delete\":\"Delete\",\"permissiongrid.Display Name\":\"Display Name:\",\"permissiongrid.Edit Content\":\"Edit Content\",\"permissiongrid.Edit Tab\":\"Full Control\",\"permissiongrid.Edit\":\"Full Control\",\"permissiongrid.Export\":\"Export\",\"permissiongrid.Filter By Group\":\"Filter By Group\",\"permissiongrid.GlobalRoles\":\"\",\"permissiongrid.Import\":\"Import\",\"permissiongrid.Manage Settings\":\"Manage Settings\",\"permissiongrid.Navigate\":\"Navigate\",\"permissiongrid.Select Role\":\"Select Role\",\"permissiongrid.Type-roles\":\"Roles\",\"permissiongrid.Type-users\":\"Users\",\"permissiongrid.View Tab\":\"View\",\"permissiongrid.View\":\"View\",\"Service_CopyPermissionError\":\"Error occurred when copy permissions to descendant pages.\",\"Service_CopyPermissionSuccessful\":\"Copy permissions to descendant pages successful.\",\"Service_LayoutNotExist\":\"The layout has already been deleted.\",\"Service_ModuleNotExist\":\"The module has already been deleted.\",\"Service_RemoveTabError\":\"Page {0} cannot be deleted until its children have been deleted first.
\",\"Service_RemoveTabModuleError\":\"Error removing page has occurred:
{0}\",\"Service_RestoreModuleError\":\"Error restoring module {0} on page {1}. Page is deleted.\",\"Service_RestoreTabError\":\"Page {0} cannot be restored until its parent is restored first.
\",\"Service_RestoreTabModuleError\":\"Error restoring page has occurred:
{0}\",\"System\":\"System\"},\"Workflow\":{\"nav_Workflow\":\"Workflow\",\"settings_common_cancel_btn\":\"Cancel\",\"settings_common_confirm_btn\":\"Confirm\",\"settings_common_no_btn\":\"No\",\"settings_common_yes_btn\":\"Yes\",\"settings_title\":\"Workflows\",\"validation_digit\":\"Please enter a number\",\"validation_max\":\"Please enter a value less than or equal to {0}.\",\"validation_maxLength\":\"Please enter no more than {0} characters.\",\"validation_min\":\"Please enter a value greater than or equal to {0}.\",\"validation_minLength\":\"Please enter at least {0} characters.\",\"validation_required\":\"This field is required.\",\"worflow_usages_dialog_inner_title\":\"You are viewing usage for the {0} workflow\",\"worflow_usages_dialog_table_contentType\":\"CONTENT TYPE\",\"worflow_usages_dialog_table_name\":\"NAME\",\"worflow_usages_dialog_title\":\"Workflow Usage Information\",\"WorkflowApplyOnSubpagesCheckBox\":\"Apply setting to all subpages\",\"WorkflowLabel.Help\":\"Select a workflow to publish this page\",\"WorkflowLabel\":\"Workflow\",\"WorkflowNoteApplyOnSubpages\":\"Note: This setting cannot be applied because there are one or more subpages pending to be published.\",\"WorkflowRunning\":\"This page has a running workflow. The workflow must be completed to be changed.\",\"workflows_add_state_btn\":\"Add a State\",\"workflows_common_accept_btn\":\"Accept\",\"workflows_common_cancel_btn\":\"Cancel\",\"workflows_common_close_btn\":\"Close\",\"workflows_common_description_lbl\":\"Description\",\"workflows_common_error\":\"Error\",\"workflows_common_errors_title\":\"Error\",\"workflows_common_error_resource_busy\":\"Worklow is currently used\",\"workflows_common_name_lbl\":\"Name\",\"workflows_common_save_btn\":\"Save\",\"workflows_common_title_lbl\":\"Workflow Name\",\"workflows_confirm_delete_state\":\"Are you sure you want to delete the {0} State?\",\"workflows_confirm_delete_workflow\":\"Are you sure you want to delete the {0} Workflow?\",\"workflows_edit_states_inner_title\":\"You are editing the {0} workflow state\",\"workflows_edit_states_name_lbl\":\"State Name\",\"workflows_edit_states_notify_admin\":\"Notify Administrators of state changes\",\"workflows_edit_states_notify_author\":\"Notify Author and Reviewers of state changes\",\"workflows_edit_states_reviewers\":\"Reviewers\",\"workflows_edit_states_title_edit\":\"Workflow State Edit\",\"workflows_edit_states_title_new\":\"Workflow State New\",\"workflows_header_actions\":\"ACTIONS\",\"workflows_header_in_use\":\"IN USE\",\"workflows_header_workflow_type\":\"WORKFLOW TYPE\",\"workflows_in_use\":\"In Use\",\"workflows_new_btn\":\"Create New Workflow\",\"workflows_new_state_inner_title\":\"New State for {0}\",\"workflows_new_workflow\":\"New Workflow\",\"workflows_notify_deleted\":\"Workflow deleted\",\"workflows_not_in_use\":\"Not Used\",\"workflows_page_description\":\"Workflows allow you to easily manage the document approval process, create a new workflow or use one of the available workflow types below.\",\"workflows_page_inner_derscription\":\"Content approval workflow allos authors to publish content, which will not be visible until reiewed and published.\",\"workflows_page_title\":\"Workflow Management\",\"workflows_resources_info\":\"This workflow is currently in use\",\"workflows_resources_link\":\"View Usage\",\"workflows_states_description\":\"Once a workflow is in use you cannot delete any of the workflow states associated width the workflow. The first and last workflow states of a workflow cannot be deleted.\",\"workflows_states_descriptions\":\"Once a workflow state is in use you cannot delete it. The first and last workflow states of a workflow cannot be deleted.\",\"workflows_states_reviewers\":\"Reviewers\",\"workflows_states_reviewers_description\":\"Specify who can review content for this state\",\"workflows_states_table_actions\":\"ACTIONS\",\"workflows_states_table_active\":\"ACTIVE\",\"workflows_states_table_move\":\"MOVE\",\"workflows_states_table_order\":\"ORDER\",\"workflows_states_table_state\":\"STATE\",\"workflows_states_title\":\"Workflow States\",\"workflows_state_active\":\"Active\",\"workflows_state_inactive\":\"Inactive\",\"workflows_title\":\"Workflows\",\"workflows_tooltip_lock\":\"Default workflows cannot be deleted\",\"workflows_unknown_error\":\"Unknown Error\",\"workflow_common_alert\":\"Alert\",\"workflows_header_isDefault\":\"Default\"}}}"); +const utilities = JSON.parse("{\"sf\":{\"moduleRoot\":\"personaBar\",\"controller\":\"\",\"antiForgeryToken\":\"28nJydTNQzIoLgyv6yOJxg5oFN36whjok-IN6NR4PLgMlkjBA1cuicNftJclJGcvhAxR7gPj7OIY5vLF0\"},\"onTouch\":false,\"persistent\":{},\"inAnimation\":false,\"ONE_THOUSAND\":1000,\"ONE_MILLION\":1000000,\"resx\":{\"Evoq\":{\"Browse\":\"Browse to Upload\",\"ContactSupport\":\"Contact Support\",\"CustomerPortal\":\"Customer Portal\",\"Documentation\":\"Documentation\",\"DragAndDropAreaTitle\":\"Drag and Drop a File or Select an Option\",\"DragAndDropDocument\":\"Drag and Drop Your Document Here\",\"DragAndDropDocuments\":\"Drag and Drop Your Document(s) Here\",\"DragAndDropImage\":\"Drag and Drop Your Image Here\",\"DragAndDropImages\":\"Drag and Drop Your Image(s) Here\",\"EnterUrl\":\"Enter Image URL\",\"ExampleUrl\":\"http://example.com/imagename.jpg\",\"FileIsTooLargeError\":\"File size bigger than {0}.\",\"Framework\":\".Net Framework\",\"FromUrl\":\"From URL\",\"InsertDocument\":\"Insert Document\",\"InsertDocuments\":\"Insert Document(s)\",\"InsertImage\":\"Insert Image\",\"InsertImages\":\"Insert Image(s)\",\"LicenseKey\":\"License Key\",\"Or\":\"OR\",\"RecentUploads\":\"Recent Uploads\",\"Search\":\"Search\",\"SelectAFolder\":\"Select A Folder\",\"ServerName\":\"Server Name\",\"StoredLocation\":\"Stored Location\",\"SupportMailAddress\":\"dnnsupport@dnnsoftware.com\",\"SupportMailBody\":\"\\r\\n\\r\\n----------\\r\\n{URL}\\r\\n{PRODUCTNAME}\\r\\n{VERSION}\",\"SupportMailSubject\":\"Support Request: We need assistance with our Evoq!\",\"Upload\":\"Upload\",\"UploadFile\":\"Upload File\"},\"PersonaBar\":{\"nav_Analytics\":\"Analytics\",\"nav_Dashboard\":\"Dashboard\",\"nav_Logout\":\"Logout\",\"nav_Settings\":\"Settings\",\"nav_Tasks\":\"Tasks\",\"nav_Edit\":\"Edit\",\"nav_Manage\":\"Manage\",\"nav_Content\":\"Content\",\"nav_Tools\":\"Tools\",\"nav_Accounts\":\"\",\"nav_DocCenter\":\"Doc Center\",\"nav_Help\":\"Help\",\"nav_Site\":\"View Site\",\"err_BetweenMinMax\":\"Value can only be between Min Value and Max Value\",\"err_Email\":\"Only valid email is allowed\",\"err_Minimum\":\"Text must be at least {0} chars\",\"err_MinLessThanMax\":\"The Min Value shall be less than Max Value\",\"err_NoLargerThanExp\":\"Reputation points cannot be larger than experience points\",\"err_NonDecimalNumber\":\"Decimal numbers are not allowed\",\"err_NonNegativeNumber\":\"Negative numbers are not allowed\",\"err_NoUserFolder\":\"{0} does not own any assets.\",\"err_Number\":\"Only numbers are allowed\",\"err_OneActionNeeded\":\"At least one action is needed\",\"err_PositiveNumber\":\"Only positive numbers are allowed\",\"err_Required\":\"Text is required\",\"err_RoleAssignedToUser\":\"This role is already assigned to this user.\",\"nav_Home\":\"Home\",\"permissiongrid.Actions\":\"Actions\",\"permissiongrid.Add Content\":\"Add Content\",\"permissiongrid.Add User\":\"Add User\",\"permissiongrid.Add\":\"Add\",\"permissiongrid.AllRoles\":\"\",\"permissiongrid.Copy\":\"Copy\",\"permissiongrid.Delete\":\"Delete\",\"permissiongrid.Display Name\":\"Display Name:\",\"permissiongrid.Edit Content\":\"Edit Content\",\"permissiongrid.Edit Tab\":\"Full Control\",\"permissiongrid.Edit\":\"Full Control\",\"permissiongrid.Export\":\"Export\",\"permissiongrid.Filter By Group\":\"Filter By Group\",\"permissiongrid.GlobalRoles\":\"\",\"permissiongrid.Import\":\"Import\",\"permissiongrid.Manage Settings\":\"Manage Settings\",\"permissiongrid.Navigate\":\"Navigate\",\"permissiongrid.Select Role\":\"Select Role\",\"permissiongrid.Type-roles\":\"Roles\",\"permissiongrid.Type-users\":\"Users\",\"permissiongrid.View Tab\":\"View\",\"permissiongrid.View\":\"View\",\"nav_SiteAssets\":\"Site Assets\",\"nav_GlobalAssets\":\"Global Assets\",\"title_Tasks\":\"Tasks\",\"txt_ViewIndex\":\"Viewing {0} of {1}\",\"btn_LoadMore\":\"Load More\",\"Documentation\":\"Documentation\",\"Framework\":\".Net Framework\",\"LicenseKey\":\"License Key\",\"ServerName\":\"Server Name\",\"UpgradeLicense\":\"[ Upgrade to Evoq ]\",\"btn_CloseDialog\":\"OK\",\"CriticalUpdate\":\"[ Critical Update ]\",\"NormalUpdate\":\"[ New Update ]\",\"LockEditMode.Help\":\"When locked, the icon will appear blue, and you will remain in Edit Mode even when navigating to other pages.\",\"LockEditMode\":\"Click to lock Edit Mode.\",\"UnlockEditMode.Help\":\"When unlocked, you will exit Edit Mode whenever you navigate to other page or complete your changes.\",\"UnlockEditMode\":\"Click to unlock Edit Mode.\"},\"SharedResources\":{\"ErrMissPermissions\":\"You don't have permission to upload file.\",\"ErrUploadFile\":\"Error: File couldn't be uploaded.\",\"ErrUploadStream\":\"Sorry, the image could not be saved.\",\"Root\":\"Home\",\"JustNow\":\"moments ago\",\"Day\":\"day\",\"DayAgo\":\"{0} day ago\",\"Days\":\"days\",\"DaysAgo\":\"{0} days ago\",\"Hour\":\"hour\",\"HourAgo\":\"{0} hour ago\",\"Hours\":\"hours\",\"HoursAgo\":\"{0} hours ago\",\"Minute\":\"minute\",\"MinuteAgo\":\"{0} minute ago\",\"Minutes\":\"minutes\",\"MinutesAgo\":\"{0} minutes ago\",\"Month\":\"month\",\"MonthAgo\":\"{0} month ago\",\"Months\":\"months\",\"MonthsAgo\":\"{0} months ago\",\"LongTimeAgo\":\"long time ago\",\"Never\":\"Never\",\"Second\":\"second\",\"SecondAgo\":\"{0} second ago\",\"Seconds\":\"seconds\",\"SecondsAgo\":\"{0} seconds ago\",\"WeekAgo\":\"{0} week ago\",\"WeeksAgo\":\"{0} weeks ago\",\"Year\":\"year\",\"YearAgo\":\"{0} year ago\",\"Years\":\"years\",\"YearsAgo\":\"{0} years ago\",\"UserHasNoPermissionToReadFile.Error\":\"The user has no permission to read this file\",\"UserHasNoPermissionToReadFolder.Error\":\"The user has no permission to read this folder\",\"Anonymous\":\"Anonymous\",\"RegisterationFailed\":\"{0}\",\"RegistrationUsernameAlreadyPresent\":\"The username is already in use.\",\"FolderDoesNotExist.Error\":\"The folder does not exist\",\"VisibleOnPage.Header\":\"Visible on Page\",\"btnCancel\":\"Cancel\",\"btnSave\":\"Save\",\"UnauthorizedRequest\":\"Authorization has been denied for this request.\",\"GenericErrorMessage.Error\":\"An unknown error has occured. Please check the admin logs for more information.\",\"All\":\"All\",\"AllSites\":\"All Sites\",\"Prompt_FlagIsRequired\":\"'[0]' is required.\\\\n\",\"Prompt_InvalidType\":\"The value entered for '[0]' is not valid '[1]'.\\\\n\",\"Promp_MainFlagIsRequired\":\"The '[0]' is required. Please use the --[1] flag or pass it as the first argument after the command name.\\\\n\",\"Promp_PositiveValueRequired\":\"'[0]' must be greater than 0.\\\\n\"},\"Tabs\":{\"lblAdminOnly\":\"Visible to Administrators only\",\"lblEveryone\":\"Page is visible to everyone\",\"lblHome\":\"Homepage of the site\",\"lblRegistered\":\"Visible to registered users\",\"lblSecure\":\"Visible to dedicated roles only\"},\"AdminLogs\":{\"plPortalID\":\"Website\",\"plPortalID.Help\":\"Select the site you want to view.\",\"plLogType\":\"Type\",\"plLogType.Help\":\"Filter the events displayed in the log.\",\"plShowRecords\":\"Show Records\",\"plShowRecords.Help\":\"Select the records you want to view.\",\"ColorCoding\":\"Color Coding on\",\"Settings\":\"Logging Settings\",\"Legend\":\"Color Coding Legend\",\"Date\":\"Date\",\"Type\":\"Log Type\",\"Username\":\"Username\",\"Portal\":\"Website\",\"Summary\":\"Summary\",\"btnDelete\":\"Delete Selected\",\"btnClear\":\"Clear Log\",\"SendExceptions\":\"Send Log Entries\",\"ExceptionsWarning\":\"Please note: By using these features \\r\\n below, you may be sending sensitive data over the Internet in clear \\r\\n text (not encrypted). Before sending this exception, \\r\\n please review the contents of your log entry to verify that no \\r\\n sensitive data is contained within it. Only the log entries checked above \\r\\n will be sent.\",\"SendExceptionsEmail\":\"Send Log Entries via Email\",\"plEmailAddress\":\"Email Address\",\"plEmailAddress.Help\":\"Please enter the email address of the person you want to receive the log entries. Multipe email addresses should be separated by comma or semicolon.\",\"SendMessage\":\"Message (optional)\",\"SendMessage.Help\":\"Include an optional message with the log entries.\",\"btnEmail\":\"Email Selected\",\"AddContent.Action\":\"Add Log Setting\",\"NoEntries\":\"There are no log items.\",\"Showing\":\"Showing {0} to {1} of {2}\",\"DeleteSuccess\":\"The selected log entries were successfully deleted.\",\"EmailSuccess\":\"Your email has been sent.\",\"EmailFailure\":\"Your email has not been sent.\",\"ServiceUnavailable\":\"The web service at DotNetNuke.com is currently unavailable.\",\"ServerName\":\"Server Name: \",\"LogCleared\":\"The log has been cleared.\",\"ClickRow\":\"Click on a row for details.\",\"ExceptionCode\":\"Exception\",\"ItemCreatedCode\":\"Item Created\",\"ItemUpdatedCode\":\"Item Updated\",\"ItemDeletedCode\":\"Item Deleted\",\"SuccessCode\":\"Operation Success\",\"FailureCode\":\"Operation Failure\",\"AdminOpCode\":\"General Admin Operation\",\"AdminAlertCode\":\"Admin Alert\",\"HostAlertCode\":\"Host Alert\",\"ToEmail\":\"To Specified Email Address\",\"ControlTitle_\":\"Event Viewer\",\"ModuleHelp\":\"

About Log Viewer

Allows you to edit website events to log.

\",\"SecurityException\":\"Security Exception\",\"plSubject.Help\":\"Enter the subject for the email.\",\"plSubject\":\"Subject\",\"InavlidEmailAddress\":\"'{0}' is not a valid email address.\",\"Viewer\":\"Viewer\",\"ClearLog\":\"Are you sure you want to clear all log entries?\",\"SelectException\":\"Please select at least one log entry.\",\"LogEntryDefaultMsg\":\"Attached are my error log entries.\",\"LogEntryDefaultSubject\":\"Error Logs\",\"LogType.Header\":\"Log Type\",\"Portal.Header\":\"Website\",\"Active.Header\":\"Active\",\"FileName.Header\":\"File Name\",\"Edit.EditText\":\"Edit\",\"plIsActive\":\"Logging\",\"plIsActive.Help\":\"Check this box to enable logging.\",\"plLogTypeKey\":\"Log Type\",\"plLogTypeKey.Help\":\"The type of event being logged.\",\"plLogTypePortalID\":\"Website\",\"plLogTypePortalID.Help\":\"The site which this log event is associated with.\",\"plKeepMostRecent\":\"Keep Most Recent\",\"plFileName\":\"FileName\",\"plFileName.Help\":\"The file name of the log file.\",\"plEmailNotificationStatus\":\"Email Notification\",\"plEmailNotificationStatus.Help\":\"Check this box to send an email message when this event occurs.\",\"plThreshold\":\"Occurrence Threshold\",\"plMailFromAddress\":\"Mail From Address\",\"plMailFromAddress.Help\":\"The email address that the notification will be sent from.\",\"plMailToAddress\":\"Mail To Address\",\"plMailToAddress.Help\":\"The email address to send the notification to\",\"EmailSettings\":\"Email Notification Settings\",\"ConfigDeleted\":\"The log setting has been deleted.\",\"ConfigUpdated\":\"The log setting has been updated.\",\"ConfigAdded\":\"The log setting has been added.\",\"LogEntry\":\" Log Entry\",\"LogEntries\":\" Log Entries\",\"Occurence\":\" Occurence\",\"Occurences\":\" Occurences\",\"In\":\"in\",\"ControlTitle_edit\":\"Edit Log Settings\",\"DeleteError\":\"The selected log setting could not be deleted. You should delete all existing log entries for this log type first.\",\"TimeType_1\":\"Seconds\",\"TimeType_2\":\"Minutes\",\"TimeType_3\":\"Hours\",\"TimeType_4\":\"Days\",\"nav_AdminLogs\":\"Admin Logs\",\"AdminLogs.Header\":\"Admin Logs\",\"ConfigAddError\":\"The log setting could not be added. Please try again later.\",\"ConfigBtnCancel\":\"Cancel\",\"ConfigBtnDelete\":\"Delete\",\"ConfigBtnSave\":\"Save\",\"ConfigDeleteCancelled\":\"Cancelled deletion.\",\"ConfigDeletedWarning\":\"Are you sure you want to delete selected log setting?\",\"ConfigDeleteInconsistency\":\"Inconsistency error occurred. Please refresh the page and try again.\",\"ConfigUpdateError\":\"The log setting could not be updated. Please try again later.\",\"False\":\"False\",\"LogSettings.Header\":\"Log Settings\",\"no\":\"No\",\"True\":\"True\",\"yes\":\"Yes\",\"btnCancel\":\"Cancel\",\"btnSend\":\"Send\",\"EntriesPerPage\":\" entries per page\",\"LogDeleteWarning\":\"Are you sure you want to delete selected logs?\",\"ShowingOne\":\"Showing 1 entry\",\"ShowingTotal\":\"Showing {0} entries\",\"MailToAddress.Message\":\"Valid mail to address is required.\",\"Email.Message\":\"Valid email is required.\",\"UnAuthorizedToSendLog\":\"You are not authorized to send these log entries.\",\"AllTypes\":\"All Types\"},\"ConfigConsole\":{\"cmdExecute\":\"Execute Merge\",\"cmdUpload\":\"Upload XML Merge Script\",\"ERROR_Merge\":\"The system encountered an error applying the specified configuration changes. Please review the event log for error details.\",\"plScriptNote\":\"*NOTE:\",\"plScriptNoteDesc\":\"once uploaded, you may edit the script in the field below before executing\",\"plScript\":\"Merge Script\",\"cmdLoad\":\"Load\",\"Configuration\":\"Files\",\"Merge\":\"Merge Scripts\",\"plConfigHelp\":\"- Select a config file to edit -\",\"plConfig\":\"Configuration File\",\"SaveWarning\":\"Changing the web.config will cause your website to reload and may decrease site performance while the application is reloaded by the webserver. Do you want to continue?\",\"ERROR_ConfigurationFormat\":\"Your configuration file is not a valid XML file. Please correct the formatting issue and try again. {0}\",\"LoadConfigWarning\":\"Warning: You will lose your current changes if you load a new config file.\",\"MergeConfirm\":\"Are you sure you want to merge these changes to this config file?\",\"SaveConfirm\":\"Are you sure you want to save changes this config file?\",\"SelectConfig\":\"Select a config file...\",\"Success\":\"The changes were successfully made.\",\"cmdSave\":\"Save Changes\",\"fileLabel.Help\":\"You can modify the file before making changes.\",\"fileLabel\":\"File:\",\"scriptLabel.Help\":\"You can edit the merge script before executing it.\",\"scriptLabel\":\"Script:\",\"ControlTitle_\":\"Configuration Manager\",\"nav_ConfigConsole\":\"Config Manager\",\"ConfigConsole\":\"Configuration Manager\",\"SaveButton\":\"Yes\",\"CancelButton\":\"No\",\"ConfigFilesTab\":\"Config Files\",\"MergeScriptsTab\":\"Merge Scripts\"},\"Connectors\":{\"btn_Cancel\":\"Cancel\",\"btn_Checking\":\"Checking ...\",\"btn_Connect\":\"Connect\",\"btn_Edit\":\"Edit\",\"btn_Save\":\"Save\",\"nav_Connectors\":\"Connectors\",\"Save\":\"Save\",\"title_Connections\":\"Configure Connections\",\"txt_Saved\":\"Item successfully saved.\",\"txt_Deleted\":\"Item successfully deleted.\",\"txt_AddNew\":\"Add New\",\"txt_clickToEdit\":\"Click to edit connector name\",\"txt_SetupConnections\":\"Setup your connections to easily share content and more\",\"txt_DisplayNameIsNotValid\":\"A name can only contain letters and numbers.\",\"txt_DisplayNameIsNotUnique\":\"A name must be unique.\",\"ErrConnectorNotFound\":\"Connector not found.\"},\"CssEditor\":{\"StylesheetEditor\":\"Custom CSS\",\"SaveStyleSheet\":\"Save Style Sheet\",\"RestoreDefault\":\"Restore Default\",\"nav_CssEditor\":\"Custom CSS\",\"ConfirmRestore\":\"Are you sure you want to restore the default stylesheet? All changes to the current stylesheet will be lost.\",\"RestoreButton\":\"Yes\",\"CancelButton\":\"No\",\"StyleSheetSaved\":\"Style sheet successfully saved.\",\"StyleSheetRestored\":\"Style sheet successfully restored.\"},\"Extensions\":{\"nav_Extensions\":\"Extensions\",\"ControlTitle_\":\"Extensions\",\"CreateExtension.Action\":\"Create New Extension\",\"Delete\":\"Uninstall this Extension\",\"ExtensionInstall.Action\":\"Install Extension\",\"Language.Header\":\"Language\",\"Name.Header\":\"Name\",\"plPackageTypes.Help\":\"Select a single type of extension to be displayed.\",\"plPackageTypes\":\"Filter by Type:\",\"Title\":\"List of {0} Extensions Installed\",\"TreeHeader\":\"Installed Extensions\",\"Type.Header\":\"Type\",\"Upgrade.Header\":\"Upgrade?\",\"Version.Header\":\"Version\",\"Description.Header\":\"Description\",\"ImportModule.Action\":\"Import Module Definition\",\"CreateLanguagePack.Action\":\"Create New Language\",\"CreateModule.Action\":\"Create New Module\",\"LanguagePackInstall.Action\":\"Install Language Pack\",\"ModuleInstall.Action\":\"Install Module\",\"CreateSkin.Action\":\"Create New Theme\",\"EditSkins.Action\":\"Manage Themes\",\"SkinInstall.Action\":\"Install New Theme\",\"plLocales\":\"Find Available Language Packs:\",\"plLocales.Help\":\"Choose a language to display a list of the extensions that have a language pack available in the selected language. If a language pack exists, follow the link to download and install the language pack.\",\"CreateContainer.Action\":\"Create New Container\",\"InstallExtensions.Action\":\"Install Available Extensions\",\"AppTitle\":\"\",\"AppType\":\"\",\"AppDescription\":\"\",\"UpgradeMessage\":\"Click Here To Get The Upgrade\",\"LanguageMessage\":\"Click Here To Get The Language Pack\",\"Portal.Header\":\"Website\",\"lblUpdate\":\"This application contains an Update Service which displays an icon when a new version of an Extension is available. The icon displayed will contain a visual indication if a currently installed Extension contains a potential security vulnerability. If a security vulnerability is identified, it is highly recommended that you upgrade to the newer version of the Extension. Clicking the icon will redirect you to a location where you will be able to acquire the Extension for immediate installation.\",\"CheckLanguage\":\"Use Update Service to check for updated Language Packs for Extensions\",\"Language\":\"Edit Language Files\",\"Extensions\":\"Extensions\",\"NoResults\":\"No Extensions were found\",\"Edit\":\"Edit this Extension\",\"InstalledOnHost.Tooltip\":\"Installed on Host\",\"InstalledOnPortal.Tooltip\":\"Installed on {0}\",\"Auth_System.Type\":\"Authentication Systems\",\"Container.Type\":\"Containers\",\"CoreLanguagePack.Type\":\"Core Language Packs\",\"DashboardControl.Type\":\"Dashboard Controls\",\"ExtensionLanguagePack.Type\":\"Extension Language Packs\",\"Library.Type\":\"Libraries\",\"Module.Type\":\"Modules\",\"MoreExtensions\":\"More Extensions\",\"PersonaBar.Type\":\"Persona Bar\",\"Provider.Type\":\"Providers\",\"Skin.Type\":\"Themes\",\"SkinObject.Type\":\"Skin Objects\",\"Widget.Type\":\"Widgets\",\"InstalledExtensions\":\"Installed Extensions\",\"AvailableExtensions\":\"Available Extensions\",\"ExpandAll\":\"Expand All\",\"AuthSystem.Type\":\"Authentication Systems\",\"Language.Type\":\"Language Packs\",\"Catalog\":\"Extension Feed\",\"CatalogModule\":\"Module\",\"CatalogSearchTitle\":\"Search for Extensions\",\"CatalogSkin\":\"Theme\",\"SearchLabel.Help\":\"Hit Enter to search or Esc to clear and cancel.\",\"SearchLabel\":\"Search:\",\"TypeLabel.Help\":\"Select the type of extension.\",\"TypeLabel\":\"Type:\",\"ClearSearch\":\"Clear Search\",\"NameAZ\":\"Name: A-Z\",\"NameZA\":\"Name: Z-A\",\"PriceHighLow\":\"Price: High - Low\",\"PriceLowHigh\":\"Price: Low - High\",\"Search\":\"Search\",\"By\":\"By\",\"TagCloud\":\"Tag Cloud\",\"NotSpecified\":\"Not Specified\",\"MoreInformation\":\"More Information\",\"DetailsLabel\":\"Details\",\"LicenseLabel\":\"License\",\"TagLabel\":\"Tag:\",\"VendorLabel\":\"Vendor:\",\"ExtensionsLabel\":\"Extensions\",\"NoneLabel\":\"None\",\"ErrorLabel\":\"Error...\",\"LoadingLabel\":\"Loading\",\"OrderLabel\":\"Order:\",\"InUse.Header\":\"In Use\",\"PurchasedExtensions\":\"Purchased Extensions\",\"installExtension\":\"Install\",\"Version\":\"Minimum Version Required:\",\"DescriptionLabel\":\"Product Description\",\"ExtensionDetail\":\"More detail\",\"License\":\"License:\",\"ListExtensions\":\"Learn more about how to offer your extensions here.\",\"JavaScript_Library.Type\":\"JavaScript Libraries\",\"Connector.Type\":\"Connectors\",\"CollapseAll\":\"Collapse All\",\"EditExtension_OwnerDetails.Label\":\"Owner Details\",\"EditExtension_PackageDescription.HelpText\":\"A description of the package.\",\"EditExtension_PackageEmailAddress.HelpText\":\"The email address of the package's author.\",\"EditExtension_PackageFriendlyName.HelpText\":\"The friendly name of the package.\",\"EditExtension_PackageIconFile.HelpText\":\"The icon filename for this package.\",\"EditExtension_PackageLicense.HelpText\":\"The license for this package.\",\"EditExtension_PackageName.HelpText\":\"The package name (e.g. CompanyName.Name).\",\"EditExtension_PackageOrganization.HelpText\":\"The organization responsible for the package.\",\"EditExtension_PackageOwner.HelpText\":\"The owner of the package.\",\"EditExtension_PackageReleaseNotes.HelpText\":\"The release notes for this version.\",\"EditExtension_PackageType.HelpText\":\"The type of package.\",\"EditExtension_PackageURL.HelpText\":\"The author's URL.\",\"EditExtension_PackageVersion.HelpText\":\"The version of the package.\",\"Showing.Label\":\"Showing:\",\"EditAuthSystem_Enabled.Label\":\"Enabled?\",\"EditAuthSystem_Enabled.Tooltip\":\"Check to enable this Authentication System.\",\"EditAuthSystem_LoginCtrlSource.Label\":\"Login Control Source\",\"EditAuthSystem_LoginCtrlSource.Tooltip\":\"The source of the Login Control for this Authentication System\",\"EditAuthSystem_LogoffCtrlSource.Label\":\"Logoff Control Source\",\"EditAuthSystem_LogoffCtrlSource.Tooltip\":\"The source of the Logoff Control for this Authentication System\",\"EditAuthSystem_SettingsCtrlSource.Label\":\"Settings Control Source\",\"EditAuthSystem_SettingsCtrlSource.Tooltip\":\"Check to enable this Authentication System.\",\"EditAuthSystem_Type.Label\":\"Authentication Type\",\"EditAuthSystem_Type.Tooltip\":\"The type of Authentication System (eg LiveID, OpenID etc)\",\"EditExtension_PackageDescription.Label\":\"Description\",\"EditExtension_PackageEmailAddress.Label\":\"Email Address\",\"EditExtension_PackageFriendlyName.Label\":\"Friendly Name\",\"EditExtension_PackageIconFile.Label\":\"Icon\",\"EditExtension_PackageName.Label\":\"Name\",\"EditExtension_PackageOrganization.Label\":\"Organization\",\"EditExtension_PackageOwner.Label\":\"Owner\",\"EditExtension_PackageURL.Label\":\"URL\",\"EditExtension_PackageVersion.Label\":\"Version\",\"InstallExtension_Cancel.Button\":\"Cancel\",\"InstallExtension_FileUploadDefault\":\"Drag and Drop a File or Click Icon To Browse\",\"InstallExtension_FileUploadDragOver\":\"Drag and Drop a File\",\"InstallExtension_Or\":\"or\",\"InstallExtension_PackageExists.Error\":\"The package is already installed.\",\"InstallExtension_PackageExists.HelpText\":\"If you have reached this page it is because the installer needs to gather some more information before proceeding.\",\"InstallExtension_PackageExists.Warning\":\"Warning: You have selected to repair the installation of this package.
This will cause the files in the package to overwrite all files that were previously installed.\",\"InstallExtension_RepairInstall.Button\":\"Repair Install\",\"InstallExtension_Upload.Button\":\"Next\",\"InstallExtension_UploadAFile\":\"Upload a File\",\"InstallExtension_UploadComplete\":\"Upload Complete\",\"InstallExtension_UploadFailed\":\"Zip File Upload Failed with \",\"InstallExtension_Uploading\":\"Uploading\",\"InstallExtension_UploadPackage.Header\":\"Upload Extension Package\",\"InstallExtension_UploadPackage.HelpText\":\"To begin installation, upload the package by dragging the file into the field below.\",\"NewModule_AddFolder.Button\":\"Add Folder\",\"NewModule_AddTestPage.HelpText\":\"Check this box to create a test page for your new module.\",\"NewModule_AddTestPage.Label\":\"Add a Test Page:\",\"NewModule_Cancel.Button\":\"Cancel\",\"NewModule_Create.Button\":\"Create\",\"NewModule_CreateFrom.HelpText\":\"You can create a new module in three ways. Select which method to use. New - creates a new module control, Control - creates a module from an existing control, Manifest - creates a module from an existing manifest.\",\"NewModule_CreateFrom.Label\":\"Create New Module From:\",\"NewModule_Description.HelpText\":\"You can provide a description for your module.\",\"NewModule_Description.Label\":\"Description\",\"NewModule_FileName.HelpText\":\"Enter a name for the new module control\",\"NewModule_FileName.Label\":\"File Name\",\"NewModule_Language.HelpText\":\"Choose the language to use.\",\"NewModule_Language.Label\":\"Language\",\"NewModule_ModuleFolder.HelpText\":\"This is the folder where your module files and folders are populated.\",\"NewModule_ModuleFolder.Label\":\"Module Folder\",\"NewModule_ModuleName.HelpText\":\"Enter a Friendly Name for your module.\",\"NewModule_ModuleName.Label\":\"Module Name\",\"NewModule_NoneSpecified\":\"\",\"NewModule_OwnerFolder.HelpText\":\"Module Developers are encouraged to use a \\\"unique\\\" folder inside DesktopModules for all the development, to avoid potential clashes with other developers. Select the folder you would like to use for your Module Development. Note: Folders with user controls (.ascx files) and the core admin folder are excluded from this list.\",\"NewModule_OwnerFolder.Label\":\"Owner Folder\",\"AddModuleControl_Cancel.Button\":\"Cancel\",\"AddModuleControl_Definition.HelpText\":\"This is the Name of the Module Definition\",\"AddModuleControl_Definition.Label\":\"Definition\",\"AddModuleControl_HelpURL.HelpText\":\"You can provide a Help URL for this control. This will appear on the Actions menu.\",\"AddModuleControl_HelpURL.Label\":\"Help URL\",\"AddModuleControl_Icon.HelpText\":\"Choose an Icon for this control. This will displayed in the Module Header if supported by the theme.\",\"AddModuleControl_Icon.Label\":\"Icon\",\"AddModuleControl_Key.HelpText\":\"Enter a unique name to identify this control within the Module\",\"AddModuleControl_Key.Label\":\"Key\",\"AddModuleControl_Module.HelpText\":\"This is the Friendly Name of the Module.\",\"AddModuleControl_Module.Label\":\"Module\",\"AddModuleControl_Source.HelpText\":\"Select the source file or enter the typename for this control.\",\"AddModuleControl_Source.Label\":\"Source File\",\"AddModuleControl_SourceFolder.HelpText\":\"Select the source folder for the control.\",\"AddModuleControl_SourceFolder.Label\":\"Source Folder\",\"AddModuleControl_SupportsPartialRendering.HelpText\":\"This flag indicates whether the module control supports AJAX partial rendering.\",\"AddModuleControl_SupportsPartialRendering.Label\":\"Supports Partial Rendering?\",\"AddModuleControl_SupportsPopups.HelpText\":\"This flag indicates whether the module control supports modal popups.\",\"AddModuleControl_SupportsPopups.Label\":\"Supports Popups?\",\"AddModuleControl_Title.HelpText\":\"Enter a title for this control. This will be displayed in the Module Header if supported in the theme.\",\"AddModuleControl_Title.Label\":\"Title\",\"AddModuleControl_Type.HelpText\":\"Choose the type of the control from the list.\",\"AddModuleControl_Type.Label\":\"Type\",\"AddModuleControl_Update.Button\":\"Update\",\"AddModuleControl_ViewOrder.HelpText\":\"Enter the view order for the control in the list of controls for this definition.\",\"AddModuleControl_ViewOrder.Label\":\"View Order\",\"EditModule_Assigned.Label\":\"Assigned\",\"EditModule_AssignedPremiumModules.Label\":\"Assigned Premium Modules\",\"EditModule_BusinessControllerClass.HelpText\":\"The fully qualified namespace of the class that implements the Modules Features (IPortable, ISearchable etc)\",\"EditModule_BusinessControllerClass.Label\":\"Business Controller Class\",\"EditModule_Dependencies.HelpText\":\"You can list any dependencies that the module has here.\",\"EditModule_Dependencies.Label\":\"Dependencies\",\"EditModule_FolderName.HelpText\":\"Specify the folder name for this module\",\"EditModule_FolderName.Label\":\"Folder Name\",\"EditModule_IsPortable.HelpText\":\"Identifies if the module supports the IPortable interface allowing it to Export and Import content.\",\"EditModule_IsPortable.Label\":\"Is Portable?\",\"EditModule_IsPremiumModule.HelpText\":\"All Modules can be assigned/unassigned from a website. However, on website Creation Premium Modules are not auto-assigned to a new website.\",\"EditModule_IsPremiumModule.Label\":\"Is Premium Module?\",\"EditModule_IsSearchable.HelpText\":\"Identifies if the module supports the ISearchable or ModuleSearchBase interface allowing it to have its content indexed.\",\"EditModule_IsSearchable.Label\":\"Is Searchable?\",\"EditModule_IsUpgradable.HelpText\":\"Identifies if the module supports the IUpgradable interface allowing it to run custom code when upgraded.\",\"EditModule_IsUpgradable.Label\":\"Is Upgradable?\",\"EditModule_ModuleCategory.HelpText\":\"Select the Module Category for this module\",\"EditModule_ModuleCategory.Label\":\"Module Category\",\"EditModule_ModuleDefinitions.Header\":\"Module Definitions\",\"EditModule_ModuleName.HelpText\":\"The name of the Module\",\"EditModule_ModuleName.Label\":\"Module Name\",\"EditModule_ModuleSharing.HelpText\":\"Identifies whether the module supports sharing itself across multiple sites.\",\"EditModule_ModuleSharing.Label\":\"Module Sharing\",\"EditModule_Permissions.HelpText\":\"You can list any Code Access Security Permissions your module requires here.\",\"EditModule_Permissions.Label\":\"Permissions\",\"EditModule_PremiumModuleAssignment.Header\":\"Premium Module Assignment\",\"EditModule_Unassigned.Label\":\"Unassigned\",\"ModuleDefinitions_AddControl.Button\":\"Add Control\",\"ModuleDefinitions_AddDefinition.Button\":\"Add Definition\",\"ModuleDefinitions_DefaultCacheTime.HelpText\":\"This is the default Cache Time to be used for this Module Definition. A default cache time of \\\"-1\\\" indicates that the module does not support output caching.\",\"ModuleDefinitions_DefaultCacheTime.Label\":\"DefaultCacheTime\",\"ModuleDefinitions_DefinitionName.HelpText\":\"An unchanging name for the Module Definition\",\"ModuleDefinitions_DefinitionName.Label\":\"Definition Name\",\"ModuleDefinitions_FriendlyName.HelpText\":\"Enter a friendly name for the Module Definition.\",\"ModuleDefinitions_FriendlyName.Label\":\"Friendly Name\",\"ModuleDefinitions_ModuleControls.Header\":\"Module Controls\",\"ModuleDefinitions_Source.Label\":\"Source\",\"ModuleDefinitions_Title.Label\":\"Title\",\"NewModule_Resource.HelpText\":\"Select the resource to use to create your module.\",\"NewModule_Resource.Label\":\"Resource\",\"CreatePackage_Header.Header\":\"Create Package\",\"CreatePackage_PackageManifest.Header\":\"Package Manifest\",\"CreatePackage_PackageManifest.HelpText\":\"This Wizard will create a manifest for your extension. If you have already created a manifest (either by running this wizard or by manually creating a manifest file) you can select to use that manifest by checking \\\"Use Existing Manifest\\\" box and choosing the manifest that the system has found for this extension from the drop-down list of manifests.\",\"CreatePackage_UseExistingManifest.Label\":\"Using Existing Manifest:\",\"EditExtension_CreatePackage.Button\":\"Create Package\",\"EditModule_Add.Button\":\"Add\",\"ModuleDefinitions_Cancel.Button\":\"Cancel\",\"ModuleDefinitions_Save.Button\":\"Save\",\"CreatePackage_ArchiveFileName.Label\":\"Archive File Name\",\"CreatePackage_ChooseAssemblies.HelpText\":\"At this step you can add the assemblies to include in your package. If there is a project file in the Package folder, the Wizard has attempted to determine the assemblies to include, but you can add or delete assemblies from the list.\",\"CreatePackage_ChooseAssemblies.Label\":\"Choose Assemblies to Include\",\"CreatePackage_ChooseFiles.HelpText\":\"At this step you can choose the files to include in your package. The Wizard has attempted to determine the files to include, but you can add or delete files from the list. In addition, you can optionally choose to include the source files by checking the \\\"Include Source\\\" box.\",\"CreatePackage_ChooseFiles.Label\":\"Choose Files to Include\",\"CreatePackage_CreateManifest.HelpText\":\"Based on your selections the Wizard has created the manifest for the package. The manifest is displayed in the text box below. You can edit the manifest, before creating the package.\",\"CreatePackage_CreateManifest.Label\":\"Create Manifest\",\"CreatePackage_CreateManifestFile.Label\":\"Create Manifest File:\",\"CreatePackage_CreatePackage.Label\":\"Create Package\",\"CreatePackage_FinalStep.HelpText\":\"The final step is to create the package. To create a copy of the Manifest file check the \\\"Create Manifest File\\\" checkbox - the file will be created in the Package's folder. Regardless of the setting you use here, the manifest will be saved in the database and it will be added to the package.\",\"CreatePackage_FinalStep.HelpTextTwo\":\"Check the \\\"Create Package\\\" checkbox to create a package. The package will be created in the relevant Install folder (eg Install/Modules for modules, Install/Themes for Themes, etc.).\",\"CreatePackage_Folder.Label\":\"Folder:\",\"CreatePackage_Logs.HelpText\":\"The results of the package creation are shown below.\",\"CreatePackage_Logs.Label\":\"Create Package Results\",\"CreatePackage_ManifestFile.Label\":\"Manifest File:\",\"CreatePackage_ManifestFileName.Label\":\"Manifest File Name\",\"CreatePackage_RefreshFileList.Button\":\"Refresh File List\",\"CreatePackage_ReviewManifest.Label\":\"Review Manifest:\",\"EditExtension_ExtensionSettings.TabHeader\":\"Extension Settings\",\"EditExtension_License.TabHeader\":\"License\",\"EditExtension_PackageInformation.TabHeader\":\"Package Information\",\"EditExtension_ReleaseNotes.TabHeader\":\"Release Notes\",\"EditExtension_SiteSettings.TabHeader\":\"Site Settings\",\"EditContainer_ThemePackageName.HelpText\":\"Enter a name for the Theme Package\",\"EditContainer_ThemePackageName.Label\":\"Theme Package Name\",\"EditExtensionLanguagePack_Language.HelpText\":\"Choose the Language for this Language Pack\",\"EditExtensionLanguagePack_Language.Label\":\"Language\",\"EditExtensionLanguagePack_Package.HelpText\":\"Chose the Package this Language Pack is for.\",\"EditExtensionLanguagePack_Package.Label\":\"Package\",\"EditJavascriptLibrary_CustomCDN.HelpText\":\"The URL to a custom CDN location for this library which will be used instead of the default CDN\",\"EditJavascriptLibrary_CustomCDN.Label\":\"Custom CDN\",\"EditJavascriptLibrary_DefaultCDN.HelpText\":\"The URL to the default CDN to use for the library. This can be overridden by providing a custom URL.\",\"EditJavascriptLibrary_DefaultCDN.Label\":\"Default CDN\",\"EditJavascriptLibrary_DependsOn.HelpText\":\"Displays a list of all the packages that this package depends on.\",\"EditJavascriptLibrary_DependsOn.Label\":\"Depends On\",\"EditJavascriptLibrary_FileName.HelpText\":\"The filename of the JavaScript file.\",\"EditJavascriptLibrary_FileName.Label\":\"File Name\",\"EditJavascriptLibrary_LibraryName.HelpText\":\"The name of the JavaScript Library (e.g. \\\"jQuery\\\")\",\"EditJavascriptLibrary_LibraryName.Label\":\"Library Name\",\"EditJavascriptLibrary_LibraryVersion.HelpText\":\"The version of the JavaScript Library.\",\"EditJavascriptLibrary_LibraryVersion.Label\":\"Library Version\",\"EditJavascriptLibrary_ObjectName.HelpText\":\"The name of the JavaScript object to use to access the libraries methods.\",\"EditJavascriptLibrary_ObjectName.Label\":\"Object Name\",\"EditJavascriptLibrary_PreferredLocation.HelpText\":\"The preferred location to render the script. There are three possibilities: in the page head, at the top of the page body, or at the bottom of the page body.\",\"EditJavascriptLibrary_PreferredLocation.Label\":\"Preferred Location\",\"EditJavascriptLibrary_UsedBy.HelpText\":\"Displays a list of all the packages that use this package.\",\"EditJavascriptLibrary_UsedBy.Label\":\"Used By\",\"EditSkinObject_ControlKey.HelpText\":\"Enter a key for the Skin Object. The key must be unique.\",\"EditSkinObject_ControlKey.Label\":\"Control Key\",\"EditSkinObject_ControlSrc.HelpText\":\"Enter the Source for this Control. If the control is a User Control, enter the source relative to the website root.\",\"EditSkinObject_ControlSrc.Label\":\"Control SRC\",\"EditSkinObject_SupportsPartialRender.HelpText\":\"Check this box to indicate that this control supports AJAX Partial Rendering.\",\"EditSkinObject_SupportsPartialRender.Label\":\"Supports Partial Rendering\",\"LoadMore.Button\":\"Load More\",\"EditJavascriptLibrary_TableName.Header\":\"Name\",\"EditJavascriptLibrary_TableVersion.Header\":\"Version\",\"AuthSystemSiteSettings_AppEnabled.HelpText\":\"Check this box to enable this authentication provider for this site.\",\"AuthSystemSiteSettings_AppEnabled.Label\":\"Enabled\",\"AuthSystemSiteSettings_AppId.HelpText\":\"Enter the value of the APP ID/API Key/Consumer Key you configured for this authentication provider.\",\"AuthSystemSiteSettings_AppId.Label\":\"App ID\",\"AuthSystemSiteSettings_AppSecret.HelpText\":\"Enter the value of the APP Secret/Consumer Secret you configured for this authentication provider.\",\"AuthSystemSiteSettings_AppSecret.Label\":\"App Secret\",\"CreateExtension_Cancel.Button\":\"Cancel\",\"CreateExtension_Save.Button\":\"Create\",\"CreateNewModule.HelpText\":\"You can create a new module in three ways. Select which method to use. New - creates a new module control, Control - creates a module from an existing control, Manifest - creates a module from an existing manifest.\",\"CreateNewModuleFrom.Label\":\"Create New Module From:\",\"CreateNewModule_FolderName.Label\":\"Folder Name\",\"CreateNewModule_NewFolder.Label\":\"New Folder\",\"CreateNewModule_NotSpecified.Label\":\"\",\"Done.Button\":\"Done\",\"EditModule_SaveAndClose.Button\":\"Save & Close\",\"InstallExtension_AcceptLicense.Label\":\"Accept License?\",\"InstallExtension_License.Header\":\"License\",\"InstallExtension_License.HelpText\":\"Before proceeding you must accept the terms of the license for this extension. \\\\n Please review the license and check the Accept License check box.\",\"InstallExtension_Logs.Header\":\"Package Installation Report\",\"InstallExtension_Logs.HelpText\":\"Installation is complete. See details below.\",\"InstallExtension_ReleaseNotes.Header\":\"Release Notes\",\"InstallExtension_ReleaseNotes.HelpText\":\"Review the Release Notes for this package.\",\"Next.Button\":\"Next\",\"Cancel.Button\":\"Cancel\",\"EditExtensions_TabHasError\":\"This tab has an error. Package Information, Extension Settings, License and Release Notes cannot be saved.\",\"EditExtension_PackageType.Label\":\"Extension Type\",\"InstallExtension_PackageInfo.Header\":\"Package Information\",\"InstallExtension_PackageInfo.HelpText\":\"The following information was found in the package manifest.\",\"Save.Button\":\"Save\",\"UnsavedChanges.Cancel\":\"No\",\"UnsavedChanges.Confirm\":\"Yes\",\"UnsavedChanges.HelpText\":\"You have unsaved changes. Are you sure you want to proceed?\",\"CreatePackage_ArchiveFileName.HelpText\":\"Enter the file name to use for the archive (zip).\",\"CreatePackage_ManifestFileName.HelpText\":\"Enter the file name to use for the manifest.\",\"DeleteExtension.Cancel\":\"No\",\"DeleteExtension.Confirm\":\"Yes\",\"DeleteExtension.Warning\":\"Are you sure you want to delete {0}?\",\"Download.Button\":\"Download\",\"EditExtension_Notify.Success\":\"Extension updated sucessfully.\",\"EditModule_ModuleSharingSupported.Label\":\"Supported\",\"EditModule_ModuleSharingUnknown.Label\":\"Unknown\",\"EditModule_ModuleSharingUnsupported.Label\":\"Unsupported\",\"Install.Button\":\"Install\",\"Previous.Button\":\"Previous\",\"Errors\":\"errors\",\"TryAgain\":\"[Try Again]\",\"ViewErrorLog\":\"[View Error Log]\",\"Delete.Button\":\"Delete\",\"DeleteExtension.Action\":\"Delete Extensions - {0}\",\"DeleteFiles.HelpText\":\"Check this box to delete the files associated with this extension.\",\"DeleteFiles.Label\":\"Delete Files?\",\"Extension.Header\":\"Extension\",\"Container\":\"Container\",\"InstallError\":\"Error loading files from temporary folder - see below.\",\"InvalidExt\":\"Invalid File Extension - {0}\",\"InvalidFiles\":\"The package contains files with invalid File Extensions ({0})\",\"ZipCriticalError\":\"Critical error reading zip package.\",\"Deploy.Button\":\"Deploy\",\"InstallerMoreInfo\":\"If you have reached this page it is because the installer needs some more information before proceeding.\",\"InstallExtension_UploadFailedUnknown\":\"Zip File Upload Failed\",\"InstallExtension_UploadFailedUnknownLogs\":\"An unknown error has occured. Please check your installation zip file and try again.
\\r\\nCommon issues with bad installation files:\\r\\n
    \\r\\n
  • Zip file size is too large, check your IIS settings for max upload file size.
  • \\r\\n
  • Missing resources in the zip file.
  • \\r\\n
  • Invalid files in the package.
  • \\r\\n
  • File extension is not .zip.
  • \\r\\n
  • Check that you are logged in.
  • \\r\\n
\",\"InvalidDNNManifest\":\"This package does not appear to be a valid DNN Extension as it does not have a manifest. Old (legacy) Themes and Containers do not contain manifests. If this package is a legacy Theme or Container Package please check the appropriate radio button below, and click Next.\",\"InstallationError\":\"There was an error during installation. See log files below for more information.\",\"BackToEditExtension\":\"Back To Edit {0} Extension\",\"BackToExtensions\":\"Back To Extensions\",\"ModuleUsageTitle\":\"Module Usage for {0}\",\"PagesFromSite\":\"Showing Pages from Site:\",\"ModuleUsageDetail\":\"This module is used on {0} {1} page(s):\",\"NoModuleUsageDetail\":\"This module does not exist on any {0} pages.\",\"Loading\":\"One sec...We are fetching your extensions\",\"Loading.Tooltip\":\"Your extensions will be here in a just a moment\"},\"EvoqLicensing\":{\"nav_Licensing\":\"About\",\"NoLicense.Header\":\"You have no EVOQ licenses ... yet\",\"NoLicense\":\"Upgrade to EVOQ below to gain access to professional features on your sites.\",\"LicenseType.Header\":\"LICENSE TYPE\",\"InvoiceNumber.Header\":\"INVOICE NUMBER\",\"WebServer.Header\":\"WEB SERVER\",\"Activated.Header\":\"ACTIVATED\",\"Expires.Header\":\"EXPIRES\",\"CheckOutEvoq.Header\":\"CHECK OUT EVOQ\",\"CheckOutEvoq\":\"Evoq provides a comprehensive set of features your entire team will use and love. Organizations across the globe rely on Evoq to deliver powerful web experiences.\",\"UpgradeToEvoq.Header\":\"UPGRADE\",\"UpgradeToEvoq\":\"Ready to take your web presence to the next level? Start a free trial or schedule a custom demo for your team.\",\"DocumentCenter.Header\":\"DOCUMENTATION CENTER\",\"DocumentCenter\":\"No matter your questions, DNN's new \\\"Doc Center\\\" is the go-to for answers, tutorials, and product help.\",\"LicenseType.Development\":\"Development\",\"LicenseType.Production\":\"Production\",\"LicenseType.Failover\":\"Failover\",\"LicenseType.Staging\":\"Staging\",\"LicenseType.Test\":\"Test\",\"Error.Unknown.Activation\":\"Unable to process request, please try again later or use manual activation.\",\"Error.LicenseAlreadyExists\":\"License Activation failed. The host server {0} already has a {1} license.\",\"Error.ContactServer.activate\":\"Unable to activate license. Connection to license server failed. Please try again later or use manual activation. If you continue to have difficulties, please contact Technical Support.\",\"Error.ContactServer.canrenew\":\"Connection to license server failed. You will not be able to automatically activate or renew licenses. You can use manual activation to activate a license.

\\r\\nFor license renewal contact customercare@dnnsoftware.com.\",\"Error.ContactServer.deactivate\":\"Your license was deleted.

\\r\\nUnable to add activation back to your invoice as Connection to license server failed. Please contact Technical Support for license activation.\",\"Error.ContactServer.renew\":\"Unable to Renew License. Connection to license server failed. Please try again later or contact customercare@dnnsoftware.com\",\"Error.ACT1\":\"License Activation failed. The license details provided do not match a valid license.

Verify your license details on your licenses page on dnnsoftware.com and try again. If you continue to have difficulties, please contact Technical Support.\",\"Error.ACT2\":\"License activation failed. Production activation for {0} is in use.\",\"Error.ACT3\":\"You have exceeded the limit of activations from this client address\",\"Error.ACT4\":\"License activation failed. Production activation for {0} is in use.\",\"Error.ACT6\":\"License activation failed. Your service period for this license expired on {0:d}. Please contact customercare@dnnsoftware.com.\",\"Error.DEA1\":\"Delete License failed. The license was not found.\",\"WebLicenseList.url\":\"http://www.dnnsoftware.com/Support/Success-Network/License-Management\",\"Error.Unknown\":\"Unable to process request, please try again later.\",\"Error.ExpiredLicense\":\"License activation failed. Your license expired on {0:d}. Check your licenses on your licenses page on dnnsoftware.com. Log in using the account you received when you first bought the product.\",\"Success.DevLicenseActivated\":\"Development License has been activated successfully.\",\"Success.FailoverLicenseActivated\":\"Failover License has been activated successfully\",\"Success.LicenseActivated\":\"Production License has been activated successfully\",\"Success.LicenseDeactivated\":\"Your license has been deleted successfully.\",\"Success.LicenseDeactivatedContactServerErr\":\"Your license was deleted.

Unable to add activation back to your invoice as Connection to license server failed. If you need to activate as a production license, please contact Technical Support.\",\"Success.LicenseDeactivatedNoActivationIncrease\":\"Your license was deleted.

Unable to add activation back to the invoice. If you need to activate as a production license, please contact Technical Support.\",\"Success.LicenseRenewed\":\"Your license has been renewed successfully.\",\"Success.StagingLicenseActivated\":\"Staging License has been activated successfully\",\"Success.TestLicenseActivated\":\"Test License has been activated successfully\",\"Success.TrialActivation\":\"Your extended trial license has been successfully installed.\",\"Success.TrialExtensionRequest\":\"Your trial license extension request has been submitted. You should receive an email within 1 business day, with instructions for extending your license. If you have any questions about trial license extensions, please call DNN Corp. Sales Dept. at 650-288-3150.\",\"Warning.DeleteLicense\":\"Are you sure you want to delete this license?\",\"cmdManualActivation\":\"Manual Activation\",\"cmdAutoActivation\":\"Automatic Activation\",\"plAccount\":\"Account Email\",\"plAccount.Help\":\"The email address associated with your licenses. This can be found in the email you received when you purchased the license.\",\"plInvoice\":\"Invoice Number\",\"plInvoice.Help\":\"The invoice number given to you when you purchased your license.\",\"cmdAddLicense\":\"Add License\",\"plSelectLicenseType.Help\":\"Select the type of license you are activating. If this is a development environment, select Development.\",\"plSelectLicenseType\":\"License Type\",\"plMachine.Help\":\"Enter the name of the machine that is running DNN. This value is defaulted to the name of the current web server and may need to be changed when operating in a web farm.\",\"plMachine\":\"Web Server\",\"LicenseManagement.Header\":\"LICENSE MANAGEMENT\",\"LicenseManagement\":\"Access your available licenses through your DNN Software account.\",\"ContactSupport.Header\":\"CONTACT SUPPORT\",\"ContactSupport\":\"Your success is our highest priority. Access our experienced technical support team for help with development, deployment and ongoing optimization.\",\"Step1.Header\":\"STEP ONE\",\"Step2.Header\":\"STEP TWO\",\"Step3.Header\":\"STEP THREE\",\"Step4.Header\":\"STEP FOUR\",\"Step1\":\"Copy the server ID below to the clipboard\",\"Step2\":\"Click the link below to open a new browser window, login with your account information and follow the onscreen instructions to retrieve your activation key.\",\"Step3\":\"Paste the activation key to the textbox below.\",\"Step4\":\"Click the button below to parse the activation key and store the result.\",\"plServerId\":\"Server ID\",\"RequestLicx\":\"Request an activation key on dnnsoftware.com\",\"Account.Required\":\"Please enter the email address for your license. This can be found in the email you received when you purchased the license.\",\"Invoice.Required\":\"Please enter your invoice number. You can find this number on the email received with your license purchase.\",\"plActivationKey\":\"Activation Key\",\"valActivationKey\":\"An activation key is required!\",\"cmdUpload\":\"Submit Activation Key\",\"WebService.url\":\"http://www.dnnsoftware.com/desktopmodules/bring2mind/licenses/licensequery.asmx\",\"WebLicenseRequest.url\":\"http://www.dnnsoftware.com/Support/Success-Network/License-Management/ctl/RequestLicense/mid/1189\",\"BackToLicensing\":\"< BACK TO LICENSING\",\"email.extension.body\":\"

The following customer has requested an extension of their Trial License:
\\r\\n
\\r\\nProduct: {6}
\\r\\nCustomer Name: {0} {1}
\\r\\nEmail: {2}
\\r\\nCompany: {3}
\\r\\nHost Identifier: {4}
\\r\\nHost Server: {5}
\\r\\nInstallation Date: {7}
\\r\\nNumber of Days in Trial: {8}
\\r\\n

\\r\\n
This email is sent from the Customer Evoq installation. The customer should be added as an extended trial via the dnnsoftware.com Licensing system. The customer does not receive a copy of this email.
\",\"email.extension.subj\":\"{0} Trial Extension Request\",\"email.extension.to\":\"customersuccess@dnnsoftware.com\",\"Error.TrialExtensionRequest\":\"

Unable to send your request for a trial license extension. Your email server (SMTP) may not be setup or there was an error trying to send the email. Please call DNN Corp. Sales Dept. at 650-288-3150 for a trial license extension.

You may need below information when contact DNN Corp. Sales Dept:

{0}

\",\"Error.TrialActivation.AlreadyInstalled\":\"Your extended trial license has already been installed. If you continue to experience difficulties please contact customersuccess@dnnsoftware.com for assistance.\",\"Error.TrialActivation\":\"Your extended trial license is not valid. Please ensure that you have pasted the complete value into the provided field. If you continue to experience difficulties please contact customersuccess@dnnsoftware.com for assistance.\",\"Renew\":\"[ renew ]\",\"Error.DuplicateLicense\":\"The license already exists in this instance. Please check and try activate other license if needed.\",\"Error.InvalidArgument\":\"The Account Email and Invoice Number can not be empty.\"},\"Licensing\":{\"nav_Licensing\":\"About\",\"NoLicense.Header\":\"You have no EVOQ licenses ... yet\",\"NoLicense\":\"Upgrade to EVOQ below to gain access to professional features on your sites.\",\"LicenseType.Header\":\"LICENSE TYPE\",\"InvoiceNumber.Header\":\"INVOICE NUMBER\",\"WebServer.Header\":\"WEB SERVER\",\"Activated.Header\":\"ACTIVATED\",\"Expires.Header\":\"EXPIRES\",\"CheckOutEvoq.Header\":\"CHECK OUT EVOQ\",\"CheckOutEvoq\":\"Evoq provides a comprehensive set of features your entire team will use and love. Organizations across the globe rely on Evoq to deliver powerful web experiences.\",\"UpgradeToEvoq.Header\":\"UPGRADE\",\"UpgradeToEvoq\":\"Ready to take your web presence to the next level? Start a free trial or schedule a custom demo for your team.\",\"DocumentCenter.Header\":\"DOCUMENTATION CENTER\",\"DocumentCenter\":\"No matter your questions, DNN's new \\\"Doc Center\\\" is the go-to for answers, tutorials, and product help.\",\"LicenseType.Development\":\"Development\",\"LicenseType.Production\":\"Production\",\"LicenseType.Failover\":\"Failover\",\"LicenseType.Staging\":\"Staging\",\"LicenseType.Test\":\"Test\",\"Error.Unknown.Activation\":\"Unable to process request, please try again later or use manual activation.\",\"Error.LicenseAlreadyExists\":\"License Activation failed. The host server {0} already has a {1} license.\",\"Error.ContactServer.activate\":\"Unable to activate license. Connection to license server failed. Please try again later or use manual activation. If you continue to have difficulties, please contact Technical Support.\",\"Error.ContactServer.canrenew\":\"Connection to license server failed. You will not be able to automatically activate or renew licenses. You can use manual activation to activate a license.

\\r\\nFor license renewal contact customercare@dnnsoftware.com.\",\"Error.ContactServer.deactivate\":\"Your license was deleted.

\\r\\nUnable to add activation back to your invoice as Connection to license server failed. Please contact Technical Support for license activation.\",\"Error.ContactServer.renew\":\"Unable to Renew License. Connection to license server failed. Please try again later or contact customercare@dnnsoftware.com\",\"Error.ACT1\":\"License Activation failed. The license details provided do not match a valid license.

Verify your license details on your licenses page on dnnsoftware.com and try again. If you continue to have difficulties, please contact Technical Support.\",\"Error.ACT2\":\"License activation failed. Production activation for {0} is in use.\",\"Error.ACT3\":\"You have exceeded the limit of activations from this client address\",\"Error.ACT4\":\"License activation failed. Production activation for {0} is in use.\",\"Error.ACT6\":\"License activation failed. Your service period for this license expired on {0:d}. Please contact customercare@dnnsoftware.com.\",\"Error.DEA1\":\"Delete License failed. The license was not found.\",\"WebLicenseList.url\":\"http://www.dnnsoftware.com/Support/Success-Network/License-Management\",\"Error.Unknown\":\"Unable to process request, please try again later.\",\"Error.ExpiredLicense\":\"License activation failed. Your license expired on {0:d}. Check your licenses on your licenses page on dnnsoftware.com. Log in using the account you received when you first bought the product.\",\"Success.DevLicenseActivated\":\"Development License has been activated successfully.\",\"Success.FailoverLicenseActivated\":\"Failover License has been activated successfully\",\"Success.LicenseActivated\":\"Production License has been activated successfully\",\"Success.LicenseDeactivated\":\"Your license has been deleted successfully.\",\"Success.LicenseDeactivatedContactServerErr\":\"Your license was deleted.

Unable to add activation back to your invoice as Connection to license server failed. If you need to activate as a production license, please contact Technical Support.\",\"Success.LicenseDeactivatedNoActivationIncrease\":\"Your license was deleted.

Unable to add activation back to the invoice. If you need to activate as a production license, please contact Technical Support.\",\"Success.LicenseRenewed\":\"Your license has been renewed successfully.\",\"Success.StagingLicenseActivated\":\"Staging License has been activated successfully\",\"Success.TestLicenseActivated\":\"Test License has been activated successfully\",\"Success.TrialActivation\":\"Your extended trial license has been successfully installed.\",\"Success.TrialExtensionRequest\":\"Your trial license extension request has been submitted. You should receive an email within 1 business day, with instructions for extending your license. If you have any questions about trial license extensions, please call DNN Corp. Sales Dept. at 650-288-3150.\"},\"EvoqPages\":{\"errorMessageLoadingWorkflows\":\"Error loading Page Wokflows\",\"LinkTrackingTitle\":\"Link Tracking\",\"Published\":\"Published:\",\"Unpublished\":\"Unpublished\",\"WorkflowApplyOnSubPagesCheckBox\":\"Apply setting to all subpages\",\"WorkflowRunning\":\"This page has a running workflow. The workflow must be completed to be changed.\",\"WorkflowTitle\":\"Workflow\",\"WorkflowNoteApplyOnSubPages\":\"Note: This setting cannot be applied because there are one or more subpages pending to be published.\",\"EvoqPageTemplate\":\"Evoq Page Template\",\"ImportFromXml\":\"Import From Xml\",\"TemplateMode\":\"Template Mode\",\"XmlFile\":\"Xml File\",\"ExportAsXML\":\"Export as XML\",\"NoTemplates\":\"There are no templates to be shown.\",\"SetPageTabTemplate\":\"Set as template\",\"Template.Help\":\"Select the template to be applied.\",\"Template\":\"Template\",\"SaveAsTemplate\":\"Save Page Template\",\"BackToPageSettings\":\"Back to page settings\",\"Description\":\"Description\",\"TemplateName\":\"Template Name\",\"TemplateNameTooltip\":\"Enter a name for the page template.\",\"TemplateDescriptionTooltip\":\"Enter a description of this template.\",\"Error_templates_TabExists\":\"The Template Name you chose is already being used for another template.\",\"DetailViewTooltip\":\"Detail View\",\"SmallViewTooltip\":\"Small View\",\"On\":\"On\",\"Off\":\"Off\",\"FilterByPublishDateText\":\"Filter by Published Date Range\",\"FilterbyWorkflowText\":\"Filter by Workflow\",\"PublishedDateRange\":\"Published Date Range\"},\"Pages\":{\"ErrorPages\":\"You must select at least one page to be exported.\",\"nav_Pages\":\"Pages\",\"SiteDetails_Pages\":\"Pages\",\"Description.Label\":\"Description\",\"HomeDirectory.Label\":\"Home Directory\",\"Title.Label\":\"Title\",\"Delete\":\"Delete\",\"Edit\":\"Edit\",\"Settings\":\"Settings\",\"View\":\"View\",\"Hidden\":\"Page is hidden in menu\",\"Cancel\":\"Cancel\",\"DragPageTooltip\":\"Drag Page into Location\",\"DragInvalid\":\"You can't drag a page as a child of itself.\",\"DeletePageConfirm\":\"

Please confirm you wish to delete this page.

\",\"Pending\":\"Please drag the page into the desired location.\",\"Search\":\"Search\",\"page_name_tooltip\":\"Page Name\",\"page_title_tooltip\":\"Page Title\",\"AnErrorOccurred\":\"An error has occurred.\",\"DeleteModuleConfirm\":\"Are you sure you want to delete the module \\\"[MODULETITLE]\\\" from this page?\",\"SitemapPriority\":\"Sitemap Priority\",\"SitemapPriority_tooltip\":\"Enter the desired priority (between 0 and 1.0). This helps determine how this page is ranked in Google with respect to other pages on your site (0.5 is the default).\",\"PageHeaderTags\":\"Page Header Tags\",\"PageHeaderTags_tooltip\":\"Enter any tags (i.e. META tags) that should be rendered in the \\\"HEAD\\\" tag of the HTML for this page.\",\"AddUrl\":\"Add URL\",\"UrlsForThisPage\":\"URLs for this page\",\"Url\":\"URL\",\"UrlType\":\"URL Type\",\"GeneratedBy\":\"Generated By\",\"None\":\"None\",\"Include\":\"Include\",\"Exclude\":\"Exclude\",\"Security\":\"Security\",\"SecureConnection\":\"Secure Connection\",\"SecureConnection_tooltip\":\"Specify whether or not this page should be forced to use a secure connection (SSL). This option will only be enabled if the administrator has Enabled SSL in the site settings.\",\"AllowIndexing\":\"Allow Indexing\",\"AllowIndexing_tooltip\":\"This setting controls whether a page should be indexed by search crawlers. It uses the INDEX/NOINDEX values for ROBOTS meta tag.\",\"CacheSettings\":\"Cache Settings\",\"OutputCacheProvider\":\"Output Cache Provider\",\"OutputCacheProvider_tooltip\":\"Select the provider to use for this page.\",\"CacheDuration\":\"Cache Duration (seconds)\",\"CacheDuration_tooltip\":\"Enter the duration (in seconds) to cache the page for. This must be an integer.\",\"IncludeExcludeParams\":\"Include / Exclude Params by default\",\"IncludeExcludeParams_tooltip\":\"If set to INCLUDE, all querystring parameter value variations will result in a new item in the output cache. If set to EXCLUDE, querystring parameters will not be used to vary the cached page.\",\"IncludeParamsInCacheValidation\":\"Include Params In Cache Validation\",\"IncludeParamsInCacheValidation_tooltip\":\"A list of querystring parameter names (separated by commas) to be INCLUDED in the variations of cached pages. This setting is only valid when the default above is set to EXCLUDE querystring parameters from cached page variations.\",\"ExcludeParamsInCacheValidation\":\"Exclude Params In Cache Validation\",\"ExcludeParamsInCacheValidation_tooltip\":\"A list of querystring parameter names (separated by commas) to be EXCLUDED from the variations of cached pages. This setting is only valid when the default above is set to INCLUDE querystring parameters from cached page variations.\",\"VaryByLimit\":\"Vary By Limit\",\"VaryByLimit_tooltip\":\"Enter the maximum number of variations to cache for this page. This must be an integer. (Note, this feature prevents potential denial of service attacks.)\",\"ModulesOnThisPage\":\"Modules on this page\",\"NoModules\":\"This page does not have any modules.\",\"Advanced\":\"Advanced\",\"Appearance\":\"Appearance\",\"CopyAppearanceToDescendantPages\":\"Copy Appearance to Descendant Pages\",\"CopyPermissionsToDescendantPages\":\"Copy Permissions to Descendant Pages\",\"Layout\":\"Layout\",\"PageContainer\":\"Page Container\",\"PageStyleSheet\":\"Page Stylesheet\",\"PageTheme\":\"Page Theme\",\"PageThemeTooltip\":\"The selected theme will be applied to this page.\",\"PageLayoutTooltip\":\"The selected layout will be applied to this page.\",\"PageContainerTooltip\":\"The selected container will be applied to all modules on this page.\",\"PreviewThemeLayoutAndContainer\":\"Preview Theme Layout and Container\",\"NotEmptyNameError\":\"This field is required\",\"AddPage\":\"Add Page\",\"PageSettings\":\"Page Settings\",\"AddMultiplePages\":\"Add Multiple Pages\",\"NameTooltip\":\"This is the name of the Page. The text you enter will be displayed in the menu system.\",\"DisplayInMenu\":\"Display in Menu\",\"DisplayInMenuTooltip\":\"You have the choice on whether or not to include the page in the main navigation menu. If a page is not included in the menu, you can still link to it based on its page URL.\",\"Name\":\"Name\",\"EnableScheduling\":\"Enable Scheduling\",\"EnableSchedulingTooltip\":\"Enable scheduling for this page.\",\"StartDate\":\"Start Date\",\"EndDate\":\"End Date\",\"TitleTooltip\":\"Enter a title for the page. The title will be displayed in the browser window title.\",\"Keywords\":\"Keywords\",\"Tags\":\"Tags\",\"ExistingPage\":\"Existing Page\",\"ExistingPageTooltip\":\"Redirect to an existing page on your site.\",\"ExternalUrl\":\"External Url\",\"ExternalUrlTooltip\":\"Redirect to an External URL Resource.\",\"PermanentRedirect\":\"Permanent Redirect\",\"PermanentRedirectTooltip\":\"Check this box if you want to notify the client that this page should be considered as permanently moved. This would allow SearchEngines to modify their URLs to directly link to the resource. This is ignored if the LinkType is None.\",\"OpenLinkInNewWindow\":\"Open Link In New Window\",\"OpenLinkInNewWindowTooltip\":\"Open Link in New Browser Window\",\"Save\":\"Save\",\"Details\":\"Details\",\"Permissions\":\"Permissions\",\"Modules\":\"Modules\",\"SEO\":\"S.E.O.\",\"More\":\"More\",\"Created\":\"Created\",\"CreatedValue\":\"[CREATEDDATE] by [CREATEDUSER]\",\"PageParent\":\"Page Parent\",\"Status\":\"Status\",\"PageType\":\"Page Type\",\"Standard\":\"Standard\",\"Existing\":\"Existing\",\"File\":\"File\",\"PageStyleSheetTooltip\":\"A stylesheet that will only be loaded for this page. The file must be located in the home directory or a sub folder of the current website.\",\"SetPageContainer\":\"set page container\",\"SetPageLayout\":\"set page layout\",\"SetPageTheme\":\"set page theme\",\"BackToPages\":\"Back to page\",\"ChangesNotSaved\":\"Changes have not been saved\",\"Pages_Seo_GeneratedByAutomatic\":\"Automatic\",\"CopyAppearanceToDescendantPagesSuccess\":\"Appearance has been copied to descendant pages successfully\",\"CopyPermissionsToDescendantPagesSuccess\":\"Permissions have been copied to descendant pages successfully\",\"DeletePageModuleSuccess\":\"Module \\\"[MODULETITLE]\\\" has been deleted successfully\",\"BulkPageSettings\":\"Bulk page settings\",\"BulkPagesToAdd\":\"Bulk pages to add\",\"AddPages\":\"Add Page(s)\",\"ValidatePages\":\"Validate Page(s)\",\"NoContainers\":\"This Theme does not have any Containers\",\"NoLayouts\":\"This Theme does not have any Layouts\",\"NoThemes\":\"Your site does not have any Themes\",\"NoThemeSelectedForContainers\":\"Please, select a theme to load containers\",\"NoThemeSelectedForLayouts\":\"Please, select a theme to load layouts\",\"PleaseSelectLayoutContainer\":\"Please, you must select a layout and a container to perform this operation.\",\"CancelWithoutSaving\":\"Are you sure you want to close? Changes have been made and will be lost. Do you wish to continue? \",\"PathDuplicateWithAlias\":\"There is already a page with the same name, {0} at the same URL path {1}.\",\"PathDuplicateWithPage\":\"There is already a page with the same URL path {0}.\",\"TabExists\":\"The Page Name you chose is already being used for another page at the same level of the page hierarchy.\",\"TabRecycled\":\"A page with this name exists in the Recycle Bin. To restore this page use the Recycle Bin.\",\"BulkPagesLabel\":\"One page per line, prepended with \\\">\\\" to create hierarchy\",\"BulkPageResponseTotalMessage\":\"[PAGES_CREATED] of [PAGES_TOTAL] pages were created.\",\"System\":\"System\",\"EmptyTabName\":\"Tab Name is Empty\",\"InvalidTabName\":\"{0} is an invalid Page Title.\",\"CustomUrlPathCleaned.Error\":\"The Page URL entered contains characters which cannot be used in a URL or are illegal characters for a URL. These characters have been removed. Click the Update button again to accept the modified URL.
[NOTE: The illegal characters list is the following: <>\\\\?:&=+|%# ]\",\"DuplicateUrl.Error\":\"The URL is a duplicate of an existing URL.\",\"InvalidRequest.Error\":\"The request is invalid\",\"Pages_Seo_QueryString.Help\":\"Add an optional Querystring to the Redirect URL to match on a URL with a Path and any matching Querystring parameters. The Querystring is the segment of the URL to the right of the first ? in the URL. e.g. example.com/url-to-redirect?id=123\",\"Pages_Seo_QueryString\":\"Query String\",\"Pages_Seo_SelectedAliasUsage.Help\":\"If the selected site alias is different from the primary site alias, select the usage option.\",\"Pages_Seo_SelectedAliasUsage\":\"Selected Site Alias Usage\",\"Pages_Seo_SelectedAliasUsageOptionPageAndChildPages\":\"Page and Child Pages\",\"Pages_Seo_SelectedAliasUsageOptionSameAsParent\":\"Same as Parent Page\",\"Pages_Seo_SelectedAliasUsageOptionThisPageOnly\":\"This page only\",\"Pages_Seo_SiteAlias.Help\":\"Select the alias for the page to use a specific alias.\",\"Pages_Seo_SiteAlias\":\"Site Alias\",\"Pages_Seo_UrlPath.Help\":\"Specify the path for the URL. Do not enter http:// or the site alias.\",\"Pages_Seo_UrlPath\":\"URL Path\",\"Pages_Seo_UrlType.Help\":\"Select 'Active' or 'Redirect'. Active means the URL will be used as the URL for the page, and will return a HTTP status code of 200. 'Redirect' means the entered URL will be redirected to the Active URL for the current page.\",\"Pages_Seo_UrlType\":\"URL Type\",\"UrlPathNotUnique.Error\":\"The submitted URL is not available. If you wish to accept the suggested alternative, please click Save.\",\"Pages_Seo_DeleteWarningMessage\":\"Are you sure you want to remove this URL?\",\"NoneSpecified\":\"< None Specified > \",\"CannotCopyPermissionsToDescendantPages\":\"You do not have permission to copy permissions to descendant pages\",\"SaveAsTemplate\":\"Save as Template\",\"BackToPageSettings\":\"Back to page settings\",\"DuplicatePage\":\"Duplicate Page\",\"BranchParent\":\"Branch Parent\",\"ModuleSettings\":\"Module Settings\",\"TopPage\":\"Top Page\",\"Folder\":\"Folder\",\"TemplateName\":\"Template Name\",\"IncludeContent\":\"Include Content\",\"FolderTooltip\":\"Select the export folder where the template will be saved.\",\"TemplateNameTooltip\":\"Enter a name for the page template.\",\"TemplateDescriptionTooltip\":\"Enter a description of this template.\",\"IncludeContentTooltip\":\"Check this box to include the module content.\",\"SearchFolders\":\"Search Folders\",\"ExportedMessage\":\"The page template has been created to {0}\",\"MakeNeutral.ErrorMessage\":\"Page cannot be converted to a neutral culture, because there are child pages.\",\"Detached\":\"Detached {0}\",\"ModuleDeleted\":\"This module is deleted, and exists in the recycle bin.\",\"ModuleInfo\":\"Module: {0}
ModuleTitle: {1}
Pane: {2}\",\"ModuleInfoForNonAdmins\":\"You do not have enough permissions to edit the title of this module.\",\"NotTranslated\":\"Not translated {0}\",\"Reference\":\"Reference {0}\",\"ReferenceDefault\":\"Reference Default Language {0}\",\"Translated\":\"Translated {0}\",\"Default\":\"[Default Language]\",\"NotActive\":\"[Language is not Active]\",\"TranslationMessageConfirmMessage.Error\":\"Something went wrong notifying the Translators.\",\"TranslationMessageConfirmMessage\":\"Translators successfully notified.\",\"NewContentMessage.Body\":\"The following page has new content ready for translation
Page: {0}
{2}\",\"NewContentMessage.Subject\":\"New Content Ready for Translation\",\"MakePagesTranslatable\":\"Make Page Translatable\",\"MakePageNeutral\":\"Make Page Neutral\",\"Site\":\"Site\",\"BadTemplate\":\"The page template is not a valid xml document. Please select a different template and try again.\",\"AddMissingLanguages\":\"Add Missing Languages\",\"NotifyTranslators\":\"Notify Translators\",\"UpdateLocalization\":\"Update Localization\",\"NeutralPageText\":\"This is a \\\"Language Neutral\\\" page, which means that the page will be visible in every language of the site. Language Neutral pages cannot be translated.\",\"NeutralPageClickButton\":\"To change this to a translatable page, click the button here.\",\"NotifyModalHeader\":\"Send a notification to translators\",\"NotifyModalPlaceholder\":\"Enter a message to send to translators\",\"CopyModule\":\"Copy Module\",\"TranslatedCheckbox\":\"Translated\",\"PublishedCheckbox\":\"Published\",\"MakeNeutralWarning\":\"This will delete all translated version of the page. Only the default culture version of the page will remain. Are you sure you want to do this?\",\"PageUpdatedMessage\":\"Page updated successfully\",\"PageDeletedMessage\":\"Page deleted successfully\",\"DisableLink\":\"Disable Page\",\"DisableLink_tooltip\":\"If the page is disabled it cannot be clicked in any navigation menu. This option is used to provide place-holders for child menu items.\",\"Description\":\"Description\",\"Title\":\"Title\",\"AddRole\":\"Add\",\"AddRolePlaceHolder\":\"Begin typing to add a role\",\"AddUser\":\"Add\",\"AddUserPlaceHolder\":\"Begin typing to add a user\",\"AllGroups\":\"[All Roles]\",\"EditTab\":\"Edit\",\"EmptyRole\":\"Add a role to set permissions by role\",\"EmptyUser\":\"Add a user to set permissions by user\",\"FilterByGroup\":\"Filter By Group:\",\"GlobalGroups\":\"[Global Roles]\",\"PermissionsByRole\":\"PERMISSIONS BY ROLE\",\"PermissionsByUser\":\"PERMISSIONS BY USER\",\"Role\":\"Role\",\"Status_Hidden\":\"Hidden\",\"Status_Visible\":\"Visible\",\"Status_Disabled\":\"Disabled\",\"User\":\"User\",\"ViewTab\":\"View\",\"SiteDefault\":\"Site Default\",\"ClearPageCache\":\"Clear Cache - This Page\",\"lblCachedItemCount\":\"Current Cache Count: {0} variations for this page\",\"cacheDuration.ErrorMessage\":\"Cache Duration must be an integer.\",\"cacheMaxVaryByCount.ErrorMessage\":\"Vary By Limit must be an integer.\",\"addTagsPlaceholder\":\"Add Tags\",\"On\":\"On\",\"Off\":\"Off\",\"ParentPage\":\"Parent Page\",\"MethodPermissionDenied\":\"The user is not allowed to access this method.\",\"Prompt_PageNotFound\":\"Page not found.\",\"Prompt_InvalidPageId\":\"You must specify a valid number for Page ID\",\"Prompt_NoPageId\":\"No valid Page ID specified\",\"Prompt_ParameterRequired\":\"Either Page Id or Page Name with flag --name should be specified.\",\"Prompt_IfSpecifiedMustHaveValue\":\"If you specify the --{0} flag, it must be set to True or False.\",\"Prompt_ParentIdNotNumeric\":\"When specifying --{0}, you must supply a valid numeric Page (Tab) ID\",\"Prompt_NoPages\":\"No pages found.\",\"Prompt_InvalidParentId\":\"The --{0} flag's value must be a valid Page (Tab) ID;.\",\"PageNotFound\":\"Page doesn't exists.\",\"Prompt_PageCreated\":\"The page has been created\",\"Prompt_PageCreateFailed\":\"Unable to create the new page\",\"Prompt_FlagRequired\":\"--{0} is required.\",\"Prompt_TrueFalseRequired\":\"You must pass True or False for the --{0} flag.\",\"Prompt_UnableToFindSpecified\":\"Unable to find page specified for --{0} '{1}'.\",\"Prompt_FlagMatch\":\"The --{0} flag value cannot be the same as the page you are trying to update\",\"Prompt_NothingToUpdate\":\"Nothing to Update! Tell what to update with flags like --{0} --{1} --{2} --{3}, etc.\",\"Prompt_DeletePage_Description\":\"Deletes a page within the portal and sends it to the Recycle Bin. For added safety, this method will not allow deletion of pages with children, Host pages, or pages in the //Admin path.\",\"Prompt_DeletePage_FlagId\":\"Explicitly specifies the Page ID to delete. Use of the flag name is not required. You can simply provide the ID value as the first argument. Required if --parentid is not specified.\",\"Prompt_DeletePage_FlagName\":\"The name (not title) of the page to delete.\",\"Prompt_DeletePage_FlagParentId\":\"The Page/Tab ID of the page's parent in the page hierarchy. Required only if --name is specified as delete parameter and page is not at root.\",\"Prompt_DeletePage_ResultHtml\":\"
\\r\\n

Delete Page By Page ID

\\r\\n \\r\\n delete-page 999\\r\\n \\r\\n\\r\\n

Delete Page by name under another parent

\\r\\n

NOTE: At this time, Prompt will not allow you to delete any pages that have children

\\r\\n \\r\\n delete-page --name \\\"test\\\" --parentid 999\\r\\n \\r\\n
\",\"Prompt_GetPage_Description\":\"

Provides information on the specified page.

\\r\\n
\\r\\n Pages vs. Tabs: For historical reasons, DNN\\r\\n internally refers to pages as "tabs". So, whenever you see a reference to tab\\r\\n or page, remember that they are equivalent. Values returned from Prompt will usually\\r\\n use DNN's internal naming conventions (hence tab), though Prompt's own syntax will usually use the word page instead of tab.\\r\\n
\",\"Prompt_GetPage_FlagId\":\"Explicitly specifies the Page ID to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_GetPage_FlagName\":\"The name (not title) of the page.\",\"Prompt_GetPage_FlagParentId\":\"The Page/Tab ID of the page's parent in the page hierarchy. Required only if --name is specified as get parameter and page is not at root.\",\"Prompt_GetPage_ResultHtml\":\"
\\r\\n

Get Page By Page (Tab) ID

\\r\\n \\r\\n get-page pageId\\r\\n \\r\\n\\r\\n

Get Page by Page Name

\\r\\n

\\r\\n NOTE: You cannot retrieve Host pages using this method as it only retrieves pages within a portal. Host pages technically live outside the portal. You can, however, retrieve them using the page's ID (TabID in DNN parlance).\\r\\n

\\r\\n get-page --name Home\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:345
Name:Home
Title:My Website Home
ParentId:-1
Container:null
Theme:[G]Skins/Xcillion/Home.ascx
Path://Home
IncludeInMenu:true
Url:
Keywords:DNN, KnowBetter, Prompt
Description:Gnome, gnome on the range....
\\r\\n\\r\\n

Get Page by Page Name and Parent

\\r\\n\\r\\n get-page --name \\\"Page 1a\\\" --parentid 71\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:72
Name:Page 1a
Title:Page 1a
ParentId:71
Container:null
Theme:
Path://Page1//Page1a
IncludeInMenu:true
Url:
Keywords:
Description:Page 1 is my parent. I'm Page 1a
\\r\\n
\",\"Prompt_Goto_Description\":\"Navigates to the specified page within the DNN portal\",\"Prompt_Goto_FlagId\":\"Specify the Page (Tab) ID of the page to which you want to navigate. Explicit use of the --id flag is not needed. Simply pass in the Page ID as the first argument after the command name\",\"Prompt_Goto_FlagName\":\"The name (not title) of the page.\",\"Prompt_Goto_FlagParentId\":\"The Page/Tab ID of the page's parent in the page hierarchy. Required only if --name is specified as goto parameter and page is not at root.\",\"Prompt_Goto_ResultHtml\":\"
\\r\\n

Navigate to A Page Within the Site

\\r\\n

This command navigates the browser to a page with the Page ID of 74

\\r\\n \\r\\n goto 74\\r\\n \\r\\n
\",\"Prompt_ListPages_Description\":\"

Retrieves a list of pages based on the specified criteria

\\r\\n
\\r\\n Pages vs. Tabs: For historical reasons, DNN\\r\\n internally refers to pages as "tabs". So, whenever you see a reference to tab\\r\\n or page, remember that they are equivalent. Values returned from Prompt will usually\\r\\n use DNN's internal naming conventions (hence tab), though Prompt's own syntax will usually use the word page instead of tab.\\r\\n
\",\"Prompt_ListPages_FlagDeleted\":\"If true, only pages that have been deleted (i.e. in DNN's Recycle Bin) will be returned. If false then only pages that have not been deleted will be returned. If the flag is specified but has no value, then true is assumed. If the flag is not specified, both deleted and non-deleted pages will be returned.\",\"Prompt_ListPages_FlagName\":\"Retrieve only pages whose name matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters.\",\"Prompt_ListPages_FlagParentId\":\"The Page ID (Tab ID) of the parent page whose child pages you'd like to retrieve. If the first argument is a valid Page ID, you do not need to explicitly use the --parentid flag\",\"Prompt_ListPages_FlagPath\":\"Retrieve only pages whose path matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters.\",\"Prompt_ListPages_FlagSkin\":\"Retrieve only pages whose skin matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters.\",\"Prompt_ListPages_FlagTitle\":\"Retrieve only pages whose title matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters.\",\"Prompt_ListPages_ResultHtml\":\"
\\r\\n

List All Pages in Current Portal

\\r\\n \\r\\n list-pages\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabIdNameTitleParentIdThemePathIncludeInMenuIsDeleted
41HomeHome 3-1[G]Skins/Xcillion/Home.ascx//Hometruefalse
71Page 1-1//Page1truetrue
42Activity FeedActivity Feed-1//ActivityFeedfalsefalse
...
33 pages found
\\r\\n\\r\\n

List Child Pages of Parent Page

\\r\\n \\r\\n list-pages 43\\r\\n \\r\\n OR\\r\\n \\r\\n list-pages --parentid 43\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabIdNameTitleParentIdThemePathIncludeInMenuIsDeleted
49Site SettingsSite Settings43//Admin//SiteSettingstruefalse
50ExtensionsExtensions43//Admin//Extensionstruefalse
51Security RolesSecurity Roles43//Admin//SecurityRolestruefalse
...
18 pages found
\\r\\n\\r\\n

List All Pages in the Recycle Bin

\\r\\n \\r\\n list-pages --deleted\\r\\n \\r\\n OR\\r\\n \\r\\n list-pages --deleted true\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabIdNameTitleParentIdThemePathIncludeInMenuIsDeleted
71Page 1-1//Page1truetrue
1 page found
\\r\\n\\r\\n

List All "Management" Pages on the Admin Menu

\\r\\n \\r\\n list-pages --path //Admin//*Management*\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabIdNameTitleParentIdThemePathIncludeInMenuIsDeleted
53File ManagementFile Management43//Admin//FileManagementtruefalse
55Site Redirection Management43//Admin//SiteRedirectionManagementtruefalse
56Device Preview Management43//Admin//DevicePreviewManagementtruefalse
3 pages found
\\r\\n\\r\\n
\",\"Prompt_ListRoles_FlagMax\":\"Page Size for the page. Max is 500.\",\"Prompt_ListRoles_FlagPage\":\"Page number to show records.\",\"Prompt_ListRoles_FlagVisible\":\"If true, only pages that are visible in the navigation menu will be returned. If false then only pages that hidden will be returned. If the flag is specified but has no value, then true is assumed. If the flag is not specified, both visible and hidden pages will be returned.\",\"Prompt_NewPage_Description\":\"Creates a new page within the portal\",\"Prompt_NewPage_FlagDescription\":\"The description to use for the page\",\"Prompt_NewPage_FlagKeywords\":\"Keywords to use for the page\",\"Prompt_NewPage_FlagName\":\"The name to use for the page. The --name flag does not have to be explicitly declared if the first argument is a string and not a flag.\",\"Prompt_NewPage_FlagParentId\":\"If you want this to be the child of a page, specify that page's ID as the --parentid\",\"Prompt_NewPage_FlagTitle\":\"The display title to use for the page\",\"Prompt_NewPage_FlagUrl\":\"A custom URL to use for the page. If not specified, the --name is used by DNN when creating the URL\",\"Prompt_NewPage_FlagVisible\":\"If true, the page will be visible in the site's navigation menu\",\"Prompt_NewPage_ResultHtml\":\"
\\r\\n

Create a New Page (Minimum Syntax)

\\r\\n
Implicitly Use --name flag
\\r\\n \\r\\n new-page \\\"My New Page\\\"\\r\\n \\r\\n
Explicitly Use --name flag
\\r\\n \\r\\n new-page --name \\\"My New Page\\\"\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:78
Name:My New Page
Title:
ParentId:-1
Container:null
Theme:
Path://MyNewPage
IncludeInMenu:true
Url:
Keywords:
Description:
\\r\\n\\r\\n

Create a Child Page with Additional Options

\\r\\n \\r\\n new-page --name \\\"My Sub Page\\\" --parentid 78 --title \\\"This is the sub page title\\\" --keywords \\\"sample, sub-page, prompt, KnowBetter\\\"\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:79
Name:My Sub Page
Title:This is the sub page title
ParentId:78
Container:null
Theme:
Path://MyNewPage//MySubPage
IncludeInMenu:true
Url:
Keywords:sample, sub-page, prompt, KnowBetter
Description:
\\r\\n\\r\\n
\",\"Prompt_SetPage_Description\":\"Sets or updates properties of the specified page\",\"Prompt_SetPage_FlagDescription\":\"The description to use for the page\",\"Prompt_SetPage_FlagId\":\"The ID of the page you want to update.\",\"Prompt_SetPage_FlagKeywords\":\"Keywords to use for the page\",\"Prompt_SetPage_FlagName\":\"The name to use for the page\",\"Prompt_SetPage_FlagParentId\":\"If you want this to be the child of a page, specify that page's ID as the --parentid\",\"Prompt_SetPage_FlagTitle\":\"The display title to use for the page\",\"Prompt_SetPage_FlagUrl\":\"A custom URL to use for the page. If not specified, the --name is used by DNN when creating the URL\",\"Prompt_SetPage_FlagVisible\":\"If true, the page will be visible in the site's navigation menu\",\"Prompt_SetPage_ResultHtml\":\"
\\r\\n

Update Properties of a Page

\\r\\n \\r\\n set-page 78 --title \\\"My New Page Title\\\" --name Page78\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:78
Name:Page25
Title:My New Page Title
ParentId:-1
Container:null
Theme:
Path://MyNewPage
IncludeInMenu:true
Url:
Keywords:
Description:
\\r\\n\\r\\n

Change the Parent of a Page

\\r\\n \\r\\n set-page --id 72 --parentid 79\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
TabId:72
Name:Page2
Title:Page 2
ParentId:79
Container:null
Theme:
Path://Page3//Page2
IncludeInMenu:true
Url:
Keywords:sample, sub-page, prompt, KnowBetter
Description:
\\r\\n\\r\\n
\",\"Prompt_PagesCategory\":\"Page Commands\",\"NoPermissionAddPage\":\"You don't have permission to add a page.\",\"NoPermissionEditPage\":\"You don't have permission to edit this page\",\"NoPermissionCopyPage\":\"You don't have permission to copy this page.\",\"NoPermissionManagePage\":\"You don't have permissions to manage the page\",\"NoPermissionViewPage\":\"You don't have permission to view the page\",\"NoPermissionDeletePage\":\"You don't have permission to delete the page.\",\"CannotDeleteSpecialPage\":\"You cannot delete a special page.\",\"ModuleCopyType.New\":\"New\",\"ModuleCopyType.Copy\":\"Copy\",\"ModuleCopyType.Reference\":\"Reference\",\"FilterByModifiedDateText\":\"Filter by Modified Date Range\",\"FilterbyPageTypeText\":\"Filter by Page Type\",\"FilterbyPublishStatusText\":\"Filter by Publish Status\",\"lblDraft\":\"Draft\",\"lblGeneralFilters\":\"GENERAL FILTERS\",\"lblNone\":\"None\",\"lblPagesFound\":\"PAGES FOUND.\",\"lblPublished\":\"Published\",\"lblTagFilters\":\"TAG FILTERS\",\"lblCollapseAll\":\"COLLAPSE ALL\",\"lblExpandAll\":\"EXPAND ALL\",\"NoPageSelected\":\"No page is currently selected.\",\"PageCreatedMessage\":\"Page created successfully\",\"lblDateRange\":\"Date Range\",\"lblFromDate\":\"From Date\",\"lblPageFound\":\"Page Found\",\"lblPublishDate\":\"Publish Date\",\"lblPublishStatus\":\"Publish Status\",\"lblAll\":\"All\",\"lblFile\":\"File\",\"lblNormal\":\"Standard\",\"lblUrl\":\"URL\",\"lblModifiedDate\":\"Modified Date\",\"NoPageFound\":\"No page found.\",\"PagesSearchHeader\":\"Page Search Results\",\"TagsInstructions\":\"Begin typing to filter by tags.\",\"ModifiedDateRange\":\"Modified Date Range\",\"BrowseAction\":\"Press {save|[ENTER]} to save, or {cancel|[ESC]} to cancel\",\"BrowseButton\":\"Browse File System\",\"DefaultImageTitle\":\"Image\",\"DragDefault\":\"Drag and Drop a File or Select an Option\",\"DragOver\":\"Drag and Drop a File\",\"LinkButton\":\"Enter URL Link\",\"LinkInputAction\":\"Press {save|[ENTER]} to save, or {cancel|[ESC]} to cancel\",\"LinkInputPlaceholder\":\"http://example.com/imagename.jpg\",\"LinkInputTitle\":\"URL Link\",\"NotSpecified\":\"\",\"SearchFilesPlaceHolder\":\"Search Files...\",\"SearchFoldersPlaceHolder\":\"Search Folders...\",\"UploadButton\":\"Upload a File\",\"UploadComplete\":\"Upload Complete\",\"UploadDefault\":\"myImage.jpg\",\"UploadFailed\":\"Upload Failed\",\"Uploading\":\"Uploading...\",\"WrongFormat\":\"Wrong Format\",\"ExternalRedirectionUrlRequired\":\"The URL is required.\",\"NoPermissionViewRedirectPage\":\"You don't have permission to view the redirect page.\",\"TabToRedirectIsRequired\":\"Page to redirect to is required.\",\"ValidFileIsRequired\":\"Valid file is required.\",\"BulkPageValidateResponseTotalMessage\":\"[PAGES_TOTAL] pages were validated.\"},\"Prompt\":{\"nav_Prompt\":\"Prompt\",\"Prompt_InvalidData\":\"You've submitted invalid data. Your request cannot be processed.\",\"Prompt_InvalidSyntax\":\"Invalid syntax\",\"Prompt_NotAuthorized\":\"You are not authorized to access to this resource. Your session may have timed-out. If so login again.\",\"Prompt_NotImplemented\":\"This functionality has not yet been implemented.\",\"Prompt_ServerError\":\"The server has encoutered an issue and was unable to process your request. Please try again later.\",\"Prompt_SessionTimedOut\":\"Your session may have timed-out. If so login again.\",\"CommandNotFound\":\"Command '{0}' not found.\",\"CommandOptionText\":\"{0} or {1}\",\"DidYouMean\":\"Did you mean '{0}'?\",\"Prompt_NoModules\":\"No modules found.\",\"Prompt_AddModuleError\":\"An error occurred while attempting to add the module. Please see the DNN Event Viewer for details.\",\"Prompt_DesktopModuleNotFound\":\"Unable to find a desktop module with the name '{0}' for this portal\",\"Prompt_ModuleAdded\":\"Successfully added {0} new module{(1}\",\"Prompt_ModuleCopied\":\"Successfully copied the module.\",\"Prompt_ModuleDeleted\":\"Module deleted successfully.\",\"Prompt_NoModulesAdded\":\"No modules were added\",\"Prompt_SourceAndTargetPagesAreSame\":\"The source Page ID and target Page ID cannot be the same.\\\\n\",\"Prompt_ModuleMoved\":\"Successfully moved the module.\",\"Prompt_ErrorWhileCopying\":\"An error occurred while copying the copying the module. See the DNN Event Viewer for Details.\",\"Prompt_ErrorWhileMoving\":\"An error occurred while copying the moving the module. See the DNN Event Viewer for Details.\",\"Prompt_FailedtoDeleteModule\":\"Failed to delete the module with id {0}. Please see log viewer for more details.\",\"Prompt_InsufficientPermissions\":\"You do not have enough permissions to perform this operation.\",\"Prompt_ModuleNotFound\":\"Could not find module with id {0} on page with id {1}\",\"Prompt_NoModule\":\"No module found with id {0}.\",\"Prompt_PageNotFound\":\"Could not load Target Page. No page found in the portal with ID '{0}'\",\"Prompt_UserRestart\":\"User triggered an Application Restart\",\"Prompt_RestartApplication_Description\":\"Initiates a restart of the DNN instance and reloads the page.\",\"Prompt_Default\":\"Default\",\"Prompt_Description\":\"Description\",\"Prompt_Options\":\"Options\",\"Prompt_Required\":\"Required\",\"Prompt_Type\":\"Type\",\"Prompt_CommandNotFound\":\"Unable to find help for that command\",\"Prompt_CommandHelpLearn\":\"
\\r\\n\\r\\n

Understanding Prompt Commands

\\r\\n

\\r\\n As with most command line interfaces, the more commands you memorize, the more efficient you can be. Understanding the reasoning behind how Prompt commands are named and structured will make it much easier to learn and internalize them.\\r\\n

\\r\\n
    \\r\\n
  1. \\r\\n Prompt is Case-Insensitive. That means you can use lowercase, uppercase or mixed-case command names and option flag names. This is typical of most command lines and we find it makes it easier to use on a daily basis.\\r\\n
  2. \\r\\n
  3. \\r\\n Commands are either 1 word or 2 words separated by a single dash (-) and no spaces.\\r\\n
  4. \\r\\n
  5. \\r\\n One-Word Commands: These are generally reserved for commands that interact with the Prompt console itself or the browser. In other words, most of these commands take place in the browser. Some examples are: cls which clears the console screen and reload which tells the browser to reload the page. There are also two-word commands that operate on the client side such as clear-history (though there is a shortcut for clear-history: clh
  6. \\r\\n
  7. \\r\\n Two-Word Commands: These commands follow the format action-component—an action followed by a single dash followed by a component or object that the action operates on.\\r\\n
  8. \\r\\n
\\r\\n\\r\\n

Common Actions

\\r\\n

This is not a complete list of all actions but covers most of them...

\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ActionDescription
list\\r\\n Retrieves a list of objects. The assumption is that two or more objects will be returned so the component portion of the command is plural:
\\r\\n list-pages NOT list-page\\r\\n
get\\r\\n Will retrieve a single object. If the command results in multiple objects, only the fist object found will be retrieved. Since this command operates on a single item, the component is singular and not plural:
\\r\\n get-page NOT get-pages\\r\\n
new\\r\\n Creates a new object. We chose the word new since it requires less typing than 'create' and it is a more accurate than 'add', which connotes adding something to something else.\\r\\n
add\\r\\n Adds something to something else. This should not be confused with new which creates a new object. Consider add-roles and new-role. The former is used to add one or more security roles to a user (i.e. add a role to the list of roles the user already has), whereas the latter command creates a new security role in the DNN system.\\r\\n
set\\r\\n Modifies an object. This could mean 'update' or set (for the first time) a value. We chose the word 'set' not only because it's short and easy to type, but also because it is more accurate in more scenarios. 'Update' implies you are changing a value that has already been set, but is less accurate if you are setting a value for the first time. And did we mention 'set' is half the length of 'update'?\\r\\n
delete\\r\\n Deletes an object. The results of this action are contextually dependent. If DNN provides a recycle bin facility like it does for pages and users, then the command will send the object to that recycle bin, allowing it to be restored later. If there is no such facility provided, then the object would be permanently deleted\\r\\n
restore\\r\\n If an object has been previously deleted and DNN provides a recycle facility for the object, then this will restore the object.\\r\\n
purge\\r\\n If the object has been previously deleted and DNN provides a recycle facility for the object, then this command will permanently delete the object. The DNN user interface typically refers to this as 'remove' however we felt that 'purge' more accurately reflected the action.\\r\\n
\\r\\n\\r\\n

Common Components

\\r\\n

Most components should be familiar to any user with admin experience with DNN. Below are the most common:

\\r\\n

A Note on Plural vs Singular Components: Whenever a command can 1 or more items, the component will be plural. list-modules, for instance. When the command is designed to return a single object or the first object, then the component will be singular as in get-module

\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ComponentDescription
user/users\\r\\n A DNN User\\r\\n
page/pagesA page in the site. NOTE: For historical reasons, DNN refers to pages internally as Tabs while the DNN user interface refers to them as pages. We've chosen to use 'page', but you may see references to Tab or TabID returned from page-related commands. For Prompt's purposes, you should only use 'page' but understand that 'page and 'tab' are synonymous.
role/rolesA DNN Security Role
task/tasksA task is a DNN Scheduler Item or Scheduled Task. We use the word task due to its brevity.
portal/portalsA DNN site or portal
module/modulesA DNN module. Depending on the command, this could be a module definition or module instance.
\\r\\n\\r\\n

See Also

\\r\\n Basic Syntax\\r\\n Prompt Commands List\\r\\n\\r\\n
\",\"Prompt_CommandHelpSyntax\":\"
\\r\\n

Basic Syntax

\\r\\n

\\r\\n Prompt functions in a way similar to a Terminal, Bash shell, Windows CMD shell, or Powershell. You enter a command and hit ENTER and the computer responds with a result. For very simple commands like help or list-modules, that's all you need. Some commands, though, may require additional data or they may allow you to provide additional options.\\r\\n

\\r\\n

\\r\\n Specifying a target or context for a command: For commands that operate on an object like a user, or that require a context like a page, you simply provide that information after the command. For example, to find the user jsmith using the get-user command, you would type: get-user jsmith followed by the ENTER key to submit it. If you will be specifying flags (see next paragraph), those should always come after the target/context of the command.\\r\\n

\\r\\n

\\r\\n Specifying Options to Commands: Some commands require even more data or allow you to specify optional configuration information. In Prompt we call these "flags". These should come after any target/context needed by the command (see above paragraph) and must be preceded with two hyphens or dashes (--). There should be no spaces between the dashes and there should be no space between the dashes and the name of the flag. If then flag requires a value, you add that after the flag.\\r\\n

\\r\\n

\\r\\n As an example of using flags, take the get-user command. By default, you would specify the username of the user you want to find. However, you can also search by their email address. In that case, you would use the --email flag. Here's how you would use it:\\r\\n

\\r\\n \\r\\n get-user --email jsmith@sample.com\\r\\n \\r\\n

\\r\\n If the value of a flag is more than one word, enclose it in double quotes like so:\\r\\n

\\r\\n \\r\\n set-page --title \\\"My Page\\\"\\r\\n \\r\\n\\r\\n

See Also

\\r\\n Learning Prompt Commands\\r\\n Prompt Commands List\\r\\n\\r\\n
\",\"Prompt_AddModule_Description\":\"Adds a module to a page on the website.\",\"Prompt_AddModule_FlagModuleName\":\"Name of the desktop module to add. This should be unique existing module name.\",\"Prompt_AddModule_FlagModuleTitle\":\"Specify the title of the module on the page.\",\"Prompt_AddModule_FlagPageId\":\"Id of the page to add module on.\",\"Prompt_AddModule_FlagPane\":\"Specify the pane in which the module should be added. If not provided, module would be added to ContentPane.\",\"Prompt_AddModule_ResultHtml\":\"

Add a module to a page

\\r\\n add-module --name \\\"Html\\\" --pageid 23 --pane TopPane\",\"Prompt_CopyModule_Description\":\"Copies a module to the specified page.\",\"Prompt_CopyModule_FlagId\":\"Explicitly specifies the Module ID of the module to copy. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_CopyModule_FlagIncludesettings\":\"If true, Prompt will copy the source module's settings to the copied module.\",\"Prompt_CopyModule_FlagPageId\":\"The Page ID of the page that contains the module you want to copy.\",\"Prompt_CopyModule_FlagPane\":\"Specify the pane in which the module should be copied. If not provided, module would be copied to ContentPane.\",\"Prompt_CopyModule_FlagToPageId\":\"The Page ID of the target page. The page to which you want to copy the module.\",\"Prompt_DeleteModule_Description\":\"Soft-deletes a module on a specific page. The module will be sent to the DNN Recycle Bin. This will not uninstall modules or affect module definitions.\",\"Prompt_DeleteModule_FlagId\":\"Explicitly specifies the Module ID of the module to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_DeleteModule_FlagPageId\":\"Specifies the Page ID of the page on which the module to delete resides.\",\"Prompt_DeleteModule_ResultHtml\":\"

Delete and Send Module Instance to Recycle Bin

\\r\\n

This will delete a module instance on a specific page and send it to the DNN Recycle Bin

\\r\\n delete-module 345 --pageid 42\",\"Prompt_GetModule_Description\":\"Retrieves details about a single module in a specified page\",\"Prompt_GetModule_FlagId\":\"Explicitly specifies the Module ID of the module to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_GetModule_FlagPageId\":\"The Page ID of the page that contains the module.\",\"Prompt_GetModule_ResultHtml\":\"

Get Information on a Specific Module

\\r\\n

The code below retrieves the details for a module whose Module ID is 345 on a page 48

\\r\\n get-module 359 --pageid 48\\r\\n

The following version is a more explicit version of the code above, but does the same thing on a page 48.

\\r\\n get-module --id 359 --pageid 48\\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleId:359
Title:Navigation
ModuleName:Console
FriendlyName:Console
ModuleDefId:102
TabModuleId:48
AddedToPages:42, 46, 47, 48
\",\"Prompt_ListModules_Description\":\"Retrieves a list of modules based on the search criteria\",\"Prompt_ListModules_FlagDeleted\":\"When specified, the command will find all module instances in the portal that are in the Recycle Bin (if --deleted is true), or all module instances not in the Recycle Bin (if operate --deleted is false). If the flag is specified but no value is given, it will default to true. This flag may be used with --name and --title to further refine the results\",\"Prompt_ListModules_FlagMax\":\"Page Size for the page. Max is 500.\",\"Prompt_ListModules_FlagModuleName\":\"The name of the module to search for. This accepts the wildcard (*) character to do partial searches. The Module Name is not the same thing as the module's Friendly Name or the module's Title. To find the Module Name, list-modules on a page containing the module. Searches are case-insensitive\",\"Prompt_ListModules_FlagModuleTitle\":\"The title of the module to search for. This accepts wildcard (*) placeholders representing 0 or more characters. Searches are case-insensitive.\",\"Prompt_ListModules_FlagPage\":\"Page number to show records.\",\"Prompt_ListModules_FlagPageId\":\"When specified, the command will show modules from specified page only. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_ListModules_ResultHtml\":\"

List Modules in the Current Portal

\\r\\n list-modules\\r\\n\\r\\n

List Modules on Specific Page

\\r\\n list-modules 72\\r\\n\\r\\n

List Modules Filtered by Module Name

\\r\\n

This will return all XMod and XMod Pro modules in the current portal

\\r\\n list-modules --name XMod*\\r\\n\\r\\n

List Modules on a Specific Page Filtered by Module Name

\\r\\n

This will return all XMod and XMod Pro modules on the page with a Page/TabId of 72

\\r\\n list-modules 72 --name XMod*\\r\\n\\r\\n

List All Modules Filtered on Name and Title

\\r\\n

This will return all modules in the portal whose Module Name starts with Site and Title starts with Configure.

\\r\\n list-modules --title Configure* --name Site*\\r\\n

Returns

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleIdTitleModuleNameFriendlyNameModuleDefIdTabModuleIdAddedToPages
394Configure portal settings, page design and apply a template...SiteWizardSite Wizard888664
395Configure the sitemap for submission to common search enginesSitemapSitemap1068765
\\r\\n\\r\\n

List All Deleted Modules in Portal

\\r\\n

This will return all modules in the DNN Recycle Bin

\\r\\n list-modules --deleted\\r\\n

Returns

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleIdTitlePaneModuleNameFriendlyNameModuleDefIdTabModuleIdIsDeletedTabId
358Home BannerContentPaneDNN_HTMLHTML120106true74
410Module that was copiedContentPaneDNN_HTMLHTML120104true71
\\r\\n\\r\\n

List All Deleted Modules Filtered on Name and Title

\\r\\n

This will return all modules in the DNN Recycle Bin whose Module Name ends with "HTML" and whose Module Title contains "that"

\\r\\n list-modules --deleted --name *HTML --title *that*\\r\\n

Returns

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleIdTitlePaneModuleNameFriendlyNameModuleDefIdTabModuleIdIsDeletedTabId
410Module that was copiedContentPaneDNN_HTMLHTML120104true71
\",\"Prompt_MoveModule_Description\":\"Moves a module to the specified page\",\"Prompt_MoveModule_FlagId\":\"Explicitly specifies the Module ID of the module to copy. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_MoveModule_FlagPageId\":\"The Page ID of the page that contains the module you want to copy.\",\"Prompt_MoveModule_FlagPane\":\"Specify the pane in which the module should be moved. If not provided, module would be moved to ContentPane.\",\"Prompt_MoveModule_FlagToPageId\":\"The Page ID of the target page. The page to which you want to copy the module.\",\"Prompt_MoveModule_ResultHtml\":\"

Move a Module from One Page to Another

\\r\\n

This command the module with Module ID 358 on the Page with Page ID of 71 and places module on the page with a Page ID of 75

\\r\\n move-module 358 --pageid 71 --topageid 75\\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleId:358
Title:My Module
ModuleName:DNN_HTML
FriendlyName:HTML
ModuleDefId:120
TabModuleId:107
AddedToPages:71, 75
Successfully copied the module.
\",\"Prompt_ClearCache_Description\":\"Clears the server's cache and reloads the page.\",\"Prompt_ClearCache_ResultHtml\":\" \\r\\n clear-cache\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n
Cache cleared
Reloading in 3 seconds
\",\"Prompt_ClearHistory_Description\":\"Clears history of commands used in current session\",\"Prompt_ClearLog_Description\":\"Clears the Event Log for the current portal.\",\"Prompt_ClearLog_ResultHtml\":\"\\r\\n clear-log\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n
[Event Log Cleared]
\",\"Prompt_Cls_Description\":\"Clears the Prompt console. cls is a shortcut for clear-screen\",\"Prompt_Echo_Description\":\"Echos back the first argument received\",\"Prompt_Exit_Description\":\"Exits the Prompt console.\",\"Prompt_GetHost_Description\":\"Retrieves information about the DNN installation\",\"Prompt_GetHost_ResultHtml\":\"

Get Information on Current DNN Installation

\\r\\n \\r\\n get-host\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
Product:DNN Platform
Version:9.0.0.1002
UpgradeAvailable:true
Framework:4.6
IP Address:fe80::a952:8263:d357:ab90%5
Permissions:ReflectionPermission, WebPermission, AspNetHostingPermission
Site:dnnprompt.com
Title:DNN Corp
Url:http://www.dnnsoftware.com
Email:support@dnnprompt.com
Theme:Gravity (2-Col)
Container:Gravity (Title_h2)
EditTheme:Gravity (2-Col)
EditContainer:Gravity (Title_h2)
PortalCount:1
\",\"Prompt_GetPortal_Description\":\"Retrieves basic information about the current portal or specified portal\",\"Prompt_GetPortal_FlagId\":\"Portal Id to get info. Only host can get information of portals other than current.\",\"Prompt_GetPortal_ResultHtml\":\"

Get Information on Current Portal

\\r\\n \\r\\n get-portal\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
PortalId:0
PortalName:dnnsoftware.com
CdfVersion:-1
RegistrationMode:Verified
DefaultPortalAlias:dnnsoftware.com
PageCount:34
UserCount:5
SiteTheme:Xcillion (Inner)
AdminTheme:Xcillion (Admin)
Container:Xcillion (NoTitle)
AdminContainer:Xcillion (Title_h2)
Language:en-US
\",\"Prompt_GetSite_Description\":\"Retrieves basic information about the current portal or specified portal\",\"Prompt_GetSite_FlagId\":\"Site Id to get info. Only host can get information of portals other than current.\",\"Prompt_GetSite_ResultHtml\":\"

Get Information on Current Portal

\\r\\n \\r\\n get-portal\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
PortalId:0
PortalName:dnnsoftware.com
CdfVersion:-1
RegistrationMode:Verified
DefaultPortalAlias:dnnsoftware.com
PageCount:34
UserCount:5
SiteTheme:Xcillion (Inner)
AdminTheme:Xcillion (Admin)
Container:Xcillion (NoTitle)
AdminContainer:Xcillion (Title_h2)
Language:en-US
\",\"Prompt_ListCommands_Description\":\"Lists all the commands.\",\"Prompt_ListPortals_Description\":\"Retrieves a list of portals for the current DNN Installation\",\"Prompt_ListSites_Description\":\"Retrieves a list of portals for the current DNN Installation\",\"Prompt_Reload_Description\":\"Reloads the current page\",\"Prompt_PagingMessage\":\"Page {0} of {1}.\",\"Prompt_PagingMessageWithLoad\":\"Page {0} of {1}. Press any key to load next page. Press CTRL + X to end.\",\"Help_Default\":\"Default\",\"Help_Description\":\"Description\",\"Help_Flag\":\"Flag\",\"Help_Options\":\"Options\",\"Help_Required\":\"Required\",\"Help_Type\":\"Type\",\"PromptGreeting\":\"Prompt {0} Type \\\\'help\\\\' to get a list of commands\",\"ReloadingText\":\"Reloading in 3 seconds\",\"SessionHisotryCleared\":\"Session command history cleared.\",\"Prompt_GeneralCategory\":\"General Commands\",\"Prompt_HostCategory\":\"Host Commands\",\"Prompt_ModulesCategory\":\"Module Commands\",\"Prompt_PortalCategory\":\"Portal Commands\",\"Prompt_Help_Command\":\"Command\",\"Prompt_Help_Commands\":\"Commands\",\"Prompt_Help_Description\":\"Description\",\"Prompt_Help_Learn\":\"Learning Prompt Commands\",\"Prompt_Help_ListOfAvailableMsg\":\"Here is a list of available commands for Prompt.\",\"Prompt_Help_PromptCommands\":\"Prompt Commands\",\"Prompt_Help_SeeAlso\":\"See Also\",\"Prompt_Help_Syntax\":\"Overview/Basic Syntax\",\"Prompt_ClearCache_Error\":\"An error occurred while attempting to clear the cache.\",\"Prompt_ClearCache_Success\":\"Cache Cleared.\",\"Prompt_ClearLog_Error\":\"An error occurred while attempting to clear the Event Log.\",\"Prompt_ClearLog_Success\":\"Event Log Cleared.\",\"Prompt_Echo_Nothing\":\"Nothing to echo back\",\"Prompt_Echo_ResultHtml\":\"

\",\"Prompt_FlagIsRequired\":\"'[0]' is required.\",\"Prompt_GetHost_Unauthorized\":\"You do not have authorization to access this functionality.\",\"Prompt_GetHost__NoArgs\":\"The get-host command does not take any arguments or flags.\",\"Prompt_GetPortal_NoArgs\":\"The get-portal command does not take any arguments or flags.\",\"Prompt_GetPortal_NotFound\":\"Could not find a portal with ID of '{0}'\",\"Prompt_ListCommands_Error\":\"An error occurred while attempting to list the commands.\",\"Prompt_ListCommands_Found\":\"Found {0} commands.\",\"Prompt_ListCommands_H_Description\":\"Description\",\"Prompt_ListCommands_H_Name\":\"Name\",\"Prompt_ListCommands_H_Version\":\"Version\",\"Prompt_ListCommands__H_Category\":\"Category\",\"Prompt_ListPortals_NoArgs\":\"The list-portal command does not take any arguments or flags\",\"Prompt_SetMode_Description\":\"Sets the DNN View Mode. This has the same effect as clicking the appropriate options in the DNN Control Bar.\",\"Prompt_SetMode_FlagMode\":\"One of three view modes: edit, layout, or view. You do not need to specify\\r\\n the --mode flag explicitly. Simply type one of the view mode values after the command.\",\"Prompt_SetMode_ResultHtml\":\"
\\r\\n

Change the DNN View Mode

\\r\\n \\r\\n set-mode layout\\r\\n OR\\r\\n \\r\\n set-mode view\\r\\n OR\\r\\n \\r\\n set-mode edit\\r\\n \\r\\n
\",\"Prompt_UserRestart_Error\":\"An error occurred while attempting to restart the application.\",\"Prompt_UserRestart_Success\":\"Application Restarted\",\"Prompt_CopyModule_ResultHtml\":\"

Copy a Module from One Page to Another

\\r\\n

This command makes a copy of the module with Module ID 358 on the Page with Page ID of 71 and places that copy on the page with a Page ID of 75

\\r\\n copy-module 358 --pageid 71 --topageid 75\\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ModuleId:358
Title:My Module
ModuleName:DNN_HTML
FriendlyName:HTML
ModuleDefId:120
TabModuleId:107
AddedToPages:71, 75
Successfully copied the module.
\",\"Prompt_ListCommands_ResultHtml\":\"

\",\"Prompt_ListPortals_ResultHtml\":\"

\",\"Prompt_ListSites_ResultHtml\":\"

\",\"Prompt_RestartApplication_ResultHtml\":\"

Results

\\r\\n \\r\\n \\r\\n \\r\\n
Application restarted
Reloading in 3 seconds
\"},\"EvoqRecyclebin\":{\"nav_Recyclebin\":\"Recycle Bin\",\"recyclebin_Actions\":\"Actions\",\"recyclebin_CancelConfirm\":\"No\",\"recyclebin_Delete\":\"Delete\",\"recyclebin_DeleteConfirm\":\"Yes\",\"recyclebin_DeletedDate\":\"Date\",\"recyclebin_EmptyRecycleBin\":\"Empty Recycle Bin\",\"recyclebin_EmptyRecycleBinConfirm\":\"Do you want to empty all files in the recycle bin?\",\"recyclebin_Modules\":\"Modules\",\"recyclebin_Users\":\"Users\",\"recyclebin_NoUsers\":\"No Users In Recycle Bin\",\"recyclebin_ModuleTitle\":\"Module Title\",\"recyclebin_Username\":\"Username\",\"Service_RestoreUserError\":\"Error restoring user.\",\"Service_RemoveUserError\":\"Error removing user has occurred:
{0}\",\"recyclebin_RestoreUserConfirm\":\"

Please confirm you wish to restore this user.

\",\"recyclebin_RestoreUsersConfirm\":\"

Please confirm you wish to restore selected users.

\",\"recyclebin_RemoveUserConfirm\":\"

Please confirm you wish to delete this user.

\",\"recyclebin_RemoveUsersConfirm\":\"

Please confirm you wish to delete selected users.

\",\"recyclebin_UserDisplayName\":\"Display Name\",\"recyclebin_NoConfirm\":\"No\",\"recyclebin_NoItems\":\"The recycle bin is currently empty\",\"recyclebin_NoModules\":\"No Modules In Recycle Bin\",\"recyclebin_NoPages\":\"No Pages In Recycle Bin\",\"recyclebin_NoTemplates\":\"No Templates In Recycle Bin\",\"recyclebin_Page\":\"Page\",\"recyclebin_Pages\":\"Pages\",\"recyclebin_RemoveModuleConfirm\":\"

Please confirm you wish to delete this module.

\",\"recyclebin_RemoveModulesConfirm\":\"

Please confirm you wish to delete selected modules.

\",\"recyclebin_RemovePageConfirm\":\"

Please confirm you wish to delete this page.

\",\"recyclebin_RemovePagesConfirm\":\"

Please confirm you wish to delete selected pages.

\",\"recyclebin_Restore\":\"Restore\",\"recyclebin_RestoreModuleConfirm\":\"

Please confirm you wish to restore this module.

\",\"recyclebin_RestoreModulesConfirm\":\"

Please confirm you wish to restore selected modules.

\",\"recyclebin_RestorePageConfirm\":\"

Please confirm you wish to restore this page.

\",\"recyclebin_RestorePageInvalid\":\"You need restore this page's parent at first.\",\"recyclebin_RestorePagesConfirm\":\"

Please confirm you wish to restore selected pages.

\",\"recyclebin_RestorePagesInvalid\":\"The page(s) you tried to restore should select their parent in same time.\",\"recyclebin_Title\":\"Recycle Bin\",\"recyclebin_UnableToSelectAllModules\":\"Cannot permanently delete or restore a module's who's page is in the Recycle Bin.\",\"recyclebin_YesConfirm\":\"Yes\",\"Service_RemoveTabError\":\"Page {0} cannot be deleted until its children have been deleted first.
\",\"Service_RemoveTabModuleError\":\"Error removing page has occurred:
{0}\",\"Service_RestoreModuleError\":\"Error restoring module {0} on page {1}. Page is deleted.\",\"Service_RestoreTabError\":\"Page {0} cannot be restored until its parent is restored first.
\",\"Service_RestoreTabModuleError\":\"Error restoring page has occurred:
{0}\",\"recyclebin_RemoveTemplateConfirm\":\"

Please confirm you wish to delete this template.

\",\"recyclebin_RemoveTemplatesConfirm\":\"

Please confirm you wish to delete selected templates.

\",\"recyclebin_RestoreTemplateConfirm\":\"

Please confirm you wish to restore this template.

\",\"recyclebin_RestoreTemplatesConfirm\":\"

Please confirm you wish to restore selected templates.

\",\"recyclebin_Template\":\"Template\",\"recyclebin_Templates\":\"Templates\"},\"Recyclebin\":{\"nav_Recyclebin\":\"Recycle Bin\",\"recyclebin_Actions\":\"Actions\",\"recyclebin_CancelConfirm\":\"No\",\"recyclebin_Delete\":\"Delete\",\"recyclebin_DeleteConfirm\":\"Yes\",\"recyclebin_DeletedDate\":\"Date\",\"recyclebin_EmptyRecycleBin\":\"Empty Recycle Bin\",\"recyclebin_EmptyRecycleBinConfirm\":\"Do you want to empty all files in the recycle bin?\",\"recyclebin_Modules\":\"Modules\",\"recyclebin_Users\":\"Users\",\"recyclebin_ModuleTitle\":\"Module Title\",\"recyclebin_Username\":\"Username\",\"recyclebin_UserDisplayName\":\"Display Name\",\"recyclebin_NoConfirm\":\"No\",\"recyclebin_NoItems\":\"The recycle bin is currently empty\",\"recyclebin_NoModules\":\"No Modules In Recycle Bin\",\"recyclebin_NoPages\":\"No Pages In Recycle Bin\",\"recyclebin_NoUsers\":\"No Users In Recycle Bin\",\"recyclebin_Page\":\"Page\",\"recyclebin_Pages\":\"Pages\",\"recyclebin_RemoveModuleConfirm\":\"

Please confirm you wish to delete this module.

\",\"recyclebin_RemoveModulesConfirm\":\"

Please confirm you wish to delete selected modules.

\",\"recyclebin_RemovePageConfirm\":\"

Please confirm you wish to delete this page.

\",\"recyclebin_RemovePagesConfirm\":\"

Please confirm you wish to delete selected pages.

\",\"recyclebin_Restore\":\"Restore\",\"recyclebin_RestoreModuleConfirm\":\"

Please confirm you wish to restore this module.

\",\"recyclebin_RestoreModulesConfirm\":\"

Please confirm you wish to restore selected modules.

\",\"recyclebin_RestorePageConfirm\":\"

Please confirm you wish to restore this page.

\",\"recyclebin_RestorePageInvalid\":\"You need to restore this page's parent first.\",\"recyclebin_RestorePagesConfirm\":\"

Please confirm you wish to restore selected pages.

\",\"recyclebin_RestorePagesInvalid\":\"The page(s) you tried to restore should select their parent in same time.\",\"recyclebin_RestoreUserConfirm\":\"

Please confirm you wish to restore this user.

\",\"recyclebin_RestoreUsersConfirm\":\"

Please confirm you wish to restore selected users.

\",\"recyclebin_RemoveUserConfirm\":\"

Please confirm you wish to delete this user.

\",\"recyclebin_RemoveUsersConfirm\":\"

Please confirm you wish to delete selected users.

\",\"recyclebin_Title\":\"Recycle Bin\",\"recyclebin_UnableToSelectAllModules\":\"Cannot permanently delete or restore a module's who's page is in the Recycle Bin.\",\"recyclebin_YesConfirm\":\"Yes\",\"Service_RemoveTabError\":\"Error removing page has occurred:{0}\",\"Service_RemoveTabModuleError\":\"Error removing page modules has occurred:{0}\",\"Service_RemoveUserError\":\"Error removing user has occurred:{0}\",\"Service_RestoreModuleError\":\"Error restoring module {0} on page {1}. Page is deleted.\",\"Service_RestoreTabError\":\"Page {0} cannot be restored until its parent is restored first.\",\"Service_RestoreTabModuleError\":\"Error restoring page has occurred:{0}\",\"Service_EmptyRecycleBinError\":\"Some of the items were not deleted.\",\"Service_RestoreUserError\":\"Error restoring user.\",\"CanNotDeleteModule\":\"You do not have permissions to delete module with id \\\"{0}\\\".\",\"ModuleNotSoftDeleted\":\"Module with id \\\"{0}\\\" is not soft deleted.\",\"Prompt_FlagNotInt\":\"--{0} must be an integer\\\\n\",\"Prompt_FlagNotPositiveInt\":\"--{0} must be greater than 0\\\\n\",\"Prompt_MainParamRequired\":\"The {0} is required. Please use the --{1} flag or pass it as the first argument after the command name\\\\n\",\"ModuleNotFound\":\"Module with id \\\"{0}\\\" not found.\",\"Prompt_ModulePurgedSuccessfully\":\"Module with id \\\"{0}\\\" purged successfully.\",\"Service_RemoveTabWithChildError\":\"Page {0} cannot be deleted until its children have been deleted first.\",\"Prompt_FlagRequired\":\"--{0} is required\\\\n\",\"Prompt_ModuleRestoredSuccessfully\":\"Module with id \\\"{0}\\\" restored successfully.\",\"CanNotDeleteTab\":\"You do not have permissions to delete page with id \\\"{0}\\\".\",\"PageNotFound\":\"Page with id \\\"{0}\\\" not found.>br/>\",\"Prompt_PagePurgedSuccessfully\":\"Page with id \\\"{0}\\\" purged successfully.\",\"Prompt_PageRestoredSuccessfully\":\"Page with id \\\"{0}\\\" and name \\\"{1}\\\" restored successfully.\",\"TabNotSoftDeleted\":\"Page with id \\\"{0}\\\" is not soft deleted.\",\"PageNotFoundWithName\":\"Page with name \\\"{0}\\\" not found.>br/>\",\"Prompt_RestorePageNoParams\":\"You must specify either a Page ID or Page Name.\",\"UserNotFound\":\"User with id \\\"{0}\\\" not found.\",\"Prompt_PurgeModule_Description\":\"Permanently deletes a module. The module should be soft deleted first.\",\"Prompt_PurgeModule_FlagId\":\"Explicitly specifies the Module ID of the module to delete permanently. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_PurgeModule_FlagPageId\":\"Explicitly specifies the Page Id on which the module was added originally.\",\"Prompt_PurgeModule_ResultHtml\":\"

Purge a Specific Module

\\r\\n

The code below purges the module whose Module ID is 359

\\r\\n purge-module 359 --pageid 20\\r\\n\\r\\n

Results

\\r\\n Module with id \\\"359\\\" purged successfully.\",\"Prompt_PurgePage_Description\":\"Permanently deletes a page from the portal that had previously been deleted and sent to DNN's Recycle Bin.\",\"Prompt_PurgePage_FlagDeleteChildren\":\"Specifies that if a page has children, should the command delete them all or show error.\",\"Prompt_PurgePage_FlagId\":\"Explicitly specifies the Page ID to purge. Use of the flag name is not required. You can simply provide the ID value as the first argument.\",\"Prompt_PurgePage_ResultHtml\":\"
\\r\\n

Purge a Deleted Page By Page ID

\\r\\n \\r\\n purge-page 999\\r\\n \\r\\n OR\\r\\n \\r\\n purge-page --id 999\\r\\n \\r\\n\\r\\n

Purge a Deleted Page and All It's Child Pages

\\r\\n \\r\\n purge-page --id 999 --deletechildren true\\r\\n \\r\\n
\",\"Prompt_PurgeUser_Description\":\"Permanently deletes the specified user from the portal. The user must be deleted already. If you issue a get-user command and the IsDeleted property isn't true, then you will get an error when attempting this command. You must use the delete-user command on the user first.\",\"Prompt_PurgeUser_FlagId\":\"The user's User ID. If the flag is not used, then the user's ID must be the first argument.\",\"Prompt_PurgeUser_ResultHtml\":\"

Permanently Delete a User

\\r\\n

Permanently delete's the user with a User ID of 345. If you issue the command: get-user 345 you will receive a 'user not found' message.

\\r\\n purge-user 345\\r\\n

This is the more explicit form of the above code.

\\r\\n purge-user --id 345\",\"Prompt_RestoreModule_Description\":\"Restores a module from the DNN Recycle Bin.\",\"Prompt_RestoreModule_FlagId\":\"Explicitly specifies the Module ID of the module to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument.\",\"Prompt_RestoreModule_FlagPageId\":\"The Page ID of the page on which the module you want to restore resided prior to deletion.\",\"Prompt_RestoreModule_ResultHtml\":\"

Restore A Module from the Recycle Bin

\\r\\n restore-module 359 --pageid 71\\r\\n\\r\\n

Results

\\r\\n Module with id \\\"359\\\" restored successfully.\",\"Prompt_RestorePage_Description\":\"Restores a page from the DNN Recycle Bin.\",\"Prompt_RestorePage_FlagId\":\"Explicitly specifies the Page ID to delete. Use of the flag name is not required. You can simply provide the ID value as the first argument. Required if --parentid and --name are not specified.\",\"Prompt_RestorePage_FlagName\":\"Specifies the name (not title) of the page that should be restored. This can be combined with --parentid to target a page name with a specific Parent page. Required if --parentid and --name are not specified.\",\"Prompt_RestorePage_FlagParentId\":\"Required if you want to delete a page by name and page is child of some other page. In that case provide the id of the parent page.\",\"Prompt_RestorePage_ResultHtml\":\"
\\r\\n

Restore a Deleted Page By Page ID

\\r\\n \\r\\n restore-page 999\\r\\n \\r\\n OR\\r\\n \\r\\n restore-page --id 999\\r\\n \\r\\n\\r\\n

Restore a Page With A Specific Page Name

\\r\\n \\r\\n restore-page --name \\\"Page1\\\"\\r\\n \\r\\n\\r\\n

Restore a Page With A Specific Page Name and Parent

\\r\\n \\r\\n restore-page --name \\\"Page1\\\" --parentid 30\\r\\n \\r\\n
\",\"Prompt_RestoreUser_Description\":\"Recovers a user that has been deleted but not purged.\",\"Prompt_RestoreUser_FlagId\":\"The user's User ID. If the flag is not used, then the user's ID must be the first argument.\",\"Prompt_RestoreUser_ResultHtml\":\"

Recover a Deleted User

\\r\\n

Restores the user with a User ID of 345. If the user hasn't been deleted, you will receive a message indicating there is nothing to restore. If the user has already been purged (or 'removed' via DNN's user interface, you will receive a 'user not found' message.

\\r\\n restore-user 345\\r\\n

This is the more explicit form of the above code.

\\r\\n restore-user --id 345\",\"Prompt_RecylcleBinCategory\":\"Recycle Bin Commands\",\"UserRestored\":\"User restored successfully.\",\"Prompt_RestoreNotRequired\":\"User not deleted. Restore not required.\",\"Service_RemoveTabParentTabError\":\"Page {0} cannot be deleted until its children have been deleted first.\"},\"Roles\":{\"Create\":\"Create New Role\",\"DuplicateRole\":\"The Role Name Already Exists.\",\"nav_Roles\":\"Roles\",\"SearchPlaceHolder\":\"Search Roles by Keyword\",\"Actions.Header\":\"\",\"AllGroups\":\"[All Groups]\",\"Auto.Header\":\"Auto\",\"GlobalRolesGroup\":\"[Global Roles]\",\"GroupName.Header\":\"Group\",\"LoadMore\":\"Load More\",\"RoleName.Header\":\"Role Name\",\"Users.Header\":\"Users\",\"AutoAssignment\":\"Auto Assignment\",\"Cancel\":\"Cancel\",\"Delete\":\"Delete\",\"Description\":\"Description\",\"NewGroup\":\"New Group\",\"Public\":\"Public\",\"plRoleGroups\":\"Role Group\",\"Save\":\"Save\",\"DuplicateRoleGroup\":\"The Group Name Already Exists.\",\"GroupName.Required\":\"This is a require field.\",\"GroupName\":\"Group Name\",\"RoleName\":\"Role Name\",\"securityModeListLabel\":\"Security Mode\",\"statusListLabel\":\"Status\",\"DeleteRole.Confirm\":\"Are you sure you want to delete this role?\",\"NoData\":\"There are no roles in this role group.\",\"RoleName.Required\":\"This is a require field.\",\"UpdateGroup\":\"Update Group\",\"Add\":\"Add\",\"AddUserPlaceHolder\":\"Begin typing to add a user to this role\",\"Expires.Header\":\"Expires\",\"Members.Header\":\"Members\",\"PageInfo\":\"Page {0} of {1}\",\"PageSummary\":\"Showing {0}-{1} of {2}\",\"Start.Header\":\"Start\",\"Users\":\"Users\",\"NoUsers\":\"There are no users in this role.\",\"Search\":\"Search\",\"DeleteUser.Confirm\":\"Are you sure you want to remove this user from the role?\",\"DeleteRoleGroup.Confirm\":\"Are you sure you want to delete this role group?\",\"Approved\":\"Approved\",\"Both\":\"Both\",\"Disabled\":\"Disabled\",\"Pending\":\"Pending\",\"SecurityRole\":\"Security Role\",\"SocialGroup\":\"Social Group\",\"AssignToExistUsers\":\"Assign to Existing Users\",\"ActionCancelled.Message\":\"Cancelled.\",\"AssignToExistUsers.Help\":\"Assign this role to all existing users.\",\"DeleteInconsistency.Error\":\"Inconsistency occurred. Please refresh the page and try again.\",\"DeleteRole.Error\":\"Failed to delete the role. Please try later\",\"DeleteRole.Message\":\"Role deleted successfully.\",\"DeleteRoleGroup.Error\":\"Failed to delete the role group. Please try later.\",\"DeleteRoleGroup.Message\":\"Role Group deleted successfully.\",\"Description.Help\":\"Enter a description of the role.\",\"lblNewGroup\":\"[New Group]\",\"plRoleGroups.Help\":\"Select the role group to which this role belongs.\",\"PublicRole.Help\":\"Check this box if users can subscribe to this role via the Manage Services page of their user account.\",\"RoleAdded.Error\":\"Failed to create the role. Please try later.\",\"RoleAdded.Message\":\"Role created successfully.\",\"RoleName.Help\":\"Enter the name of the role.\",\"RoleUpdated.Error\":\"Failed to update the role. Please try later.\",\"RoleUpdated.Message\":\"Role updated successfully.\",\"securityModeListLabel.Help\":\"Choose the security mode for this role/group.\",\"statusListLabel.Help\":\"Select the status for this role/group.\",\"RoleGroupUpdated.Error\":\"Failed to update the role group. Please try later.\",\"RoleGroupUpdated.Message\":\"Role Group updated successfully.\",\"AutoAssignment.Help\":\"Check this box if users are automatically assigned to this role.\",\"GroupDescription.Help\":\"Enter a description of the role group.\",\"GroupDescription\":\"Description\",\"GroupName.Help\":\"Enter a name of the role group.\",\"PermissionsByRole\":\"Users In Role\",\"SendEmail\":\"Send Email\",\"isOwner\":\"Is Owner\",\"InSufficientPermissions\":\"You do not have enough permissions to perform this action.\",\"UserNotFound\":\"User not found.\",\"InvalidRequest\":\"Invalid request.\",\"SecurityRoleDeleteNotAllowed\":\"System roles cannot be deleted.\",\"CannotAssginUserToUnApprovedRole\":\"Cannot assign user to an un-approved role.\",\"EditRole\":\"Edit Role\",\"UsersInRole\":\"Users in Role\",\"Prompt_ListRolesFailed\":\"Failed to list the roles.\",\"Prompt_NoRoles\":\"No roles found.\",\"Prompt_FlagEmpty\":\"--{0} cannot be empty.\",\"Prompt_InvalidRoleStatus\":\"Invalid value passed for --{0}. Expecting 'pending', 'approved', or 'disabled'\",\"Prompt_NoRoleWithId\":\"No role found with the ID {0}\",\"Prompt_NothingToUpdate\":\"Nothing to Update!\",\"Prompt_RoleIdIsRequired\":\"You must specify a valid Role ID as either the first argument or using the --id flag.\",\"Prompt_RoleIdNegative\":\"The RoleId value must be greater than zero (0)\",\"Prompt_RoleIdNotInt\":\"The RoleId must be integer.\",\"Prompt_RoleNameRequired\":\"You must specify a name for the role as the first argument or by using the --{0} flag. Names with spaces And special characters should be enclosed in double quotes.\",\"Prompt_UnableToParseBool\":\"Unable to parse the --{0} flag value '{1}'. Value should be True or False\",\"plRSVPCode\":\"RSVP Code\",\"plRSVPCode.Help\":\"Enter an RSVP Code for the role. Users can easily subscribe to this role by entering this code on the Manage Services page of their user account.\",\"plRSVPLink\":\"RSVP Link\",\"plRSVPLink.Help\":\"A link that allows users to subscribe to this role will be displayed when an RSVP Code is saved for this role.\",\"Prompt_DeleteRole_Description\":\"Permanently deletes the given DNN Security Role. You cannot delete the built-in DNN security roles of Administrator, RegisteredUser,\\r\\n Subscriber, or UnverifiedUser. WARNING: This is a permanent action and cannot be undone\",\"Prompt_DeleteRole_FlagId\":\"The ID of the security role to delete. This value is required. However, if you pass the id as the first argument after the command, you do not need to explicitly use the --id flag.\",\"Prompt_DeleteRole_ResultHtml\":\"

Permanently Delete A DNN Security Role

\\r\\n \\r\\n delete-role 11\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
Successfully deleted role 'Public' (11)
\",\"Prompt_GetRole_Description\":\"Retrieves the details of a given DNN Security Role.\",\"Prompt_GetRole_FlagId\":\"The ID of the security role. This value is required. However, if you pass the id as the first argument after the command, you do not need to explicitly use the --id flag.\",\"Prompt_GetRole_ResultHtml\":\"

Get A DNN Security Role

\\r\\n \\r\\n get-role 11\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
RoleId:11
RoleGroupId:-1
RoleName:Public
Description:Role for all users
IsPublic:true
AutoAssign:true
UserCount:5
CreatedDate:2016-12-31T14:53:44.033
CreatedBy:1
ModifiedDate:2017-01-02T08:07:39.233
ModifiedBy:1
1 role found
\",\"Prompt_ListRoles_Description\":\"Retrieves a list of DNN security roles for the portal.\",\"Prompt_ListRoles_FlagMax\":\"Page Size for the page. Max is 500.\",\"Prompt_ListRoles_FlagPage\":\"Page number to show records.\",\"Prompt_ListRoles_ResultHtml\":\"
\\r\\n

Get Information on Current Portal

\\r\\n \\r\\n list-roles\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
RoleIdRoleGroupIdRoleNameDescriptionIsPublicAutoAssignUserCountCreatedDate
0-1AdministratorsAdministrators of this Websitefalsefalse12016-12-01T06:03:11.35
5-1My New RoleA test rolefalsefalse02016-12-15T07:28:16.49
1-1Registered UsersRegistered Usersfalsetrue52016-12-01T06:03:11.357
2-1SubscribersA public role for site subscriptionstruetrue52016-12-01T06:03:11.39
3-1Translator (en-US)A role for English (United States) translatorsfalsefalse02016-12-01T06:03:11.39
4-1Unverified UsersUnverified Usersfalsefalse02016-12-01T06:03:11.393
\\r\\n
\",\"Prompt_NewRole_Description\":\"Creates a new DNN security role for the portal.\",\"Prompt_NewRole_FlagAutoAssign\":\"When true, this role will be automatically assigned to users of the site including existing users.\",\"Prompt_NewRole_FlagDescription\":\"A description of the role.\",\"Prompt_NewRole_FlagIsPublic\":\"When true, users will be able to see the role and assign themselves to the role.\",\"Prompt_NewRole_FlagRoleName\":\"The name of the security role. This value is required. However, if you pass the name as the first argument after the command, you do not need to explicitly use the --name flag.\",\"Prompt_NewRole_FlagStatus\":\"Status of the role. Possible values are \\\"approved\\\", \\\"pending\\\" and \\\"disabled\\\".\",\"Prompt_NewRole_ResultHtml\":\"

Create A New DNN Security Role (Minimum Syntax)

\\r\\n \\r\\n new-role Role1\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
RoleId:9
RoleGroupId:-1
RoleName:Role1
Description:
IsPublic:false
AutoAssign:false
UserCount:0
CreatedDate:2016-12-31T14:53:44.033
Role successfully created.
\\r\\n\\r\\n\\r\\n

Create A New DNN Security Role

\\r\\n \\r\\n new-role \\\"General Public\\\" --description \\\"Role for all users\\\" --public true --autoassign true\\r\\n \\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
RoleId:10
RoleGroupId:-1
RoleName:General Public
Description:Role for all users
IsPublic:true
AutoAssign:true
UserCount:5
CreatedDate:2016-12-31T15:06:02.563
Role successfully created.
\",\"Prompt_SetRole_Description\":\"Sets or updates properties of a DNN Security Role. Only properties you specify will be updated on the role.\",\"Prompt_SetRole_FlagAutoAssign\":\"When true, this role will be automatically assigned to users of the site including existing users.\",\"Prompt_SetRole_FlagDescription\":\"A description of the role.\",\"Prompt_SetRole_FlagId\":\"The ID of the security role. This value is required. However, if you pass the id as the first argument after the command, you do not need to explicitly use the --id flag.\",\"Prompt_SetRole_FlagIsPublic\":\"When true, users will be able to see the role and assign themselves to the role.\",\"Prompt_SetRole_FlagRoleName\":\"The name of the security role.\",\"Prompt_SetRole_FlagStatus\":\"Status of the role. Possible values are \\\"approved\\\", \\\"pending\\\" and \\\"disabled\\\".\",\"Prompt_SetRole_ResultHtml\":\"

Update A DNN Security Role

\\r\\n \\r\\n set-role 10 --name Public\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
RoleId:10
RoleGroupId:-1
RoleName:Public
Description:Role for all users
IsPublic:true
AutoAssign:true
UserCount:5
CreatedDate:2016-12-31T14:53:44.033
Role successfully created.
\",\"Prompt_RolesCategory\":\"Role Commands\"},\"Security\":{\"nav_Security\":\"Security\",\"cmdAdd\":\"Add New Filter\",\"cmdCancel\":\"Cancel Edit\",\"Delete\":\"Delete Filter\",\"Edit\":\"Edit Filter\",\"saveRule\":\"Update Filter\",\"Actions.Header\":\"Actions\",\"IPFilter.Header\":\"IP Filter\",\"AllowIP\":\"Allow\",\"DenyIP\":\"Deny\",\"CannotDelete\":\"You cannot delete that rule, as it would cause the current IP address to be locked out.\",\"TabLoginSettings\":\"Login Settings\",\"TabMoreSecuritySettings\":\"MORE SECURITY SETTINGS\",\"TabMore\":\"More\",\"TabSecurityBulletins\":\"Security Bulletins\",\"TabSecurityAnalyzer\":\"Security Analyzer\",\"TabSslSettings\":\"SSL SETTINGS\",\"TabMemberAccounts\":\"Member Accounts\",\"TabBasicLoginSettings\":\"BASIC LOGIN SETTINGS\",\"TabMemberSettings\":\"MEMBER MANAGEMENT\",\"TabRegistrationSettings\":\"REGISTRATION SETTINGS\",\"TabIpFilters\":\"LOGIN IP FILTERS\",\"DefaultAuthProvider\":\"Default Authentication Provider\",\"DefaultAuthProvider.Help\":\"You can select a default authentication provider for user login. Only providers that support forms authentication can be selected.\",\"plAdministrator\":\"Primary Administrator\",\"plAdministrator.Help\":\"The Primary Administrator who will receive email notification of member activities.\",\"Redirect_AfterLogin.Help\":\"Optionally select the page that users will be redirected to upon successful login.\",\"Redirect_AfterLogin\":\"Redirect After Login\",\"Redirect_AfterLogout.Help\":\"Optionally select the page that users will be redirected to upon logout.\",\"Redirect_AfterLogout\":\"Redirect After Logout\",\"Security_RequireValidProfileAtLogin.Help\":\"Check this box to require users to update their profile prior to login if the fields required for a valid profile have been modified.\",\"Security_RequireValidProfileAtLogin\":\"Require a valid Profile for Login\",\"Security_CaptchaLogin.Help\":\"Check this box to use CAPTCHA for associating logins. E.g. OpenID, LiveID, CardSpace\",\"Security_CaptchaLogin\":\"Use CAPTCHA for Associating Logins\",\"Security_CaptchaRetrivePassword.Help\":\"Check this box to use CAPTCHA when retrieving passwords.\",\"Security_CaptchaRetrivePassword\":\"Use CAPTCHA to Retrieve Password\",\"Security_CaptchaChangePassword.Help\":\"Check this box to use CAPTCHA to change passwords.\",\"Security_CaptchaChangePassword\":\"Use CAPTCHA to Change Password\",\"plHideLoginControl.Help\":\"Check this box to hide the login link in page.\",\"plHideLoginControl\":\"Hide Login Control\",\"BasicLoginSettingsUpdateSuccess\":\"Login settings have been updated.\",\"BasicLoginSettingsError\":\"Could not update login settings. Please try later.\",\"Save\":\"Save\",\"Cancel\":\"Cancel\",\"FilterType.Header\":\"FILTER TYPE\",\"IpAddress.Header\":\"IP ADDRESS\",\"DeleteSuccess\":\"The IP filter has been deleted.\",\"DeleteError\":\"Could not delete the IP filter. Please try later.\",\"IpFilterDeletedWarning\":\"Are you sure you want to delete this IP filter?\",\"Yes\":\"Yes\",\"No\":\"No\",\"plRuleSpecifity.Help\":\"Determines whether the rule applies to a single IP address or a range of IP addresses.\",\"plRuleSpecifity\":\"Rule Specificity\",\"plRuleType.Help\":\"Determines whether this rule allows or denies access.\",\"plRuleType\":\"Rule Type\",\"SingleIP\":\"Single IP\",\"IPRange\":\"IP Range\",\"plFirstIP\":\"First IP\",\"plFirstIP.Help\":\"This will either be the single IP to filter, or else will be used with the subnet mask to calculate a range of IP addresses.\",\"plSubnet\":\"Mask\",\"plSubnet.Help\":\"The subnet mask will be combined with the first IP address to calculate a range of IP addresses for filtering.\",\"IpFilterUpdateSuccess\":\"The IP filter has been updated.\",\"IpFilterUpdateError\":\"Could not update the IP filter. Please try later.\",\"IPFiltersDisabled\":\"Login IP filtering is current disabled. Enable IP address checking under Member Accounts to activate\",\"IPValidation.ErrorMessage\":\"Please use a valid IP address/mask.\",\"LoginSettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"SslSettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"plResetLinkValidity\":\"Reset Link Timeout (in Minutes)\",\"plResetLinkValidity.Help\":\"Password reset links are only valid for (in minutes).\",\"plAdminResetLinkValidity\":\"Administrator Reset Link Timeout (in Minutes)\",\"plAdminResetLinkValidity.Help\":\"Time in minutes that password reset links sent by the Site Administrator will be valid for.\",\"plEnablePasswordHistory.Help\":\"Sets whether a list of recently used passwords is maintained and checked to prevent re-use.\",\"plEnablePasswordHistory\":\"Enable Password History\",\"plNumberPasswords\":\"Number of Passwords to Store\",\"plNumberPasswords.Help\":\"Enter the number of passwords to store for reuse check\",\"plPasswordDays\":\"Number of Days Before Password Reuse\",\"plPasswordDays.Help\":\"Enter the length of time, in days, that must pass before a password can be reused\",\"plEnableBannedList\":\"Enable Password Banned List\",\"plEnableBannedList.Help\":\"Check this box to check passwords against a list of banned items.\",\"plEnableStrengthMeter\":\"Enable Password Strength Checking\",\"plEnableStrengthMeter.Help\":\"Sets whether the password strength meter is shown on registration screen\",\"plEnableIPChecking\":\"Enable IP Address Checking\",\"plEnableIPChecking.Help\":\"Sets whether IP address is checked during login\",\"PasswordConfig_PasswordExpiry.Help\":\"Enter the number of days before a user must change their password. Enter 0 (zero) if the password should never expire.\",\"PasswordConfig_PasswordExpiry\":\"Password Expiry (in Days)\",\"PasswordConfig_PasswordExpiryReminder.Help\":\"Enter the number of days warning users will receive that their password is about to expires.\",\"PasswordConfig_PasswordExpiryReminder\":\"Password Expiry Reminder (in Days)\",\"MemberSettingsUpdateSuccess\":\"The member settings has been updated.\",\"MemberSettingsError\":\"Could not update the member settings. Please try later.\",\"SslSettingsUpdateSuccess\":\"The SSL settings has been updated.\",\"SslSettingsError\":\"Could not update the SSL settings. Please try later.\",\"MemberSettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"MembershipResetLinkValidity.ErrorMessage\":\"Reset link timeouts must be an integer greater than 0 and less than 10000\",\"AdminMembershipResetLinkValidity.ErrorMessage\":\"Administrator reset link timeouts must be an integer greater than 0 and less than 10000.\",\"MembershipNumberPasswords.ErrorMessage\":\"Number of passwords to store must be an integer greater than or equal to 0 and less than 10000.\",\"MembershipDaysBeforePasswordReuse.ErrorMessage\":\"Number of Days Before Password Reuse must be an integer greater than or equal to 0 and less than 10000.\",\"AutoAccountUnlockDuration.ErrorMessage\":\"Auto account unlock duration must be an integer greater than or equal to 0 and less than 1000.\",\"AsyncTimeout.ErrorMessage\":\"Time before timeout must be an integer greater than or equal to 90 and less than 10000.\",\"PasswordExpiry.ErrorMessage\":\"Password expiry must be an integer greater than or equal to 0 and less than 10000.\",\"PasswordExpiryReminder.ErrorMessage\":\"Password expiry reminder must be an integer greater than or equal to 0 and less than 10000.\",\"None\":\"None\",\"Private\":\"Private\",\"Public\":\"Public\",\"Verified\":\"Verified\",\"Standard\":\"Standard\",\"Custom\":\"Custom\",\"plUserRegistration\":\"User Registration\",\"plUserRegistration.Help\":\"Select the type of user registration, if any, allowed for this site. Private registration requires users to be authorized by the Site Administrator before gaining access to the Registered Users role. Public registration provides immediate access and Verified registration requires verification of the email address provided.\",\"NoEmail\":\"The \\\"Email\\\" field, at minimum, must be included.\",\"NoDisplayName\":\"You have selected the Require Unique Display Name option but you have not included the Display Name in the list of fields.\",\"ContainsDuplicateAddresses\":\"The user base of this site contains duplicate email addresses. If you want to use email addresses as user names you must fix those entries first.\",\"registrationFormTypeLabel.Help\":\"Select the type of Registration Form that you want to use.\",\"registrationFormTypeLabel\":\"Registration Form Type\",\"Security_DisplayNameFormat.Help\":\"Optionally specify a format for display names. The format can include tokens for dynamic substitution such as [FIRSTNAME] [LASTNAME]. If a display name format is specified, the display name will no longer be editable through the user interface.\",\"Security_DisplayNameFormat\":\"Display Name Format\",\"Security_UserNameValidation.Help\":\"Add your own Validation Expression, which is used to check the validity of the user name provided. If you change this from the default you should update the message that a user would see when they enter an invalid user name using the localization editor in Settings - Site Settings - Languages.\",\"Security_UserNameValidation\":\"User Name Validation\",\"Security_EmailValidation.Help\":\"Optionally modify the Email Validation Expression which is used to check the validity of the email address provided.\",\"Security_EmailValidation\":\"Email Address Validation\",\"Registration_ExcludeTerms.Help\":\"You can define a comma-delimited list of terms that a user cannot use in their user name or display name.\",\"Registration_ExcludeTerms\":\"Excluded Terms\",\"Redirect_AfterRegistration.Help\":\"Optionally select the page that users will be redirected to upon successful registration.\",\"Redirect_AfterRegistration\":\"Redirect After Registration\",\"plEnableRegisterNotification.Help\":\"Check this box to send email notification of new user registrations to the Primary Administrator.\",\"plEnableRegisterNotification\":\"Receive User Registration Notification\",\"Registration_UseAuthProviders.Help\":\"Select this option to use authentication providers during registration. Note that not all providers support this option.\",\"Registration_UseAuthProviders\":\"Use Authentication Providers\",\"Registration_UseProfanityFilter.Help\":\"Check this box to enforce the profanity filter for the user name and display name fields during registration.\",\"Registration_UseProfanityFilter\":\"Use Profanity Filter\",\"Registration_UseEmailAsUserName.Help\":\"Check this box to use the email address as the user name. If this option is enabled then the user name entry field will not be shown in the registration form.\",\"Registration_UseEmailAsUserName\":\"Use Email Address as Username\",\"Registration_RequireUniqueDisplayName.Help\":\"Optionally require users to use a unique display name. If a user chooses a name that already exists then a modified name will be suggested.\",\"Registration_RequireUniqueDisplayName\":\"Require Unique Display Name\",\"Registration_RandomPassword.Help\":\"Check this box to generate random passwords during registration, rather than displaying a password entry field.\",\"Registration_RandomPassword\":\"Use Random Password\",\"Registration_RequireConfirmPassword.Help\":\"Check this box to display a password confirmation box on the registration form.\",\"Registration_RequireConfirmPassword\":\"Require Password Confirmation\",\"Security_RequireValidProfile.Help\":\"Check this box if users must complete all required fields including the User Name, First Name, Last Name, Display Name, Email Address and Password fields during registration.\",\"Security_RequireValidProfile\":\"Require a Valid Profile for Registration\",\"Security_CaptchaRegister.Help\":\"Indicate whether this site should use CAPTCHA for registration.\",\"Security_CaptchaRegister\":\"Use CAPTCHA for Registration\",\"RequiresUniqueEmail.Help\":\"Check this box to require each user to provide a unique email address. This prevents users from registering multiple times with the same email address.\",\"RequiresUniqueEmail\":\"Requires Unique Email\",\"PasswordFormat.Help\":\"The password format.\",\"PasswordFormat\":\"Password Format\",\"PasswordRetrievalEnabled.Help\":\"Indicates whether users can retrieve their password.\",\"PasswordRetrievalEnabled\":\"Password Retrieval Enabled\",\"PasswordResetEnabledTitle.Help\":\"Indicates whether or not a user can request their password to be reset. This can only be changed in web.config file.\",\"PasswordResetEnabledTitle\":\"Password Reset Enabled\",\"MinNonAlphanumericCharactersTitle.Help\":\"Indicates the minimum number of special characters in the password. This can only be changed in web.config file.\",\"MinNonAlphanumericCharactersTitle\":\"Min Non Alphanumeric Characters\",\"RequiresQuestionAndAnswerTitle.Help\":\"Indicates whether a question and answer system is used as part of the registration process. Can only be changed in web.config file.\",\"RequiresQuestionAndAnswerTitle\":\"Requires Question and Answer\",\"PasswordStrengthRegularExpressionTitle.Help\":\"The regular expression used to evaluate password complexity from the provider specified in the Provider property. This can only be changed in web.config file by adding/altering the passwordStrengthRegularExpression node of AspNetSqlMembershipProvider. Note: this server validation is different from the password strength meter introduced in 7.1.0 which only advises on password strength, whereas this expression is a requirement for new passwords (if it is defined).\",\"PasswordStrengthRegularExpressionTitle\":\"Password Strength Regular Expression\",\"MaxInvalidPasswordAttemptsTitle.Help\":\"Indicates the number of times the wrong password can be entered before account is locked. This can only be changed in web.config file.\",\"MaxInvalidPasswordAttemptsTitle\":\"Max Invalid Password Attempts\",\"PasswordAttemptWindowTitle.Help\":\"Indicates the length of time an account is locked after failed login attempts. Can only be changed in web.config file.\",\"PasswordAttemptWindowTitle\":\"Password Attempt Window\",\"RegistrationSettingsUpdateSuccess\":\"The registration settings has been updated.\",\"RegistrationSettingsError\":\"Could not update the registration settings. Please try later.\",\"RegistrationSettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"registrationFieldsLabel.Help\":\"You can specify the list of fields you want to include as a comma-delimited list. If this setting is used, this will take precedence over the other settings. The possible fields include user name, email, password, confirm password, display name and all the Profile Properties.\",\"registrationFieldsLabel\":\"Registration Fields:\",\"GlobalSettingsTab\":\"This is a global settings Tab. Changes to the settings will affect all of your sites.\",\"GlobalSetting\":\"This is a global setting. Changes to this setting will affect all of your sites.\",\"plSSLEnabled\":\"SSL Enabled\",\"plSSLEnabled.Help\":\"Check the box if an SSL certificate has been installed for use on this site.\",\"plSSLEnforced\":\"SSL Enforced\",\"plSSLEnforced.Help\":\"Check the box if unsecure pages will not be accessible with SSL (HTTPS).\",\"plSSLURL\":\"SSL URL\",\"plSSLURL.Help\":\"Optionally specify a URL which will be used for secure connections for this site. This is only necessary if you do not have an SSL Certificate installed for your standard site URL. An example would be a shared hosting account where the host provides you with a Shared SSL URL.\",\"plSTDURL\":\"Standard URL\",\"plSTDURL.Help\":\"If an SSL URL is specified above, then specify the Standard URL for unsecure connections.\",\"plShowCriticalErrors.Help\":\"This setting determines if error messages sent via the error querystring parameter should be shown inline in the page.\",\"plShowCriticalErrors\":\"Show Critical Errors on Screen\",\"plDebugMode.Help\":\"Check this box to run the installation in \\\"debug mode\\\". This causes various parts of the application to write more verbose error logs etc. Note: This may lead to performance degradation.\",\"plDebugMode\":\"Debug Mode\",\"plRememberMe\":\"Enable Remember Me on Login Control\",\"plRememberMe.Help\":\"Check this box to display the Remember Login check box on the login control that allows users to stay logged in for multiple visits.\",\"plAutoAccountUnlock\":\"Auto-Unlock Accounts After (Minutes)\",\"plAutoAccountUnlock.Help\":\"After an account is locked out due to unsuccessful login attempts, it can be automatically unlocked with a successful authentication after a certain period of time has elapsed. Enter the number of minutes to wait until the account can be automatically unlocked. Enter \\\"0\\\" to disable the auto-unlock feature.\",\"plAsyncTimeout.Help\":\"Set a value that indicates the time, in seconds, before asynchronous postbacks time out if no response is received, the value should between 90-9999 seconds.\",\"plAsyncTimeout\":\"Time Before Timeout (Seconds)\",\"plMaxUploadSize.Help\":\"Maximum size of files that can be uploaded to the site. The minimum is 12 MB.\",\"plMaxUploadSize\":\"Max Upload Size (MB)\",\"maxUploadSize.Error\":\"Maximum upload size must be between 12 and {0}\",\"plFileExtensions.Help\":\"Enter the file extensions (separated by commas) that can be uploaded to the site.\",\"plFileExtensions\":\"Allowable File Extensions:\",\"OtherSettingsUpdateSuccess\":\"Settings has been updated.\",\"OtherSettingsError\":\"Could not update settings. Please try later.\",\"OtherSettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"Bulletins\":\"BULLETINS\",\"BulletinsDoNotExist\":\"There are currently no Security Bulletins for DotNetNuke Platform version {0}.\",\"BulletinsExist\":\"There are currently {0} Security Bulletins for DotNetNuke Platform version {1}:\",\"RequestFailed_Admin\":\"Could Not Connect To {0}. You Should Verify The Source Address Is Valid And That Your Hosting Provider Has Configured Their Proxy Server Settings Correctly.\",\"RequestFailed_User\":\"News Feed Is Not Available At This Time. Error message: \",\"TabAuditChecks\":\"AUDIT CHECKS\",\"TabScannerCheck\":\"SCANNER CHECK\",\"TabSuperuserActivity\":\"SUPERUSER ACTIVITY\",\"SuperUserActivityExplaination\":\"Below are the SuperUser activities. Look for suspicious activities here. Pay close attention to the Creation and Last Login Dates. \",\"Username\":\"USERNAME\",\"CreatedDate\":\"CREATED DATE\",\"LastLogin\":\"LAST LOGIN\",\"LastActivityDate\":\"LAST ACTIVITY DATE\",\"SecurityCheck\":\"SECURITY CHECK\",\"Result\":\"RESULT\",\"Notes\":\"NOTES\",\"AuditChecks\":\"Audit Checks\",\"SuperuserActivity\":\"Super User Activity\",\"CheckDebugFailure\":\"debug is set to true - consider editing web.config and setting it to false (or use the configuration manager)\",\"CheckDebugReason\":\"If the debug attribute is set to true it impacts performance and can reveal security exception details useful to hackers\",\"CheckDebugSuccess\":\"Not in debug mode. This setting depends on debug value in web.config file.\",\"cmdCheck\":\"Check\",\"cmdSearch\":\"Search\",\"plSearchTerm\":\"Search term\",\"cmdModifiedFiles\":\"Find Recently Modified Files\",\"ScannerChecks\":\"Search Filesystem and Database\",\"AuditExplanation\":\"Note: the system automatically perform scans for security best practices\",\"Authorized.Header\":\"Authorized\",\"CheckTracing\":\"Tracing is set to true - consider editing web.config and setting it to false (or use the configuration manager)\",\"CheckTracingReason\":\"If the tracing attribute is set to true it allows potential hackers to view site activity\",\"CheckTracingSuccess\":\"Tracing is not enabled\",\"CreatedDate.Header\":\"Created date\",\"DisplayName.Header\":\"Display name\",\"Email.Header\":\"Email\",\"FirstName.Header\":\"First name\",\"LastActivityDate.Header\":\"Last Activity Date\",\"LastLogin.Header\":\"Last login\",\"LastName.Header\":\"Last name\",\"ScannerExplanation\":\"\",\"Username.Header\":\"Username\",\"CheckBiographyFailure\":\"The field is richtext. Spammers may put links to their website in their biography field.\",\"CheckBiographyReason\":\"The biography field is a common target for spammers as they can add links/html to it. In DNN 7.2.0 this was changed to a multiline textbox which removes this risk.\",\"CheckBiographySuccess\":\"The field is a multiline textbox\",\"CheckRarelyUsedSuperuserFailure\":\"We have found 1 or more superuser accounts that have not been logged in or had activity in six months. Consider deleting them as a best practice\",\"CheckRarelyUsedSuperuserReason\":\"Superuser accounts are the most powerful DNN accounts. As a best practice these should be limited.\",\"CheckRarelyUsedSuperuserSuccess\":\"All superusers are regular users of the system.\",\"CheckSiteRegistrationFailure\":\"One or more websites are using public registration\",\"CheckSiteRegistrationReason\":\"Sites that have public registration enabled are a prime target for spammers.\",\"CheckSiteRegistrationSuccess\":\"All the websites are using non-public registration\",\"CheckSuperuserOldPasswordFailure\":\"At least one superuser account has a password that has not been changed in more than 6 months.\",\"CheckSuperuserOldPasswordReason\":\"Superuser accounts are the most powerful DNN accounts. As a best practice these accounts should have their passwords changed regularly.\",\"CheckSuperuserOldPasswordSuccess\":\"No superuser has a password older than 6 months.\",\"CheckUnexpectedExtensionsFailure\":\"An asp or php extension was found - these may be harmless, but sometimes indicate a site has been exploited and these files are tools. We recommend you evaluate these files carefully.\",\"CheckUnexpectedExtensionsReason\":\"DNN is an asp.net web application. Under normal circumstances other server application extensions such as asp and php should not be in use.\",\"CheckUnexpectedExtensionsSuccess\":\"No unexpected extensions found\",\"CheckViewstatemacFailure\":\"viewstatemac validation is not enabled\",\"CheckViewstatemacReason\":\"A view-state MAC is an encrypted version of the hidden variable that a page's view state is persisted to when the page is sent to the browser. When this property is set to true, the encrypted view state is checked to verify that it has not been tampered with on the client. \\r\\n\",\"CheckViewstatemacSuccess\":\"The viewstate is protected via the usage of a MAC\",\"CheckPurpose.Header\":\"Purpose of the check\",\"Result.Header\":\"Result\",\"Severity.Header\":\"Severity\",\"CheckBiographyName\":\"Check if public profile fields use richtext\",\"CheckDebugName\":\"Check Debug status\",\"CheckRarelyUsedSuperuserName\":\"Check if superuser accounts are rarely active\",\"CheckSiteRegistrationName\":\"Check if site(s) use public registration\",\"CheckSuperuserOldPasswordName\":\"Check if superusers are not regularly changing passwords\",\"CheckTracingName\":\"Check if asp.net tracing is enabled\",\"CheckUnexpectedExtensionsName\":\"Check if asp/php files are found\",\"CheckDefaultPageName\":\"Check if default.aspx or default.aspx.cs files have been modified\",\"CheckDefaultPageFailure\":\"The default page(s) have been modified. We recommend you evaluate these files carefully, they may be modified by a hacker and may contain malicious code. It is best to compare these files with that from a standard install of your product. Ensure that the DNN or Evoq version of your current site matches with the standard site prior to comparison. Either remove the malicious code or restore these files from standard installation.\",\"CheckDefaultPageReason\":\"DNN use default.aspx to load everything, so all requests will load this file when user browse the site, if someone modify this file, it may cause huge risk.\",\"CheckDefaultPageSuccess\":\"The default.aspx and default.aspx.cs pages haven't been modified.\",\"CheckViewstatemacName\":\"Check if viewstate is protected\",\"NoDatabaseResults\":\"Search term was not found in the database\",\"NoFileResults\":\"Search term was not found in any files\",\"SearchTermRequired\":\"Search term is required\",\"CheckTracingFailure\":\"Tracing is enabled - this allows potential hackers to view site activity.\",\"Filename.Header\":\"File Name\",\"LastModifiedDate.Header\":\"Last Modification Date\",\"ModifiedFiles\":\"Recently Modified Files\",\"CheckModuleHeaderAndFooterFailure\":\"There are modules in your system that have header and footer settings, please review them to make sure no phishing code is present.\",\"CheckModuleHeaderAndFooterName\":\"Check Modules have Header or Footer settings\",\"CheckModuleHeaderAndFooterReason\":\"Hackers may use module's header or footer settings to inject content for phishing attacks.\",\"CheckModuleHeaderAndFooterSuccess\":\"No modules were found that had header or footer values configured.\",\"CheckDiskAccessName\":\"Checks extra drives/folders access permission outside the website folder\",\"CheckDiskAccessFailure\":\"Hackers could access drives/folders outside the website\",\"CheckDiskAccessReason\":\"The user which your website is running under has access to drives and folders outside the website location. A hacker could access these files and either read, write, or do both activities.\",\"CheckDiskAccessSuccess\":\"Hackers cannot access drives/folders outside the website\",\"HostSettings\":\"Host Settings\",\"ModifiedSettings\":\"Recently Modified Settings\",\"ModuleSettings\":\"Module Settings\",\"PortalSettings\":\"Portal Settings\",\"TabSettings\":\"Tab Settings\",\"ModifiedSettingsExplaination\":\"\",\"ModifiedFilesExplaination\":\"\",\"ModifiedFilesLoadWarning\":\"Tool will enumerate all files in your system to show the recently changed files. It may take a while on a site with lots of files.\",\"CheckPasswordFormatName\":\"Check Password Format Setting\",\"CheckPasswordFormatFailure\":\"The setting passwordFormat is not set to Hashed in web.config - consider editing web.config and setting it to Hashed (or use the configuration manager). More information can be found here.\",\"CheckPasswordFormatReason\":\"If the value is Clear or Encrypters, hacker can retrieve password from user's password from database.\",\"CheckPasswordFormatSuccess\":\"The passwordFormat is set as Hashed in web.config\",\"CheckAllowableFileExtensionsFailure\":\"Either aspx, asp or php files were found in allowable file extensions setting. This will allow hackers to upload code. Remove these extensions at Settings > More > More security settings > Allowable File Extensions\",\"CheckAllowableFileExtensionsName\":\"Check if there are any harmful extensions allowed by the file uploader\",\"CheckAllowableFileExtensionsReason\":\"Either aspx, asp or php files were found in allowable file extensions setting. This will allow hackers to upload code. Remove these extensions at Settings > More > More security settings > Allowable File Extensions\",\"CheckAllowableFileExtensionsSuccess\":\"The allowable file extensions is setup correctly.\",\"CheckFileExists.Error\":\"Current SQL Server account can execute xp_fileexist which can detect whether files exist on server.\",\"CheckSqlRiskFailure\":\"The current SQL connection can execute dangerous command(s) on your SQL Server.\",\"CheckSqlRiskName\":\"Check Current SQL Account Permission\",\"CheckSqlRiskReason\":\"If the SQL Server account isn't configured properly, it may leave risk and hackers can exploit the server by running special script.\",\"CheckSqlRiskSuccess\":\"The SQL Server account configured correctly.\",\"ExecuteCommand.Error\":\"Current SQL Server account can execute xp_cmdshell which will running command line in sql server system.\",\"GetFolderTree.Error\":\"Current SQL Server account can execute xp_dirtree which can see the server's folders structure.\",\"RegRead.Error\":\"Current SQL Server account can read registry values. You need to check the permissions of xp_regread, xp_regwrite, xp_regenumkeys, xp_regenumvalues, xp_regdeletekey, xp_regdeletekey, xp_regdeletevalue, xp_instance_regread, xp_instance_regwrite, xp_instance_regenumkeys, xp_instance_regenumvalues, xp_instance_regdeletekey, xp_instance_regdeletekey, xp_instance_regdeletevalue stored procedures.\",\"SysAdmin.Error\":\"Current SQL Server account is 'sysadmin'.\",\"HighRiskFiles\":\"High Risk Files\",\"LowRiskFiles\":\"Low Risk Files\",\"Pass\":\"PASS\",\"Fail\":\"FAIL\",\"Alert\":\"ALERT\",\"FileName\":\"FILE NAME\",\"LastWriteTime\":\"LAST MODIFIED DATE\",\"PortalId\":\"PORTAL ID\",\"TabId\":\"TAB ID\",\"ModuleId\":\"MODULE ID\",\"SettingName\":\"SETTING NAME\",\"SettingValue\":\"SETTING VALUE\",\"UserId\":\"USER ID\",\"SearchPlaceHolder\":\"Search\",\"SearchFileSystemResult\":\"File System: {0} Files Found\",\"SearchDatabaseResult\":\"Database: {0} Instances Found\",\"DatabaseInstance\":\"DATABASE INSTANCE\",\"DatabaseValue\":\"VALUE\",\"plSSLOffload\":\"SSL Offload Header Value\",\"plSSLOffload.Help\":\"Set the name of the HTTP header that will be checked to see if a network balancer has used SSL Offloading\",\"BulletinDescription\":\"DESCRIPTION\",\"BulletinLink\":\"LINK\",\"NoneSpecified\":\"None Specified\",\"MinPasswordLengthTitle.Help\":\"Indicates the minimum number of characters in the password. This can only be changed in web.config file.\",\"MinPasswordLengthTitle\":\"Min Password Length\",\"CheckHiddenSystemFilesFailure\":\"There are files marked as system file or hidden in the website folder.\",\"CheckHiddenSystemFilesName\":\"Check Hidden Files\",\"CheckHiddenSystemFilesReason\":\"Hackers may upload rootkits into the website, they marked them as system file or hidden in file system, then you can not see these files in file explorer.\",\"CheckHiddenSystemFilesSuccess\":\"There are no files marked as system file or hidden in the website folder.\",\"plDisplayCopyright.Help\":\"Check this box to add the DNN copyright credits to the page source.\",\"plDisplayCopyright\":\"Show Copyright Credits\",\"CheckTelerikVulnerabilityFailure\":\"The Telerik component vulnerability has not been patched, please go to http://www.dnnsoftware.com/community-blog/cid/155449/critical-security-update--september2017 for detailed information and to download the patch.\",\"CheckTelerikVulnerabilityName\":\"Check if Telerik component has vulnerability.\",\"CheckTelerikVulnerabilityReason\":\"Third party components referenced in core may have vulnerability in old versions and need to be patched.\",\"CheckTelerikVulnerabilitySuccess\":\"Telerik Component already patched.\",\"UserNotMemberOfRole\":\"User not member of {0} role.\",\"NotValid\":\"{0} {1} is not valid.\",\"Empty\":\"{0} should not be empty.\",\"DeletedTab\":\"The tab with this id {0} is deleted.\",\"Disabled\":\"The tab with this id {0} is disable.\",\"Check\":\"[ Check ]\"},\"Seo\":{\"nav_Seo\":\"S E O\",\"URLManagementTab\":\"URL Management\",\"GeneralSettingsTab\":\"GENERAL SETTINGS\",\"ExtensionUrlProvidersTab\":\"EXTENSION URL PROVIDERS\",\"ExpressionsTab\":\"EXPRESSIONS\",\"TestURLTab\":\"TEST URL\",\"SitemapSettingsTab\":\"Sitemap Settings\",\"minusCharacter\":\"\\\"-\\\" e.g. page-name\",\"underscoreCharacter\":\"\\\"_\\\" e.g. page_name\",\"Do301RedirectToPortalHome\":\"Site Home Page\",\"Do404Error\":\"404 Error\",\"ReplacementCharacter\":\"Standard Replacement Character\",\"ReplacementCharacter.Help\":\"Standard Replacement Character\",\"enableSystemGeneratedUrlsLabel\":\"Concatenate Page URLs\",\"enableSystemGeneratedUrlsLabel.Help\":\"You can configure how the system will generate URLs.\",\"enableLowerCaseLabel.Help\":\"Check this box to force URLs to be converted to lowercase.\",\"enableLowerCaseLabel\":\"Convert URLs to Lowercase\",\"autoAsciiConvertLabel.Help\":\"When checked, any accented (diacritic) characters such as å and è will be converted to their plain-ascii equivalent. Example : å -> a and è -> e.\",\"autoAsciiConvertLabel\":\"Convert Accented Characters\",\"setDefaultSiteLanguageLabel.Help\":\"When checked, the default language for this site will always be set in the rewritten URL when no other language is found.\",\"setDefaultSiteLanguageLabel\":\"Set Default Site Language\",\"UrlRewriter\":\"URL REWRITER\",\"UrlRedirects\":\"URL REDIRECTS\",\"plDeletedPages.Help\":\"Select the behavior that should occur when a user browses to a deleted, expired or disabled page.\",\"plDeletedPages\":\"Redirect deleted, expired, disabled pages to\",\"enable301RedirectsLabel.Help\":\"Check this box if you want old \\\"non-friendly\\\" URLs to be redirected to the new URLs.\",\"enable301RedirectsLabel\":\"Redirect to Friendly URLs\",\"redirectOnWrongCaseLabel.Help\":\"When checked, any URL that is not in lower case will be redirected to the lower case version of that URL.\",\"redirectOnWrongCaseLabel\":\"Redirect Mixed Case URLs\",\"GlobalSetting\":\"This is a global setting. Changes to this setting will affect all of your sites.\",\"ignoreRegExLabel.Help\":\"The Ignore URL Regex pattern is used to stop processing of URLs by the URL Rewriting module. This should be used when the URL in question doesn’t need to be rewritten, redirected or otherwise processed through the URL Rewriter. Examples include images, css files, pdf files, service requests and requests for resources not associated with DotNetNuke.\",\"ignoreRegExLabel\":\"Ignore URL Regular Expression\",\"ignoreRegExInvalidPattern\":\"Ignore URL Regular Expression is invalid\",\"RegularExpressions\":\"REGULAR EXPRESSIONS\",\"ExtensionUrlProviders\":\"EXTENSION URL PROVIDERS\",\"SettingsUpdateSuccess\":\"The settings have been updated.\",\"SettingsError\":\"Could not update the settings. Please try later.\",\"SettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"Yes\":\"Yes\",\"No\":\"No\",\"doNotRewriteRegExLabel.Help\":\"The Do Not Rewrite URL regular expression stops URL Rewriting from occurring on any URL that matches. Use this value when a URL is being interpreted as a DotNetNuke page, but should not be.\",\"doNotRewriteRegExLabel\":\"Do Not Rewrite URL Regular Expression\",\"doNotRewriteRegExInvalidPattern\":\"Do Not Rewrite URL Regular Expression is invalid\",\"siteUrlsOnlyRegExInvalidPattern\":\"Site URLs Only Regular Expression is invalid\",\"siteUrlsOnlyRegExLabel.Help\":\"The Site URLs Only regular expression pattern changes the processing order for matching URLs. When matched, the URLs are evaluated against any of the regular expressions in the siteURLs.config file, without first being checked against the list of friendly URLs for the site. Use this pattern to force processing through the siteURLs.config file for an explicit URL Rewrite or Redirect located within that file.\",\"siteUrlsOnlyRegExLabel\":\"Site URLs Only Regular Expression\",\"doNotRedirectUrlRegExInvalidPattern\":\"Do Not Redirect URL Regular Expression is invalid\",\"doNotRedirectUrlRegExLabel.Help\":\"The Do Not Redirect URL regular expression pattern prevents matching URLs from being redirected in all cases. Use this pattern when a URL is being redirected incorrectly.\",\"doNotRedirectUrlRegExLabel\":\"Do Not Redirect URL Regular Expression\",\"doNotRedirectHttpsUrlRegExInvalidPattern\":\"Do Not Redirect Https URL Regular Expression is invalid\",\"doNotRedirectHttpsUrlRegExLabel.Help\":\"The Do Not Redirect https URL regular expression is used to stop unwanted redirects between http and https URLs. It prevents the redirect for any matching URLs, and works both for http->https and https->http redirects.\",\"doNotRedirectHttpsUrlRegExLabel\":\"Do Not Redirect Https URL Regular Expression\",\"preventLowerCaseUrlRegExLabel.Help\":\"The Prevent Lowercase URL regular expression stops the automatic conversion to lower case for any matching URLs. Use this pattern to prevent the lowercase conversion of any URLs which need to remain in mixed/upper case. This is frequently used to stop the conversion of URLs where the contents of the URL contain an encoded character or case-sensitive value.\",\"preventLowerCaseUrlRegExLabel\":\"Prevent Lowercase URL Regular Expression\",\"preventLowerCaseUrlRegExInvalidPattern\":\"Prevent Lowercase URL Regular Expression is invalid\",\"doNotUseFriendlyUrlsRegExLabel.Help\":\"The Do Not Use Friendly URLs regular expression pattern is used to force certain DotNetNuke pages into using a longer URL for the page. This is normally used to generate behaviour for backwards compatibility.\",\"doNotUseFriendlyUrlsRegExLabel\":\"Do Not Use Friendly URLs Regular Expression\",\"doNotUseFriendlyUrlsRegExInvalidPattern\":\"Do Not Use Friendly URLs Regular Expression is invalid\",\"keepInQueryStringRegExInvalidPattern\":\"Keep In Querystring Regular Expression is invalid\",\"keepInQueryStringRegExLabel.Help\":\"The Keep in Querystring regular expression allows the matching of part of the friendly URL Path and ensuring that it stays in the querystring. When a DotNetNuke URL of /pagename/key/value is generated, a ‘Keep in Querystring Regular Expression’ pattern of /key/value will match that part of the path and leave it as part of the querystring for the generated URL; e.g. /pagename?key=value.\",\"keepInQueryStringRegExLabel\":\"Keep in Querystring Regular Expression\",\"urlsWithNoExtensionRegExLabel.Help\":\"The URLs with no Extension regular expression pattern is used to validate URLs that do not refer to a resource on the server, are not DotNetNuke pages, but can be requested with no URL extension. URLs matching this regular expression will not be treated as a 404 when a matching DotNetNuke page can not be found for the URL.\",\"urlsWithNoExtensionRegExLabel\":\"URLs With No Extension Regular Expression\",\"urlsWithNoExtensionRegExInvalidPattern\":\"URLs With No Extension Regular Expression is invalid\",\"validFriendlyUrlRegExLabel.Help\":\"This pattern is used to determine whether the characters that make up a page name or URL segment are valid for forming a friendly URL path. Characters that do not match the pattern will be removed from page names\",\"validFriendlyUrlRegExLabel\":\"Valid Friendly URL Regular Expression\",\"validFriendlyUrlRegExInvalidPattern\":\"Valid Friendly URL Regular Expression is invalid\",\"TestPageUrl\":\"TEST A PAGE URL\",\"TestUrlRewriting\":\"TEST URL REWRITING\",\"selectPageToTestLabel.Help\":\"Select a page for this site to test out the URL generation. You can use the ‘Search’ box to filter the list of pages.\",\"selectPageToTestLabel\":\"Page to Test\",\"NoneSpecified\":\"None Specified\",\"None\":\"None\",\"queryStringLabel.Help\":\"To generate a URL which includes extra information in the path, add on the path information in the form of a querystring. For example, entering &key=value will change the generated URL to include/key/value in the URL path. Use this feature to test out the example URLs generated by third party URLs.\",\"queryStringLabel\":\"Add Query String (optional)\",\"pageNameLabel.Help\":\"Some modules generate a friendly URL by defining the last part of the URL explicitly. If this is the case, enter the value for the ‘pagename’ value that is used when generating the URL. If you have no explicit value, or do not know when to use this value, leave the value empty.\",\"pageNameLabel\":\"Custom Page Name / URL End String (optional)\",\"resultingUrlsLabel\":\"Resulting URLs\",\"resultingUrlsLabel.Help\":\"Shows the list of URLs that can be generated from the selected page, depending on alias and/or language.\",\"TestUrlButtonCaption\":\"Test URL\",\"testUrlRewritingButton\":\"Test URL Rewriting\",\"testUrlRewritingLabel\":\"URL to Test\",\"testUrlRewritingLabel.Help\":\"Enter a fully-qualified URL (including http:// or https://) into this box in order to test out the URL Rewriting / Redirecting.\",\"rewritingResultLabel.Help\":\"Shows the rewritten URL, in the raw format that will be seen by the DNN platform and third-party extensions.\",\"rewritingResultLabel\":\"Rewriting Result\",\"languageLabel.Help\":\"Shows the culture code as identified during the URL Rewriting process.\",\"languageLabel\":\"Identified Language / Culture\",\"identifiedTabLabel.Help\":\"The name of the DNN page that has been identified during the URL Rewriting process.\",\"identifiedTabLabel\":\"Identified Page\",\"redirectionResultLabel.Help\":\"If the tested URL is to be redirected, shows the redirect location of the URL.\",\"redirectionResultLabel\":\"Redirection Result\",\"redirectionReasonLabel.Help\":\"Reason that this URL was redirected\",\"redirectionReasonLabel\":\"Redirection Reason\",\"operationMessagesLabel.Help\":\"Any debug messages created during the test URL Rewriting process.\",\"operationMessagesLabel\":\"Operation Messages\",\"Alias_In_Url\":\"Alias In Url\",\"Built_In_Url\":\"Built In Url\",\"Custom_Tab_Alias\":\"Custom Tab Alias\",\"Deleted_Page\":\"Deleted Page\",\"Diacritic_Characters\":\"Diacritic Characters\",\"Disabled_Page\":\"Disabled Page\",\"Error_Event\":\"Error Event\",\"Exception\":\"Exception\",\"File_Url\":\"File Url\",\"Host_Portal_Used\":\"Host Portal Used\",\"Module_Provider_Redirect\":\"Module Provider Redirect\",\"Module_Provider_Rewrite_Redirect\":\"Module Provider Rewrite Redirect\",\"Not_Redirected\":\"Not Redirected\",\"No_Portal_Alias\":\"No Portal Alias\",\"Page_404\":\"Page 404\",\"Requested_404\":\"Requested 404\",\"Requested_404_In_Url\":\"Requested 404 In Url\",\"Requested_SplashPage\":\"Requested SplashPage\",\"Secure_Page_Requested\":\"Secure Page Requested\",\"SiteUrls_Config_Rule\":\"SiteUrls Config Rule\",\"Site_Root_Home\":\"Site Root Home\",\"Spaces_Replaced\":\"Spaces Replaced\",\"Tab_External_Url\":\"Tab External Url\",\"Tab_Permanent_Redirect\":\"Tab Permanent Redirect\",\"Unfriendly_Url_Child_Portal\":\"Unfriendly Url Child Portal\",\"Unfriendly_Url_TabId\":\"Unfriendly Url TabId\",\"User_Profile_Url\":\"User Profile Url\",\"Wrong_Portal_Alias\":\"Wrong Portal Alias\",\"Wrong_Portal_Alias_For_Browser_Type\":\"Wrong Portal Alias For Browser Type\",\"Wrong_Portal_Alias_For_Culture\":\"Wrong Portal Alias For Culture\",\"Wrong_Portal_Alias_For_Culture_And_Browser\":\"Wrong Portal Alias For Culture And Browser\",\"Wrong_Sub_Domain\":\"Wrong Sub Domain\",\"SitemapSettings\":\"GENERAL SITEMAP SETTINGS\",\"SitemapProviders\":\"SITEMAP PROVIDERS\",\"SiteSubmission\":\"SITE SUBMISSION\",\"sitemapUrlLabel.Help\":\"Submit the Site Map to Google for better search optimization. Click Submit to get a Google Search Console account and verify your site ownership ( using the Verification option below ). Once verified, you can select the Add General Web Sitemap option on the Google Sitemaps tab and paste in the Site Map URL displayed.\",\"sitemapUrlLabel\":\"Sitemap URL\",\"lblCache.Help\":\"Enable this option if you want to cache the Sitemap so it is not generated every time it is requested. This is specially necessary for big sites. If your site has more than 50.000 URLs the Sitemap will be cached with a default value of 1 day. Set this value to 0 to disable the caching.\",\"lblCache\":\"Days to Cache Sitemap For\",\"lnkResetCache\":\"Clear Cache\",\"lblExcludePriority.Help\":\"This option can be used to remove certain pages from the Sitemap. For example you can setup a priority of -1 for a page and enter -1 here to cause the page to not being included in the generated Sitemap.\",\"lblExcludePriority\":\"Exclude URLs With a Priority Lower Than\",\"lblMinPagePriority.Help\":\"When \\\"page level based priorities\\\" is used, minimum priority for pages can be used to set the lowest priority that will be used on low level pages\",\"lblMinPagePriority\":\"Minimum Priority for Pages\",\"lblIncludeHidden.Help\":\"When checked hidden pages (not visible in the menu) will also be included in the Sitemap. The default is not to include hidden pages.\",\"lblIncludeHidden\":\"Include Hidden Pages\",\"lblLevelPriority.Help\":\"When checked, the priority for each page will be computed from the hierarchy level of the page. Top level pages will have a value of 1, second level 0.9, third level 0.8, ... This setting will not change the value stored in the actual page but it will use the computed value when required.\",\"lblLevelPriority\":\"Use Page Level Based Priorities\",\"1Day\":\"1 Day\",\"2Days\":\"2 Days\",\"3Days\":\"3 Days\",\"4Days\":\"4 Days\",\"5Days\":\"5 Days\",\"6Days\":\"6 Days\",\"7Days\":\"7 Days\",\"DisableCaching\":\"Disable Caching\",\"enableSitemapProvider.Help\":\"Enable Sitemap Provider\",\"enableSitemapProvider\":\"Enable Sitemap Provider\",\"overridePriority.Help\":\"Override Priority\",\"overridePriority\":\"Override Priority\",\"Name.Header\":\"NAME\",\"Enabled.Header\":\"Enabled\",\"Priority.Header\":\"Priority\",\"lblSearchEngine.Help\":\"Submit your site to the selected search engine for indexing.\",\"lblSearchEngine\":\"Search Engine\",\"lblVerification.Help\":\"When signing up with Google Search Console you will need to verify your site ownership. Choose the \\\"Upload an HTML File\\\" method from the Google Verification screen. Enter the file name displayed (ie. google53c0cef435b2b81e.html) into the Verification text box and click Create. Return to Google and select the Verify button.\",\"lblVerification\":\"Verification\",\"Submit\":\"Submit\",\"Create\":\"Create\",\"VerificationValidity.ErrorMessage\":\"Valid file name must has an extension .html (ie. google53c0cef435b2b81e.html)\",\"NoExtensionUrlProviders\":\"No extension URL providers found\"},\"Servers\":{\"nav_Servers\":\"Servers\",\"Servers\":\"Servers\",\"tabApplicationTitle\":\"Application\",\"tabDatabaseTitle\":\"Database\",\"tabLogsTitle\":\"Logs\",\"tabPerformanceTitle\":\"Performance\",\"tabServerSettingsTitle\":\"Server Settings\",\"tabSmtpServerTitle\":\"Smtp Server\",\"tabSystemInfoTitle\":\"System Info\",\"tabWebTitle\":\"Web\",\"ServerInfo_Framework.Help\":\"The version of .NET.\",\"ServerInfo_Framework\":\".NET Framework Version:\",\"ServerInfo_HostName.Help\":\"The name of the Host computer.\",\"ServerInfo_HostName\":\"Host Name:\",\"ServerInfo_Identity.Help\":\"The Windows user account under which the application is running. This is the account which needs to be granted folder permissions on the server.\",\"ServerInfo_Identity\":\"ASP.NET Identity:\",\"ServerInfo_IISVersion.Help\":\"The version of Internet Information Server (IIS).\",\"ServerInfo_IISVersion\":\"Web Server Version:\",\"ServerInfo_OSVersion.Help\":\"The version of Windows on the server.\",\"ServerInfo_OSVersion\":\"OS Version:\",\"ServerInfo_PhysicalPath.Help\":\"The physical location of the site root on the server.\",\"ServerInfo_PhysicalPath\":\"Physical Path:\",\"ServerInfo_RelativePath.Help\":\"The relative location of the application in relation to the root of the site.\",\"ServerInfo_RelativePath\":\"Relative Path:\",\"ServerInfo_ServerTime.Help\":\"The current date and time for the web server.\",\"ServerInfo_ServerTime\":\"Server Time:\",\"ServerInfo_Url.Help\":\"The principal URL for this site.\",\"ServerInfo_Url\":\"Site URL:\",\"errorMessageLoadingWebTab\":\"Error loading Web tab\",\"clearCacheButtonLabel\":\"Clear Cache\",\"errorMessageClearingCache\":\"Error trying to Clear Cache\",\"errorMessageLoadingApplicationTab\":\"Error loading Application tab\",\"errorMessageRestartingApplication\":\"Error trying to Restart Application\",\"HostInfo_CachingProvider.Help\":\"The default caching provider for the site.\",\"HostInfo_CachingProvider\":\"Caching Provider:\",\"HostInfo_FriendlyUrlEnabled.Help\":\"Displays whether Friendly URLs are enabled for the site.\",\"HostInfo_FriendlyUrlEnabled\":\"Friendly URLs Enabled:\",\"HostInfo_FriendlyUrlProvider.Help\":\"The default Friendly URL provider for the site.\",\"HostInfo_FriendlyUrlProvider\":\"Friendly URL Provider:\",\"HostInfo_FriendlyUrlType.Help\":\"Displays the type of Friendly URLs used for the site.\",\"HostInfo_FriendlyUrlType\":\"Friendly URL Type:\",\"HostInfo_HtmlEditorProvider.Help\":\"The default HTML Editor provider for the site.\",\"HostInfo_HtmlEditorProvider\":\"HTML Editor Provider:\",\"HostInfo_LoggingProvider.Help\":\"The default logging provider for the site.\",\"HostInfo_LoggingProvider\":\"Logging Provider:\",\"HostInfo_Permissions.Help\":\"The Code Access Security (CAS) Permissions available for this site.\",\"HostInfo_Permissions\":\"CAS Permissions:\",\"HostInfo_SchedulerMode.Help\":\"The mode set for the Schedule. The Timer Method maintains a separate thread to execute scheduled tasks while the worker process is alive. Alternatively, the Request Method executes tasks when HTTP Requests are made. The scheduler can also be disabled.\",\"HostInfo_SchedulerMode\":\"Scheduler Mode:\",\"HostInfo_WebFarmEnabled.Help\":\"Indicates whether the site operates in Web Farm mode. \",\"HostInfo_WebFarmEnabled\":\"Web Farm Enabled:\",\"infoMessageClearingCache\":\"Clearing Cache\",\"infoMessageRestartingApplication\":\"Restarting Application\",\"plDataProvider.Help\":\"The default data provider for this application.\",\"plDataProvider\":\"Data Provider:\",\"plGUID.Help\":\"The globally unique identifier which can be used to identify this application.\",\"plGUID\":\"Host GUID:\",\"plProduct.Help\":\"The application you are running\",\"plProduct\":\"Product:\",\"plVersion.Help\":\"The version of this application.\",\"plVersion\":\"Version:\",\"restartApplicationButtonLabel\":\"Restart Application\",\"UserRestart\":\"User triggered an Application Restart\",\"DbInfo_ProductEdition.Help\":\"The edition of SQL Server installed.\",\"DbInfo_ProductEdition\":\"Product Edition:\",\"DbInfo_ProductVersion.Help\":\"The version of SQL Server\",\"DbInfo_ProductVersion\":\"Database Version:\",\"DbInfo_ServicePack.Help\":\"Installed service pack(s).\",\"DbInfo_ServicePack\":\"Service Pack:\",\"DbInfo_SoftwarePlatform.Help\":\"The full description of the SQL Server Software Platform installed.\",\"DbInfo_SoftwarePlatform\":\"Software Platform:\",\"errorMessageLoadingDatabaseTab\":\"Error loading Database tab\",\"BackupFinished\":\"Finished\",\"BackupName\":\" Backup Name\",\"BackupSize\":\"Size (Kb)\",\"BackupStarted\":\"Started\",\"BackupType\":\"Backup Type\",\"FileName\":\"File Name\",\"FileType\":\"File Type\",\"Name\":\"Name\",\"NoBackups\":\"This database has not been backed up.\",\"plBackups\":\"Database Backup History:\",\"plFiles\":\"Database Files:\",\"Size\":\"Size\",\"EmailTest\":\"Test SMTP Settings\",\"errorMessageLoadingSmtpServerTab\":\"Error loading Smtp Server tab\",\"GlobalSettings\":\"These are global settings. Changes to the settings will affect all of your sites.\",\"GlobalSmtpHostSetting\":\"Global\",\"plBatch.Help\":\"The number of messages sent by the messaging scheduler in each batch.\",\"plBatch\":\"Number of messages sent in each batch:\",\"plConnectionLimit.Help\":\"The maximum number of connections allowed on this ServicePoint object. Max value is 2147483647. Default is 2.\",\"plConnectionLimit\":\"Connection Limit:\",\"plMaxIdleTime.Help\":\"The length of time, in milliseconds, that a connection associated with the ServicePoint object can remain idle before it is closed and reused for another connection. Max value is 2147483647. Default is 100,000 (100 seconds).\",\"plMaxIdleTime\":\"Max Idle Time:\",\"plSMTPAuthentication.Help\":\"Enter the SMTP server authentication method. Default is Anonymous.\",\"plSMTPAuthentication\":\"SMTP Authentication:\",\"plSMTPEnableSSL.Help\":\"Used for SMTP services that require secure connection. This setting is typically not required.\",\"plSMTPEnableSSL\":\"SMTP Enable SSL:\",\"plSMTPMode.Help\":\"Host mode utilizes all SMTP settings set at the application level. Site level allows you to select your own SMTP server, port and authentication method.\",\"plSMTPMode\":\"SMTP Server Mode:\",\"plSMTPPassword.Help\":\"Enter the password for the SMTP server.\",\"plSMTPPassword\":\"SMTP Password:\",\"plSMTPServer.Help\":\"Please enter the name (address) and port of the SMTP server to be used for sending mails from this site.\",\"plSMTPServer\":\"SMTP Server and port:\",\"plSMTPUsername.Help\":\"Enter the user name for the SMTP server.\",\"plSMTPUsername\":\"SMTP Username:\",\"SaveButtonText\":\"Save\",\"SiteSmtpHostSetting\":\"{0}\",\"SMTPAnonymous\":\"Anonymous\",\"SMTPBasic\":\"Basic\",\"SMTPNTLM\":\"NTLM\",\"errorMessageLoadingLog\":\"Error loading log.\",\"errorMessageLoadingLogsTab\":\"Error loading Logs Tab\",\"Logs_LogFiles\":\"Log Files:\",\"Logs_LogFilesDefaultOption\":\"Please select a log file to view\",\"Logs_LogFilesTooltip\":\"List of log files available to view.\",\"errorMessageUpdatingSmtpServerTab\":\"Error updating Smtp Server settings\",\"errorMessageLoadingPerformanceTab\":\"Error loading Performance Tab\",\"PerformanceTab_CacheSetting.Help\":\"Select how to optimize performance.\",\"PerformanceTab_CacheSetting\":\"Cache Setting\",\"PerformanceTab_Heavy\":\"Heavy\",\"PerformanceTab_Light\":\"Light\",\"PerformanceTab_Memory\":\"Memory\",\"PerformanceTab_Moderate\":\"Moderate\",\"PerformanceTab_None\":\"None\",\"PerformanceTab_Page\":\"Page\",\"PerformanceTab_PageStatePersistenceMode.Help\":\"Select the mode to use to persist a page's state. This can either be a hidden field on the Page (Default) or in Memory (Cache).\",\"PerformanceTab_PageStatePersistenceMode\":\"Page State Persistence:\",\"PerformanceTab_AuthCacheability.Help\":\"Sets the Cache-Control HTTP header value for authenticated users.\",\"PerformanceTab_AuthCacheability\":\"Authenticated Cacheability\",\"PerformanceTab_CachingProvider.Help\":\"Caching Provider\",\"PerformanceTab_CachingProvider\":\"Caching Provider\",\"PerformanceTab_ClientResourceManagementInfo\":\"The Super User dictates the default Client Resource Management behavior, but if you choose to do so, you may configure your site to behave differently. The host-level settings are currently set as follows:\",\"PerformanceTab_ClientResourceManagementTitle\":\"Client Resource Management\",\"PerformanceTab_ClientResourcesManagementMode.Help\":\"Host mode utilizes all Client Resources Management settings set at the application level. Site level allows you to select your own Client Resources Management settings.\",\"PerformanceTab_ClientResourcesManagementMode\":\"Client Resources Management Mode\",\"PerformanceTab_CurrentHostVersion\":\"Current Host Version:\",\"PerformanceTab_EnableCompositeFiles.Help\":\"Composite files are combinations of resources (JavaScript and CSS) created to reduce the number of file requests by the browser. This will significantly increase the page loading speed.\",\"PerformanceTab_EnableCompositeFiles\":\"Enable Composite Files\",\"PerformanceTab_GlobalClientResourcesManagementMode\":\"Global\",\"PerformanceTab_IncrementVersion\":\"Increment Version\",\"PerformanceTab_MinifyCss.Help\":\"CSS minification will reduce the size of the CSS code by using regular expressions to remove comments, whitespace and \\\"dead CSS\\\". It is only available when composite files are enabled.\",\"PerformanceTab_MinifyCss\":\"Minify CSS\",\"PerformanceTab_MinifyJs.Help\":\"JS minification will reduce the size of the JavaScript code using JSMin. It is only available when composite files are enabled.\",\"PerformanceTab_MinifyJs\":\"Minify JS\",\"PerformanceTab_ModuleCacheProviders.Help\":\"Select the default module caching provider. This setting can be overridden by each individual module.\",\"PerformanceTab_ModuleCacheProviders\":\"Module Cache Provider\",\"PerformanceTab_PageCacheProviders.Help\":\"Select the default Page Caching Provider. The caching provider must be enabled by setting the cache timeout on each page.\",\"PerformanceTab_PageCacheProviders\":\"Page Output Cache Provider\",\"PerformanceTab_SiteClientResourcesManagementMode\":\"My Website {0}\",\"PerformanceTab_SslForCacheSyncrhonization.Help\":\"By default, cache synchronization will happen over http. To use SSL for cache synchronization messages, please check this.\",\"PerformanceTab_SslForCacheSyncrhonization\":\"SSL for Cache Synchronization\",\"PerformanceTab_UnauthCacheability.Help\":\"Sets the Cache-Control HTTP header value for unauthenticated users.\",\"PerformanceTab_UnauthCacheability\":\"Unauthenticated Cacheability\",\"EmailSentMessage\":\"Email sent successfully from {0} to {1}\",\"errorMessageSendingTestEmail\":\"There has been an error trying to send the test email\",\"NoIntegerValueError\":\"Must be a positive integer value.\",\"PerformanceTab_CurrentPortalVersion\":\"Site Version:\",\"errorMessageIncrementingVersion\":\"Error incrementing the version number.\",\"errorMessageSavingPerformanceSettingsTab\":\"Error saving performance settings\",\"PerformanceTab_AjaxWarning\":\"Warning: Memory page state persistence can cause Ajax issues.\",\"PerformanceTab_MinifactionWarning\":\"Important note regarding minification settings.
\\r\\nIf minification settings are changed when composite files are enabled, you must first save the minification settings by clicking Save and then increment the version number. This will issue new composite files using the new minification settings.\",\"PerformanceTab_PortalVersionConfirmMessage\":\"This action will force all site visitors to download new versions of CSS and JavaScript files. You should only do this if you are certain that the files have changed and you want those changes to be reflected on the client's browser.\\r\\n\\r\\nAre you sure you want to increment the version number for your site?\",\"PerformanceTab_PortalVersionConfirmNo\":\"No\",\"PerformanceTab_PortalVersionConfirmYes\":\"Yes\",\"SaveConfirmationMessage\":\"Saved successfully\",\"VersionIncrementedConfirmation\":\"Version incremented successfully\"},\"SiteImportExport\":{\"nav_SiteImportExport\":\"Import / Export\",\"SiteImportExport.Header\":\"Import / Export\",\"ImportButton\":\"Import Data\",\"ExportButton\":\"Export Data\",\"LastImport\":\"Last Import\",\"LastExport\":\"Last Export\",\"LastUpdate\":\"Last Update\",\"JobDate.Header\":\"Date\",\"JobType.Header\":\"Type\",\"JobUser.Header\":\"Username\",\"JobPortal.Header\":\"Website\",\"JobStatus.Header\":\"Status\",\"LegendExport\":\"Site Export\",\"LegendImport\":\"Site Import\",\"LogSection\":\"Import / Export Log\",\"ShowSiteLabel\":\"Site: \",\"ShowFilterLabel\":\"Filter: \",\"JobTypeAll\":\"All Imports and Exports\",\"JobTypeImport\":\"All Imports\",\"JobTypeExport\":\"All Exports\",\"SearchPlaceHolder\":\"Search by Keyword\",\"SummaryNoteTitle\":\"*Note:\",\"SummaryNoteDescription\":\"Your site export files are securely stored within your website's App_Data/ExportImport folder.\",\"ExportSummary\":\"Export Summary\",\"NoJobs\":\"No jobs found\",\"BackToImportExport\":\"Back to Import / Export\",\"Export\":\"Export Data\",\"Import\":\"Import Data\",\"ExportSettings\":\"Export Settings\",\"Site\":\"Site\",\"Description\":\"Description\",\"Name\":\"Name\",\"IncludeInExport\":\"Include in Export\",\"PagesInExport\":\"Pages in Export\",\"BeginExport\":\"Begin Export\",\"Cancel\":\"Cancel\",\"Content\":\"Content\",\"ProfileProperties\":\"Profile Properties\",\"Permissions\":\"Permissions\",\"Extensions\":\"Extensions\",\"DeletionsInExport\":\"Include Deletions\",\"ExportName.ErrorMessage\":\"Name is required.\",\"ExportRequestSubmitted\":\"Your data export has been placed in the queue, and will begin shortly.\",\"ExportRequestSubmit.ErrorMessage\":\"Failed to submit the export site request. Please try again.\",\"ImportRequestSubmitted\":\"Your data import has been placed in the queue, and will begin shortly.\",\"ImportRequestSubmit.ErrorMessage\":\"Failed to submit the import site request. Please try again.\",\"JobStatus0\":\"Submitted\",\"JobStatus1\":\"In Progress\",\"JobStatus2\":\"Completed\",\"JobStatus3\":\"Failed\",\"JobStatus4\":\"Cancelled\",\"CreatedOn\":\"Created On\",\"CompletedOn\":\"Completed On\",\"ExportFile\":\"Export File\",\"lblLanguages.Help\":\"Select each of the secondary languages to be included in a multi-language template, or select the language of a single language site.\",\"lblLanguages\":\"Export Languages\",\"lblSelectLanguages\":\"-- Select Languages --\",\"lblNote\":\"The default language ({0}) will always be exported.\",\"AllSites\":\"--ALL SITES--\",\"SelectImportPackage\":\"Select Package to Import\",\"ClicktoSelect\":\"click to select package\",\"ClicktoDeselect\":\"click to deselect package\",\"PackageDescription\":\"Package Description\",\"Continue\":\"Continue\",\"NoPackages\":\"No import packages found\",\"SelectException\":\"Please select an import package and try again.\",\"AnalyzingPackage\":\"Analyzing Package for Site Import ...\",\"AnalyzedPackage\":\"Files Verified\",\"ImportSummary\":\"Import Summary\",\"Pages\":\"Pages\",\"Users\":\"Users\",\"UsersStep1\":\"Users (Step 1 / 2)\",\"UsersStep2\":\"Users (Step 2 / 2)\",\"Roles\":\"Roles and Groups\",\"Vocabularies\":\"Vocabularies\",\"PageTemplates\":\"Page Templates\",\"IncludeProfileProperties\":\"Include Profile Properties\",\"IncludePermissions\":\"Include Permissions\",\"IncludeExtensions\":\"Include Extensions\",\"IncludeDeletions\":\"Include Deletions\",\"IncludeContent\":\"Include Content\",\"FolderName\":\"Folder Name\",\"Timestamp\":\"Timestamp\",\"Assets\":\"Assets\",\"TotalExportSize\":\"Total Export Size\",\"ExportMode\":\"Export Mode\",\"OverwriteCollisions\":\"Overwrite Collisions\",\"FinishImporting\":\"To finish importing data to your site, click continue below, or click cancel to abort import.\",\"ExportModeComplete\":\"Full\",\"ExportModeDifferential\":\"Differential\",\"ConfirmCancel\":\"Yes, Cancel\",\"ConfirmDelete\":\"Yes, Remove\",\"KeepImport\":\"No\",\"Yes\":\"Yes\",\"No\":\"No\",\"CancelExport\":\"Cancel Export\",\"CancelImport\":\"Cancel Import\",\"CancelImportMessage\":\"Cancelling will abort the import process. Are you sure you want to cancel?\",\"Delete\":\"Delete\",\"JobCancelled\":\"Job has been cancelled.\",\"JobDeleted\":\"Job has been removed.\",\"JobCancel.ErrorMessage\":\"Failed to cancel this job, please try again.\",\"JobDelete.ErrorMessage\":\"Failed to remove this job, please try again.\",\"CancelJobMessage\":\"Cancelling will abort the process. Are you sure you want to cancel?\",\"DeleteJobMessage\":\"Are you sure you want to remove this job?\",\"SortByDateNewest\":\"Date (Newest)\",\"SortByDateOldest\":\"Date (Oldest)\",\"SortByName\":\"Name (Alphabetical)\",\"ShowSortLabel\":\"Sort By:\",\"Website\":\"Website\",\"Mode\":\"Mode\",\"FileSize\":\"Size\",\"VerifyPackage\":\"Just a moment, we are checking the package ...\",\"DeletedPortal\":\"Deleted\",\"RunNow\":\"Run Now\",\"NoExportItem.ErrorMessage\":\"Failed to submit the export site request. Please select export item(s) and try again.\",\"EmptyDateTime\":\"-- --\",\"SwitchOn\":\"On\",\"SwitchOff\":\"Off\"},\"EvoqSites\":{\"BasicSettings\":\"Basic configuration\",\"cmdCancel\":\"Cancel\",\"cmdExport\":\"Create Template\",\"ControlTitle_template\":\"Create Site Template\",\"DefaultLanguage\":\"{0} is the default language of the selected site\",\"ErrorPages\":\"You must select at least one page to be exported.\",\"ExportedMessage\":\"The new site template has been saved in folder:
{0}\",\"lblAdminOnly\":\"Visible to Administrators only\",\"lblDisabled\":\"Page is disabled\",\"lblEveryone\":\"Page is visible to everyone\",\"lblFiles.Help\":\"Check this box to export all site files and folders when creating the new template.\",\"lblFiles\":\"Include Files\",\"lblHidden\":\"Page is hidden in menu\",\"lblHome\":\"Homepage of the site\",\"lblLanguages.Help\":\"Select each of the secondary languages to be included in a multi-language template, or select the language of a single language site.\",\"lblLanguages\":\"Export Languages\",\"lblModules.Help\":\"Check this box to include module deploy permissions in the exported template. If this option is selected, it may also be necessary to export Roles if any custom roles has deployment permissions.\",\"lblModules\":\"Include Module Deployment Permissions\",\"lblMultilanguage.Help\":\"Check this box to create a template for a multi-language site and select each language to be included in addition to the default language.\",\"lblMultilanguage\":\"Export As Multilingual Site\",\"lblNote\":\"The default language ({0}) will always be exported.\",\"lblNoteSingleLanguage\":\"Note: the default language is {0}\",\"lblPages.Help\":\"Select the pages to be exported.
If you intend to use the exported template to create a new site, please be sure to select all, or selected Admin pages. If no Admin pages are available in the template, the new site will not have an Admin menu.\",\"lblPages\":\"Pages to Export\",\"lblProfile.Help\":\"Check this box to include custom profile property definitions in the template.\",\"lblProfile\":\"Include Profile Properties\",\"lblRedirect\":\"Page redirection\",\"lblRegistered\":\"Visible to registered users\",\"lblRoles.Help\":\"Check this box to export all security roles when creating the new template.\",\"lblRoles\":\"Include Roles\",\"lblSecure\":\"Visible to dedicated roles only\",\"lblSelectLanguages\":\"-- Select Languages --\",\"ModuleHelp\":\"

About Templates

Allows you to export a site template to be used to build new sites.

\",\"nav_Sites\":\"Sites\",\"plContent.Help\":\"Check this box to include the content within iPortable modules.\",\"plContent\":\"Include Content\",\"plDescription.Help\":\"Enter a description for the template file.\",\"plDescription\":\"Template Description\",\"plPortals.Help\":\"Select the site to export.\",\"plPortals\":\"Site\",\"plTemplateName.Help\":\"Enter a name for the template file to be created.\",\"plTemplateName\":\"Template File Name\",\"PortalSetup\":\"Site Setup\",\"Settings\":\"Advanced Configuration\",\"titleTemplateInfo\":\"Site Template Info\",\"valDescription.ErrorMessage\":\"Template description is required.\",\"valFileName.ErrorMessage\":\"Template file name is required.\",\"SiteDetails_Pages\":\"Pages\",\"SiteDetails_SiteID\":\"Site ID\",\"SiteDetails_Updated\":\"Updated\",\"SiteDetails_Users\":\"Users\",\"CancelPortalDelete\":\"No\",\"ConfirmPortalDelete\":\"Yes\",\"deletePortal\":\"Are you sure you want to delete {0}?\",\"AddNewSite.Header\":\"Add New Site\",\"AssignCurrentUserAsAdmin.Label\":\"Assign Current User as Administrator\",\"cmdCreateSite\":\"Create Site\",\"Description.Label\":\"Description\",\"Directory\":\"Directory\",\"Domain\":\"Domain\",\"HomeDirectory.Label\":\"Home Directory\",\"SiteTemplate.Label\":\"Site Template\",\"SiteType.Label\":\"Site Type:\",\"SiteUrl.Label\":\"Site URL\",\"Title.Label\":\"Title\",\"SiteGroups.TabHeader\":\"Site Groups\",\"SiteGroups_AdditionalSites.ErrorMessage\":\"You will need to create additional sites in order to create a Site Group.\",\"SiteGroups_Info.HelpText\":\"A Site Group will allow you to connect multiple sites for the purpose of sharing user account and profile information. Users will be able to access each site with a single account and also remain authenticated when navigating between sites. Before you create your first Site Group, please make sure that you have created the necessary sites and that if you want to use Single Sign On those sites use the same top-level domain name.\",\"Sites.TabHeader\":\"Sites\",\"SiteDetails_SiteGroup\":\"Site Group\",\"CreateSiteGroup_Create.Button\":\"Create Site Group\",\"EditSiteGroup_AddNew.Button\":\"Add Site Group\",\"EditSiteGroup_AuthenticationDomain.HelpText\":\"If you want to provide a single sign on (SSO) between the different sites in the site group, enter the common domain here. \\r\\nNB: SSO only works if all member sites share a common domain.\",\"EditSiteGroup_AuthenticationDomain.Label\":\"Authentication Domain\",\"EditSiteGroup_Delete.Button\":\"Delete\",\"EditSiteGroup_DeletePortalGroup.Cancel\":\"Cancel\",\"EditSiteGroup_DeletePortalGroup.Confirm\":\"Delete\",\"EditSiteGroup_DeletePortalGroup.Warning\":\"Are you sure you want to delete the portal group {0}?\",\"EditSiteGroup_Description.HelpText\":\"Enter a description for the Site Group\",\"EditSiteGroup_Description.Label\":\"Description\",\"EditSiteGroup_MasterSite.HelpText\":\"The master site is the site which is used to authenticate the shared users.\",\"EditSiteGroup_MasterSite.Label\":\"Master Site\",\"EditSiteGroup_MemberSites.HelpText\":\"You can manage the members of this site group using the list boxes on the right.\",\"EditSiteGroup_MemberSites.Label\":\"Member Sites\",\"EditSiteGroup_Name.HelpText\":\"Enter a name for the Site Group\",\"EditSiteGroup_Name.Label\":\"Name\",\"EditSiteGroup_Save.Button\":\"Save\",\"EditSiteGroup_ConfirmRemoval.Warning\":\"The following changes will be made when removing the site. Are you sure you want to continue?\",\"EditSiteGroup_RemoveUsersFromGroup.Cancel\":\"No\",\"EditSiteGroup_RemoveUsersFromGroup.Confirm\":\"Yes\",\"EditSiteGroup_RemoveUsersFromGroup.Warning\":\"Do you want to remove all users from Member Site when removing the site?\",\"EditSiteGroup_RemoveWithoutUsers.Info\":\"
    \\r\\n
  • Remove all modules shared by this site
  • \\r\\n
  • Remove all modules added to this site from another group sites
  • \\r\\n
\",\"EditSiteGroup_RemoveWithUsers.Info\":\"
    \\r\\n
  • Remove all users from the Member Site
  • \\r\\n
  • Remove all modules shared by this site
  • \\r\\n
  • Remove all modules added to this site from another group sites
  • \\r\\n
\",\"SiteGroup_FormDirty.Cancel\":\"No\",\"SiteGroup_FormDirty.Confirm\":\"Yes\",\"SiteGroup_FormDirty.Warning\":\"You have unsaved changes. Are you sure you want to continue?\",\"Close\":\"Close\",\"SiteExport\":\"Site Export\",\"SiteImport\":\"Site Import\",\"AddNewSite\":\"Add New Site\",\"Description\":\"Description\",\"Sites\":\"Sites\",\"None\":\"None\",\"AddToSiteGroup\":\"Add To Site Group\",\"NoSiteGroupsYet\":\"You don't have any site groups yet\",\"OnceAddedYouCanView\":\"Once added you can view all your site groups here.\",\"NoneSpecified\":\"None Specified\",\"valGroupName.ErrorMessage\":\"Group name is required.\",\"valGroupDescription.ErrorMessage\":\"Group description is required.\",\"AddRemoveSites\":\"Add / Remove Sites\"},\"Sites\":{\"BasicSettings\":\"Basic configuration\",\"cmdCancel\":\"Cancel\",\"cmdExport\":\"Create Template\",\"ControlTitle_template\":\"Create Site Template\",\"DefaultLanguage\":\"{0} is the default language of the selected site\",\"ErrorPages\":\"You must select at least one page to be exported.\",\"ExportedMessage\":\"The new site template has been saved in folder:
{0}\",\"ErrorAncestorPages\":\"You must select all ancestors from root level in order to include a child page.\",\"ChildExists\":\"The child site name you specified already exists. Please enter a different child site name.\",\"DuplicatePortalAlias\":\"The site alias name you specified already exists. Please choose a different site alias.\",\"DuplicateWithTab\":\"There is already a page with the same name as you entered for the site alias for this site. Please change the site alias and try again.\",\"InvalidHomeFolder\":\"The home folder you specified is not valid.\",\"InvalidName\":\"The site alias must not contain spaces or punctuation.\",\"InvalidPassword\":\"The password values entered do not match.\",\"SendMail.Error\":\"There was an error sending confirmation emails - {0} However, the site was created. Click Here To Access The New Site\",\"UnknownEmailAddress.Error\":\"There is no email address set on Site and/or Host level.\",\"UnknownSendMail.Error\":\"There was an error sending confirmation emails, however the site was still created. Click Here To Access The New Site\",\"lblAdminOnly\":\"Visible to Administrators only\",\"lblDisabled\":\"Page is disabled\",\"lblEveryone\":\"Page is visible to everyone\",\"lblFiles.Help\":\"Check this box to export all site files and folders when creating the new template.\",\"lblFiles\":\"Include Files\",\"lblHidden\":\"Page is hidden in menu\",\"lblHome\":\"Homepage of the site\",\"lblLanguages.Help\":\"Select each of the secondary languages to be included in a multi-language template, or select the language of a single language site.\",\"lblLanguages\":\"Export Languages\",\"lblModules.Help\":\"Check this box to include module deploy permissions in the exported template. If this option is selected, it may also be necessary to export Roles if any custom roles has deployment permissions.\",\"lblModules\":\"Include Module Deployment Permissions\",\"lblMultilanguage.Help\":\"Check this box to create a template for a multi-language site and select each language to be included in addition to the default language.\",\"lblMultilanguage\":\"Export As Multilingual Site\",\"lblNote\":\"The default language ({0}) will always be exported.\",\"lblNoteSingleLanguage\":\"Note: the default language is {0}\",\"lblPages.Help\":\"Select the pages to be exported.
If you intend to use the exported template to create a new site, please be sure to select all, or selected Admin pages. If no Admin pages are available in the template, the new site will not have an Admin menu.\",\"lblPages\":\"Pages to Export\",\"lblProfile.Help\":\"Check this box to include custom profile property definitions in the template.\",\"lblProfile\":\"Include Profile Properties\",\"lblRedirect\":\"Page redirection\",\"lblRegistered\":\"Visible to registered users\",\"lblRoles.Help\":\"Check this box to export all security roles when creating the new template.\",\"lblRoles\":\"Include Roles\",\"lblSecure\":\"Visible to dedicated roles only\",\"lblSelectLanguages\":\"-- Select Languages --\",\"ModuleHelp\":\"

About Templates

Allows you to export a site template to be used to build new sites.

\",\"nav_Sites\":\"Sites\",\"plContent.Help\":\"Check this box to include the content within iPortable modules.\",\"plContent\":\"Include Content\",\"plDescription.Help\":\"Enter a description for the template file.\",\"plDescription\":\"Template Description\",\"plPortals.Help\":\"Select the site to export.\",\"plPortals\":\"Site\",\"plTemplateName.Help\":\"Enter a name for the template file to be created.\",\"plTemplateName\":\"Template File Name\",\"PortalSetup\":\"Site Setup\",\"Settings\":\"Advanced Configuration\",\"titleTemplateInfo\":\"Site Template Info\",\"valDescription.ErrorMessage\":\"Template description is required.\",\"valFileName.ErrorMessage\":\"Template file name is required.\",\"SiteDetails_Pages\":\"Pages\",\"SiteDetails_SiteID\":\"Site ID\",\"SiteDetails_Updated\":\"Updated\",\"SiteDetails_Users\":\"Users\",\"CancelPortalDelete\":\"No\",\"ConfirmPortalDelete\":\"Yes\",\"deletePortal\":\"Are you sure you want to delete {0}?\",\"AddNewSite.Header\":\"Add New Site\",\"AssignCurrentUserAsAdmin.Label\":\"Assign Current User as Administrator\",\"cmdCreateSite\":\"Create Site\",\"Description.Label\":\"Description\",\"Directory\":\"Directory\",\"Domain\":\"Domain\",\"HomeDirectory.Label\":\"Home Directory\",\"SiteTemplate.Label\":\"Site Template\",\"SiteType.Label\":\"Site Type:\",\"SiteUrl.Label\":\"Site URL\",\"Title.Label\":\"Title\",\"CreateSite_AdminEmail.Label\":\"Email\",\"CreateSite_AdminFirstName.Label\":\"First Name\",\"CreateSite_AdminLastName.Label\":\"Last Name\",\"CreateSite_AdminPassword.Label\":\"Password\",\"CreateSite_AdminPasswordConfirm.Label\":\"Confirm Password\",\"CreateSite_AdminUserName.Label\":\"Administrator User Name\",\"CreateSite_SelectTemplate.Overlay\":\"click to select template\",\"EmailRequired.Error\":\"Email is required.\",\"FirstNameRequired.Error\":\"First name is required.\",\"LastNameRequired.Error\":\"Last name is required.\",\"PasswordConfirmRequired.Error\":\"Password confirmation is required.\",\"PasswordRequired.Error\":\"Password is required. Please enter a minimum of 7 characters.\",\"SiteAliasRequired.Error\":\"Site Alias is required.
  • Domain requirements: No spaces, no special characters (: , . only).
  • Directory requirements: No spaces, no special characters (_ , - only).
\",\"SiteTitleRequired.Error\":\"Site Title is required.\",\"UsernameRequired.Error\":\"User name is required.\",\"PortalDeletionDenied\":\"Site deletion not allowed.\",\"PortalNotFound\":\"Site not found.\",\"LoadMore.Button\":\"Load More\",\"BackToSites\":\"Back To Sites\",\"DeleteSite\":\"Delete Site\",\"ExportTemplate\":\"Export Template\",\"SiteSettings\":\"Site Settings\",\"ViewSite\":\"View Site\",\"SiteExport\":\"Site Export\",\"SiteImport\":\"Site Import\",\"AddNewSite\":\"Add New Site\",\"Sites\":\"Sites\",\"Description\":\"Description\"},\"EvoqSiteSettings\":{\"SitemapFileInvalid\":\"Unable to validate Sitemap file. Check the Sitemap is available, well formed and a valid Sitemap file. You can see Sitemap format on http://www.sitemaps.org/protocol.php\",\"SitemapUrlInvalid\":\"Invalid Sitemap URL format (use: 'http://www.site.com/sitemap.aspx')\",\"UrlAlreadyExists.ErrorMessage\":\"URL already exists. Please enter a different URL.\",\"valUrl.ErrorMessage\":\"Invalid URL format (use: 'http://www.site.com')\",\"VersioningGetError\":\"Failed to get versioning details\",\"VersioningSaveError\":\"Failed to save the versioning details\",\"DupFileNotExists\":\"Duplicates file not found.\",\"DupPatternAlreadyExists\":\"Duplicate pattern already exists.\",\"valDup.ErrorMessage\":\"Invalid Regular Expression pattern\",\"errorDuplicateDirectory\":\"Directory duplicated. This directory '{0}' is already added\",\"errorDuplicateFileExtension\":\"This file extension has been added\",\"errorExcludeDirectory\":\"Directory excluded. This directory '{0}' is already excluded by an ancestor directory\",\"errorIncludeDirectory\":\"Directory included. This directory '{0}' is already included by an ancestor directory\",\"errorNotAllowedFileExtension\":\"The file type you are trying to add is not allowable for upload within the system. Please first add this to the allowable file extensions in your host settings or contact your host administrator for assistance.\",\"errorRequiredDirectory\":\"Directory required\",\"errorRequiredFileExtension\":\"File extension required\",\"tooltipContentCrawlingAvailable\":\"Content Crawling is available\",\"tooltipContentCrawlingUnavailable\":\"Content Crawling is unavailable\",\"AddDirectory.Label\":\"Add Directory\",\"AddDuplicate.Label\":\"Add Regex Pattern\",\"AddFileType.Label\":\"Add File Type\",\"AddUrl.Label\":\"Add Url\",\"Cancel.Button\":\"Cancel\",\"DeleteCancel\":\"No\",\"DeleteConfirm\":\"Yes\",\"DeleteWarning\":\"Are you sure you want to delete {0}?\",\"Description.HelpText\":\"Decription of the regex (usually the module name that will allow spidering of)\",\"Description.Label\":\"Description\",\"Directory.Label\":\"Directory\",\"DnnImpersonation.Label\":\"DNN Impersonation\",\"DnnRoleImpersonation.HelpText\":\"For Local Site Only: you can tell the spider to impersonate a DNN role (make sure there exists a valid user for the role selected), in order to spider pages that otherwise would require a login.\",\"DnnRoleImpersonation.Label\":\"DNN Role Impersonation\",\"Duplicates.Header\":\"Duplicates\",\"Duplicates.HelpText\":\"Many modules use the same page to post dynamic content. This feature allows you exclude particular URLs ( or parts thereof ) from being indexed by regular expression patterns.\",\"EnableFileVersioning.HelpText\":\"Set whether or not File versioning is enabled or disabled for the site\",\"EnableFileVersioning\":\"Enable File Versioning:\",\"EnablePageVersioning.HelpText\":\"Set whether or not Page versioning is enabled or disabled for the site\",\"EnablePageVersioning\":\"Enable Page Versioning:\",\"EnableSpidering.HelpText\":\"Enable Spidering of this URL. If checked, the spider will create a new index for this site on its next run. If Unchecked, teh site will not be indexed, but any existing index will still be available for searches.\",\"EnableSpidering.Label\":\"Enable Spidering\",\"ExcludedDirectories.HelpText\":\"This feature allows you to manage directories that you would like to be excluded from the main search box. These are still searchable from within the DAM module.\",\"ExcludedDirectories.Label\":\"Excluded Directories\",\"ExcludedFileExtensions.HelpText\":\"This feature allows you to specify file extensions for files that you do not want to be displayed in search results.\",\"ExcludedFileExtensions.Label\":\"Excluded File Extensions\",\"FileExtension.Label\":\"File Extension\",\"FileType.Label\":\"File Type\",\"IncludedDirectories.HelpText\":\"This feature allows you to manage directories that you would like to be indexed by the search.\",\"IncludedDirectories.Label\":\"Included Directories\",\"IncludedFileExtensions.HelpText\":\"This feature makes the content of the documents in your system available to search. Here you may add file type extensions. Provided you have the appropriate iFilters installed on your system, the content will be crawled and available to be searched.\",\"IncludedFileExtensions.Label\":\"Included File Extensions\",\"MaxNumFileVersions.HelpText\":\"Set the number of file versions to keep. It must be between 5 and 25\",\"MaxNumFileVersions\":\"Maximum Number of File Versions Kept\",\"MaxNumPageVersions.HelpText\":\"Set the number of page versions to keep. It must be between 1 and 20\",\"MaxNumPageVersions\":\"Maximum Number of Page Versions Kept\",\"NoFolderSelected.Label\":\"< Select A Directory >\",\"RegexPattern.HelpText\":\"The regular expression that will allow the spider to recognize the parameters that the module uses to post to the same page and create dynamic content.\",\"RegexPattern.Label\":\"Regex Pattern\",\"Save.Button\":\"Save\",\"SelectFolder.Notify\":\"Please select a folder.\",\"SitemapUrl.HelpText\":\"Enter the URL of the sitemap file to use\",\"SitemapUrl.Label\":\"Sitemap URL\",\"UnsavedChanges\":\"You have unsaved changes. Are you sure you want to continue?\",\"Url.HelpText\":\"URL of the site to be spidered.\",\"Url.Label\":\"Url\",\"UrlPaths.Header\":\"Url Paths\",\"UrlPaths.HelpText\":\"This feature allows you to specify sites to be searchable.\",\"Versioning.Header\":\"Versioning\",\"WindowsAuth.Label\":\"Windows Auth\",\"WindowsAuthentication.HelpText\":\"Check this option if the Site's IIS security settings use Integrated Windows Authentication. If you leave user name and password blank, the Default Credentials Cache of the local server will be used.\",\"WindowsAuthentication.Label\":\"Windows Authentication\",\"WindowsDomain.HelpText\":\"Enter the Computer Domain of the user account that will be used.\",\"WindowsDomain.Label\":\"Windows Domain (optional)\",\"WindowsUserAccount.HelpText\":\"Enter the Login Name (user account) that will be used.\",\"WindowsUserAccount.Label\":\"Windows User Account (optional)\",\"WindowsUserPassword.HelpText\":\"Enter the Password that will be used.\",\"WindowsUserPassword.Label\":\"Windows User Password (optional)\",\"ContentCrawlingUnavailable\":\"Content crawling is unavailable.\"},\"SiteSettings\":{\"nav_SiteSettings\":\"Site Settings\",\"TabSiteInfo\":\"Site Info\",\"TabSiteBehavior\":\"Site Behavior\",\"TabLanguage\":\"Languages\",\"TabSearch\":\"Search\",\"TabDefaultPages\":\"Default Pages\",\"TabMessaging\":\"Messaging\",\"TabUserProfiles\":\"User Profiles\",\"TabSiteAliases\":\"Site Aliases\",\"TabMore\":\"More\",\"TabBasicSettings\":\"Basic Settings\",\"TabSynonyms\":\"Synonyms\",\"TabIgnoreWords\":\"Ignore Words\",\"TabCrawling\":\"Crawling\",\"TabFileExtensions\":\"File Extensions\",\"plPortalName\":\"Site Title\",\"plPortalName.Help\":\"Enter a site title. This title will show up in the Web browser Title Bar and will be a tooltip on the site Logo.\",\"plDescription\":\"Description\",\"plDescription.Help\":\"Enter a description for the site here.\",\"plKeyWords\":\"Keywords\",\"plKeyWords.Help\":\"Enter some keywords for your site (separated by commas). These keywords are used by search engines to help index the site.\",\"plTimeZone\":\"Site Time Zone\",\"plTimeZone.Help\":\"The TimeZone for the location of the site.\",\"plGUID\":\"GUID\",\"plGUID.Help\":\"The globally unique identifier which can be used to identify this site.\",\"plFooterText\":\"Copyright\",\"plFooterText.Help\":\"If supported by the theme this Copyright text is displayed on your site.\",\"plHomeDirectory\":\"Home Directory\",\"plHomeDirectory.Help\":\"The location used for the storage of files in this site.\",\"plLogoIcon\":\"LOGO AND ICONS\",\"plLogo\":\"Site Logo\",\"plLogo.Help\":\"Depending on the theme chosen, this image will typically appear in the top left corner of the page.\",\"plFavIcon\":\"Favicon\",\"plFavIcon.Help\":\"The selected favicon will be applied to all pages in the site.\",\"plIconSet\":\"Icon Set\",\"plIconSet.Help\":\"The selected iconset will be applied to all icons on the site.\",\"Save\":\"Save\",\"Cancel\":\"Cancel\",\"Yes\":\"Yes\",\"No\":\"No\",\"SettingsUpdateSuccess\":\"Settings have been updated.\",\"SettingsError\":\"Could not update settings. Please try later.\",\"SettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"valPortalName.ErrorMessage\":\"You must provide a title for your site.\",\"PageOutputSettings\":\"PAGE OUTPUT SETTINGS\",\"plPageHeadText.Help\":\"Enter any tags (i.e. META tags) that should be rendered in the \\\"HEAD\\\" tag of the HTML for this page.\",\"plPageHeadText\":\"HTML Page Header Tags\",\"plSplashTabId\":\"Splash Page\",\"plSplashTabId.Help\":\"The Splash Page for your site.\",\"plHomeTabId\":\"Home Page\",\"plHomeTabId.Help\":\"The Home Page for your site.\",\"plLoginTabId\":\"Login Page\",\"plLoginTabId.Help\":\"The Login Page for your site. Only pages with the Account Login module are listed.\",\"plUserTabId\":\"User Profile Page\",\"plUserTabId.Help\":\"The User Profile Page for your site.\",\"plRegisterTabId.Help\":\"The user registration page for your site.\",\"plRegisterTabId\":\"Registration Page\",\"plSearchTabId.Help\":\"The search results page for your site.\",\"plSearchTabId\":\"Search Results Page\",\"pl404TabId.Help\":\"The 404 Error Page for your site. Users will be redirected to this page if the URL they are navigating to results in a \\\"Page Not Found\\\" error.\",\"pl404TabId\":\"404 Error Page\",\"pl500TabId.Help\":\"The 500 Error Page for your site. Users will be redirected to this page if the URL they are navigating to results in an unexpected error.\",\"pl500TabId\":\"500 Error Page\",\"NoneSpecified\":\"None Specified\",\"plDisablePrivateMessage.Help\":\"Select to prevent users from sending messages to specific users or groups. This restriction doesn't apply to Administrators or Super Users.\",\"plDisablePrivateMessage\":\"Disable Private Message\",\"plMsgThrottlingInterval\":\"Throttling Interval in Minutes\",\"plMsgThrottlingInterval.Help\":\"Enter the number of minutes after which a user can send the next message. Zero indicates no restrictions. This restriction doesn't apply to Administrators or Super Users.\",\"plMsgRecipientLimit\":\"Recipient Limit\",\"plMsgRecipientLimit.Help\":\"Maximum number of recipients allowed in To field. A message sent to a Role is considered as a single recipient.\",\"plMsgProfanityFilters\":\"Enable Profanity Filters\",\"plMsgProfanityFilters.Help\":\"Enable to automatically convert profane (inappropriate) words and phrases into something equivalent. The list is managed on the Host->List->ProfanityFilters and the Admin->List->ProfanityFilters pages.\",\"plMsgAllowAttachments\":\"Allow Attachments\",\"plMsgAllowAttachments.Help\":\"Choose whether attachments can be attached to messages.\",\"plIncludeAttachments\":\"Include Attachments\",\"plIncludeAttachments.Help\":\"Choose whether attachments are to be included with outgoing email.\",\"plMsgSendEmail\":\"Send Emails\",\"plMsgSendEmail.Help\":\"Select if emails are to be sent to recipients for every message and notification.\",\"UserProfileSettings\":\"USER PROFILE SETTINGS\",\"UserProfileFields\":\"USER PROFILE FIELDS\",\"Profile_DefaultVisibility.Help\":\"Select default profile visibility mode for user profile.\",\"Profile_DefaultVisibility\":\"Default Profile Visibility Mode\",\"Profile_DisplayVisibility.Help\":\"Check this box to display the profile visibility control on the User Profile page.\",\"Profile_DisplayVisibility\":\"Display Profile Visibility\",\"redirectOldProfileUrlsLabel.Help\":\"Check this box to force old style profile URLs to be redirected to custom URLs.\",\"redirectOldProfileUrlsLabel\":\"Redirect Old Profile URLs\",\"vanilyUrlPrefixLabel.Help\":\"Enter a string to use to prefix vanity URLs.\",\"vanilyUrlPrefixLabel\":\"Vanity URL Prefix\",\"AllUsers\":\"All Users\",\"MembersOnly\":\"Members Only\",\"AdminOnly\":\"Admin Only\",\"FriendsAndGroups\":\"Friends and Groups\",\"VanityUrlExample\":\"myVanityURL\",\"Name.Header\":\"Name\",\"DataType.Header\":\"Data Type\",\"DefaultVisibility.Header\":\"Default Visibility\",\"Required.Header\":\"Required\",\"Visible.Header\":\"Visible\",\"ProfilePropertyDefinition_PropertyName\":\"Field Name\",\"ProfilePropertyDefinition_PropertyName.Help\":\"Enter a name for the property.\",\"ProfilePropertyDefinition_DataType\":\"Data Type\",\"ProfilePropertyDefinition_DataType.Help\":\"Select the data type for this field.\",\"ProfilePropertyDefinition_PropertyCategory\":\"Property Category\",\"ProfilePropertyDefinition_PropertyCategory.Help\":\"Enter the category for this property. This will allow the related properties to be grouped when dislayed to the user.\",\"ProfilePropertyDefinition_Length\":\"Length\",\"ProfilePropertyDefinition_Length.Help\":\"Enter the maximum length for this property. This will only be applicable for specific data types.\",\"ProfilePropertyDefinition_DefaultValue\":\"Default Value\",\"ProfilePropertyDefinition_DefaultValue.Help\":\"Optionally provide a default value for this property.\",\"ProfilePropertyDefinition_ValidationExpression\":\"Validation Expression\",\"ProfilePropertyDefinition_ValidationExpression.Help\":\"You can provide a regular expression to validate the data entered for this property.\",\"ProfilePropertyDefinition_Required\":\"Required\",\"ProfilePropertyDefinition_Required.Help\":\"Set whether this property is required.\",\"ProfilePropertyDefinition_ReadOnly.Help\":\"Read only profile properties can be edited by the Administrator but are read-only to the user.\",\"ProfilePropertyDefinition_ReadOnly\":\"Read Only\",\"ProfilePropertyDefinition_Visible\":\"Visible\",\"ProfilePropertyDefinition_Visible.Help\":\"Check this box if this property can be viewed and edited by the user or leave it unchecked if it is visible to Administrators only.\",\"ProfilePropertyDefinition_ViewOrder\":\"View Order\",\"ProfilePropertyDefinition_ViewOrder.Help\":\"Enter a number to determine the view order for this property or leave blank to add.\",\"ProfilePropertyDefinition_DefaultVisibility.Help\":\"You can set the default visibility of the profile property. This is the initial value of the visibility and applies if the user does not modify it, when editing their profile.\",\"ProfilePropertyDefinition_DefaultVisibility\":\"Default Visibility\",\"ProfilePropertyDefinition_PropertyCategory.Required\":\"The category is required.\",\"ProfilePropertyDefinition_PropertyName.Required\":\"The field name is required.\",\"ProfilePropertyDefinition_DataType.Required\":\"The data type is required.\",\"Next\":\"Next\",\"Localization.Help\":\"LOCALIZATION: The next step is to manage the localization of this property. Select the language you want to update, add new text or modify the existing text and then click Update.\",\"plLocales.Help\":\"Select the language.\",\"plLocales\":\"Choose Language\",\"plPropertyHelp.Help\":\"Enter the Help for this property in the selected language.\",\"plPropertyHelp\":\"Field Help\",\"plPropertyName.Help\":\"Enter the text for the property's name in the selected language.\",\"plPropertyName\":\"Field Name\",\"plCategoryName.Help\":\"Enter the text for the category's name in the selected language.\",\"plCategoryName\":\"Category Name\",\"plPropertyRequired.Help\":\"Enter the error message to display for this field when the property is Required but not present.\",\"plPropertyRequired\":\"Required Error Message\",\"plPropertyValidation.Help\":\"Enter the error message to display for this field when the property fails the Regular Expression Validation.\",\"plPropertyValidation\":\"Validation Error Message\",\"valPropertyName.ErrorMessage\":\"You need enter a name for this property.\",\"PropertyDefinitionDeletedWarning\":\"Are you sure you want to delete this profile field?\",\"DeleteSuccess\":\"The profile field has been deleted.\",\"DeleteError\":\"Could not delete the profile field. Please try later.\",\"DuplicateName\":\"This property already exists. Property names must be unique. Please select a different name for this property.\",\"RequiredTextBox\":\"The required length must be an integer greater than or equal to 0. If you use a TextBox field, the required length must be greater than 0.\",\"portalAliasModeButtonListLabel.Help\":\"This setting determines how the site responds to URLs which are defined as alias, but are not the default alias. Canonical (the alias URL is handled as a Canonical URL), Redirect (redirects to default alias) or None (no additional action is taken).\",\"portalAliasModeButtonListLabel\":\"Site Alias Mapping Mode\",\"plAutoAddPortalAlias.Help\":\"This setting determines how the site responds to URLs which are mapped to the site but are not currently in the list of aliases. This setting is effective in single-site configuration only. Select this option to automatically map new URL.\",\"plAutoAddPortalAlias\":\"Auto Add Site Alias\",\"InvalidAlias\":\"The site alias is invalid. Please choose a different Site Alias.\",\"DuplicateAlias\":\"The Site Alias you specified already exists. Please choose a different Site Alias.\",\"SetPrimary\":\"Set Primary\",\"UnassignPrimary\":\"Unassign Primary\",\"UrlMappingSettings\":\"URL MAPPING\",\"Alias.Header\":\"ALIAS\",\"Browser.Header\":\"BROWSER\",\"Theme.Header\":\"THEME\",\"Language.Header\":\"LANGUAGE\",\"Primary.Header\":\"PRIMARY\",\"Canonical\":\"Canonical\",\"Redirect\":\"Redirect\",\"None\":\"None\",\"SiteAliases\":\"SITE ALIASES\",\"SiteAlias\":\"Site Alias\",\"Language\":\"Language\",\"Browser\":\"Browser\",\"Theme\":\"Theme\",\"SiteAliasUpdateSuccess\":\"The site alias has been updated.\",\"SiteAliasCreateSuccess\":\"The site alias has been added.\",\"SiteAliasDeletedWarning\":\"Are you sure you want to delete this site alias?\",\"SiteAliasDeleteSuccess\":\"The site alias has been deleted.\",\"SiteAliasDeleteError\":\"Could not delete the site alias. Please try later.\",\"lblIndexWordMaxLength.Help\":\"Enter the maximum word size to be included in the Index.\",\"lblIndexWordMaxLength\":\"Maximum Word Length\",\"lblIndexWordMinLength.Help\":\"Enter the minimum word size to be included in the Index.\",\"lblIndexWordMinLength\":\"Minimum Word Length\",\"valIndexWordMaxLengthRequired.Error\":\"Maximum length of index word is required. Integer must be greater than the minimum length.\",\"valIndexWordMinLengthRequired.Error\":\"Minimum length of index word is required. Integer must be greater than 0.\",\"lblCustomAnalyzer.Help\":\"If this is empty, system will use standard analyzer to index content. if you want to use custom analyzer, please type the full name of analyzer class in this field. Note: If you want existing content to index with the new analyzer, you must visit Settings -> Site Settings -> Search in the Persona Bar for each site and click the \\\"Re-index Content\\\" button.\",\"lblCustomAnalyzer\":\"Custom Analyzer Type\",\"lblAllowLeadingWildcard.Help\":\"Check this box to return search criteria that occurs within a word rather than only at the beginning of the word. Warning: Enabling wildcard searching may cause performance issues.\",\"lblAllowLeadingWildcard\":\"Enable Partial-Word Search (Slow)\",\"SearchPriorities\":\"SEARCH PRIORITIES\",\"SearchIndex\":\"SEARCH INDEX\",\"lblAuthorBoost.Help\":\"Author boost value is associated with the author as it is indexed. The higher the value, the more relevant the field will be for determining the order of the results.\",\"lblAuthorBoost\":\"Author Boost\",\"lblContentBoost.Help\":\"Content boost value is associated with the content as it is indexed. The higher the value, the more relevant the field will be for determining the order of the results.\",\"lblContentBoost\":\"Content Boost\",\"lblDescriptionBoost.Help\":\"Description boost value is associated with the description as it is indexed. The higher the value, the more relevant the field will be for determining the order of the results.\",\"lblDescriptionBoost\":\"Description Boost\",\"lblTagBoost.Help\":\"Tag boost value is associated with the tag as it is indexed. The higher the value, the more relevant the field will be for determining the order of the results.\",\"lblTagBoost\":\"Tag Boost\",\"lblTitleBoost.Help\":\"Title boost value is associated with the title as it is indexed. The higher the value, the more relevant the field will be for determining the order of the results.\",\"lblTitleBoost\":\"Title Boost\",\"lblSearchIndexPath.Help\":\"Location where Search Index is stored. This location can be manually changed by creating a Host Setting \\\"Search_IndexFolder\\\" in database. It is advised to stop the App Pool prior to making this change. Content from the old folder must be manually copied to new location or a manual re-index must be triggered. \",\"lblSearchIndexPath\":\"Search Index Path\",\"lblSearchIndexDbSize.Help\":\"The total size of search index database files.\",\"lblSearchIndexDbSize\":\"Search Index Size\",\"lblSearchIndexActiveDocuments.Help\":\"The number of active documents in search index files\",\"lblSearchIndexActiveDocuments\":\"Active Documents\",\"lblSearchIndexDeletedDocuments.Help\":\"The number of deleted documents in search index files\",\"lblSearchIndexDeletedDocuments\":\"Deleted Documents\",\"lblSearchIndexLastModifiedOn.Help\":\"Last modified time of search index files.\",\"lblSearchIndexLastModifiedOn\":\"Last Modified On\",\"MessageIndexWarning\":\"Warning: Compacting or Re-Indexing should be done during non-peak hours as the process can be CPU intensive.\",\"CompactIndex\":\"Compact Index\",\"ReindexContent\":\"Re-index Content\",\"ReindexHostContent\":\"Re-index Host Content\",\"ReIndexConfirmationMessage\":\"Re-Index will cause existing content in the Index Store to be deleted. Re-index is done by search crawler(s) and depends on their scheduling frequency. Are you sure you want to continue?\",\"CompactIndexConfirmationMessage\":\"Compacting Index can be CPU consuming and may require twice the space of the current Index Store for processing. Compacting is done by site search crawler and depends on its scheduling frequency. Are you sure you want to continue?\",\"SynonymsTagDuplicated\":\"is already being used in another synonyms group.\",\"Synonyms\":\"Synonyms\",\"SynonymsGroup.Header\":\"Synonyms Group\",\"SynonymsGroupUpdateSuccess\":\"The synonyms group has been updated.\",\"SynonymsGroupCreateSuccess\":\"The synonyms group has been added.\",\"SynonymsGroupDeletedWarning\":\"Are you sure you want to delete this synonyms group?\",\"SynonymsGroupDeleteSuccess\":\"The synonyms group has been deleted.\",\"SynonymsGroupDeleteError\":\"Could not delete the synonyms group. Please try later.\",\"IgnoreWords\":\"Ignore Words\",\"IgnoreWordsUpdateSuccess\":\"The ignore words has been updated.\",\"IgnoreWordsCreateSuccess\":\"The ignore words has been added.\",\"IgnoreWordsDeletedWarning\":\"Are you sure you want to delete the ignore words?\",\"IgnoreWordsDeleteSuccess\":\"The ignore words has been deleted.\",\"IgnoreWordsDeleteError\":\"Could not delete the ignore words. Please try later.\",\"HtmlEditor\":\"Html Editor Manager\",\"OpenHtmlEditor\":\"Open HTML Editor Manager\",\"HtmlEditorWarning\":\"The HTML Editor Manager allows you to easily change your site's HTML editor or configure settings.\",\"BackToSiteBehavior\":\"BACK TO SITE BEHAVIOR\",\"BackToLanguages\":\"BACK TO LANGUAGES\",\"NativeName\":\"Native Name\",\"EnglishName\":\"English Name\",\"LanguageSettings\":\"SETTINGS\",\"Languages\":\"LANGUAGES\",\"systemDefaultLabel.Help\":\"The SystemDefault Language is the language that the application uses if no other language is available. It is the ultimate fallback.\",\"systemDefaultLabel\":\"System Default\",\"siteDefaultLabel.Help\":\"Select the default language for the site here. If the language is not enabled yet, it will be enabled automatically. The default language cannot be changed once Content Localization is enabled.\",\"siteDefaultLabel\":\"Site Default\",\"plUrl.Help\":\"Check this box to enable the Language Parameter in the URL.\",\"plUrl\":\"Enable Language Parameter in URLs\",\"detectBrowserLable.Help\":\"Check this box to detect the language selected on the user's browser and switch the site to that language.\",\"detectBrowserLable\":\"Enable Browser Language Detection\",\"allowUserCulture.Help\":\"Check this box to allow site users to select a different language for the interface than the one used for content.\",\"allowUserCulture\":\"Users May Choose Interface Language\",\"NeutralCulture\":\"Neutral Culture\",\"Culture.Header\":\"CULTURE\",\"Enabled.Header\":\"ENABLED\",\"fallBackLabel.Help\":\"Select the fallback language to be used if the selected language is not available.\",\"fallBackLabel\":\"Fallback Language\",\"enableLanguageLabel\":\"Enable Language\",\"languageLabel.Help\":\"Select the language.\",\"languageLabel\":\"Language\",\"LanguageUpdateSuccess\":\"The language has been updated.\",\"LanguageCreateSuccess\":\"The language has been added.\",\"DefaultLanguage\":\"*NOTE: This Language is the Site Default\",\"plEnableContentLocalization.Help\":\"Check this box to allow Administrators to enable content localization for their site.\",\"plEnableContentLocalization\":\"Allow Content Localization\",\"GlobalSetting\":\"This is a global setting. Changes to this setting will affect all of your sites.\",\"CreateLanguagePack\":\"Create Language Pack\",\"ResourceFileVerifier\":\"Resource File Verifier\",\"VerifyLanguageResources\":\"Verify Language Resource Files\",\"MissingFiles\":\"Missing Resource files: \",\"MissingEntries\":\"Files With Missing Entries: \",\"ObsoleteEntries\":\"Files With Obsolete Entries: \",\"ControlTitle_verify\":\"Resource File Verifier\",\"OldFiles\":\"Files Older Than System Default: \",\"DuplicateEntries\":\"Files With Duplicate Entries: \",\"ErrorFiles\":\"Malformed Resource Files: \",\"LanguagePackCreateSuccess\":\"The Language Pack(s) were created and can be found in the {0}/Install/Language folder.\",\"LanguagePackCreateFailure\":\"You must create resource files before you can create a language pack.\",\"lbLocale\":\"Resource Locale\",\"lbLocale.Help\":\"Select the locale for which you want to generate the language pack\",\"lblType\":\"Resource Pack Type\",\"lblType.Help\":\"Select the type of resource pack to generate.\",\"lblName\":\"Resource Pack Name\",\"lblName.Help\":\"The name of the generated resource pack can be modified. Notice that part of the name is fixed.\",\"valName.ErrorMessage\":\"The resource pack name is required.\",\"SelectModules\":\"Include module(s) in resource pack\",\"Core.LangPackType\":\"Core\",\"Module.LangPackType\":\"Module\",\"Provider.LangPackType\":\"Provider\",\"Full.LangPackType\":\"Full\",\"AuthSystem.LangPackType\":\"Auth System\",\"ModuleRequired.Error\":\"Please select at least one module from the list.\",\"BackToSiteSettings\":\"BACK TO SITE SETTINGS\",\"DefaultValue\":\"Default Value\",\"Global\":\"Global\",\"HighlightPendingTranslations\":\"Highlight Pending Translations\",\"LanguageEditor.Header\":\"Translate Resource Files\",\"LocalizedValue\":\"Localized Value\",\"ResourceFile\":\"Resource File\",\"ResourceFolder\":\"Resource Folder\",\"ResourceName\":\"Resource Name\",\"SaveTranslationsToFile\":\"Save Translations To File\",\"GlobalRoles\":\"Global Roles\",\"AllRoles\":\"All Roles\",\"RoleName.Header\":\"ROLE\",\"Select.Header\":\"SELECT\",\"Translators\":\"TRANSLATORS\",\"translatorsLabel.Help\":\"The selected roles will be granted explicit Edit Rights to all new pages and localized modules for this language.\",\"GlobalResources\":\"Global Resources\",\"LocalResources\":\"Local Resources\",\"SiteTemplates\":\"Site Templates\",\"Exceptions\":\"Exceptions\",\"HostSkins\":\"Host Themes\",\"PortalSkins\":\"Site Themes\",\"Template\":\"Template\",\"Updated\":\"File {0} has been saved.\",\"ResourceUpdated\":\"Resource file has been updated.\",\"InvalidLocale.ErrorMessage\":\"Current site does not support this locale ({0}).\",\"MicroServices\":\"MicroServices\",\"MicroServicesDescription\":\"Warning: once you enable a microservice, you will need contact support to disable it.\",\"SaveConfirm\":\"Are you sure you want to save the changes?\",\"MessageReIndexWarning\":\"Re-Index deletes existing content from the Index Store and then re-indexes everything. Re-Indexing is done as part of search crawler(s) scheduled task. To re-index immediately, the Search Crawler should be run manually from the scheduler.\",\"CurrentSiteDefault\":\"Current Site Default:\",\"CurrentSiteDefault.Help\":\"Once localized content is enabled, the default site culture will be permanently set and cannot be changed. Click Cancel now if you want to change the current site default.\",\"AllPagesTranslatable\":\"Make All Pages Translatable: \",\"AllPagesTranslatable.Help\":\"Check this box to make all pages within the default language translatable and created a copy of all translatable pages for each enabled language.\",\"EnableLocalizedContent\":\"Enable Localized Content\",\"EnableLocalizedContentHelpText\":\"Enabling localized content allows you to provide translated module content in addition to displaying translated static text. Once localized contetnt is enabled the default site culture will be permanently set and cannot be changed.\",\"EnableLocalizedContentClickCancel\":\"Click Cancel now if you want to change the current site default.\",\"TranslationProgressBarText\":\"[number] new pages are beign created for each language. Please wait as you localized pages are generated...\",\"TotalProgress\":\"Total Progress [number]%\",\"TotalLanguages\":\"Total Languages [number]\",\"Progress\":\"Progress [number]%\",\"ElapsedTime\":\"Elapsed Time: \",\"ProcessingPage\":\"{0}: Page {1} of {2} - {3}\",\"MessageCompactIndexWarning\":\"Compacting of Index reclaims space from deleted items in the Index Store. Compacting is recommended only when there are many 'Deleted Documents' in Index Store. Compacting may require twice the size of current Index Store during processing.\",\"cmdCreateLanguage\":\"Add New Language\",\"cmdAddWord\":\"Add Word\",\"cmdAddField\":\"Add Field\",\"cmdAddAlias\":\"Add Alias\",\"cmdAddGroup\":\"Add Group\",\"DisableLocalizedContent\":\"Disable Localized Content\",\"TranslatePageContent\":\"Translate Page Content\",\"AddAllUnlocalizedPages\":\"Add All Unlocalized Pages\",\"ViewPage\":\"[ View Page ]\",\"EditPageSettings\":\"[ Edit Page Settings ]\",\"ActivatePages\":\"Activate Pages in This Language: \",\"ActivatePages.Help\":\"A language must be enabled before it can be activated and it must be deactivated before it can be disabled.\",\"MarkAllPagesAsTranslated\":\"Mark All Pages As Translated\",\"EraseAllLocalizedPages\":\"Erase All Localized Pages\",\"PublishTranslatedPages\":\"Publish All Pages\",\"UnpublishTranslatedPages\":\"Unpublish All Pages\",\"PagesToTranslate\":\"Pages To Translate:\",\"plImprovementProgram.Help\":\"Check this box to participate in the DNN Improvement Program. Learn More.\",\"plImprovementProgram\":\"Participate in DNN Improvement Program:\",\"plUpgrade\":\"Check for Software Upgrades\",\"plUpgrade.Help\":\"Check this box to have the application check if there are upgrades available.\",\"Pages.Header\":\"PAGES\",\"Translated.Header\":\"TRANSLATED\",\"Active.Header\":\"ACTIVE\",\"PropertyDefinitionUpdateSuccess\":\"Property Definitions have been updated.\",\"ViewOrderUpdateSuccess\":\"View orders have been updated.\",\"SaveOrCancelWarning\":\"You have unsaved changes. Please save or cancel your changes first.\",\"DeactivateLanguageWarning\":\"Are you sure you want to deactivate {0}?\",\"DeletedAllLocalizedPages\":\"Localized pages deleted successfully.\",\"EraseTranslatedPagesWarning\":\"You are about to permanently remove all translations for the '{0}' language. Are you sure you want to continue?\",\"Mode.HelpText\":\"Select Global to edit the base file for a given language; the other option will only affect the selected site.\",\"Mode.Label\":\"Mode\",\"PagesSuccessfullyLocalized\":\"Pages successfully localized.\",\"PublishedAllTranslatedPages\":\"Pages published successfully.\",\"UnPublishedAllTranslatedPages\":\"Pages successfully unpublished.\",\"SelectResourcePlaceholder\":\"-- Select --\",\"PagesSuccessfullyTranslated\":\"Pages successfully translated.\",\"DisableLanguageWarning\":\"Are you sure you want to disable the language {0}\",\"MakeNeutralWarning\":\"This will delete all translated versions of the page. Only the default culture version of the page will remain. Are you sure you want to do this?\",\"SiteSelectionLabel\":\"EDITING SITE\",\"LanguageSelectionLabel\":\"LANGUAGE\",\"ListEntryText\":\"Text\",\"ListEntryValue\":\"Value\",\"NoData\":\"No records to display\",\"cmdAddEntry\":\"Add Entry\",\"ListEntries\":\"List Entries\",\"ListEntries.Help\":\"MANAGE LIST ENTRIES: The property details have been updated. This property is a List type property. The next step is to define the list entries.\",\"ListEntryCreateSuccess\":\"The list entry has been created.\",\"ListEntryUpdateSuccess\":\"The list entry has been updated.\",\"ListEntryDeleteSuccess\":\"The list entry has been deleted.\",\"ListEntryDeleteError\":\"Could not delete the list entry. Please try later.\",\"ListEntryDeletedWarning\":\"Are you sure you want to delete the list entry?\",\"InvalidEntryText\":\"Text is required\",\"InvalidEntryValue\":\"Value is required\",\"EnableSortOrder\":\"Enable Sort Order\",\"EnableSortOrder.Help\":\"Check this box to enable custom sorting of entries in this list.\",\"BrowseAction\":\"Press {save|[ENTER]} to save, or {cancel|[ESC]} to cancel\",\"BrowseButton\":\"Browse File System\",\"DefaultImageTitle\":\"Image\",\"DragDefault\":\"Drag and Drop a File or Select an Option\",\"DragOver\":\"Drag and Drop a File\",\"File\":\"File\",\"Folder\":\"Folder\",\"LinkButton\":\"Enter URL Link\",\"LinkInputAction\":\"Press {save|[ENTER]} to save, or {cancel|[ESC]} to cancel\",\"LinkInputPlaceholder\":\"http://example.com/imagename.jpg\",\"LinkInputTitle\":\"URL Link\",\"NotSpecified\":\"\",\"SearchFilesPlaceHolder\":\"Search Files...\",\"SearchFoldersPlaceHolder\":\"Search Folders...\",\"UploadButton\":\"Upload a File\",\"UploadComplete\":\"Upload Complete\",\"UploadDefault\":\"myImage.jpg\",\"UploadFailed\":\"Upload Failed\",\"Uploading\":\"Uploading...\",\"WrongFormat\":\"Wrong Format\",\"Host\":\"Host\"},\"SqlConsole\":{\"Connection\":\"Connection:\",\"nav_SqlConsole\":\"SQL Console\",\"Query\":\"Query:\",\"RunScript\":\"Run Script\",\"SaveQuery\":\"Save Query\",\"Title\":\"Sql Console\",\"UploadFile\":\"Upload a File\",\"AllEntries\":\"All Entries\",\"Export\":\"Export\",\"NewQuery\":\"\",\"PageInfo\":\"Showing {0}-{1} of {2} items\",\"QueryTabTitle\":\"Query {0}\",\"SaveQueryInfo\":\"Enter a name for this query:\",\"Search\":\"Search\",\"PageSize\":\"{0} Entries\",\"ExportClipboard\":\"Copy to Clipboard\",\"ExportClipboardFailed\":\"Copy to Clipboard Failed!\",\"ExportClipboardSuccessful\":\"Copied to Clipboard!\",\"ExportCSV\":\"Export to CSV\",\"ExportExcel\":\"Export to Excel\",\"ExportPDF\":\"Export to PDF\",\"NoData\":\"The query did not return any data.\",\"QueryFailed\":\"The query failed!\",\"QuerySuccessful\":\"The query completed successfully!\",\"EmptyName\":\"Can't save query with empty name.\",\"DeleteConfirm\":\"Please confirm you wish to delete this query.\",\"Cancel\":\"Cancel\",\"Delete\":\"Delete\"},\"TaskScheduler\":{\"ContentOptions.Action\":\"View Schedule Status\",\"ScheduleHistory.Action\":\"View Schedule History\",\"plType\":\"Full Class Name and Assembly\",\"plEnabled\":\"Enable Schedule\",\"plTimeLapse\":\"Frequency\",\"plTimeLapse.Help\":\"Set the time period to determine how frequently this task will run.\",\"Minutes\":\"Minutes\",\"Days\":\"Days\",\"Hours\":\"Hours\",\"Weeks\":\"Weeks\",\"Months\":\"Months\",\"Years\":\"Years\",\"plRetryTimeLapse\":\"Retry Time Lapse\",\"plRetryTimeLapse.Help\":\"Set the time period to rerun this task after a failure.\",\"plRetainHistoryNum\":\"Retain Schedule History\",\"plRetainHistoryNum.Help\":\"Select the number of items to be retained in the schedule history.\",\"plAttachToEvent\":\"Run on Event\",\"plAttachToEvent.Help\":\"Select \\\"Application Start\\\" to run this event when the web app starts. Note that events run on APPLICATION_END may not run reliably on some hosts.\",\"None\":\"None\",\"All\":\"All\",\"APPLICATION_START\":\"APPLICATION_START\",\"plCatchUpEnabled\":\"Catch Up Tasks\",\"plCatchUpEnabled.Help\":\"Check this box to run this event once for each frequency that was missed during any server downtime.\",\"plObjectDependencies\":\"Object Dependencies\",\"plObjectDependencies.Help\":\"Enter the tables or other objects that this event is dependent on. E.g. \\\"Users,UsersOnline\\\"\",\"UpdateSuccess\":\"Your changes have been saved.\",\"DeleteSuccess\":\"The schedule item has been deleted.\",\"DeleteError\":\"Could not delete the schedule item. Please try later.\",\"ControlTitle_edit\":\"Edit Task\",\"ModuleHelp\":\"

About Schedule

Allows you to schedule tasks to be run at specified intervals.

\",\"plType.Help\":\"This is the full class name followed by the assembly name. E.g. \\\"DotNetNuke.Entities.Users.PurgeUsersOnline, DOTNETNUKE\\\"\",\"plServers\":\"Server Name:\",\"plServers.Help\":\"Filter scheduled tasks by a single server or choose All to view all tasks.\",\"Seconds\":\"Seconds\",\"plEnabled.Help\":\"Check this box to enable the schedule for this job.\",\"plFriendlyName.Help\":\"Enter a name for the scheduled job.\",\"plFriendlyName\":\"Friendly Name\",\"cmdRun\":\"Run Now\",\"cmdDelete\":\"Delete\",\"RunNow\":\"Item added to schedule for immediate execution.\",\"TypeRequired\":\"The type of schedule item is required.\",\"TimeLapseValidator.ErrorMessage\":\"Frequency range is from 1 to 999999.\",\"TimeLapseRequired.ErrorMessage\":\"You must set Frequency value from 1 to 999999.\",\"RetryTimeLapseValidator.ErrorMessage\":\"Retry Frequency range is from 1 to 999999.\",\"plScheduleStartDate\":\"Schedule Start Date/Time\",\"plScheduleStartDate.Help\":\"Enter the start date/time for scheduled job. Note: If the server is down at the scheduled time or other jobs are already running, then the job will run as soon as the server comes back on online.\",\"InvalidFrequencyAndRetry\":\"The values for frequency and retry are invalid as the retry interval exceeds the frequency interval.\",\"AddContent.Action\":\"Add Item To Schedule\",\"Type.Header\":\"Type\",\"Enabled.Header\":\"ENABLED\",\"Enabled.Label\":\"Enabled\",\"Frequency.Header\":\"FREQUENCY\",\"RetryTimeLapse.Header\":\"RETRY TIME LAPSE\",\"NextStart.Header\":\"Next Start\",\"NextStart.Label\":\"Next Start\",\"lnkHistory\":\"History\",\"TimeLapsePrefix\":\"Every\",\"Minute\":\"Minute\",\"Hour\":\"Hour\",\"Day\":\"Day\",\"n/a\":\"n/a\",\"ControlTitle_\":\"Schedule\",\"Name.Header\":\"Task Name\",\"History\":\"View History\",\"Status\":\"View Status\",\"ViewLog.Header\":\"Log\",\"plSchedulerMode\":\"Scheduler Mode:\",\"plSchedulerMode.Help\":\"The Timer Method maintains a separate thread to execute scheduled tasks while the worker process is alive. Alternatively, the Request Method executes tasks when HTTP Requests are made. You can also disable the scheduler by selecting Disabled.\",\"Disabled\":\"Disabled\",\"TimerMethod\":\"Timer Method\",\"RequestMethod\":\"Request Method\",\"Settings\":\"Settings\",\"plScheduleAppStartDelay\":\"Schedule Delay:\",\"plScheduleAppStartDelay.Help\":\"Number of minutes the system should wait before it runs any scheduled jobs after a restart. Default is 1 min.\",\"ScheduleAppStartDelayValidation\":\"Value should be in minutes.\",\"Started.Header\":\"Started\",\"Ended.Header\":\"Ended\",\"Duration.Header\":\"Duration (seconds)\",\"Succeeded.Header\":\"Succeeded\",\"Start/End/Next Start.Header\":\"Start/End/Next Start\",\"Notes.Header\":\"Notes\",\"ControlTitle_history\":\"Task History\",\"Description.Header\":\"Description\",\"Start.Header\":\"Start/End/Next\",\"Server.Header\":\"Ran On Server\",\"lblStatusLabel\":\"Status:\",\"lblMaxThreadsLabel\":\"Max Threads:\",\"lblActiveThreadsLabel\":\"Active Threads:\",\"lblFreeThreadsLabel\":\"Free Threads:\",\"lblCommand\":\"Command:\",\"lblProcessing\":\"Items Processing\",\"ScheduleID.Header\":\"ID: \",\"ObjectDependencies.Header\":\"Object Dependencies: \",\"TriggeredBy.Header\":\"Triggered By: \",\"Thread.Header\":\"Thread: \",\"Servers.Header\":\"Servers: \",\"lblQueue\":\"Items in Queue\",\"Overdue.Header\":\"Overdue (seconds): \",\"TimeRemaining.Header\":\"Time Remaining: \",\"NoTasks\":\"There are no tasks in the queue\",\"NoTasksMessage\":\"Whenever you have tasks in queue or processing, they will appear here.\",\"DisabledMessage\":\"Scheduler is currently disabled.\",\"ManuallyStopped\":\"Manually stopped from scheduler status page\",\"cmdStart\":\"Start\",\"cmdStop\":\"Stop\",\"cmdSave\":\"Save\",\"ControlTitle_status\":\"Schedule Status\",\"Stop.Header\":\"Stop\",\"TabTaskQueue\":\"TASK QUEUE\",\"TabScheduler\":\"SCHEDULER\",\"TabHistory\":\"HISTORY\",\"TabHistoryTitle\":\"Schedule History\",\"HistoryModalTitle\":\"Task History: \",\"Cancel\":\"Cancel\",\"Update\":\"Update\",\"NOT_SET\":\"NOT SET\",\"WAITING_FOR_OPEN_THREAD\":\"WAITING FOR OPEN THREAD\",\"RUNNING_EVENT_SCHEDULE\":\"RUNNING EVENT SCHEDULE\",\"RUNNING_TIMER_SCHEDULE\":\"RUNNING TIMER SCHEDULE\",\"RUNNING_REQUEST_SCHEDULE\":\"RUNNING REQUEST SCHEDULE\",\"WAITING_FOR_REQUEST\":\"WAITING FOR REQUEST\",\"SHUTTING_DOWN\":\"SHUTTING DOWN\",\"STOPPED\":\"STOPPED\",\"SchedulerUpdateSuccess\":\"Scheduler settings updated successfully.\",\"SchedulerUpdateError\":\"Could not update schedule settings. Please try later.\",\"SchedulerStartSuccess\":\"Scheduler started successfully.\",\"SchedulerStartError\":\"Could not start scheduler. Please try later.\",\"SchedulerStopSuccess\":\"Scheduler stopped successfully.\",\"SchedulerStopError\":\"Could not stop scheduler. Please try later.\",\"StartSchedule\":\"Start Schedule\",\"StopSchedule\":\"Stop Schedule\",\"lblStartDelay\":\"Schedule Start Delay (mins):\",\"processing\":\"Processing ...\",\"RunNowError\":\"Could not add this item to schedule. Please try later.\",\"DescriptionColumn\":\"DESCRIPTION\",\"RanOnServerColumn\":\"RAN ON SERVER\",\"DurationColumn\":\"DURATION (SECS)\",\"SucceededColumn\":\"SUCCEEDED\",\"StartEndColumn\":\"START/END\",\"nav_TaskScheduler\":\"Scheduler\",\"ScheduleItemUpdateSuccess\":\"Schedule item updated successfully.\",\"ScheduleItemUpdateError\":\"Could not update the schedule item. Please try later.\",\"ScheduleItemCreateSuccess\":\"Schedule item created successfully.\",\"ScheduleItemCreateError\":\"Could not create the schedule item. Please try later.\",\"ScheduleItemDeletedWarning\":\"Are you sure you want to delete this schedule item?\",\"Yes\":\"Yes\",\"No\":\"No\",\"SettingsRestoreWarning\":\"Are you sure you want to cancel your changes?\",\"ServerTime\":\"Server Time:\",\"cmdAddTask\":\"Add Task\",\"pageSizeOption\":\"{0} results per page\",\"pagerSummary\":\"Showing {0}-{1} of {2} results\",\"Servers\":\"Servers\",\"LessThanMinute\":\"less than a minute\",\"MinuteSingular\":\"minute\",\"MinutePlural\":\"minutes\",\"HourSingular\":\"hour\",\"HourPlural\":\"hours\",\"DaySingular\":\"day\",\"DayPlural\":\"days\",\"Prompt_FetchTaskFailed\":\"Failed to fetch the task details. Please see event log for more details.\",\"Prompt_FlagCantBeEmpty\":\"When specified, the --{0} flag cannot be empty.\\\\n\",\"Prompt_FlagMustBeNumber\":\"When specified, the --{0} flag must be a number.\\\\n\",\"Prompt_FlagMustBeTrueFalse\":\"When specified, the --{0} flag must be True or False.\\\\n\",\"Prompt_FlagRequired\":\"The --{0} flag is required.\\\\n\",\"Prompt_ScheduleFlagRequired\":\"You must specify the scheduled item's ID using the --{0} flag or by passing the number as the first argument.\\\\n\",\"Prompt_TaskAlreadyDisabled\":\"Task is already disabled.\",\"Prompt_TaskAlreadyEnabled\":\"Task is already enabled.\",\"Prompt_TaskNotFound\":\"No task not found with id {0}.\",\"Prompt_TasksFound\":\"{0} tasks found.\",\"Prompt_TaskUpdated\":\"Task updated successfully.\",\"Prompt_TaskUpdateFailed\":\"Failed to update the task.\",\"Prompt_GetTask_Description\":\"Retrieves details for the specified Scheduler Task. DNN refers to these as schedules or scheduler items. Prompt refers to them as tasks.\",\"Prompt_GetTask_FlagId\":\"The Schedule ID for the item you want to retrieve. If you pass the ID as the first value after the command name, you do not need to explicitly use the --id flag name.\",\"Prompt_GetTask_ResultHtml\":\"

Get A Task

\\r\\n \\r\\n get-task 11\\r\\n \\r\\n OR\\r\\n \\r\\n get-task --id 11\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleId:11
FreindlyName:Messaging Dispatch
TypeName:DotNteNuke.Services.Social.Messaging.Scheduler.CoreMessagingScheduler,DotNetNuke
NextStart:2017-01-02T08:19:49.53
Enabled:true
CatchUp:false
Created:0001-01-01T00:00:00
StartDate:0001-01-01T00:00:00
\",\"Prompt_ListTasks_Description\":\"Retrieves a list of scheduled tasks based on the specified criteria. DNN refers to these as schedules or scheduler items. Prompt refers to them as tasks.\",\"Prompt_ListTasks_FlagEnabled\":\"When specified, Prompt will return tasks that are enabled (if this flag is set to true) or disabled (if this is set to false). If this flag is not specified, Prompt will return tasks regardless of their enabled status.\",\"Prompt_ListTasks_FlagName\":\"When specified, Prompt will return tasks whose Friendly Name matches the expression. This supports wildcard matching via the asterisk ( * ) to represent zero (0) or more characters.\",\"Prompt_ListTasks_ResultHtml\":\"

List All Tasks

\\r\\n \\r\\n list-tasks\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleIdFriendlyNameNextStartEnabled
11MessagingDispatch2017-01-02T08:19:49.53true
9Purge Cache2017-01-02T08:08:07.4342281-07:00false
12Purge Client Dependency Files2017-01-02T08:08:07.4342281-07:00false
4Purge Log Buffer2017-01-02T08:08:07.4342281-07:00false
10Purge Module Cache2017-01-02T08:19:50.533true
...
10 tasks found
\\r\\n\\r\\n

List All Enabled Tasks

\\r\\n \\r\\n list-tasks true\\r\\n \\r\\n OR\\r\\n \\r\\n list-tasks --enabled true\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleIdFriendlyNameNextStartEnabled
11MessagingDispatch2017-01-02T08:19:49.53true
10Purge Module Cache2017-01-02T08:19:50.533true
3Purge Schedule History2017-01-03T08:08:10.45true
6Search: Site Crawler2017-01-02T09:09:09.94true
4 tasks found
\\r\\n\\r\\n

List All Tasks Whose Name Begins With "purge"

\\r\\n \\r\\n list-tasks purge*\\r\\n \\r\\n OR\\r\\n \\r\\n list-tasks --name purge*\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleIdFriendlyNameNextStartEnabled
9Purge Cache2017-01-02T09:08:55.2867143-07:00false
12Purge Client Dependency Files2017-01-02T09:08:55.2867143-07:00false
4Purge Log Buffer2017-01-02T09:08:55.2867143-07:00false
10Purge Module Cache2017-01-02T09:17:20.48true
13Purge Output Cache2017-01-02T09:08:55.2867143-07:00false
3Purge Schedule History2017-01-03T08:08:10.45true
1Purge Users Online2017-01-02T09:08:55.2867143-07:00false
7 tasks found
\\r\\n\\r\\n

List All Enabled Tasks Whose Name Begins With "purge"

\\r\\n \\r\\n list-tasks purge* --enabled true\\r\\n \\r\\n OR\\r\\n \\r\\n list-tasks true --name purge*\\r\\n \\r\\n OR\\r\\n \\r\\n list-tasks --enabled true --name purge*\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleIdFriendlyNameNextStartEnabled
10Purge Module Cache2017-01-02T09:17:20.48true
3Purge Schedule History2017-01-03T08:08:10.45true
2 tasks found
\",\"Prompt_SetTask_Description\":\"Set or update properties on the specified Scheduled task.\",\"Prompt_SetTask_FlagEnabled\":\"When true, the specified task will be enabled. When false, the specified task will be disabled.\",\"Prompt_SetTask_FlagId\":\"The Schedule ID of the task you want to update. You can avoid explicitly typing the --id flag by just passing the Schedule ID as the first argument.\",\"Prompt_SetTask_ResultHtml\":\"

Disable the "Purge Schedule History" Task

\\r\\n \\r\\n set-task 3 --enabled false\\r\\n \\r\\n OR\\r\\n \\r\\n set-task --id 3 --enabled false\\r\\n \\r\\n\\r\\n

Results

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
ScheduleId:3
FreindlyName:Purge Schedule History
TypeName:DotNetNuke.Services.Scheduling.PurgeScheduleHistory, DOTNETNUKE
NextStart:2017-01-02T09:08:55.2867143-07:00
Enabled:false
CatchUp:false
Created:0001-01-01T00:00:00
StartDate:2017-01-02T09:47:31.79
\\r\\n 1 task updated\\r\\n
\",\"Prompt_SchedulerCategory\":\"Scheduler Commands\"},\"Themes\":{\"Containers\":\"Containers\",\"Layouts\":\"Layouts\",\"nav_Themes\":\"Themes\",\"Settings\":\"Settings\",\"SiteTheme\":\"Site Theme:\",\"Themes\":\"Themes\",\"Apply\":\"Apply\",\"Cancel\":\"Cancel\",\"Container\":\"Container\",\"EditThemeAttributes\":\"Edit Theme Attributes\",\"File\":\"File\",\"Layout\":\"Layout\",\"Localized\":\"Localized\",\"ParseThemePackage\":\"Parse Theme Package\",\"Portable\":\"Portable\",\"SetEditContainer\":\"Set Edit Container\",\"SetEditLayout\":\"Set Edit Layout\",\"SetSiteContainer\":\"Set Site Container\",\"SetSiteLayout\":\"Set Site Layout\",\"Setting\":\"Setting\",\"StatusEdit\":\"E\",\"StatusSite\":\"S\",\"Theme\":\"Theme\",\"Token\":\"Token\",\"Value\":\"Value\",\"RestoreTheme\":\"[ Restore Default Theme ]\",\"Confirm\":\"Confirm\",\"RestoreThemeConfirm\":\"Are you sure you want to restore default theme?\",\"ApplyConfirm\":\"Are you sure you want to apply this theme?\",\"DeleteConfirm\":\"Are you sure you want to delete this theme?\",\"UsePackageUninstall\":\"This theme is installed as a package, please go to Extensions and uninstall it from there.\",\"SearchPlaceHolder\":\"Search\",\"Successful\":\"Operation Complete!\",\"NoPermission\":\"You don't have permission to perform this action.\",\"NoThemeFile\":\"No theme files exist in this theme.\",\"ThemeNotFound\":\"Can't find the specific theme.\",\"NoneSpecified\":\"-- Select --\",\"ApplyTheme\":\"Apply\",\"DeleteTheme\":\"Delete\",\"PreviewTheme\":\"Preview\",\"InstallTheme\":\"Install New Theme\",\"BackToThemes\":\"Back to Themes\",\"GlobalThemes\":\"Global Themes\",\"SiteThemes\":\"Site Themes\",\"ThemeLevelAll\":\"All Themes\",\"ThemeLevelGlobal\":\"Global Themes\",\"ThemeLevelSite\":\"Site Themes\",\"ShowFilterLabel\":\"Showing:\",\"NoThemes\":\"No Themes Found.\",\"NoThemesMessage\":\"Try adjusting your search filters or install a new theme to your library.\"},\"EvoqUsers\":{\"btnCreateUser\":\"Add User\",\"lblContributions\":\"{0} Total Contributions\",\"lblEngagement\":\"Engagement\",\"lblExperience\":\"Experience\",\"lblInfluenece\":\"Influence\",\"lblLastActive\":\"Last Active:\",\"lblRank\":\"Rank\",\"lblReputation\":\"Reputation\",\"lblTimeOnSite\":\"Time On Site:\",\"LoginAsUser\":\"Login As User\",\"nav_Users\":\"Users\",\"RecentActivity\":\"Recent Activity\",\"RecentActivityPagingSummaryText\":\"Showing {0}-{1} of {2} entries\",\"ShowUserActivity.title\":\"User Activity\",\"usersPageSizeOptionText\":\"{0} users per page\",\"usersSummaryText\":\"Showing {0}-{1} of {2} entries\",\"ViewAssets\":\"View Assets\",\"err_NoUserFolder\":\"{0} does not own any assets.\",\"CannotFindScoringActionDefinition\":\"Cannot Find Scoring Action Definition\",\"NegativeExperiencePoints\":\"Experience points can not be negative\",\"ReputationGreaterThanExperience\":\"Reputation points can not be more than experience\",\"Cancel\":\"Cancel\",\"editPoints\":\"Edit Points\",\"lblNotes\":\"Notes\",\"Save\":\"Save\"},\"Users\":{\"All\":\"All\",\"Deleted\":\"Deleted\",\"nav_Users\":\"Users\",\"RegisteredUsers\":\"Registered Users\",\"SuperUsers\":\"Superusers\",\"UnAuthorized\":\"Unauthorized\",\"SearchPlaceHolder\":\"Search Users\",\"AccountSettings\":\"Account Settings\",\"Add\":\"Add\",\"AddRolePlaceHolder\":\"Begin typing to add a role to this user.\",\"Approved.Help\":\"Indicates whether this user is authorized for the site.\",\"Approved\":\"Authorized:\",\"Authorized.Header\":\"Status\",\"Authorized\":\"Authorized\",\"btnApply\":\"Apply\",\"btnCancel\":\"Cancel\",\"btnCreate\":\"Create\",\"btnSave\":\"Save\",\"Cancel\":\"Cancel\",\"CannotAddUser\":\"This site is configured to require users to enter a Question and Answer receive password reminders. This configuration is incompatible with Administrators adding users, so has been disabled for this site.\",\"CannotChangePassword\":\"Your configuration requires the user to enter a Question and Answer for the Password reminder. When this setting is applied Administrators are unable to change a user's password, so the feature has been disabled for this site.\",\"ChangePassword\":\"Change Password\",\"ChangeSuccessful\":\"Password Changed Successfully\",\"cmdAuthorize\":\"Authorize User\",\"cmdPassword\":\"Force Password Change\",\"cmdUnAuthorize\":\"Un-Authorize User\",\"cmdUnLock\":\"Unlock Account\",\"Created.Header\":\"Joined\",\"CreatedDate.Help\":\"The date this user account was created.\",\"CreatedDate\":\"Created Date:\",\"Delete\":\"Delete\",\"DeleteRole.Confirm\":\"Are you sure you want to remove the '{0}' role from '{1}'?\",\"DeleteUser.Confirm\":\"Are you sure you want to delete this user?\",\"DeleteUser\":\"Delete User\",\"DemoteFromSuperUser\":\"Make Regular User\",\"DisplayName.Help\":\"Enter a display name.\",\"DisplayName\":\"Display Name:\",\"Email.Header\":\"Email\",\"Email.Help\":\"Enter a valid email address.\",\"Email\":\"Email Address:\",\"Expires.Header\":\"Expires\",\"FirstName.Help\":\"Enter a first name.\",\"FirstName\":\"First Name:\",\"ForceChangePassword\":\"Force Password Change\",\"IsDeleted.Help\":\"Indicates whether this user is deleted.\",\"IsDeleted\":\"Deleted:\",\"IsOnLine.Help\":\"Indicates whether the user is currently online.\",\"IsOnLine\":\"User Is Online:\",\"IsOwner\":\"Is Owner\",\"LastActivityDate.Help\":\"The date this user was last active on the site.\",\"LastActivityDate\":\"Last Activity Date:\",\"LastLockoutDate.Help\":\"The date this user was last locked out of the site due to repetitive failed logins.\",\"LastLockoutDate\":\"Last Lock-Out Date:\",\"LastLoginDate.Help\":\"The date this user last logged into the site.\",\"LastLoginDate\":\"Last Login Date:\",\"LastPasswordChangeDate.Help\":\"The date this user last changed their password.\",\"LastPasswordChangeDate\":\"Last Password Change:\",\"LockedOut.Help\":\"Indicates whether the user is currently locked out of the site due to repetitive failed logins.\",\"LockedOut\":\"Locked Out:\",\"ManageProfile.title\":\"Profile Settings\",\"ManageRoles.title\":\"User Roles\",\"ManageSettings.title\":\"Account Settings\",\"Name.Header\":\"Name\",\"Never\":\"Never\",\"NoRoles\":\"No roles found.\",\"OptionUnavailable\":\"Reset Password option is currently unavailable.\",\"PasswordInvalid\":\"You must enter a valid password. Please check with the Site Administrator if you do not know the password requirements.\",\"PasswordManagement\":\"Password Management\",\"PasswordResetFailed\":\"Your new password was not accepted for security reasons. Please enter a password that you haven't used before and is long and complex enough to meet the site's password complexity requirements.\",\"PasswordResetFailed_PasswordInHistory\":\"Your new password was not accepted for security reasons. Please choose a password that hasn't been used before.\",\"PasswordSent\":\"If the user name entered was correct, you should receive a new email shortly with a link to reset your password.\",\"NewConfirmMismatch.ErrorMessage\":\"The New Password and Confirmation Password must match.\",\"NewConfirm.Help\":\"Re-enter your new password to confirm.\",\"NewConfirm\":\"Confirm Password:\",\"NewPassword.Help\":\"Enter your new password.\",\"NewPassword\":\"New Password:\",\"PromoteToSuperUser\":\"Make Super User\",\"RemoveUser.Confirm\":\"Are you sure you want to permanently remove this user?\",\"RemoveUser\":\"Remove User Permanently\",\"ResetPassword\":\"Send Password Reset Link\",\"RestoreUser\":\"Restore User\",\"Role.Header\":\"Role\",\"Roles.Title\":\"Roles\",\"rolesPageInfoText\":\"Page {0} of {1}\",\"rolesSummaryText\":\"Showing {0}-{1} of {2}\",\"SendEmail\":\"Send Email\",\"Start.Header\":\"Start\",\"UpdatePassword.Help\":\"Indicates whether this user is forced to update their password.\",\"UpdatePassword\":\"Update Password:\",\"UserAuthorized\":\"User successfully authorized.\",\"UserDeleted\":\"User deleted successfully.\",\"UserFolder.Help\":\"The folder that stores this user's files.\",\"UserFolder\":\"User Folder:\",\"Username.Help\":\"Enter a user name. It must be at least five characters long and is must be an alphanumeric value.\",\"Username\":\"User Name:\",\"UserPasswordUpdateChanged\":\"User must update password on next login.\",\"UserRestored\":\"User restored successfully\",\"usersPageSizeOptionText\":\"{0} users per page\",\"usersSummaryText\":\"Showing {0}-{1} of {2}\",\"UserUnAuthorized\":\"User successfully un-authorized.\",\"UserUpdated\":\"User updated successfully.\",\"ViewProfile\":\"View Profile\",\"btnCreateUser\":\"Add User\",\"Confirm.Help\":\"Re-enter the password to confirm.\",\"Confirm\":\"Confirm Password:\",\"ConfirmMismatch.ErrorMessage\":\"The Password and Confirmation Password must match.\",\"LastName.Help\":\"Enter a last name.\",\"LastName\":\"Last Name:\",\"Notify\":\"Send An Email To New User.\",\"Password.Help\":\"Enter a password for this user.\",\"Password\":\"Password:\",\"Random.Help\":\"Check this box to generate a random password.\",\"Random\":\"Random Password\",\"UserCreated\":\"User created successfully.\",\"Confirm.Required\":\"You must provide a password confirmation.\",\"DisplayName.RegExError\":\"The display name is invalid.\",\"DisplayName.Required\":\"Display name is required.\",\"Email.RegExError\":\"You must enter a valid email address.\",\"Email.Required\":\"Email is required.\",\"FirstName.RegExError\":\"First name is invalid.\",\"FirstName.Required\":\"First name is required.\",\"LastName.RegExError\":\"Last name is invalid.\",\"LastName.Required\":\"Last name is required.\",\"NewConfirm.Required\":\"You must provide a password confirmation.\",\"NewPassword.Required\":\"You must provide a password.\",\"Password.Required\":\"You must provide a password.\",\"Username.RegExError\":\"The user name entered is invalid.\",\"Username.Required\":\"Username is required.\",\"noUsers\":\"No users found.\",\"ShowLabel\":\"Show: \",\"DemoteToRegularUser\":\"Make Regular User\",\"InSufficientPermissions\":\"You do not have enough permissions to perform this action.\",\"InvalidPasswordAnswer\":\"Password answer is invalid.\",\"RegisterationFailed\":\"Registeration failed. Please try later.\",\"UserDeleteError\":\"Failed to delete the user.\",\"UsernameNotUnique\":\"Username must be unique.\",\"UserNotFound\":\"User not found.\",\"UserRemoveError\":\"Can not remove the user.\",\"UserRestoreError\":\"Can not restore the user.\",\"RoleIsNotApproved\":\"Cannot assign a role which is not approved.\",\"UserUnlockError\":\"Failed to unlcok the user.\",\"cmUnlockUser\":\"Unlock User\",\"UserUnLocked\":\"User un-locked successfully.\",\"AccountData\":\"Account Data\",\"False\":\"False\",\"SwitchOff\":\"Off\",\"SwitchOn\":\"On\",\"True\":\"True\",\"Prompt_CannotPurgeUser\":\"Cannot purge user that has not been deleted first. Try delete-user.\",\"Prompt_DateParseError\":\"Unable to parse the {0} Date '{1}'. Try using YYYY-MM-DD format.\",\"Prompt_EmailSent\":\"An email has been sent to the user.\",\"Prompt_IfSpecifiedMustHaveValue\":\"If you specify the --{0} flag, it must be set to True or False.\",\"Prompt_InvalidFlag\":\"Invalid flag '--{0}'. Did you mean --{1} ?\",\"Prompt_NothingToSetUser\":\"Nothing to update. Please pass-in one or more flags with values to update on the user or type 'help set-user' for more help\",\"Prompt_NoUserId\":\"No User ID passed. Nothing to do.\",\"Prompt_OnlyOneFlagRequired\":\"You must specify one and only one flag: --{0}, --{1}, or --{2}.\",\"Prompt_PasswordReset\":\"User password has been reset.\",\"Prompt_RestoreNotRequired\":\"This user has not been deleted. Nothing to restore.\",\"Prompt_RolesEmpty\":\"--roles cannot be empty.\",\"Prompt_SearchUserParameterRequired\":\"To search for a user, you must specify either --id (UserId), --email (User Email), or --name (Username).\",\"Prompt_StartDateGreaterThanEnd\":\"Start Date cannot be less than End Date.\",\"Prompt_UserAlreadyDeleted\":\"User is already deleted. Want to delete permanently? Use \\\\\\\"purge-user\\\\\\\"\",\"Prompt_UserDeletionFailed\":\"The user was found but the system is unable to delete it.\",\"Prompt_UserIdIsRequired\":\"You must specify a valid User ID as either the first argument or using the --id flag.\",\"Prompt_UserPurged\":\"The User has been permanently removed from the site.\",\"Prompt_AddRoles_ResultHtml\":\"

Add a Role to a User

\\r\\n add-roles --id 23 --roles Editor OR\\r\\n add-roles 23 --roles Editor OR\\r\\n add-roles --id 23 \\\"Editor\\\"\\r\\n

Add a Multi-Word Role to a User

\\r\\n add-roles --id 23 --roles \\\"Article Reviewer\\\"\\r\\n\\r\\n

Add Multiple Roles to a User

\\r\\n add-roles --id 23 --roles \\\"Editor, Writer, Article Reviewer\\\"\",\"Prompt_AddRoles_Description\":\"Add one or more DNN security roles to a user.\",\"Prompt_AddRoles_FlagEnd\":\"End date of the role.\",\"Prompt_AddRoles_FlagId\":\"User ID of user to which the roles will be added. If a number is passed as the first argument, you do not need\\r\\n to use the --id flag explicitly\",\"Prompt_AddRoles_FlagRoles\":\"Comma-delimited string of DNN role names to apply to user.\",\"Prompt_AddRoles_FlagStart\":\"Effective date of the role.\",\"Prompt_DeleteUser_Description\":\"Deletes the specified user from the portal. After deletion, the user can still be recovered. To delete the user permanently, follow this command with the purge-user command.\",\"Prompt_DeleteUser_FlagId\":\"The user's User ID. If the flag is not used, then the user's ID must be the first argument.\",\"Prompt_DeleteUser_FlagNotify\":\"If true, the "Unregister User" notification email will be sent (typically to the site Admin)\",\"Prompt_DeleteUser_ResultHtml\":\"

Delete a User

\\r\\n

This delete's the user with a User ID of 345. The user is not permanently deleted at this point. It is in a kind of recycle bin. You can use get-user 345 to see the user details and you'll see that the IsDeleted property is now True. So, you can use the restore-user command to recover the user record or you can recover the user using DNN's user interface. If you want to permanently delete the user, then you'll need to execute a second command: purge-user

\\r\\n delete-user 345\\r\\n

This is the more explicit form of the above code.

\\r\\n delete-user --id 345\\r\\n\\r\\n

Delete a User and Send Notification

\\r\\n

This delete's the user with a User ID of 345 and sends an email notification. Like above, the user is not permanently deleted at this point. If you want to permanently delete the user, then you'll need to execute a second command: purge-user

\\r\\n delete-user 345 --notify true\\r\\n

This is the more explicit form of the above code.

\\r\\n delete-user --id 345 --notify true\",\"Prompt_GetUser_FlagEmail\":\"The email address for the user being retrieved. You can use the asterisk ( * ) as a wildcard\\r\\n to signify 0 or more characters.\",\"Prompt_GetUser_FlagId\":\"Explicitly specifies the UserId for the user being retrieved.\",\"Prompt_GetUser_FlagUsername\":\"The username for the user being retrieved. You can use the asterisk ( * ) as a wildcard\\r\\n to signify 0 or more characters.\",\"Prompt_GetUser_ResultHtml\":\"
\\r\\n

Get Current User

\\r\\n \\r\\n get-user\\r\\n \\r\\n\\r\\n

Get User by User ID

\\r\\n\\r\\n
Implicit Use of --id flag
\\r\\n

When specifying a single value after the command name, if it is an integer, Prompt will assume it is a User ID

\\r\\n get-user 345\\r\\n\\r\\n
Explicit use of --id flag
\\r\\n

You can explicitly use the --id flag to avoid any confusion

\\r\\n get-user --id 345\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
\\r\\n\\r\\n

Get User by Email

\\r\\n\\r\\n
Implicit Use of --email flag
\\r\\n

When specifying a single value after the command name, if it contains the at symbol ( @ ),\\r\\n Prompt will assume it is an Email

\\r\\n get-user jsmith@sample.com\\r\\n\\r\\n
Explicit Use of --email flag
\\r\\n

You can explicitly use the --email flag to avoid any confusion

\\r\\n get-user --email jsmith@sample.com\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
\\r\\n\\r\\n

Search for User by Email Using Wildcards

\\r\\n
Implicit Use of --email flag
\\r\\n

\\r\\n When specifying a single value after the command name, if it contains the at symbol ( @ ),\\r\\n Prompt will assume it is an Email. Only the first matched user record will be returned. Try using list-users if you would like to find all matching users.\\r\\n

\\r\\n get-user jsmith*@sample.com\\r\\n
Explicit Use of --email flag
\\r\\n get-user --email jsmith*@sample.com\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
\\r\\n\\r\\n

Get User by Username

\\r\\n
Implicit Use of --username flag
\\r\\n

When specifying a single value after the command name, if it is not a number and does not contain the at symbol (\\r\\n @ ), Prompt will assume it is a Username

\\r\\n get-user jsmith\\r\\n\\r\\n
Explicit Use of --username flag
\\r\\n

You can explicitly use the --username flag to avoid any confusion

\\r\\n get-user --username jsmith\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
\\r\\n\\r\\n

Search for User by Username Using Wildcards

\\r\\n
Implicit Use of --username flag
\\r\\n

When specifying a single value after the command name, if it is not a number and does not contain the at symbol (\\r\\n @ ), Prompt will assume it is a Username

\\r\\n get-user --username jsmith*\\r\\n
Explicit Use of --username flag
\\r\\n get-user jsmith* (value cannot have an @ symbol or be interpreted as an Integer for this to\\r\\n work)\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
\\r\\n
\",\"Prompt_ListUsers_Description\":\"Find users based on email or username. Supports partial matching on Email or Username. You can only search by on flag at a time. Flags may not be combined.\",\"Prompt_ListUsers_FlagEmail\":\"A search pattern to search for in the user's email address. You can use the asterisk ( * ) as a wildcard to signify 0 or more characters\",\"Prompt_ListUsers_FlagMax\":\"Page Size for the page. Max is 500.\",\"Prompt_ListUsers_FlagPage\":\"Page number to show records.\",\"Prompt_ListUsers_FlagRole\":\"The name of the DNN Security Role whose members you'd like to list. IMPORTANT: wildcard searching is NOT enabled for this flag at this time. Role names are case-insensitive but spacing must match.\",\"Prompt_ListUsers_FlagUsername\":\"A search pattern to search for in the username. You can use the asterisk ( * ) as a wildcard to signify 0 or more characters\",\"Prompt_ListUsers_ResultHtml\":\"
\\r\\n

List All Users in Current Portal

\\r\\n \\r\\n list-users\\r\\n \\r\\n\\r\\n

Search for Users by Email

\\r\\n
Implicit Use of --email flag
\\r\\n

When specifying a single value after the command name, if it contains the at symbol ( @ ), Prompt will assume it is an Email

\\r\\n list-users jsmith@sample.com\\r\\n
Explicit use of --email flag
\\r\\n list-users --email jsmith@sample.com\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
\\r\\n\\r\\n

Search for Users by Email Using Wildcards

\\r\\n
Implicit Use of --email flag
\\r\\n

When specifying a single value after the command name, if it contains the at symbol ( @ ), Prompt will assume it is an Email

\\r\\n list-users jsmith*@sample.com\\r\\n
Explicit use of --email flag
\\r\\n list-users --email jsmith*@sample.com\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserIdUsernameEmailDisplayNameFirstNameLastNameLastLoginIsAuthorized
345jsmithjsmith@sample.comJohn SmithJohnSmith2016-12-06T09:31:38.413-07:00true
1095jsmithsonjsmithson@sample.comJerry SmithsonJerrySmithson2016-12-063T08:15:28.123-07:00true
\\r\\n\\r\\n

Search for Users by Username

\\r\\n
Implicit Use of --username flag
\\r\\n

When specifying a single value after the command name, if it is not a number and does not contain the at symbol ( @ ), Prompt will assume it is a Username

\\r\\n list-users jsmith\\r\\n
Explicit Use of --username flag
\\r\\n list-users --username jsmith\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserId:345
Username:jsmith
Email:jsmith@sample.com
DisplayName:John Smith
FirstName:John
LastName:Smith
LastLogin:2016-12-06T09:31:38.413-07:00
IsAuthorized:true
Created:2016-12-06T09:31:38
IsDeleted:false
\\r\\n\\r\\n

Search for User by Username Using Wildcards

\\r\\n
Implicit Use of --username flag
\\r\\n

When specifying a single value after the command name, if it is not a number and does not contain the at symbol ( @ ), Prompt will assume it is a Username

\\r\\n list-users jsmith*\\r\\n
Explicit Use of --username flag
\\r\\n list-users --username jsmith*\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserIdUsernameEmailLastLoginIsDeletedIsAuthorized
345jsmithjsmith@sample.com2016-12-06T09:31:38.413-07:00falsetrue
1095jsmithsonjsmithson@sample.com2016-12-063T08:15:28.123-07:00falsetrue
\\r\\n\\r\\n

List Users In a DNN Security Role

\\r\\n list-users --role \\\"Registered Users\\\"\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
UserIdUsernameEmailLastLoginIsDeletedIsAuthorized
2adminadmin@mysite.com2016-12-01T06:03:10-07:00falsetrue
3tuser1tuser1@mysite.com2016-12-01T09:31:38.413-07:00falsetrue
31jsmithjsmith@mysite.com2016-12-19T12:23:39-07:00falsetrue
\\r\\n
\",\"Prompt_NewUser_Description\":\"Creates a new User record in the portal\",\"Prompt_NewUser_FlagApproved\":\"Whether the user account is authorized. Defaults to true if not specified.\",\"Prompt_NewUser_FlagEmail\":\"The user's Email address\",\"Prompt_NewUser_FlagFirstname\":\"The user's First Name\",\"Prompt_NewUser_FlagLastname\":\"The user's Last Name\",\"Prompt_NewUser_FlagNotify\":\"If true, the system email will be sent to the user at the user's email address. The type of email is determined\\r\\n by the registration type. If this is not passed, the default portal settings will be observed. If the site's\\r\\n registration mode is set to None, no email will be sent regardless of the value of --notify.\",\"Prompt_NewUser_FlagPassword\":\"The Password for the user account. If not specified, a random password will be generated. Note that unless you\\r\\n are forcing the user to reset their password, you should ensure that someone is notified of the password.\",\"Prompt_NewUser_FlagUsername\":\"The user's Username\",\"Prompt_NewUser_ResultHtml\":\"

Create a New User with Just the Required Values

\\r\\n

This generates a random password and assigns it to the newly created user. Display name is generated by concatenating\\r\\n the first and last name. Note that because \\\"van Doorne\\\" contains a space, we need to enclose it in double-quotes. The\\r\\n resulting Display name will be \\\"Erik van Doorne\\\".

\\r\\n new-user --username edoorne --email edoorne@myemail.com --firstname Erik --lastname \\\"van Doorne\\\"\",\"Prompt_ResetPassword_Description\":\"Sets the reset password token for the user. It does not automatically reset the user's password. By default,\\r\\n this command will send the reset password email to the user. You can override this behavior by specifying the --notify flag with a value of false\",\"Prompt_ResetPassword_FlagId\":\"User ID of user to send Reset Password link to.\",\"Prompt_ResetPassword_FlagNotify\":\"If true, the system email will be sent to the user at the user's email address.\",\"Prompt_ResetPassword_ResultHtml\":\"\\r\\n reset-password userId\\r\\n \",\"Prompt_SetUser_Description\":\"Enables you to set various values related to the specified user.\",\"Prompt_SetUser_FlagApproved\":\"Approval status of the user.\",\"Prompt_SetUser_FlagDisplayname\":\"The name to be displayed for the user.\",\"Prompt_SetUser_FlagEmail\":\"The email address to set for the user.\",\"Prompt_SetUser_FlagFirstname\":\"The first name of the user.\",\"Prompt_SetUser_FlagId\":\"The UserId for the user being updated. This value is required, but if you pass the value as the first argument after the\\r\\n command name, you do not need to explicitly use the --id flag. (see the examples below)\",\"Prompt_SetUser_FlagLastname\":\"The last name of the user.\",\"Prompt_SetUser_FlagPassword\":\"The new password to assign to the user. The password must be valid according to the site's password rules.\",\"Prompt_SetUser_FlagUsername\":\"The username to set for the user.\",\"Prompt_SetUser_ResultHtml\":\"
\\r\\n

Approve/UnApprove a User

\\r\\n

\\r\\n Approves/UnApproves the user with a User ID of 345. In this example, true is passed for the --approve flag.\\r\\n

\\r\\n \\r\\n set-user 345 --approve true\\r\\n \\r\\n\\r\\n

Change a User's Username

\\r\\n

Changes the username of the user with a User ID of 345 to john.smith.

\\r\\n \\r\\n set-user 345 --username \\\"john.smith\\\"\\r\\n \\r\\n\\r\\n

Change a User's Name Properties

\\r\\n

\\r\\n Sets the first, last, and display name for the user with an ID of 345. Note that John and Smith do not need to be surrounded by quotes but Johnny Smith does since it is more than one word.\\r\\n

\\r\\n \\r\\n set-user 345 --firstname John --lastname Smith --displayname \\\"Johnny Smith\\\"\\r\\n \\r\\n\\r\\n
\",\"Prompt_GetUser_Description\":\"Enables you to display the current user's information, or retrieve a user by their User ID, Username or Email address.\\r\\n Supports partial searching. Returns the first user found.\",\"Prompt_UsersCategory\":\"User Commands\"},\"Vocabularies\":{\"cancelCreate\":\"Cancel\",\"ControlTitle_createvocabulary\":\"Create New Vocabulary\",\"ControlTitle_editvocabulary\":\"Edit Vocabulary\",\"SaveVocabulary\":\"Update\",\"CurrentTerm\":\"Edit Term\",\"DeleteVocabulary\":\"Delete\",\"Terms\":\"Terms\",\"Title\":\"Edit Vocabulary\",\"DeleteTerm\":\"Delete\",\"SaveTerm\":\"Update\",\"AddTerm\":\"Add Term\",\"CreateTerm\":\"Save\",\"NewTerm\":\"Create New Term\",\"TermValidationError.Message\":\"There was an error validating the term. Terms must include a name.\",\"TermValidationError.MessageHeader\":\"Term Validation Error\",\"ControlTitle_edit\":\"Edit Vocabulary\",\"ParentTerm\":\"Parent Term\",\"ParentTerm.ToolTip\":\"The parent term for this heirarchical term.\",\"TermName\":\"Name\",\"TermName.ToolTip\":\"The name of the term.\",\"TermName.Required\":\"The term name is a required field.\",\"Application\":\"Application\",\"Description\":\"Description\",\"Description.ToolTip\":\"The description for the vocabulary.\",\"Hierarchy\":\"Hierarchy\",\"Name.Required\":\"A name is required for a vocabulary.\",\"Name\":\"Name\",\"Name.ToolTip\":\"The name for the vocabulary.\",\"Portal\":\"Website\",\"Scope\":\"Scope\",\"Scope.ToolTip\":\"The scope for this vocabulary, application-wide or site-specific.\",\"Simple\":\"Simple\",\"Type\":\"Type\",\"Type.ToolTip\":\"The type of vocabulary, simple or heirarchical.\",\"VocabularyExists.Error\":\"The vocabulary \\\"{0}\\\" exists in the list.\",\"Create\":\"Create New Vocabulary\",\"Description.Header\":\"Description\",\"Name.Header\":\"Name\",\"Scope.Header\":\"Scope\",\"Type.Header\":\"Type\",\"Create.ToolTip\":\"Click on this button to create a new vocabulary.\",\"Edit\":\"Edit\",\"Confirm\":\"Are you sure you want to add a vocabulary?\",\"ControlTitle_\":\"Vocabularies\",\"nav_Vocabularies\":\"Vocabularies\",\"TermExists.Error\":\"The term \\\"{0}\\\" exists in the list.\",\"ConfirmDeletion_Vocabulary\":\"Are you sure you want to delete \\\"{0}\\\"?\",\"ConfirmDeletion_Term\":\"Are you sure you want to delete the term \\\"{0}\\\"?\",\"LoadMore\":\"Load More\",\"RequiredField\":\"Required Field\",\"CreateVocabulary\":\"Create\",\"NoVocabularyTerms.Error\":\"No vocabularies found.\",\"Close\":\"Close\",\"All\":\"All\",\"BackToVocabularies\":\"Back To Vocabularies\",\"EditFieldHelper\":\"Press ENTER when done, or ESC to cancel\"},\"AccountSettings\":{\"nav_AccountSettings\":\"Accounts\"},\"Assets\":{\"assets_AddAsset\":\"Add Asset\",\"assets_AddFolder\":\"Add Folder\",\"assets_BrowseToUpload\":\"Browse to Upload\",\"assets_Details\":\"Details\",\"assets_emptySubtitle\":\"Use the tools above to add an asset or create a folder\",\"assets_emptyTitle\":\"This Folder is Empty\",\"assets_FolderName\":\"Name\",\"assets_FolderNamePlaceholder\":\"Enter folder name\",\"assets_FolderParent\":\"Folder Parent:\",\"assets_FolderType\":\"Type\",\"assets_In\":\"In: \",\"assets_Location\":\"Location: \",\"assets_MappedName\":\"Mapped Path\",\"assets_noSearchResults\":\"Your Search Produced No Results\",\"assets_Permissions\":\"Permissions\",\"assets_Search\":\"Search\",\"assets_SearchBoxPlaceholder\":\"Search Files\",\"nav_Assets\":\"Assets\",\"assets_Sync\":\"Sync this folder and subfolders\",\"btn_Cancel\":\"Cancel\",\"btn_Close\":\"Close\",\"btn_Delete\":\"Delete\",\"btn_Save\":\"Save\",\"btn_Replace\":\"Replace\",\"btn_Preview\":\"Preview\",\"label_MoveFile\":\"Move file to (select a destination)\",\"label_MoveFolder\":\"Move folder to (select a destination)\",\"btn_Move\":\"Move\",\"label_CopyFile\":\"Copy file to (select a destination)\",\"label_CopyFolder\":\"Copy folder to (select a destination)\",\"btn_Copy\":\"Copy\",\"label_By\":\"by\",\"label_Created\":\"Created:\",\"label_Description\":\"Description\",\"label_DiscardAll\":\"Discard All\",\"label_FolderType\":\"Folder type:\",\"label_LastModified\":\"Last Modified:\",\"label_Name\":\"Name\",\"label_PendingItems\":\"Pending Items\",\"label_PublishAll\":\"Publish All\",\"label_Size\":\"Size:\",\"label_Subscribe\":\"Subscribe:\",\"label_Tag\":\"Tag\",\"label_Tags\":\"Tags\",\"label_Title\":\"Title\",\"label_Url\":\"URL:\",\"label_Versioning\":\"Versioning\",\"label_Workflow\":\"Workflow\",\"lbl_Root\":\"Home\",\"txt_ConfirmDeleteAsset\":\"Are you sure you want to delete the asset '[NAME]'?\",\"txt_ConfirmDeleteFolder\":\"Are you sure you want to delete the folder '[NAME]'?\",\"txt_ConfirmReplace\":\"Item '[NAME]' already exists in destination folder. Do you want to replace?\",\"folderPicker_clearButtonTooltip\":\"Clear\",\"folderPicker_loadingResultText\":\"...Loading Results\",\"folderPicker_resultsText\":\"Results\",\"folderPicker_searchButtonTooltip\":\"Search\",\"folderPicker_searchInputPlaceHolder\":\"Folder Name\",\"folderPicker_selectedItemCollapseTooltip\":\"Click to collapse\",\"folderPicker_selectedItemExpandTooltip\":\"Click to expand\",\"folderPicker_selectItemDefaultText\":\"Search Folders\",\"folderPicker_sortAscendingButtonTitle\":\"A-Z\",\"folderPicker_sortAscendingButtonTooltip\":\"Sort in ascending order\",\"folderPicker_sortDescendingButtonTooltip\":\"Sort in descending order\",\"folderPicker_unsortedOrderButtonTooltip\":\"Remove sorting\",\"assets_Versioning\":\"Versioning\",\"assets_Workflow\":\"Workflow\",\"UserHasNoPermissionToDownload.Error\":\"The user does not have permission to download this file.\",\"DestinationFolderCannotMatchSourceFolder.Error\":\"Destination folder cannot match the source folder.\",\"UserHasNoPermissionToCopyFolder.Error\":\"The user does not have permission to copy from this folder\",\"UserHasNoPermissionToMoveFolder.Error\":\"The user does not have permission to move from this folder.\",\"FolderDoesNotExists.Error\":\"The folder does not exist.\",\"MaxFileVersions\":\"Maximun number of versions\",\"col_Date\":\"Date\",\"col_State\":\"State\",\"col_User\":\"User\",\"col_Version\":\"Version\",\"pager_ItemDesc\":\"Showing {0} versions\",\"pager_ItemPagedDesc\":\"Showing {0}-{1} of {2} versions\",\"pager_PageDesc\":\"Page {0} of {1}\",\"Published\":\"Published\",\"Unpublished\":\"Unpublished\",\"sort_LastModified\":\"Last Modified\",\"sort_DateUploaded\":\"Date Uploaded\",\"sort_Alphabetical\":\"Alphabetical\",\"btn_Rollback\":\"Rollback\",\"btn_Approve\":\"Approve\",\"btn_Reject\":\"Reject\",\"btn_Publish\":\"Publish\",\"btn_Submit\":\"Submit\",\"btn_Discard\":\"Discard\",\"ConfirmDeleteFileVersion\":\"Are you sure you want to delete this version?\",\"ConfirmRollbackFileVersion\":\"Are you sure you want to rollback to version [VERSION]?\",\"SuccessFileVersionDeletion\":\"The version has been deleted successfully\",\"SuccessFileVersionRollback\":\"The version has been rollback successfully\",\"label_ModifiedOnDate\":\"Modified:\",\"label_ModifiedByUser\":\"Modified By:\",\"label_WorkflowName\":\"Workflow:\",\"label_WorkflowState\":\"State:\",\"label_WorkflowComment\":\"Workflow Comment\",\"WorkflowCommentPlaceholder\":\"Enter a comment\",\"UserHasNoPermissionToAddFileInFolder.Error\":\"The user does not have permission to add files in this folder.\",\"UserHasNoPermissionToDeleteFile.Error\":\"The user does not have permission to delete file.\",\"UserHasNoPermissionToDeleteFolder.Error\":\"The user does not have permission to delete folder.\",\"UserHasNoPermissionToManageVersions.Error\":\"The user does not have permission to manage the file versions.\",\"UserHasNoPermissionToReadFileProperties.Error\":\"The user does not have permission to read file details.\",\"UserHasNoPermissionToSaveFileProperties.Error\":\"The user does not have permission to save the file details.\",\"UserHasNoPermissionToSaveFolderProperties.Error\":\"The user does not have permission to save the folder details.\",\"ZoomPendingVersionAltText\":\"See the 'Pending for Approval' file version.\",\"WorkflowOperationProcessedSuccessfully\":\"The operation has been processed successfully.\",\"Action.Header\":\"Action\",\"Comment.Header\":\"Comment\",\"Date.Header\":\"Date\",\"User.Header\":\"User\",\"FolderDoesNotExist.Error\":\"The folder does not exist.\",\"NOTIFY_BodyFileAdded\":\"The file [FILE] has been added to the folder [FOLDERPATH]. Click the following link to download the file [URL]\",\"NOTIFY_BodyFileContentChanged\":\"The content of the file [FILEPATH] has changed. Click the following link to download the file [URL]\",\"NOTIFY_BodyFileDeleted\":\"The file [FILEPATH] has been deleted.\",\"NOTIFY_BodyFileDeletedOnFolder\":\"The file [FILE] has been deleted from the folder [OLDPATH]\",\"NOTIFY_BodyFileExpired\":\"The file [FILE] is close to expire on [FOLDERPATH]. The End Date is [ENDDATE]. Click the following link to download the file [URL]\",\"NOTIFY_BodyFileMoved\":\"The file [FILE] has been moved from [OLDPATH] to [FOLDERPATH] folder. Click the following link to download the file [URL]\",\"NOTIFY_BodyFileRenamed\":\"The file [FILE] has been renamed to [NEWFILE]. Click the following link to download the file [URL]\",\"NOTIFY_BodyFolderAdded\":\"A folder called [SUBFOLDER] has been added into the folder [FOLDERPATH]\",\"NOTIFY_BodyFolderDeleted\":\"The folder [FOLDERPATH] has been deleted.\",\"NOTIFY_BodyFolderMoved\":\"The folder [FOLDER] has been moved at the following location [FOLDERPATH]\",\"NOTIFY_BodyFolderRenamed\":\"The folder [FOLDER] has been rename to [NEWFOLDER].\",\"NOTIFY_BodySubFolderDeleted\":\"The folder [SUBFOLDER] has been deleted from [FOLDERPATH]\",\"NOTIFY_FileManagementReference\":\"Click {0} to go to File Management\",\"NOTIFY_FileManagementReferenceLink\":\"here\",\"NOTIFY_SubjectFileAdded\":\"A new file has been added to the folder [FOLDER]\",\"NOTIFY_SubjectFileContentChanged\":\"The content of the file [FILE] has changed.\",\"NOTIFY_SubjectFileDeleted\":\"The file [FILE] has been deleted.\",\"NOTIFY_SubjectFileDeletedOnFolder\":\"A contained file has been deleted from folder [FOLDER]\",\"NOTIFY_SubjectFileExpired\":\"The file [FILE] is close to expire\",\"NOTIFY_SubjectFileExpiredOnFolder\":\"A file is close to expire on folder [FOLDER].\",\"NOTIFY_SubjectFileMoved\":\"The file [FILE] has been moved.\",\"NOTIFY_SubjectFileRenamed\":\"The file [FILE] has been renamed.\",\"NOTIFY_SubjectFileRenamedOnFolder\":\"A file has been renamed on folder [FOLDER]\",\"NOTIFY_SubjectFolderAdded\":\"A new folder has been added into [FOLDER].\",\"NOTIFY_SubjectFolderDeleted\":\"The folder [FOLDER] has been deleted.\",\"NOTIFY_SubjectFolderMoved\":\"The folder [FOLDER] has been moved.\",\"NOTIFY_SubjectFolderRenamed\":\"The folder [FOLDER] has been renamed.\",\"NOTIFY_SubjectSubFolderDeleted\":\"A contained folder has been deleted from folder [FOLDER].\",\"WORKFLOW_DocumentApprovedNotificationBody\":\"The document [FILEPATH] has been approved. Click here to open the document.\",\"WORKFLOW_DocumentApprovedNotificationSubject\":\"Document changes approved.\",\"WORKFLOW_DocumentDiscartedNotificationBody\":\"The document [FILEPATH] has been discarted.\",\"WORKFLOW_DocumentDiscartedNotificationSubject\":\"Document Discarded\",\"WORKFLOW_DocumentPendingToBeApprovedNotificationBody\":\"The document '{0}' is in '{1}' and requires your review and approval.

{2}\",\"WORKFLOW_DocumentPendingToBeApprovedNotificationSubject\":\"Document awaiting approval.\",\"WORKFLOW_DocumentPendingToBeSubmitedNotificationBody\":\"The document '{0}' is in '{1}' and requires your review and submission.
\",\"WORKFLOW_DocumentPendingToBeSubmitedNotificationSubject\":\"Document awaiting submission.\",\"WORKFLOW_DocumentRejectedNotificationBody\":\"Changes for the document '{0}' has been rejected. It is now in state '{1}'.

{2}\",\"WORKFLOW_DocumentRejectedNotificationSubject\":\"Document changes rejected.\",\"ZoomImageAltText\":\"Preview\",\"Host\":\"Global Assets\",\"label_Archive\":\"Archive\",\"label_EndDate\":\"End Date\",\"label_Hidden\":\"Hidden\",\"label_PublishPeriod\":\"Publish Period\",\"label_ReadOnly\":\"Read-Only\",\"label_StartDate\":\"Start Date\",\"label_System\":\"System\",\"label_Locked\":\"File is locked because it is not within a valid start and end date for publication.\",\"assets_FileType\":\"Type:\"},\"CommunityAnalytics\":{\"analytics_Apply\":\"Apply\",\"analytics_AverageTime\":\"Time On Page\",\"analytics_BounceRate\":\"Bounce Rate\",\"analytics_Channels\":\"Channels\",\"analytics_ComparativeTerm\":\"Comparative Term\",\"analytics_Custom\":\"Custom\",\"analytics_Dashboard\":\"Dashboard\",\"analytics_Day\":\"Day\",\"analytics_Devices\":\"Devices\",\"analytics_direct\":\"Direct\",\"analytics_direct_referral\":\"Direct Referral\",\"analytics_exitpages\":\"Exit Pages\",\"analytics_external\":\"External\",\"analytics_From\":\"From\",\"analytics_internal\":\"Internal\",\"analytics_Month\":\"Month\",\"analytics_NavigationSummary\":\"Navigation Summary\",\"analytics_NoDataAvailable\":\"No data available\",\"analytics_PageActivities\":\"Page Activities\",\"analytics_PageTraffic\":\"Page Analytics\",\"analytics_PageViewActivity\":\"Page Traffic\",\"analytics_PageViews\":\"Page Views\",\"analytics_Page_Events\":\"Page Events\",\"analytics_Referrers\":\"Referrers\",\"analytics_search\":\"Search\",\"analytics_Sessions\":\"Sessions\",\"analytics_SiteActivities\":\"Site Activities\",\"analytics_SiteViewActivity\":\"Site Traffic\",\"analytics_Site_Events\":\"Site Events\",\"analytics_social\":\"Social\",\"analytics_To\":\"To\",\"analytics_TopOperatingSystems\":\"Top OS's\",\"analytics_TopPages\":\"Top Pages\",\"analytics_TopReferrers\":\"Top Referrers\",\"analytics_UniqueSessions\":\"Unique Sessions\",\"analytics_UniqueVisitors\":\"Unique Visitors\",\"analytics_Visitors\":\"Visitors\",\"analytics_Week\":\"Week\",\"analytics_Year\":\"Year\",\"btn_Add\":\"Add\",\"btn_Apply\":\"Apply\",\"btn_Authenticate\":\"Authenticate\",\"btn_Cancel\":\"Cancel\",\"btn_Checking\":\"Checking ...\",\"btn_Close\":\"Close\",\"btn_Connect\":\"Connect\",\"btn_CreateBadge\":\"Create a Badge\",\"btn_CreateNew\":\"Create New\",\"btn_CreateUser\":\"Create User\",\"btn_Delete\":\"Delete\",\"btn_DemoteUser\":\"Demote User\",\"btn_Edit\":\"Edit\",\"btn_EditPoints\":\"Edit Points\",\"btn_Keep\":\"Keep\",\"btn_LoadMore\":\"Load More\",\"btn_Next\":\"Next\",\"btn_Prev\":\"Previous\",\"btn_PromoteUser\":\"Promote User\",\"btn_Replace\":\"Replace\",\"btn_Save\":\"Save\",\"btn_Saving\":\"Saving ...\",\"btn_ShowMore\":\"SHOW MORE\",\"btn_ViewFiles\":\"Assets\",\"btn_ViewProfile\":\"Profile\",\"calendar_apply\":\"Apply\",\"calendar_cancel\":\"Cancel\",\"calendar_end\":\"Ends:\",\"calendar_start\":\"Starts:\",\"calendar_time\":\"Time:\",\"cmx_Edition\":\"Community Manager Edition\",\"col_Actions\":\"Actions\",\"col_Activity\":\"Activity\",\"col_Badge\":\"Badge\",\"col_Email\":\"Email\",\"col_EXP\":\"EXP PTS\",\"col_EXPAbbreviation\":\"EXP\",\"col_Goals\":\"Goals\",\"col_GoalType\":\"Goal Type\",\"col_Joined\":\"Joined\",\"col_Limits\":\"Limits\",\"col_MaxValue\":\"Max Value\",\"col_MinValue\":\"Min Value\",\"col_Module\":\"Module\",\"col_MostActiveUsers\":\"Most Active\",\"col_Name\":\"Name\",\"col_PowerRankings\":\"Reputation\",\"col_Privilege\":\"Privilege\",\"col_Pts\":\"Pts\",\"col_REP\":\"REP PTS\",\"col_REPAbbreviation\":\"REP\",\"col_RoleExpiry\":\"Expires\",\"col_RoleStart\":\"Start\",\"col_Tier\":\"Tier\",\"col_Time\":\"Time\",\"col_Timeframe\":\"Timeframe\",\"col_TopSpectators\":\"Top Spectators\",\"col_Value\":\"Value\",\"col_Views\":\"Views\",\"col_Weight\":\"Weight\",\"desc_EditBadge\":\"Define basic information for the badge\",\"desc_Goal\":\"Set the goals for the badge\",\"desc_Scoring\":\"Assign scoring actions to the badge\",\"gaming_Badges\":\"Badges\",\"gaming_Privileges\":\"Privileges\",\"gaming_Scoring\":\"Actions\",\"label_Activities\":\"Activities\",\"label_Adoptions\":\"Adoption\",\"label_AvailableActions\":\"Available Actions\",\"label_AverageTime\":\"Average Time\",\"label_BadgeBanner\":\"Badge Banner\",\"label_BadgeDesc\":\"Description\",\"label_BadgeName\":\"Badge Name\",\"label_BadgeTier\":\"Badge Tier\",\"label_BounceRate\":\"Bounce Rate\",\"label_By\":\"by\",\"label_CommentModeration\":\"Comment Moderation\",\"label_CommentsPageSize\":\"Comments Page Size\",\"label_ComparativeTerm\":\"Comparative Term\",\"label_ContentModeration\":\"Content Moderation\",\"label_Count\":\"Count\",\"label_Create\":\"Creates\",\"label_Created\":\"Created:\",\"label_Date\":\"Date\",\"label_Days\":\"Number of Days\",\"label_Description\":\"Description\",\"label_DiscardAll\":\"Discard All\",\"label_DropFile\":\"Drop File(s) Here\",\"label_Email\":\"Email\",\"label_Engagement\":\"Engagement\",\"label_Experience\":\"Experience Points\",\"label_ExperienceAbbreviation\":\"Experience\",\"label_FirstName\":\"First Name\",\"label_FolderType\":\"Folder type:\",\"label_From\":\"From\",\"label_GroupHomePage\":\"Group Home Page\",\"label_Influence\":\"Influence\",\"label_LastActive\":\"Last active: \",\"label_LastModified\":\"Last Modified:\",\"label_LastName\":\"Last Name\",\"label_Maximum\":\"Maximum Times\",\"label_MemberOf\":\"Member of\",\"label_Minutes\":\"Min\",\"label_NA\":\"N/A\",\"label_Name\":\"Name\",\"label_NoActivities\":\"No Activities\",\"label_NotApplicable\":\"N/A\",\"label_OneMillionSufix\":\"M\",\"label_OneThousandSufix\":\"K\",\"label_PageSize\":\"Page Size\",\"label_Participation\":\"Participation\",\"label_PendingItems\":\"Pending Items\",\"label_Percent\":\"Percent\",\"label_Period\":\"Period\",\"label_Profanity\":\"Profanity Filtering\",\"label_PublishAll\":\"Publish All\",\"label_Rank\":\"Rank\",\"label_RecentActivity\":\"Recent Activity\",\"label_Reputation\":\"Reputation Points\",\"label_ReputationAbbreviation\":\"Reputation\",\"label_Role\":\"Role\",\"label_SelectedActions\":\"Selected Actions\",\"label_Size\":\"Size:\",\"label_Spectators\":\"Spectators\",\"label_Subscribe\":\"Subscribe:\",\"label_Tag\":\"Tag\",\"label_Tags\":\"Tags\",\"label_Timeframe\":\"Timeframe\",\"label_TimeOnSite\":\"Time on site: \",\"label_Title\":\"Title\",\"label_To\":\"To\",\"label_TotalContributions\":\"total content contributions\",\"label_TotalCreate\":\"Total Creates\",\"label_Totals\":\"Totals\",\"label_TotalViews\":\"Total Views\",\"label_Url\":\"URL:\",\"label_UserName\":\"User Name\",\"label_UserRemoved\":\"User Removed\",\"label_Users\":\"Users\",\"label_Versioning\":\"Versioning\",\"label_View\":\"VIEWS\",\"label_Views\":\"Views\",\"label_Workflow\":\"Workflow\",\"label_WYSIWYG\":\"Enable WYSIWYG\",\"lbl_Root\":\"Home\",\"menu_Dashboard_Answers\":\"Answers\",\"menu_Dashboard_Blogs\":\"Blogs\",\"menu_Dashboard_Connections\":\"Connections\",\"menu_Dashboard_Discussions\":\"Discussions\",\"menu_Dashboard_Events\":\"Events\",\"menu_Dashboard_Experiments\":\"Experiments\",\"menu_Dashboard_Ideas\":\"Ideas\",\"menu_Dashboard_Overview\":\"Overview\",\"menu_Dashboard_PageTraffic\":\"Page Traffic\",\"menu_Dashboard_SiteTraffic\":\"Site Traffic\",\"menu_Dashboard_Wiki\":\"Wiki\",\"nav_CommunityAnalytics\":\"Community Analytics\",\"opt_Activity\":\"Activity\",\"opt_Bronze\":\"Bronze\",\"opt_Custom\":\"Custom\",\"opt_Daily\":\"Daily\",\"opt_Day\":\"Day\",\"opt_FilterByModule\":\"Filter by module\",\"opt_FilterContent\":\"Filter Content\",\"opt_Gold\":\"Gold\",\"opt_Lifetime\":\"Lifetime\",\"opt_Members\":\"Members\",\"opt_Month\":\"Month\",\"opt_Monthly\":\"Monthly\",\"opt_NoFiltering\":\"No Filtering\",\"opt_NoLimit\":\"No Limit\",\"opt_ProhibitContent\":\"Prohibit Content\",\"opt_Silver\":\"Silver\",\"opt_Week\":\"Week\",\"opt_Weekly\":\"Weekly\",\"opt_Year\":\"Year\",\"opt_Yearly\":\"Yearly\",\"pager_ItemDesc\":\"Showing {0} items\",\"pager_ItemPagedDesc\":\"Showing {0}-{1} of {2} items\",\"pager_PageDesc\":\"Page {0} of {1}\",\"pager_RoleDesc\":\"Showing {0} roles\",\"pager_RolePagedDesc\":\"Showing {0}-{1} of {2} roles\",\"pager_UserDesc\":\"Showing {0} users\",\"pager_UserPagedDesc\":\"Showing {0}-{1} of {2} users\",\"placeholder_AddDescription\":\"Add description\",\"placeholder_AddTitle\":\"Add title\",\"placeholder_Search\":\"Filter by name\",\"placeholder_Tags\":\"separate tags with a comma\",\"title_ActivityByModule\":\"Activity\",\"title_AdoptionsAndParticipation\":\"Adoption, Participation & Spectators\",\"title_Badges\":\"Badge Management\",\"title_Community\":\"Community\",\"title_Connections\":\"Configure Connections\",\"title_Create\":\"Creates & Views\",\"title_CreateUser\":\"Create a User\",\"title_Dashboard\":\"Dashboard\",\"title_Engagement\":\"Engagement\",\"title_FindAnAsset\":\"Find an Asset\",\"title_FindUser\":\"Find a User\",\"title_Gaming\":\"Gaming\",\"title_Influence\":\"Influence\",\"title_ManageItem\":\"Manage:\",\"title_ModulePerformance\":\"Module Performance\",\"title_ModuleSettings\":\"Miscellaneous Community Settings\",\"title_PopularContent\":\"Popular Content\",\"title_Privilege\":\"Privilege Management\",\"title_ProblemsArea\":\"Community Health\",\"title_Scoring\":\"Scoring Action Management\",\"title_Settings\":\"Settings\",\"title_Tasks\":\"Tasks\",\"title_TopCommunityUsers\":\"Top Community Users\",\"title_TrendingTags\":\"Trending Tags\",\"title_Users\":\"Users\",\"tooltip_ActivityByModule\":\"[COUNT] Activities\",\"tooltip_AdoptionsAndParticipations\":\"[COUNT] Users\",\"tooltip_CreateSeries\":\"[COUNT] Creations\",\"tooltip_Down_Custom\":\"Down {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Down_Day_OnDay\":\"Down {0}% today compared to yesterday\",\"tooltip_Down_Day_OnMonth\":\"Down {0}% compared to this day a month ago\",\"tooltip_Down_Day_OnWeek\":\"Down {0}% compared to this day a week ago\",\"tooltip_Down_Day_OnYear\":\"Down {0}% compared to this day a year ago\",\"tooltip_Down_Month_OnMonth\":\"Down {0}% this month compared to last month\",\"tooltip_Down_Month_OnYear\":\"Down {0}% compared to this month a year ago\",\"tooltip_Down_Week_OnMonth\":\"Down {0}% compared to this week a month ago\",\"tooltip_Down_Week_OnWeek\":\"Down {0}% this week compared to last week\",\"tooltip_Down_Week_OnYear\":\"Down {0}% compared to this week a year ago\",\"tooltip_Down_Year_OnYear\":\"Down {0}% this year compared to last year\",\"tooltip_ShowAll\":\"Show All\",\"tooltip_Up_Custom\":\"Up {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Up_Day_OnDay\":\"Up {0}% today compared to yesterday\",\"tooltip_Up_Day_OnMonth\":\"Up {0}% compared to this day a month ago\",\"tooltip_Up_Day_OnWeek\":\"Up {0}% compared to this day a week ago\",\"tooltip_Up_Day_OnYear\":\"Up {0}% compared to this day a year ago\",\"tooltip_Up_Month_OnMonth\":\"Up {0}% this month compared to last month\",\"tooltip_Up_Month_OnYear\":\"Up {0}% compared to this month a year ago\",\"tooltip_Up_Week_OnMonth\":\"Up {0}% compared to this week a month ago\",\"tooltip_Up_Week_OnWeek\":\"Up {0}% this week compared to last week\",\"tooltip_Up_Week_OnYear\":\"Up {0}% compared to this week a year ago\",\"tooltip_Up_Year_OnYear\":\"Up {0}% this year compared to last year\",\"topCommunity_NoDataAvailable\":\"No data available\",\"txt_ConfirmDelete\":\"Are you sure you want to delete this item?\",\"txt_ConfirmDeleteAsset\":\"Are you sure you want to delete the asset '[NAME]'?\",\"txt_ConfirmDeleteFolder\":\"Are you sure you want to delete the folder '[NAME]'?\",\"txt_Deleted\":\"Item successfully deleted.\",\"txt_Items\":\"{0} items\",\"txt_NoPopularContent\":\"No popular content available in selected period\",\"txt_NoTrendingTags\":\"No trending tags available in selected period\",\"txt_PleaseTypeRoleName\":\"Please type a role name.\",\"txt_RoleSuccessfullyAdded\":\"Role successfully added\",\"txt_Saved\":\"Item successfully saved.\",\"txt_SetupConnections\":\"Setup your connections to easily share content and more\",\"txt_UserSaved\":\"User successfully saved.\",\"txt_ViewIndex\":\"Viewing {0} of {1}\",\"Answers\":\"Answers\",\"Blogs\":\"Blogs\",\"Discussions\":\"Discussions\",\"Events\":\"Events\",\"Export\":\"Export\",\"Ideas\":\"Ideas\",\"Wiki\":\"Wiki\"},\"CommunitySettings\":{\"btn_Add\":\"Add\",\"btn_Apply\":\"Apply\",\"btn_Authenticate\":\"Authenticate\",\"btn_Cancel\":\"Cancel\",\"btn_Checking\":\"Checking ...\",\"btn_Close\":\"Close\",\"btn_Connect\":\"Connect\",\"btn_CreateBadge\":\"Create a Badge\",\"btn_CreateNew\":\"Create New\",\"btn_CreateUser\":\"Create User\",\"btn_Delete\":\"Delete\",\"btn_DemoteUser\":\"Demote User\",\"btn_Edit\":\"Edit\",\"btn_EditPoints\":\"Edit Points\",\"btn_Keep\":\"Keep\",\"btn_LoadMore\":\"Load More\",\"btn_Next\":\"Next\",\"btn_Prev\":\"Previous\",\"btn_PromoteUser\":\"Promote User\",\"btn_Replace\":\"Replace\",\"btn_Save\":\"Save\",\"btn_Saving\":\"Saving ...\",\"btn_ShowMore\":\"SHOW MORE\",\"btn_ViewFiles\":\"Assets\",\"btn_ViewProfile\":\"Profile\",\"cmx_Edition\":\"Community Manager Edition\",\"col_Actions\":\"Actions\",\"col_Activity\":\"Activity\",\"col_Badge\":\"Badge\",\"col_Email\":\"Email\",\"col_EXP\":\"EXP PTS\",\"col_EXPAbbreviation\":\"EXP\",\"col_Goals\":\"Goals\",\"col_GoalType\":\"Goal Type\",\"col_Joined\":\"Joined\",\"col_Limits\":\"Limits\",\"col_MaxValue\":\"Max Value\",\"col_MinValue\":\"Min Value\",\"col_Module\":\"Module\",\"col_MostActiveUsers\":\"Most Active\",\"col_Name\":\"Name\",\"col_PowerRankings\":\"Reputation\",\"col_Privilege\":\"Privilege\",\"col_Pts\":\"Pts\",\"col_REP\":\"REP PTS\",\"col_REPAbbreviation\":\"REP\",\"col_RoleExpiry\":\"Expires\",\"col_RoleStart\":\"Start\",\"col_Tier\":\"Tier\",\"col_Time\":\"Time\",\"col_Timeframe\":\"Timeframe\",\"col_TopSpectators\":\"Top Spectators\",\"col_Value\":\"Value\",\"col_Views\":\"Views\",\"col_Weight\":\"Weight\",\"desc_EditBadge\":\"Define basic information for the badge\",\"desc_Goal\":\"Set the goals for the badge\",\"desc_Scoring\":\"Assign scoring actions to the badge\",\"label_Activities\":\"Activities\",\"label_Adoptions\":\"Adoption\",\"label_AvailableActions\":\"Available Actions\",\"label_AverageTime\":\"Average Time\",\"label_BadgeBanner\":\"Badge Banner\",\"label_BadgeDesc\":\"Description\",\"label_BadgeName\":\"Badge Name\",\"label_BadgeTier\":\"Badge Tier\",\"label_BounceRate\":\"Bounce Rate\",\"label_By\":\"by\",\"label_CommentModeration\":\"Comment Moderation\",\"label_CommentsPageSize\":\"Comments Page Size\",\"label_ComparativeTerm\":\"Comparative Term\",\"label_ContentModeration\":\"Content Moderation\",\"label_Count\":\"Count\",\"label_Create\":\"Creates\",\"label_Created\":\"Created:\",\"label_Date\":\"Date\",\"label_Days\":\"Number of Days\",\"label_Description\":\"Description\",\"label_DiscardAll\":\"Discard All\",\"label_DropFile\":\"Drop File(s) Here\",\"label_Email\":\"Email\",\"label_Engagement\":\"Engagement\",\"label_Experience\":\"Experience Points\",\"label_ExperienceAbbreviation\":\"Experience\",\"label_FirstName\":\"First Name\",\"label_FolderType\":\"Folder type:\",\"label_From\":\"From\",\"label_GroupHomePage\":\"Group Home Page\",\"label_Influence\":\"Influence\",\"label_LastActive\":\"Last active: \",\"label_LastModified\":\"Last Modified:\",\"label_LastName\":\"Last Name\",\"label_Maximum\":\"Maximum Times\",\"label_MemberOf\":\"Member of\",\"label_Minutes\":\"Min\",\"label_NA\":\"N/A\",\"label_Name\":\"Name\",\"label_NoActivities\":\"No Activities\",\"label_NotApplicable\":\"N/A\",\"label_OneMillionSufix\":\"M\",\"label_OneThousandSufix\":\"K\",\"label_PageSize\":\"Page Size\",\"label_Participation\":\"Participation\",\"label_PendingItems\":\"Pending Items\",\"label_Percent\":\"Percent\",\"label_Period\":\"Period\",\"label_Profanity\":\"Profanity Filtering\",\"label_PublishAll\":\"Publish All\",\"label_Rank\":\"Rank\",\"label_RecentActivity\":\"Recent Activity\",\"label_Reputation\":\"Reputation Points\",\"label_ReputationAbbreviation\":\"Reputation\",\"label_Role\":\"Role\",\"label_SelectedActions\":\"Selected Actions\",\"label_Size\":\"Size:\",\"label_Spectators\":\"Spectators\",\"label_Subscribe\":\"Subscribe:\",\"label_Tag\":\"Tag\",\"label_Tags\":\"Tags\",\"label_Timeframe\":\"Timeframe\",\"label_TimeOnSite\":\"Time on site: \",\"label_Title\":\"Title\",\"label_To\":\"To\",\"label_TotalContributions\":\"total content contributions\",\"label_TotalCreate\":\"Total Creates\",\"label_Totals\":\"Totals\",\"label_TotalViews\":\"Total Views\",\"label_Url\":\"URL:\",\"label_UserName\":\"User Name\",\"label_UserRemoved\":\"User Removed\",\"label_Users\":\"Users\",\"label_Versioning\":\"Versioning\",\"label_View\":\"VIEWS\",\"label_Views\":\"Views\",\"label_Workflow\":\"Workflow\",\"label_WYSIWYG\":\"Enable WYSIWYG\",\"lbl_Root\":\"Home\",\"nav_Community\":\"Community\",\"nav_CommunitySettings\":\"Community\",\"opt_Activity\":\"Activity\",\"opt_Bronze\":\"Bronze\",\"opt_Custom\":\"Custom\",\"opt_Daily\":\"Daily\",\"opt_Day\":\"Day\",\"opt_FilterByModule\":\"Filter by module\",\"opt_FilterContent\":\"Filter Content\",\"opt_Gold\":\"Gold\",\"opt_Lifetime\":\"Lifetime\",\"opt_Members\":\"Members\",\"opt_Month\":\"Month\",\"opt_Monthly\":\"Monthly\",\"opt_NoFiltering\":\"No Filtering\",\"opt_NoLimit\":\"No Limit\",\"opt_ProhibitContent\":\"Prohibit Content\",\"opt_Silver\":\"Silver\",\"opt_Week\":\"Week\",\"opt_Weekly\":\"Weekly\",\"opt_Year\":\"Year\",\"opt_Yearly\":\"Yearly\",\"pager_ItemDesc\":\"Showing {0} items\",\"pager_ItemPagedDesc\":\"Showing {0}-{1} of {2} items\",\"pager_PageDesc\":\"Page {0} of {1}\",\"pager_RoleDesc\":\"Showing {0} roles\",\"pager_RolePagedDesc\":\"Showing {0}-{1} of {2} roles\",\"pager_UserDesc\":\"Showing {0} users\",\"pager_UserPagedDesc\":\"Showing {0}-{1} of {2} users\",\"placeholder_AddDescription\":\"Add description\",\"placeholder_AddTitle\":\"Add title\",\"placeholder_Search\":\"Filter by name\",\"placeholder_Tags\":\"separate tags with a comma\",\"tooltip_ActivityByModule\":\"[COUNT] Activities\",\"tooltip_AdoptionsAndParticipations\":\"[COUNT] Users\",\"tooltip_CreateSeries\":\"[COUNT] Creations\",\"tooltip_Down_Custom\":\"Down {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Down_Day_OnDay\":\"Down {0}% today compared to yesterday\",\"tooltip_Down_Day_OnMonth\":\"Down {0}% compared to this day a month ago\",\"tooltip_Down_Day_OnWeek\":\"Down {0}% compared to this day a week ago\",\"tooltip_Down_Day_OnYear\":\"Down {0}% compared to this day a year ago\",\"tooltip_Down_Month_OnMonth\":\"Down {0}% this month compared to last month\",\"tooltip_Down_Month_OnYear\":\"Down {0}% compared to this month a year ago\",\"tooltip_Down_Week_OnMonth\":\"Down {0}% compared to this week a month ago\",\"tooltip_Down_Week_OnWeek\":\"Down {0}% this week compared to last week\",\"tooltip_Down_Week_OnYear\":\"Down {0}% compared to this week a year ago\",\"tooltip_Down_Year_OnYear\":\"Down {0}% this year compared to last year\",\"tooltip_ShowAll\":\"Show All\",\"tooltip_Up_Custom\":\"Up {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Up_Day_OnDay\":\"Up {0}% today compared to yesterday\",\"tooltip_Up_Day_OnMonth\":\"Up {0}% compared to this day a month ago\",\"tooltip_Up_Day_OnWeek\":\"Up {0}% compared to this day a week ago\",\"tooltip_Up_Day_OnYear\":\"Up {0}% compared to this day a year ago\",\"tooltip_Up_Month_OnMonth\":\"Up {0}% this month compared to last month\",\"tooltip_Up_Month_OnYear\":\"Up {0}% compared to this month a year ago\",\"tooltip_Up_Week_OnMonth\":\"Up {0}% compared to this week a month ago\",\"tooltip_Up_Week_OnWeek\":\"Up {0}% this week compared to last week\",\"tooltip_Up_Week_OnYear\":\"Up {0}% compared to this week a year ago\",\"tooltip_Up_Year_OnYear\":\"Up {0}% this year compared to last year\",\"topCommunity_NoDataAvailable\":\"No data available\",\"txt_ConfirmDelete\":\"Are you sure you want to delete this item?\",\"txt_ConfirmDeleteAsset\":\"Are you sure you want to delete the asset '[NAME]'?\",\"txt_ConfirmDeleteFolder\":\"Are you sure you want to delete the folder '[NAME]'?\",\"txt_Deleted\":\"Item successfully deleted.\",\"txt_Items\":\"{0} items\",\"txt_NoPopularContent\":\"No popular content available in selected period\",\"txt_NoTrendingTags\":\"No trending tags available in selected period\",\"txt_PleaseTypeRoleName\":\"Please type a role name.\",\"txt_RoleSuccessfullyAdded\":\"Role successfully added\",\"txt_Saved\":\"Item successfully saved.\",\"txt_SetupConnections\":\"Setup your connections to easily share content and more\",\"txt_UserSaved\":\"User successfully saved.\",\"txt_ViewIndex\":\"Viewing {0} of {1}\",\"title_Influence\":\"Influence\",\"title_ModuleSettings\":\"Miscellaneous Community Settings\"},\"Forms\":{\"nav_Forms\":\"Forms\"},\"Gamification\":{\"btn_Add\":\"Add\",\"btn_Apply\":\"Apply\",\"btn_Authenticate\":\"Authenticate\",\"btn_Cancel\":\"Cancel\",\"btn_Checking\":\"Checking ...\",\"btn_Close\":\"Close\",\"btn_Connect\":\"Connect\",\"btn_CreateBadge\":\"Create a Badge\",\"btn_CreateNew\":\"Create New\",\"btn_CreateUser\":\"Create User\",\"btn_Delete\":\"Delete\",\"btn_DemoteUser\":\"Demote User\",\"btn_Edit\":\"Edit\",\"btn_EditPoints\":\"Edit Points\",\"btn_Keep\":\"Keep\",\"btn_LoadMore\":\"Load More\",\"btn_Next\":\"Next\",\"btn_Prev\":\"Previous\",\"btn_PromoteUser\":\"Promote User\",\"btn_Replace\":\"Replace\",\"btn_Save\":\"Save\",\"btn_Saving\":\"Saving ...\",\"btn_ShowMore\":\"SHOW MORE\",\"btn_ViewFiles\":\"Assets\",\"btn_ViewProfile\":\"Profile\",\"cmx_Edition\":\"Community Manager Edition\",\"col_Actions\":\"Actions\",\"col_Activity\":\"Activity\",\"col_Badge\":\"Badge\",\"col_Email\":\"Email\",\"col_EXP\":\"EXP PTS\",\"col_EXPAbbreviation\":\"EXP\",\"col_Goals\":\"Goals\",\"col_GoalType\":\"Goal Type\",\"col_Joined\":\"Joined\",\"col_Limits\":\"Limits\",\"col_MaxValue\":\"Max Value\",\"col_MinValue\":\"Min Value\",\"col_Module\":\"Module\",\"col_MostActiveUsers\":\"Most Active\",\"col_Name\":\"Name\",\"col_PowerRankings\":\"Reputation\",\"col_Privilege\":\"Privilege\",\"col_Pts\":\"Pts\",\"col_REP\":\"REP PTS\",\"col_REPAbbreviation\":\"REP\",\"col_RoleExpiry\":\"Expires\",\"col_RoleStart\":\"Start\",\"col_Tier\":\"Tier\",\"col_Time\":\"Time\",\"col_Timeframe\":\"Timeframe\",\"col_TopSpectators\":\"Top Spectators\",\"col_Value\":\"Value\",\"col_Views\":\"Views\",\"col_Weight\":\"Weight\",\"desc_EditBadge\":\"Define basic information for the badge\",\"desc_Goal\":\"Set the goals for the badge\",\"desc_Scoring\":\"Assign scoring actions to the badge\",\"label_Activities\":\"Activities\",\"label_Adoptions\":\"Adoption\",\"label_AvailableActions\":\"Available Actions\",\"label_AverageTime\":\"Average Time\",\"label_BadgeBanner\":\"Badge Banner\",\"label_BadgeDesc\":\"Description\",\"label_BadgeName\":\"Badge Name\",\"label_BadgeTier\":\"Badge Tier\",\"label_BounceRate\":\"Bounce Rate\",\"label_By\":\"by\",\"label_CommentModeration\":\"Comment Moderation\",\"label_CommentsPageSize\":\"Comments Page Size\",\"label_ComparativeTerm\":\"Comparative Term\",\"label_ContentModeration\":\"Content Moderation\",\"label_Count\":\"Count\",\"label_Create\":\"Creates\",\"label_Created\":\"Created:\",\"label_Date\":\"Date\",\"label_Days\":\"Number of Days\",\"label_Description\":\"Description\",\"label_DiscardAll\":\"Discard All\",\"label_DropFile\":\"Drop File(s) Here\",\"label_Email\":\"Email\",\"label_Engagement\":\"Engagement\",\"label_Experience\":\"Experience Points\",\"label_ExperienceAbbreviation\":\"Experience\",\"label_FirstName\":\"First Name\",\"label_FolderType\":\"Folder type:\",\"label_From\":\"From\",\"label_GroupHomePage\":\"Group Home Page\",\"label_Influence\":\"Influence\",\"label_LastActive\":\"Last active: \",\"label_LastModified\":\"Last Modified:\",\"label_LastName\":\"Last Name\",\"label_Maximum\":\"Maximum Times\",\"label_MemberOf\":\"Member of\",\"label_Minutes\":\"Min\",\"label_NA\":\"N/A\",\"label_Name\":\"Name\",\"label_NoActivities\":\"No Activities\",\"label_NotApplicable\":\"N/A\",\"label_OneMillionSufix\":\"M\",\"label_OneThousandSufix\":\"K\",\"label_PageSize\":\"Page Size\",\"label_Participation\":\"Participation\",\"label_PendingItems\":\"Pending Items\",\"label_Percent\":\"Percent\",\"label_Period\":\"Period\",\"label_Profanity\":\"Profanity Filtering\",\"label_PublishAll\":\"Publish All\",\"label_Rank\":\"Rank\",\"label_RecentActivity\":\"Recent Activity\",\"label_Reputation\":\"Reputation Points\",\"label_ReputationAbbreviation\":\"Reputation\",\"label_Role\":\"Role\",\"label_SelectedActions\":\"Selected Actions\",\"label_Size\":\"Size:\",\"label_Spectators\":\"Spectators\",\"label_Subscribe\":\"Subscribe:\",\"label_Tag\":\"Tag\",\"label_Tags\":\"Tags\",\"label_Timeframe\":\"Timeframe\",\"label_TimeOnSite\":\"Time on site: \",\"label_Title\":\"Title\",\"label_To\":\"To\",\"label_TotalContributions\":\"total content contributions\",\"label_TotalCreate\":\"Total Creates\",\"label_Totals\":\"Totals\",\"label_TotalViews\":\"Total Views\",\"label_Url\":\"URL:\",\"label_UserName\":\"User Name\",\"label_UserRemoved\":\"User Removed\",\"label_Users\":\"Users\",\"label_Versioning\":\"Versioning\",\"label_View\":\"VIEWS\",\"label_Views\":\"Views\",\"label_Workflow\":\"Workflow\",\"label_WYSIWYG\":\"Enable WYSIWYG\",\"lbl_Root\":\"Home\",\"nav_Community\":\"Community\",\"nav_CommunitySettings\":\"Community\",\"nav_Gamification\":\"Gamification\",\"opt_Activity\":\"Activity\",\"opt_Bronze\":\"Bronze\",\"opt_Custom\":\"Custom\",\"opt_Daily\":\"Daily\",\"opt_Day\":\"Day\",\"opt_FilterByModule\":\"Filter by module\",\"opt_FilterContent\":\"Filter Content\",\"opt_Gold\":\"Gold\",\"opt_Lifetime\":\"Lifetime\",\"opt_Members\":\"Members\",\"opt_Month\":\"Month\",\"opt_Monthly\":\"Monthly\",\"opt_NoFiltering\":\"No Filtering\",\"opt_NoLimit\":\"No Limit\",\"opt_ProhibitContent\":\"Prohibit Content\",\"opt_Silver\":\"Silver\",\"opt_Week\":\"Week\",\"opt_Weekly\":\"Weekly\",\"opt_Year\":\"Year\",\"opt_Yearly\":\"Yearly\",\"pager_ItemDesc\":\"Showing {0} items\",\"pager_ItemPagedDesc\":\"Showing {0}-{1} of {2} items\",\"pager_PageDesc\":\"Page {0} of {1}\",\"pager_RoleDesc\":\"Showing {0} roles\",\"pager_RolePagedDesc\":\"Showing {0}-{1} of {2} roles\",\"pager_UserDesc\":\"Showing {0} users\",\"pager_UserPagedDesc\":\"Showing {0}-{1} of {2} users\",\"placeholder_AddDescription\":\"Add description\",\"placeholder_AddTitle\":\"Add title\",\"placeholder_Search\":\"Filter by name\",\"placeholder_Tags\":\"separate tags with a comma\",\"tooltip_ActivityByModule\":\"[COUNT] Activities\",\"tooltip_AdoptionsAndParticipations\":\"[COUNT] Users\",\"tooltip_CreateSeries\":\"[COUNT] Creations\",\"tooltip_Down_Custom\":\"Down {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Down_Day_OnDay\":\"Down {0}% today compared to yesterday\",\"tooltip_Down_Day_OnMonth\":\"Down {0}% compared to this day a month ago\",\"tooltip_Down_Day_OnWeek\":\"Down {0}% compared to this day a week ago\",\"tooltip_Down_Day_OnYear\":\"Down {0}% compared to this day a year ago\",\"tooltip_Down_Month_OnMonth\":\"Down {0}% this month compared to last month\",\"tooltip_Down_Month_OnYear\":\"Down {0}% compared to this month a year ago\",\"tooltip_Down_Week_OnMonth\":\"Down {0}% compared to this week a month ago\",\"tooltip_Down_Week_OnWeek\":\"Down {0}% this week compared to last week\",\"tooltip_Down_Week_OnYear\":\"Down {0}% compared to this week a year ago\",\"tooltip_Down_Year_OnYear\":\"Down {0}% this year compared to last year\",\"tooltip_ShowAll\":\"Show All\",\"tooltip_Up_Custom\":\"Up {0}% during {1} - {2} compared to {3} - {4}\",\"tooltip_Up_Day_OnDay\":\"Up {0}% today compared to yesterday\",\"tooltip_Up_Day_OnMonth\":\"Up {0}% compared to this day a month ago\",\"tooltip_Up_Day_OnWeek\":\"Up {0}% compared to this day a week ago\",\"tooltip_Up_Day_OnYear\":\"Up {0}% compared to this day a year ago\",\"tooltip_Up_Month_OnMonth\":\"Up {0}% this month compared to last month\",\"tooltip_Up_Month_OnYear\":\"Up {0}% compared to this month a year ago\",\"tooltip_Up_Week_OnMonth\":\"Up {0}% compared to this week a month ago\",\"tooltip_Up_Week_OnWeek\":\"Up {0}% this week compared to last week\",\"tooltip_Up_Week_OnYear\":\"Up {0}% compared to this week a year ago\",\"tooltip_Up_Year_OnYear\":\"Up {0}% this year compared to last year\",\"topCommunity_NoDataAvailable\":\"No data available\",\"txt_ConfirmDelete\":\"Are you sure you want to delete this item?\",\"txt_ConfirmDeleteAsset\":\"Are you sure you want to delete the asset '[NAME]'?\",\"txt_ConfirmDeleteFolder\":\"Are you sure you want to delete the folder '[NAME]'?\",\"txt_Deleted\":\"Item successfully deleted.\",\"txt_Items\":\"{0} items\",\"txt_NoPopularContent\":\"No popular content available in selected period\",\"txt_NoTrendingTags\":\"No trending tags available in selected period\",\"txt_PleaseTypeRoleName\":\"Please type a role name.\",\"txt_RoleSuccessfullyAdded\":\"Role successfully added\",\"txt_Saved\":\"Item successfully saved.\",\"txt_SetupConnections\":\"Setup your connections to easily share content and more\",\"txt_UserSaved\":\"User successfully saved.\",\"txt_ViewIndex\":\"Viewing {0} of {1}\",\"gaming_Badges\":\"Badges\",\"gaming_Privileges\":\"Privileges\",\"gaming_Scoring\":\"Actions\",\"nav_Gaming\":\"Gaming\",\"step_CreateBadge\":\"Create Badge\",\"step_EditBadge\":\"Edit Badge\",\"step_Goal\":\"Define Goals\",\"step_Scoring\":\"Scoring Actions\",\"err_NoLargerThanExp\":\"Reputation points cannot be larger than experience points\",\"err_NonDecimalNumber\":\"Decimal numbers are not allowed\",\"err_NonNegativeNumber\":\"Negative numbers are not allowed\",\"err_OneActionNeeded\":\"At least one action is needed\",\"err_PositiveNumber\":\"Only positive numbers are allowed\",\"err_Required\":\"Text is required\",\"String1\":\"\",\"title_Badges\":\"Badges\",\"title_Privilege\":\"Privilege\",\"title_Scoring\":\"Scoring\"},\"Microservices\":{\"TenantIdDescription\":\"Note: once you enable a microservice, you will need to contact support to disable it.\",\"TenantIdTitle\":\"Services Tenant Group ID:\",\"Microservices.Header\":\"Microservices\",\"CopyToClipboardNotify\":\"Copied to your clipboard successfully\",\"CopyToClipboardTooltip\":\"Copy to clipboard\",\"nav_Microservices\":\"Services\"},\"PageAnalytics\":{\"analytics_Apply\":\"Apply\",\"analytics_AverageTime\":\"Time On Page\",\"analytics_BounceRate\":\"Bounce Rate\",\"analytics_Channels\":\"Channels\",\"analytics_ComparativeTerm\":\"Comparative Term\",\"analytics_Custom\":\"Custom\",\"analytics_Dashboard\":\"Dashboard\",\"analytics_Day\":\"Day\",\"analytics_Devices\":\"Devices\",\"analytics_direct\":\"Direct\",\"analytics_direct_referral\":\"Direct Referral\",\"analytics_exitpages\":\"Exit Pages\",\"analytics_external\":\"External\",\"analytics_From\":\"From\",\"analytics_internal\":\"Internal\",\"analytics_Month\":\"Month\",\"analytics_NavigationSummary\":\"Navigation Summary\",\"analytics_NoDataAvailable\":\"No data available\",\"analytics_PageActivities\":\"Page Activities\",\"analytics_PageTraffic\":\"Page Analytics\",\"analytics_PageViewActivity\":\"Page Traffic\",\"analytics_PageViews\":\"Page Views\",\"analytics_Page_Events\":\"Page Events\",\"analytics_Referrers\":\"Referrers\",\"analytics_search\":\"Search\",\"analytics_Sessions\":\"Sessions\",\"analytics_SiteActivities\":\"Site Activities\",\"analytics_SiteViewActivity\":\"Site Traffic\",\"analytics_Site_Events\":\"Site Events\",\"analytics_social\":\"Social\",\"analytics_TimeOnPage\":\"Time On Page\",\"analytics_To\":\"To\",\"analytics_TopOperatingSystems\":\"Top OS's\",\"analytics_TopPages\":\"Top Pages\",\"analytics_TopReferrers\":\"Top Referrers\",\"analytics_UniqueSessions\":\"Unique Sessions\",\"analytics_UniqueVisitors\":\"Unique Visitors\",\"analytics_Visitors\":\"Visitors\",\"analytics_Week\":\"Week\",\"analytics_Year\":\"Year\",\"AvgTimeOnPage\":\"Ang Time On Page\",\"BounceRate\":\"Bounce Rate\",\"CurrentPage\":\"Current Page\",\"Dashboard\":\"Dashboard\",\"Minute\":\"min\",\"nav_PageAnalytics\":\"Page Analytics\",\"pager_ItemDesc\":\"Showing {0} items\",\"pager_ItemPagedDesc\":\"Showing {0}-{1} of {2} items\",\"pager_PageDesc\":\"Page {0} of {1}\",\"pager_RoleDesc\":\"Showing {0} roles\",\"pager_RolePagedDesc\":\"Showing {0}-{1} of {2} roles\",\"pager_UserDesc\":\"Showing {0} users\",\"pager_UserPagedDesc\":\"Showing {0}-{1} of {2} users\",\"TotalPageViews\":\"Total Page Views\"},\"EvoqServers\":{\"errorMessageLoadingWebServersTab\":\"Error loading Web Servers tab\",\"Servers\":\"Servers\",\"tabWebServersTitle\":\"Web Servers\",\"errorMessageSavingWebRequestAdapter\":\"Error saving Server Web Request Adapter\",\"filterLabel\":\"Filter : \",\"filterOptionAll\":\"All\",\"filterOptionDisabled\":\"Disabled\",\"filterOptionEnabled\":\"Enabled\",\"plWebRequestAdapter.Help\":\"The Web Request Adapter is used to get the server's default url when a new server is added to the server collection, process request/response when send sync cache message to server or detect whether server is available.\",\"plWebRequestAdapter\":\"Server Web Request Adapter:\",\"saveButtonText\":\"Save\",\"CreatedDate\":\"Created:\",\"Enabled\":\"Enabled:\",\"errorMessageSavingWebServer\":\"Error saving Web Server\",\"IISAppName\":\"IIS App Name:\",\"LastActivityDate\":\"Last Restart:\",\"MemoryUsage\":\"Memory Usage\",\"plCount.Help\":\"Total Number Of Objects In Memory\",\"plCount\":\"Cache Objects\",\"plLimit.Help\":\"Percentage of available memory that can be consumed before cache items are ejected from memory\",\"plLimit\":\"Available for Caching\",\"plPrivateBytes.Help\":\"Total Memory Available To The Application For Caching\",\"plPrivateBytes\":\"Total Available Memory\",\"Server\":\"Server:\",\"ServerGroup\":\"Server Group:\",\"URL\":\"URL:\",\"cancelButtonText\":\"Cancel\",\"confirmMessageDeleteWebServer\":\"Are you sure you want to delete the server '{0}'?\",\"deleteButtonText\":\"Delete\",\"errorMessageDeletingWebServer\":\"Error deleting Web Server\",\"cacheItemSize\":\"{0} Bytes\",\"cacheItemsTitle\":\"Cache Items\",\"errorExpiringCacheItem\":\"Error trying to expire Cache Item\",\"errorMessageLoadingCacheItem\":\"Error loading the selected Cache Item\",\"errorMessageLoadingCacheItemsList\":\"Error loading Cache Items List\",\"expireCacheItemButtonTitle\":\"Expire Cache Item\",\"loadCacheItemsLink\":\"[ Load Cache Items ]\",\"CacheItemExpiredConfirmationMessage\":\"Cache Item expired sucessfully\",\"SaveConfirmationMessage\":\"Saved successfully\",\"ServerDeleteConfirmation\":\"Server deleted sucessfully\",\"pageSizeOptionText\":\"{0} results per page\",\"summaryText\":\"Showing {0}-{1} of {2} results\",\"InvalidUrl.ErrorMessage\":\"The URL is not valid, please make sure the input URL can be visited, you only need input the domain name.\"},\"SiteAnalytics\":{\"nav_Dashboard\":\"Dashboard\",\"nav_SiteAnalytics\":\"Site Analytics\"},\"StructuredContent\":{\"nav_StructuredContent\":\"Content Library\",\"StructuredContentOptions\":\"Enable Structured Content:\",\"MicroServicesDescription\":\"Once you enable a microservice, you will need to contact support to disable it.\",\"StructuredContentMicroservice.Header\":\"Structured Content Microservice\"},\"Templates\":{\"nav_Pages\":\"Pages\",\"nav_Templates\":\"Templates\",\"pagesettings_Actions_Duplicate\":\"Duplicate Page\",\"pagesettings_Actions_SaveAsTemplate\":\"Save as Template\",\"pagesettings_AddPage\":\"Add Page\",\"pagesettings_AddTemplate\":\"New Template\",\"pagesettings_AddTemplateCompleted\":\"Created New Template\",\"pagesettings_Caption\":\"Pages\",\"pagesettings_ContentChanged\":\"Changes have not been saved\",\"pagesettings_CopyPage\":\"Create Copy\",\"pagesettings_CopyPermission\":\"Copy Permissions to Descendant Pages\",\"pagesettings_Created\":\"Created:\",\"pagesettings_CreatePage\":\"Create\",\"pagesettings_CreateTemplate\":\"Create\",\"pagesettings_DateTimeSeparator\":\"at\",\"pagesettings_Done\":\"Done\",\"pagesettings_Enable_Scheduling\":\"Enable Scheduling\",\"pagesettings_Errors_EmptyTabName\":\"The page name can't be empty.\",\"pagesettings_Errors_NoTemplate\":\"Please select a page template before creating a new page.\",\"pagesettings_Errors_PathDuplicateWithAlias\":\"There is a site domain identical to your page path.\",\"pagesettings_Errors_StartDateAfterEndDate\":\"The start date cannot be after end date.\",\"pagesettings_Errors_TabExists\":\"The Page Name you chose is already being used for another page at the same level of the page hierarchy.\",\"pagesettings_Errors_TabRecycled\":\"A page with this name exists in the Recycle Bin. To restore this page use the Recycle Bin.\",\"pagesettings_Errors_templates_EmptyTabName\":\"The template name can't be empty.\",\"pagesettings_Errors_templates_NoTemplate\":\"You need select a template to create new template.\",\"pagesettings_Errors_templates_NoTemplateExisting\":\"You must save an existing page as a template prior to create a new template.\",\"pagesettings_Errors_templates_PathDuplicateWithAlias\":\"There is a site domain identical to your page template.\",\"pagesettings_Errors_templates_TabExists\":\"The Template Name you chose is already being used for another template.\",\"pagesettings_Errors_templates_TabRecycled\":\"A template with this name exists in the Recycle Bin. To restore this template use the Recycle Bin.\",\"pagesettings_Errors_UrlPathCleaned\":\"The Page URL entered contains characters which cannot be used in a URL or are illegal characters for a URL.<br>[NOTE: The illegal characters list is the following: <>\\\\?:&=+|%# ]\",\"pagesettings_Errors_UrlPathNotUnique\":\"The submitted URL is not available as there is another page already use this URL.\",\"pagesettings_Fields_AddInMenu\":\"Add Page to Site Menu\",\"pagesettings_Fields_Description\":\"Description\",\"pagesettings_Fields_Keywords\":\"Keywords\",\"pagesettings_Fields_Layout\":\"Page Template\",\"pagesettings_Fields_Links\":\"Link Tracking\",\"pagesettings_Fields_Menu\":\"Display in Menu\",\"pagesettings_Fields_Name\":\"Name\",\"pagesettings_Fields_Name_Required\":\"Name (required)\",\"pagesettings_Fields_PageTemplates\":\"Page Templates\",\"pagesettings_Fields_Tags\":\"Tags\",\"pagesettings_Fields_TemplateName\":\"Template Name\",\"pagesettings_Fields_Title\":\"Title\",\"pagesettings_Fields_Type\":\"Type\",\"pagesettings_Fields_Type_ContentPage\":\"Content Page\",\"pagesettings_Fields_URL\":\"URL\",\"pagesettings_Fields_Workflow\":\"Workflow\",\"pagesettings_NewTemplate\":\"New Template\",\"pagesettings_Parent\":\"Page Parent:\",\"pagesettings_Save\":\"Save\",\"pagesettings_SaveAsTemplate\":\"Save As Template\",\"pagesettings_ShowInPageManagement\":\"Page Management\",\"pagesettings_Tabs_Details\":\"Details\",\"pagesettings_Tabs_Permissions\":\"Permissions\",\"pagesettings_TopLevel\":\"Top Level\",\"pagesettings_Update\":\"Update\",\"pages_AddPage\":\"Add Page\",\"pages_AddTemplate\":\"Add Template\",\"pages_Cancel\":\"Cancel\",\"pages_Delete\":\"Delete\",\"pages_DeletePageConfirm\":\"

Please confirm you wish to delete this page.

\",\"pages_DeleteTemplateConfirm\":\"

Please confirm you wish to delete this template.

\",\"pages_DetailView\":\"Detail View\",\"pages_Discard\":\"Discard\",\"pages_DragInvalid\":\"You can't drag a page as a child of itself.\",\"pages_DragPageTooltip\":\"Drag Page into Location\",\"pages_Edit\":\"Edit\",\"pages_end_date\":\"End Date\",\"pages_Hidden\":\"Page is hidden in menu\",\"pages_No\":\"No\",\"pages_Pending\":\"Please drag the page into the desired location.\",\"pages_Published\":\"Published:\",\"pages_ReturnToMain\":\"Page Management\",\"pages_Settings\":\"Settings\",\"pages_SmallView\":\"Small View\",\"pages_start_date\":\"Start Date\",\"pages_Status\":\"Status:\",\"pages_Title\":\"Page Management\",\"pages_View\":\"View\",\"pages_ViewPageTemplate\":\"Page Templates\",\"pages_ViewRecycleBin\":\"Recycle Bin\",\"pages_ViewTemplateManagement\":\"Template Management\",\"pages_Yes\":\"Yes\",\"pb_Edition\":\"Content Manager Edition\",\"permissiongrid.Actions\":\"Actions\",\"permissiongrid.Add Content\":\"Add Content\",\"permissiongrid.Add User\":\"Add User\",\"permissiongrid.Add\":\"Add\",\"permissiongrid.AllRoles\":\"\",\"permissiongrid.Copy\":\"Copy\",\"permissiongrid.Delete\":\"Delete\",\"permissiongrid.Display Name\":\"Display Name:\",\"permissiongrid.Edit Content\":\"Edit Content\",\"permissiongrid.Edit Tab\":\"Full Control\",\"permissiongrid.Edit\":\"Full Control\",\"permissiongrid.Export\":\"Export\",\"permissiongrid.Filter By Group\":\"Filter By Group\",\"permissiongrid.GlobalRoles\":\"\",\"permissiongrid.Import\":\"Import\",\"permissiongrid.Manage Settings\":\"Manage Settings\",\"permissiongrid.Navigate\":\"Navigate\",\"permissiongrid.Select Role\":\"Select Role\",\"permissiongrid.Type-roles\":\"Roles\",\"permissiongrid.Type-users\":\"Users\",\"permissiongrid.View Tab\":\"View\",\"permissiongrid.View\":\"View\",\"Service_CopyPermissionError\":\"Error occurred when copy permissions to descendant pages.\",\"Service_CopyPermissionSuccessful\":\"Copy permissions to descendant pages successful.\",\"Service_LayoutNotExist\":\"The layout has already been deleted.\",\"Service_ModuleNotExist\":\"The module has already been deleted.\",\"Service_RemoveTabError\":\"Page {0} cannot be deleted until its children have been deleted first.
\",\"Service_RemoveTabModuleError\":\"Error removing page has occurred:
{0}\",\"Service_RestoreModuleError\":\"Error restoring module {0} on page {1}. Page is deleted.\",\"Service_RestoreTabError\":\"Page {0} cannot be restored until its parent is restored first.
\",\"Service_RestoreTabModuleError\":\"Error restoring page has occurred:
{0}\",\"System\":\"System\"},\"Workflow\":{\"nav_Workflow\":\"Workflow\",\"settings_common_cancel_btn\":\"Cancel\",\"settings_common_confirm_btn\":\"Confirm\",\"settings_common_no_btn\":\"No\",\"settings_common_yes_btn\":\"Yes\",\"settings_title\":\"Workflows\",\"validation_digit\":\"Please enter a number\",\"validation_max\":\"Please enter a value less than or equal to {0}.\",\"validation_maxLength\":\"Please enter no more than {0} characters.\",\"validation_min\":\"Please enter a value greater than or equal to {0}.\",\"validation_minLength\":\"Please enter at least {0} characters.\",\"validation_required\":\"This field is required.\",\"worflow_usages_dialog_inner_title\":\"You are viewing usage for the {0} workflow\",\"worflow_usages_dialog_table_contentType\":\"CONTENT TYPE\",\"worflow_usages_dialog_table_name\":\"NAME\",\"worflow_usages_dialog_title\":\"Workflow Usage Information\",\"WorkflowApplyOnSubpagesCheckBox\":\"Apply setting to all subpages\",\"WorkflowLabel.Help\":\"Select a workflow to publish this page\",\"WorkflowLabel\":\"Workflow\",\"WorkflowNoteApplyOnSubpages\":\"Note: This setting cannot be applied because there are one or more subpages pending to be published.\",\"WorkflowRunning\":\"This page has a running workflow. The workflow must be completed to be changed.\",\"workflows_add_state_btn\":\"Add a State\",\"workflows_common_accept_btn\":\"Accept\",\"workflows_common_cancel_btn\":\"Cancel\",\"workflows_common_close_btn\":\"Close\",\"workflows_common_description_lbl\":\"Description\",\"workflows_common_error\":\"Error\",\"workflows_common_errors_title\":\"Error\",\"workflows_common_error_resource_busy\":\"Worklow is currently used\",\"workflows_common_name_lbl\":\"Name\",\"workflows_common_save_btn\":\"Save\",\"workflows_common_title_lbl\":\"Workflow Name\",\"workflows_confirm_delete_state\":\"Are you sure you want to delete the {0} State?\",\"workflows_confirm_delete_workflow\":\"Are you sure you want to delete the {0} Workflow?\",\"workflows_edit_states_inner_title\":\"You are editing the {0} workflow state\",\"workflows_edit_states_name_lbl\":\"State Name\",\"workflows_edit_states_notify_admin\":\"Notify Administrators of state changes\",\"workflows_edit_states_notify_author\":\"Notify Author and Reviewers of state changes\",\"workflows_edit_states_reviewers\":\"Reviewers\",\"workflows_edit_states_title_edit\":\"Workflow State Edit\",\"workflows_edit_states_title_new\":\"Workflow State New\",\"workflows_header_actions\":\"ACTIONS\",\"workflows_header_in_use\":\"IN USE\",\"workflows_header_workflow_type\":\"WORKFLOW TYPE\",\"workflows_in_use\":\"In Use\",\"workflows_new_btn\":\"Create New Workflow\",\"workflows_new_state_inner_title\":\"New State for {0}\",\"workflows_new_workflow\":\"New Workflow\",\"workflows_notify_deleted\":\"Workflow deleted\",\"workflows_not_in_use\":\"Not Used\",\"workflows_page_description\":\"Workflows allow you to easily manage the document approval process, create a new workflow or use one of the available workflow types below.\",\"workflows_page_inner_derscription\":\"Content approval workflow allos authors to publish content, which will not be visible until reiewed and published.\",\"workflows_page_title\":\"Workflow Management\",\"workflows_resources_info\":\"This workflow is currently in use\",\"workflows_resources_link\":\"View Usage\",\"workflows_states_description\":\"Once a workflow is in use you cannot delete any of the workflow states associated width the workflow. The first and last workflow states of a workflow cannot be deleted.\",\"workflows_states_descriptions\":\"Once a workflow state is in use you cannot delete it. The first and last workflow states of a workflow cannot be deleted.\",\"workflows_states_reviewers\":\"Reviewers\",\"workflows_states_reviewers_description\":\"Specify who can review content for this state\",\"workflows_states_table_actions\":\"ACTIONS\",\"workflows_states_table_active\":\"ACTIVE\",\"workflows_states_table_move\":\"MOVE\",\"workflows_states_table_order\":\"ORDER\",\"workflows_states_table_state\":\"STATE\",\"workflows_states_title\":\"Workflow States\",\"workflows_state_active\":\"Active\",\"workflows_state_inactive\":\"Inactive\",\"workflows_title\":\"Workflows\",\"workflows_tooltip_lock\":\"Default workflows cannot be deleted\",\"workflows_unknown_error\":\"Unknown Error\",\"workflow_common_alert\":\"Alert\",\"workflows_header_isDefault\":\"Default\"}}}"); export default utilities; \ No newline at end of file diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Pages/App_LocalResources/Pages.resx b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Pages/App_LocalResources/Pages.resx index dedb51dcf4f..3ab8a7d8d76 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Pages/App_LocalResources/Pages.resx +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Pages/App_LocalResources/Pages.resx @@ -463,10 +463,10 @@ Automatic - Appearance has been copy to descendant pages successfully + Appearance has been copied to descendant pages successfully - Permissions have been copy to descendant pages successfully + Permissions have been copied to descendant pages successfully Module "[MODULETITLE]" has been deleted successfully From 5a39e659b201d267fab7e923236e66cd71a8ba7e Mon Sep 17 00:00:00 2001 From: Daniel Aguilera Date: Fri, 17 Jul 2020 14:47:20 -0300 Subject: [PATCH 14/45] Add TZ to page StartDate and EndDate --- DNN Platform/Library/Common/Utilities/Null.cs | 7 +++++++ DNN Platform/Library/Entities/Tabs/TabInfo.cs | 4 ++-- .../PageDetails/PageDetailsFooter/PageDetailsFooter.jsx | 9 +++++++++ .../ClientSide/Pages.Web/src/services/pageService.js | 5 ++++- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/DNN Platform/Library/Common/Utilities/Null.cs b/DNN Platform/Library/Common/Utilities/Null.cs index 3fd6d1a26ba..43c7e3b39ff 100644 --- a/DNN Platform/Library/Common/Utilities/Null.cs +++ b/DNN Platform/Library/Common/Utilities/Null.cs @@ -215,6 +215,13 @@ public static DateTime SetNullDateTime(object objValue) return objValue != DBNull.Value ? Convert.ToDateTime(objValue) : NullDate; } + public static DateTime SetNullDateTime(object objValue, DateTimeKind dateTimeKind) + { + return objValue != DBNull.Value + ? DateTime.SpecifyKind(Convert.ToDateTime(objValue), dateTimeKind) + : NullDate; + } + public static int SetNullInteger(object objValue) { return objValue != DBNull.Value ? Convert.ToInt32(objValue) : NullInteger; diff --git a/DNN Platform/Library/Entities/Tabs/TabInfo.cs b/DNN Platform/Library/Entities/Tabs/TabInfo.cs index ed87840c606..160a702a5ca 100644 --- a/DNN Platform/Library/Entities/Tabs/TabInfo.cs +++ b/DNN Platform/Library/Entities/Tabs/TabInfo.cs @@ -856,8 +856,8 @@ public override void Fill(IDataReader dr) this.SkinSrc = Null.SetNullString(dr["SkinSrc"]); this.ContainerSrc = Null.SetNullString(dr["ContainerSrc"]); this.TabPath = Null.SetNullString(dr["TabPath"]); - this.StartDate = Null.SetNullDateTime(dr["StartDate"]); - this.EndDate = Null.SetNullDateTime(dr["EndDate"]); + this.StartDate = Null.SetNullDateTime(dr["StartDate"], DateTimeKind.Utc); + this.EndDate = Null.SetNullDateTime(dr["EndDate"], DateTimeKind.Utc); this.HasChildren = Null.SetNullBoolean(dr["HasChildren"]); this.RefreshInterval = Null.SetNullInteger(dr["RefreshInterval"]); this.PageHeadText = Null.SetNullString(dr["PageHeadText"]); diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageDetails/PageDetailsFooter/PageDetailsFooter.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageDetails/PageDetailsFooter/PageDetailsFooter.jsx index b55ae11e758..c14b0700b0f 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageDetails/PageDetailsFooter/PageDetailsFooter.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/PageDetails/PageDetailsFooter/PageDetailsFooter.jsx @@ -21,6 +21,15 @@ class PageDetailsFooter extends Component { onChangeValue(key, value) { const {onChangeField} = this.props; + + switch (key) { + case "startDate": + case "endDate": + // the DatePicker returns strings, but we need dates + value = new Date(value); + break; + } + onChangeField(key, value); } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/services/pageService.js b/Dnn.AdminExperience/ClientSide/Pages.Web/src/services/pageService.js index 8d086eeb23f..05fa3219868 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/services/pageService.js +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/services/pageService.js @@ -118,7 +118,10 @@ const PageService = function () { const toFrontEndPage = function (pageResult) { return { ...pageResult.page, - schedulingEnabled: pageResult.page.startDate || pageResult.page.endDate, + schedulingEnabled: pageResult.page.startDate !== null || pageResult.page.endDate !== null, + // the API returns strings, but we need dates + startDate: pageResult.page.startDate === null ? null : new Date(pageResult.page.startDate), + endDate: pageResult.page.endDate === null ? null : new Date(pageResult.page.endDate), validationCode: pageResult.ValidationCode, }; }; From 91f0c7b627b423313a5c44cde3c1042600af2d03 Mon Sep 17 00:00:00 2001 From: Berk Arslan Date: Mon, 20 Jul 2020 18:34:24 +0300 Subject: [PATCH 15/45] Visualizer not able to change settings in shared pages (#3917) * Exception data is updated and client is updated to show exception message * Unit Tests * Stylecop changes --- .../Library/Entities/Tabs/TabChangeTracker.cs | 8 +++-- .../DotNetNuke.Tests.Core.csproj | 1 + .../Entities/Tabs/TabChangeTrackerTests.cs | 36 +++++++++++++++++++ .../ContentEditorManager/Js/ModuleService.js | 11 ++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Tabs/TabChangeTrackerTests.cs diff --git a/DNN Platform/Library/Entities/Tabs/TabChangeTracker.cs b/DNN Platform/Library/Entities/Tabs/TabChangeTracker.cs index a073f0546de..0b6d6cb18b8 100644 --- a/DNN Platform/Library/Entities/Tabs/TabChangeTracker.cs +++ b/DNN Platform/Library/Entities/Tabs/TabChangeTracker.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information - namespace DotNetNuke.Entities.Tabs { using System; @@ -14,6 +13,8 @@ namespace DotNetNuke.Entities.Tabs public class TabChangeTracker : ServiceLocator, ITabChangeTracker { + public const string IsModuleDoesNotBelongToPage = nameof(IsModuleDoesNotBelongToPage); + public void TrackModuleAddition(ModuleInfo module, int moduleVersion, int userId) { var unPublishedVersion = TabVersionBuilder.Instance.GetUnPublishedVersion(module.TabID); @@ -32,9 +33,12 @@ public void TrackModuleModification(ModuleInfo module, int moduleVersion, int us { if (ModuleController.Instance.IsSharedModule(module) && moduleVersion != Null.NullInteger) { - throw new InvalidOperationException(Localization.GetExceptionMessage( + var exceptionToThrow = new InvalidOperationException( + Localization.GetExceptionMessage( "ModuleDoesNotBelongToPage", "This module does not belong to the page. Please, move to its master page to change the module")); + exceptionToThrow.Data.Add(IsModuleDoesNotBelongToPage, true); + throw exceptionToThrow; } var unPublishedVersion = TabVersionBuilder.Instance.GetUnPublishedVersion(module.TabID); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj b/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj index c194930f6a7..af23f23244f 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj @@ -167,6 +167,7 @@ + diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Tabs/TabChangeTrackerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Tabs/TabChangeTrackerTests.cs new file mode 100644 index 00000000000..952433775df --- /dev/null +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Tabs/TabChangeTrackerTests.cs @@ -0,0 +1,36 @@ +namespace DotNetNuke.Tests.Core.Entities.Tabs +{ + using System; + + using DotNetNuke.Entities.Modules; + using DotNetNuke.Entities.Tabs; + using DotNetNuke.Framework; + using Moq; + using NUnit.Framework; + + /// + /// Contains UTs for . + /// + [TestFixture] + public class TabChangeTrackerTests + { + /// + /// UT for . + /// + [Test] + public void TrackModuleModification_WithSharedModule_ThrowsException() + { + // Arrange + var tabChangeTracker = new TabChangeTracker(); + var mockedModuleController = new Mock(); + mockedModuleController + .Setup(s => s.IsSharedModule(It.IsAny())) + .Returns(true); + ServiceLocator.SetTestableInstance(mockedModuleController.Object); + + // Act & Assert + var exception = Assert.Throws(() => tabChangeTracker.TrackModuleModification(null, 1, 0)); + Assert.AreEqual(true, exception.Data?[TabChangeTracker.IsModuleDoesNotBelongToPage]); + } + } +} diff --git a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/resources/ContentEditorManager/Js/ModuleService.js b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/resources/ContentEditorManager/Js/ModuleService.js index cae1caf3cdd..2ebf3d4fe76 100644 --- a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/resources/ContentEditorManager/Js/ModuleService.js +++ b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/resources/ContentEditorManager/Js/ModuleService.js @@ -54,6 +54,17 @@ if (typeof dnn.ContentEditorManager === "undefined" || dnn.ContentEditorManager return; } + if (xhr != null && + xhr.responseJSON != null && + xhr.responseJSON.message != null) { + $.dnnAlert({ + title: 'Error', + text: xhr.responseJSON.message + }); + + return; + } + $.dnnAlert({ title: 'Error', text: 'Error occurred when request service \'' + method + '\'.' From 15c4f0a901569819219ccd2ea8fe8f880e6f0954 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Sat, 11 Jul 2020 15:39:27 +0200 Subject: [PATCH 16/45] Fix MVC NuGet package and improve devsite build script --- Build/Cake/devsite.cake | 8 +++++++- Build/Tools/NuGet/DotNetNuke.Web.Mvc.nuspec | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Build/Cake/devsite.cake b/Build/Cake/devsite.cake index 5455f7dcb62..83d2a8941be 100644 --- a/Build/Cake/devsite.cake +++ b/Build/Cake/devsite.cake @@ -1,13 +1,19 @@ // Tasks to help you create and maintain a local DNN development site. // Note these tasks depend on the correct settings in your settings file. -Task("ResetDevSite") +Task("BuildToTempFolder") .IsDependentOn("SetVersion") .IsDependentOn("UpdateDnnManifests") .IsDependentOn("ResetDatabase") .IsDependentOn("PreparePackaging") .IsDependentOn("OtherPackages") .IsDependentOn("ExternalExtensions") + .Does(() => + { + }); + +Task("ResetDevSite") + .IsDependentOn("BuildToTempFolder") .IsDependentOn("CopyToDevSite") .IsDependentOn("CopyWebConfigToDevSite") .Does(() => diff --git a/Build/Tools/NuGet/DotNetNuke.Web.Mvc.nuspec b/Build/Tools/NuGet/DotNetNuke.Web.Mvc.nuspec index a1ce1aec53a..c00d5df1a55 100644 --- a/Build/Tools/NuGet/DotNetNuke.Web.Mvc.nuspec +++ b/Build/Tools/NuGet/DotNetNuke.Web.Mvc.nuspec @@ -19,8 +19,8 @@ - - + + From 034d3b7b113753b3fbce9e86bb80186b9e010834 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 20 Jul 2020 10:35:59 -0500 Subject: [PATCH 17/45] Remove allowedVersions from packages.config These restrict the ability to manage NuGet upgrades using the tools within Visual Studio. There may have been some tooling that DNN Corp used at one time to keep projects in sync, but it's no longer in place, as far as I know. --- DNN Platform/Connectors/Azure/packages.config | 12 +++++------ .../Dnn.AuthServices.Jwt/packages.config | 12 +++++------ .../DotNetNuke.Web.Deprecated/packages.config | 6 +++--- .../DotNetNuke.Web.Mvc/packages.config | 14 ++++++------- .../DotNetNuke.Web.Razor/packages.config | 12 +++++------ DNN Platform/DotNetNuke.Web/packages.config | 18 ++++++++--------- DNN Platform/Library/packages.config | 12 +++++------ .../Modules/CoreMessaging/packages.config | 10 +++++----- .../Modules/DigitalAssets/packages.config | 10 +++++----- .../Modules/DnnExportImport/packages.config | 8 ++++---- .../DnnExportImportLibrary/packages.config | 2 +- DNN Platform/Modules/Groups/packages.config | 10 +++++----- .../Modules/HtmlEditorManager/packages.config | 2 +- DNN Platform/Modules/Journal/packages.config | 10 +++++----- .../Modules/MemberDirectory/packages.config | 12 +++++------ .../packages.config | 10 +++++----- .../packages.config | 8 ++++---- .../packages.config | 6 +++--- .../DotNetNuke.Tests.Content/packages.config | 8 ++++---- .../DotNetNuke.Tests.Core/packages.config | 6 +++--- .../DotNetNuke.Tests.Data/packages.config | 10 +++++----- .../packages.config | 20 +++++++++---------- .../Tests/DotNetNuke.Tests.UI/packages.config | 6 +++--- .../DotNetNuke.Tests.Urls/packages.config | 4 ++-- .../packages.config | 8 ++++---- .../DotNetNuke.Tests.Web.Mvc/packages.config | 16 +++++++-------- .../DotNetNuke.Tests.Web/packages.config | 18 ++++++++--------- DNN Platform/Website/packages.config | 16 +++++++-------- 28 files changed, 143 insertions(+), 143 deletions(-) diff --git a/DNN Platform/Connectors/Azure/packages.config b/DNN Platform/Connectors/Azure/packages.config index aec57a8c9d8..18be65d0554 100644 --- a/DNN Platform/Connectors/Azure/packages.config +++ b/DNN Platform/Connectors/Azure/packages.config @@ -1,10 +1,10 @@  - - - - - - + + + + + + \ No newline at end of file diff --git a/DNN Platform/Dnn.AuthServices.Jwt/packages.config b/DNN Platform/Dnn.AuthServices.Jwt/packages.config index e6f1739309a..f9fa9ae081c 100644 --- a/DNN Platform/Dnn.AuthServices.Jwt/packages.config +++ b/DNN Platform/Dnn.AuthServices.Jwt/packages.config @@ -1,10 +1,10 @@  - - - - - + + + + + - + \ No newline at end of file diff --git a/DNN Platform/DotNetNuke.Web.Deprecated/packages.config b/DNN Platform/DotNetNuke.Web.Deprecated/packages.config index 56ff2303e0d..8eea42fdfc8 100644 --- a/DNN Platform/DotNetNuke.Web.Deprecated/packages.config +++ b/DNN Platform/DotNetNuke.Web.Deprecated/packages.config @@ -1,7 +1,7 @@  - - - + + + \ No newline at end of file diff --git a/DNN Platform/DotNetNuke.Web.Mvc/packages.config b/DNN Platform/DotNetNuke.Web.Mvc/packages.config index 1a237298448..47ccae80b45 100644 --- a/DNN Platform/DotNetNuke.Web.Mvc/packages.config +++ b/DNN Platform/DotNetNuke.Web.Mvc/packages.config @@ -1,11 +1,11 @@  - - - - - - - + + + + + + + \ No newline at end of file diff --git a/DNN Platform/DotNetNuke.Web.Razor/packages.config b/DNN Platform/DotNetNuke.Web.Razor/packages.config index 3284de701ab..28b14b36af7 100644 --- a/DNN Platform/DotNetNuke.Web.Razor/packages.config +++ b/DNN Platform/DotNetNuke.Web.Razor/packages.config @@ -1,12 +1,12 @@  - - - - - + + + + + - + \ No newline at end of file diff --git a/DNN Platform/DotNetNuke.Web/packages.config b/DNN Platform/DotNetNuke.Web/packages.config index 211aecc063e..cbc3e78698d 100644 --- a/DNN Platform/DotNetNuke.Web/packages.config +++ b/DNN Platform/DotNetNuke.Web/packages.config @@ -1,16 +1,16 @@  - - - - - - + + + + + + - - + + - + \ No newline at end of file diff --git a/DNN Platform/Library/packages.config b/DNN Platform/Library/packages.config index 5c1798ceab2..924e765a7c1 100644 --- a/DNN Platform/Library/packages.config +++ b/DNN Platform/Library/packages.config @@ -1,15 +1,15 @@  - - + + - - + + - - + + \ No newline at end of file diff --git a/DNN Platform/Modules/CoreMessaging/packages.config b/DNN Platform/Modules/CoreMessaging/packages.config index 6730d0b6c1b..c2f9ca50eff 100644 --- a/DNN Platform/Modules/CoreMessaging/packages.config +++ b/DNN Platform/Modules/CoreMessaging/packages.config @@ -1,9 +1,9 @@  - - - - - + + + + + \ No newline at end of file diff --git a/DNN Platform/Modules/DigitalAssets/packages.config b/DNN Platform/Modules/DigitalAssets/packages.config index 78db8377d2d..ac97de4b706 100644 --- a/DNN Platform/Modules/DigitalAssets/packages.config +++ b/DNN Platform/Modules/DigitalAssets/packages.config @@ -1,11 +1,11 @@  - - - - + + + + - + \ No newline at end of file diff --git a/DNN Platform/Modules/DnnExportImport/packages.config b/DNN Platform/Modules/DnnExportImport/packages.config index 9bdd5552f1e..cdfa61a100c 100644 --- a/DNN Platform/Modules/DnnExportImport/packages.config +++ b/DNN Platform/Modules/DnnExportImport/packages.config @@ -1,8 +1,8 @@  - - - - + + + + \ No newline at end of file diff --git a/DNN Platform/Modules/DnnExportImportLibrary/packages.config b/DNN Platform/Modules/DnnExportImportLibrary/packages.config index 7f196becf5f..c032e1acda7 100644 --- a/DNN Platform/Modules/DnnExportImportLibrary/packages.config +++ b/DNN Platform/Modules/DnnExportImportLibrary/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/DNN Platform/Modules/Groups/packages.config b/DNN Platform/Modules/Groups/packages.config index 78db8377d2d..ac97de4b706 100644 --- a/DNN Platform/Modules/Groups/packages.config +++ b/DNN Platform/Modules/Groups/packages.config @@ -1,11 +1,11 @@  - - - - + + + + - + \ No newline at end of file diff --git a/DNN Platform/Modules/HtmlEditorManager/packages.config b/DNN Platform/Modules/HtmlEditorManager/packages.config index 316a1122697..537d21b6b33 100644 --- a/DNN Platform/Modules/HtmlEditorManager/packages.config +++ b/DNN Platform/Modules/HtmlEditorManager/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/DNN Platform/Modules/Journal/packages.config b/DNN Platform/Modules/Journal/packages.config index 78db8377d2d..ac97de4b706 100644 --- a/DNN Platform/Modules/Journal/packages.config +++ b/DNN Platform/Modules/Journal/packages.config @@ -1,11 +1,11 @@  - - - - + + + + - + \ No newline at end of file diff --git a/DNN Platform/Modules/MemberDirectory/packages.config b/DNN Platform/Modules/MemberDirectory/packages.config index 2e66578e1e2..4c4bc0871aa 100644 --- a/DNN Platform/Modules/MemberDirectory/packages.config +++ b/DNN Platform/Modules/MemberDirectory/packages.config @@ -1,10 +1,10 @@  - - - - - + + + + + - + \ No newline at end of file diff --git a/DNN Platform/Tests/DNN.Integration.Test.Framework/packages.config b/DNN Platform/Tests/DNN.Integration.Test.Framework/packages.config index 80bdfba0190..15a0760d97b 100644 --- a/DNN Platform/Tests/DNN.Integration.Test.Framework/packages.config +++ b/DNN Platform/Tests/DNN.Integration.Test.Framework/packages.config @@ -1,9 +1,9 @@  - - - - - + + + + + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.AspNetCCP/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.AspNetCCP/packages.config index 295260c892e..7178700213d 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.AspNetCCP/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.AspNetCCP/packages.config @@ -1,8 +1,8 @@  - - - - + + + + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Authentication/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Authentication/packages.config index 97fd3abee1b..fc659db1e84 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Authentication/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Authentication/packages.config @@ -1,7 +1,7 @@  - - - + + + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Content/packages.config index 4506cb7ef82..82a38d127dd 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/packages.config @@ -1,8 +1,8 @@  - - - - + + + + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Core/packages.config index 97fd3abee1b..fc659db1e84 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/packages.config @@ -1,7 +1,7 @@  - - - + + + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Data/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Data/packages.config index f49a8207a2a..2383d9176a6 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Data/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Data/packages.config @@ -1,9 +1,9 @@  - - - - - + + + + + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Integration/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Integration/packages.config index 3e2870b85fe..99a908587d4 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Integration/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Integration/packages.config @@ -1,14 +1,14 @@  - - - - - - - - - + + + + + + + + + - + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.UI/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.UI/packages.config index 97fd3abee1b..fc659db1e84 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.UI/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.UI/packages.config @@ -1,7 +1,7 @@  - - - + + + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Urls/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Urls/packages.config index 2b03ba86c18..dadc7ac8054 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Urls/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Urls/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Utilities/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Utilities/packages.config index 95aadebccfe..c69b6af0f9c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Utilities/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Utilities/packages.config @@ -1,8 +1,8 @@  - - - + + + - + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/packages.config index 7729029ef39..f656735c20d 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/packages.config @@ -2,13 +2,13 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Web/packages.config index b736bdf53e0..b90a8c4dcbb 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web/packages.config @@ -1,15 +1,15 @@  - - - - + + + + - - - - + + + + - + \ No newline at end of file diff --git a/DNN Platform/Website/packages.config b/DNN Platform/Website/packages.config index 06423a378eb..f07b4108fe8 100644 --- a/DNN Platform/Website/packages.config +++ b/DNN Platform/Website/packages.config @@ -1,14 +1,14 @@  - - - - - + + + + + - - - + + + \ No newline at end of file From 6d5d95bcf055030a184d5e1cd15ff6c48b9c69c7 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 20 Jul 2020 10:56:06 -0500 Subject: [PATCH 18/45] Clean DotNetNuke.Web.Deprecated's NuGet pkgs These weren't even referenced by the project.s --- DNN Platform/DotNetNuke.Web.Deprecated/packages.config | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/DNN Platform/DotNetNuke.Web.Deprecated/packages.config b/DNN Platform/DotNetNuke.Web.Deprecated/packages.config index 8eea42fdfc8..e619441b462 100644 --- a/DNN Platform/DotNetNuke.Web.Deprecated/packages.config +++ b/DNN Platform/DotNetNuke.Web.Deprecated/packages.config @@ -1,7 +1,4 @@ - - - - - + + \ No newline at end of file From 2a1aa85e64fd1c75e8146280c898a8493159fd7e Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 20 Jul 2020 10:56:57 -0500 Subject: [PATCH 19/45] Remove hardcoded dependency version numbers --- DNN Platform/DotNetNuke.Web.Razor/Library.build | 14 +++++++------- DNN Platform/DotNetNuke.Web/Library.build | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/DNN Platform/DotNetNuke.Web.Razor/Library.build b/DNN Platform/DotNetNuke.Web.Razor/Library.build index e44fe723110..cff593846e1 100644 --- a/DNN Platform/DotNetNuke.Web.Razor/Library.build +++ b/DNN Platform/DotNetNuke.Web.Razor/Library.build @@ -9,12 +9,12 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/DNN Platform/DotNetNuke.Web/Library.build b/DNN Platform/DotNetNuke.Web/Library.build index 5f4e077214b..de4d808f17d 100644 --- a/DNN Platform/DotNetNuke.Web/Library.build +++ b/DNN Platform/DotNetNuke.Web/Library.build @@ -20,6 +20,6 @@ - + From 7e31e572f63a213fd6a232ec102df2c44c9fc1a8 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 20 Jul 2020 11:13:40 -0500 Subject: [PATCH 20/45] Update Microsoft.AspNet.* from 3.1.1 to 3.1.2 Version 5.1.3 of the Microsoft.AspNet.Mvc NuGet packages, which we've been depending on for a while, depends on Microsoft.AspNet.WebPages and Microsoft.AspNet.Razor in the version range >= 3.1.2 && < 3.2.0 (which only resolves to 3.1.2). --- .../DotNetNuke.Web.Mvc.csproj | 16 +++++----- .../DotNetNuke.Web.Mvc/packages.config | 18 +++++------ .../DotNetNuke.Web.Razor.csproj | 16 +++++----- .../DotNetNuke.Web.Razor/packages.config | 20 ++++++------- .../DotNetNuke.Web/DotNetNuke.Web.csproj | 10 +++---- DNN Platform/DotNetNuke.Web/packages.config | 30 +++++++++---------- .../Library/DotNetNuke.Library.csproj | 10 +++---- DNN Platform/Library/packages.config | 26 ++++++++-------- .../DotNetNuke.Tests.Web.Mvc.csproj | 10 +++---- .../DotNetNuke.Tests.Web.Mvc/packages.config | 24 +++++++-------- .../Website/DotNetNuke.Website.csproj | 20 ++++++------- DNN Platform/Website/packages.config | 24 +++++++-------- 12 files changed, 112 insertions(+), 112 deletions(-) diff --git a/DNN Platform/DotNetNuke.Web.Mvc/DotNetNuke.Web.Mvc.csproj b/DNN Platform/DotNetNuke.Web.Mvc/DotNetNuke.Web.Mvc.csproj index 3ae0ab5b403..a1985beb8e8 100644 --- a/DNN Platform/DotNetNuke.Web.Mvc/DotNetNuke.Web.Mvc.csproj +++ b/DNN Platform/DotNetNuke.Web.Mvc/DotNetNuke.Web.Mvc.csproj @@ -40,7 +40,7 @@ - ..\..\packages\Microsoft.AspNet.WebHelpers.3.1.1\lib\net45\Microsoft.Web.Helpers.dll + ..\..\packages\Microsoft.AspNet.WebHelpers.3.1.2\lib\net45\Microsoft.Web.Helpers.dll True @@ -54,7 +54,7 @@ - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.Helpers.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.Helpers.dll True @@ -71,22 +71,22 @@ True - ..\..\packages\Microsoft.AspNet.Razor.3.1.1\lib\net45\System.Web.Razor.dll + ..\..\packages\Microsoft.AspNet.Razor.3.1.2\lib\net45\System.Web.Razor.dll True False - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Deployment.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Deployment.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Razor.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Razor.dll True @@ -95,11 +95,11 @@ - ..\..\packages\Microsoft.AspNet.WebPages.Data.3.1.1\lib\net45\WebMatrix.Data.dll + ..\..\packages\Microsoft.AspNet.WebPages.Data.3.1.2\lib\net45\WebMatrix.Data.dll True - ..\..\packages\Microsoft.AspNet.WebPages.WebData.3.1.1\lib\net45\WebMatrix.WebData.dll + ..\..\packages\Microsoft.AspNet.WebPages.WebData.3.1.2\lib\net45\WebMatrix.WebData.dll True diff --git a/DNN Platform/DotNetNuke.Web.Mvc/packages.config b/DNN Platform/DotNetNuke.Web.Mvc/packages.config index 47ccae80b45..c391de8c125 100644 --- a/DNN Platform/DotNetNuke.Web.Mvc/packages.config +++ b/DNN Platform/DotNetNuke.Web.Mvc/packages.config @@ -1,11 +1,11 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/DNN Platform/DotNetNuke.Web.Razor/DotNetNuke.Web.Razor.csproj b/DNN Platform/DotNetNuke.Web.Razor/DotNetNuke.Web.Razor.csproj index 85352046976..c07cfa573dd 100644 --- a/DNN Platform/DotNetNuke.Web.Razor/DotNetNuke.Web.Razor.csproj +++ b/DNN Platform/DotNetNuke.Web.Razor/DotNetNuke.Web.Razor.csproj @@ -53,7 +53,7 @@ ..\..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll - ..\..\packages\Microsoft.AspNet.WebHelpers.3.1.1\lib\net45\Microsoft.Web.Helpers.dll + ..\..\packages\Microsoft.AspNet.WebHelpers.3.1.2\lib\net45\Microsoft.Web.Helpers.dll True @@ -63,33 +63,33 @@ - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.Helpers.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.Helpers.dll True - ..\..\packages\Microsoft.AspNet.Razor.3.1.1\lib\net45\System.Web.Razor.dll + ..\..\packages\Microsoft.AspNet.Razor.3.1.2\lib\net45\System.Web.Razor.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Deployment.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Deployment.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Razor.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Razor.dll True - ..\..\packages\Microsoft.AspNet.WebPages.Data.3.1.1\lib\net45\WebMatrix.Data.dll + ..\..\packages\Microsoft.AspNet.WebPages.Data.3.1.2\lib\net45\WebMatrix.Data.dll True - ..\..\packages\Microsoft.AspNet.WebPages.WebData.3.1.1\lib\net45\WebMatrix.WebData.dll + ..\..\packages\Microsoft.AspNet.WebPages.WebData.3.1.2\lib\net45\WebMatrix.WebData.dll True diff --git a/DNN Platform/DotNetNuke.Web.Razor/packages.config b/DNN Platform/DotNetNuke.Web.Razor/packages.config index 28b14b36af7..b0fa19d1c3c 100644 --- a/DNN Platform/DotNetNuke.Web.Razor/packages.config +++ b/DNN Platform/DotNetNuke.Web.Razor/packages.config @@ -1,12 +1,12 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/DNN Platform/DotNetNuke.Web/DotNetNuke.Web.csproj b/DNN Platform/DotNetNuke.Web/DotNetNuke.Web.csproj index 6b185aaf91d..bad417f0c9d 100644 --- a/DNN Platform/DotNetNuke.Web/DotNetNuke.Web.csproj +++ b/DNN Platform/DotNetNuke.Web/DotNetNuke.Web.csproj @@ -125,7 +125,7 @@ - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.Helpers.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.Helpers.dll True @@ -137,21 +137,21 @@ ..\..\Packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll - ..\..\packages\Microsoft.AspNet.Razor.3.1.1\lib\net45\System.Web.Razor.dll + ..\..\packages\Microsoft.AspNet.Razor.3.1.2\lib\net45\System.Web.Razor.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Deployment.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Deployment.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Razor.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Razor.dll True diff --git a/DNN Platform/DotNetNuke.Web/packages.config b/DNN Platform/DotNetNuke.Web/packages.config index cbc3e78698d..e4e585d7cf0 100644 --- a/DNN Platform/DotNetNuke.Web/packages.config +++ b/DNN Platform/DotNetNuke.Web/packages.config @@ -1,16 +1,16 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DNN Platform/Library/DotNetNuke.Library.csproj b/DNN Platform/Library/DotNetNuke.Library.csproj index e6e282bb54e..f095e188971 100644 --- a/DNN Platform/Library/DotNetNuke.Library.csproj +++ b/DNN Platform/Library/DotNetNuke.Library.csproj @@ -161,25 +161,25 @@ - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.Helpers.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.Helpers.dll True - ..\..\packages\Microsoft.AspNet.Razor.3.1.1\lib\net45\System.Web.Razor.dll + ..\..\packages\Microsoft.AspNet.Razor.3.1.2\lib\net45\System.Web.Razor.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Deployment.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Deployment.dll True - ..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Razor.dll + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Razor.dll True diff --git a/DNN Platform/Library/packages.config b/DNN Platform/Library/packages.config index 924e765a7c1..fdc36b03ecc 100644 --- a/DNN Platform/Library/packages.config +++ b/DNN Platform/Library/packages.config @@ -1,15 +1,15 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/DotNetNuke.Tests.Web.Mvc.csproj b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/DotNetNuke.Tests.Web.Mvc.csproj index 6c9aedb30fc..238a681f5fb 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/DotNetNuke.Tests.Web.Mvc.csproj +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/DotNetNuke.Tests.Web.Mvc.csproj @@ -56,7 +56,7 @@ - ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.Helpers.dll + ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.Helpers.dll True @@ -64,19 +64,19 @@ ..\..\..\Packages\Microsoft.AspNet.Mvc.5.1.3\lib\net45\System.Web.Mvc.dll - ..\..\..\packages\Microsoft.AspNet.Razor.3.1.1\lib\net45\System.Web.Razor.dll + ..\..\..\packages\Microsoft.AspNet.Razor.3.1.2\lib\net45\System.Web.Razor.dll True - ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.dll + ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.dll True - ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Deployment.dll + ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Deployment.dll True - ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Razor.dll + ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Razor.dll True diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/packages.config index f656735c20d..2c3dc4e620c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/packages.config @@ -1,14 +1,14 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/DNN Platform/Website/DotNetNuke.Website.csproj b/DNN Platform/Website/DotNetNuke.Website.csproj index 2e5d5d0c7d0..24b17cb499d 100644 --- a/DNN Platform/Website/DotNetNuke.Website.csproj +++ b/DNN Platform/Website/DotNetNuke.Website.csproj @@ -138,9 +138,9 @@ - + + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.Helpers.dll False - ..\..\Packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.Helpers.dll ..\..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll @@ -150,22 +150,22 @@ False ..\..\Packages\Microsoft.AspNet.Mvc.5.1.3\lib\net45\System.Web.Mvc.dll - + + ..\..\packages\Microsoft.AspNet.Razor.3.1.2\lib\net45\System.Web.Razor.dll False - ..\..\Packages\Microsoft.AspNet.Razor.3.1.1\lib\net45\System.Web.Razor.dll - + + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.dll False - ..\..\Packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.dll - + + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Deployment.dll False - ..\..\Packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Deployment.dll - + + ..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Razor.dll False - ..\..\Packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.Razor.dll diff --git a/DNN Platform/Website/packages.config b/DNN Platform/Website/packages.config index f07b4108fe8..830722c8f2b 100644 --- a/DNN Platform/Website/packages.config +++ b/DNN Platform/Website/packages.config @@ -1,14 +1,14 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file From 63e3c2c508720eac27447209eb1eb9e311c3bbda Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 21 Jul 2020 16:02:59 -0500 Subject: [PATCH 21/45] Fix improper System.Web.WebPages reference in DDR --- .../DDRMenu/DotNetNuke.Modules.DDRMenu.csproj | 19 +++++++++++++++++-- DNN Platform/Modules/DDRMenu/packages.config | 3 +++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/DNN Platform/Modules/DDRMenu/DotNetNuke.Modules.DDRMenu.csproj b/DNN Platform/Modules/DDRMenu/DotNetNuke.Modules.DDRMenu.csproj index f50c76dee9e..ff2ee273148 100644 --- a/DNN Platform/Modules/DDRMenu/DotNetNuke.Modules.DDRMenu.csproj +++ b/DNN Platform/Modules/DDRMenu/DotNetNuke.Modules.DDRMenu.csproj @@ -89,14 +89,29 @@ ..\..\..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + ..\..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + - - ..\..\..\Packages\Microsoft.AspNet.WebPages.3.1.1\lib\net45\System.Web.WebPages.dll + + ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.Helpers.dll + + + ..\..\..\packages\Microsoft.AspNet.Razor.3.1.2\lib\net45\System.Web.Razor.dll + + + ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.dll + + + ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Deployment.dll + + + ..\..\..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Razor.dll diff --git a/DNN Platform/Modules/DDRMenu/packages.config b/DNN Platform/Modules/DDRMenu/packages.config index 4fca05e5f8c..23fdf2181e2 100644 --- a/DNN Platform/Modules/DDRMenu/packages.config +++ b/DNN Platform/Modules/DDRMenu/packages.config @@ -1,6 +1,9 @@  + + + \ No newline at end of file From faf11c43ae8de5a28053d06509dd1a5f1d691543 Mon Sep 17 00:00:00 2001 From: Tauqeer Haider Date: Wed, 22 Jul 2020 16:06:26 +0000 Subject: [PATCH 22/45] Prevented unnecessary call to getCultureList method --- .../components/siteLanguageSelector/index.jsx | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/siteLanguageSelector/index.jsx b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/siteLanguageSelector/index.jsx index 0c0a65a74c2..0cf32cdaf40 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/siteLanguageSelector/index.jsx +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/siteLanguageSelector/index.jsx @@ -65,35 +65,37 @@ class SiteLanguageSelector extends Component { onSiteChange(event) { let {state, props} = this; - props.dispatch(SearchActions.getCultureList(event.value, () => { - let culture = this.validateCultureCode(); - if (state.cultureCode !== culture) { - this.setState({ - portalId: event.value, - cultureCode: culture - }); - this.triggerEvent("portalIdCultureCodeChanged", - { + if(event.value !== state.portalId){ + props.dispatch(SearchActions.getCultureList(event.value, () => { + let culture = this.validateCultureCode(); + if (state.cultureCode !== culture) { + this.setState({ portalId: event.value, - cultureCode: culture, - referrer: props.referrer, - referrerText: props.referrerText, - backToReferrerFunc: props.backToReferrerFunc + cultureCode: culture }); - } - else { - this.setState({ - portalId: event.value - }); - this.triggerEvent("portalIdChanged", - { - portalId: event.value, - referrer: props.referrer, - referrerText: props.referrerText, - backToReferrerFunc: props.backToReferrerFunc + this.triggerEvent("portalIdCultureCodeChanged", + { + portalId: event.value, + cultureCode: culture, + referrer: props.referrer, + referrerText: props.referrerText, + backToReferrerFunc: props.backToReferrerFunc + }); + } + else { + this.setState({ + portalId: event.value }); - } - })); + this.triggerEvent("portalIdChanged", + { + portalId: event.value, + referrer: props.referrer, + referrerText: props.referrerText, + backToReferrerFunc: props.backToReferrerFunc + }); + } + })); + } } onLanguageChange(event) { From 936c9945ae1b5b1161ea4a9ccb4e8e38cc453734 Mon Sep 17 00:00:00 2001 From: Tauqeer Haider Date: Thu, 23 Jul 2020 10:02:08 +0000 Subject: [PATCH 23/45] inverted condition to reduce nesting --- .../components/siteLanguageSelector/index.jsx | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/siteLanguageSelector/index.jsx b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/siteLanguageSelector/index.jsx index 0cf32cdaf40..3f4e06022e3 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/siteLanguageSelector/index.jsx +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/siteLanguageSelector/index.jsx @@ -65,37 +65,40 @@ class SiteLanguageSelector extends Component { onSiteChange(event) { let {state, props} = this; - if(event.value !== state.portalId){ - props.dispatch(SearchActions.getCultureList(event.value, () => { - let culture = this.validateCultureCode(); - if (state.cultureCode !== culture) { - this.setState({ + + if(event.value === state.portalId){ + return; + } + + props.dispatch(SearchActions.getCultureList(event.value, () => { + let culture = this.validateCultureCode(); + if (state.cultureCode !== culture) { + this.setState({ + portalId: event.value, + cultureCode: culture + }); + this.triggerEvent("portalIdCultureCodeChanged", + { portalId: event.value, - cultureCode: culture + cultureCode: culture, + referrer: props.referrer, + referrerText: props.referrerText, + backToReferrerFunc: props.backToReferrerFunc }); - this.triggerEvent("portalIdCultureCodeChanged", - { - portalId: event.value, - cultureCode: culture, - referrer: props.referrer, - referrerText: props.referrerText, - backToReferrerFunc: props.backToReferrerFunc - }); - } - else { - this.setState({ - portalId: event.value + } + else { + this.setState({ + portalId: event.value + }); + this.triggerEvent("portalIdChanged", + { + portalId: event.value, + referrer: props.referrer, + referrerText: props.referrerText, + backToReferrerFunc: props.backToReferrerFunc }); - this.triggerEvent("portalIdChanged", - { - portalId: event.value, - referrer: props.referrer, - referrerText: props.referrerText, - backToReferrerFunc: props.backToReferrerFunc - }); - } - })); - } + } + })); } onLanguageChange(event) { From 85530a2b9028c1ba61ac91df29f18fae6324ed47 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Thu, 23 Jul 2020 10:45:53 -0500 Subject: [PATCH 24/45] Retry determining Globals.Status if it was Error --- DNN Platform/Library/Common/Globals.cs | 118 ++++++++++++------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/DNN Platform/Library/Common/Globals.cs b/DNN Platform/Library/Common/Globals.cs index 755afd7b815..2fd0d408c82 100644 --- a/DNN Platform/Library/Common/Globals.cs +++ b/DNN Platform/Library/Common/Globals.cs @@ -498,81 +498,81 @@ public static UpgradeStatus Status { get { - if (_status == UpgradeStatus.Unknown) + if (_status != UpgradeStatus.Unknown && _status != UpgradeStatus.Error) { - var tempStatus = UpgradeStatus.Unknown; + return _status; + } - Logger.Trace("Getting application status"); - tempStatus = UpgradeStatus.None; + Logger.Trace("Getting application status"); + var tempStatus = UpgradeStatus.None; - // first call GetProviderPath - this insures that the Database is Initialised correctly - // and also generates the appropriate error message if it cannot be initialised correctly - string strMessage = DataProvider.Instance().GetProviderPath(); + // first call GetProviderPath - this insures that the Database is Initialised correctly + // and also generates the appropriate error message if it cannot be initialised correctly + string strMessage = DataProvider.Instance().GetProviderPath(); - // get current database version from DB - if (!strMessage.StartsWith("ERROR:")) + // get current database version from DB + if (!strMessage.StartsWith("ERROR:")) + { + try { - try - { - _dataBaseVersion = DataProvider.Instance().GetVersion(); - } - catch (Exception ex) - { - Logger.Error(ex); - strMessage = "ERROR:" + ex.Message; - } + _dataBaseVersion = DataProvider.Instance().GetVersion(); } + catch (Exception ex) + { + Logger.Error(ex); + strMessage = "ERROR:" + ex.Message; + } + } - if (strMessage.StartsWith("ERROR")) + if (strMessage.StartsWith("ERROR")) + { + if (IsInstalled()) { - if (IsInstalled()) - { - // Errors connecting to the database after an initial installation should be treated as errors. - tempStatus = UpgradeStatus.Error; - } - else - { - // An error that occurs before the database has been installed should be treated as a new install - tempStatus = UpgradeStatus.Install; - } + // Errors connecting to the database after an initial installation should be treated as errors. + tempStatus = UpgradeStatus.Error; } - else if (DataBaseVersion == null) + else { - // No Db Version so Install + // An error that occurs before the database has been installed should be treated as a new install tempStatus = UpgradeStatus.Install; } - else + } + else if (DataBaseVersion == null) + { + // No Db Version so Install + tempStatus = UpgradeStatus.Install; + } + else + { + var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; + if (version.Major > DataBaseVersion.Major) { - var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; - if (version.Major > DataBaseVersion.Major) - { - // Upgrade Required (Major Version Upgrade) - tempStatus = UpgradeStatus.Upgrade; - } - else if (version.Major == DataBaseVersion.Major && version.Minor > DataBaseVersion.Minor) - { - // Upgrade Required (Minor Version Upgrade) - tempStatus = UpgradeStatus.Upgrade; - } - else if (version.Major == DataBaseVersion.Major && version.Minor == DataBaseVersion.Minor && - version.Build > DataBaseVersion.Build) - { - // Upgrade Required (Build Version Upgrade) - tempStatus = UpgradeStatus.Upgrade; - } - else if (version.Major == DataBaseVersion.Major && version.Minor == DataBaseVersion.Minor && - version.Build == DataBaseVersion.Build && IncrementalVersionExists(version)) - { - // Upgrade Required (Build Version Upgrade) - tempStatus = UpgradeStatus.Upgrade; - } + // Upgrade Required (Major Version Upgrade) + tempStatus = UpgradeStatus.Upgrade; + } + else if (version.Major == DataBaseVersion.Major && version.Minor > DataBaseVersion.Minor) + { + // Upgrade Required (Minor Version Upgrade) + tempStatus = UpgradeStatus.Upgrade; + } + else if (version.Major == DataBaseVersion.Major && version.Minor == DataBaseVersion.Minor && + version.Build > DataBaseVersion.Build) + { + // Upgrade Required (Build Version Upgrade) + tempStatus = UpgradeStatus.Upgrade; } + else if (version.Major == DataBaseVersion.Major && version.Minor == DataBaseVersion.Minor && + version.Build == DataBaseVersion.Build && IncrementalVersionExists(version)) + { + // Upgrade Required (Build Version Upgrade) + tempStatus = UpgradeStatus.Upgrade; + } + } - _status = tempStatus; + _status = tempStatus; - Logger.Trace(string.Format("result of getting providerpath: {0}", strMessage)); - Logger.Trace("Application status is " + _status); - } + Logger.Trace(string.Format("result of getting providerpath: {0}", strMessage)); + Logger.Trace("Application status is " + _status); return _status; } From 2c01c5ecbb15283946903f657a8ded863b4934c9 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Fri, 24 Jul 2020 13:10:02 -0500 Subject: [PATCH 25/45] Ensure DI services are disposed in WebForms --- .../Entities/Modules/PortalModuleBase.cs | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/DNN Platform/Library/Entities/Modules/PortalModuleBase.cs b/DNN Platform/Library/Entities/Modules/PortalModuleBase.cs index ed0830264f2..cb9b08db1aa 100644 --- a/DNN Platform/Library/Entities/Modules/PortalModuleBase.cs +++ b/DNN Platform/Library/Entities/Modules/PortalModuleBase.cs @@ -1,6 +1,6 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information namespace DotNetNuke.Entities.Modules { using System; @@ -17,10 +17,11 @@ namespace DotNetNuke.Entities.Modules using DotNetNuke.Entities.Users; using DotNetNuke.Framework; using DotNetNuke.Instrumentation; - using DotNetNuke.Security.Permissions; using DotNetNuke.Services.Localization; using DotNetNuke.UI.Modules; + using Microsoft.Extensions.DependencyInjection; + /// ----------------------------------------------------------------------------- /// Project : DotNetNuke /// Class : PortalModuleBase @@ -42,14 +43,10 @@ public class PortalModuleBase : UserControlBase, IModuleControl RegexOptions.IgnoreCase | RegexOptions.Compiled, TimeSpan.FromSeconds(1)); private readonly ILog _tracelLogger = LoggerSource.Instance.GetLogger("DNN.Trace"); + private readonly Lazy _serviceScope = new Lazy(Globals.DependencyProvider.CreateScope); private string _localResourceFile; private ModuleInstanceContext _moduleContext; - public PortalModuleBase() - { - this.DependencyProvider = Globals.DependencyProvider; - } - [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Control ContainerControl @@ -368,7 +365,7 @@ public string LocalResourceFile /// /// The Dependency Service. /// - protected IServiceProvider DependencyProvider { get; } + protected IServiceProvider DependencyProvider => this._serviceScope.Value.ServiceProvider; [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] @@ -417,6 +414,16 @@ public int GetNextActionID() return this.ModuleContext.GetNextActionID(); } + /// + public override void Dispose() + { + base.Dispose(); + if (this._serviceScope.IsValueCreated) + { + this._serviceScope.Value.Dispose(); + } + } + [Obsolete("This property is deprecated. Please use ModuleController.CacheFileName(TabModuleID). Scheduled removal in v11.0.0.")] public string GetCacheFileName(int tabModuleId) { From 63ea5cdb51c114129358b217effd141299016776 Mon Sep 17 00:00:00 2001 From: Daniel Valadas Date: Mon, 27 Jul 2020 16:02:23 -0400 Subject: [PATCH 26/45] Resolves a logging issue (#3936) * Resolves 9.6.2 logging issue. Closes #3906 Apparently some files where deleted as part of #3843 This PR brings those files back and also fixes stylecop warnings. Some class names had to be changed both for clarity and to respect stylecop rule that the file name should match the class name. Because of that change, the dnn manifest was also changed so it all works with the new names. * fixes one missed ref in manifest --- .../INavigationManager.cs | 3 ++ .../Dnn.PersonaBar.Extensions.csproj | 10 +++- .../Dnn.PersonaBar.Extensions.dnn | 19 ++++---- .../AdminLogsMenuController.cs | 35 ++++++++++++++ ...ller.cs => ConfigConsoleMenuController.cs} | 26 +++++----- .../CssEditorMenuController.cs | 37 ++++++++++++++ .../ExtensionMenuController.cs | 28 +++++++---- .../LicensingMenuController.cs | 36 ++++++++++++++ .../MenuControllers/PagesMenuController.cs | 48 +++++++++++-------- .../MenuControllers/PromptMenuController.cs | 17 ++++--- .../MenuControllers/SecurityMenuController.cs | 16 +++++-- .../MenuControllers/ServersMenuController.cs | 17 ++++--- ...r.cs => SiteImportExportMenuController.cs} | 21 ++++---- .../SiteSettingsMenuController.cs | 16 +++++-- .../MenuControllers/SitesMenuController.cs | 37 ++++++++++++++ .../SqlConsoleMenuController.cs | 37 ++++++++++++++ .../TaskSchedulerMenuController.cs | 36 ++++++++++++++ .../MenuControllers/ThemeMenuController.cs | 23 ++++----- 18 files changed, 368 insertions(+), 94 deletions(-) create mode 100644 Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/AdminLogsMenuController.cs rename Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/{HostMenuController.cs => ConfigConsoleMenuController.cs} (78%) create mode 100644 Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/CssEditorMenuController.cs create mode 100644 Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/LicensingMenuController.cs rename Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/{AdminMenuController.cs => SiteImportExportMenuController.cs} (79%) create mode 100644 Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SitesMenuController.cs create mode 100644 Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SqlConsoleMenuController.cs create mode 100644 Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/TaskSchedulerMenuController.cs diff --git a/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs b/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs index d87bed58c5e..3d5c2398544 100644 --- a/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs +++ b/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs @@ -6,6 +6,9 @@ namespace DotNetNuke.Abstractions { using DotNetNuke.Abstractions.Portals; + /// + /// Provides navigation services. + /// public interface INavigationManager { /// diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.csproj b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.csproj index 7e060cad0c1..654ed026bd9 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.csproj +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.csproj @@ -336,14 +336,20 @@ - + + + - + + + + + diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn index 9119090d2c7..1c307ee5c20 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn @@ -92,7 +92,7 @@ Dnn.AdminLogs AdminLogs - Dnn.PersonaBar.AdminLogs.MenuControllers.AdminMenuController, Dnn.PersonaBar.Extensions + Dnn.PersonaBar.AdminLogs.MenuControllers.AdminLogsMenuController, Dnn.PersonaBar.Extensions nav_AdminLogs AdminLogs Manage @@ -120,7 +120,7 @@ Dnn.ConfigConsole ConfigConsole - Dnn.PersonaBar.ConfigConsole.MenuControllers.HostMenuController, Dnn.PersonaBar.Extensions + Dnn.PersonaBar.ConfigConsole.MenuControllers.ConfigConsoleMenuController, Dnn.PersonaBar.Extensions nav_ConfigConsole ConfigConsole Settings @@ -142,7 +142,7 @@ Dnn.CssEditor CssEditor - Dnn.PersonaBar.CssEditor.MenuControllers.AdminMenuController, Dnn.PersonaBar.Extensions + Dnn.PersonaBar.CssEditor.MenuControllers.CssEditorMenuController, Dnn.PersonaBar.Extensions nav_CssEditor CssEditor Settings @@ -154,7 +154,7 @@ Dnn.Licensing Licensing - Dnn.PersonaBar.Licensing.MenuControllers.HostMenuController, Dnn.PersonaBar.Extensions + Dnn.PersonaBar.Licensing.MenuControllers.LicensingMenuController, Dnn.PersonaBar.Extensions nav_Licensing Licensing Settings @@ -193,6 +193,7 @@ Dnn.Prompt Prompt + Dnn.PersonaBar.Prompt.MenuControllers.PromptMenuController, Dnn.PersonaBar.Extensions nav_Prompt Prompt Settings @@ -277,7 +278,7 @@ Dnn.Sites Sites - Dnn.PersonaBar.Sites.MenuControllers.AdminMenuController, Dnn.PersonaBar.Extensions + Dnn.PersonaBar.Sites.MenuControllers.SitesMenuController, Dnn.PersonaBar.Extensions nav_Sites Sites Manage @@ -288,7 +289,7 @@ Dnn.SiteGroups SiteGroups - Dnn.PersonaBar.Sites.MenuControllers.AdminMenuController, Dnn.PersonaBar.Extensions + Dnn.PersonaBar.Sites.MenuControllers.SitesMenuController, Dnn.PersonaBar.Extensions nav_SiteGroups SiteGroups Manage @@ -323,7 +324,7 @@ Dnn.SiteImportExport SiteImportExport - Dnn.PersonaBar.SiteImportExport.MenuControllers.AdminMenuController, Dnn.PersonaBar.Extensions + Dnn.PersonaBar.SiteImportExport.MenuControllers.SiteImportExportMenuController, Dnn.PersonaBar.Extensions nav_SiteImportExport SiteImportExport Settings @@ -355,7 +356,7 @@ Dnn.SqlConsole SqlConsole - Dnn.PersonaBar.SqlConsole.MenuControllers.HostMenuController, Dnn.PersonaBar.Extensions + Dnn.PersonaBar.SqlConsole.MenuControllers.SqlConsoleMenuController, Dnn.PersonaBar.Extensions nav_SqlConsole SqlConsole Settings @@ -366,7 +367,7 @@ Dnn.TaskScheduler TaskScheduler - Dnn.PersonaBar.TaskScheduler.MenuControllers.HostMenuController, Dnn.PersonaBar.Extensions + Dnn.PersonaBar.TaskScheduler.MenuControllers.TaskSchedulerMenuController, Dnn.PersonaBar.Extensions nav_TaskScheduler TaskScheduler Settings diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/AdminLogsMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/AdminLogsMenuController.cs new file mode 100644 index 00000000000..62239481a37 --- /dev/null +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/AdminLogsMenuController.cs @@ -0,0 +1,35 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace Dnn.PersonaBar.AdminLogs.MenuControllers +{ + using System.Collections.Generic; + + using Dnn.PersonaBar.Library.Controllers; + using Dnn.PersonaBar.Library.Model; + + /// + /// Controls the admin logs menu. + /// + public class AdminLogsMenuController : IMenuItemController + { + /// + public void UpdateParameters(MenuItem menuItem) + { + } + + /// + public bool Visible(MenuItem menuItem) + { + return true; + } + + /// + public IDictionary GetSettings(MenuItem menuItem) + { + var settings = new Dictionary(); + return settings; + } + } +} diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/HostMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ConfigConsoleMenuController.cs similarity index 78% rename from Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/HostMenuController.cs rename to Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ConfigConsoleMenuController.cs index 69523cbafe9..b468ebdf1ab 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/HostMenuController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ConfigConsoleMenuController.cs @@ -1,33 +1,33 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information - +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + namespace Dnn.PersonaBar.ConfigConsole.MenuControllers { - using System; using System.Collections.Generic; - using System.Linq; - using System.Text; - using System.Threading.Tasks; - + using Dnn.PersonaBar.Library.Controllers; using Dnn.PersonaBar.Library.Model; - using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Users; - - public class HostMenuController : IMenuItemController + + /// + /// Controls the config console menu. + /// + public class ConfigConsoleMenuController : IMenuItemController { + /// public void UpdateParameters(MenuItem menuItem) { - } + /// public bool Visible(MenuItem menuItem) { var user = UserController.Instance.GetCurrentUserInfo(); return user.IsSuperUser; } + /// public IDictionary GetSettings(MenuItem menuItem) { return null; diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/CssEditorMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/CssEditorMenuController.cs new file mode 100644 index 00000000000..83c94c9a4dd --- /dev/null +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/CssEditorMenuController.cs @@ -0,0 +1,37 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace Dnn.PersonaBar.CssEditor.MenuControllers +{ + using System.Collections.Generic; + + using Dnn.PersonaBar.Library.Controllers; + using Dnn.PersonaBar.Library.Model; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Users; + + /// + /// Controls the css editor menu. + /// + public class CssEditorMenuController : IMenuItemController + { + /// + public void UpdateParameters(MenuItem menuItem) + { + } + + /// + public bool Visible(MenuItem menuItem) + { + var user = UserController.Instance.GetCurrentUserInfo(); + return user.IsSuperUser || user.IsInRole(PortalSettings.Current?.AdministratorRoleName); + } + + /// + public IDictionary GetSettings(MenuItem menuItem) + { + return null; + } + } +} diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ExtensionMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ExtensionMenuController.cs index 4a20b319c47..43f5581f9b4 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ExtensionMenuController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ExtensionMenuController.cs @@ -14,25 +14,37 @@ namespace Dnn.PersonaBar.Extensions.MenuControllers using DotNetNuke.Entities.Users; using Microsoft.Extensions.DependencyInjection; + /// + /// Controls the extensions menu. + /// public class ExtensionMenuController : IMenuItemController { + /// + /// Initializes a new instance of the class. + /// public ExtensionMenuController() { this.NavigationManager = Globals.DependencyProvider.GetRequiredService(); - } - - protected INavigationManager NavigationManager { get; } - + } + + /// + /// Gets an instance to provide navigation services. + /// + protected INavigationManager NavigationManager { get; } + + /// public void UpdateParameters(MenuItem menuItem) { - } - + } + + /// public bool Visible(MenuItem menuItem) { var user = UserController.Instance.GetCurrentUserInfo(); return user.IsSuperUser || user.IsInRole(PortalSettings.Current?.AdministratorRoleName); - } - + } + + /// public IDictionary GetSettings(MenuItem menuItem) { var settings = new Dictionary(); diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/LicensingMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/LicensingMenuController.cs new file mode 100644 index 00000000000..fa30dbf4370 --- /dev/null +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/LicensingMenuController.cs @@ -0,0 +1,36 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace Dnn.PersonaBar.Licensing.MenuControllers +{ + using System.Collections.Generic; + + using Dnn.PersonaBar.Library.Controllers; + using Dnn.PersonaBar.Library.Model; + using DotNetNuke.Entities.Users; + + /// + /// Controls the licensing menu. + /// + public class LicensingMenuController : IMenuItemController + { + /// + public void UpdateParameters(MenuItem menuItem) + { + } + + /// + public bool Visible(MenuItem menuItem) + { + var user = UserController.Instance.GetCurrentUserInfo(); + return user.IsSuperUser; + } + + /// + public IDictionary GetSettings(MenuItem menuItem) + { + return null; + } + } +} diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/PagesMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/PagesMenuController.cs index 8733c9c7c6b..886d0621384 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/PagesMenuController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/PagesMenuController.cs @@ -5,46 +5,52 @@ namespace Dnn.PersonaBar.Pages.MenuControllers { using System.Collections.Generic; - using System.Linq; using Dnn.PersonaBar.Library.Controllers; using Dnn.PersonaBar.Library.Model; - using Dnn.PersonaBar.Library.Permissions; using Dnn.PersonaBar.Pages.Components.Security; using DotNetNuke.Application; using DotNetNuke.Entities.Portals; + /// + /// Controls the pages menu. + /// public class PagesMenuController : IMenuItemController { - private readonly ISecurityService _securityService; - + private readonly ISecurityService securityService; + + /// + /// Initializes a new instance of the class. + /// public PagesMenuController() { - this._securityService = SecurityService.Instance; - } - + this.securityService = SecurityService.Instance; + } + + /// public void UpdateParameters(MenuItem menuItem) { - - } - + } + + /// public bool Visible(MenuItem menuItem) { - return this._securityService.IsVisible(menuItem); - } - + return this.securityService.IsVisible(menuItem); + } + + /// public IDictionary GetSettings(MenuItem menuItem) { var settings = new Dictionary { - {"canSeePagesList", this._securityService.CanViewPageList(menuItem.MenuId)}, - {"portalName", PortalSettings.Current.PortalName}, - {"currentPagePermissions", this._securityService.GetCurrentPagePermissions()}, - {"currentPageName", PortalSettings.Current?.ActiveTab?.TabName}, - {"productSKU", DotNetNukeContext.Current.Application.SKU}, - {"isAdmin", this._securityService.IsPageAdminUser()}, - {"currentParentHasChildren", PortalSettings.Current?.ActiveTab?.HasChildren}, - {"isAdminHostSystemPage", this._securityService.IsAdminHostSystemPage() } + { "canSeePagesList", this.securityService.CanViewPageList(menuItem.MenuId) }, + { "portalName", PortalSettings.Current.PortalName }, + { "currentPagePermissions", this.securityService.GetCurrentPagePermissions() }, + { "currentPageName", PortalSettings.Current?.ActiveTab?.TabName }, + { "productSKU", DotNetNukeContext.Current.Application.SKU }, + { "isAdmin", this.securityService.IsPageAdminUser() }, + { "currentParentHasChildren", PortalSettings.Current?.ActiveTab?.HasChildren }, + { "isAdminHostSystemPage", this.securityService.IsAdminHostSystemPage() }, }; return settings; diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/PromptMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/PromptMenuController.cs index 191b4398c5a..e16632736a4 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/PromptMenuController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/PromptMenuController.cs @@ -10,19 +10,24 @@ namespace Dnn.PersonaBar.Prompt.MenuControllers using Dnn.PersonaBar.Library.Model; using DotNetNuke.Entities.Users; + /// + /// Controls the prompt menu. + /// public class PromptMenuController : IMenuItemController - { + { + /// public void UpdateParameters(MenuItem menuItem) { - - } - + } + + /// public bool Visible(MenuItem menuItem) { var user = UserController.Instance.GetCurrentUserInfo(); return user.IsSuperUser; - } - + } + + /// public IDictionary GetSettings(MenuItem menuItem) { return null; diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SecurityMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SecurityMenuController.cs index 4152ab92017..1e4647200fa 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SecurityMenuController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SecurityMenuController.cs @@ -9,17 +9,23 @@ namespace Dnn.PersonaBar.Security.MenuControllers using Dnn.PersonaBar.Library.Controllers; using Dnn.PersonaBar.Library.Model; + /// + /// Controls the security menu. + /// public class SecurityMenuController : IMenuItemController - { + { + /// public void UpdateParameters(MenuItem menuItem) { - } - + } + + /// public bool Visible(MenuItem menuItem) { return true; - } - + } + + /// public IDictionary GetSettings(MenuItem menuItem) { var settings = new Dictionary(); diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ServersMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ServersMenuController.cs index 3698514dfee..34017fa8f9b 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ServersMenuController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ServersMenuController.cs @@ -11,19 +11,24 @@ namespace Dnn.PersonaBar.Servers.MenuControllers using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Users; + /// + /// Controls the servers menu. + /// public class ServersMenuController : IMenuItemController - { + { + /// public void UpdateParameters(MenuItem menuItem) { - - } - + } + + /// public bool Visible(MenuItem menuItem) { var user = UserController.Instance.GetCurrentUserInfo(); return user.IsSuperUser || user.IsInRole(PortalSettings.Current?.AdministratorRoleName); - } - + } + + /// public IDictionary GetSettings(MenuItem menuItem) { var settings = new Dictionary(); diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/AdminMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SiteImportExportMenuController.cs similarity index 79% rename from Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/AdminMenuController.cs rename to Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SiteImportExportMenuController.cs index a22cd5cb57a..176e8da4974 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/AdminMenuController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SiteImportExportMenuController.cs @@ -1,29 +1,34 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information - +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + namespace Dnn.PersonaBar.SiteImportExport.MenuControllers { using System.Collections.Generic; - + using Dnn.PersonaBar.Library.Controllers; using Dnn.PersonaBar.Library.Model; using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Users; - - public class AdminMenuController : IMenuItemController + + /// + /// Controls the site import/export menu. + /// + public class SiteImportExportMenuController : IMenuItemController { + /// public void UpdateParameters(MenuItem menuItem) { - } + /// public bool Visible(MenuItem menuItem) { var user = UserController.Instance.GetCurrentUserInfo(); return user.IsSuperUser; } + /// public IDictionary GetSettings(MenuItem menuItem) { var settings = new Dictionary(); diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SiteSettingsMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SiteSettingsMenuController.cs index 82655d0b612..3284c3c9e48 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SiteSettingsMenuController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SiteSettingsMenuController.cs @@ -11,17 +11,23 @@ namespace Dnn.PersonaBar.SiteSettings.MenuControllers using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Users; + /// + /// Controls the site settings menu. + /// public class SiteSettingsMenuController : IMenuItemController - { + { + /// public void UpdateParameters(MenuItem menuItem) { - } - + } + + /// public bool Visible(MenuItem menuItem) { return true; - } - + } + + /// public IDictionary GetSettings(MenuItem menuItem) { var settings = new Dictionary(); diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SitesMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SitesMenuController.cs new file mode 100644 index 00000000000..af4afcad35b --- /dev/null +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SitesMenuController.cs @@ -0,0 +1,37 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace Dnn.PersonaBar.Sites.MenuControllers +{ + using System.Collections.Generic; + + using Dnn.PersonaBar.Library.Controllers; + using Dnn.PersonaBar.Library.Model; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Users; + + /// + /// Controls the sites menu. + /// + public class SitesMenuController : IMenuItemController + { + /// + public void UpdateParameters(MenuItem menuItem) + { + } + + /// + public bool Visible(MenuItem menuItem) + { + var user = UserController.Instance.GetCurrentUserInfo(); + return user.IsSuperUser || user.IsInRole(PortalSettings.Current?.AdministratorRoleName); + } + + /// + public IDictionary GetSettings(MenuItem menuItem) + { + return null; + } + } +} diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SqlConsoleMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SqlConsoleMenuController.cs new file mode 100644 index 00000000000..ad4fd626ad6 --- /dev/null +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/SqlConsoleMenuController.cs @@ -0,0 +1,37 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace Dnn.PersonaBar.SqlConsole.MenuControllers +{ + using System.Collections.Generic; + + using Dnn.PersonaBar.Library.Controllers; + using Dnn.PersonaBar.Library.Model; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Users; + + /// + /// Controls the sql console menu. + /// + public class SqlConsoleMenuController : IMenuItemController + { + /// + public void UpdateParameters(MenuItem menuItem) + { + } + + /// + public bool Visible(MenuItem menuItem) + { + var user = UserController.Instance.GetCurrentUserInfo(); + return user.IsSuperUser; + } + + /// + public IDictionary GetSettings(MenuItem menuItem) + { + return null; + } + } +} diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/TaskSchedulerMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/TaskSchedulerMenuController.cs new file mode 100644 index 00000000000..4b1c78baec2 --- /dev/null +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/TaskSchedulerMenuController.cs @@ -0,0 +1,36 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace Dnn.PersonaBar.TaskScheduler.MenuControllers +{ + using System.Collections.Generic; + + using Dnn.PersonaBar.Library.Controllers; + using Dnn.PersonaBar.Library.Model; + using DotNetNuke.Entities.Users; + + /// + /// Controls the task scheduler menu. + /// + public class TaskSchedulerMenuController : IMenuItemController + { + /// + public void UpdateParameters(MenuItem menuItem) + { + } + + /// + public bool Visible(MenuItem menuItem) + { + var user = UserController.Instance.GetCurrentUserInfo(); + return user.IsSuperUser; + } + + /// + public IDictionary GetSettings(MenuItem menuItem) + { + return null; + } + } +} diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ThemeMenuController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ThemeMenuController.cs index 67bef0a9bb7..00dc64d6778 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ThemeMenuController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/MenuControllers/ThemeMenuController.cs @@ -4,35 +4,36 @@ namespace Dnn.PersonaBar.Themes.MenuControllers { - using System; using System.Collections.Generic; - using System.Linq; - using System.Web; using Dnn.PersonaBar.Library.Controllers; using Dnn.PersonaBar.Library.Model; using DotNetNuke.Abstractions; using DotNetNuke.Common; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Users; using Microsoft.Extensions.DependencyInjection; + /// + /// Controls the themes menu. + /// public class ThemeMenuController : IMenuItemController - { + { + /// public void UpdateParameters(MenuItem menuItem) { - } - + } + + /// public bool Visible(MenuItem menuItem) { return true; - } - + } + + /// public IDictionary GetSettings(MenuItem menuItem) { return new Dictionary { - {"previewUrl", Globals.DependencyProvider.GetRequiredService().NavigateURL()}, + { "previewUrl", Globals.DependencyProvider.GetRequiredService().NavigateURL() }, }; } } From 9fd6b586fd250aefce452919a428309e75dc9b4e Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 27 Jul 2020 15:08:35 -0500 Subject: [PATCH 27/45] Add List-Services command to Prompt (#3932) * Load DNN types first in DI startup Fixes #3335 * Simplify main DI Startup class It doesn't need to implement IDnnStartup, it can just configure the service provider and be done. This also allows us to stop ignoring other IDnnStartup instances in the DotNetNuke.Web project, were they to be created later. * Fix error message when calling ConfigureServices * Move AddWebApi call to regular IDnnStartup This ensures that it's called at the right time relative to all other DI configuration. * Fix ordering of IDnnStartup for real * Add List-Services debugging command for Prompt --- .../Common/DotNetNukeHttpApplication.cs | 6 +- .../DependencyInjectionInitialize.cs | 72 ++ .../DotNetNuke.Web/DotNetNuke.Web.csproj | 2 + .../DotNetNuke.Web/Prompt/ListServices.cs | 85 ++ DNN Platform/DotNetNuke.Web/Startup.cs | 91 +- .../Website/App_GlobalResources/Prompt.resx | 1096 +++++++++-------- 6 files changed, 731 insertions(+), 621 deletions(-) create mode 100644 DNN Platform/DotNetNuke.Web/DependencyInjectionInitialize.cs create mode 100644 DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs diff --git a/DNN Platform/DotNetNuke.Web/Common/DotNetNukeHttpApplication.cs b/DNN Platform/DotNetNuke.Web/Common/DotNetNukeHttpApplication.cs index 8befbb509e8..69c618a6c8b 100644 --- a/DNN Platform/DotNetNuke.Web/Common/DotNetNukeHttpApplication.cs +++ b/DNN Platform/DotNetNuke.Web/Common/DotNetNukeHttpApplication.cs @@ -129,9 +129,9 @@ private void Application_Start(object sender, EventArgs eventArgs) var name = Config.GetSetting("ServerName"); Globals.ServerName = string.IsNullOrEmpty(name) ? Dns.GetHostName() : name; - Globals.DependencyProvider = new LazyServiceProvider(); - var startup = new Startup(); - (Globals.DependencyProvider as LazyServiceProvider).SetProvider(startup.DependencyProvider); + var dependencyProvider = new LazyServiceProvider(); + Globals.DependencyProvider = dependencyProvider; + dependencyProvider.SetProvider(DependencyInjectionInitialize.BuildServiceProvider()); ServiceRequestScopeModule.SetServiceProvider(Globals.DependencyProvider); ComponentFactory.Container = new SimpleContainer(); diff --git a/DNN Platform/DotNetNuke.Web/DependencyInjectionInitialize.cs b/DNN Platform/DotNetNuke.Web/DependencyInjectionInitialize.cs new file mode 100644 index 00000000000..5270e1f7173 --- /dev/null +++ b/DNN Platform/DotNetNuke.Web/DependencyInjectionInitialize.cs @@ -0,0 +1,72 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information +namespace DotNetNuke.Web +{ + using System; + using System.Linq; + + using DotNetNuke.DependencyInjection; + using DotNetNuke.DependencyInjection.Extensions; + using DotNetNuke.Instrumentation; + using DotNetNuke.Services.DependencyInjection; + + using Microsoft.Extensions.DependencyInjection; + + /// Initializes the Dependency Injection container. + public static class DependencyInjectionInitialize + { + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(DependencyInjectionInitialize)); + + internal static IServiceCollection ServiceCollection { get; private set; } + + /// Builds the service provider. + /// An instance. + public static IServiceProvider BuildServiceProvider() + { + var services = new ServiceCollection(); + services.AddSingleton(); + ConfigureAllStartupServices(services); + + ServiceCollection = services; + return services.BuildServiceProvider(); + } + + private static void ConfigureAllStartupServices(IServiceCollection services) + { + var startupTypes = AppDomain.CurrentDomain.GetAssemblies() + .OrderBy( + assembly => assembly.FullName.StartsWith("DotNetNuke", StringComparison.OrdinalIgnoreCase) ? 0 : + assembly.FullName.StartsWith("DNN", StringComparison.OrdinalIgnoreCase) ? 1 : 2) + .ThenBy(assembly => assembly.FullName) + .SelectMany(assembly => assembly.SafeGetTypes().OrderBy(type => type.FullName ?? type.Name)) + .Where(type => typeof(IDnnStartup).IsAssignableFrom(type) && type.IsClass && !type.IsAbstract); + + var startupInstances = startupTypes.Select(CreateInstance).Where(x => x != null); + foreach (var startup in startupInstances) + { + try + { + startup.ConfigureServices(services); + } + catch (Exception ex) + { + Logger.Error($"Unable to configure services for {startup.GetType().FullName}, see exception for details", ex); + } + } + } + + private static IDnnStartup CreateInstance(Type startupType) + { + try + { + return (IDnnStartup)Activator.CreateInstance(startupType); + } + catch (Exception ex) + { + Logger.Error($"Unable to instantiate startup code for {startupType.FullName}", ex); + return null; + } + } + } +} diff --git a/DNN Platform/DotNetNuke.Web/DotNetNuke.Web.csproj b/DNN Platform/DotNetNuke.Web/DotNetNuke.Web.csproj index bad417f0c9d..60709a2b56d 100644 --- a/DNN Platform/DotNetNuke.Web/DotNetNuke.Web.csproj +++ b/DNN Platform/DotNetNuke.Web/DotNetNuke.Web.csproj @@ -212,6 +212,7 @@ + @@ -259,6 +260,7 @@ + diff --git a/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs b/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs new file mode 100644 index 00000000000..887c2bfc328 --- /dev/null +++ b/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs @@ -0,0 +1,85 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information +namespace DotNetNuke.Web.Prompt +{ + using System; + using System.Linq; + using System.Net; + + using DotNetNuke.Abstractions.Portals; + using DotNetNuke.Abstractions.Prompt; + using DotNetNuke.Abstractions.Users; + using DotNetNuke.Prompt; + + using Microsoft.Extensions.DependencyInjection; + + /// + /// This is a (Prompt) Console Command. You should not reference this class directly. It is to be used solely through Prompt. + /// + [ConsoleCommand("list-services", "Prompt_DebugCategory", "Prompt_ListServices_Description")] + public class ListServices : ConsoleCommand + { + public override string LocalResourceFile => Constants.DefaultPromptResourceFile; + + public override void Initialize(string[] args, IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId) + { + base.Initialize(args, portalSettings, userInfo, activeTabId); + if (!userInfo.IsSuperUser) + { + this.AddMessage(this.LocalizeString("Prompt_ListServices_Unauthorized")); + } + + this.ParseParameters(this); + } + + public override IConsoleResultModel Run() + { + if (!this.User.IsSuperUser) + { + return new ConsoleErrorResultModel(this.LocalizeString("Prompt_ListServices_Unauthorized")); + } + + var services = DependencyInjectionInitialize.ServiceCollection.Select( + descriptor => new + { + LifeTime = descriptor.Lifetime.ToString("G"), + Service = this.GetTypeName(descriptor.ServiceType), + Implementation = this.GetImplementationText(descriptor), + }) + .OrderBy(desc => desc.Service) + .ThenBy(desc => desc.Implementation) + .ToList(); + return new ConsoleResultModel + { + Data = services, + Records = services.Count, + }; + } + + private string GetImplementationText(ServiceDescriptor descriptor) + { + if (descriptor.ImplementationInstance != null) + { + return this.LocalizeString("Prompt_ListServices_ImplementationInstance"); + } + + if (descriptor.ImplementationFactory != null) + { + return this.LocalizeString("Prompt_ListServices_ImplementationFactory"); + } + + return this.GetTypeName(descriptor.ImplementationType); + } + + private string GetTypeName(Type type) + { + if (type == null) + { + return this.LocalizeString("Prompt_ListServices_None"); + } + + return WebUtility.HtmlEncode(type.FullName ?? type.Name); + } + } +} diff --git a/DNN Platform/DotNetNuke.Web/Startup.cs b/DNN Platform/DotNetNuke.Web/Startup.cs index 59d5c298188..c8d78356f6b 100644 --- a/DNN Platform/DotNetNuke.Web/Startup.cs +++ b/DNN Platform/DotNetNuke.Web/Startup.cs @@ -1,81 +1,20 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information +namespace DotNetNuke.Web +{ + using DotNetNuke.DependencyInjection; + using DotNetNuke.Web.Extensions; -namespace DotNetNuke.Web -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Reflection; + using Microsoft.Extensions.DependencyInjection; - using DotNetNuke.DependencyInjection; - using DotNetNuke.DependencyInjection.Extensions; - using DotNetNuke.Instrumentation; - using DotNetNuke.Services.DependencyInjection; - using DotNetNuke.Web.Extensions; - using Microsoft.Extensions.DependencyInjection; - - public class Startup : IDnnStartup - { - private static readonly ILog _logger = LoggerSource.Instance.GetLogger(typeof(Startup)); - - public Startup() - { - this.Configure(); - } - - public IServiceProvider DependencyProvider { get; private set; } - - public void ConfigureServices(IServiceCollection services) - { - var startupTypes = AppDomain.CurrentDomain.GetAssemblies() - .Where(x => x != Assembly.GetAssembly(typeof(Startup))) - .SelectMany(x => x.SafeGetTypes()) - .Where(x => typeof(IDnnStartup).IsAssignableFrom(x) && - x.IsClass && - !x.IsAbstract); - - var startupInstances = startupTypes - .Select(x => this.CreateInstance(x)) - .Where(x => x != null); - - foreach (IDnnStartup startup in startupInstances) - { - try - { - startup.ConfigureServices(services); - } - catch (Exception ex) - { - _logger.Error($"Unable to configure services for {typeof(Startup).FullName}, see exception for details", ex); - } - } - - services.AddWebApi(); - } - - private void Configure() - { - var services = new ServiceCollection(); - services.AddSingleton(); - this.ConfigureServices(services); - this.DependencyProvider = services.BuildServiceProvider(); - } - - private object CreateInstance(Type startupType) - { - IDnnStartup startup = null; - try - { - startup = (IDnnStartup)Activator.CreateInstance(startupType); - } - catch (Exception ex) - { - _logger.Error($"Unable to instantiate startup code for {startupType.FullName}", ex); - } - - return startup; - } - } -} + /// Configures services for The DotNetNuke.Web project. + public class Startup : IDnnStartup + { + /// + public void ConfigureServices(IServiceCollection services) + { + services.AddWebApi(); + } + } +} diff --git a/DNN Platform/Website/App_GlobalResources/Prompt.resx b/DNN Platform/Website/App_GlobalResources/Prompt.resx index 157ce11ec38..e1f8a698ee2 100644 --- a/DNN Platform/Website/App_GlobalResources/Prompt.resx +++ b/DNN Platform/Website/App_GlobalResources/Prompt.resx @@ -1,222 +1,222 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - You've submitted invalid data. Your request cannot be processed. - - - Invalid syntax - - - You are not authorized to access to this resource. Your session may have timed-out. If so login again. - - - This functionality has not yet been implemented. - - - The server has encoutered an issue and was unable to process your request. Please try again later. - - - Your session may have timed-out. If so login again. - - - Command '{0}' not found. - - - {0} or {1} - - - Did you mean '{0}'? - - - No modules found. - - - An error occurred while attempting to add the module. Please see the DNN Event Viewer for details. - - - Unable to find a desktop module with the name '{0}' for this portal - - - Successfully added {0} new module{1} - - - Successfully copied the module. - - - Module deleted successfully. - - - No modules were added - - - The source Page ID and target Page ID cannot be the same.\n - - - Successfully moved the module. - - - An error occurred while copying the copying the module. See the DNN Event Viewer for Details. - - - An error occurred while copying the moving the module. See the DNN Event Viewer for Details. - - - Failed to delete the module with id {0}. Please see log viewer for more details. - - - You do not have enough permissions to perform this operation. - - - Could not find module with id {0} on page with id {1} - - - No module found with id {0}. - - - Could not load Target Page. No page found in the portal with ID '{0}' - - - User triggered an Application Restart - - - Initiates a restart of the DNN instance and reloads the page. - - - Default - - - Description - - - Options - - - Required - - - Type - - - Unable to find help for that command - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + You've submitted invalid data. Your request cannot be processed. + + + Invalid syntax + + + You are not authorized to access to this resource. Your session may have timed-out. If so login again. + + + This functionality has not yet been implemented. + + + The server has encoutered an issue and was unable to process your request. Please try again later. + + + Your session may have timed-out. If so login again. + + + Command '{0}' not found. + + + {0} or {1} + + + Did you mean '{0}'? + + + No modules found. + + + An error occurred while attempting to add the module. Please see the DNN Event Viewer for details. + + + Unable to find a desktop module with the name '{0}' for this portal + + + Successfully added {0} new module{1} + + + Successfully copied the module. + + + Module deleted successfully. + + + No modules were added + + + The source Page ID and target Page ID cannot be the same.\n + + + Successfully moved the module. + + + An error occurred while copying the copying the module. See the DNN Event Viewer for Details. + + + An error occurred while copying the moving the module. See the DNN Event Viewer for Details. + + + Failed to delete the module with id {0}. Please see log viewer for more details. + + + You do not have enough permissions to perform this operation. + + + Could not find module with id {0} on page with id {1} + + + No module found with id {0}. + + + Could not load Target Page. No page found in the portal with ID '{0}' + + + User triggered an Application Restart + + + Initiates a restart of the DNN instance and reloads the page. + + + Default + + + Description + + + Options + + + Required + + + Type + + + Unable to find help for that command + + <section class="dnn-prompt-inline-help"> <h3>Understanding Prompt Commands</h3> @@ -346,9 +346,9 @@ <a data-cmd="help syntax" class="dnn-prompt-cmd-insert" href="#">Basic Syntax</a> <a data-cmd="help" class="dnn-prompt-cmd-insert" href="#">Prompt Commands List</a> -</section> - - +</section> + + <section class="dnn-prompt-inline-help"> <h3>Basic Syntax</h3> <p> @@ -377,72 +377,72 @@ <a data-cmd="help learn" class="dnn-prompt-cmd-insert" href="#">Learning Prompt Commands</a> <a data-cmd="help" class="dnn-prompt-cmd-insert" href="#">Prompt Commands List</a> -</section> - - - Adds a module to a page on the website. - - - Name of the desktop module to add. This should be unique existing module name. - - - Specify the title of the module on the page. - - - Id of the page to add module on. - - - Specify the pane in which the module should be added. If not provided, module would be added to ContentPane. - - +</section> + + + Adds a module to a page on the website. + + + Name of the desktop module to add. This should be unique existing module name. + + + Specify the title of the module on the page. + + + Id of the page to add module on. + + + Specify the pane in which the module should be added. If not provided, module would be added to ContentPane. + + <h4>Add a module to a page</h4> - <code class="block">add-module --name "Html" --pageid 23 --pane TopPane</code> - - - Copies a module to the specified page. - - - Explicitly specifies the Module ID of the module to copy. Use of the flag is not required. You can simply provide the ID value as the first argument. - - - If true, Prompt will copy the source module's settings to the copied module. - - - The Page ID of the page that contains the module you want to copy. - - - Specify the pane in which the module should be copied. If not provided, module would be copied to ContentPane. - - - The Page ID of the target page. The page to which you want to copy the module. - - - Soft-deletes a module on a specific page. The module will be sent to the DNN Recycle Bin. This will not uninstall modules or affect module definitions. - - - Explicitly specifies the Module ID of the module to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument. - - - Specifies the Page ID of the page on which the module to delete resides. - - + <code class="block">add-module --name "Html" --pageid 23 --pane TopPane</code> + + + Copies a module to the specified page. + + + Explicitly specifies the Module ID of the module to copy. Use of the flag is not required. You can simply provide the ID value as the first argument. + + + If true, Prompt will copy the source module's settings to the copied module. + + + The Page ID of the page that contains the module you want to copy. + + + Specify the pane in which the module should be copied. If not provided, module would be copied to ContentPane. + + + The Page ID of the target page. The page to which you want to copy the module. + + + Soft-deletes a module on a specific page. The module will be sent to the DNN Recycle Bin. This will not uninstall modules or affect module definitions. + + + Explicitly specifies the Module ID of the module to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument. + + + Specifies the Page ID of the page on which the module to delete resides. + + <h4>Delete and Send Module Instance to Recycle Bin</h4> <p>This will delete a module instance on a specific page and send it to the DNN Recycle Bin</p> - <code class="block">delete-module 345 --pageid 42</code> - - - Retrieves details about a single module in a specified page - - - Explicitly specifies the Module ID of the module to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument. - - - The Page ID of the page that contains the module. - - - Module '{0}' has been found in page '{1}'. - - + <code class="block">delete-module 345 --pageid 42</code> + + + Retrieves details about a single module in a specified page + + + Explicitly specifies the Module ID of the module to retrieve. Use of the flag is not required. You can simply provide the ID value as the first argument. + + + The Page ID of the page that contains the module. + + + Module '{0}' has been found in page '{1}'. + + <h4>Get Information on a Specific Module</h4> <p>The code below retrieves the details for a module whose Module ID is 345 on a page 48</p> <code class="block">get-module 359 --pageid 48</code> @@ -486,30 +486,30 @@ <td>:</td> <td>42, 46, 47, 48</td> </tr> - </table> - - - Retrieves a list of modules based on the search criteria - - - When specified, the command will find all module instances in the portal that are in the Recycle Bin (if <span class="mono">--deleted</span> is true), or all module instances <em>not</em> in the Recycle Bin (if operate <span class="mono">--deleted</span> is false). If the flag is specified but no value is given, it will default to <span class="mono">true</span>. This flag may be used with <span class="mono">--name</span> and <span class="mono">--title</span> to further refine the results - - - Page Size for the page. Max is 500. - - - The name of the module to search for. This accepts the wildcard (*) character to do partial searches. The Module Name is not the same thing as the module's Friendly Name or the module's Title. To find the Module Name, <code>list-modules</code> on a page containing the module. Searches are case-insensitive - - - The title of the module to search for. This accepts wildcard (*) placeholders representing 0 or more characters. Searches are case-insensitive. - - - Page number to show records. - - - When specified, the command will show modules from specified page only. Use of the flag is not required. You can simply provide the ID value as the first argument. - - + </table> + + + Retrieves a list of modules based on the search criteria + + + When specified, the command will find all module instances in the portal that are in the Recycle Bin (if <span class="mono">--deleted</span> is true), or all module instances <em>not</em> in the Recycle Bin (if operate <span class="mono">--deleted</span> is false). If the flag is specified but no value is given, it will default to <span class="mono">true</span>. This flag may be used with <span class="mono">--name</span> and <span class="mono">--title</span> to further refine the results + + + Page Size for the page. Max is 500. + + + The name of the module to search for. This accepts the wildcard (*) character to do partial searches. The Module Name is not the same thing as the module's Friendly Name or the module's Title. To find the Module Name, <code>list-modules</code> on a page containing the module. Searches are case-insensitive + + + The title of the module to search for. This accepts wildcard (*) placeholders representing 0 or more characters. Searches are case-insensitive. + + + Page number to show records. + + + When specified, the command will show modules from specified page only. Use of the flag is not required. You can simply provide the ID value as the first argument. + + <h4>List Modules in the Current Portal</h4> <code class="block">list-modules</code> @@ -637,24 +637,24 @@ <td>71</td> </tr> </tbody> - </table> - - - Moves a module to the specified page - - - Explicitly specifies the Module ID of the module to copy. Use of the flag is not required. You can simply provide the ID value as the first argument. - - - The Page ID of the page that contains the module you want to copy. - - - Specify the pane in which the module should be moved. If not provided, module would be moved to ContentPane. - - - The Page ID of the target page. The page to which you want to copy the module. - - + </table> + + + Moves a module to the specified page + + + Explicitly specifies the Module ID of the module to copy. Use of the flag is not required. You can simply provide the ID value as the first argument. + + + The Page ID of the page that contains the module you want to copy. + + + Specify the pane in which the module should be moved. If not provided, module would be moved to ContentPane. + + + The Page ID of the target page. The page to which you want to copy the module. + + <h4>Move a Module from One Page to Another</h4> <p>This command the module with Module ID 358 on the Page with Page ID of 71 and places module on the page with a Page ID of 75</p> <code class="block">move-module 358 --pageid 71 --topageid 75</code> @@ -699,12 +699,12 @@ <tr> <td colspan="3">Successfully copied the module.</td> </tr> - </table> - - - Clears the server's cache and reloads the page. - - + </table> + + + Clears the server's cache and reloads the page. + + <code class="block"> clear-cache </code> @@ -712,36 +712,36 @@ <table class="command-result-tbl"> <tr><td>Cache cleared</td></tr> <tr><td>Reloading in 3 seconds</td></tr> - </table> - - - Clears history of commands used in current session - - - Clears the Event Log for the current portal. - - + </table> + + + Clears history of commands used in current session + + + Clears the Event Log for the current portal. + + <code class="block"> clear-log </code> <h4>Results</h4> <table class="command-result-tbl"> <tr><td><em>[Event Log Cleared]</em></td></tr> - </table> - - - Clears the Prompt console. <code>cls</code> is a shortcut for <a href="#clear-screen" class="dnn-prompt-cmd-insert"><code>clear-screen</code></a> - - - Echos back the first argument received - - - Exits the Prompt console. - - - Retrieves information about the DNN installation - - + </table> + + + Clears the Prompt console. <code>cls</code> is a shortcut for <a href="#clear-screen" class="dnn-prompt-cmd-insert"><code>clear-screen</code></a> + + + Echos back the first argument received + + + Exits the Prompt console. + + + Retrieves information about the DNN installation + + <h4>Get Information on Current DNN Installation</h4> <code class="block"> get-host @@ -823,15 +823,15 @@ <td>:</td> <td>1</td> </tr> - </table> - - - Retrieves basic information about the current portal or specified portal - - - Portal Id to get info. Only host can get information of portals other than current. - - + </table> + + + Retrieves basic information about the current portal or specified portal + + + Portal Id to get info. Only host can get information of portals other than current. + + <h4>Get Information on Current Portal</h4> <code class="block"> get-portal @@ -898,15 +898,15 @@ <td>:</td> <td>en-US</td> </tr> - </table> - - - Retrieves basic information about the current portal or specified portal - - - Site Id to get info. Only host can get information of portals other than current. - - + </table> + + + Retrieves basic information about the current portal or specified portal + + + Site Id to get info. Only host can get information of portals other than current. + + <h4>Get Information on Current Portal</h4> <code class="block"> get-portal @@ -973,151 +973,151 @@ <td>:</td> <td>en-US</td> </tr> - </table> - - - Lists all the commands. - - - Retrieves a list of portals for the current DNN Installation - - - Retrieves a list of portals for the current DNN Installation - - - Reloads the current page - - - Page {0} of {1}. - - - Page {0} of {1}. Press any key to load next page. Press CTRL + X to end. - - - Default - - - Description - - - Flag - - - Options - - - Required - - - Type - - - General Commands - - - Host Commands - - - Module Commands - - - Portal Commands - - - Command - - - Commands - - - Description - - - Learning Prompt Commands - - - Here is a list of available commands for Prompt. - - - Prompt Commands - - - See Also - - - Overview/Basic Syntax - - - An error occurred while attempting to clear the cache. - - - Cache Cleared. - - - An error occurred while attempting to clear the Event Log. - - - Event Log Cleared. - - - Nothing to echo back - - - <h4></h4> - - - '[0]' is required. - - - You do not have authorization to access this functionality. - - - The get-host command does not take any arguments or flags. - - - get-host command executed successfully. - - - The get-portal command does not take any arguments or flags. - - - Could not find a portal with ID of '{0}' - - - Portal '{0}' has been found. - - - An error occurred while attempting to list the commands. - - - Found {0} commands. - - - Description - - - Name - - - Version - - - Category - - - The list-portal command does not take any arguments or flags - - - '{0}' Portal{1} found. - - - Sets the DNN View Mode. This has the same effect as clicking the appropriate options in the DNN Control Bar. - - + </table> + + + Lists all the commands. + + + Retrieves a list of portals for the current DNN Installation + + + Retrieves a list of portals for the current DNN Installation + + + Reloads the current page + + + Page {0} of {1}. + + + Page {0} of {1}. Press any key to load next page. Press CTRL + X to end. + + + Default + + + Description + + + Flag + + + Options + + + Required + + + Type + + + General Commands + + + Host Commands + + + Module Commands + + + Portal Commands + + + Command + + + Commands + + + Description + + + Learning Prompt Commands + + + Here is a list of available commands for Prompt. + + + Prompt Commands + + + See Also + + + Overview/Basic Syntax + + + An error occurred while attempting to clear the cache. + + + Cache Cleared. + + + An error occurred while attempting to clear the Event Log. + + + Event Log Cleared. + + + Nothing to echo back + + + <h4></h4> + + + '[0]' is required. + + + You do not have authorization to access this functionality. + + + The get-host command does not take any arguments or flags. + + + get-host command executed successfully. + + + The get-portal command does not take any arguments or flags. + + + Could not find a portal with ID of '{0}' + + + Portal '{0}' has been found. + + + An error occurred while attempting to list the commands. + + + Found {0} commands. + + + Description + + + Name + + + Version + + + Category + + + The list-portal command does not take any arguments or flags + + + '{0}' Portal{1} found. + + + Sets the DNN View Mode. This has the same effect as clicking the appropriate options in the DNN Control Bar. + + One of three view modes: <code>edit</code>, <code>layout</code>, or <code>view</code>. You do not need to specify - the <span class="mono">--mode</span> flag explicitly. Simply type one of the view mode values after the command. - - + the <span class="mono">--mode</span> flag explicitly. Simply type one of the view mode values after the command. + + <div> <h4>Change the DNN View Mode</h4> <code class="block"> @@ -1129,15 +1129,15 @@ <code class="block"> set-mode edit </code> - </div> - - - An error occurred while attempting to restart the application. - - - Application Restarted - - + </div> + + + An error occurred while attempting to restart the application. + + + Application Restarted + + <h4>Copy a Module from One Page to Another</h4> <p>This command makes a copy of the module with Module ID 358 on the Page with Page ID of 71 and places that copy on the page with a Page ID of 75</p> <code class="block">copy-module 358 --pageid 71 --topageid 75</code> @@ -1182,22 +1182,34 @@ <tr> <td colspan="3">Successfully copied the module.</td> </tr> - </table> - - - <h4></h4> - - - <h4></h4> - - - <h4></h4> - - + </table> + + + <h4></h4> + + + <h4></h4> + + + <h4></h4> + + <h4>Results</h4> <table class="command-result-tbl"> <tr><td>Application restarted</td></tr> <tr><td>Reloading in 3 seconds</td></tr> - </table> - + </table> + + + <em> { Factory Method } </em> + + + <em> { Specific Instance } </em> + + + <em> { None } </em> + + + You do not have authorization to access this functionality. + \ No newline at end of file From a0efa457e5ea614399e05e2b38ad92f72d9a8d4f Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 27 Jul 2020 18:50:07 -0500 Subject: [PATCH 28/45] Use Ordinal comparison for Boolean check (#3938) This is an improvement to #3903 --- DNN Platform/Library/Entities/Tabs/TabInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DNN Platform/Library/Entities/Tabs/TabInfo.cs b/DNN Platform/Library/Entities/Tabs/TabInfo.cs index 93f87a5dca6..deaf100a8e6 100644 --- a/DNN Platform/Library/Entities/Tabs/TabInfo.cs +++ b/DNN Platform/Library/Entities/Tabs/TabInfo.cs @@ -121,7 +121,7 @@ public bool AllowIndex get { return this.TabSettings["AllowIndex"] == null - || "true".Equals(this.TabSettings["AllowIndex"].ToString(), StringComparison.CurrentCultureIgnoreCase); + || "true".Equals(this.TabSettings["AllowIndex"].ToString(), StringComparison.OrdinalIgnoreCase); } } From 89585f9769a984b8fd8569e64c350ca92c871646 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 27 Jul 2020 19:42:29 -0500 Subject: [PATCH 29/45] Deprecate TabInfo.TabPermissionsSpecified --- DNN Platform/Library/Entities/Tabs/TabInfo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/DNN Platform/Library/Entities/Tabs/TabInfo.cs b/DNN Platform/Library/Entities/Tabs/TabInfo.cs index deaf100a8e6..0077c0d795e 100644 --- a/DNN Platform/Library/Entities/Tabs/TabInfo.cs +++ b/DNN Platform/Library/Entities/Tabs/TabInfo.cs @@ -370,6 +370,7 @@ public string FullUrl } } + [Obsolete("Deprecated in DNN 9.7.0, as this provides no use and always returns false. Scheduled removal in v11.0.0.")] [XmlIgnore] public bool TabPermissionsSpecified { From abee49b0074d0fbaf608eb83f50dccd7c57f42a7 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 27 Jul 2020 19:28:38 -0500 Subject: [PATCH 30/45] Address StyleCop warnings for TabInfo --- DNN Platform/Library/Entities/Tabs/TabInfo.cs | 259 +++++++++++------- 1 file changed, 167 insertions(+), 92 deletions(-) diff --git a/DNN Platform/Library/Entities/Tabs/TabInfo.cs b/DNN Platform/Library/Entities/Tabs/TabInfo.cs index 0077c0d795e..9c8d9bf3931 100644 --- a/DNN Platform/Library/Entities/Tabs/TabInfo.cs +++ b/DNN Platform/Library/Entities/Tabs/TabInfo.cs @@ -21,7 +21,6 @@ namespace DotNetNuke.Entities.Tabs using DotNetNuke.Common.Internal; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Content; - using DotNetNuke.Entities.Content.Taxonomy; using DotNetNuke.Entities.Modules; using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Tabs.TabVersions; @@ -32,33 +31,35 @@ namespace DotNetNuke.Entities.Tabs using DotNetNuke.Services.Localization; using DotNetNuke.Services.Tokens; + /// Information about a page within a DNN site. + /// + /// [XmlRoot("tab", IsNullable = false)] [Serializable] public class TabInfo : ContentItem, IPropertyAccess { private static readonly Regex SkinSrcRegex = new Regex(@"([^/]+$)", RegexOptions.CultureInvariant); - private static Dictionary _docTypeCache = new Dictionary(); - private static ReaderWriterLockSlim _docTypeCacheLock = new ReaderWriterLockSlim(); - private readonly SharedDictionary _localizedTabNameDictionary; - private readonly SharedDictionary _fullUrlDictionary; - - private string _administratorRoles; - private string _authorizedRoles; - private TabInfo _defaultLanguageTab; - private bool _isSuperTab; - private Dictionary _localizedTabs; - private TabPermissionCollection _permissions; - private Hashtable _settings; - private string _skinDoctype; - private bool _superTabIdSet = Null.NullBoolean; - private string _iconFile; - private string _iconFileLarge; - - private List _aliasSkins; - private Dictionary _customAliases; - private List _tabUrls; - private ArrayList _modules; - + private static Dictionary docTypeCache = new Dictionary(); + private static ReaderWriterLockSlim docTypeCacheLock = new ReaderWriterLockSlim(); + private readonly SharedDictionary localizedTabNameDictionary; + private readonly SharedDictionary fullUrlDictionary; + + private TabInfo defaultLanguageTab; + private bool isSuperTab; + private Dictionary localizedTabs; + private TabPermissionCollection permissions; + private Hashtable settings; + private string skinDoctype; + private bool superTabIdSet = Null.NullBoolean; + private string iconFile; + private string iconFileLarge; + + private List aliasSkins; + private Dictionary customAliases; + private List tabUrls; + private ArrayList modules; + + /// Initializes a new instance of the class. public TabInfo() : this(new SharedDictionary(), new SharedDictionary()) { @@ -66,21 +67,19 @@ public TabInfo() private TabInfo(SharedDictionary localizedTabNameDictionary, SharedDictionary fullUrlDictionary) { - this._localizedTabNameDictionary = localizedTabNameDictionary; - this._fullUrlDictionary = fullUrlDictionary; + this.localizedTabNameDictionary = localizedTabNameDictionary; + this.fullUrlDictionary = fullUrlDictionary; this.PortalID = Null.NullInteger; - this._authorizedRoles = Null.NullString; this.ParentId = Null.NullInteger; this.IconFile = Null.NullString; this.IconFileLarge = Null.NullString; - this._administratorRoles = Null.NullString; this.Title = Null.NullString; this.Description = Null.NullString; this.KeyWords = Null.NullString; this.Url = Null.NullString; this.SkinSrc = Null.NullString; - this._skinDoctype = Null.NullString; + this.skinDoctype = Null.NullString; this.ContainerSrc = Null.NullString; this.TabPath = Null.NullString; this.StartDate = Null.NullDate; @@ -106,6 +105,7 @@ private TabInfo(SharedDictionary localizedTabNameDictionary, Sha this.IsSystem = false; } + /// Gets a value indicating whether this page has a version that is visible to the current user. [XmlIgnore] public bool HasAVisibleVersion { @@ -115,16 +115,19 @@ public bool HasAVisibleVersion } } + /// Gets a value indicating whether DNN's search index should include this page. [XmlIgnore] public bool AllowIndex { get { - return this.TabSettings["AllowIndex"] == null + return this.TabSettings["AllowIndex"] == null || "true".Equals(this.TabSettings["AllowIndex"].ToString(), StringComparison.OrdinalIgnoreCase); } } + /// Gets the modules on this page. + /// A mapping between Module ID and . [XmlIgnore] public Dictionary ChildModules { @@ -134,20 +137,23 @@ public Dictionary ChildModules } } + /// Gets info for the default language version of this page, if it exists. + /// A instance, or null. [XmlIgnore] public TabInfo DefaultLanguageTab { get { - if (this._defaultLanguageTab == null && (!this.DefaultLanguageGuid.Equals(Null.NullGuid))) + if (this.defaultLanguageTab == null && (!this.DefaultLanguageGuid.Equals(Null.NullGuid))) { - this._defaultLanguageTab = (from kvp in TabController.Instance.GetTabsByPortal(this.PortalID) where kvp.Value.UniqueId == this.DefaultLanguageGuid select kvp.Value).SingleOrDefault(); + this.defaultLanguageTab = (from kvp in TabController.Instance.GetTabsByPortal(this.PortalID) where kvp.Value.UniqueId == this.DefaultLanguageGuid select kvp.Value).SingleOrDefault(); } - return this._defaultLanguageTab; + return this.defaultLanguageTab; } } + /// Gets a value indicating whether this page is configured not to redirect. [XmlIgnore] public bool DoNotRedirect { @@ -167,6 +173,7 @@ public bool DoNotRedirect } } + /// Gets the indented name of this page (i.e. with "..." at the beginning based on the page's ). [XmlIgnore] public string IndentedTabName { @@ -183,6 +190,7 @@ public string IndentedTabName } } + /// Gets a value indicating whether this page is the default language version. [XmlIgnore] public bool IsDefaultLanguage { @@ -192,6 +200,7 @@ public bool IsDefaultLanguage } } + /// Gets a value indicating whether this page is not for any specific culture/language. [XmlIgnore] public bool IsNeutralCulture { @@ -201,6 +210,7 @@ public bool IsNeutralCulture } } + /// Gets a value indicating whether this page is translated. [XmlIgnore] public bool IsTranslated { @@ -217,6 +227,7 @@ public bool IsTranslated } } + /// Gets the name of the page for the current culture. [XmlIgnore] public string LocalizedTabName { @@ -229,14 +240,14 @@ public string LocalizedTabName var key = Thread.CurrentThread.CurrentUICulture.ToString(); string localizedTabName; - using (this._localizedTabNameDictionary.GetReadLock()) + using (this.localizedTabNameDictionary.GetReadLock()) { - this._localizedTabNameDictionary.TryGetValue(key, out localizedTabName); + this.localizedTabNameDictionary.TryGetValue(key, out localizedTabName); } if (string.IsNullOrEmpty(localizedTabName)) { - using (this._localizedTabNameDictionary.GetWriteLock()) + using (this.localizedTabNameDictionary.GetWriteLock()) { localizedTabName = Localization.GetString(this.TabPath + ".String", Localization.GlobalResourceFile, true); if (string.IsNullOrEmpty(localizedTabName)) @@ -244,9 +255,9 @@ public string LocalizedTabName localizedTabName = this.TabName; } - if (!this._localizedTabNameDictionary.ContainsKey(key)) + if (!this.localizedTabNameDictionary.ContainsKey(key)) { - this._localizedTabNameDictionary.Add(key, localizedTabName.Trim()); + this.localizedTabNameDictionary.Add(key, localizedTabName.Trim()); } } } @@ -255,42 +266,48 @@ public string LocalizedTabName } } + /// Gets a collection of pages that are localized children of this page. + /// A mapping from to . [XmlIgnore] public Dictionary LocalizedTabs { get { - if (this._localizedTabs == null) + if (this.localizedTabs == null) { - this._localizedTabs = + this.localizedTabs = (from kvp in TabController.Instance.GetTabsByPortal(this.PortalID) where kvp.Value.DefaultLanguageGuid == this.UniqueId && LocaleController.Instance.GetLocale(this.PortalID, kvp.Value.CultureCode) != null select kvp.Value).ToDictionary(t => t.CultureCode); } - return this._localizedTabs; + return this.localizedTabs; } } + /// Gets the permissions collection for the page. [XmlArray("tabpermissions")] [XmlArrayItem("permission")] public TabPermissionCollection TabPermissions { get { - return this._permissions ?? (this._permissions = new TabPermissionCollection(TabPermissionController.GetTabPermissions(this.TabID, this.PortalID))); + return this.permissions ?? (this.permissions = new TabPermissionCollection(TabPermissionController.GetTabPermissions(this.TabID, this.PortalID))); } } + /// Gets the settings collection for the page. [XmlIgnore] public Hashtable TabSettings { get { - return this._settings ?? (this._settings = (this.TabID == Null.NullInteger) ? new Hashtable() : TabController.Instance.GetTabSettings(this.TabID)); + return this.settings ?? (this.settings = (this.TabID == Null.NullInteger) ? new Hashtable() : TabController.Instance.GetTabSettings(this.TabID)); } } + /// Gets the for the page. + /// [XmlIgnore] public TabType TabType { @@ -300,41 +317,45 @@ public TabType TabType } } + /// Gets a collection of for this page. [XmlIgnore] public List AliasSkins { get { - return this._aliasSkins ?? (this._aliasSkins = (this.TabID == Null.NullInteger) ? new List() : TabController.Instance.GetAliasSkins(this.TabID, this.PortalID)); + return this.aliasSkins ?? (this.aliasSkins = (this.TabID == Null.NullInteger) ? new List() : TabController.Instance.GetAliasSkins(this.TabID, this.PortalID)); } } + /// Gets a collection of custom aliases for this page. + /// A mapping from to HTTP Alias. [XmlIgnore] public Dictionary CustomAliases { get { - return this._customAliases ?? (this._customAliases = (this.TabID == Null.NullInteger) ? new Dictionary() : TabController.Instance.GetCustomAliases(this.TabID, this.PortalID)); + return this.customAliases ?? (this.customAliases = (this.TabID == Null.NullInteger) ? new Dictionary() : TabController.Instance.GetCustomAliases(this.TabID, this.PortalID)); } } + /// Gets the full URL for this page. [XmlIgnore] public string FullUrl { get { - var key = string.Format("{0}_{1}", TestableGlobals.Instance.AddHTTP(PortalSettings.Current.PortalAlias.HTTPAlias), - Thread.CurrentThread.CurrentCulture); + var key = + $"{TestableGlobals.Instance.AddHTTP(PortalSettings.Current.PortalAlias.HTTPAlias)}_{Thread.CurrentThread.CurrentCulture}"; string fullUrl; - using (this._fullUrlDictionary.GetReadLock()) + using (this.fullUrlDictionary.GetReadLock()) { - this._fullUrlDictionary.TryGetValue(key, out fullUrl); + this.fullUrlDictionary.TryGetValue(key, out fullUrl); } if (string.IsNullOrEmpty(fullUrl)) { - using (this._fullUrlDictionary.GetWriteLock()) + using (this.fullUrlDictionary.GetWriteLock()) { switch (this.TabType) { @@ -356,11 +377,11 @@ public string FullUrl break; } - if (!this._fullUrlDictionary.ContainsKey(key)) + if (!this.fullUrlDictionary.ContainsKey(key)) { if (fullUrl != null) { - this._fullUrlDictionary.Add(key, fullUrl.Trim()); + this.fullUrlDictionary.Add(key, fullUrl.Trim()); } } } @@ -370,6 +391,7 @@ public string FullUrl } } + /// Gets a value indicating whether the tab permissions are specified. [Obsolete("Deprecated in DNN 9.7.0, as this provides no use and always returns false. Scheduled removal in v11.0.0.")] [XmlIgnore] public bool TabPermissionsSpecified @@ -377,15 +399,17 @@ public bool TabPermissionsSpecified get { return false; } } + /// Gets a collection of page-specific URLs. [XmlIgnore] public List TabUrls { get { - return this._tabUrls ?? (this._tabUrls = (this.TabID == Null.NullInteger) ? new List() : TabController.Instance.GetTabUrls(this.TabID, this.PortalID)); + return this.tabUrls ?? (this.tabUrls = (this.TabID == Null.NullInteger) ? new List() : TabController.Instance.GetTabUrls(this.TabID, this.PortalID)); } } + /// public CacheLevel Cacheability { get @@ -394,165 +418,208 @@ public CacheLevel Cacheability } } + /// Gets or sets the collection of bread crumb pages (i.e. the parent, grandparent, etc. of this page). + /// An with instances. [XmlIgnore] public ArrayList BreadCrumbs { get; set; } + /// Gets or sets the path to the directory with . [XmlIgnore] public string ContainerPath { get; set; } + /// Gets or sets the path to the default container for this page, if there is one. [XmlElement("containersrc")] public string ContainerSrc { get; set; } + /// Gets or sets the culture code for this page, if there is one. [XmlElement("cultureCode")] public string CultureCode { get; set; } + /// Gets or sets the for the default language version of this page. [XmlElement("defaultLanguageGuid")] public Guid DefaultLanguageGuid { get; set; } + /// Gets or sets the page description. [XmlElement("description")] public string Description { get; set; } + /// Gets or sets a value indicating whether the link to this page should be rendered as disabled. [XmlElement("disabled")] public bool DisableLink { get; set; } + /// Gets or sets this page's end date. [XmlElement("enddate")] public DateTime EndDate { get; set; } + /// Gets or sets a value indicating whether this instance has children. [XmlElement("haschildren")] public bool HasChildren { get; set; } + /// Gets the icon file URL, as it is stored in the database. [XmlIgnore] public string IconFileRaw { get; private set; } + /// Gets the large icon file URL, as it is stored in the database. [XmlIgnore] public string IconFileLargeRaw { get; private set; } + /// Gets or sets a value indicating whether this page is deleted. [XmlElement("isdeleted")] public bool IsDeleted { get; set; } + /// Gets or sets a value indicating whether this page requires HTTPS. [XmlElement("issecure")] public bool IsSecure { get; set; } + /// Gets or sets a value indicating whether this page should be visible in the menu. [XmlElement("visible")] public bool IsVisible { get; set; } + /// Gets or sets a value indicating whether this page is required by DNN. [XmlElement("issystem")] public bool IsSystem { get; set; } + /// Gets or sets a value indicating whether this page has been published. [XmlIgnore] public bool HasBeenPublished { get; set; } + /// Gets or sets the meta keywords for the page. [XmlElement("keywords")] public string KeyWords { get; set; } + /// Gets or sets the level of the page, i.e. how may ancestors (parent, grandparent, etc.) it has. [XmlIgnore] public int Level { get; set; } + /// Gets or sets the for the localized version. [XmlElement("localizedVersionGuid")] public Guid LocalizedVersionGuid { get; set; } + /// Gets or sets a collection of the modules on this page. + /// An of . [XmlIgnore] public ArrayList Modules { get { - return this._modules ?? (this._modules = TabModulesController.Instance.GetTabModules(this)); + return this.modules ?? (this.modules = TabModulesController.Instance.GetTabModules(this)); } set { - this._modules = value; + this.modules = value; } } + /// Gets or sets the page head text, i.e. content to render in the <head> of the page. [XmlElement("pageheadtext")] public string PageHeadText { get; set; } + /// Gets a list of the names of the panes available to the page. + /// An of values with the IDs of the panes on the page. [XmlIgnore] public ArrayList Panes { get; private set; } + /// Gets or sets the ID of this page's parent page (or if it has no parent). [XmlElement("parentid")] public int ParentId { get; set; } + /// Gets or sets a value indicating whether the redirect configured for this page should be a permanent redirect. [XmlElement("permanentredirect")] public bool PermanentRedirect { get; set; } + /// Gets or sets the ID of the portal/site this page belongs to. [XmlElement("portalid")] public int PortalID { get; set; } + /// Gets or sets the number of seconds after which the page should refresh. + /// If this value is greater than zero, it is set as the content of the <meta http-equiv="refresh"> tag, which instructs the browser to refresh the page. [XmlElement("refreshinterval")] public int RefreshInterval { get; set; } + /// Gets or sets the priority of this page in the search engine site map, a value between 0.0 and 1.0, indicating the relative priority of the page compared to other pages on the site. [XmlElement("sitemappriority")] public float SiteMapPriority { get; set; } + /// Gets or sets the path to the directory with . [XmlIgnore] public string SkinPath { get; set; } + /// Gets or sets the path to the skin control for this page. [XmlElement("skinsrc")] public string SkinSrc { get; set; } + /// Gets or sets the page's start date. [XmlElement("startdate")] public DateTime StartDate { get; set; } + /// Gets or sets the name of the page. [XmlElement("name")] public string TabName { get; set; } + /// Gets or sets the relative order of this page in relation to its siblings. [XmlElement("taborder")] public int TabOrder { get; set; } + /// Gets or sets the tab path, an identifier in the format "//PageOne//MyParentPage//ThisPage". [XmlElement("tabpath")] public string TabPath { get; set; } + /// Gets or sets the HTML title to be rendered for this page. [XmlElement("title")] public string Title { get; set; } + /// Gets or sets the unique ID identifying this page. [XmlElement("uniqueid")] public Guid UniqueId { get; set; } + /// Gets or sets the identifying this version of the page. [XmlElement("versionguid")] public Guid VersionGuid { get; set; } + /// Gets or sets the path to the icon. [XmlElement("iconfile")] public string IconFile { get { - this.IconFileGetter(ref this._iconFile, this.IconFileRaw); - return this._iconFile; + this.IconFileGetter(ref this.iconFile, this.IconFileRaw); + return this.iconFile; } set { this.IconFileRaw = value; - this._iconFile = null; + this.iconFile = null; } } + /// Gets or sets the path to the large icon. [XmlElement("iconfilelarge")] public string IconFileLarge { get { - this.IconFileGetter(ref this._iconFileLarge, this.IconFileLargeRaw); - return this._iconFileLarge; + this.IconFileGetter(ref this.iconFileLarge, this.IconFileLargeRaw); + return this.iconFileLarge; } set { this.IconFileLargeRaw = value; - this._iconFileLarge = null; + this.iconFileLarge = null; } } + /// Gets or sets a value indicating whether this page is a host level page that doesn't belong to any portal. [XmlIgnore] public bool IsSuperTab { get { - if (this._superTabIdSet) + if (this.superTabIdSet) { - return this._isSuperTab; + return this.isSuperTab; } return this.PortalID == Null.NullInteger; @@ -560,11 +627,12 @@ public bool IsSuperTab set { - this._isSuperTab = value; - this._superTabIdSet = true; + this.isSuperTab = value; + this.superTabIdSet = true; } } + /// [XmlIgnore] public override int KeyID { @@ -579,35 +647,39 @@ public override int KeyID } } + /// Gets or sets the doctype statement to be used when rendering this page. [XmlElement("skindoctype")] public string SkinDoctype { get { - if (string.IsNullOrEmpty(this.SkinSrc) == false && string.IsNullOrEmpty(this._skinDoctype)) + if (string.IsNullOrEmpty(this.SkinSrc) == false && string.IsNullOrEmpty(this.skinDoctype)) { - this._skinDoctype = this.CheckIfDoctypeConfigExists(); - if (string.IsNullOrEmpty(this._skinDoctype)) + this.skinDoctype = this.CheckIfDoctypeConfigExists(); + if (string.IsNullOrEmpty(this.skinDoctype)) { - this._skinDoctype = Host.Host.DefaultDocType; + this.skinDoctype = Host.Host.DefaultDocType; } } - return this._skinDoctype; + return this.skinDoctype; } set { - this._skinDoctype = value; + this.skinDoctype = value; } } + /// Gets or sets the URL for this page if it is a redirect. [XmlElement("url")] public string Url { get; set; } + /// Gets or sets a value indicating whether this page uses friendly URLs. [XmlIgnore] public bool UseBaseFriendlyUrls { get; set; } + /// public string GetProperty(string propertyName, string format, CultureInfo formatProvider, UserInfo accessingUser, Scope currentScope, ref bool propertyNotFound) { string outputFormat = string.Empty; @@ -773,9 +845,11 @@ public string GetProperty(string propertyName, string format, CultureInfo format return result; } + /// Clones this instance. + /// A new instance. public TabInfo Clone() { - var clonedTab = new TabInfo(this._localizedTabNameDictionary, this._fullUrlDictionary) + var clonedTab = new TabInfo(this.localizedTabNameDictionary, this.fullUrlDictionary) { TabID = this.TabID, TabOrder = this.TabOrder, @@ -828,20 +902,15 @@ public TabInfo Clone() clonedTab.CultureCode = this.CultureCode; clonedTab.Panes = new ArrayList(); - clonedTab.Modules = this._modules; + clonedTab.Modules = this.modules; return clonedTab; } - /// ----------------------------------------------------------------------------- - /// - /// Fills a TabInfo from a Data Reader. - /// - /// The Data Reader to use. - /// ----------------------------------------------------------------------------- + /// public override void Fill(IDataReader dr) { - // Call the base classes fill method to populate base class proeprties + // Call the base classes fill method to populate base class properties this.FillInternal(dr); this.UniqueId = Null.SetNullGuid(dr["UniqueId"]); this.VersionGuid = Null.SetNullGuid(dr["VersionGuid"]); @@ -880,12 +949,15 @@ public override void Fill(IDataReader dr) this.IsSystem = Null.SetNullBoolean(dr["IsSystem"]); } + /// Gets the URL for the given . + /// The culture code. + /// The URL or . public string GetCurrentUrl(string cultureCode) { string url = null; - if (this._tabUrls != null && this._tabUrls.Count > 0) + if (this.tabUrls != null && this.tabUrls.Count > 0) { - TabUrlInfo tabUrl = this._tabUrls.CurrentUrl(cultureCode); + TabUrlInfo tabUrl = this.tabUrls.CurrentUrl(cultureCode); if (tabUrl != null) { url = tabUrl.Url; @@ -895,27 +967,30 @@ public string GetCurrentUrl(string cultureCode) return url ?? string.Empty; } + /// Gets the tag names as a comma-delimited . + /// A comma-delimited . public string GetTags() { return string.Join(",", this.Terms.Select(t => t.Name)); } + /// Clears the tab URLs collection. internal void ClearTabUrls() { - this._tabUrls = null; + this.tabUrls = null; } + /// Clears the settings collection. internal void ClearSettingsCache() { - this._settings = null; + this.settings = null; } /// /// Look for skin level doctype configuration file, and inject the value into the top of default.aspx /// when no configuration if found, the doctype for versions prior to 4.4 is used to maintain backwards compatibility with existing skins. - /// Adds xmlns and lang parameters when appropiate. + /// Adds xmlns and lang parameters when appropriate. /// - /// private string CheckIfDoctypeConfigExists() { if (string.IsNullOrEmpty(this.SkinSrc)) @@ -925,14 +1000,14 @@ private string CheckIfDoctypeConfigExists() // loading an XML document from disk for each page request is expensive // let's implement some local caching - if (!_docTypeCache.ContainsKey(this.SkinSrc)) + if (!docTypeCache.ContainsKey(this.SkinSrc)) { // appply lock after IF, locking is more expensive than worst case scenario (check disk twice) - _docTypeCacheLock.EnterWriteLock(); + docTypeCacheLock.EnterWriteLock(); try { var docType = this.LoadDocType(); - _docTypeCache[this.SkinSrc] = docType == null ? string.Empty : docType.FirstChild.InnerText; + docTypeCache[this.SkinSrc] = docType == null ? string.Empty : docType.FirstChild.InnerText; } catch (Exception ex) { @@ -940,19 +1015,19 @@ private string CheckIfDoctypeConfigExists() } finally { - _docTypeCacheLock.ExitWriteLock(); + docTypeCacheLock.ExitWriteLock(); } } // return if file exists from cache - _docTypeCacheLock.EnterReadLock(); + docTypeCacheLock.EnterReadLock(); try { - return _docTypeCache[this.SkinSrc]; + return docTypeCache[this.SkinSrc]; } finally { - _docTypeCacheLock.ExitReadLock(); + docTypeCacheLock.ExitReadLock(); } } From c3ed9844fae20ba1f1e846662b146ab2f72cb883 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 27 Jul 2020 19:34:40 -0500 Subject: [PATCH 31/45] Address StyleCop warnings for TabIndexer --- .../Library/Services/Search/TabIndexer.cs | 32 ++++--------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/DNN Platform/Library/Services/Search/TabIndexer.cs b/DNN Platform/Library/Services/Search/TabIndexer.cs index c3de7d28167..6a353a9459e 100644 --- a/DNN Platform/Library/Services/Search/TabIndexer.cs +++ b/DNN Platform/Library/Services/Search/TabIndexer.cs @@ -14,33 +14,15 @@ namespace DotNetNuke.Services.Search using DotNetNuke.Services.Search.Entities; using DotNetNuke.Services.Search.Internals; - /// ----------------------------------------------------------------------------- - /// Namespace: DotNetNuke.Services.Search - /// Project: DotNetNuke.Search.Index - /// Class: TabIndexer - /// ----------------------------------------------------------------------------- - /// - /// The TabIndexer is an implementation of the abstract IndexingProvider - /// class. - /// - /// - /// - /// ----------------------------------------------------------------------------- + /// An implementation of for pages. public class TabIndexer : IndexingProviderBase { private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(TabIndexer)); private static readonly int TabSearchTypeId = SearchHelper.Instance.GetSearchTypeByName("tab").SearchTypeId; - /// ----------------------------------------------------------------------------- - /// - /// Returns the number of SearchDocuments indexed with Tab MetaData for the given portal. - /// - /// This replaces "GetSearchIndexItems" as a newer implementation of search. - /// - /// ----------------------------------------------------------------------------- - public override int IndexSearchDocuments( - int portalId, - ScheduleHistoryItem schedule, DateTime startDateLocal, Action> indexer) + /// Converts applicable pages into instances before passing them to the . + /// + public override int IndexSearchDocuments(int portalId, ScheduleHistoryItem schedule, DateTime startDateLocal, Action> indexer) { Requires.NotNull("indexer", indexer); const int saveThreshold = 1024; @@ -49,7 +31,7 @@ public override int IndexSearchDocuments( var searchDocuments = new List(); var tabs = ( from t in TabController.Instance.GetTabsByPortal(portalId).AsList() - where t.LastModifiedOnDate > startDateLocal && (t.AllowIndex) + where t.LastModifiedOnDate > startDateLocal && t.AllowIndex select t).OrderBy(t => t.LastModifiedOnDate).ThenBy(t => t.TabID).ToArray(); if (tabs.Any()) @@ -114,9 +96,7 @@ private static SearchDocument GetTabSearchDocument(TabInfo tab) return searchDoc; } - private int IndexCollectedDocs( - Action> indexer, - ICollection searchDocuments, int portalId, int scheduleId) + private int IndexCollectedDocs(Action> indexer, ICollection searchDocuments, int portalId, int scheduleId) { indexer.Invoke(searchDocuments); var total = searchDocuments.Count; From ba5145d0ca2f66429d18ff1c41cd937ff99da468 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Jul 2020 15:42:24 +0000 Subject: [PATCH 32/45] Updates versions as per release candidate creation --- .github/ISSUE_TEMPLATE/bug-report.md | 1 + Build/Symbols/DotNetNuke_Symbols.dnn | 2 +- .../Admin Modules/Dnn.Modules.Console/dnn_Console.dnn | 2 +- .../Dnn.Modules.ModuleCreator/dnn_ModuleCreator.dnn | 2 +- DNN Platform/Components/Telerik/DotNetNuke.Telerik.Web.dnn | 2 +- DNN Platform/Connectors/Azure/AzureConnector.dnn | 2 +- .../Connectors/GoogleAnalytics/GoogleAnalyticsConnector.dnn | 2 +- DNN Platform/Dnn.AuthServices.Jwt/Dnn.Jwt.dnn | 2 +- .../DotNetNuke.Web.Deprecated/dnn_Web_Deprecated.dnn | 2 +- DNN Platform/DotNetNuke.WebUtility/DotNetNuke.ClientAPI.dnn | 2 +- .../dnn_Website_Deprecated.dnn | 2 +- DNN Platform/Modules/CoreMessaging/CoreMessaging.dnn | 2 +- DNN Platform/Modules/DDRMenu/DDRMenu.dnn | 2 +- DNN Platform/Modules/DigitalAssets/dnn_DigitalAssets.dnn | 2 +- .../Modules/DnnExportImport/dnn_SiteExportImport.dnn | 2 +- DNN Platform/Modules/Groups/SocialGroups.dnn | 2 +- DNN Platform/Modules/HTML/dnn_HTML.dnn | 2 +- .../Modules/HtmlEditorManager/dnn_HtmlEditorManager.dnn | 2 +- DNN Platform/Modules/Journal/Journal.dnn | 2 +- DNN Platform/Modules/MemberDirectory/MemberDirectory.dnn | 2 +- DNN Platform/Modules/RazorHost/Manifest.dnn | 2 +- DNN Platform/Modules/RazorHost/RazorHost.dnn | 2 +- .../DotNetNuke.Authentication.Facebook/Facebook_Auth.dnn | 2 +- .../DotNetNuke.Authentication.Google/Google_Auth.dnn | 2 +- .../DotNetNuke.Authentication.LiveConnect/Live_Auth.dnn | 2 +- .../DotNetNuke.Authentication.Twitter/Twitter_Auth.dnn | 2 +- .../SimpleWebFarmCachingProvider.dnn | 2 +- .../Provider.AspNetCCP/AspNetClientCapabilityProvider.dnn | 2 +- DNN Platform/Providers/FolderProviders/FolderProviders.dnn | 2 +- DNN Platform/Skins/Xcillion/DNN_Skin_Xcillion.dnn | 4 ++-- Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Bundle.Web/package.json | 4 ++-- .../ClientSide/Dnn.React.Common/package.json | 2 +- Dnn.AdminExperience/ClientSide/Extensions.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Licensing.Web/package.json | 6 +++--- Dnn.AdminExperience/ClientSide/Pages.Web/package.json | 6 +++--- Dnn.AdminExperience/ClientSide/Prompt.Web/package.json | 6 +++--- Dnn.AdminExperience/ClientSide/Roles.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Security.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Seo.Web/package.json | 6 +++--- Dnn.AdminExperience/ClientSide/Servers.Web/package.json | 6 +++--- Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json | 4 ++-- .../ClientSide/SiteImportExport.Web/package.json | 4 ++-- .../ClientSide/SiteSettings.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Sites.Web/package.json | 4 ++-- .../ClientSide/Sites.Web/src/_exportables/package.json | 4 ++-- .../ClientSide/TaskScheduler.Web/package.json | 6 +++--- Dnn.AdminExperience/ClientSide/Themes.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Users.Web/package.json | 4 ++-- .../ClientSide/Users.Web/src/_exportables/package.json | 4 ++-- .../ClientSide/Vocabularies.Web/package.json | 6 +++--- .../Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn | 2 +- .../EditBar/Dnn.EditBar.UI/Dnn.EditBar.UI.dnn | 2 +- .../Library/Dnn.PersonaBar.UI/Dnn.PersonaBar.UI.dnn | 2 +- SolutionInfo.cs | 6 +++--- package.json | 2 +- 56 files changed, 86 insertions(+), 85 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 9753d57f710..72dbcfd66f6 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -41,6 +41,7 @@ Provide any additional context that may be helpful in understanding and/or resol Please add X in at least one of the boxes as appropriate. In order for an issue to be accepted, a developer needs to be able to reproduce the issue on a currently supported version. If you are looking for a workaround for an issue with an older version, please visit the forums at https://dnncommunity.org/forums --> * [ ] 10.00.00 alpha build +* [ ] 09.07.00 release candidate * [ ] 09.06.02 release candidate * [ ] 09.06.01 latest supported release diff --git a/Build/Symbols/DotNetNuke_Symbols.dnn b/Build/Symbols/DotNetNuke_Symbols.dnn index c6c00c53d15..ffe8163fb1c 100644 --- a/Build/Symbols/DotNetNuke_Symbols.dnn +++ b/Build/Symbols/DotNetNuke_Symbols.dnn @@ -1,6 +1,6 @@  - + DNN Platform Symbols This package contains Debug Symbols and Intellisense files for DNN Platform. diff --git a/DNN Platform/Admin Modules/Dnn.Modules.Console/dnn_Console.dnn b/DNN Platform/Admin Modules/Dnn.Modules.Console/dnn_Console.dnn index 99577e83cf8..b175261e312 100644 --- a/DNN Platform/Admin Modules/Dnn.Modules.Console/dnn_Console.dnn +++ b/DNN Platform/Admin Modules/Dnn.Modules.Console/dnn_Console.dnn @@ -1,6 +1,6 @@  - + Console Display children pages as icon links for navigation. ~/DesktopModules/Admin/Console/console.png diff --git a/DNN Platform/Admin Modules/Dnn.Modules.ModuleCreator/dnn_ModuleCreator.dnn b/DNN Platform/Admin Modules/Dnn.Modules.ModuleCreator/dnn_ModuleCreator.dnn index a7755aa270e..a0c074d43b0 100644 --- a/DNN Platform/Admin Modules/Dnn.Modules.ModuleCreator/dnn_ModuleCreator.dnn +++ b/DNN Platform/Admin Modules/Dnn.Modules.ModuleCreator/dnn_ModuleCreator.dnn @@ -1,6 +1,6 @@  - + Module Creator Development of modules. ~/Icons/Sigma/ModuleCreator_32x32.png diff --git a/DNN Platform/Components/Telerik/DotNetNuke.Telerik.Web.dnn b/DNN Platform/Components/Telerik/DotNetNuke.Telerik.Web.dnn index ac02fd38936..ed89989b7ca 100644 --- a/DNN Platform/Components/Telerik/DotNetNuke.Telerik.Web.dnn +++ b/DNN Platform/Components/Telerik/DotNetNuke.Telerik.Web.dnn @@ -1,6 +1,6 @@ - + DotNetNuke Telerik Web Components Provides Telerik Components for DotNetNuke. diff --git a/DNN Platform/Connectors/Azure/AzureConnector.dnn b/DNN Platform/Connectors/Azure/AzureConnector.dnn index b7cbca02a11..29cacb6b28d 100644 --- a/DNN Platform/Connectors/Azure/AzureConnector.dnn +++ b/DNN Platform/Connectors/Azure/AzureConnector.dnn @@ -1,6 +1,6 @@  - + Dnn Azure Connector The Azure Connector allows you to integrate Azure as your commenting solution with the Publisher module. ~/DesktopModules/Connectors/Azure/Images/icon-azure-32px.png diff --git a/DNN Platform/Connectors/GoogleAnalytics/GoogleAnalyticsConnector.dnn b/DNN Platform/Connectors/GoogleAnalytics/GoogleAnalyticsConnector.dnn index c9468bdb211..406821d1f05 100644 --- a/DNN Platform/Connectors/GoogleAnalytics/GoogleAnalyticsConnector.dnn +++ b/DNN Platform/Connectors/GoogleAnalytics/GoogleAnalyticsConnector.dnn @@ -1,6 +1,6 @@ - + Google Analytics Connector Configure your sites Google Analytics settings. ~/DesktopModules/Connectors/GoogleAnalytics/Images/GoogleAnalytics_32X32_Standard.png diff --git a/DNN Platform/Dnn.AuthServices.Jwt/Dnn.Jwt.dnn b/DNN Platform/Dnn.AuthServices.Jwt/Dnn.Jwt.dnn index a8adb9242c7..b193d43a327 100644 --- a/DNN Platform/Dnn.AuthServices.Jwt/Dnn.Jwt.dnn +++ b/DNN Platform/Dnn.AuthServices.Jwt/Dnn.Jwt.dnn @@ -1,6 +1,6 @@ - + DNN JWT Auth Handler DNN Json Web Token Authentication (JWT) library for cookie-less Mobile authentication clients diff --git a/DNN Platform/DotNetNuke.Web.Deprecated/dnn_Web_Deprecated.dnn b/DNN Platform/DotNetNuke.Web.Deprecated/dnn_Web_Deprecated.dnn index 67afb171489..a60c2fabe1e 100644 --- a/DNN Platform/DotNetNuke.Web.Deprecated/dnn_Web_Deprecated.dnn +++ b/DNN Platform/DotNetNuke.Web.Deprecated/dnn_Web_Deprecated.dnn @@ -1,6 +1,6 @@  - + DNN Deprecated Web Controls Library DNN Deprecated Web Controls library for legacy Telerik depepndency diff --git a/DNN Platform/DotNetNuke.WebUtility/DotNetNuke.ClientAPI.dnn b/DNN Platform/DotNetNuke.WebUtility/DotNetNuke.ClientAPI.dnn index c470f5a7a5a..efcd8e9c759 100644 --- a/DNN Platform/DotNetNuke.WebUtility/DotNetNuke.ClientAPI.dnn +++ b/DNN Platform/DotNetNuke.WebUtility/DotNetNuke.ClientAPI.dnn @@ -1,6 +1,6 @@  - + DotNetNuke ClientAPI The DotNetNuke Client API is composed of both server-side and client-side code that works together to enable a simple and reliable interface for the developer to provide a rich client-side experience. diff --git a/DNN Platform/DotNetNuke.Website.Deprecated/dnn_Website_Deprecated.dnn b/DNN Platform/DotNetNuke.Website.Deprecated/dnn_Website_Deprecated.dnn index 51c59d6aacb..25d44ec9d9f 100644 --- a/DNN Platform/DotNetNuke.Website.Deprecated/dnn_Website_Deprecated.dnn +++ b/DNN Platform/DotNetNuke.Website.Deprecated/dnn_Website_Deprecated.dnn @@ -1,6 +1,6 @@  - + DNN Deprecated Website Codebehind files DNN Deprecated Website Codebehind files for backward compability. diff --git a/DNN Platform/Modules/CoreMessaging/CoreMessaging.dnn b/DNN Platform/Modules/CoreMessaging/CoreMessaging.dnn index 690158b1800..290b9b0a819 100644 --- a/DNN Platform/Modules/CoreMessaging/CoreMessaging.dnn +++ b/DNN Platform/Modules/CoreMessaging/CoreMessaging.dnn @@ -1,6 +1,6 @@ - + Message Center Core Messaging module allows users to message each other. ~/DesktopModules/CoreMessaging/Images/messaging_32X32.png diff --git a/DNN Platform/Modules/DDRMenu/DDRMenu.dnn b/DNN Platform/Modules/DDRMenu/DDRMenu.dnn index 84814105449..7caea28a48f 100644 --- a/DNN Platform/Modules/DDRMenu/DDRMenu.dnn +++ b/DNN Platform/Modules/DDRMenu/DDRMenu.dnn @@ -1,6 +1,6 @@  - + DDR Menu DotNetNuke Navigation Provider. diff --git a/DNN Platform/Modules/DigitalAssets/dnn_DigitalAssets.dnn b/DNN Platform/Modules/DigitalAssets/dnn_DigitalAssets.dnn index 39aae4981c6..10490de7712 100644 --- a/DNN Platform/Modules/DigitalAssets/dnn_DigitalAssets.dnn +++ b/DNN Platform/Modules/DigitalAssets/dnn_DigitalAssets.dnn @@ -1,6 +1,6 @@ - + Digital Asset Management DotNetNuke Corporation Digital Asset Management module Images/Files_32x32_Standard.png diff --git a/DNN Platform/Modules/DnnExportImport/dnn_SiteExportImport.dnn b/DNN Platform/Modules/DnnExportImport/dnn_SiteExportImport.dnn index 61e587929d1..1719629dfdf 100644 --- a/DNN Platform/Modules/DnnExportImport/dnn_SiteExportImport.dnn +++ b/DNN Platform/Modules/DnnExportImport/dnn_SiteExportImport.dnn @@ -1,6 +1,6 @@ - + Site Export Import DotNetNuke Corporation Site Export Import Library Images/Files_32x32_Standard.png diff --git a/DNN Platform/Modules/Groups/SocialGroups.dnn b/DNN Platform/Modules/Groups/SocialGroups.dnn index 1e23d1bc116..7c46b8960fe 100644 --- a/DNN Platform/Modules/Groups/SocialGroups.dnn +++ b/DNN Platform/Modules/Groups/SocialGroups.dnn @@ -1,6 +1,6 @@ - + Social Groups DotNetNuke Corporation Social Groups module ~/DesktopModules/SocialGroups/Images/Social_Groups_32X32.png diff --git a/DNN Platform/Modules/HTML/dnn_HTML.dnn b/DNN Platform/Modules/HTML/dnn_HTML.dnn index c740ae5227b..680c273167b 100644 --- a/DNN Platform/Modules/HTML/dnn_HTML.dnn +++ b/DNN Platform/Modules/HTML/dnn_HTML.dnn @@ -1,6 +1,6 @@  - + HTML This module renders a block of HTML or Text content. The Html/Text module allows authorized users to edit the content either inline or in a separate administration page. Optional tokens can be used that get replaced dynamically during display. All versions of content are stored in the database including the ability to rollback to an older version. DesktopModules\HTML\Images\html.png diff --git a/DNN Platform/Modules/HtmlEditorManager/dnn_HtmlEditorManager.dnn b/DNN Platform/Modules/HtmlEditorManager/dnn_HtmlEditorManager.dnn index 812e0654aa7..bc394c57fe3 100644 --- a/DNN Platform/Modules/HtmlEditorManager/dnn_HtmlEditorManager.dnn +++ b/DNN Platform/Modules/HtmlEditorManager/dnn_HtmlEditorManager.dnn @@ -1,6 +1,6 @@  - + Html Editor Management Images/HtmlEditorManager_Standard_32x32.png A module used to configure toolbar items, behavior, and other options used in the DotNetNuke HtmlEditor Provider. diff --git a/DNN Platform/Modules/Journal/Journal.dnn b/DNN Platform/Modules/Journal/Journal.dnn index 1e02cc6a95b..a0b1edd9d82 100644 --- a/DNN Platform/Modules/Journal/Journal.dnn +++ b/DNN Platform/Modules/Journal/Journal.dnn @@ -1,6 +1,6 @@ - + Journal DotNetNuke Corporation Journal module DesktopModules/Journal/Images/journal_32X32.png diff --git a/DNN Platform/Modules/MemberDirectory/MemberDirectory.dnn b/DNN Platform/Modules/MemberDirectory/MemberDirectory.dnn index 5a7e262f5b5..f6887769201 100644 --- a/DNN Platform/Modules/MemberDirectory/MemberDirectory.dnn +++ b/DNN Platform/Modules/MemberDirectory/MemberDirectory.dnn @@ -1,6 +1,6 @@ - + Member Directory The Member Directory module displays a list of Members based on role, profile property or relationship. ~/DesktopModules/MemberDirectory/Images/member_list_32X32.png diff --git a/DNN Platform/Modules/RazorHost/Manifest.dnn b/DNN Platform/Modules/RazorHost/Manifest.dnn index cfc393afdf5..ba9bb60b52b 100644 --- a/DNN Platform/Modules/RazorHost/Manifest.dnn +++ b/DNN Platform/Modules/RazorHost/Manifest.dnn @@ -1,6 +1,6 @@  - + {0} {1} diff --git a/DNN Platform/Modules/RazorHost/RazorHost.dnn b/DNN Platform/Modules/RazorHost/RazorHost.dnn index b9c5e656927..487e17e8968 100644 --- a/DNN Platform/Modules/RazorHost/RazorHost.dnn +++ b/DNN Platform/Modules/RazorHost/RazorHost.dnn @@ -1,6 +1,6 @@  - + Razor Host The Razor Host module allows developers to host Razor Scripts. diff --git a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Facebook/Facebook_Auth.dnn b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Facebook/Facebook_Auth.dnn index c9e49383d47..77f3b08ae4b 100644 --- a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Facebook/Facebook_Auth.dnn +++ b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Facebook/Facebook_Auth.dnn @@ -1,6 +1,6 @@ - + DotNetNuke Facebook Authentication Project The DotNetNuke Facebook Authentication Project is an Authentication provider for DotNetNuke that uses Facebook authentication to authenticate users. diff --git a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Google/Google_Auth.dnn b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Google/Google_Auth.dnn index 0335e398c32..7049a0cac24 100644 --- a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Google/Google_Auth.dnn +++ b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Google/Google_Auth.dnn @@ -1,6 +1,6 @@ - + DotNetNuke Google Authentication Project The DotNetNuke Google Authentication Project is an Authentication provider for DotNetNuke that uses Google authentication to authenticate users. diff --git a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.LiveConnect/Live_Auth.dnn b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.LiveConnect/Live_Auth.dnn index 8d109f5f789..f2403e42664 100644 --- a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.LiveConnect/Live_Auth.dnn +++ b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.LiveConnect/Live_Auth.dnn @@ -1,6 +1,6 @@ - + DotNetNuke Live Authentication Project The DotNetNuke Live Authentication Project is an Authentication provider for DotNetNuke that uses diff --git a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Twitter/Twitter_Auth.dnn b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Twitter/Twitter_Auth.dnn index 2bc2765e051..3535b3cd587 100644 --- a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Twitter/Twitter_Auth.dnn +++ b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Twitter/Twitter_Auth.dnn @@ -1,6 +1,6 @@ - + DotNetNuke Twitter Authentication Project The DotNetNuke Twitter Authentication Project is an Authentication provider for DotNetNuke that uses diff --git a/DNN Platform/Providers/CachingProviders/DotNetNuke.Providers.Caching.SimpleWebFarmCachingProvider/SimpleWebFarmCachingProvider.dnn b/DNN Platform/Providers/CachingProviders/DotNetNuke.Providers.Caching.SimpleWebFarmCachingProvider/SimpleWebFarmCachingProvider.dnn index 11064ed0f78..80e65cc9214 100644 --- a/DNN Platform/Providers/CachingProviders/DotNetNuke.Providers.Caching.SimpleWebFarmCachingProvider/SimpleWebFarmCachingProvider.dnn +++ b/DNN Platform/Providers/CachingProviders/DotNetNuke.Providers.Caching.SimpleWebFarmCachingProvider/SimpleWebFarmCachingProvider.dnn @@ -1,6 +1,6 @@  - + DotNetNuke Simple Web Farm Caching Provider DotNetNuke Simple Web Farm Caching Provider diff --git a/DNN Platform/Providers/ClientCapabilityProviders/Provider.AspNetCCP/AspNetClientCapabilityProvider.dnn b/DNN Platform/Providers/ClientCapabilityProviders/Provider.AspNetCCP/AspNetClientCapabilityProvider.dnn index 7e80353a1a9..f121f14e896 100644 --- a/DNN Platform/Providers/ClientCapabilityProviders/Provider.AspNetCCP/AspNetClientCapabilityProvider.dnn +++ b/DNN Platform/Providers/ClientCapabilityProviders/Provider.AspNetCCP/AspNetClientCapabilityProvider.dnn @@ -1,6 +1,6 @@ - + DotNetNuke ASP.NET Client Capability Provider ASP.NET Device Detection / Client Capability Provider ~/Providers/ClientCapabilityProviders/AspNetClientCapabilityProvider/Images/mobiledevicedet_32X32.png diff --git a/DNN Platform/Providers/FolderProviders/FolderProviders.dnn b/DNN Platform/Providers/FolderProviders/FolderProviders.dnn index 07c06a779f1..d21a9ea97e4 100644 --- a/DNN Platform/Providers/FolderProviders/FolderProviders.dnn +++ b/DNN Platform/Providers/FolderProviders/FolderProviders.dnn @@ -1,6 +1,6 @@  - + DotNetNuke Folder Providers Azure Folder Providers for DotNetNuke. diff --git a/DNN Platform/Skins/Xcillion/DNN_Skin_Xcillion.dnn b/DNN Platform/Skins/Xcillion/DNN_Skin_Xcillion.dnn index 59863f5baf6..b13e10b8d90 100644 --- a/DNN Platform/Skins/Xcillion/DNN_Skin_Xcillion.dnn +++ b/DNN Platform/Skins/Xcillion/DNN_Skin_Xcillion.dnn @@ -1,6 +1,6 @@ - + Xcillion @@ -29,7 +29,7 @@ - + Xcillion diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index cb917e6456d..ab137c12936 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -1,6 +1,6 @@ { "name": "admin_logs", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-object-assign": "^7.0.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "8.0.6", diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index 90b45fdabea..ac16c6a8a0d 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -1,6 +1,6 @@ { "name": "export-bundle", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p --progress", @@ -66,6 +66,6 @@ "webpack-dev-server": "3.1.14" }, "dependencies": { - "@dnnsoftware/dnn-react-common": "9.6.2" + "@dnnsoftware/dnn-react-common": "9.7.0" } } \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 359abe9ec46..84b02eefa83 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -1,6 +1,6 @@ { "name": "@dnnsoftware/dnn-react-common", - "version": "9.6.2", + "version": "9.7.0", "private": false, "description": "DNN React Component Library", "main": "dist/dnn-react-common.min.js", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index 2881238dc77..f9cb2c47744 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -1,6 +1,6 @@ { "name": "extensions", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -13,7 +13,7 @@ "@babel/core": "^7.2.0", "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "babel-loader": "8.0.6", "babel-plugin-transform-object-assign": "6.22.0", "babel-plugin-transform-object-rest-spread": "6.26.0", diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json index f3b21c389cb..2e9cf6c487e 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json @@ -1,6 +1,6 @@ { "name": "licensing", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -13,7 +13,7 @@ "@babel/core": "^7.1.6", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "8.0.6", @@ -43,4 +43,4 @@ "webpack-dev-server": "^3.1.14" }, "dependencies": {} -} +} \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index b553597326a..83486a6faad 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -1,6 +1,6 @@ { "name": "pages", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "start": "npm run webpack", @@ -23,7 +23,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.0.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "@types/knockout": "^3.4.66", "@types/redux": "3.6.31", "babel-eslint": "^10.0.1", @@ -73,4 +73,4 @@ "react-day-picker": "^7.2.4", "url-parse": "^1.2.0" } -} +} \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index f6e67328a76..2e6afef076d 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -1,6 +1,6 @@ { "name": "prompt", - "version": "9.6.2", + "version": "9.7.0", "description": "DNN Prompt", "private": true, "scripts": { @@ -15,7 +15,7 @@ "@babel/core": "^7.1.6", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-eslint": "^10.0.1", @@ -76,4 +76,4 @@ "dependencies": { "html-react-parser": "^0.7.0" } -} +} \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json index 6864c5bc3f5..427f56c8712 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json @@ -1,6 +1,6 @@ { "name": "roles", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -13,7 +13,7 @@ "@babel/core": "^7.1.6", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "array.prototype.find": "^2.0.0", "array.prototype.findindex": "^2.0.0", "babel-loader": "^8.0.6", diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index f7ed2d379a8..d9e0c283643 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -1,6 +1,6 @@ { "name": "security_settings", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-react-jsx": "^7.2.0", "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "babel-loader": "8.0.6", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "create-react-class": "^15.6.3", diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json index 0563cfaefcf..61bbc6fba8e 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json @@ -1,6 +1,6 @@ { "name": "seo", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -14,7 +14,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "8.0.6", @@ -47,4 +47,4 @@ "webpack-dev-server": "^3.1.14" }, "dependencies": {} -} +} \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index fd6981af11c..f829260e46a 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -1,6 +1,6 @@ { "name": "servers", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -14,7 +14,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "@types/redux": "^3.6.31", "babel-loader": "8.0.6", "babel-plugin-transform-object-assign": "6.22.0", @@ -46,4 +46,4 @@ "dependencies": { "react-custom-scrollbars": "^4.1.1" } -} +} \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json index cc2c958e567..799ef2f1f2e 100644 --- a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json @@ -1,6 +1,6 @@ { "name": "dnn-sitegroups", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-object-assign": "7.0.0", "@babel/preset-env": "7.1.6", "@babel/preset-react": "7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "babel-loader": "8.0.6", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "babel-polyfill": "6.26.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json index 6cdebde5c95..3ed7873cb94 100644 --- a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json @@ -1,6 +1,6 @@ { "name": "site_import_export", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-react-jsx": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "babel-eslint": "^10.0.1", "babel-loader": "8.0.6", "babel-plugin-transform-class-properties": "^6.22.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index 1422f172a6e..38d4bc96adb 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -1,6 +1,6 @@ { "name": "site_settings", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-react-jsx": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "^8.0.6", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json index 469c754982d..60df4b9f9d4 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json @@ -1,6 +1,6 @@ { "name": "boilerplate", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-object-assign": "7.0.0", "@babel/preset-env": "7.1.6", "@babel/preset-react": "7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "babel-loader": "8.0.6", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "babel-polyfill": "6.26.0", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json index b924000ab37..fe74be173bc 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json @@ -1,6 +1,6 @@ { "name": "dnn-sites-list-view", - "version": "9.6.2", + "version": "9.7.0", "description": "DNN Sites List View", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", @@ -15,7 +15,7 @@ "@babel/plugin-transform-object-assign": "7.0.0", "@babel/preset-env": "7.1.6", "@babel/preset-react": "7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "babel-loader": "8.0.4", "babel-plugin-transform-react-remove-prop-types": "0.4.20", "babel-polyfill": "6.26.0", diff --git a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json index eeee29e56a3..b06a78f5a85 100644 --- a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json @@ -1,6 +1,6 @@ { "name": "task_scheduler", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -14,7 +14,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "8.0.6", @@ -46,4 +46,4 @@ "webpack-cli": "^3.1.2", "webpack-dev-server": "^3.1.14" } -} +} \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json index 2399c424737..def4ecd104d 100644 --- a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json @@ -1,6 +1,6 @@ { "name": "themes", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -14,7 +14,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "babel-loader": "8.0.6", "babel-plugin-transform-object-assign": "6.22.0", "babel-plugin-transform-object-rest-spread": "6.26.0", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/package.json index 9d1fd68eda8..d10a892948f 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/package.json @@ -1,6 +1,6 @@ { "name": "users", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "start": "npm run webpack", @@ -51,7 +51,7 @@ "webpack-dev-server": "^3.1.14" }, "dependencies": { - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "localization": "^1.0.2", "react-widgets": "^4.4.6" } diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json index 8e5160b5f21..27afb7f3abc 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json @@ -1,6 +1,6 @@ { "name": "dnn-users-exportables", - "version": "9.6.2", + "version": "9.7.0", "description": "DNN Users Exportables", "scripts": { "start": "npm run webpack", @@ -16,7 +16,7 @@ "@babel/plugin-transform-react-jsx": "^7.1.6", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "babel-loader": "8.0.6", "create-react-class": "^15.6.3", "css-loader": "2.1.1", diff --git a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json index 2c84059e49c..94a11e18516 100644 --- a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json @@ -1,6 +1,6 @@ { "name": "taxonomy", - "version": "9.6.2", + "version": "9.7.0", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -14,7 +14,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.6.2", + "@dnnsoftware/dnn-react-common": "9.7.0", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "^8.0.6", @@ -47,4 +47,4 @@ "webpack-cli": "^3.1.2", "webpack-dev-server": "^3.1.14" } -} +} \ No newline at end of file diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn index 1c307ee5c20..a1cd46c49ba 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn @@ -1,6 +1,6 @@ - + Dnn.PersonaBar.Extensions ~/Images/icon-personabarapp-32px.png diff --git a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/Dnn.EditBar.UI.dnn b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/Dnn.EditBar.UI.dnn index 0a97911d7de..44ba83ed003 100644 --- a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/Dnn.EditBar.UI.dnn +++ b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/Dnn.EditBar.UI.dnn @@ -1,6 +1,6 @@ - + Dnn.EditBar.UI diff --git a/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/Dnn.PersonaBar.UI.dnn b/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/Dnn.PersonaBar.UI.dnn index 2c32b3df3f0..64e3f879532 100644 --- a/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/Dnn.PersonaBar.UI.dnn +++ b/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/Dnn.PersonaBar.UI.dnn @@ -1,6 +1,6 @@ - + Dnn.PersonaBar.UI diff --git a/SolutionInfo.cs b/SolutionInfo.cs index a1e1b10efe8..779cb1df27a 100644 --- a/SolutionInfo.cs +++ b/SolutionInfo.cs @@ -12,6 +12,6 @@ [assembly: AssemblyProduct("https://dnncommunity.org")] [assembly: AssemblyCopyright("DNN Platform is copyright 2002-2020 by .NET Foundation. All Rights Reserved.")] [assembly: AssemblyTrademark("DNN")] -[assembly: AssemblyVersion("9.6.2.0")] -[assembly: AssemblyFileVersion("9.6.2.0")] -[assembly: AssemblyInformationalVersion("9.6.2.0 Custom build")] +[assembly: AssemblyVersion("9.7.0.0")] +[assembly: AssemblyFileVersion("9.7.0.0")] +[assembly: AssemblyInformationalVersion("9.7.0.0 Custom build")] diff --git a/package.json b/package.json index 9297c5ec642..8d02c2e6a5a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dnn-platform", - "version": "9.6.2", + "version": "9.7.0", "private": true, "workspaces": [ "Dnn.AdminExperience/ClientSide/AdminLogs.Web", From 625645f8446367a80683e91b23f7cac74756a7bb Mon Sep 17 00:00:00 2001 From: Daniel Valadas Date: Tue, 28 Jul 2020 11:44:26 -0400 Subject: [PATCH 33/45] Update bug-report.md --- .github/ISSUE_TEMPLATE/bug-report.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 72dbcfd66f6..ee90d788591 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -42,8 +42,7 @@ Please add X in at least one of the boxes as appropriate. In order for an issue --> * [ ] 10.00.00 alpha build * [ ] 09.07.00 release candidate -* [ ] 09.06.02 release candidate -* [ ] 09.06.01 latest supported release +* [ ] 09.06.02 latest supported release ## Affected browser