- * entityResource.getPagedDescendants(1234, "Content", {pageSize: 10, pageNumber: 2})
+ * entityResource.getPagedDescendants(1234, "Document", {pageSize: 10, pageNumber: 2})
* .then(function(contentArray) {
* var children = contentArray;
* alert('they are here!');
@@ -416,8 +416,8 @@ function entityResource($q, $http, umbRequestHelper) {
* @param {Int} parentid id of content item to return descendants of
* @param {string} type Object type name
* @param {Object} options optional options object
- * @param {Int} options.pageSize if paging data, number of nodes per page, default = 1
- * @param {Int} options.pageNumber if paging data, current page index, default = 100
+ * @param {Int} options.pageSize if paging data, number of nodes per page, default = 100
+ * @param {Int} options.pageNumber if paging data, current page index, default = 1
* @param {String} options.filter if provided, query will only return those with names matching the filter
* @param {String} options.orderDirection can be `Ascending` or `Descending` - Default: `Ascending`
* @param {String} options.orderBy property to order items by, default: `SortOrder`
@@ -427,8 +427,8 @@ function entityResource($q, $http, umbRequestHelper) {
getPagedDescendants: function (parentId, type, options) {
var defaults = {
- pageSize: 1,
- pageNumber: 100,
+ pageSize: 100,
+ pageNumber: 1,
filter: '',
orderDirection: "Ascending",
orderBy: "SortOrder"
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js
index 72564398c0..0fd308ffd0 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js
@@ -280,7 +280,7 @@
* });
*
*
- * @param {Array} id user id.
+ * @param {Int} userId user id.
* @returns {Promise} resourcePromise object containing the user.
*
*/
@@ -406,6 +406,36 @@
"Failed to save user");
}
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#deleteNonLoggedInUser
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Deletes a user that hasn't already logged in (and hence we know has made no content updates that would create related records)
+ *
+ * ##usage
+ *
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediaPicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediaPicker/mediapicker.controller.js
index a6131f55cf..d2d2178861 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediaPicker/mediapicker.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediaPicker/mediapicker.controller.js
@@ -84,17 +84,21 @@ angular.module("umbraco")
//media object so we need to look it up
var id = $scope.target.udi ? $scope.target.udi : $scope.target.id
var altText = $scope.target.altText;
- mediaResource.getById(id)
- .then(function (node) {
- $scope.target = node;
- if (ensureWithinStartNode(node)) {
- selectImage(node);
- $scope.target.url = mediaHelper.resolveFile(node);
- $scope.target.altText = altText;
- $scope.openDetailsDialog();
- }
- },
- gotoStartNode);
+ if (id) {
+ mediaResource.getById(id)
+ .then(function (node) {
+ $scope.target = node;
+ if (ensureWithinStartNode(node)) {
+ selectImage(node);
+ $scope.target.url = mediaHelper.resolveFile(node);
+ $scope.target.altText = altText;
+ $scope.openDetailsDialog();
+ }
+ },
+ gotoStartNode);
+ } else {
+ gotoStartNode();
+ }
}
}
@@ -320,20 +324,25 @@ angular.module("umbraco")
mediaItem.thumbnail = mediaHelper.resolveFileFromEntity(mediaItem, true);
mediaItem.image = mediaHelper.resolveFileFromEntity(mediaItem, false);
// set properties to match a media object
- if (mediaItem.metaData &&
- mediaItem.metaData.umbracoWidth &&
- mediaItem.metaData.umbracoHeight) {
-
- mediaItem.properties = [
- {
+ mediaItem.properties = [];
+ if (mediaItem.metaData) {
+ if (mediaItem.metaData.umbracoWidth && mediaItem.metaData.umbracoHeight) {
+ mediaItem.properties.push({
alias: "umbracoWidth",
value: mediaItem.metaData.umbracoWidth.Value
- },
- {
+ });
+ mediaItem.properties.push({
alias: "umbracoHeight",
value: mediaItem.metaData.umbracoHeight.Value
- }
- ];
+ });
+ }
+ if (mediaItem.metaData.umbracoFile) {
+ mediaItem.properties.push({
+ alias: "umbracoFile",
+ editor: mediaItem.metaData.umbracoFile.PropertyEditorAlias,
+ value: mediaItem.metaData.umbracoFile.Value
+ });
+ }
}
});
// update images
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js
new file mode 100644
index 0000000000..1f12536d1b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js
@@ -0,0 +1,507 @@
+//used for the media picker dialog
+angular.module("umbraco").controller("Umbraco.Overlays.TreePickerController",
+ function ($scope, $q, entityResource, eventsService, $log, searchService, angularHelper, $timeout, localizationService, treeService, contentResource, mediaResource, memberResource) {
+
+ var tree = null;
+ var dialogOptions = $scope.model;
+ $scope.treeReady = false;
+ $scope.dialogTreeEventHandler = $({});
+ $scope.section = dialogOptions.section;
+ $scope.treeAlias = dialogOptions.treeAlias;
+ $scope.multiPicker = dialogOptions.multiPicker;
+ $scope.hideHeader = (typeof dialogOptions.hideHeader) === "boolean" ? dialogOptions.hideHeader : true;
+ // if you need to load a not initialized tree set this value to false - default is true
+ $scope.onlyInitialized = dialogOptions.onlyInitialized;
+ $scope.searchInfo = {
+ searchFromId: dialogOptions.startNodeId,
+ searchFromName: null,
+ showSearch: false,
+ results: [],
+ selectedSearchResults: []
+ }
+
+ $scope.model.selection = [];
+
+ //Used for toggling an empty-state message
+ //Some trees can have no items (dictionary & forms email templates)
+ $scope.hasItems = true;
+ $scope.emptyStateMessage = dialogOptions.emptyStateMessage;
+ var node = dialogOptions.currentNode;
+
+ //This is called from ng-init
+ //it turns out it is called from the angular html : / Have a look at views/common / overlays / contentpicker / contentpicker.html you'll see ng-init.
+ //this is probably an anti pattern IMO and shouldn't be used
+ $scope.init = function (contentType) {
+
+ if (contentType === "content") {
+ $scope.entityType = "Document";
+ if (!$scope.model.title) {
+ $scope.model.title = localizationService.localize("defaultdialogs_selectContent");
+ }
+ } else if (contentType === "member") {
+ $scope.entityType = "Member";
+ if (!$scope.model.title) {
+ $scope.model.title = localizationService.localize("defaultdialogs_selectMember");
+ }
+ } else if (contentType === "media") {
+ $scope.entityType = "Media";
+ if (!$scope.model.title) {
+ $scope.model.title = localizationService.localize("defaultdialogs_selectMedia");
+ }
+ }
+ }
+
+ var searchText = "Search...";
+ localizationService.localize("general_search").then(function (value) {
+ searchText = value + "...";
+ });
+
+ // Allow the entity type to be passed in but defaults to Document for backwards compatibility.
+ $scope.entityType = dialogOptions.entityType ? dialogOptions.entityType : "Document";
+
+
+ //min / max values
+ if (dialogOptions.minNumber) {
+ dialogOptions.minNumber = parseInt(dialogOptions.minNumber, 10);
+ }
+ if (dialogOptions.maxNumber) {
+ dialogOptions.maxNumber = parseInt(dialogOptions.maxNumber, 10);
+ }
+
+ if (dialogOptions.section === "member") {
+ $scope.entityType = "Member";
+ }
+ else if (dialogOptions.section === "media") {
+ $scope.entityType = "Media";
+ }
+
+ // Search and listviews is only working for content, media and member section
+ var searchableSections = ["content", "media", "member"];
+
+ $scope.enableSearh = searchableSections.indexOf($scope.section) !== -1;
+
+ //if a alternative startnode is used, we need to check if it is a container
+ if ($scope.enableSearh && dialogOptions.startNodeId && dialogOptions.startNodeId !== -1 && dialogOptions.startNodeId !== "-1") {
+ entityResource.getById(dialogOptions.startNodeId, $scope.entityType).then(function(node) {
+ if (node.metaData.IsContainer) {
+ openMiniListView(node);
+ }
+ initTree();
+ });
+ }
+ else {
+ initTree();
+ }
+
+ //Configures filtering
+ if (dialogOptions.filter) {
+
+ dialogOptions.filterExclude = false;
+ dialogOptions.filterAdvanced = false;
+
+ //used advanced filtering
+ if (angular.isFunction(dialogOptions.filter)) {
+ dialogOptions.filterAdvanced = true;
+ }
+ else if (angular.isObject(dialogOptions.filter)) {
+ dialogOptions.filterAdvanced = true;
+ }
+ else {
+ if (dialogOptions.filter.startsWith("!")) {
+ dialogOptions.filterExclude = true;
+ dialogOptions.filter = dialogOptions.filter.substring(1);
+ }
+
+ //used advanced filtering
+ if (dialogOptions.filter.startsWith("{")) {
+ dialogOptions.filterAdvanced = true;
+ //convert to object
+ dialogOptions.filter = angular.fromJson(dialogOptions.filter);
+ }
+ }
+ }
+
+ function initTree() {
+ //create the custom query string param for this tree
+ $scope.customTreeParams = dialogOptions.startNodeId ? "startNodeId=" + dialogOptions.startNodeId : "";
+ $scope.customTreeParams += dialogOptions.customTreeParams ? "&" + dialogOptions.customTreeParams : "";
+ $scope.treeReady = true;
+ }
+
+ function nodeExpandedHandler(ev, args) {
+
+ // open mini list view for list views
+ if (args.node.metaData.isContainer) {
+ openMiniListView(args.node);
+ }
+
+ if (angular.isArray(args.children)) {
+
+ //iterate children
+ _.each(args.children, function (child) {
+
+ //now we need to look in the already selected search results and
+ // toggle the check boxes for those ones that are listed
+ var exists = _.find($scope.searchInfo.selectedSearchResults, function (selected) {
+ return child.id == selected.id;
+ });
+ if (exists) {
+ child.selected = true;
+ }
+ });
+
+ //check filter
+ performFiltering(args.children);
+ }
+ }
+
+ //gets the tree object when it loads
+ function treeLoadedHandler(ev, args) {
+ //args.tree contains children (args.tree.root.children)
+ $scope.hasItems = args.tree.root.children.length > 0;
+
+ tree = args.tree;
+
+ if (node && node.path) {
+ $scope.dialogTreeEventHandler.syncTree({ path: node.path, activate: false });
+ }
+
+ }
+
+ //wires up selection
+ function nodeSelectHandler(ev, args) {
+ args.event.preventDefault();
+ args.event.stopPropagation();
+
+ if (args.node.metaData.isSearchResult) {
+ //check if the item selected was a search result from a list view
+
+ //unselect
+ select(args.node.name, args.node.id);
+
+ //remove it from the list view children
+ var listView = args.node.parent();
+ listView.children = _.reject(listView.children, function (child) {
+ return child.id == args.node.id;
+ });
+
+ //remove it from the custom tracked search result list
+ $scope.searchInfo.selectedSearchResults = _.reject($scope.searchInfo.selectedSearchResults, function (i) {
+ return i.id == args.node.id;
+ });
+ }
+ else {
+ eventsService.emit("dialogs.treePickerController.select", args);
+
+ if (args.node.filtered) {
+ return;
+ }
+
+ //This is a tree node, so we don't have an entity to pass in, it will need to be looked up
+ //from the server in this method.
+ if ($scope.model.select) {
+ $scope.model.select(args.node)
+ } else {
+ select(args.node.name, args.node.id);
+ //toggle checked state
+ args.node.selected = args.node.selected === true ? false : true;
+ }
+
+ }
+ }
+
+ /** Method used for selecting a node */
+ function select(text, id, entity) {
+ //if we get the root, we just return a constructed entity, no need for server data
+ if (id < 0) {
+
+ var rootNode = {
+ alias: null,
+ icon: "icon-folder",
+ id: id,
+ name: text
+ };
+
+ if ($scope.multiPicker) {
+ if (entity) {
+ multiSelectItem(entity);
+ } else {
+ multiSelectItem(rootNode);
+ }
+ }
+ else {
+ $scope.model.selection.push(rootNode);
+ $scope.model.submit($scope.model);
+ }
+ }
+ else {
+
+ if ($scope.multiPicker) {
+
+ if (entity) {
+ multiSelectItem(entity);
+ } else {
+ //otherwise we have to get it from the server
+ entityResource.getById(id, $scope.entityType).then(function (ent) {
+ multiSelectItem(ent);
+ });
+ }
+
+ }
+
+ else {
+
+ $scope.hideSearch();
+
+ //if an entity has been passed in, use it
+ if (entity) {
+ $scope.model.selection.push(entity);
+ $scope.model.submit($scope.model);
+ } else {
+ //otherwise we have to get it from the server
+ entityResource.getById(id, $scope.entityType).then(function (ent) {
+ $scope.model.selection.push(ent);
+ $scope.model.submit($scope.model);
+ });
+ }
+ }
+ }
+ }
+
+ function multiSelectItem(item) {
+
+ var found = false;
+ var foundIndex = 0;
+
+ if ($scope.model.selection.length > 0) {
+ for (i = 0; $scope.model.selection.length > i; i++) {
+ var selectedItem = $scope.model.selection[i];
+ if (selectedItem.id === item.id) {
+ found = true;
+ foundIndex = i;
+ }
+ }
+ }
+
+ if (found) {
+ $scope.model.selection.splice(foundIndex, 1);
+ } else {
+ $scope.model.selection.push(item);
+ }
+
+ }
+
+ function performFiltering(nodes) {
+
+ if (!dialogOptions.filter) {
+ return;
+ }
+
+ //remove any list view search nodes from being filtered since these are special nodes that always must
+ // be allowed to be clicked on
+ nodes = _.filter(nodes, function (n) {
+ return !angular.isObject(n.metaData.listViewNode);
+ });
+
+ if (dialogOptions.filterAdvanced) {
+
+ //filter either based on a method or an object
+ var filtered = angular.isFunction(dialogOptions.filter)
+ ? _.filter(nodes, dialogOptions.filter)
+ : _.where(nodes, dialogOptions.filter);
+
+ angular.forEach(filtered, function (value, key) {
+ value.filtered = true;
+ if (dialogOptions.filterCssClass) {
+ if (!value.cssClasses) {
+ value.cssClasses = [];
+ }
+ value.cssClasses.push(dialogOptions.filterCssClass);
+ }
+ });
+ } else {
+ var a = dialogOptions.filter.toLowerCase().replace(/\s/g, '').split(',');
+ angular.forEach(nodes, function (value, key) {
+
+ var found = a.indexOf(value.metaData.contentType.toLowerCase()) >= 0;
+
+ if (!dialogOptions.filterExclude && !found || dialogOptions.filterExclude && found) {
+ value.filtered = true;
+
+ if (dialogOptions.filterCssClass) {
+ if (!value.cssClasses) {
+ value.cssClasses = [];
+ }
+ value.cssClasses.push(dialogOptions.filterCssClass);
+ }
+ }
+ });
+ }
+ }
+
+ $scope.multiSubmit = function (result) {
+ entityResource.getByIds(result, $scope.entityType).then(function (ents) {
+ $scope.submit(ents);
+ });
+ };
+
+ /** method to select a search result */
+ $scope.selectResult = function (evt, result) {
+
+ if (result.filtered) {
+ return;
+ }
+
+ result.selected = result.selected === true ? false : true;
+
+ //since result = an entity, we'll pass it in so we don't have to go back to the server
+ select(result.name, result.id, result);
+
+ //add/remove to our custom tracked list of selected search results
+ if (result.selected) {
+ $scope.searchInfo.selectedSearchResults.push(result);
+ }
+ else {
+ $scope.searchInfo.selectedSearchResults = _.reject($scope.searchInfo.selectedSearchResults, function (i) {
+ return i.id == result.id;
+ });
+ }
+
+ //ensure the tree node in the tree is checked/unchecked if it already exists there
+ if (tree) {
+ var found = treeService.getDescendantNode(tree.root, result.id);
+ if (found) {
+ found.selected = result.selected;
+ }
+ }
+
+ };
+
+ $scope.hideSearch = function () {
+
+ //Traverse the entire displayed tree and update each node to sync with the selected search results
+ if (tree) {
+
+ //we need to ensure that any currently displayed nodes that get selected
+ // from the search get updated to have a check box!
+ function checkChildren(children) {
+ _.each(children, function (child) {
+ //check if the id is in the selection, if so ensure it's flagged as selected
+ var exists = _.find($scope.searchInfo.selectedSearchResults, function (selected) {
+ return child.id == selected.id;
+ });
+ //if the curr node exists in selected search results, ensure it's checked
+ if (exists) {
+ child.selected = true;
+ }
+ //if the curr node does not exist in the selected search result, and the curr node is a child of a list view search result
+ else if (child.metaData.isSearchResult) {
+ //if this tree node is under a list view it means that the node was added
+ // to the tree dynamically under the list view that was searched, so we actually want to remove
+ // it all together from the tree
+ var listView = child.parent();
+ listView.children = _.reject(listView.children, function (c) {
+ return c.id == child.id;
+ });
+ }
+
+ //check if the current node is a list view and if so, check if there's any new results
+ // that need to be added as child nodes to it based on search results selected
+ if (child.metaData.isContainer) {
+
+ child.cssClasses = _.reject(child.cssClasses, function (c) {
+ return c === 'tree-node-slide-up-hide-active';
+ });
+
+ var listViewResults = _.filter($scope.searchInfo.selectedSearchResults, function (i) {
+ return i.parentId == child.id;
+ });
+ _.each(listViewResults, function (item) {
+ var childExists = _.find(child.children, function (c) {
+ return c.id == item.id;
+ });
+ if (!childExists) {
+ var parent = child;
+ child.children.unshift({
+ id: item.id,
+ name: item.name,
+ cssClass: "icon umb-tree-icon sprTree " + item.icon,
+ level: child.level + 1,
+ metaData: {
+ isSearchResult: true
+ },
+ hasChildren: false,
+ parent: function () {
+ return parent;
+ }
+ });
+ }
+ });
+ }
+
+ //recurse
+ if (child.children && child.children.length > 0) {
+ checkChildren(child.children);
+ }
+ });
+ }
+ checkChildren(tree.root.children);
+ }
+
+
+ $scope.searchInfo.showSearch = false;
+ $scope.searchInfo.searchFromId = dialogOptions.startNodeId;
+ $scope.searchInfo.searchFromName = null;
+ $scope.searchInfo.results = [];
+ }
+
+ $scope.onSearchResults = function (results) {
+
+ //filter all items - this will mark an item as filtered
+ performFiltering(results);
+
+ //now actually remove all filtered items so they are not even displayed
+ results = _.filter(results, function (item) {
+ return !item.filtered;
+ });
+
+ $scope.searchInfo.results = results;
+
+ //sync with the curr selected results
+ _.each($scope.searchInfo.results, function (result) {
+ var exists = _.find($scope.model.selection, function (selectedId) {
+ return result.id == selectedId;
+ });
+ if (exists) {
+ result.selected = true;
+ }
+ });
+
+ $scope.searchInfo.showSearch = true;
+ };
+
+ $scope.dialogTreeEventHandler.bind("treeLoaded", treeLoadedHandler);
+ $scope.dialogTreeEventHandler.bind("treeNodeExpanded", nodeExpandedHandler);
+ $scope.dialogTreeEventHandler.bind("treeNodeSelect", nodeSelectHandler);
+
+ $scope.$on('$destroy', function () {
+ $scope.dialogTreeEventHandler.unbind("treeLoaded", treeLoadedHandler);
+ $scope.dialogTreeEventHandler.unbind("treeNodeExpanded", nodeExpandedHandler);
+ $scope.dialogTreeEventHandler.unbind("treeNodeSelect", nodeSelectHandler);
+ });
+
+ $scope.selectListViewNode = function (node) {
+ select(node.name, node.id);
+ //toggle checked state
+ node.selected = node.selected === true ? false : true;
+ };
+
+ $scope.closeMiniListView = function () {
+ $scope.miniListView = undefined;
+ };
+
+ function openMiniListView(node) {
+ $scope.miniListView = node;
+ }
+
+ });
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html
index c9e4af4062..a6183435ae 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html
@@ -33,9 +33,8 @@
\ No newline at end of file
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html
index 93dc4d8204..941ebd596e 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html
@@ -1,9 +1,11 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/users/change-password.html b/src/Umbraco.Web.UI.Client/src/views/components/users/change-password.html
index 39363be827..7b6c7ca0e1 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/users/change-password.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/users/change-password.html
@@ -31,8 +31,7 @@
class="input-block-level umb-textstring textstring"
required
val-server-field="oldPassword"
- no-dirty-check
- autocomplete="off" />
+ no-dirty-check />
Required{{passwordForm.oldPassword.errorMsg}}
@@ -45,8 +44,7 @@
required
val-server-field="password"
ng-minlength="{{config.minPasswordLength}}"
- no-dirty-check
- autocomplete="off" />
+ no-dirty-check />
RequiredMinimum {{config.minPasswordLength}} characters
@@ -58,8 +56,7 @@
+ no-dirty-check />
The confirmed password doesn't match the new password!
diff --git a/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js
index c3cbb63704..85ec8461f2 100644
--- a/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js
@@ -50,8 +50,9 @@ function DataTypeEditController($scope, $routeParams, $location, appState, navig
$scope.preValues = [];
if ($routeParams.create) {
-
+
$scope.page.loading = true;
+ $scope.showIdentifier = false;
//we are creating so get an empty data type item
dataTypeResource.getScaffold($routeParams.id)
@@ -77,6 +78,8 @@ function DataTypeEditController($scope, $routeParams, $location, appState, navig
$scope.page.loading = true;
+ $scope.showIdentifier = true;
+
//we are editing so get the content item from the server
dataTypeResource.getById($routeParams.id)
.then(function(data) {
diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/create.html b/src/Umbraco.Web.UI.Client/src/views/dictionary/create.html
new file mode 100644
index 0000000000..5b73df3f86
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/create.html
@@ -0,0 +1,19 @@
+
+
+
+
Create an item under {{currentNode.name}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/delete.html b/src/Umbraco.Web.UI.Client/src/views/dictionary/delete.html
new file mode 100644
index 0000000000..61c26c09a7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/delete.html
@@ -0,0 +1,12 @@
+
+
+
+
+ Are you sure you want to delete{{currentNode.name}} ?
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.create.controller.js b/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.create.controller.js
new file mode 100644
index 0000000000..f47244bb10
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.create.controller.js
@@ -0,0 +1,44 @@
+/**
+ * @ngdoc controller
+ * @name Umbraco.Editors.Dictionary.CreateController
+ * @function
+ *
+ * @description
+ * The controller for creating dictionary items
+ */
+function DictionaryCreateController($scope, $location, dictionaryResource, navigationService, notificationsService, formHelper, appState) {
+ var vm = this;
+
+ vm.itemKey = "";
+
+ function createItem() {
+
+ var node = $scope.dialogOptions.currentNode;
+
+ dictionaryResource.create(node.id, vm.itemKey).then(function (data) {
+ navigationService.hideMenu();
+
+ // set new item as active in tree
+ var currPath = node.path ? node.path : "-1";
+ navigationService.syncTree({ tree: "dictionary", path: currPath + "," + data, forceReload: true, activate: true });
+
+ // reset form state
+ formHelper.resetForm({ scope: $scope });
+
+ // navigate to edit view
+ var currentSection = appState.getSectionState("currentSection");
+ $location.path("/" + currentSection + "/dictionary/edit/" + data);
+
+
+ }, function (err) {
+ if (err.data && err.data.message) {
+ notificationsService.error(err.data.message);
+ navigationService.hideMenu();
+ }
+ });
+ }
+
+ vm.createItem = createItem;
+}
+
+angular.module("umbraco").controller("Umbraco.Editors.Dictionary.CreateController", DictionaryCreateController);
diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.delete.controller.js b/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.delete.controller.js
new file mode 100644
index 0000000000..43d6bac401
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.delete.controller.js
@@ -0,0 +1,50 @@
+/**
+ * @ngdoc controller
+ * @name Umbraco.Editors.Dictionary.DeleteController
+ * @function
+ *
+ * @description
+ * The controller for deleting dictionary items
+ */
+function DictionaryDeleteController($scope, $location, dictionaryResource, treeService, navigationService, appState) {
+ var vm = this;
+
+ function cancel() {
+ navigationService.hideDialog();
+ }
+
+ function performDelete() {
+ // stop from firing again on double-click
+ if ($scope.busy) { return false; }
+
+ //mark it for deletion (used in the UI)
+ $scope.currentNode.loading = true;
+ $scope.busy = true;
+
+ dictionaryResource.deleteById($scope.currentNode.id).then(function () {
+ $scope.currentNode.loading = false;
+
+ // get the parent id
+ var parentId = $scope.currentNode.parentId;
+
+ treeService.removeNode($scope.currentNode);
+
+ navigationService.hideMenu();
+
+ var currentSection = appState.getSectionState("currentSection");
+ if (parentId !== "-1") {
+ // set the view of the parent item
+ $location.path("/" + currentSection + "/dictionary/edit/" + parentId);
+ } else {
+ // we have no parent, so redirect to section
+ $location.path("/" + currentSection + "/");
+ }
+
+ });
+ }
+
+ vm.cancel = cancel;
+ vm.performDelete = performDelete;
+}
+
+angular.module("umbraco").controller("Umbraco.Editors.Dictionary.DeleteController", DictionaryDeleteController);
diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.edit.controller.js
new file mode 100644
index 0000000000..1b9d5c3f4c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.edit.controller.js
@@ -0,0 +1,115 @@
+/**
+ * @ngdoc controller
+ * @name Umbraco.Editors.Dictionary.EditController
+ * @function
+ *
+ * @description
+ * The controller for editing dictionary items
+ */
+function DictionaryEditController($scope, $routeParams, dictionaryResource, treeService, navigationService, appState, editorState, contentEditingHelper, formHelper, notificationsService, localizationService) {
+ var vm = this;
+
+ //setup scope vars
+ vm.nameDirty = false;
+ vm.page = {};
+ vm.page.loading = false;
+ vm.page.nameLocked = false;
+ vm.page.menu = {};
+ vm.page.menu.currentSection = appState.getSectionState("currentSection");
+ vm.page.menu.currentNode = null;
+ vm.description = "";
+
+ function loadDictionary() {
+
+ vm.page.loading = true;
+
+ //we are editing so get the content item from the server
+ dictionaryResource.getById($routeParams.id)
+ .then(function (data) {
+
+ bindDictionary(data);
+
+ vm.page.loading = false;
+ });
+ }
+
+ function createTranslationProperty(translation) {
+ return {
+ alias: translation.isoCode,
+ label: translation.displayName,
+ hideLabel : false
+ }
+ }
+
+ function bindDictionary(data) {
+ localizationService.localize("dictionaryItem_description").then(function (value) {
+ vm.description = value.replace("%0%", data.name);
+ });
+
+ // create data for umb-property displaying
+ for (var i = 0; i < data.translations.length; i++) {
+ data.translations[i].property = createTranslationProperty(data.translations[i]);
+ }
+
+ contentEditingHelper.handleSuccessfulSave({
+ scope: $scope,
+ savedContent: data
+ });
+
+ // set content
+ vm.content = data;
+
+ //share state
+ editorState.set(vm.content);
+
+ navigationService.syncTree({ tree: "dictionary", path: data.path, forceReload: true }).then(function (syncArgs) {
+ vm.page.menu.currentNode = syncArgs.node;
+ });
+ }
+
+ function onInit() {
+ loadDictionary();
+ }
+
+ function saveDictionary() {
+ if (formHelper.submitForm({ scope: $scope, statusMessage: "Saving..." })) {
+
+ vm.page.saveButtonState = "busy";
+
+ dictionaryResource.save(vm.content, vm.nameDirty)
+ .then(function (data) {
+
+ formHelper.resetForm({ scope: $scope, notifications: data.notifications });
+
+ bindDictionary(data);
+
+
+ vm.page.saveButtonState = "success";
+ },
+ function (err) {
+
+ contentEditingHelper.handleSaveError({
+ redirectOnFailure: false,
+ err: err
+ });
+
+ notificationsService.error(err.data.message);
+
+ vm.page.saveButtonState = "error";
+ });
+ }
+ }
+
+ vm.save = saveDictionary;
+
+ $scope.$watch("vm.content.name", function (newVal, oldVal) {
+ //when the value changes, we need to set the name dirty
+ if (newVal && (newVal !== oldVal) && typeof(oldVal) !== "undefined") {
+ vm.nameDirty = true;
+ }
+ });
+
+ onInit();
+}
+
+angular.module("umbraco").controller("Umbraco.Editors.Dictionary.EditController", DictionaryEditController);
diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.list.controller.js b/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.list.controller.js
new file mode 100644
index 0000000000..35739b3db7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/dictionary.list.controller.js
@@ -0,0 +1,47 @@
+/**
+ * @ngdoc controller
+ * @name Umbraco.Editors.Dictionary.ListController
+ * @function
+ *
+ * @description
+ * The controller for listting dictionary items
+ */
+function DictionaryListController($scope, $location, dictionaryResource, localizationService, appState) {
+ var vm = this;
+ vm.title = "Dictionary overview";
+ vm.loading = false;
+ vm.items = [];
+
+ function loadList() {
+
+ vm.loading = true;
+
+ dictionaryResource.getList()
+ .then(function (data) {
+
+ vm.items = data;
+
+ vm.loading = false;
+ });
+ }
+
+ function clickItem(id) {
+ var currentSection = appState.getSectionState("currentSection");
+ $location.path("/" + currentSection + "/dictionary/edit/" + id);
+ }
+
+ vm.clickItem = clickItem;
+
+ function onInit() {
+ localizationService.localize("dictionaryItem_overviewTitle").then(function (value) {
+ vm.title = value;
+ });
+
+ loadList();
+ }
+
+ onInit();
+}
+
+
+angular.module("umbraco").controller("Umbraco.Editors.Dictionary.ListController", DictionaryListController);
diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/edit.html b/src/Umbraco.Web.UI.Client/src/views/dictionary/edit.html
new file mode 100644
index 0000000000..c016d37eca
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/edit.html
@@ -0,0 +1,43 @@
+
+
+
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/list.html b/src/Umbraco.Web.UI.Client/src/views/dictionary/list.html
new file mode 100644
index 0000000000..82b088df49
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/list.html
@@ -0,0 +1,46 @@
+
]]>
-
+ More information on editing web.config here.]]>
+
+
+
Please contact your ISP if necessary.
- If you're installing on a local machine or server you might need information from your system administrator.]]>
-
+
+
+
Press the upgrade button to upgrade your database to Umbraco %0%
Don't worry - no content will be deleted and everything will continue working afterwards!
+ ]]>
- Press Next to proceed. ]]>
+ Press Next to
+ proceed. ]]>
next to continue the configuration wizard]]>The Default users' password needs to be changed!]]>
@@ -672,41 +789,56 @@
Affected files and foldersMore information on setting up permissions for Umbraco hereYou need to grant ASP.NET modify permissions to the following files/folders
- Your permission settings are almost perfect!
- You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.]]>
+
+ Your permission settings are almost perfect!
+ You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.]]>
+ How to ResolveClick here to read the text versionvideo tutorial on setting up folder permissions for Umbraco or read the text version.]]>
- Your permission settings might be an issue!
+
+ Your permission settings might be an issue!
- You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.]]>
- Your permission settings are not ready for Umbraco!
+ You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.]]>
+
+
+ Your permission settings are not ready for Umbraco!
- In order to run Umbraco, you'll need to update your permission settings.]]>
- Your permission settings are perfect!
- You are ready to run Umbraco and install packages!]]>
+ In order to run Umbraco, you'll need to update your permission settings.]]>
+
+
+ Your permission settings are perfect!
+ You are ready to run Umbraco and install packages!]]>
+ Resolving folder issueFollow this link for more information on problems with ASP.NET and creating foldersSetting up folder permissions
-
+
+ ]]>
+ I want to start from scratch
-
+ learn how)
You can still choose to install Runway later on. Please go to the Developer section and choose Packages.
- ]]>
+ ]]>
+
You've just set up a clean Umbraco platform. What do you want to do next?Runway is installed
-
+
This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules
- ]]>
+ ]]>
+
Only recommended for experienced usersI want to start with a simple website
-
+
"Runway" is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically,
but you can easily edit, extend or remove it. It's not necessary and you can perfectly use Umbraco without it. However,
@@ -717,7 +849,8 @@
Included with Runway: Home page, Getting Started page, Installing Modules page. Optional Modules: Top Navigation, Sitemap, Contact, Gallery.
- ]]>
+ ]]>
+
What is RunwayStep 1/5 Accept licenseStep 2/5: Database configuration
@@ -725,24 +858,36 @@
Step 4/5: Check Umbraco securityStep 5/5: Umbraco is ready to get you startedThank you for choosing Umbraco
- Browse your new site
-You installed Runway, so why not see how your new website looks.]]>
- Further help and information
-Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology]]>
+
+ Browse your new site
+You installed Runway, so why not see how your new website looks.]]>
+
+
+ Further help and information
+Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology]]>
+ Umbraco %0% is installed and ready for use
- /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%'.]]>
- started instantly by clicking the "Launch Umbraco" button below. If you are new to Umbraco,
-you can find plenty of resources on our getting started pages.]]>
- Launch Umbraco
-To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]>
+
+ /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%'.]]>
+
+
+ started instantly by clicking the "Launch Umbraco" button below. If you are new to Umbraco,
+you can find plenty of resources on our getting started pages.]]>
+
+
+ Launch Umbraco
+To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]>
+ Connection to database failed.Umbraco Version 3Umbraco Version 4Watch
- Umbraco %0% for a fresh install or upgrading from version 3.0.
+
+ Umbraco %0% for a fresh install or upgrading from version 3.0.
- Press "next" to start the wizard.]]>
+ Press "next" to start the wizard.]]>
+ Culture Code
@@ -767,6 +912,8 @@ To manage your website, simply open the Umbraco back office and start adding con
Forgotten password?An email will be sent to the address specified with a link to reset your passwordAn email with password reset instructions will be sent to the specified address if it matched our records
+ Show password
+ Hide passwordReturn to login formPlease provide a new passwordYour Password has been updated
@@ -774,41 +921,41 @@ To manage your website, simply open the Umbraco back office and start adding con
Umbraco: Reset Password
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
Password reset requested
@@ -818,12 +965,12 @@ To manage your website, simply open the Umbraco back office and start adding con
@@ -835,22 +982,22 @@ To manage your website, simply open the Umbraco back office and start adding con
%1%
-
+
-
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
+
]]>
@@ -877,7 +1024,8 @@ To manage your website, simply open the Umbraco back office and start adding con
Edit your notification for %0%
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
Hi %0%,
-
+
This is an automated mail to inform you that the task '%1%' has been performed on the page '%2%' by the user '%3%'
@@ -949,7 +1097,7 @@ To manage your website, simply open the Umbraco back office and start adding con
Update summary:
%6%
-
+
Have a nice day!
@@ -961,10 +1109,10 @@ To manage your website, simply open the Umbraco back office and start adding con
-
+
-
+
@@ -1292,6 +1440,9 @@ To manage your website, simply open the Umbraco back office and start adding con
An error occurred while unlocking the userMember was exported to fileAn error occurred while exporting the member
+ User %0% was deleted
+ Invite user
+ Invitation has been re-sent to %0%Uses CSS syntax ex: h1, .redHeader, .blueTex
@@ -1525,7 +1676,7 @@ To manage your website, simply open the Umbraco back office and start adding con
Allow this property value to be displayed on the member profile pagetab has no sort order
-
+
Where is this composition used?This composition is currently used in the composition of the following content types:
@@ -1779,41 +1930,41 @@ To manage your website, simply open the Umbraco back office and start adding con
Umbraco: Invitation
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
Hi %0%,
@@ -1831,12 +1982,12 @@ To manage your website, simply open the Umbraco back office and start adding con
@@ -1851,26 +2002,29 @@ To manage your website, simply open the Umbraco back office and start adding con
%3%
-
+
-
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
+
]]>
Invite
+ Resending invitation...
+ Delete User
+ Are you sure you wish to delete this user account?
@@ -1931,6 +2085,10 @@ To manage your website, simply open the Umbraco back office and start adding con
Media - Total XML: %0%, Total: %1%, Total invalid: %2%Content - Total XML: %0%, Total published: %1%, Total invalid: %2%
+ Database - The database schema is correct for this version of Umbraco
+ %0% problems were detected with your database schema (Check the log for details)
+ Some errors were detected while validating the database schema against the current version of Umbraco.
+
Your website's certificate is valid.Certificate validation error: '%0%'Your website's SSL certificate has expired.
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml
index 6586f05480..89f9c7df00 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml
@@ -46,6 +46,7 @@
Set permissionsUnlockCreate Content Template
+ Resend InvitationContent
@@ -100,9 +101,6 @@
Domains
-
- Viewing for
-
Clear selectionSelect
@@ -128,8 +126,9 @@
Edit relationsReturn to listSave
+
Save and close
- Publish
+ Save and publishPublish…Save and scheduleSave and send for approval
@@ -145,6 +144,28 @@
UndoRedo
+
+ Viewing for
+ Delete Content performed by user
+ UnPublish performed by user
+ Save and Publish performed by user
+ Save Content performed by user
+ Move Content performed by user
+ Copy Content performed by user
+ Content rollback performed by user
+ Content Send To Publish performed by user
+ Content Send To Translation performed by user
+ Copy
+ Publish
+ Move
+ Save
+ Delete
+ Unpublish
+ Rollback
+ Send To Publish
+ Send To Translation
+
+
To change the document type for the selected content, first select from the list of valid types for this location.Then confirm and/or amend the mapping of properties from the current type to the new, and click Save.
@@ -298,6 +319,7 @@
Discard changesYou have unsaved changesAre you sure you want to navigate away from this page? - you have unsaved changes
+ Unpublishing will remove this page and all its descendants from the site.Done
@@ -430,6 +452,7 @@
The key '%0%' already exists.
]]>
+ Dictionary overviewEnter your username
@@ -895,6 +918,8 @@ To manage your website, simply open the Umbraco back office and start adding con
Forgotten password?An email will be sent to the address specified with a link to reset your passwordAn email with password reset instructions will be sent to the specified address if it matched our records
+ Show password
+ Hide passwordReturn to login formPlease provide a new passwordYour Password has been updated
@@ -902,41 +927,41 @@ To manage your website, simply open the Umbraco back office and start adding con
Umbraco: Reset Password
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
Password reset requested
@@ -946,12 +971,12 @@ To manage your website, simply open the Umbraco back office and start adding con
@@ -1078,7 +1103,7 @@ To manage your website, simply open the Umbraco back office and start adding con
Update summary:
%6%
-
+
Have a nice day!
@@ -1090,10 +1115,10 @@ To manage your website, simply open the Umbraco back office and start adding con
-
+
-
+
@@ -1422,6 +1447,9 @@ To manage your website, simply open the Umbraco back office and start adding con
An error occurred while unlocking the userMember was exported to fileAn error occurred while exporting the member
+ User %0% was deleted
+ Invite user
+ Invitation has been re-sent to %0%Cannot publish the document since the required '%0%' is not publishedValidation failed for language '%0%'Unexpected validation failed for language '%0%'
@@ -1653,7 +1681,7 @@ To manage your website, simply open the Umbraco back office and start adding con
Allow this property value to be displayed on the member profile pagetab has no sort order
-
+
Where is this composition used?This composition is currently used in the composition of the following content types:
@@ -1916,41 +1944,41 @@ To manage your website, simply open the Umbraco back office and start adding con
Umbraco: Invitation
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
Hi %0%,
@@ -1968,12 +1996,12 @@ To manage your website, simply open the Umbraco back office and start adding con
@@ -1988,26 +2016,29 @@ To manage your website, simply open the Umbraco back office and start adding con
%3%
-
+
-
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
+
]]>
Invite
+ Resending invitation...
+ Delete User
+ Are you sure you wish to delete this user account?Validation
@@ -2067,6 +2098,10 @@ To manage your website, simply open the Umbraco back office and start adding con
Media - Total XML: %0%, Total: %1%, Total invalid: %2%Content - Total XML: %0%, Total published: %1%, Total invalid: %2%
+ Database - The database schema is correct for this version of Umbraco
+ %0% problems were detected with your database schema (Check the log for details)
+ Some errors were detected while validating the database schema against the current version of Umbraco.
+
Your website's certificate is valid.Certificate validation error: '%0%'Your website's SSL certificate has expired.
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/it.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/it.xml
index 0e856a286c..cd2eeb2a51 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/it.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/it.xml
@@ -128,38 +128,38 @@
Benvenuto
- Stay
- Discard changes
- You have unsaved changes
- Are you sure you want to navigate away from this page? - you have unsaved changes
+ Rimani
+ Scarta le modifiche
+ Hai delle modifiche non salvate
+ Sei sicuro di voler lasciare questa pagina? - hai delle modifiche non salvate
- Done
+ Fatto
- Deleted %0% item
- Deleted %0% items
- Deleted %0% out of %1% item
- Deleted %0% out of %1% items
+ Elimianto %0% elemento
+ Elimianto %0% elementi
+ Eliminato %0% su %1% elemento
+ Eliminato %0% su %1% elementi
- Published %0% item
- Published %0% items
- Published %0% out of %1% item
- Published %0% out of %1% items
+ Pubblicato %0% elemento
+ Pubblicato %0% elementi
+ Pubblicato %0% su %1% elemento
+ Pubblicato %0% su %1% elementi
- Unpublished %0% item
- Unpublished %0% items
- Unpublished %0% out of %1% item
- Unpublished %0% out of %1% items
+ %0% elemento non pubblicato
+ %0% elementi non pubblicati
+ Elementi non pubblicati - %0% su %1%
+ Elementi non pubblicati - %0% su %1%
- Moved %0% item
- Moved %0% items
- Moved %0% out of %1% item
- Moved %0% out of %1% items
+ Spostato %0% elemento
+ Spsotato %0% elementi
+ Spostato %0% su %1% elemento
+ Spostato %0% su %1% elementi
- Copied %0% item
- Copied %0% items
- Copied %0% out of %1% item
- Copied %0% out of %1% items
+ Copiato %0% elemento
+ Copiato %0% elementi
+ Copiato %0% su %1% elemento
+ Copiato %0% su %1% elementiTitolo del Link
@@ -571,7 +571,7 @@ Per gestire il tuo sito web, è sufficiente aprire il back office di Umbraco e i
usando i gruppi di membri di Umbraco.]]>
- l'autenticazione basata sui ruoli.]]>
+ Devi creare un gruppo di membri prima di utilizzare l'autenticazione basata sui ruoli
@@ -732,43 +732,43 @@ Per gestire il tuo sito web, è sufficiente aprire il back office di Umbraco e i
EmbedHeadlineQuote
- Choose type of content
- Choose a layout
- Add a row
- Add content
- Drop content
- Settings applied
+ Seleziona il tipo di contenuto
+ Seleziona un layout
+ Aggiungi una riga
+ Aggiungi contenuto
+ Elimina contenuto
+ Impostazioni applicati
- This content is not allowed here
- This content is allowed here
+ Questo contenuto non è consentito qui
+ Questo contenuto è consentito qui
- Click to embed
- Click to insert image
- Image caption...
- Write here...
+ Clicca per incorporare
+ Clicca per inserire l'immagine
+ Didascalia dell'immagine...
+ Scrivi qui...
- Grid Layouts
- Layouts are the overall work area for the grid editor, usually you only need one or two different layouts
- Add Grid Layout
- Adjust the layout by setting column widths and adding additional sections
- Row configurations
- Rows are predefined cells arranged horizontally
- Add row configuration
- Adjust the row by setting cell widths and adding additional cells
+ I Grid Layout
+ I layout sono l'area globale di lavoro per il grid editor, di solito ti serve solo uno o due layout differenti
+ Aggiungi un Grid Layout
+ Sistema il layout impostando la larghezza della colonna ed aggiungendo ulteriori sezioni
+ Configurazioni della riga
+ Le righe sono le colonne predefinite disposte orizzontalmente
+ Aggiungi configurazione della riga
+ Sistema la riga impostando la larghezza della colonna ed aggiungendo ulteriori colonne
- Columns
- Total combined number of columns in the grid layout
+ Colonne
+ Totale combinazioni delle colonne nel grid layout
- Settings
- Configure what settings editors can change
+ Impostazioni
+ Configura le impostazioni che possono essere cambiate dai editori
- Styles
- Configure what styling editors can change
+ Stili
+ Configura i stili che possono essere cambiati dai editori
- Settings will only save if the entered json configuration is valid
+ Le impostazioni verranno salvate soltanto se è valido il json inserito
- Allow all editors
- Allow all row configurations
+ Permetti tutti i editor
+ Permetti tutte le configurazioni della riga
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/nl.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/nl.xml
index d0d90216c7..72ece3d46e 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/nl.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/nl.xml
@@ -172,6 +172,13 @@
DoelDit betekend de volgende tijd op de server:Wat houd dit in?]]>
+ Ben je er zeker van dat je dit item wilt verwijderen?
+ Eigenschap %0% gebruikt editor %1% welke niet wordt ondersteund door Nested Content.
+ Voeg nog een tekstvak toe
+ Verwijder dit tekstvak
+ Content root
+ Deze waarde is verborgen. Indien u toegang nodig heeft om deze waarde te bekijken, contacteer dan uw website administrator.
+ Deze waarde is verborgenKlik om te uploaden
@@ -214,6 +221,7 @@
Negeer wijzigingenWijzigingen niet opgeslagenWeet je zeker dat deze pagina wilt verlaten? - er zijn onopgeslagen wijzigingen
+ Depubliceren zal deze pagina en alle onderliggend paginas verwijderen van de site.Done
@@ -1137,7 +1145,12 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
die gebruik maken van deze editor zullen geupdate worden met deze nieuwe instellingenLid kan bewerken
+ Toestaan dat deze eigenschap kan worden gewijzigd door het lid op zijn profiel pagina.
+ Omvat gevoelige gegevens
+ Verberg deze eigenschap voor de content editor die geen toegang heeft tot het bekijken van gevoelige informatie.Toon in het profiel van leden
+ Toelaten dat deze eigenschap wordt getoond op de profiel pagina van het lid.
+
tab heeft geen sorteervolgorde
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/ru.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/ru.xml
index 8f9fa63244..36a4a8fa01 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/ru.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/ru.xml
@@ -19,6 +19,7 @@
ОтключитьОчистить корзинуВключить
+ ЭкспортЭкспортироватьИмпортироватьИмпортировать пакет
@@ -158,8 +159,9 @@
Вернуться к спискуСохранитьСохранить и построить модели
- Сохранить и опубликовать
- Сохранить и направить на публикацию
+ Опубликовать
+ Запланировать
+ Направить на публикациюСохранить списокВыбратьВыбрать текущую папку
@@ -201,7 +203,20 @@
ЖелтыйОранжевыйСиний
+ Серо-синий
+ Серый
+ Коричневый
+ Светло-синий
+ Голубой
+ Светло-зеленый
+ Лайм
+ Янтарный
+ РыжийКрасный
+ Розовый
+ Лиловый
+ Темно-лиловый
+ ИндигоОб этой странице
@@ -221,6 +236,8 @@
СкрытьВНИМАНИЕ: невозможно получить URL документа (внутренняя ошибка - подробности в системном журнале)Опубликовано
+ Это значение скрыто. Если Вам нужен доступ к просмотру этого значения, свяжитесь с администратором веб-сайта.
+ Это значение скрыто.Этот документ был изменен после публикацииЭтот документ не опубликованДокумент опубликован
@@ -236,19 +253,24 @@
Тип участникаВы уверены, что хотите удалить этот элемент?Свойство '%0%' использует редактор '%1%', который не поддерживается для вложенного содержимого.
+ Не было сделано никаких измененийДата не указанаЗаголовок страницы
+ Этот медиа-элемент не содержит ссылкиДоступные группыСвойстваЭтот документ опубликован, но скрыт, потому что его родительский документ '%0%' не опубликованВНИМАНИЕ: этот документ опубликован, но его нет в глобальном кэше (внутренняя ошибка - подробности в системном журнале)Опубликовать
+ Опубликовано
+ Опубликовано (есть измененения)Состояние публикацииОпубликоватьОчистить датуВНИМАНИЕ: этот документ опубликован, но его URL вступает в противоречие с документом %0%Это время будет соответствовать следующему времени на сервере:Что это означает?]]>
+ Задать датуПорядок сортировки обновленДля сортировки узлов просто перетаскивайте узлы или нажмите на заголовке столбца. Вы можете выбрать несколько узлов, удерживая клавиши "shift" или "ctrl" при пометкеСтатистика
@@ -256,6 +278,7 @@
Заголовок (необязательно)ТипСкрыть
+ РаспубликованоРаспубликоватьПоследняя правкаДата/время редактирования документа
@@ -265,6 +288,10 @@
Добавить новое поле текстаУдалить это поле текста
+
+ Выбран элемент содержимого, который в настоящее время удален или находится в корзине
+ Выбраны элементы содержимого, которые в настоящее время удалены или находятся в корзине
+
КомпозицииВы не добавили ни одной вкладки
@@ -289,6 +316,8 @@
Выбрать дочерний узелУнаследовать вкладки и свойства из уже существующего типа документов. Вкладки будут либо добавлены в создаваемый тип, либо в случае совпадения названий вкладок будут добавлены наследуемые свойства.Этот тип документов уже участвует в композиции другого типа, поэтому сам не может быть композицией.
+ Где используется эта композиция?
+ Эта композиция сейчас используется при создании следующих типов документов:В настоящее время нет типов документов, допустимых для построения композиции.Доступные редакторы
@@ -320,7 +349,11 @@
, использующие этот редактор, будут обновлены с применением этих установокУчастник может изменить
+ Разрешает редактирование значение данного свойства участником в своем профиле
+ Конфеденциальные данные
+ Скрывает значение это свойства от редакторов содержимого, не имеющих доступа к конфеденциальной информацииПоказать в профиле участника
+ Разрешает показ данного свойства в профиле участникадля вкладки не указан порядок сортировки
@@ -447,6 +480,7 @@
Ключ '%0%' уже существует в словаре.
]]>
+ Обзор словаряДопустим как корневой
@@ -565,13 +599,16 @@
ОшибкаНайтиНачало
+ ОбщееГруппыПапкаВысотаСправкаСкрыть
+ ИсторияИконкаИмпорт
+ ИнфоВнутренний отступВставитьУстановить
@@ -581,6 +618,7 @@
ЯзыкКонецМакет
+ СсылкиЗагрузкаБЛОКИРОВКАВойти
@@ -601,6 +639,7 @@
OkОткрытьВкл
+ ВариантыилиСортировка поПароль
@@ -620,6 +659,7 @@
ПолучитьПовторитьРазрешения
+ Публикация по расписаниюПоискК сожалению, ничего подходящего не нашлосьРезультаты поиска
@@ -653,7 +693,8 @@
Сохранение...текущийвыбрано
- Внедрить
+ Встроить
+ ПолучитьЦвет фона
@@ -663,12 +704,12 @@
Текст
- Rich Text Editor
- Image
- Macro
- Embed
- Headline
- Quote
+ Редактор текста
+ Изображение
+ Макрос
+ Встраивание
+ Заголовок
+ ЦитатаДобавить содержимоеСбросить содержимоеДобавить шаблон сетки
@@ -750,9 +791,10 @@
Медиа - всего в XML: %0%, всего: %1%Б с ошибками: %2%Содержимое - всего в XML: %0%, всего опубликовано: %1%, с ошибками: %2%
+ Ошибка проверки адреса URL %0% - '%1%'
+
Сертификат Вашего веб-сайта отмечен как проверенный.Ошибка проверки сертификата: '%0%'
- Ошибка проверки адреса URL %0% - '%1%'Сейчас Вы %0% просматриваете сайт, используя протокол HTTPS.Параметр 'umbracoUseSSL' в секции 'appSetting' установлен в 'false' в файле web.config. Если Вам необходим доступ к сайту по протоколу HTTPS, нужно установить данный параметр в 'true'.Параметр 'umbracoUseSSL' в секции 'appSetting' в файле установлен в '%0%', значения cookies %1% маркированы как безопасные.
@@ -792,11 +834,27 @@
X-Frame-Options, использующийся для управления возможностью помещать сайт в IFRAME на другом сайте.]]>X-Frame-Options, использующийся для управления возможностью помещать сайт в IFRAME на другом сайте, не обнаружен.]]>
- Установить заголовок в файле конфигурацииДобавляет значение в секцию 'httpProtocol/customHeaders' файла web.config, препятствующее возможному использованию этого сайта внутри IFRAME на другом сайте.Значение, добавляющее заголовок, препятствующий использованию этого сайта внутри IFRAME другого сайта, успешно добавлено в файл web.config.
+
+ Установить заголовок в файле конфигурацииНевозможно обновить файл web.config. Ошибка: %0%
+ X-Content-Type-Options, использующиеся для защиты от MIME-уязвимостей, обнаружены.]]>
+ X-Content-Type-Options, использующиеся для защиты от MIME-уязвимостей, не найдены.]]>
+ Добавляет значение в секцию httpProtocol/customHeaders файла web.config, препятствующее использованию MIME-уязвимостей.
+ Значение, добавляющее заголовок, препятствующий использованию MIME-уязвимостей, успешно добавлено в файл web.config.
+
+ Strict-Transport-Security, известный также как HSTS-header, обнаружен.]]>
+ Strict-Transport-Security не найден.]]>
+ Добавляет заголовок 'Strict-Transport-Security' и его значение 'max-age=10886400; preload' в секцию httpProtocol/customHeaders файла web.config. Применяйте этот способ только в случае, если доступ к Вашим сайтам будет осуществляться по протоколу https как минимум ближайшие 18 недель.
+ Заголовок HSTS-header успешно добавлен в файл web.config.
+
+ X-XSS-Protection обнаружен.]]>
+ X-XSS-Protection не найден.]]>
+ Добавляет заголовок 'X-XSS-Protection' и его значение '1; mode=block' в секцию httpProtocol/customHeaders файла web.config.
+ Заголовок X-XSS-Protection успешно добавлен в файл web.config.
+
@@ -966,7 +1024,87 @@
Ссылка, по которой Вы попали сюда, неверна или устарелаUmbraco: сброс пароля
-
Ваше имя пользователя для входа в панель администрирования Umbraco: %0%
Перейдите по этой ссылке для того, чтобы сбросить Ваш пароль, или скопируйте текст ссылки и вставьте в адресную строку своего браузера:
%1%
]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Запрошен сброс пароля
+
+
+ Ваше имя пользователя для входа в административную панель Umbraco: %0%
+
+
+
+ ]]>
@@ -984,6 +1122,11 @@
Максимально допустимый размер файла: Начальный узел медиа
+
+ Выбран медиа-элемент, который в настоящее время удален или находится в корзине
+ Выбраны медиа-элементы, которые в настоящее время удалены или находятся в корзине
+ Удаленный элемент
+
Создать нового участникаВсе участники
@@ -1023,34 +1166,88 @@
Удачи!
Генератор уведомлений Umbraco.
- ]]>
- Здравствуйте, %0%
-
-
Это автоматически сгенерированное уведомление. Операция '%1%'
- была произведена на странице '%2%'
- пользователем '%3%'.
+ Это автоматически сгенерированное сообщение, отправленное, чтобы уведомить Вас о том, что операция '%1%' была выполнена на странице '%2%' пользователем '%3%'
+
+
+
+ ]]>
+ [%0%] Уведомление об операции %1% над документом %2%Уведомления
@@ -1400,6 +1597,8 @@
При разблокировке пользователей произошла ошибка'%0%' сейчас разблокированПри разблокировке пользователя произошла ошибка
+ Данные участника успешно экспортированы в файл
+ Во время экспортирования данных участника произошла ошибкаИспользуется синтаксис селекторов CSS, например: h1, .redHeader, .blueTex
@@ -1672,9 +1871,103 @@
Неудачных попыток входаК профилю пользователяДобавьте пользователя в группу(ы) для задания прав доступа
+ ПригласитьПриглашение в панель администрирования Umbraco
Здравствуйте, %0%,
Вы были приглашены пользователем %1%, и Вам предоставлен доступ в панель администрирования Umbraco.
Сообщение от %1%: %2%
Перейдите по этой ссылке, чтобы принять приглашение.
Если Вы не имеете возможности перейти по ссылке, скопируйте нижеследующий текст ссылки и вставьте в адресную строку Вашего браузера.
%3%
]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Здравствуйте, %0%,
+
+
+ Вы были приглашены пользователем %1% в панель администрирования веб-сайта.
+