diff --git a/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs b/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs
index 79626d1bb..bcd2efd83 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs
@@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Algolia
{
@@ -20,19 +21,19 @@ namespace Squidex.Extensions.Actions.Algolia
ReadMore = "https://www.algolia.com/")]
public sealed class AlgoliaAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Application Id", Description = "The application ID.")]
[DataType(DataType.Text)]
[Formattable]
public string AppId { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Api Key", Description = "The API key to grant access to Squidex.")]
[DataType(DataType.Text)]
[Formattable]
public string ApiKey { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Index Name", Description = "The name of the index.")]
[DataType(DataType.Text)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/AzureQueue/AzureQueueAction.cs b/backend/extensions/Squidex.Extensions/Actions/AzureQueue/AzureQueueAction.cs
index 22919d3ce..f19a4d102 100644
--- a/backend/extensions/Squidex.Extensions/Actions/AzureQueue/AzureQueueAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/AzureQueue/AzureQueueAction.cs
@@ -23,13 +23,13 @@ namespace Squidex.Extensions.Actions.AzureQueue
ReadMore = "https://azure.microsoft.com/en-us/services/storage/queues/")]
public sealed class AzureQueueAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Connection", Description = "The connection string to the storage account.")]
[DataType(DataType.Text)]
[Formattable]
public string ConnectionString { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Queue", Description = "The name of the queue.")]
[DataType(DataType.Text)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs
index 68c03d9fc..e8443a4e6 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs
@@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Comment
{
@@ -19,7 +20,7 @@ namespace Squidex.Extensions.Actions.Comment
Description = "Create a comment for a content event.")]
public sealed class CommentAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Text", Description = "The comment text.")]
[DataType(DataType.MultilineText)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/Discourse/DiscourseAction.cs b/backend/extensions/Squidex.Extensions/Actions/Discourse/DiscourseAction.cs
index 3c87cec0b..d9b210472 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Discourse/DiscourseAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Discourse/DiscourseAction.cs
@@ -23,22 +23,22 @@ namespace Squidex.Extensions.Actions.Discourse
public sealed class DiscourseAction : RuleAction
{
[AbsoluteUrl]
- [Required]
+ [LocalizedRequired]
[Display(Name = "Server Url", Description = "The url to the discourse server.")]
[DataType(DataType.Url)]
public Uri Url { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Api Key", Description = "The api key to authenticate to your discourse server.")]
[DataType(DataType.Text)]
public string ApiKey { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Api User", Description = "The api username to authenticate to your discourse server.")]
[DataType(DataType.Text)]
public string ApiUsername { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Text", Description = "The text as markdown.")]
[DataType(DataType.MultilineText)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs b/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs
index 9bc853863..115f6ea77 100644
--- a/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs
@@ -23,12 +23,12 @@ namespace Squidex.Extensions.Actions.ElasticSearch
public sealed class ElasticSearchAction : RuleAction
{
[AbsoluteUrl]
- [Required]
+ [LocalizedRequired]
[Display(Name = "Server Url", Description = "The url to the elastic search instance or cluster.")]
[DataType(DataType.Url)]
public Uri Host { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Index Name", Description = "The name of the index.")]
[DataType(DataType.Text)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/Email/EmailAction.cs b/backend/extensions/Squidex.Extensions/Actions/Email/EmailAction.cs
index bd7c88856..187549a7a 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Email/EmailAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Email/EmailAction.cs
@@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Email
{
@@ -20,51 +21,51 @@ namespace Squidex.Extensions.Actions.Email
ReadMore = "https://en.wikipedia.org/wiki/Email")]
public sealed class EmailAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Server Host", Description = "The IP address or host to the SMTP server.")]
[DataType(DataType.Text)]
public string ServerHost { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Server Port", Description = "The port to the SMTP server.")]
[DataType(DataType.Text)]
public int ServerPort { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Use SSL", Description = "Specify whether the SMPT client uses Secure Sockets Layer (SSL) to encrypt the connection.")]
[DataType(DataType.Text)]
public bool ServerUseSsl { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Username", Description = "The username for the SMTP server.")]
[DataType(DataType.Text)]
[Formattable]
public string ServerUsername { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Password", Description = "The password for the SMTP server.")]
[DataType(DataType.Password)]
public string ServerPassword { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "From Address", Description = "The email sending address.")]
[DataType(DataType.Text)]
[Formattable]
public string MessageFrom { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "To Address", Description = "The email message will be sent to.")]
[DataType(DataType.Text)]
[Formattable]
public string MessageTo { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Subject", Description = "The subject line for this email message.")]
[DataType(DataType.Text)]
[Formattable]
public string MessageSubject { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Body", Description = "The message body.")]
[DataType(DataType.MultilineText)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/Fastly/FastlyAction.cs b/backend/extensions/Squidex.Extensions/Actions/Fastly/FastlyAction.cs
index 84ed66081..048a0ab98 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Fastly/FastlyAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Fastly/FastlyAction.cs
@@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Fastly
{
@@ -20,12 +21,12 @@ namespace Squidex.Extensions.Actions.Fastly
ReadMore = "https://www.fastly.com/")]
public sealed class FastlyAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Api Key", Description = "The API key to grant access to Squidex.")]
[DataType(DataType.Text)]
public string ApiKey { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Service Id", Description = "The ID of the fastly service.")]
[DataType(DataType.Text)]
public string ServiceId { get; set; }
diff --git a/backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaAction.cs b/backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaAction.cs
index 7703544ec..9b29d3334 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaAction.cs
@@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Kafka
{
@@ -20,7 +21,7 @@ namespace Squidex.Extensions.Actions.Kafka
ReadMore = "https://kafka.apache.org/quickstart")]
public sealed class KafkaAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Topic Name", Description = "The name of the topic.")]
[DataType(DataType.Text)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/Medium/MediumAction.cs b/backend/extensions/Squidex.Extensions/Actions/Medium/MediumAction.cs
index 308a4bc6d..5673ecf42 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Medium/MediumAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Medium/MediumAction.cs
@@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Medium
{
@@ -20,18 +21,18 @@ namespace Squidex.Extensions.Actions.Medium
ReadMore = "https://medium.com/")]
public sealed class MediumAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Access Token", Description = "The self issued access token.")]
[DataType(DataType.Text)]
public string AccessToken { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Title", Description = "The title, used for the url.")]
[DataType(DataType.Text)]
[Formattable]
public string Title { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Content", Description = "The content, either html or markdown.")]
[DataType(DataType.MultilineText)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/Notification/NotificationAction.cs b/backend/extensions/Squidex.Extensions/Actions/Notification/NotificationAction.cs
index 839d24d35..04769ac28 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Notification/NotificationAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Notification/NotificationAction.cs
@@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Notification
{
@@ -19,12 +20,12 @@ namespace Squidex.Extensions.Actions.Notification
Description = "Send an integrated notification to a user.")]
public sealed class NotificationAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "User", Description = "The user id or email.")]
[DataType(DataType.Text)]
public string User { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Title", Description = "The text to send.")]
[DataType(DataType.MultilineText)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/Prerender/PrerenderAction.cs b/backend/extensions/Squidex.Extensions/Actions/Prerender/PrerenderAction.cs
index f0e0a2c2e..b379f12b7 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Prerender/PrerenderAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Prerender/PrerenderAction.cs
@@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Prerender
{
@@ -20,13 +21,13 @@ namespace Squidex.Extensions.Actions.Prerender
ReadMore = "https://prerender.io")]
public sealed class PrerenderAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Token", Description = "The prerender token from your account.")]
[DataType(DataType.Text)]
[Formattable]
public string Token { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Url", Description = "The url to recache.")]
[DataType(DataType.Text)]
public string Url { get; set; }
diff --git a/backend/extensions/Squidex.Extensions/Actions/Slack/SlackAction.cs b/backend/extensions/Squidex.Extensions/Actions/Slack/SlackAction.cs
index a67c745f8..7ace5f48d 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Slack/SlackAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Slack/SlackAction.cs
@@ -23,12 +23,12 @@ namespace Squidex.Extensions.Actions.Slack
public sealed class SlackAction : RuleAction
{
[AbsoluteUrl]
- [Required]
+ [LocalizedRequired]
[Display(Name = "Webhook Url", Description = "The slack webhook url.")]
[DataType(DataType.Text)]
public Uri WebhookUrl { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Text", Description = "The text that is sent as message to slack.")]
[DataType(DataType.MultilineText)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/Twitter/TweetAction.cs b/backend/extensions/Squidex.Extensions/Actions/Twitter/TweetAction.cs
index 7dcfc4a43..4e6baa014 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Twitter/TweetAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Twitter/TweetAction.cs
@@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Twitter
{
@@ -20,17 +21,17 @@ namespace Squidex.Extensions.Actions.Twitter
ReadMore = "https://twitter.com")]
public sealed class TweetAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Access Token", Description = " The generated access token.")]
[DataType(DataType.Text)]
public string AccessToken { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Access Secret", Description = " The generated access secret.")]
[DataType(DataType.Text)]
public string AccessSecret { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Name = "Text", Description = "The text that is sent as tweet to twitter.")]
[DataType(DataType.MultilineText)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Actions/Webhook/WebhookAction.cs b/backend/extensions/Squidex.Extensions/Actions/Webhook/WebhookAction.cs
index 37a3437df..954c74a2d 100644
--- a/backend/extensions/Squidex.Extensions/Actions/Webhook/WebhookAction.cs
+++ b/backend/extensions/Squidex.Extensions/Actions/Webhook/WebhookAction.cs
@@ -9,6 +9,7 @@ using System;
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Webhook
{
@@ -21,7 +22,7 @@ namespace Squidex.Extensions.Actions.Webhook
ReadMore = "https://en.wikipedia.org/wiki/Webhook")]
public sealed class WebhookAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Url", Description = "The url to the webhook.")]
[DataType(DataType.Text)]
[Formattable]
diff --git a/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj b/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj
index 085cb64aa..45cd0db46 100644
--- a/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj
+++ b/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj
@@ -8,14 +8,15 @@
-
+
-
+
-
-
+
+
+
diff --git a/backend/i18n/frontend_en.json b/backend/i18n/frontend_en.json
index d0cd7e5d7..e4c1487ea 100644
--- a/backend/i18n/frontend_en.json
+++ b/backend/i18n/frontend_en.json
@@ -90,6 +90,8 @@
"assets.searchByName": "Search by name",
"assets.searchByTags": "Search by tags",
"assets.selectMany": "Select assets",
+ "assets.specialFolder.parent": "",
+ "assets.specialFolder.root": "Assets",
"assets.tabFocusPoint": "Focus Point",
"assets.tabHistory": "History",
"assets.tabImage": "Image",
@@ -273,6 +275,16 @@
"common.preview": "Preview",
"common.product": "Squidex Headless CMS",
"common.project": "Project",
+ "common.queryOperators.contains": "contains",
+ "common.queryOperators.empty": "is empty",
+ "common.queryOperators.endsWith": "ends with",
+ "common.queryOperators.eq": "is equals to",
+ "common.queryOperators.ge": "is greater than or equals to",
+ "common.queryOperators.gt": "is greater than",
+ "common.queryOperators.le": "is less than pr equals to",
+ "common.queryOperators.lt": "is less than",
+ "common.queryOperators.ne": "is not equals to",
+ "common.queryOperators.startsWith": "starts with",
"common.refresh": "Refresh",
"common.rename": "Rename",
"common.requiredHint": "required",
@@ -347,6 +359,7 @@
"contents.draftStatus": "New Version",
"contents.editPageTitle": "Edit Content",
"contents.editTitle": "Edit Content",
+ "contents.invariantFieldDescription": "The '{fieldName}' field of the content item.",
"contents.languageModeAll": "All Languages",
"contents.languageModeSingle": "Single Language",
"contents.lastModifiedByFieldDescription": "The user who modified the content item the last time.",
@@ -357,6 +370,7 @@
"contents.loadDataFailed": "Failed to load data. Please reload.",
"contents.loadFailed": "Failed to load contents. Please reload.",
"contents.loadVersionFailed": "Failed to version a new version. Please reload.",
+ "contents.localizedFieldDescription": "The '{fieldName}' field of the content item (localized).",
"contents.newStatusFieldDescription": "The new status of the content item.",
"contents.noReference": "- No Reference -",
"contents.pendingChangesTextToChange": "You have unsaved changes.\n\nWhen you change the status you will loose them.\n\n**Do you want to continue anyway?**",
@@ -383,6 +397,16 @@
"contents.statusQueries": "Status Queries",
"contents.stockPhotoEmpty": "Nothing selected",
"contents.stockPhotoSearch": "Search for Photos by Unsplash",
+ "contents.tableHeaders.created": "Created",
+ "contents.tableHeaders.createdBy": "Created By",
+ "contents.tableHeaders.createdByShort": "By",
+ "contents.tableHeaders.id": "Id",
+ "contents.tableHeaders.lastModified": "Updated",
+ "contents.tableHeaders.lastModifiedBy": "Updated By",
+ "contents.tableHeaders.lastModifiedByShort": "By",
+ "contents.tableHeaders.nextStatus": "Next Status",
+ "contents.tableHeaders.status": "Status",
+ "contents.tableHeaders.version": "Version",
"contents.unsavedChangesText": "You have unsaved changes. Do you want to load them now?",
"contents.unsavedChangesTitle": "Unsaved changes",
"contents.updated": "Content updated successfully.",
diff --git a/backend/i18n/frontend_it.json b/backend/i18n/frontend_it.json
new file mode 100644
index 000000000..78a52c4f3
--- /dev/null
+++ b/backend/i18n/frontend_it.json
@@ -0,0 +1,888 @@
+{
+ "api.contentApi": "Content API",
+ "api.generalApi": "General API",
+ "api.graphql": "GraphQL",
+ "api.graphqlPageTitle": "GraphQL",
+ "api.pageTitle": "API",
+ "api.title": "API",
+ "apps.allApps": "Tutte le Apps",
+ "apps.appLoadFailed": "Non è stato possibile caricare l'App. Per favore ricarica.",
+ "apps.appNameHint": "Puoi utilizzare solo lettere, numeri e trattini e non più di 40 caratteri.",
+ "apps.appNameValidationMessage": "Il nome può contenere lettere minuscole (a-z), numeri e trattini all'interno.",
+ "apps.appNameWarning": "Il nome della app non potrà essere cambiato in un secondo momento.",
+ "apps.appsButtonCreate": "Panoramica delle App",
+ "apps.appsButtonFallbackTitle": "Panoramica delle App",
+ "apps.archieve": "Archivia l'App",
+ "apps.archieveConfirmText": "Rimuovi il pattern",
+ "apps.archieveConfirmTitle": "Sei sicuro di voler archiviare questa app?",
+ "apps.archieveWarning": "Una volta archiviata una App, non è possibile tornare indietro. Sii certo.",
+ "apps.archiveFailed": "Non è stato possibile archiviare l'app. Per favore ricarica.",
+ "apps.create": "Crea un'App",
+ "apps.createBlankApp": "Nuova App.",
+ "apps.createBlankAppDescription": "Crea una app vuota senza contenuti o schema.",
+ "apps.createBlogApp": "Nuovo esempio di blog",
+ "apps.createBlogAppDescription": "Inizia con il nostro blog già pronto per l'uso.",
+ "apps.createFailed": "Non è stato possibile creare l'app. Per favore ricarica.",
+ "apps.createIdentityApp": "New Identity App",
+ "apps.createIdentityAppDescription": "Crea un app per Squidex Identity.",
+ "apps.createIdentityAppV2": "Nuova Identity App V2",
+ "apps.createIdentityAppV2Description": "Creare un app per Squidex Identity V2.",
+ "apps.createProfileApp": "Nuovo esempio di Profilo",
+ "apps.createProfileAppDescription": "Crea la tua pagina del profilo.",
+ "apps.createWithTemplate": "Create un esempio di {template}",
+ "apps.empty": "Non stai ancora collaborando su nessuna app",
+ "apps.generalSettings": "Generale",
+ "apps.generalSettingsDangerZone": "Generale",
+ "apps.image": "Immagine",
+ "apps.imageDrop": "Trascina il file per caricare",
+ "apps.listPageTitle": "App",
+ "apps.loadFailed": "Non è stato possibile caricare le App. Per favore ricarica.",
+ "apps.removeImage": "Rimuovi l'immagine",
+ "apps.removeImageFailed": "Non è stato possibile rimuovere l'immagine dell'app. Per favore ricarica.",
+ "apps.updateFailed": "Non è stato possibile aggiornare l'app. Per favore ricarica.",
+ "apps.upgradeHintCurrent": "Tu sei nel piano {plan}.",
+ "apps.upgradeHintUpgrade": "Aggiorna!",
+ "apps.uploadImage": "Trascina il file per sostituire l'immagine dell'app. Utilizza una dimensione quadrata.",
+ "apps.uploadImageButton": "Carica il File",
+ "apps.uploadImageFailed": "Non è stato possibile caricare l'immagine. Per favore ricarica.",
+ "apps.uploadImageTooBig": "L'immagine dell'app è troppo grande.",
+ "apps.welcomeSubtitle": "Benvenuto su Squidex.",
+ "apps.welcomeTitle": "Ciao {user}",
+ "assets.createFolder": "Crea cartella",
+ "assets.createFolderFailed": "Non è stato possibile creare la cartella degli asset. Per favore ricarica.",
+ "assets.createFolderTooltip": "Crea una nuova cartella (CTRL + SHIFT + G)",
+ "assets.deleteConfirmText": "Sei sicuro di voler cancellare la risorsa?",
+ "assets.deleteConfirmTitle": "Elimina la risorsa",
+ "assets.deleteFailed": "Non è stato possibile cancellare la risorsa. Per favore ricarica.",
+ "assets.deleteFolderConfirmText": "Sei sicuro di voler cancellare la cartella e tutte le risorse associati?",
+ "assets.deleteFolderConfirmTitle": "Elimina la cartella",
+ "assets.deleteMetadataConfirmText": "Sei sicuro di voler rimuovere questi metadati?",
+ "assets.deleteMetadataConfirmTitle": "Rimuovi metadati",
+ "assets.downloadVersion": "Scarica questa versione",
+ "assets.dropToUpdate": "Trascina il file per aggiornare",
+ "assets.duplicateFile": "La risorsa è già stata caricata.",
+ "assets.editor.flipHorizontally": "Capovolgi orizzontalmente",
+ "assets.editor.flipVertically": "Capovolgi verticalmente",
+ "assets.editor.focusPointLabel": "Clicca sull'immagine per impostare il focus",
+ "assets.editor.focusPointPreview": "Anteprima delle diverse dimensioni",
+ "assets.editor.rotateLeft": "Ruota a sinistra",
+ "assets.editor.rotateRight": "Ruota a destra",
+ "assets.fileTooBig": "La risorsa è troppo grande.",
+ "assets.folderName": "Nome della cartella",
+ "assets.folderNameHint": "Il nome della cartella viene usato solo per la visualizzazione e può non essere univoco.",
+ "assets.insertAssets": "Inserisci le risorse",
+ "assets.linkSelected": "Collega le risorse selezionate ({count})",
+ "assets.listPageTitle": "Risorse",
+ "assets.loadFailed": "Non è stato possibile caricare le risorse. Per favore ricarica.",
+ "assets.loadFoldersFailed": "Non è stato possibile caricare le cartelle delle risorse. Per favore ricarica.",
+ "assets.metadata": "Metadati",
+ "assets.metadataAdd": "Aggiungi i Metadati",
+ "assets.moveFailed": "Non è stato possibile spostare la risorsa. Per favore ricarica.",
+ "assets.protected": "Protetto",
+ "assets.refreshTooltip": "Aggiorna le risorse (CTRL + SHIFT + R)",
+ "assets.reloaded": "Risorse ricaricate.",
+ "assets.removeConfirmText": "Do you really want to remove the asset?",
+ "assets.removeConfirmTitle": "Remove asset",
+ "assets.renameFolder": "Rinomina la cartella",
+ "assets.replaceConfirmText": "Sei sicuro di voler sostituire la risorsa con una nuova versione?",
+ "assets.replaceConfirmTitle": "Sostituisco la risorsa?",
+ "assets.replaceFailed": "Non è stato possibile sostituire la risorsa. Per favore ricarica.",
+ "assets.searchByName": "Ricerca per nome",
+ "assets.searchByTags": "Ricerca per tag",
+ "assets.selectMany": "Seleziona le risorse",
+ "assets.specialFolder.parent": "",
+ "assets.specialFolder.root": "Assets",
+ "assets.tabFocusPoint": "Punto focale",
+ "assets.tabHistory": "Cronologia",
+ "assets.tabImage": "Immagine",
+ "assets.tabMetadata": "Metadati",
+ "assets.updated": "La risorsa è stata aggiornata.",
+ "assets.updateFailed": "Non è stato possibile aggiornare la risorsa. Per favore ricarica.",
+ "assets.updateFolderFailed": "Non è stato possibile aggiornare la cartella delle risorse. Per favore ricarica.",
+ "assets.uploadByDialog": "Seleziona il(i) File",
+ "assets.uploadByDrop": "Trascina i file qui per il caricamento",
+ "assets.uploaderUploadHere": "Nessun caricamento in corso, trascina qui i file.",
+ "assets.uploadFailed": "Non è stato possibile caricare la risorsa. Per favore ricarica.",
+ "assets.uploadHint": "Trascina il file sull'elemento esistente per poterlo sostituire con una versione più recente.",
+ "backups.backupCountAssetsLabel": "Risorse",
+ "backups.backupCountAssetsTooltip": "Risorse archiviate",
+ "backups.backupCountEventsLabel": "Eventi",
+ "backups.backupCountEventsTooltip": "Eventi archiviati",
+ "backups.backupDownload": "Scarica",
+ "backups.backupDownloadLink": "Pronto",
+ "backups.backupDuration": "Durata",
+ "backups.deleteConfirmText": "Sei sicuro di voler cancellare il backup?",
+ "backups.deleteConfirmTitle": "Cancella il backup",
+ "backups.deleted": "Il backup sta per essere cancellato.",
+ "backups.deleteFailed": "Non è stato possibile cancellare il backup.",
+ "backups.empty": "Nessun backup è stato ancora creato.",
+ "backups.loadFailed": "Non è stato possibile caricare i backup.",
+ "backups.maximumReached": "Hai raggiunto il numero massimo di backup: 10.",
+ "backups.refreshTooltip": "Aggiorna i backup (CTRL + SHIFT + R)",
+ "backups.reloaded": "Backup aggiornati.",
+ "backups.restore": "Backup ripristinato",
+ "backups.restoreFailed": "Non è stato possibile avviare il ripristino.",
+ "backups.restoreLastStatus": "Ultima operazione di ripristino",
+ "backups.restoreLastUrl": "Url per il backup",
+ "backups.restoreNewAppName": "Nome dell'app opzionale",
+ "backups.restorePageTitle": "Ripristinare il Backup",
+ "backups.restoreStarted": "Ripristino avviato, il suo completamento potrebbe richiedere alcuni minuti.",
+ "backups.restoreStartedLabel": "Avviato",
+ "backups.restoreStoppedLabel": "Fermato",
+ "backups.restoreTitle": "Ripristinare il Backup",
+ "backups.start": "Avvia Backup",
+ "backups.started": "Backup avviato, il suo completamento potrebbe richiedere alcuni minuti.",
+ "backups.startedLabel": "Avviato",
+ "backups.startFailed": "Non è stato possibile avviare il backup.",
+ "clients.add": "Aggiungi un Client",
+ "clients.addFailed": "Non è stato possibile aggiungere un client. Per favore ricarica.",
+ "clients.allowAnonymous": "Consenti l'accesso anonimo.",
+ "clients.allowAnonymousHint": "Consenti l'accesso alle API senza token di accesso a tutte le risorse che sono configurate per il ruolo di questo client. E' possibile avere un solo client impostato con accesso anonimo.",
+ "clients.apiCallsLimit": "Max API Calls",
+ "clients.apiCallsLimitHint": "Limit the number of API calls this client can make per month to protect your API contingent for other clients that are more important.",
+ "clients.clientIdValidationMessage": "Il nome deve contenere solo lettere, numeri, trattini e spaziNa.",
+ "clients.clientNamePlaceholder": "Inserisci il nome del client",
+ "clients.connect": "Connettere",
+ "clients.connectWizard.cli": "Connettere con la Squidex CLI",
+ "clients.connectWizard.cliHint": "Scarica a CLI e collega questa app per iniziare il backup, sincronizzare gli schema ed esportare i contenuti.",
+ "clients.connectWizard.cliStep1": "Prendi l'ultima versione della Squidex CLI",
+ "clients.connectWizard.cliStep1Download": "[Scarica la CLI da Github](https://github.com/Squidex/squidex-samples/releases)",
+ "clients.connectWizard.cliStep1Hint": "Le release contengono file binari per tutte le operazioni di sistema maggiori e piccoli file da scariscare se hai installato il Core .NET Core.",
+ "clients.connectWizard.cliStep2": "Inserisci `` per impostare la variabile `$PATH`",
+ "clients.connectWizard.cliStep3": "Inserisci il nome della tua app per la configurazione della CLI",
+ "clients.connectWizard.cliStep3Hint": "E' possibile gestire le configurazionie per le diverse appi all'interno della CLI e passare ad un'app.",
+ "clients.connectWizard.cliStep4": "Passa alla tua app usando CLI",
+ "clients.connectWizard.manually": "Connetti manualmente",
+ "clients.connectWizard.manuallyHint": "Leggi le istruzioni su come stabilire una connessione utilizzando Postman o curl.",
+ "clients.connectWizard.manuallyStep1": "Ottenere un tocket usando curl",
+ "clients.connectWizard.manuallyStep2": "Utilizza il seguente token",
+ "clients.connectWizard.manuallyStep3": "Aggiungi il tocken come header HTTP header a tutte le richieste",
+ "clients.connectWizard.manuallyTokenHint": "Solitamente i Token scadono dopo 30 giorni, ma puoi richiedere token multipli.",
+ "clients.connectWizard.postManDocs": "Per il tutorial Postman inizia da questo link [Documentazione](https://docs.squidex.io/02-documentation/developer-guides/api-overview/postman).",
+ "clients.connectWizard.sdk": "Connetti la tua APP utilizzando SDK",
+ "clients.connectWizard.sdkHelp": "Hai bisogno di un altro SDK?",
+ "clients.connectWizard.sdkHelpLink": "Contattaci nel Forum di assistenza",
+ "clients.connectWizard.sdkHint": "Scarica l'SDK e connetti quest'app.",
+ "clients.connectWizard.sdkStep1": "Installa .NET SDK",
+ "clients.connectWizard.sdkStep1Download": "L'SDK è disponibile su [nuget](https://www.nuget.org/packages/Squidex.ClientLibrary/)",
+ "clients.connectWizard.sdkStep2": "Crea un client manager",
+ "clients.connectWizard.step0Title": "Setup client",
+ "clients.connectWizard.step1Title": "Scegli la tipologia di connessione",
+ "clients.connectWizard.step2Title": "Collega",
+ "clients.deleteConfirmText": "Sei sicuro di voler rimuovere il client?",
+ "clients.deleteConfirmTitle": "Rimuovere il client",
+ "clients.empty": "Nessun client ancora creato.",
+ "clients.loadFailed": "Non è stato possibile caricare i client. Per favore ricarica.",
+ "clients.refreshTooltip": "Agigorna i client (CTRL + SHIFT + R)",
+ "clients.reloaded": "Client ricaricati.",
+ "clients.revokeFailed": "Non è stato possibile rimuovere il client. Per favore ricarica.",
+ "clients.tokenFailed": "Non è stato possibile creare il token. Per favore riprova.",
+ "comments.create": "Creare un commento",
+ "comments.createFailed": "Non è stato possibile creare un commento.",
+ "comments.deleteConfirmText": "Sei sicuro di voler cancellare il commmento?",
+ "comments.deleteConfirmTitle": "Cancella il comment",
+ "comments.deleteFailed": "Non è stato possibile cancellare il commento.",
+ "comments.follow": "Segui",
+ "comments.loadFailed": "Non è stato possibile caricare i commenti.",
+ "comments.title": "Commenti",
+ "comments.updateFailed": "Non è stato possibile aggiornare il commento.",
+ "common.actions": "Azioni",
+ "common.administration": "Amministrazione",
+ "common.administrationPageTitle": "Amministrazione",
+ "common.api": "API",
+ "common.apps": "App",
+ "common.aspectRatio": "Proporzioni",
+ "common.assets": "Risorse",
+ "common.back": "Indietro",
+ "common.backups": "Backup",
+ "common.bytes": "byte",
+ "common.cancel": "Annulla",
+ "common.clear": "Pulisci",
+ "common.clientId": "Id Client",
+ "common.clients": "Client",
+ "common.clientSecret": "Secret Client",
+ "common.clipboardAdded": "Il valore è stato aggiunto nei tuoi appunti.",
+ "common.clone": "Clona",
+ "common.cluster": "Raggruppamento",
+ "common.clusterPageTitle": "Raggruppamento",
+ "common.comments": "Commenti",
+ "common.confirm": "Conferma",
+ "common.consumers": "Utenti",
+ "common.content": "Contentenuto",
+ "common.contents": "Contentenuti",
+ "common.continue": "Continua",
+ "common.contributors": "Collaboratori",
+ "common.create": "Crea",
+ "common.created": "Creato",
+ "common.date": "Data",
+ "common.dateTimeEditor.local": "Local",
+ "common.dateTimeEditor.now": "Data e Ora attuale",
+ "common.dateTimeEditor.nowTooltip": "Imposta la data e l'ora attuale (UTC)",
+ "common.dateTimeEditor.today": "Oggi",
+ "common.dateTimeEditor.todayTooltip": "Imposta la data di oggi (UTC)",
+ "common.dateTimeEditor.utc": "UTC",
+ "common.delete": "Cancella",
+ "common.description": "Descrizione",
+ "common.displayName": "Nome visualizzato",
+ "common.edit": "Modifica",
+ "common.email": "Email",
+ "common.error": "Errore",
+ "common.errorBack": "Torna alla pagina precedente.",
+ "common.errorNoPermission": "Non hai i permessi per questo.",
+ "common.errorNotFound": "Non trovato",
+ "common.event": "Evento",
+ "common.events": "Eventi",
+ "common.executed": "Eseguito",
+ "common.expertMode": "Modalità esperto",
+ "common.failed": "Fallito",
+ "common.fallback": "Alternativa",
+ "common.field": "Campo",
+ "common.files": "Campi",
+ "common.filters": "Filtri",
+ "common.folders": "Cartelle",
+ "common.generalSettings": "Impostazioni generali",
+ "common.generate": "Genera",
+ "common.github": "Github",
+ "common.height": "Altezza",
+ "common.help": "Aiuto",
+ "common.helpTour": "Fare clic sull'icona della guida per mostrare una pagina della guida specifica per questo contesto. Vai a",
+ "common.hide": "Nascondi",
+ "common.hints": "Suggerimenti",
+ "common.history": "Cronologia",
+ "common.httpConflict": "Non è stato possibile effettuare l'aggiornamento. Un altro utente ha fatto delle modifiche. Per favore ricarica.",
+ "common.httpLimit": "Hai superato il limite massimo di chiamate API.",
+ "common.label": "Etichetta",
+ "common.languages": "Lingue",
+ "common.latitudeShort": "Lat",
+ "common.loading": "Caricamento",
+ "common.logout": "Esci",
+ "common.logs": "Log",
+ "common.longitudeShort": "Lon",
+ "common.mapHide": "Nascondi la mappa",
+ "common.mapShow": "Mostra la mappa",
+ "common.message": "Messaggio",
+ "common.name": "Nome",
+ "common.no": "No",
+ "common.nothingChanged": "Non è stato cambiato niente.",
+ "common.noValue": "- Nessun valore -",
+ "common.or": "o",
+ "common.pagerInfo": "{itemFirst}-{itemLast} of {numberOfItems}",
+ "common.password": "Password",
+ "common.passwordConfirm": "Conferma Password",
+ "common.pattern": "Pattern",
+ "common.patterns": "Pattern",
+ "common.permissions": "Permessi",
+ "common.preview": "Anteprima",
+ "common.product": "Squidex Headless CMS",
+ "common.project": "Progetto",
+ "common.queryOperators.contains": "contains",
+ "common.queryOperators.empty": "is empty",
+ "common.queryOperators.endsWith": "ends with",
+ "common.queryOperators.eq": "is equals to",
+ "common.queryOperators.ge": "is greater than or equals to",
+ "common.queryOperators.gt": "is greater than",
+ "common.queryOperators.le": "is less than pr equals to",
+ "common.queryOperators.lt": "is less than",
+ "common.queryOperators.ne": "is not equals to",
+ "common.queryOperators.startsWith": "starts with",
+ "common.refresh": "Aggiorna",
+ "common.rename": "Rinomina",
+ "common.requiredHint": "obbligatorio",
+ "common.reset": "Reimposta",
+ "common.restore": "Ripristina",
+ "common.role": "Ruolo",
+ "common.roles": "Ruoli",
+ "common.rules": "Regole",
+ "common.sampleCodeLabel": "Esempio di codice per",
+ "common.save": "Salva",
+ "common.saveShortcut": "CTRL + S",
+ "common.schemas": "Schemi",
+ "common.searchGoogleMaps": "Cerca su Google Maps",
+ "common.searchResults": "Risultati di ricerca",
+ "common.separateByLine": "Separato dalla linea",
+ "common.settings": "Impostazioni",
+ "common.sidebarTour": "La barra di navigazione laterale contiene specifici utili collegamenti per il contesto. Qui puoi visualizzare la cronologia dei cambiamenti di questo schema.",
+ "common.slug": "Slug",
+ "common.stars.max": "Non deve avere più di 15 stelle",
+ "common.status": "Stato",
+ "common.statusChangeTo": "Cambia in",
+ "common.submit": "Invia",
+ "common.subscription": "Abbonamenti",
+ "common.succeeded": "Successo",
+ "common.tagAdd": ", aggiungi al tag",
+ "common.tagAddReference": ", aggiungi al collegamento",
+ "common.tagAddSchema": ", aggiungi allo schema",
+ "common.tags": "Tag",
+ "common.tagsAll": "Tutti i tag",
+ "common.time": "Ora",
+ "common.update": "Aggiorna",
+ "common.url": "URL",
+ "common.users": "Utenti",
+ "common.value": "Valore",
+ "common.width": "Larghezza",
+ "common.workflow": "Workflow",
+ "common.workflows": "Workflow",
+ "common.yes": "Si",
+ "contents.arrayAddItem": "Aggiungi un elemento",
+ "contents.arrayCloneItem": "Clona questo elemento",
+ "contents.arrayCollapseAll": "Comprimi tutti gli elementi",
+ "contents.arrayCollapseItem": "Comprimi l'elemento",
+ "contents.arrayExpandAll": "Espandi tutti gli elementi",
+ "contents.arrayExpandItem": "Espandi questo elemento",
+ "contents.arrayMoveBottom": "Sposta questo elemento in basso",
+ "contents.arrayMoveDown": "Sposta giù questo elemento ",
+ "contents.arrayMoveTop": "Sposta in cima questo elemento",
+ "contents.arrayMoveUp": "Sposta su questo elemento",
+ "contents.arrayNoFields": "Aggiungi un primo campo annidato agli elementi.",
+ "contents.assetsUpload": "Trascina i file o clicca",
+ "contents.autotranslate": "Traduci in automatico dalla lingua principale",
+ "contents.changeStatusTo": "Cambia l'elemeto(i) del contenuti in {action}",
+ "contents.changeStatusToImmediately": "Imposta {action} immediatamente.",
+ "contents.changeStatusToLater": "Imposta {action} ad una data e ora successiva.",
+ "contents.contentNotValid": "Un elemento del contenuto non è valido, verifica il campo con la barra rossa per tutte le lingue impostate (se presenti).",
+ "contents.create": "Nuovo",
+ "contents.createContentTooltip": "Nuovo contenuto (CTRL + SHIFT + G)",
+ "contents.created": "Contenuto creato con successo.",
+ "contents.createdByFieldDescription": "L'utente che ha creato l'elemento del contenuto.",
+ "contents.createFailed": "Non è stato possibile creare il contenuto. Per favore ricarica.",
+ "contents.createFieldDescription": "La data e l'ora di creazione del contenuto.",
+ "contents.createPageTitle": "Crea un contenuto",
+ "contents.createTitle": "Nuovo Contenuto",
+ "contents.currentStatusLabel": "Versione corrente",
+ "contents.deleteConfirmText": "Sei sicuro di voler eliminare il contenuto?",
+ "contents.deleteConfirmTitle": "Elimina il contenuto",
+ "contents.deleteFailed": "Non è stato possibile eliminare il contenuto. Per favore ricarica.",
+ "contents.deleteManyConfirmText": "Sei sicuro di voler eliminare gli elementi del contenuto selezionati?",
+ "contents.deleteVersionConfirmText": "Do you really want to delete this version?",
+ "contents.deleteVersionFailed": "Non è stato possibile eliminare la versione. Per favore ricarica.",
+ "contents.draftNew": "Nuova bozza",
+ "contents.draftStatus": "Nuova versione",
+ "contents.editPageTitle": "Modifica contenuto",
+ "contents.editTitle": "Modifica il contenuto",
+ "contents.invariantFieldDescription": "The '{fieldName}' field of the content item.",
+ "contents.languageModeAll": "Tutte le lingue",
+ "contents.languageModeSingle": "Una sola lingua",
+ "contents.lastModifiedByFieldDescription": "L'utente che ha modificato l'elememto l'ultima voltaThe user who modified the content item the last time.",
+ "contents.lastModifiedFieldDescription": "La data e l'ora dell'ultima modifica del contenuto.",
+ "contents.lastUpdatedLabel": "Ultimo aggiornamento",
+ "contents.loadContent": "Carica",
+ "contents.loadContentFailed": "Non è stato possibile caricare il contenuto. Per favore ricarica.",
+ "contents.loadDataFailed": "Non è stato possibile caricare i dati. Per favore ricarica.",
+ "contents.loadFailed": "Non è stato possibile caricare i contenuti. Per favore ricarica.",
+ "contents.loadVersionFailed": "Non è stato possibile version a new version. Per favore ricarica.",
+ "contents.localizedFieldDescription": "The '{fieldName}' field of the content item (localized).",
+ "contents.newStatusFieldDescription": "The new status of the content item.",
+ "contents.noReference": "- Nessun collegamento -",
+ "contents.pendingChangesTextToChange": "Non hai salvato le modifiche.\n\nSe cambi lo stato perderai le modifiche.\n\n**Sei sicuro di voler continuare?**",
+ "contents.pendingChangesTextToClose": "Non hai salvato le modifiche.\n\nChiudendo il contenuto corrente perderai tutte le modifiche.\n\n**Sei sicuro di voler continuare?**",
+ "contents.pendingChangesTitle": "Modifiche non salvate",
+ "contents.referencesCreateNew": "Aggiungi nuovo",
+ "contents.referencesCreatePublish": "Crea e pubblica",
+ "contents.referencesLink": "Collega i contenuti selezionati ({count})",
+ "contents.referencesSelectExisting": "Seleziona da contenuti esistenti",
+ "contents.referencesSelectSchema": "Seleziona {schema}",
+ "contents.refreshTooltip": "Aggiorna i contenuti (CTRL + SHIFT + R)",
+ "contents.reloaded": "Contenuti aggiornati.",
+ "contents.removeConfirmText": "Do you really want to remove the content?",
+ "contents.removeConfirmTitle": "Remove content",
+ "contents.saveAndPublish": "Salva e pubblica",
+ "contents.scheduledAt": "alle",
+ "contents.scheduledAtLabel": "alle",
+ "contents.scheduledTo": "a",
+ "contents.schemasPageTitle": "Contenuti",
+ "contents.searchPlaceholder": "Ricerca testuale",
+ "contents.searchSchemasPlaceholder": "Cerca schemi...",
+ "contents.selectionCount": "{count} elementi selezionati",
+ "contents.statusFieldDescription": "Stato dell'elemento del contenuto.",
+ "contents.statusQueries": "Stato Query",
+ "contents.stockPhotoEmpty": "Nessuna selezione",
+ "contents.stockPhotoSearch": "Cerca foto su Unsplash",
+ "contents.tableHeaders.created": "Created",
+ "contents.tableHeaders.createdBy": "Created By",
+ "contents.tableHeaders.createdByShort": "By",
+ "contents.tableHeaders.id": "Id",
+ "contents.tableHeaders.lastModified": "Updated",
+ "contents.tableHeaders.lastModifiedBy": "Updated By",
+ "contents.tableHeaders.lastModifiedByShort": "By",
+ "contents.tableHeaders.nextStatus": "Next Status",
+ "contents.tableHeaders.status": "Status",
+ "contents.tableHeaders.version": "Version",
+ "contents.unsavedChangesText": "Non hai salvato le modifiche. Vuoi salvarle adesso?",
+ "contents.unsavedChangesTitle": "Modifiche non salvate",
+ "contents.updated": "Contenuto aggiornato con successo.",
+ "contents.updateFailed": "Non è stato possibile aggiornare il contenuto. Per favore ricarica.",
+ "contents.validationHint": "Ricorda di verificare tutte le lingue quando vedi errori di validazione.",
+ "contents.versionCompare": "Confronta",
+ "contents.versionDelete": "Cancella questa Versione",
+ "contents.versionFieldDescription": "La versione dell'elemento del contenuto",
+ "contents.versionViewing": "Stai guardando la versione **{version}**.",
+ "contents.viewLatest": "Visualizza l'ultima",
+ "contents.viewReset": "Imposta la visualizzazione predefinita",
+ "contributors.add": "Aggiungi un collaboratore",
+ "contributors.addFailed": "Non è stato possibile aggiungere collaboratori. Per favore ricarica.",
+ "contributors.contributorAssigned": "Un nuovo utente, con indirizzo email, è stato creato e aggiunto come collaboratore.",
+ "contributors.contributorAssignedExisting": "L'utente è stato assegnato",
+ "contributors.contributorAssignedInvited": "L'utente è stato invitato e assegnato.",
+ "contributors.contributorAssignedOld": "L'utente è stato aggiunto come collaboratore.",
+ "contributors.deleteConfirmText": "Sei sicuro di voler rimuovere il collaboratore?",
+ "contributors.deleteConfirmTitle": "Rimuovi il collaboratore",
+ "contributors.deleteFailed": "Non è stato possibile cancellare il collaboratore. Per favore ricarica.",
+ "contributors.emailPlaceholder": "Cerca un utente esistente o invitalo tramite email",
+ "contributors.empty": "Nessun collaboratore trovato.",
+ "contributors.import.emailsDetected": "Email trovate: {count}",
+ "contributors.import.run": "Aggiungi Collaboratori",
+ "contributors.import.run2": "Importa",
+ "contributors.importButton": "Aggiungi più collaboratori contemporaneamente",
+ "contributors.importHintg": "Team numeroso?",
+ "contributors.importTitle": "Importa collaboratori",
+ "contributors.loadFailed": "Non è stato possibile caricare contributors. Per favore ricarica.",
+ "contributors.planHint": "Il tuo piano prevede un numero massimo di {maxContributors} collaboratori.",
+ "contributors.refreshTooltip": "Aggiorna i collaboratori (CTRL + SHIFT + R)",
+ "contributors.reloaded": "Collaboratori aggiornati.",
+ "contributors.search": "Cerca",
+ "contributors.userNotFound": "L'utente non esiste.",
+ "dashboard.apiCallsCard": "Chiamate API ",
+ "dashboard.apiCallsChart": "Grafico delle chiamate API",
+ "dashboard.apiCallsLimitLabel": "Limite mensile",
+ "dashboard.apiCallsSummaryCard": "Riepilogo chiamate API",
+ "dashboard.apiDocumentationCard": "Documentazione delle API",
+ "dashboard.apiPerformanceCard": "Performance(ms) delle API: {summary}ms avg",
+ "dashboard.apiPerformanceChart": "Diagramma delle Performance delle API",
+ "dashboard.assetSizeCard": "Dimensione delle risorse (MB",
+ "dashboard.assetSizeLabel": "Dimensione totale",
+ "dashboard.assetSizeLimitLabel": "Limite totale",
+ "dashboard.assetTotalSize": "Dimensione totale dello Storage per le risorse",
+ "dashboard.assetUpdloadsCountChart": "Diagramma del numero di risorse caricate",
+ "dashboard.assetUploadsCard": "Risorse caricate",
+ "dashboard.assetUploadsSizeChart": "Diagramma della dimensione delle risorse caricate",
+ "dashboard.configSaved": "Configurazione salvata.",
+ "dashboard.contentApi": "API dei contenuti",
+ "dashboard.contentApiDescription": "Documentazione OpenAPI 3.0 compatibile per i contenuti della tua app.",
+ "dashboard.contentsSummaryCard": "Numero di elementi",
+ "dashboard.currentMonthLabel": "Questo mese",
+ "dashboard.downloadLog": "Scarica i Log",
+ "dashboard.editConfig": "Modifica la configurazione",
+ "dashboard.githubCard": "Github",
+ "dashboard.githubCardDescription": "Ottieni il codice sorgente da GitHub e segnala bug o richiedi assistenza.",
+ "dashboard.historyCard": "Cronologia",
+ "dashboard.pageTitle": "Dashboard",
+ "dashboard.resetConfigConfirmText": "Sei sicuro di voler riportare la dashboard alle impostazioni predefinite?",
+ "dashboard.resetConfigConfirmTitle": "Ripristina la configurazione",
+ "dashboard.schemaNewCard": "Nuovo Schema",
+ "dashboard.schemaNewCardDescription": "Uno schena definisce la struttura di un tipo di contenuto.",
+ "dashboard.schemasCard": "Schemi",
+ "dashboard.schemasCardDescription": "Panoramica del modello dei dati di questa app.",
+ "dashboard.stackedChart": "Istogramma in pila",
+ "dashboard.supportCard": "Feedback & Assistenza",
+ "dashboard.supportCardDescription": "Fornisci feedback e richiedi funzionalità per aiutarci a migliorare Squidex..",
+ "dashboard.trafficChart": "Diagramma del traffico delle API",
+ "dashboard.trafficHeader": "Traffico (MB)",
+ "dashboard.trafficLimitLabel": "Limite mensile",
+ "dashboard.trafficSummaryCard": "Riepilogo del traffico delle API",
+ "dashboard.welcomeText": "Benvenuto su **{app}** dashboard.",
+ "dashboard.welcomeTitle": "Ciao {user}",
+ "eventConsumers.loadFailed": "Non è stato possibile caricare event consumers. Per favore ricarica.",
+ "eventConsumers.pageTitle": "Eventi degli utenti",
+ "eventConsumers.position": "Posizione",
+ "eventConsumers.refreshTooltip": "Aggiorna gli eventi degli utenti (CTRL + SHIFT + R)",
+ "eventConsumers.reloaded": "Eventi degli utenti aggiornati.",
+ "eventConsumers.resetFailed": "Non è stato possibile ripristinare gli eventi degli utenti. Per favore ricarica.",
+ "eventConsumers.resetTooltip": "Ripristina gli event degli utenti",
+ "eventConsumers.startFailed": "Non è stato possibile far partire l'evento dell'utente. Per favore ricarica.",
+ "eventConsumers.startTooltip": "Inizia l'evento utente",
+ "eventConsumers.stopFailed": "Non è stato possibile fermare l'evento dell'utente. Per favore ricarica.",
+ "eventConsumers.stopTooltip": "Interrompi l'evento dell'utente",
+ "features.loadFailed": "Non è stato possibile caricare le funzionalità. Per favore ricarica.",
+ "history.loadFailed": "Non è stato possibile caricare la cronologia. Per favore ricarica.",
+ "history.title": "Attività",
+ "languages.add": "Aggiungi lingua",
+ "languages.addFailed": "Non è stato possibile aggiungere la lingua. Per favore ricarica.",
+ "languages.deleteConfirmText": "Sei sicuro di voler rimuovere la lingua?",
+ "languages.deleteConfirmTitle": "Rimuovi la lingua",
+ "languages.deleteFailed": "Non è stato possibile cancellare la lingua. Per favore ricarica.",
+ "languages.loadFailed": "Non è stato possibile caricare le lingue. Per favore ricarica.",
+ "languages.master": "è la principale",
+ "languages.masterHint": "Se non è stata impostata nessuna lingua come alternativa, le altre lingue hanno la lingua principale come alternativa.",
+ "languages.optional": "E' Opzionale",
+ "languages.optionalHint": "Se sono presenti campi obbligatori questi non devono essere compilati anche per le lingue opzionali.",
+ "languages.refreshTooltip": "Aggiorna le lingue (CTRL + SHIFT + R)",
+ "languages.reloaded": "Lingue ricaricate.",
+ "languages.updateFailed": "Non è stato possibile cambiare la lingua. Per favore ricarica.",
+ "news.headline": "Che cosa c'è di nuovo?",
+ "news.title": "Nuove funzionalità",
+ "notifo.subscripeTooltip": "Fai clic su questo pulsante per iscriverti a tutte le modifiche e ricevere le notifiche push.",
+ "patterns.deleteConfirmText": "Sei sicuro di voler rimuovere il pattern?",
+ "patterns.deleteConfirmTitle": "Cancella il pattern",
+ "patterns.deleteFailed": "Non è stato possibile rimuovere il pattern. Per favore ricarica.",
+ "patterns.empty": "Nessun pattern è stato ancora creato.",
+ "patterns.loadFailed": "Non è stato possibile aggiungere il pattern. Per favore ricarica.",
+ "patterns.nameValidationMessage": "Il nome può contenere solo lettere, numeri, trattini e spazi.",
+ "patterns.refreshTooltip": "Aggiorna i pattern (CTRL + SHIFT + R)",
+ "patterns.reloaded": "Pattern ricaricati.",
+ "patterns.updateFailed": "Non è stato possibile aggiornare pattern. Per favore ricarica.",
+ "plans.billingPortal": "Portal di Fatturazione",
+ "plans.billingPortalHint": "Vai al Portal di fatturazione per lo storico dei pagamenti e una panoramica per l'abbonamento.",
+ "plans.change": "Cambia",
+ "plans.changeConfirmTitle": "Cambia abbonamento",
+ "plans.changeFailed": "Non è stato possibile cambiare il piano. Per favore ricarica.",
+ "plans.includedCalls": "Chiamate API",
+ "plans.includedContributors": "Collaboratori",
+ "plans.includedStorage": "Spazio disco",
+ "plans.includedTraffic": "Traffico",
+ "plans.loadFailed": "Non è stato possibile caricare i piani. Per favore ricarica.",
+ "plans.noPlanConfigured": "Nessun piano è stato impostato, quest'app ha spazio disco ha un uso illiminato.",
+ "plans.notPlanOwner": "Non hai creato nessun abbonamento, pertanto non è possibile cambiare il piano.",
+ "plans.perMonth": "Al Mese",
+ "plans.perYear": "all'Anno",
+ "plans.refreshTooltip": "Aggiorna i piani (CTRL + SHIFT + R)",
+ "plans.reloaded": "Piano aggiornati.",
+ "plans.selected": "Selezionato",
+ "profile.title": "Profilo",
+ "profile.userEmail": "Accesso con",
+ "roles.add": "Aggiungi un ruolo",
+ "roles.addFailed": "Non è stato possibile aggiungere il ruolo. Per favore ricarica.",
+ "roles.default.owner": "Hai come amministratore tutte le funzionalità, compreso cancellare le app.",
+ "roles.default.reader": "Hai un'utenza in sola lettura sia per i contenuti che per le risorse.",
+ "roles.defaults.developer": "Hai un'utenza che può visualizzare le API, modificare le risorse, i contenuti, gli schema, le regole, i workflows e i pattern.",
+ "roles.defaults.editor": "Hai un'utenzaCan che può modificare le risorse, i conteuti e visualizzare i workflow.",
+ "roles.deleteConfirmText": "Cancella il ruolo",
+ "roles.deleteConfirmTitle": "Sei sicuro di voler eliminare il ruolo?",
+ "roles.loadFailed": "Non è stato possibile caricare i ruoli. Per favore ricarica.",
+ "roles.loadPermissionsFailed": "Non è stato possibile caricare i permessi. Per favore ricarica.",
+ "roles.refreshTooltip": "Aggiorna i ruoli (CTRL + SHIFT + R)",
+ "roles.reloaded": "Ruoli ricaricati.",
+ "roles.revokeFailed": "Non è stato possibile rimuovere il ruolo. Per favore ricarica.",
+ "roles.roleNamePlaceholder": "Inserisci il nome del ruolo",
+ "roles.updateFailed": "Non è stato possibile aggiornare il ruolo. Per favore ricarica.",
+ "rules.actionEdit": "Mdifica l'Azione",
+ "rules.cancelFailed": "Non è stato possibile eliminare la regola. Per favore ricarica.",
+ "rules.create": "Crea un nuova Regola",
+ "rules.createFailed": "Non è stato possibile creare una nuova regola. Per favore ricarica.",
+ "rules.createTooltip": "Nuova regola (CTRL + SHIFT + G)",
+ "rules.deleteConfirmText": "Sei sicuro di voler eliminare la regola?",
+ "rules.deleteConfirmTitle": "Cancella la regola",
+ "rules.deleteFailed": "Non è stato possibile eliminare la regola. Per favore ricarica.",
+ "rules.disableFailed": "Non è stato possibile disabilitare la regola. Per favore ricarica.",
+ "rules.empty": "Nessuna regola è stato ancora creata.",
+ "rules.emptyAddRule": "Aggiungi una regola",
+ "rules.enableFailed": "Non è stato possibile abilitare la regola. Per favore ricarica.",
+ "rules.enqueued": "La regola è stata aggiunta alle code.",
+ "rules.listPageTitle": "Regole",
+ "rules.loadFailed": "Non è stato possibile caricare le regole. Per favore ricarica.",
+ "rules.readMore": "Leggi di più",
+ "rules.refreshEventsTooltip": "Aggiorna gli Eventi (CTRL + SHIFT + R)",
+ "rules.refreshTooltip": "Aggiorna le Regole (CTRL + SHIFT + R)",
+ "rules.reloaded": "Regole ricaricate.",
+ "rules.restarted": "La Regola sarà eseguita fra pochi secondi.",
+ "rules.ruleEvents.cancelFailed": "Non è stato possibile cancellare l'evento della regola. Per favore ricarica.",
+ "rules.ruleEvents.enqueue": "Metti in coda",
+ "rules.ruleEvents.enqueued": "Eventi messo in coda. L'evento potrà essere rieseguto fra pochi secondi.",
+ "rules.ruleEvents.enqueueFailed": "Non è stato possibile mettere in coda l'evento della regola. Per favore ricarica.",
+ "rules.ruleEvents.lastInvokedLabel": "Ultima chiamata",
+ "rules.ruleEvents.listPageTitle": "Eventi della Regola",
+ "rules.ruleEvents.loadFailed": "Non è stato possibile caricare gli eventi. Per favore ricarica.",
+ "rules.ruleEvents.nextAttemptLabel": "Successivo",
+ "rules.ruleEvents.numAttemptsLabel": "Tentativi",
+ "rules.ruleEvents.reloaded": "Eventi della regola ricaricati.",
+ "rules.ruleSyntax.if": "If",
+ "rules.ruleSyntax.then": "then",
+ "rules.run": "Esegui",
+ "rules.runFailed": "Non è stato possibile eseguire la regola. Per favore ricarica.",
+ "rules.runningRule": "La regola '{name}' è attualmente in esecuzione.",
+ "rules.runRuleConfirmText": "Sei sicuro di voler eseguire la regola per tutti gli eventi?",
+ "rules.runRuleConfirmTitle": "Esegui la regola",
+ "rules.stop": "La regola si fermerà al più presto.",
+ "rules.triggerConfirmText": "Sei sicuro che voler attivare la regola?",
+ "rules.triggerConfirmTitle": "Attiva la regola",
+ "rules.triggerEdit": "Modifica l'Attivazione",
+ "rules.triggerFailed": "Non è stato possibile attivare la regola. Per favore ricarica.",
+ "rules.unnamed": "Regola senza nome",
+ "rules.updateFailed": "Non è stato possibile aggiornare la regola. Per favore ricarica.",
+ "rules.wizard.actionHint": "La selezione del tipo di azione non potrà essere modificata successivamente.",
+ "rules.wizard.selectAction": "Seleziona l'Azione",
+ "rules.wizard.selectTrigger": "Seleziona l'Attivazione",
+ "rules.wizard.triggerHint": "La selezione del tipo di attivazione non potrà essere modificata successivamente.",
+ "schemas.addField": "Aggiungi un Campo",
+ "schemas.addFieldAndClose": "Crea e chiudi",
+ "schemas.addFieldAndCreate": "Crea e aggiungi il campo",
+ "schemas.addFieldAndEdit": "Crea e modifica il campo",
+ "schemas.addFieldButton": "Aggiungi il Campo",
+ "schemas.addFieldFailed": "Non è stato possibile aggiungere il campo. Per favore ricarica.",
+ "schemas.addNestedField": "Aggiungi un campo annidato",
+ "schemas.changeCategoryFailed": "Non è stato possibile cambiare la categoria. Per favore ricarica.",
+ "schemas.clone": "Clona lo Schema",
+ "schemas.contextMenuTour": "Apri il menu per cancellare lo schema o per inserire alcuni script che modificano il contenuto.",
+ "schemas.create": "Crea uno Schema",
+ "schemas.createCategory": "Crea una nuova categoria...",
+ "schemas.createFailed": "Non è stato possibile creare lo schema. Per favore ricarica.",
+ "schemas.createSchemaTooltip": "Nuovo Schema (CTRL + SHIFT + G)",
+ "schemas.deleteConfirmText": "Sei sicuro di voler eliminare lo schema?",
+ "schemas.deleteConfirmTitle": "Cancella lo schema",
+ "schemas.deleteFailed": "Non è stato possibile cancellare lo schema. Per favore ricarica.",
+ "schemas.deleteFieldFailed": "Non è stato possibile cancellare il campo. Per favore ricarica.",
+ "schemas.deleteRuleConfirmText": "Sei sicuro di cancellare questa regola per il campo?",
+ "schemas.deleteRuleConfirmTitle": "Cancellare la regola per il campo",
+ "schemas.deleteUrlConfirmText": "Sei sicuro di voler rimuovere questa URL?",
+ "schemas.deleteUrlConfirmTitle": "Cancella URL",
+ "schemas.disableFieldFailed": "Non è stato possibile disabilitare il campo. Per favore ricarica.",
+ "schemas.enableFieldFailed": "Non è stato possibile abilitare il campo. Per favore ricarica.",
+ "schemas.export.deleteFields": "Cancella i campi",
+ "schemas.export.recreateFields": "Ricrea i campi",
+ "schemas.export.synchronize": "Sincronizza",
+ "schemas.field.allowedValues": "Valori consentiti",
+ "schemas.field.defaultValue": "Valori predefiniti",
+ "schemas.field.deleteConfirmText": "Sei sicuro di voler eliminare il campo?",
+ "schemas.field.deleteConfirmTitle": "Cancella il campo",
+ "schemas.field.disable": "Disabilita nella UI",
+ "schemas.field.disabledMarker": "Disabilitato",
+ "schemas.field.editor": "Editor",
+ "schemas.field.editorUrl": "Editor Url",
+ "schemas.field.editorUrlHint": "Url del tuo plugin se usi un custom editor.",
+ "schemas.field.empty": "Nessun campo è stato ancora creato.",
+ "schemas.field.enable": "Abilita nella UI",
+ "schemas.field.enabledMarker": "Abilitato",
+ "schemas.field.hiddenMarker": "Nasconsto",
+ "schemas.field.hide": "Nascondi nelle API",
+ "schemas.field.hintsHint": "Descrivi questo schema per la documentazione e le interfacce utente.",
+ "schemas.field.inlineEditable": "Modificabile sulla stessa linea",
+ "schemas.field.labelHint": "Nome da visualizzare per la documentazione e le interfacce utente.",
+ "schemas.field.localizable": "Consente la localizzazione",
+ "schemas.field.localizableHint": "Puoi impostare il campo per consentire la localizzazione, ossia che dipende dalla lingua che utilizzi come ad esempio i nomi delle città.",
+ "schemas.field.localizableMarker": "consente la localizzazione",
+ "schemas.field.lock": "Blocca e impedisce i cambiamenti",
+ "schemas.field.lockConfirmText": "Attenzione: Bloccare un campo è un'azione irreversibile! Se blocchi il campo non potrai più sbloccarlo o cancellarlo o cambiarlo. Sei sicuro di voler bloccare il campo?",
+ "schemas.field.lockedMarker": "Bloccato",
+ "schemas.field.nameHint": "Il nome del campo nelle chiamate API response.",
+ "schemas.field.namePlaceholder": "Inserisci il nome del campo",
+ "schemas.field.nameValidationMessage": "Il nome deve essere valido per il javascript in formato camel case.",
+ "schemas.field.placeholder": "Segnaposto",
+ "schemas.field.placeholderHint": "Definisci il segnaposto per la verifica dell'input.",
+ "schemas.field.required": "Obbligatorio",
+ "schemas.field.show": "Mostra nelle API",
+ "schemas.field.tabCommon": "Comune",
+ "schemas.field.tabEditing": "Modifica",
+ "schemas.field.tabValidation": "Validazione",
+ "schemas.field.tagsHint": "Tag per segnalare il tuo campo nei processi automatici.",
+ "schemas.field.unique": "Univoco",
+ "schemas.field.visibleMarker": "Visibile",
+ "schemas.fieldTypes.array.count": "Elementi",
+ "schemas.fieldTypes.array.countMax": "Max num. Elementi",
+ "schemas.fieldTypes.array.countMin": "Min num. Elementi",
+ "schemas.fieldTypes.array.description": "Lista di oggetti incorporati.",
+ "schemas.fieldTypes.assets.allowDuplicates": "Consente valori duplicati",
+ "schemas.fieldTypes.assets.count": "Conteggio",
+ "schemas.fieldTypes.assets.countMax": "Max num di Risorse",
+ "schemas.fieldTypes.assets.countMin": "Min num. di Risorse",
+ "schemas.fieldTypes.assets.description": "Immagini, video, documenti.",
+ "schemas.fieldTypes.assets.fileExtensions": "Estensioni dei File",
+ "schemas.fieldTypes.assets.mustBeImage": "Deve essere un'immagine",
+ "schemas.fieldTypes.assets.previewFileName": "Solamente il nome del file",
+ "schemas.fieldTypes.assets.previewImage": "Solamente thumbnail o il nome del file se non è un immagine",
+ "schemas.fieldTypes.assets.previewImageAndFileName": "Thumbnail e nome del file",
+ "schemas.fieldTypes.assets.previewMode": "Modalità anteprima",
+ "schemas.fieldTypes.assets.previewModeHint": "Anteprima delle risorse nella lista dei contenuti.",
+ "schemas.fieldTypes.assets.resolve": "Risolvi il nome della prima risorsa",
+ "schemas.fieldTypes.assets.resolveHint": "Mostra la prima risorsa collegata nella lista dei contenuti.",
+ "schemas.fieldTypes.assets.size": "Dimensione",
+ "schemas.fieldTypes.assets.sizeMax": "Dimensione Min",
+ "schemas.fieldTypes.assets.sizeMin": "Dimensione Max",
+ "schemas.fieldTypes.boolean.description": "Si o no, vero o falso.",
+ "schemas.fieldTypes.dateTime.defaultMode": "Modalità predefinita",
+ "schemas.fieldTypes.dateTime.description": "Data degli eventi, orari di apertura.",
+ "schemas.fieldTypes.dateTime.rangeMax": "Valore Max",
+ "schemas.fieldTypes.dateTime.rangeMin": "Valore Min",
+ "schemas.fieldTypes.geolocation.description": "Coordinate: latitudine e longitudine.",
+ "schemas.fieldTypes.json.description": "Dati in formato JSON, per gli sviluppatori.",
+ "schemas.fieldTypes.number.description": "ID, numero d'ordine, valutazione, quantità.",
+ "schemas.fieldTypes.number.range": "Intervallo",
+ "schemas.fieldTypes.number.rangeMax": "Valore Max",
+ "schemas.fieldTypes.number.rangeMin": "Valore Min ",
+ "schemas.fieldTypes.references.count": "Elementi",
+ "schemas.fieldTypes.references.countMax": "Numero Max Elementi",
+ "schemas.fieldTypes.references.countMin": "Numero Min Elementi",
+ "schemas.fieldTypes.references.description": "Link ad altri elementi del contenuto.",
+ "schemas.fieldTypes.references.resolveHint": "Mostra il nome dell'elemento collegato (reference) nella lista dei contenuti quando il numero massimo di elementi è impostato a 1.",
+ "schemas.fieldTypes.string.characters": "Characters",
+ "schemas.fieldTypes.string.charactersMax": "Max Characters",
+ "schemas.fieldTypes.string.charactersMin": "Min Characters",
+ "schemas.fieldTypes.string.contentType": "Content Type",
+ "schemas.fieldTypes.string.description": "Titoli, nomi, paragrafi.",
+ "schemas.fieldTypes.string.length": "Lunghezza",
+ "schemas.fieldTypes.string.lengthMax": "Lunghezza Max",
+ "schemas.fieldTypes.string.lengthMin": "Lunghezza Min",
+ "schemas.fieldTypes.string.pattern": "Regex Pattern",
+ "schemas.fieldTypes.string.patternMessage": "Messaggio del Pattern",
+ "schemas.fieldTypes.string.suggestions": "Suggestions",
+ "schemas.fieldTypes.string.words": "Words",
+ "schemas.fieldTypes.string.wordsMax": "Max Words",
+ "schemas.fieldTypes.string.wordsMin": "Min Words",
+ "schemas.fieldTypes.tags.count": "Items",
+ "schemas.fieldTypes.tags.countMax": "Max Items",
+ "schemas.fieldTypes.tags.countMin": "Min Items",
+ "schemas.fieldTypes.tags.description": "Formato speciale per i tag.",
+ "schemas.fieldTypes.ui.description": "Separatore per il pannello delle modifiche della UI.",
+ "schemas.hideFieldFailed": "Non è stato possibile nascondere il campo. Per favore ricarica.",
+ "schemas.import": "Importa uno schema",
+ "schemas.listFields": "Lista dei Campi",
+ "schemas.listFieldsEmpty": "Incolla qui il campo o riordina i campi da mostrare nella lista dei contenuti. Se non imposti una lista di campi da visualizzare, viene utilizzato il primo della lista.",
+ "schemas.loadFailed": "Non è stato possibile caricare gli schemi. Per favore ricarica.",
+ "schemas.loadSchemaFailed": "Non è stato possibile caricare lo schema. Per favore ricarica.",
+ "schemas.lockFieldFailed": "Non è stato possibile bloccare il campo. Per favore ricarica.",
+ "schemas.modeMultiple": "Contenuti multipli",
+ "schemas.modeMultipleDescription": "Ideale per contenuti multipli come post di blog, pagine, autori, prodotti...",
+ "schemas.modeSingle": "Singolo contenuto",
+ "schemas.modeSingleDescription": "Ideale per contenuti singoli come la pagina principale, privacy, impostazioni...",
+ "schemas.nameWarning": "Questi valori non possono essere cambiati in un secondo momento.",
+ "schemas.previewUrls.empty": "Nessuna url per l'anteprima è stato configurato.",
+ "schemas.previewUrls.help": "Riguardo all'URL dell'anteprima controlla la pagina della guida integrata per saperne di più.",
+ "schemas.previewUrls.namePlaceholder": "Web o Mobile",
+ "schemas.previewUrls.title": "URL dell'anteprima",
+ "schemas.previewUrls.urlPlaceholder": "URL con variabili",
+ "schemas.published": "Pubblicato",
+ "schemas.publishedTour": "!Per poter creare un contenuto devi prima aver pubblicato il relativo schema.",
+ "schemas.publishFailed": "Non è stato possibile pubblicare lo schema. Per favore ricarica.",
+ "schemas.referenceFields": "Campi per i collegamenti (Reference)",
+ "schemas.referenceFieldsEmpty": "Trascina qui il file qui oppure riordina i campi da visualizzare nella lista che viene visualizzata quando colleghi il contenuto ad un altro. Quando non è impostato alcun campo per il contenuto che si desidera collegare, sono visualizzati la lista dei campi in ordine di utilizzo.",
+ "schemas.reloaded": "Schemai ricaricati.",
+ "schemas.reorderFieldsFailed": "Non è stato possibile riordinare i campi. Per favore ricarica.",
+ "schemas.rules.action": "Azione",
+ "schemas.rules.condition": "Condizioni dentro il Javascript",
+ "schemas.rules.empty": "Non è stata configurata nessuna regola per il campo.",
+ "schemas.rules.title": "Regole per il campo",
+ "schemas.rules.when": "quando",
+ "schemas.saved": "Lo Schema è stato salvato con successo.",
+ "schemas.saveFieldAndClose": "Salva e chiudi",
+ "schemas.saveFieldAndNew": "Salva e aggiungi un campo",
+ "schemas.schemaHintsHint": "Descrivi questo schema per la documentazione e le interfacce utente.",
+ "schemas.schemaLabelHint": "Nome da visualizzare per la documentazione e le interfacce utente.",
+ "schemas.schemaNameHint": "Puoi utilizzare solo lettere, numeri e trattini e un numero massimo di 40 caratteri.",
+ "schemas.schemaNameValidationMessage": "Il nome può contenere solo lettere, numeri, trattini e spazi.",
+ "schemas.schemaTagsHint": "Tag per descrivere il tuo schema per i processi automatici.",
+ "schemas.searchPlaceholder": "Cerca negli schemi...",
+ "schemas.showFieldFailed": "Non è stato possibile mostrare il campo. Per favore ricarica.",
+ "schemas.synchronized": "Lo Schema è stato sincronizzato con successo.",
+ "schemas.synchronizeFailed": "Non è stato possibile sincronizzare lo schema. Per favore ricarica.",
+ "schemas.tabFields": "Campi",
+ "schemas.tabJson": "Json",
+ "schemas.tabMore": "Di più",
+ "schemas.tabScripts": "Script",
+ "schemas.tabUI": "UI",
+ "schemas.ui": "Campi assegnati",
+ "schemas.ui.unassignedFields": "UnCampi non assegnati",
+ "schemas.unpublished": "Non pubblicato",
+ "schemas.unpublishFailed": "Non è stato possibile togliere dalla pubblicazione lo schema. Per favore ricarica.",
+ "schemas.updateFailed": "Non è stato possibile aggiornare schema. Per favore ricarica.",
+ "schemas.updateFieldFailed": "Non è stato possibile aggiornare il campo. Per favore ricarica.",
+ "schemas.updatePreviewUrlsFailed": "Non è stato possibile configure le url dell'anteprima. Per favore ricarica.",
+ "schemas.updateRulesFailed": "Non è stato possibile aggiornare le regole dello schema. Per favore ricarica.",
+ "schemas.updateScriptsFailed": "Non è stato possibile aggiornare gli script dello schema. Per favore ricarica.",
+ "schemas.updateUIFieldsFailed": "Non è stato possibile aggiornare i campi della UI. Per favore ricarica.",
+ "search.addFilter": "Aggiungi un Filtro",
+ "search.addGroup": "Aggiungi un Gruppo",
+ "search.addSorting": "Aggiungi ordinamento",
+ "search.advancedTour": "Fai clic su questa icona per visualizzare il menu della ricerca avanzata!",
+ "search.customQuery": "Query personalizzata",
+ "search.fullTextTour": "Cerca contenuti utilizzando la ricerca testuale su tutti i campi e le lingue!",
+ "search.help": "Ulteriori informazioni sui filtri su [Documentation](https://https://docs.squidex.io/04-guides/02-api.html).",
+ "search.myQueries": "Le mie query",
+ "search.nameQuery": "Dai un nome alla query",
+ "search.queriesEmpty": "Ricerca per {types} e utilizza l'icona nella ricerca per salvare la query per tutti i collaboratori.",
+ "search.queryAllNewestFirst": "Tutto (newest first)",
+ "search.queryAllOldestFirst": "Tutto (oldest first)",
+ "search.quickNavPlaceholder": "Navigazione veloce (Press 'q')",
+ "search.saveQueryMyself": "Salva la query solamente per me.",
+ "search.searchFailed": "Non è stato possibile eseguire la ricerca. Per favore ricarica.",
+ "search.sharedQueries": "Query condivise",
+ "search.sorting": "Ordinamento",
+ "start.login": "Entra su Squidex",
+ "start.loginHint": "Il pulsante per accedere aprirà un popup. Una volta effettuato l'accesso sarai indirizzato al portale per la gestione di Squidex.",
+ "start.madeBy": "Realizzato con orgoglio da",
+ "start.madeByCopyright": "Sebastian Stehle e Collaboratori, 2016-2020",
+ "tour.joinForum": "Unisciti al nostro Forum",
+ "tour.joinGithub": "Unisciti a Github",
+ "tour.skip": "Salta il Tour",
+ "tour.step0Next": "Guardiamoci intorno",
+ "tour.step0Text": "Puoi iniziare subito a gestire e distribuire i tuoi contenuti, ma prima vorremmo illustrarti alcune nozioni di base...\n\nIn questo modo",
+ "tour.step1Next": "Continua",
+ "tour.step1Text": "Un'App è il repository per il tuo progetto, ad es. (un blog, un negozio sul web o una app per dispositivi mobili). Puoi assegnare collaboratori alla tua App per lavorare insieme.\n\nPuoi creare un numero illimitato di app in Squidex per gestire più progetti contemporaneamente.",
+ "tour.step2Next": "Vai avanti!",
+ "tour.step2Text": "Gli Schemi definiscono la struttura per i tuoi contenuti, i campi e i tipi di dato per ogni tipo di contenuto.\n\nPrima di creare un contenuto riferito al tuo schema, assicurati di aver pubblicato lo schema premendo il pulsante 'Pubblica' visualizzato nell'editor dei contenuti.",
+ "tour.step3Next": "Ci siamo quasi!",
+ "tour.step3Text": "I contenuti della tua app sono raggruppati tramite gli schemi.\n\nSeleziona uno schema pubblicato e poi crea il relativo contenuto.",
+ "tour.step4Next": "Fatto!",
+ "tour.step4Text": "Le risorse contengono tutti i file che tu puoi collegare ai tuoi contenuti. Per esempio immagini, video o documenti.\n\nPuoi caricare qui le risorse e usarle successivamente oppure caricarle direttamente quando stai creando un contenuto utilizzando un campo risorse.",
+ "tour.step5Text": "Ma non è tutto il supporto che possiamo fornire.\n\nPer maggiori informazioni visita il sito https://docs.squidex.io/>.\n\nVuoi far parte della nostra community?",
+ "tour.step5Title": "Fantastico, ora conosci le basi!",
+ "tour.tooltipConfirm": "Capito",
+ "tour.tooltipStop": "Ferma il Tour",
+ "tour.welcome": "Benvenuto su",
+ "tour.welcomeProduct": "Squidex CMS",
+ "translate.translateFailed": "Non è stato possibile tradurre il testo. Per favore ricarica.",
+ "usages.loadCallsFailed": "Non è stato possibile caricare la pagina per l'utilizzo delle chiamate. Per favore ricarica.",
+ "usages.loadMonthlyCallsFailed": "Non è stato possibile caricare le chiamate mensili delle API calls. Per favore ricarica.",
+ "usages.loadStorageFailed": "Non è stato possibile caricare lo spazio disco utilizzato. Per favore ricarica.",
+ "usages.loadTodayStorageFailed": "Non è stato possibile caricare lo spazio disco utilizzato oggi. Per favore ricarica.",
+ "users.create": "Nuovo",
+ "users.createFailed": "Non è stato possibile creare l'utente. Per favore ricarica.",
+ "users.createPageTitle": "Crea un utente",
+ "users.createTitle": "Nuovo utente",
+ "users.createTooltip": "Nuovo utente (CTRL + N)",
+ "users.editPageTitle": "Modifica l'utente",
+ "users.editTitle": "Modifica l'utente",
+ "users.listPageTitle": "Gestione Utente",
+ "users.listTitle": "Utenti",
+ "users.loadFailed": "Non è stato possibile caricare gli utenti. Per favore ricarica.",
+ "users.loadUserFailed": "Non è stato possibile caricare l'utente. Per favore ricarica.",
+ "users.lockTooltip": "Utente bloccato",
+ "users.passwordConfirmValidationMessage": "Le password devono essere uguali.",
+ "users.refreshTooltip": "Aggiorna gli Utenti (CTRL + SHIFT + R)",
+ "users.reloaded": "Utenti ricaricati.",
+ "users.search": "Cerca l'utente",
+ "users.unlockTooltip": "Sblocca l'utente",
+ "users.updateFailed": "Non è stato possibile aggiornare l'utente. Per favore ricarica.",
+ "validation.between": "{field} deve essere tra '{min}' e '{max}'.",
+ "validation.betweenlength": "{field|upper} deve essere tra {minlength} e {maxlength} elemento(i).",
+ "validation.betweenlengthstring": "{field|upper} deve essere tra {minlength} e {maxlength} carattere(i).",
+ "validation.email": "{field|upper} deve essere un indirizzo email.",
+ "validation.exactly": "{field|upper} deve essere esattamente '{expected}'.",
+ "validation.exactlylength": "{field|upper} deve essere esattamente {expected} elemento(i).",
+ "validation.exactlylengthstring": "{field|upper} deve essere esattamente {expected} carattere(i).",
+ "validation.match": "{message}",
+ "validation.max": "{field|upper} deve essere minore o uguale a '{max}'.",
+ "validation.maxlength": "{field|upper} non deve avere più di {requiredlength} elemento(i).",
+ "validation.maxlengthstring": "{field|upper} non deve avere più di {requiredlength} carattere(i).",
+ "validation.min": "{field|upper} deve essere maggiore o uguale a '{min}'.",
+ "validation.minlength": "{field|upper} deve avere almeno {requiredlength} elemento(i).",
+ "validation.minlengthstring": "{field|upper} deve avere almeno {requiredlength} carattere(i).",
+ "validation.pattern": "{field|upper} non corrisponde al pattern.",
+ "validation.patternmessage": "{message}",
+ "validation.required": "{field|upper} è obbligatorio.",
+ "validation.requiredTrue": "{field|upper} è obbligatorio.",
+ "validation.uniquestrings": "{field|upper} non deve contenere valori duplicati.",
+ "validation.validarrayvalues": "{field|upper} contiene valori non validicontains an invalid value: {invalidvalue}.",
+ "validation.validdatetime": "{field|upper} non è una data e ora valida.",
+ "validation.validvalues": "{field|upper} non è un valore valido.",
+ "workflows.add": "Aggiungi un Workflow",
+ "workflows.addStep": "Aggiungi uno Step",
+ "workflows.createFailed": "Non è stato possibile creare un workflow. Per favore ricarica.",
+ "workflows.deleteConfirmText": "Sei sicuro di voler eliminare il workflow?",
+ "workflows.deleteConfirmTitle": "Cancella il workflow",
+ "workflows.deleteFailed": "Non è stato possibile cancellare il Workflow. Per favore ricarica.",
+ "workflows.empty": "Nessun workflow è stato ancora creato.",
+ "workflows.loadFailed": "Non è stato possibile caricare i workflow. Per favore ricarica.",
+ "workflows.notNamed": "Workflow senza nome",
+ "workflows.preventUpdates": "Impedisci gli aggiornamenti",
+ "workflows.publishedNotRemovable": "Non è possibile rimuoverlo",
+ "workflows.refreshTooltip": "Aggiorna i workflow (CTRL + SHIFT + R)",
+ "workflows.reloaded": "Workflow ricaricati.",
+ "workflows.saved": "Il Workflow è stato salvato.",
+ "workflows.schemasHint": "Limita questo workflow ad uno schema specifico, o lascialo bianco per applicarlo a tutti gli schemi.",
+ "workflows.syntax.expression": "Espressione",
+ "workflows.syntax.for": "per",
+ "workflows.syntax.when": "quando",
+ "workflows.tabEdit": "Modifica",
+ "workflows.tabVisualize": "Visualizza",
+ "workflows.updateFailed": "Non è stato possibile aggiornare il Workflow. Per favore ricarica.",
+ "workflows.workflowNameHint": "Nome facoltativo per il workflow.",
+ "workflows.workflowNamePlaceholder": "Inserisci il nome del workflow"
+}
\ No newline at end of file
diff --git a/backend/i18n/frontend_nl.json b/backend/i18n/frontend_nl.json
index bb003b741..2557e7323 100644
--- a/backend/i18n/frontend_nl.json
+++ b/backend/i18n/frontend_nl.json
@@ -70,16 +70,16 @@
"assets.fileTooBig": "Asset is te groot.",
"assets.folderName": "Mapnaam",
"assets.folderNameHint": "De mapnaam wordt gebruikt als weergavenaam en mag niet uniek zijn.",
- "assets.insertAssets": "Assets invoegen",
+ "assets.insertAssets": "Bestanden invoegen",
"assets.linkSelected": "Link geselecteerde items ({count})",
- "assets.listPageTitle": "Assets",
+ "assets.listPageTitle": "Bestanden",
"assets.loadFailed": "Laden van bestanden is mislukt. Laad opnieuw.",
"assets.loadFoldersFailed": "Laden van mappen is mislukt. Laad opnieuw.",
"assets.metadata": "Metadata",
"assets.metadataAdd": "Metadata toevoegen",
"assets.moveFailed": "Verplaatsen van item is mislukt. Laad opnieuw.",
"assets.protected": "Beschermd",
- "assets.refreshTooltip": "Assets vernieuwen (CTRL + SHIFT + R)",
+ "assets.refreshTooltip": "Bestanden vernieuwen (CTRL + SHIFT + R)",
"assets.reloaded": "Bestanden herladen.",
"assets.removeConfirmText": "Wil je het bestand echt verwijderen?",
"assets.removeConfirmTitle": "Verwijder bestand",
@@ -90,6 +90,8 @@
"assets.searchByName": "Zoeken op naam",
"assets.searchByTags": "Zoeken op tags",
"assets.selectMany": "Selecteer middelen",
+ "assets.specialFolder.parent": "",
+ "assets.specialFolder.root": "Bestanden",
"assets.tabFocusPoint": "Focuspunt",
"assets.tabHistory": "Geschiedenis",
"assets.tabImage": "Afbeelding",
@@ -273,6 +275,16 @@
"common.preview": "Preview",
"common.product": "Squidex Headless CMS",
"common.project": "Project",
+ "common.queryOperators.contains": "contains",
+ "common.queryOperators.empty": "is empty",
+ "common.queryOperators.endsWith": "ends with",
+ "common.queryOperators.eq": "is equals to",
+ "common.queryOperators.ge": "is greater than or equals to",
+ "common.queryOperators.gt": "is greater than",
+ "common.queryOperators.le": "is less than pr equals to",
+ "common.queryOperators.lt": "is less than",
+ "common.queryOperators.ne": "is not equals to",
+ "common.queryOperators.startsWith": "starts with",
"common.refresh": "Vernieuwen",
"common.rename": "Hernoemen",
"common.requiredHint": "verplicht",
@@ -347,6 +359,7 @@
"contents.draftStatus": "Nieuwe versie",
"contents.editPageTitle": "Inhoud bewerken",
"contents.editTitle": "Inhoud bewerken",
+ "contents.invariantFieldDescription": "The '{fieldName}' field of the content item.",
"contents.languageModeAll": "Alle talen",
"contents.languageModeSingle": "Enkele taal",
"contents.lastModifiedByFieldDescription": "De gebruiker die het inhoudsitem de laatste keer heeft gewijzigd.",
@@ -357,6 +370,7 @@
"contents.loadDataFailed": "Laden van gegevens is mislukt. Laad opnieuw.",
"contents.loadFailed": "Laden van inhoud is mislukt. Laad opnieuw.",
"contents.loadVersionFailed": "Versie van een nieuwe versie is mislukt. Laad opnieuw.",
+ "contents.localizedFieldDescription": "The '{fieldName}' field of the content item (localized).",
"contents.newStatusFieldDescription": "De nieuwe status van het item.",
"contents.noReference": "- Geen referentie -",
"contents.pendingChangesTextToChange": "Je hebt niet-opgeslagen wijzigingen. \n \n Wanneer je de status wijzigt, raak je ze kwijt. \n \n **Wil je toch doorgaan?**",
@@ -383,6 +397,16 @@
"contents.statusQueries": "Statusquery's",
"contents.stockPhotoEmpty": "Niets geselecteerd",
"contents.stockPhotoSearch": "Zoeken naar foto's op Unsplash",
+ "contents.tableHeaders.created": "Created",
+ "contents.tableHeaders.createdBy": "Created By",
+ "contents.tableHeaders.createdByShort": "By",
+ "contents.tableHeaders.id": "Id",
+ "contents.tableHeaders.lastModified": "Updated",
+ "contents.tableHeaders.lastModifiedBy": "Updated By",
+ "contents.tableHeaders.lastModifiedByShort": "By",
+ "contents.tableHeaders.nextStatus": "Next Status",
+ "contents.tableHeaders.status": "Status",
+ "contents.tableHeaders.version": "Version",
"contents.unsavedChangesText": "Je hebt niet-opgeslagen wijzigingen. Wil je ze nu laden?",
"contents.unsavedChangesTitle": "Niet-opgeslagen wijzigingen",
"contents.updated": "Inhoud succesvol bijgewerkt.",
diff --git a/backend/i18n/source/backend__ignore.json b/backend/i18n/source/backend__ignore.json
index a678d4af6..e9596e8ee 100644
--- a/backend/i18n/source/backend__ignore.json
+++ b/backend/i18n/source/backend__ignore.json
@@ -151,10 +151,10 @@
"/Squidex.Domain.Apps.Entities/Contents/Text/Elastic/ElasticSearchTextIndex.cs": [
"*"
],
- "/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager_Impl.cs": [
+ "/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager.cs": [
"*"
],
- "/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager.cs": [
+ "/Squidex.Domain.Apps.Entities/Contents/Text/Lucene/IndexManager_Impl.cs": [
"*"
],
"/Squidex.Domain.Apps.Entities/Notifications/NotificationEmailSender.cs": [
diff --git a/backend/i18n/source/backend_en.json b/backend/i18n/source/backend_en.json
index bfa249dd6..38c862ff6 100644
--- a/backend/i18n/source/backend_en.json
+++ b/backend/i18n/source/backend_en.json
@@ -1,7 +1,12 @@
{
"annotations_AbsoluteUrl": "The field {name|lower} must be an absolute URL.",
"annotations_Compare": "The field {name|lower} must be the same as {other|lower}.",
+ "annotations_EmailAddress": "The field {name|lower} is not a valid email address.",
+ "annotations_Range": "The field {name|lower} must be between {min} and {max}.",
+ "annotations_RegularExpression": "The field {name|lower} is not.",
"annotations_Required": "The field {name|lower} is required.",
+ "annotations_StringLength": "The field {name|lower} must be a string with a maximum length of {max}.",
+ "annotations_StringLengthMinimum": "The field {name|lower} must be a string with a minimum length of {min} and a maximum length of {max}.",
"apps.alreadyArchieved": "App has already been archived.",
"apps.clients.idAlreadyExists": "A client with the same id already exists.",
"apps.contributors.cannotChangeYourself": "You cannot change your own role.",
@@ -23,9 +28,6 @@
"apps.roles.nameAlreadyExists": "A role with the same name already exists.",
"apps.roles.usedRoleByClientsNotRemovable": "Cannot remove a role when a client is assigned.",
"apps.roles.usedRoleByContributorsNotRemovable": "Cannot remove a role when a contributor is assigned.",
- "aspnet_annotations_AbsoluteUrl": "The field {0} must be an absolute URL.",
- "aspnet_annotations_Compare": "The field {0} must be the same as {other|lower}.",
- "aspnet_annotations_Required": "The field {0} is required.",
"assets.assetAlreadyDeleted": "Asset has already been deleted",
"assets.assetFolderAlreadyDeleted": "Asset folder has already been deleted",
"assets.folderNotFound": "Asset folder does not exist.",
@@ -180,6 +182,21 @@
"contents.validation.wordsBetween": "Must have between {min} and {max} word(s).",
"contents.workflowErorPublishing": "Content workflow prevents publishing.",
"contents.workflowErrorUpdate": "The workflow does not allow updates at status {status}",
+ "dotnet_identity_DefaultEror": "An unknown failure has occurred.",
+ "dotnet_identity_DuplicateEmail": "Email is already taken.",
+ "dotnet_identity_DuplicateUserName": "User name is already taken.",
+ "dotnet_identity_InvalidEmail": "Email is invalid.",
+ "dotnet_identity_InvalidUserName": "User name '{0}' is invalid, can only contain letters or digits.",
+ "dotnet_identity_LoginAlreadyAssociated": "A user with this login already exists.",
+ "dotnet_identity_PasswordMismatch": "Incorrect password.",
+ "dotnet_identity_PasswordRequiresDigit": "Passwords must have at least one digit ('0'-'9').",
+ "dotnet_identity_PasswordRequiresLower": "Passwords must have at least one lowercase ('a'-'z').",
+ "dotnet_identity_PasswordRequiresNonAlphanumeric": "Passwords must have at least one non alphanumeric character.",
+ "dotnet_identity_PasswordRequiresUniqueChars": "Passwords must use at least {0} different characters.",
+ "dotnet_identity_PasswordRequiresUpper": "Passwords must have at least one uppercase ('A'-'Z').",
+ "dotnet_identity_PasswordTooShort": "Passwords is too short.",
+ "dotnet_identity_PwnedError": "This password has previously appeared in a data breach and should never be used. If you have ever used it anywhere before, change it!",
+ "dotnet_identity_UserLockedOut": "User is locked out.",
"exception.invalidJsonQuery": "Json query not valid: {message}",
"exception.invalidJsonQueryJson": "Json query not valid json: {message}",
"exceptions.domainObjectDeleted": "Entity ({id}) has been deleted.",
diff --git a/backend/i18n/source/backend_it.json b/backend/i18n/source/backend_it.json
new file mode 100644
index 000000000..1ffdc1b70
--- /dev/null
+++ b/backend/i18n/source/backend_it.json
@@ -0,0 +1,320 @@
+{
+ "annotations_AbsoluteUrl": "Il campo {name|lower} deve essere un URL assoluto.",
+ "annotations_Compare": "Il campo {name|lower} deve essere uguale a {other|lower}.",
+ "annotations_Required": "Il campo è {name|lower} obbligatorio.",
+ "apps.alreadyArchieved": "La App è stata già archiviata.",
+ "apps.clients.idAlreadyExists": "Un client con lo stesso id esiste già.",
+ "apps.contributors.cannotChangeYourself": "Non puoi cambiare il tuo ruolo.",
+ "apps.contributors.maxReached": "Hai raggiunto il numero massimo di contributori previsto per il tuo piano.",
+ "apps.contributors.onlyOneOwner": "Non è possibile rimuovere l'unico owner.",
+ "apps.languages.fallbackNotFound": "La App non ha configurato una lingua alternativa'{fallback}'.",
+ "apps.languages.languageAlreadyAdded": "La lingua è stata già inserita.",
+ "apps.languages.masterLanguageNoFallbacks": "La lingua master language non ha lingue alternative.",
+ "apps.languages.masterLanguageNotOptional": "La lingua master non può essere opzionale.",
+ "apps.languages.masterLanguageNotRemovable": "La lingua master non può essere rimossa.",
+ "apps.nameAlreadyExists": "Esiste già un'app con lo stesso nome.",
+ "apps.notImage": "Il file non è una immagine",
+ "apps.patterns.nameAlreadyExists": "Esiste già un pattern con lo stesso nome.",
+ "apps.patterns.patternAlreadyExists": "Questo pattern esiste già con un altro nome.",
+ "apps.plans.notFound": "Non esiste un piano con questo id.",
+ "apps.plans.notPlanOwner": "Solo l'utente che ha configurato il piano inizialmente può modificarlo.",
+ "apps.roles.defaultRoleNotRemovable": "Non è possibile cancellare un ruolo predefinito.",
+ "apps.roles.defaultRoleNotUpdateable": "Non è possibile modificare un ruolo predefinito.",
+ "apps.roles.nameAlreadyExists": "Esiste già un ruolo con lo stesso nome.",
+ "apps.roles.usedRoleByClientsNotRemovable": "Non è possibile rimuovere un ruolo quando è assegnato ad un ruolo.",
+ "apps.roles.usedRoleByContributorsNotRemovable": "Non è possibile rimuovere un ruolo quando questo è assegnato ad un collaboratore.",
+ "assets.assetAlreadyDeleted": "La risorsa è stata già eliminata",
+ "assets.assetFolderAlreadyDeleted": "La cartella delle risorse è stata già eliminata",
+ "assets.folderNotFound": "La cartella delle risorse non esiste.",
+ "assets.folderRecursion": "Non è possibile aggiungere una cartella al proprio figlio.",
+ "assets.maxSizeReached": "Hai raggiunto la dimensione massima consentito per le risorse.",
+ "backups.alreadyRunning": "E' in esecuzione una altro processo di backup.",
+ "backups.maxReached": "Non puoi avere più di {max} backup.",
+ "backups.restoreRunning": "E' in esecuzione un'operazione di restore.",
+ "comments.noPermissions": "Puoi solo accedere alle tue notifiche.",
+ "comments.notUserComment": "E' stato creato un commento da un altro utente.",
+ "common.action": "Azione",
+ "common.aspectHeight": "Altezza",
+ "common.aspectWidth": "Larghezza",
+ "common.calculatedDefaultValue": "Valore predefinito calcolato",
+ "common.clientd": "ID Client",
+ "common.clientId": "ID Client",
+ "common.clientSecret": "Secret Client",
+ "common.contributorId": "ID o Email del collaboratore",
+ "common.data": "Data",
+ "common.defaultValue": "Valore predefinito",
+ "common.displayName": "Nome da visualizzare",
+ "common.editor": "Redattore",
+ "common.email": "Email",
+ "common.field": "Campo",
+ "common.fieldIds": "Campi ID",
+ "common.fieldName": "Campo nome",
+ "common.file": "File",
+ "common.folderName": "Nome della cartella",
+ "common.fullTextNotSupported": "La query di ricerca non supporta queste condizioni.",
+ "common.httpContentTypeNotDefined": "Il content-type del file non è definito.",
+ "common.httpFileNameNotDefined": "Il nome del file name non è definito.",
+ "common.httpInvalidRequest": "Il modello non è valido.",
+ "common.httpInvalidRequestFormat": "Il corpo della request ha un formato non valido.",
+ "common.httpOnlyAsUser": "Non consentito per i client.",
+ "common.httpValidationError": "Errore di validazione",
+ "common.initialStep": "Step iniziale",
+ "common.jsError": "Esecuzione dello script fallita, Errore Javascript: {message}",
+ "common.jsNotAlloweed": "Uno script ha proibito l'operazione.",
+ "common.jsParseError": "Esecuzione dello script fallita, errore di sintassi nel Javascript: {message}",
+ "common.jsRejected": "Lo script ha rifiutato l'operazione.",
+ "common.language": "Codice della lingua",
+ "common.login": "Accedi",
+ "common.logout": "Esci",
+ "common.maxHeight": "Altezza massima",
+ "common.maxItems": "Numeri massimo di elementi",
+ "common.maxLength": "Lunghezza massima",
+ "common.maxSize": "Dimensione massima",
+ "common.maxValue": "Valore massimo",
+ "common.maxWidth": "Larghezza massima",
+ "common.minHeight": "Altezza minima",
+ "common.minItems": "Numero minimo elementi",
+ "common.minLength": "Lunghezza minima",
+ "common.minSize": "Dimensione minima",
+ "common.minValue": "Valore minimo",
+ "common.minWidth": "Larghezza massima",
+ "common.name": "Nome",
+ "common.notFoundValue": "- non trovato -",
+ "common.numDays": "Num. giorni",
+ "common.odataFailure": "Fallito parsando la query: {message}",
+ "common.odataFilterNotValid": "OData $filter condizione non valida: {ex.Message}",
+ "common.odataNotSupported": "OData operazione non supportata.",
+ "common.odataSearchNotValid": "OData $search condizione non valida: {ex.Message}",
+ "common.oldPassword": "Vecchia password",
+ "common.other": "Altro",
+ "common.partitioning": "Partizionamento",
+ "common.password": "Password",
+ "common.passwordConfirm": "Conferma password",
+ "common.pattern": "Pattern",
+ "common.permissions": "Permessi",
+ "common.planId": "ID del piano",
+ "common.previewUrls": "Anteprima URL",
+ "common.product": "Squidex Headless CMS",
+ "common.properties": "Proprietà",
+ "common.property": "Proprietà",
+ "common.readonlyMode": "Al momento l'applicazione è in sola lettura.",
+ "common.referenceNotFound": "Contiene un collegamento '{id}' non valido.",
+ "common.referenceToInvalidSchema": "Contiene dei collegamenti '{id}' ad uno schema errato.",
+ "common.remove": "Rimuovi",
+ "common.resultTooLarge": "Il numero di risultati è troppo grande per essere recuperato. Utilizza il parametro $take per ridurre il numero di elementi.",
+ "common.role": "Ruolo",
+ "common.save": "Salva",
+ "common.schemaId": "ID Schema",
+ "common.signup": "Iscriviti",
+ "common.text": "Testo",
+ "common.trigger": "Trigger",
+ "common.workflow": "Workflow",
+ "common.workflowStep": "Step",
+ "common.workflowTransition": "Transizione",
+ "contents.alreadyDeleted": "Il contento è stato già eliminato.",
+ "contents.bulkInsertQueryNotUnique": "Ci sono più contenuti che corrispondono alla query.",
+ "contents.draftNotCreateForUnpublished": "Puoi creare versioni del contenuto solo se questo è pubblicato.",
+ "contents.draftToDeleteNotFound": "Non c'è niente da eliminare.",
+ "contents.invalidArrayOfIds": "Errore nel json, atteso un array di string guid.",
+ "contents.invalidArrayOfObjects": "Errore nel json, attesp un array di objects.",
+ "contents.invalidArrayOfStrings": "Errore nel json, atteso un array di string.",
+ "contents.invalidBoolean": "Errore nel json, atteso un boolean.",
+ "contents.invalidGeolocation": "Errore nel json, atteso un object latitudine/longitudine.",
+ "contents.invalidGeolocationLatitude": "La latitudine deve essere tra -90 and 90.",
+ "contents.invalidGeolocationLongitude": "La longitude deve essere tra -180 and 180.",
+ "contents.invalidGeolocationMoreProperties": "E' possibile impostare la geolocalizzazione solo impostando latitudine e longitudine.",
+ "contents.invalidNumber": "Errore nel json,, atteso un number.",
+ "contents.invalidString": "Errore nel json, atteso una string.",
+ "contents.listReferences": "{count} Collegamenti(s)",
+ "contents.singletonNotChangeable": "Il contenuto singleton non può essere aggiornato",
+ "contents.singletonNotCreatable": "Il contenuto singleton non può essere creato.",
+ "contents.singletonNotDeletable": "Il contenuto singleton non può essere eliminato.",
+ "contents.statusSchedulingNotInFuture": "L'ora deve essere futura.",
+ "contents.statusTransitionNotAllowed": "Non è possibile cambiare stato da {oldStatus} a {newStatus}.",
+ "contents.validation.aspectRatio": "Deve essere le proporzioni {width}:{height}.",
+ "contents.validation.assetNotFound": "Id {id} non trovato.",
+ "contents.validation.between": "Deve essere tra {min} e {max}.",
+ "contents.validation.characterCount": "Deve avere esattamente {count} carattere(i).",
+ "contents.validation.charactersBetween": "Deve essere tra {min} e {max} carattere(i).",
+ "contents.validation.duplicates": "Non può avere valori duplicati.",
+ "contents.validation.exactValue": "Deve essere esattamente {value}.",
+ "contents.validation.extension": "Deve essere un'estensione consentita.",
+ "contents.validation.image": "Non è un'immagine.",
+ "contents.validation.invalid": "Valore non consentito.",
+ "contents.validation.itemCount": "Deve avere esattamente {count} elemento(i).",
+ "contents.validation.itemCountBetween": "Deve essere tra {min} e {max} elemento(i).",
+ "contents.validation.max": "Deve esseer minore o uguale a {max}.",
+ "contents.validation.maximumHeight": "L'altezza {height}px deve essere inferiore a {max}px.",
+ "contents.validation.maximumSize": "La dimensione {size} deve essere inferiore a {max}.",
+ "contents.validation.maximumWidth": "La larghezza {width}px deve essere inferiore a {max}px.",
+ "contents.validation.maxItems": "Non deve avere più di {max} elemento(i).",
+ "contents.validation.maxLength": "Non deve avere più di {max} carattere(i).",
+ "contents.validation.min": "Deve essere maggiore o uguale a {min}.",
+ "contents.validation.minimumHeight": "L'altezza {height}px deve essere maggiore di {min}px.",
+ "contents.validation.minimumSize": "La dimensione {size} deve essere maggiore di {min}.",
+ "contents.validation.minimumWidth": "La larghezza {width}px deve essere maggiore di {min}px.",
+ "contents.validation.minItems": "Deve avere almento {min} elemento(i).",
+ "contents.validation.minLength": "Deve avere almeno {min} carattere(i).",
+ "contents.validation.mustBeEmpty": "Il valore non deve essere definito.",
+ "contents.validation.notAllowed": "Non è un valore consentito.",
+ "contents.validation.pattern": "Deve seguire il pattern.",
+ "contents.validation.regexTooSlow": "La Regex è troppo lenta.",
+ "contents.validation.required": "Il campo è obbligatorio.",
+ "contents.validation.unique": "Esiste un altro contenuto con lo stesso valore.",
+ "contents.validation.unknownField": "Non è noto {fieldType}.",
+ "contents.workflowErorPublishing": "Il workflow del contenuto impedisce la pubblicazione.",
+ "contents.workflowErrorUpdate": "Il workflow non consente le modifiche per lo stato {status}",
+ "exception.invalidJsonQuery": "La query Json non è valida: {message}",
+ "exception.invalidJsonQueryJson": "La query Json non è valida: {message}",
+ "exceptions.domainObjectDeleted": "L'entità ({id}) è stata cancellata.",
+ "exceptions.domainObjectNotFound": "L'entità ({id}) non esiste.",
+ "exceptions.domainObjectVersion": "L'entità ({id}) requested version {expectedVersion}, but found {currentVersion}.",
+ "history.apps.clientAdded": "aggiunto client {[Id]} all'app",
+ "history.apps.clientRevoked": "Revocato client {[Id]}",
+ "history.apps.clientUpdated": "Aggiornato client {[Id]}",
+ "history.apps.contributoreAssigned": "Associato {user:[Contributor]} al ruolo {[Role]}",
+ "history.apps.contributoreRemoved": "Rimosso {user:[Contributor]} dall'app",
+ "history.apps.languagedAdded": "aggiunta lingua {[Language]}",
+ "history.apps.languagedRemoved": "rimossa lingua {[Language]}",
+ "history.apps.languagedSetToMaster": "cambiata la lingua master in {[Language]}",
+ "history.apps.languagedUpdated": "aggiornata la lingua {[Language]}",
+ "history.apps.patternAdded": "adggiunto pattern {[Name]}",
+ "history.apps.patternDeleted": "eliminato pattern {[PatternId]}",
+ "history.apps.patternUpdated": "modificato pattern {[Name]}",
+ "history.apps.planChanged": "cambiato il piano in {[Plan]}",
+ "history.apps.planReset": "riconfigurato il piano",
+ "history.apps.roleAdded": "aggiunto il ruolo {[Name]}",
+ "history.apps.roleDeleted": "eliminato role {[Name]}",
+ "history.apps.roleUpdated": "aggiornato role {[Name]}",
+ "history.assets.replaced": "risorsa sostituita.",
+ "history.assets.updated": "risorsa aggiornata.",
+ "history.assets.uploaded": "risorsa caricata.",
+ "history.contents.created": "creato il contenuto {[Schema]}.",
+ "history.contents.deleted": "cancellato il contenuto {[Schema]}.",
+ "history.contents.draftCreated": "creata una nuova bozza.",
+ "history.contents.draftDeleted": "cancellata la bozza.",
+ "history.contents.scheduleCompleted": "impostato per cambiare lo stato del contenuto {[Schema]} in {[Status]}.",
+ "history.contents.scheduleFailed": "fallita l'impostazione per cambiare lo stato del contenuto {[Schema]}.",
+ "history.contents.updated": "aggiornato il contenuto {[Schema]}.",
+ "history.schemas.created": "creato lo schema {[Name]}.",
+ "history.schemas.deleted": "cancellato lo schema {[Name]}.",
+ "history.schemas.fieldAdded": "aggiunto il campo {[Field]} allo schema {[Name]}.",
+ "history.schemas.fieldDeleted": "cancellato il campo {[Field]} dallo schema {[Name]}.",
+ "history.schemas.fieldDisabled": "disabilitato il campo {[Field]} allo schema {[Name]}.",
+ "history.schemas.fieldHidden": "nascosto il campo {[Field]} dallo schema {[Name]}.",
+ "history.schemas.fieldLocked": "bloccato il campo {[Field]} dallo schema {[Name]}.",
+ "history.schemas.fieldShown": "mostrato il campo {[Field]} dallo schema {[Name]}.",
+ "history.schemas.fieldsReordered": "riordinati i campi dello schema {[Name]}.",
+ "history.schemas.fieldUpdated": "aggiornato il campo {[Field]} dello schema {[Name]}.",
+ "history.schemas.published": "pubblicato lo schema {[Name]}.",
+ "history.schemas.scriptsConfigured": "configurato lo script per lo schema {[Name]}.",
+ "history.schemas.unpublished": "rimosso dalla pubblicazione lo schema {[Name]}.",
+ "history.schemas.updated": "aggiornato lo schema {[Name]}.",
+ "history.statusChanged": "cambiato lo stato del contenuto {[Schema]} in {[Status]}.",
+ "login.githubPrivateEmail": "Il tuo indirizzo email è impostato su privato in Github. Impostalo come pubblico per poter utilizzare il login Github.",
+ "rules.alreadyDeleted": "La regola è stata già cancellata.",
+ "rules.ruleAlreadyRunning": "E' in esecuzione un'altra regola.",
+ "schemas.alreadyDeleted": "Lo schema è stato già cancellato.",
+ "schemas.dateTimeCalculatedDefaultAndDefaultError": "Il valore predefinito calcolato e il valore predefinito non possono essere utilizzati insieme.",
+ "schemas.duplicateFieldName": "Il campo '{field}' è stato aggiunto due volte.",
+ "schemas.fieldCannotBeUIField": "Il campo non può essere un campo UI.",
+ "schemas.fieldIsLocked": "Il campo dello schema è bloccato.",
+ "schemas.fieldNameAlreadyExists": "Esiste già un campo con lo stesso nome.",
+ "schemas.fieldNotInSchema": "Il campo non appartiene allo schema.",
+ "schemas.fieldsNotCovered": "Non tutti i campi hanno degli ID associati.",
+ "schemas.nameAlreadyExists": "Esiste già uno schema con lo stesso nome.",
+ "schemas.noPermission": "Non hai i permessi per questo schema.",
+ "schemas.notFoundId": "Lo schema {id} non esiste.",
+ "schemas.number.inlineEditorError": "Non è consentita per l'editor di tipo radio la modifica in linea.",
+ "schemas.onlyArraysHaveNested": "Solo i campi di tipo array possono avere campi annidati.",
+ "schemas.onylArraysInRoot": "Non è possibile annidare un campo di tipo array.",
+ "schemas.references.resolveError": "E' possibile risolvere il nome del collegamento solamente quando il numero massimo di elementi è 1.",
+ "schemas.string.inlineEditorError": "E' possibile la modifica in linea solamente per dropdown menu, slugs e campi di input.",
+ "schemas.stringEditorsNeedAllowedValuesError": "I Radio button e dropdown menu hanno bisogno che siano definiti dei valori.",
+ "schemas.tags.editorNeedsAllowedValues": "Checkboxes e dropdown menu hanno bisogno che siano definiti dei valori.",
+ "schemas.uiFieldCannotBeDisabled": "Il campo UI non può essere disabilitato.",
+ "schemas.uiFieldCannotBeEnabled": "Il campo UI non può essere abilitato.",
+ "schemas.uiFieldCannotBeHidden": "Il campo UI non può essere nascosto.",
+ "schemas.uiFieldCannotBeShown": "Il campo UI non può essere mostrato.",
+ "search.contentResult": "Contenuto {name}",
+ "search.contentsResult": "Contenuti {name} ",
+ "search.schemaResult": "Schema {name}",
+ "security.passwordStolen": "Questa password risulta essere stata compromessa e non dovrebbe essere mai utilizzata. Se l'hai utilizzata in precedenza, cambiala!",
+ "users.accessDenied.text": "Questa operazione non è consentita, il tuo account potrebbe essere bloccato.",
+ "users.accessDenied.title": "Accesso negato",
+ "users.consent.agree": "Sono d'accordo!",
+ "users.consent.cookiesHeadline": "Cookie & Statistiche",
+ "users.consent.cookiesText": "
Comprendo e accetto che Squidex utilizzi i cookie allo scopo di assicurare una migliore esperienza di utilizzo della piattaforma e per archiviare lo status del login.
Comprendo e accetto che Squidex abbia integrato Google Analytics (con funzioni di anonimizzazione). Google Analytics è un servizio di analisi web per raccogliere e analizzare dati sul comportamento degli utenti.
",
+ "users.consent.emailHeadline": "E-Mail automatiche (Opzionale)",
+ "users.consent.emailText": "Comprendo e accetto che Squidex invii e-mail per informarmi su nuove funzionalità, modifiche importanti e tempi di inattività",
+ "users.consent.headline": "Abbiamo bisogno del tuo consenso",
+ "users.consent.needed": "Devi dare il consenso.",
+ "users.consent.piiHeadline": "Information Personali",
+ "users.consent.piiText": "Comprendo e accetto che Squidex raccolga le seguenti informazioni private che vengono recuperate da fornitori di autenticazione esterni come Google, Microsoft o Github.
Le informazioni personali di base (nome, cognome e immagine) vengono fornite a tutti gli altri utenti in modo che questi possano aggiungerti al loro spazio di lavoro.
In qualsiasi momento hai la possibilità di modificare queste informazioni per rendere anonimo il tuo account.
Il tuo account utente ha un identificatore univoco e per tutte le tue modifiche monitoriamo che tu abbia apportato queste modifiche e fornito queste informazioni ad altri utenti.
",
+ "users.consent.title": "Acconsento",
+ "users.error.headline": "Operazione non riuscita",
+ "users.error.text": "Siamo dispiaciuti, qualcosa non ha funzionato correttamente.",
+ "users.error.title": "Errore",
+ "users.errorHappened": "Si è verificata un errore inaspettato.",
+ "users.lockedOutText": "Il tuo account è bloccato, si prega di contattare l'amministratore.",
+ "users.lockedOutTitle": "Account bloccato",
+ "users.lockYourselfError": "Non puoi bloccare te stesso.",
+ "users.login.askAdmin": "",
+ "users.login.emailPlaceholder": "Inserisci l'email",
+ "users.login.error": "Email o password non corretti",
+ "users.login.loginWith": "{action} con {provider}",
+ "users.login.noAccountLoginAction": "Clicca qui per accedere",
+ "users.login.noAccountLoginQuestion": "Sei già registrato?",
+ "users.login.noAccountSignupAction": "Clicca qui per registrarti",
+ "users.login.noAccountSignupQuestion": "Non hai ancora un account?",
+ "users.login.passwordPlaceholder": "Inserisci la password",
+ "users.login.separator": "o",
+ "users.logout.headline": "Uscito!",
+ "users.logout.text": "!Per favore chiudi questo popup.",
+ "users.logout.title": "Esci",
+ "users.profile.addLoginDone": "La login è stata aggiunta con successo.",
+ "users.profile.changePassword": "Cambia la password",
+ "users.profile.changePasswordDone": "Password cambiata con successo.",
+ "users.profile.clientHint": "Utilizza le credenziali client per accedere alle API utilizzando il profilo che ha le informazioni e i permessi corretti",
+ "users.profile.clientTitle": "Client",
+ "users.profile.confirmPassword": "Confermare",
+ "users.profile.generateClient": "Creato",
+ "users.profile.generateClientDone": "Secret client generato con successo.",
+ "users.profile.headline": "Profile modificato",
+ "users.profile.hideProfile": "Non mostrare il mio profilo agli altri utentiDo not show my profile to other users",
+ "users.profile.loginsTitle": "Login",
+ "users.profile.passwordTitle": "Password",
+ "users.profile.pii": "Informazioni personali",
+ "users.profile.propertiesHint": "Utilizza proprietà personalizzate per regole e script.",
+ "users.profile.propertiesTitle": "Proprietà",
+ "users.profile.propertyAdd": "Aggiungi una nuova proprietà",
+ "users.profile.removeLoginDone": "Il provider per l'autenticazione è stato rimosso correttamente.",
+ "users.profile.setPassword": "Imposta la Password",
+ "users.profile.setPasswordDone": "Password impostata con successo.",
+ "users.profile.title": "Profilo",
+ "users.profile.updateProfileDone": "Account aggiornato con successo.",
+ "users.profile.updatePropertiesDone": "Account aggiornato con successo.",
+ "users.profile.uploadPicture": "Carica un'immagine",
+ "users.profile.uploadPictureDone": "Immagine caricata con successo.",
+ "users.unlockYourselfError": "Non puoi sbloccare te stesso.",
+ "users.userLocked": "L'utente non ha i permessi per accedere.",
+ "users.userNotFound": "Non trovo l'utente.",
+ "validation.between": "{property|upper} deve essere tra {min} e {max}.",
+ "validation.greaterEqualsThan": "{property|upper} must be greater or equal to {other|lower}.",
+ "validation.greaterThan": "{property|upper} deve essere maggiore di {other|lower}.",
+ "validation.javascriptProperty": "{property|upper} non è un nome di una proprietà Javascript.",
+ "validation.lessEqualsThan": "{property|upper} deve essere minore o uguale a {other|lower}.",
+ "validation.lessThan": "{property|upper} deve essere minore di {other|lower}.",
+ "validation.notAnImage": "L'immagine non è un'immagine valida.",
+ "validation.onlyOneFile": "Puoi caricare solo un file.",
+ "validation.required": "{property|upper} è obbligatorio.",
+ "validation.requiredBoth": "Se {property1|lower} o {property2|lower} sono usate entrambe devono essere definite.",
+ "validation.requiredValue": "Il valore deve essere impostato.",
+ "validation.slug": "{property|upper} non è uno slug valido.",
+ "validation.valid": "{property|upper} non è un valore valido.",
+ "workflows.overlap": "Workflow multipli sono associati a tutti gli schema.",
+ "workflows.publishedIsInitial": "Lo step iniziale non può essere quello pubblico.",
+ "workflows.publishedNotDefined": "Il Workflow deve avere uno step pubbico.",
+ "workflows.publishedStepNotFound": "La Transition ha un obiettivo non valido.",
+ "workflows.schemaOverlap": "Lo schema '{schema}' è associato a diversi workflow."
+}
\ No newline at end of file
diff --git a/backend/i18n/source/backend_nl.json b/backend/i18n/source/backend_nl.json
index 02847a093..00969f164 100644
--- a/backend/i18n/source/backend_nl.json
+++ b/backend/i18n/source/backend_nl.json
@@ -23,9 +23,6 @@
"apps.roles.nameAlreadyExists": "Er bestaat al een rol met dezelfde naam.",
"apps.roles.usedRoleByClientsNotRemovable": "Kan een rol niet verwijderen wanneer een client is toegewezen.",
"apps.roles.usedRoleByContributorsNotRemovable": "Kan een rol niet verwijderen wanneer een bijdrager is toegewezen.",
- "aspnet_annotations_AbsoluteUrl": "Het veld {0} moet een absolute URL zijn.",
- "aspnet_annotations_Compare": "Het veld {0} moet hetzelfde zijn als {other|lower}.",
- "aspnet_annotations_Required": "Het veld {0} is verplicht.",
"assets.assetAlreadyDeleted": "Asset is al verwijderd",
"assets.assetFolderAlreadyDeleted": "Assetmap is al verwijderd",
"assets.folderNotFound": "Assetmap bestaat niet.",
@@ -180,6 +177,21 @@
"contents.validation.wordsBetween": "Moet tussen {min} en {max} woord (en) bevatten.",
"contents.workflowErorPublishing": "Contentworkflow verhindert publiceren.",
"contents.workflowErrorUpdate": "De werkstroom staat geen updates toe met status {status}",
+ "dotnet_identity_DefaultEror": "Er is een onbekende fout opgetreden.",
+ "dotnet_identity_DuplicateEmail": "E-mail is al in gebruik.",
+ "dotnet_identity_DuplicateUserName": "Gebruikersnaam is al in gebruik.",
+ "dotnet_identity_InvalidEmail": "E-mail is ongeldig.",
+ "dotnet_identity_InvalidUserName": "Gebruikersnaam '{0}' is ongeldig, mag alleen letters of cijfers bevatten.",
+ "dotnet_identity_LoginAlreadyAssociated": "Er bestaat al een gebruiker met deze login.",
+ "dotnet_identity_PasswordMismatch": "Onjuist wachtwoord.",
+ "dotnet_identity_PasswordRequiresDigit": "Wachtwoorden moeten minstens één cijfer bevatten ('0' - '9').",
+ "dotnet_identity_PasswordRequiresLower": "Wachtwoorden moeten minstens één kleine letter ('a' - 'z') bevatten.",
+ "dotnet_identity_PasswordRequiresNonAlphanumeric": "Wachtwoorden moeten minstens één niet-alfanumeriek teken bevatten.",
+ "dotnet_identity_PasswordRequiresUniqueChars": "Wachtwoorden moeten minstens {0} verschillende tekens bevatten.",
+ "dotnet_identity_PasswordRequiresUpper": "Wachtwoorden moeten minstens één hoofdletter ('A' - 'Z') hebben.",
+ "dotnet_identity_PasswordTooShort": "Wachtwoorden zijn te kort.",
+ "dotnet_identity_PwnedError": "Dit wachtwoord is eerder verschenen in een datalek en mag nooit worden gebruikt. Als je het ooit eerder ergens hebt gebruikt, verander het dan!",
+ "dotnet_identity_UserLockedOut": "Gebruiker is uitgesloten.",
"exception.invalidJsonQuery": "Json-query niet geldig: {message}",
"exception.invalidJsonQueryJson": "Json-query is niet geldig json: {message}",
"exceptions.domainObjectDeleted": "Entiteit ({id}) is verwijderd.",
diff --git a/backend/i18n/source/frontend__ignore.json b/backend/i18n/source/frontend__ignore.json
index 4635dc8c0..737bd389f 100644
--- a/backend/i18n/source/frontend__ignore.json
+++ b/backend/i18n/source/frontend__ignore.json
@@ -19,8 +19,8 @@
"#{{index + 1}}"
],
"/features/content/shared/forms/field-editor.component.html": [
- "{{field.displayName}} {{displaySuffix}}",
- "*"
+ "*",
+ "{{field.displayName}} {{displaySuffix}}"
],
"/features/content/shared/references/references-editor.component.html": [
"·"
diff --git a/backend/i18n/source/frontend_en.json b/backend/i18n/source/frontend_en.json
index d0cd7e5d7..e4c1487ea 100644
--- a/backend/i18n/source/frontend_en.json
+++ b/backend/i18n/source/frontend_en.json
@@ -90,6 +90,8 @@
"assets.searchByName": "Search by name",
"assets.searchByTags": "Search by tags",
"assets.selectMany": "Select assets",
+ "assets.specialFolder.parent": "",
+ "assets.specialFolder.root": "Assets",
"assets.tabFocusPoint": "Focus Point",
"assets.tabHistory": "History",
"assets.tabImage": "Image",
@@ -273,6 +275,16 @@
"common.preview": "Preview",
"common.product": "Squidex Headless CMS",
"common.project": "Project",
+ "common.queryOperators.contains": "contains",
+ "common.queryOperators.empty": "is empty",
+ "common.queryOperators.endsWith": "ends with",
+ "common.queryOperators.eq": "is equals to",
+ "common.queryOperators.ge": "is greater than or equals to",
+ "common.queryOperators.gt": "is greater than",
+ "common.queryOperators.le": "is less than pr equals to",
+ "common.queryOperators.lt": "is less than",
+ "common.queryOperators.ne": "is not equals to",
+ "common.queryOperators.startsWith": "starts with",
"common.refresh": "Refresh",
"common.rename": "Rename",
"common.requiredHint": "required",
@@ -347,6 +359,7 @@
"contents.draftStatus": "New Version",
"contents.editPageTitle": "Edit Content",
"contents.editTitle": "Edit Content",
+ "contents.invariantFieldDescription": "The '{fieldName}' field of the content item.",
"contents.languageModeAll": "All Languages",
"contents.languageModeSingle": "Single Language",
"contents.lastModifiedByFieldDescription": "The user who modified the content item the last time.",
@@ -357,6 +370,7 @@
"contents.loadDataFailed": "Failed to load data. Please reload.",
"contents.loadFailed": "Failed to load contents. Please reload.",
"contents.loadVersionFailed": "Failed to version a new version. Please reload.",
+ "contents.localizedFieldDescription": "The '{fieldName}' field of the content item (localized).",
"contents.newStatusFieldDescription": "The new status of the content item.",
"contents.noReference": "- No Reference -",
"contents.pendingChangesTextToChange": "You have unsaved changes.\n\nWhen you change the status you will loose them.\n\n**Do you want to continue anyway?**",
@@ -383,6 +397,16 @@
"contents.statusQueries": "Status Queries",
"contents.stockPhotoEmpty": "Nothing selected",
"contents.stockPhotoSearch": "Search for Photos by Unsplash",
+ "contents.tableHeaders.created": "Created",
+ "contents.tableHeaders.createdBy": "Created By",
+ "contents.tableHeaders.createdByShort": "By",
+ "contents.tableHeaders.id": "Id",
+ "contents.tableHeaders.lastModified": "Updated",
+ "contents.tableHeaders.lastModifiedBy": "Updated By",
+ "contents.tableHeaders.lastModifiedByShort": "By",
+ "contents.tableHeaders.nextStatus": "Next Status",
+ "contents.tableHeaders.status": "Status",
+ "contents.tableHeaders.version": "Version",
"contents.unsavedChangesText": "You have unsaved changes. Do you want to load them now?",
"contents.unsavedChangesTitle": "Unsaved changes",
"contents.updated": "Content updated successfully.",
diff --git a/backend/i18n/source/frontend_it.json b/backend/i18n/source/frontend_it.json
new file mode 100644
index 000000000..904e20258
--- /dev/null
+++ b/backend/i18n/source/frontend_it.json
@@ -0,0 +1,848 @@
+{
+ "api.contentApi": "Content API",
+ "api.generalApi": "General API",
+ "api.graphql": "GraphQL",
+ "api.graphqlPageTitle": "GraphQL",
+ "api.pageTitle": "API",
+ "api.title": "API",
+ "apps.allApps": "Tutte le Apps",
+ "apps.appLoadFailed": "Non è stato possibile caricare l'App. Per favore ricarica.",
+ "apps.appNameHint": "Puoi utilizzare solo lettere, numeri e trattini e non più di 40 caratteri.",
+ "apps.appNameValidationMessage": "Il nome può contenere lettere minuscole (a-z), numeri e trattini all'interno.",
+ "apps.appNameWarning": "Il nome della app non potrà essere cambiato in un secondo momento.",
+ "apps.appsButtonCreate": "Panoramica delle App",
+ "apps.appsButtonFallbackTitle": "Panoramica delle App",
+ "apps.archieve": "Archivia l'App",
+ "apps.archieveConfirmText": "Rimuovi il pattern",
+ "apps.archieveConfirmTitle": "Sei sicuro di voler archiviare questa app?",
+ "apps.archieveWarning": "Una volta archiviata una App, non è possibile tornare indietro. Sii certo.",
+ "apps.archiveFailed": "Non è stato possibile archiviare l'app. Per favore ricarica.",
+ "apps.create": "Crea un'App",
+ "apps.createBlankApp": "Nuova App.",
+ "apps.createBlankAppDescription": "Crea una app vuota senza contenuti o schema.",
+ "apps.createBlogApp": "Nuovo esempio di blog",
+ "apps.createBlogAppDescription": "Inizia con il nostro blog già pronto per l'uso.",
+ "apps.createFailed": "Non è stato possibile creare l'app. Per favore ricarica.",
+ "apps.createIdentityApp": "New Identity App",
+ "apps.createIdentityAppDescription": "Crea un app per Squidex Identity.",
+ "apps.createIdentityAppV2": "Nuova Identity App V2",
+ "apps.createIdentityAppV2Description": "Creare un app per Squidex Identity V2.",
+ "apps.createProfileApp": "Nuovo esempio di Profilo",
+ "apps.createProfileAppDescription": "Crea la tua pagina del profilo.",
+ "apps.createWithTemplate": "Create un esempio di {template}",
+ "apps.empty": "Non stai ancora collaborando su nessuna app",
+ "apps.generalSettings": "Generale",
+ "apps.generalSettingsDangerZone": "Generale",
+ "apps.image": "Immagine",
+ "apps.imageDrop": "Trascina il file per caricare",
+ "apps.listPageTitle": "App",
+ "apps.loadFailed": "Non è stato possibile caricare le App. Per favore ricarica.",
+ "apps.removeImage": "Rimuovi l'immagine",
+ "apps.removeImageFailed": "Non è stato possibile rimuovere l'immagine dell'app. Per favore ricarica.",
+ "apps.updateFailed": "Non è stato possibile aggiornare l'app. Per favore ricarica.",
+ "apps.upgradeHintCurrent": "Tu sei nel piano {plan}.",
+ "apps.upgradeHintUpgrade": "Aggiorna!",
+ "apps.uploadImage": "Trascina il file per sostituire l'immagine dell'app. Utilizza una dimensione quadrata.",
+ "apps.uploadImageButton": "Carica il File",
+ "apps.uploadImageFailed": "Non è stato possibile caricare l'immagine. Per favore ricarica.",
+ "apps.uploadImageTooBig": "L'immagine dell'app è troppo grande.",
+ "apps.welcomeSubtitle": "Benvenuto su Squidex.",
+ "apps.welcomeTitle": "Ciao {user}",
+ "assets.createFolder": "Crea cartella",
+ "assets.createFolderFailed": "Non è stato possibile creare la cartella degli asset. Per favore ricarica.",
+ "assets.createFolderTooltip": "Crea una nuova cartella (CTRL + SHIFT + G)",
+ "assets.deleteConfirmText": "Sei sicuro di voler cancellare la risorsa?",
+ "assets.deleteConfirmTitle": "Elimina la risorsa",
+ "assets.deleteFailed": "Non è stato possibile cancellare la risorsa. Per favore ricarica.",
+ "assets.deleteFolderConfirmText": "Sei sicuro di voler cancellare la cartella e tutte le risorse associati?",
+ "assets.deleteFolderConfirmTitle": "Elimina la cartella",
+ "assets.deleteMetadataConfirmText": "Sei sicuro di voler rimuovere questi metadati?",
+ "assets.deleteMetadataConfirmTitle": "Rimuovi metadati",
+ "assets.downloadVersion": "Scarica questa versione",
+ "assets.dropToUpdate": "Trascina il file per aggiornare",
+ "assets.duplicateFile": "La risorsa è già stata caricata.",
+ "assets.editor.flipHorizontally": "Capovolgi orizzontalmente",
+ "assets.editor.flipVertically": "Capovolgi verticalmente",
+ "assets.editor.focusPointLabel": "Clicca sull'immagine per impostare il focus",
+ "assets.editor.focusPointPreview": "Anteprima delle diverse dimensioni",
+ "assets.editor.rotateLeft": "Ruota a sinistra",
+ "assets.editor.rotateRight": "Ruota a destra",
+ "assets.fileTooBig": "La risorsa è troppo grande.",
+ "assets.folderName": "Nome della cartella",
+ "assets.folderNameHint": "Il nome della cartella viene usato solo per la visualizzazione e può non essere univoco.",
+ "assets.insertAssets": "Inserisci le risorse",
+ "assets.linkSelected": "Collega le risorse selezionate ({count})",
+ "assets.listPageTitle": "Risorse",
+ "assets.loadFailed": "Non è stato possibile caricare le risorse. Per favore ricarica.",
+ "assets.loadFoldersFailed": "Non è stato possibile caricare le cartelle delle risorse. Per favore ricarica.",
+ "assets.metadata": "Metadati",
+ "assets.metadataAdd": "Aggiungi i Metadati",
+ "assets.moveFailed": "Non è stato possibile spostare la risorsa. Per favore ricarica.",
+ "assets.protected": "Protetto",
+ "assets.refreshTooltip": "Aggiorna le risorse (CTRL + SHIFT + R)",
+ "assets.reloaded": "Risorse ricaricate.",
+ "assets.renameFolder": "Rinomina la cartella",
+ "assets.replaceConfirmText": "Sei sicuro di voler sostituire la risorsa con una nuova versione?",
+ "assets.replaceConfirmTitle": "Sostituisco la risorsa?",
+ "assets.replaceFailed": "Non è stato possibile sostituire la risorsa. Per favore ricarica.",
+ "assets.searchByName": "Ricerca per nome",
+ "assets.searchByTags": "Ricerca per tag",
+ "assets.selectMany": "Seleziona le risorse",
+ "assets.tabFocusPoint": "Punto focale",
+ "assets.tabHistory": "Cronologia",
+ "assets.tabImage": "Immagine",
+ "assets.tabMetadata": "Metadati",
+ "assets.updated": "La risorsa è stata aggiornata.",
+ "assets.updateFailed": "Non è stato possibile aggiornare la risorsa. Per favore ricarica.",
+ "assets.updateFolderFailed": "Non è stato possibile aggiornare la cartella delle risorse. Per favore ricarica.",
+ "assets.uploadByDialog": "Seleziona il(i) File",
+ "assets.uploadByDrop": "Trascina i file qui per il caricamento",
+ "assets.uploaderUploadHere": "Nessun caricamento in corso, trascina qui i file.",
+ "assets.uploadFailed": "Non è stato possibile caricare la risorsa. Per favore ricarica.",
+ "assets.uploadHint": "Trascina il file sull'elemento esistente per poterlo sostituire con una versione più recente.",
+ "backups.backupCountAssetsLabel": "Risorse",
+ "backups.backupCountAssetsTooltip": "Risorse archiviate",
+ "backups.backupCountEventsLabel": "Eventi",
+ "backups.backupCountEventsTooltip": "Eventi archiviati",
+ "backups.backupDownload": "Scarica",
+ "backups.backupDownloadLink": "Pronto",
+ "backups.backupDuration": "Durata",
+ "backups.deleteConfirmText": "Sei sicuro di voler cancellare il backup?",
+ "backups.deleteConfirmTitle": "Cancella il backup",
+ "backups.deleted": "Il backup sta per essere cancellato.",
+ "backups.deleteFailed": "Non è stato possibile cancellare il backup.",
+ "backups.empty": "Nessun backup è stato ancora creato.",
+ "backups.loadFailed": "Non è stato possibile caricare i backup.",
+ "backups.maximumReached": "Hai raggiunto il numero massimo di backup: 10.",
+ "backups.refreshTooltip": "Aggiorna i backup (CTRL + SHIFT + R)",
+ "backups.reloaded": "Backup aggiornati.",
+ "backups.restore": "Backup ripristinato",
+ "backups.restoreFailed": "Non è stato possibile avviare il ripristino.",
+ "backups.restoreLastStatus": "Ultima operazione di ripristino",
+ "backups.restoreLastUrl": "Url per il backup",
+ "backups.restoreNewAppName": "Nome dell'app opzionale",
+ "backups.restorePageTitle": "Ripristinare il Backup",
+ "backups.restoreStarted": "Ripristino avviato, il suo completamento potrebbe richiedere alcuni minuti.",
+ "backups.restoreStartedLabel": "Avviato",
+ "backups.restoreStoppedLabel": "Fermato",
+ "backups.restoreTitle": "Ripristinare il Backup",
+ "backups.start": "Avvia Backup",
+ "backups.started": "Backup avviato, il suo completamento potrebbe richiedere alcuni minuti.",
+ "backups.startedLabel": "Avviato",
+ "backups.startFailed": "Non è stato possibile avviare il backup.",
+ "clients.add": "Aggiungi un Client",
+ "clients.addFailed": "Non è stato possibile aggiungere un client. Per favore ricarica.",
+ "clients.allowAnonymous": "Consenti l'accesso anonimo.",
+ "clients.allowAnonymousHint": "Consenti l'accesso alle API senza token di accesso a tutte le risorse che sono configurate per il ruolo di questo client. E' possibile avere un solo client impostato con accesso anonimo.",
+ "clients.clientIdValidationMessage": "Il nome deve contenere solo lettere, numeri, trattini e spaziNa.",
+ "clients.clientNamePlaceholder": "Inserisci il nome del client",
+ "clients.connect": "Connettere",
+ "clients.connectWizard.cli": "Connettere con la Squidex CLI",
+ "clients.connectWizard.cliHint": "Scarica a CLI e collega questa app per iniziare il backup, sincronizzare gli schema ed esportare i contenuti.",
+ "clients.connectWizard.cliStep1": "Prendi l'ultima versione della Squidex CLI",
+ "clients.connectWizard.cliStep1Download": "[Scarica la CLI da Github](https://github.com/Squidex/squidex-samples/releases)",
+ "clients.connectWizard.cliStep1Hint": "Le release contengono file binari per tutte le operazioni di sistema maggiori e piccoli file da scariscare se hai installato il Core .NET Core.",
+ "clients.connectWizard.cliStep2": "Inserisci `` per impostare la variabile `$PATH`",
+ "clients.connectWizard.cliStep3": "Inserisci il nome della tua app per la configurazione della CLI",
+ "clients.connectWizard.cliStep3Hint": "E' possibile gestire le configurazionie per le diverse appi all'interno della CLI e passare ad un'app.",
+ "clients.connectWizard.cliStep4": "Passa alla tua app usando CLI",
+ "clients.connectWizard.manually": "Connetti manualmente",
+ "clients.connectWizard.manuallyHint": "Leggi le istruzioni su come stabilire una connessione utilizzando Postman o curl.",
+ "clients.connectWizard.manuallyStep1": "Ottenere un tocket usando curl",
+ "clients.connectWizard.manuallyStep2": "Utilizza il seguente token",
+ "clients.connectWizard.manuallyStep3": "Aggiungi il tocken come header HTTP header a tutte le richieste",
+ "clients.connectWizard.manuallyTokenHint": "Solitamente i Token scadono dopo 30 giorni, ma puoi richiedere token multipli.",
+ "clients.connectWizard.postManDocs": "Per il tutorial Postman inizia da questo link [Documentazione](https://docs.squidex.io/02-documentation/developer-guides/api-overview/postman).",
+ "clients.connectWizard.sdk": "Connetti la tua APP utilizzando SDK",
+ "clients.connectWizard.sdkHelp": "Hai bisogno di un altro SDK?",
+ "clients.connectWizard.sdkHelpLink": "Contattaci nel Forum di assistenza",
+ "clients.connectWizard.sdkHint": "Scarica l'SDK e connetti quest'app.",
+ "clients.connectWizard.sdkStep1": "Installa .NET SDK",
+ "clients.connectWizard.sdkStep1Download": "L'SDK è disponibile su [nuget](https://www.nuget.org/packages/Squidex.ClientLibrary/)",
+ "clients.connectWizard.sdkStep2": "Crea un client manager",
+ "clients.connectWizard.step0Title": "Setup client",
+ "clients.connectWizard.step1Title": "Scegli la tipologia di connessione",
+ "clients.connectWizard.step2Title": "Collega",
+ "clients.deleteConfirmText": "Sei sicuro di voler rimuovere il client?",
+ "clients.deleteConfirmTitle": "Rimuovere il client",
+ "clients.empty": "Nessun client ancora creato.",
+ "clients.loadFailed": "Non è stato possibile caricare i client. Per favore ricarica.",
+ "clients.refreshTooltip": "Agigorna i client (CTRL + SHIFT + R)",
+ "clients.reloaded": "Client ricaricati.",
+ "clients.revokeFailed": "Non è stato possibile rimuovere il client. Per favore ricarica.",
+ "clients.tokenFailed": "Non è stato possibile creare il token. Per favore riprova.",
+ "comments.create": "Creare un commento",
+ "comments.createFailed": "Non è stato possibile creare un commento.",
+ "comments.deleteConfirmText": "Sei sicuro di voler cancellare il commmento?",
+ "comments.deleteConfirmTitle": "Cancella il comment",
+ "comments.deleteFailed": "Non è stato possibile cancellare il commento.",
+ "comments.follow": "Segui",
+ "comments.loadFailed": "Non è stato possibile caricare i commenti.",
+ "comments.title": "Commenti",
+ "comments.updateFailed": "Non è stato possibile aggiornare il commento.",
+ "common.actions": "Azioni",
+ "common.administration": "Amministrazione",
+ "common.administrationPageTitle": "Amministrazione",
+ "common.api": "API",
+ "common.apps": "App",
+ "common.aspectRatio": "Proporzioni",
+ "common.assets": "Risorse",
+ "common.back": "Indietro",
+ "common.backups": "Backup",
+ "common.bytes": "byte",
+ "common.cancel": "Annulla",
+ "common.clear": "Pulisci",
+ "common.clientId": "Id Client",
+ "common.clients": "Client",
+ "common.clientSecret": "Secret Client",
+ "common.clipboardAdded": "Il valore è stato aggiunto nei tuoi appunti.",
+ "common.clone": "Clona",
+ "common.cluster": "Raggruppamento",
+ "common.clusterPageTitle": "Raggruppamento",
+ "common.comments": "Commenti",
+ "common.confirm": "Conferma",
+ "common.consumers": "Utenti",
+ "common.content": "Contentenuto",
+ "common.contents": "Contentenuti",
+ "common.continue": "Continua",
+ "common.contributors": "Collaboratori",
+ "common.create": "Crea",
+ "common.created": "Creato",
+ "common.date": "Data",
+ "common.dateTimeEditor.now": "Data e Ora attuale",
+ "common.dateTimeEditor.nowTooltip": "Imposta la data e l'ora attuale (UTC)",
+ "common.dateTimeEditor.today": "Oggi",
+ "common.dateTimeEditor.todayTooltip": "Imposta la data di oggi (UTC)",
+ "common.delete": "Cancella",
+ "common.description": "Descrizione",
+ "common.displayName": "Nome visualizzato",
+ "common.edit": "Modifica",
+ "common.email": "Email",
+ "common.error": "Errore",
+ "common.errorBack": "Torna alla pagina precedente.",
+ "common.errorNoPermission": "Non hai i permessi per questo.",
+ "common.errorNotFound": "Non trovato",
+ "common.event": "Evento",
+ "common.events": "Eventi",
+ "common.executed": "Eseguito",
+ "common.expertMode": "Modalità esperto",
+ "common.failed": "Fallito",
+ "common.fallback": "Alternativa",
+ "common.field": "Campo",
+ "common.files": "Campi",
+ "common.filters": "Filtri",
+ "common.folders": "Cartelle",
+ "common.generalSettings": "Impostazioni generali",
+ "common.generate": "Genera",
+ "common.github": "Github",
+ "common.height": "Altezza",
+ "common.help": "Aiuto",
+ "common.helpTour": "Fare clic sull'icona della guida per mostrare una pagina della guida specifica per questo contesto. Vai a",
+ "common.hide": "Nascondi",
+ "common.hints": "Suggerimenti",
+ "common.history": "Cronologia",
+ "common.httpConflict": "Non è stato possibile effettuare l'aggiornamento. Un altro utente ha fatto delle modifiche. Per favore ricarica.",
+ "common.httpLimit": "Hai superato il limite massimo di chiamate API.",
+ "common.label": "Etichetta",
+ "common.languages": "Lingue",
+ "common.latitudeShort": "Lat",
+ "common.loading": "Caricamento",
+ "common.logout": "Esci",
+ "common.logs": "Log",
+ "common.longitudeShort": "Lon",
+ "common.mapHide": "Nascondi la mappa",
+ "common.mapShow": "Mostra la mappa",
+ "common.message": "Messaggio",
+ "common.name": "Nome",
+ "common.no": "No",
+ "common.nothingChanged": "Non è stato cambiato niente.",
+ "common.noValue": "- Nessun valore -",
+ "common.or": "o",
+ "common.pagerInfo": "{itemFirst}-{itemLast} of {numberOfItems}",
+ "common.password": "Password",
+ "common.passwordConfirm": "Conferma Password",
+ "common.pattern": "Pattern",
+ "common.patterns": "Pattern",
+ "common.permissions": "Permessi",
+ "common.preview": "Anteprima",
+ "common.product": "Squidex Headless CMS",
+ "common.project": "Progetto",
+ "common.refresh": "Aggiorna",
+ "common.rename": "Rinomina",
+ "common.requiredHint": "obbligatorio",
+ "common.reset": "Reimposta",
+ "common.restore": "Ripristina",
+ "common.role": "Ruolo",
+ "common.roles": "Ruoli",
+ "common.rules": "Regole",
+ "common.sampleCodeLabel": "Esempio di codice per",
+ "common.save": "Salva",
+ "common.saveShortcut": "CTRL + S",
+ "common.schemas": "Schemi",
+ "common.searchGoogleMaps": "Cerca su Google Maps",
+ "common.searchResults": "Risultati di ricerca",
+ "common.separateByLine": "Separato dalla linea",
+ "common.settings": "Impostazioni",
+ "common.sidebarTour": "La barra di navigazione laterale contiene specifici utili collegamenti per il contesto. Qui puoi visualizzare la cronologia dei cambiamenti di questo schema.",
+ "common.slug": "Slug",
+ "common.stars.max": "Non deve avere più di 15 stelle",
+ "common.status": "Stato",
+ "common.statusChangeTo": "Cambia in",
+ "common.submit": "Invia",
+ "common.subscription": "Abbonamenti",
+ "common.succeeded": "Successo",
+ "common.tagAdd": ", aggiungi al tag",
+ "common.tagAddReference": ", aggiungi al collegamento",
+ "common.tagAddSchema": ", aggiungi allo schema",
+ "common.tags": "Tag",
+ "common.tagsAll": "Tutti i tag",
+ "common.time": "Ora",
+ "common.update": "Aggiorna",
+ "common.url": "URL",
+ "common.users": "Utenti",
+ "common.value": "Valore",
+ "common.width": "Larghezza",
+ "common.workflow": "Workflow",
+ "common.workflows": "Workflow",
+ "common.yes": "Si",
+ "contents.arrayAddItem": "Aggiungi un elemento",
+ "contents.arrayCloneItem": "Clona questo elemento",
+ "contents.arrayCollapseAll": "Comprimi tutti gli elementi",
+ "contents.arrayCollapseItem": "Comprimi l'elemento",
+ "contents.arrayExpandAll": "Espandi tutti gli elementi",
+ "contents.arrayExpandItem": "Espandi questo elemento",
+ "contents.arrayMoveBottom": "Sposta questo elemento in basso",
+ "contents.arrayMoveDown": "Sposta giù questo elemento ",
+ "contents.arrayMoveTop": "Sposta in cima questo elemento",
+ "contents.arrayMoveUp": "Sposta su questo elemento",
+ "contents.arrayNoFields": "Aggiungi un primo campo annidato agli elementi.",
+ "contents.assetsUpload": "Trascina i file o clicca",
+ "contents.autotranslate": "Traduci in automatico dalla lingua principale",
+ "contents.changeStatusTo": "Cambia l'elemeto(i) del contenuti in {action}",
+ "contents.changeStatusToImmediately": "Imposta {action} immediatamente.",
+ "contents.changeStatusToLater": "Imposta {action} ad una data e ora successiva.",
+ "contents.contentNotValid": "Un elemento del contenuto non è valido, verifica il campo con la barra rossa per tutte le lingue impostate (se presenti).",
+ "contents.create": "Nuovo",
+ "contents.createContentTooltip": "Nuovo contenuto (CTRL + SHIFT + G)",
+ "contents.created": "Contenuto creato con successo.",
+ "contents.createdByFieldDescription": "L'utente che ha creato l'elemento del contenuto.",
+ "contents.createFailed": "Non è stato possibile creare il contenuto. Per favore ricarica.",
+ "contents.createFieldDescription": "La data e l'ora di creazione del contenuto.",
+ "contents.createPageTitle": "Crea un contenuto",
+ "contents.createTitle": "Nuovo Contenuto",
+ "contents.currentStatusLabel": "Versione corrente",
+ "contents.deleteConfirmText": "Sei sicuro di voler eliminare il contenuto?",
+ "contents.deleteConfirmTitle": "Elimina il contenuto",
+ "contents.deleteFailed": "Non è stato possibile eliminare il contenuto. Per favore ricarica.",
+ "contents.deleteManyConfirmText": "Sei sicuro di voler eliminare gli elementi del contenuto selezionati?",
+ "contents.deleteVersionConfirmText": "Do you really want to delete this version?",
+ "contents.deleteVersionFailed": "Non è stato possibile eliminare la versione. Per favore ricarica.",
+ "contents.draftNew": "Nuova bozza",
+ "contents.draftStatus": "Nuova versione",
+ "contents.editPageTitle": "Modifica contenuto",
+ "contents.editTitle": "Modifica il contenuto",
+ "contents.languageModeAll": "Tutte le lingue",
+ "contents.languageModeSingle": "Una sola lingua",
+ "contents.lastModifiedByFieldDescription": "L'utente che ha modificato l'elememto l'ultima voltaThe user who modified the content item the last time.",
+ "contents.lastModifiedFieldDescription": "La data e l'ora dell'ultima modifica del contenuto.",
+ "contents.lastUpdatedLabel": "Ultimo aggiornamento",
+ "contents.loadContent": "Carica",
+ "contents.loadContentFailed": "Non è stato possibile caricare il contenuto. Per favore ricarica.",
+ "contents.loadDataFailed": "Non è stato possibile caricare i dati. Per favore ricarica.",
+ "contents.loadFailed": "Non è stato possibile caricare i contenuti. Per favore ricarica.",
+ "contents.loadVersionFailed": "Non è stato possibile version a new version. Per favore ricarica.",
+ "contents.noReference": "- Nessun collegamento -",
+ "contents.pendingChangesTextToChange": "Non hai salvato le modifiche.\n\nSe cambi lo stato perderai le modifiche.\n\n**Sei sicuro di voler continuare?**",
+ "contents.pendingChangesTextToClose": "Non hai salvato le modifiche.\n\nChiudendo il contenuto corrente perderai tutte le modifiche.\n\n**Sei sicuro di voler continuare?**",
+ "contents.pendingChangesTitle": "Modifiche non salvate",
+ "contents.referencesCreateNew": "Aggiungi nuovo",
+ "contents.referencesCreatePublish": "Crea e pubblica",
+ "contents.referencesLink": "Collega i contenuti selezionati ({count})",
+ "contents.referencesSelectExisting": "Seleziona da contenuti esistenti",
+ "contents.referencesSelectSchema": "Seleziona {schema}",
+ "contents.refreshTooltip": "Aggiorna i contenuti (CTRL + SHIFT + R)",
+ "contents.reloaded": "Contenuti aggiornati.",
+ "contents.saveAndPublish": "Salva e pubblica",
+ "contents.scheduledAt": "alle",
+ "contents.scheduledAtLabel": "alle",
+ "contents.scheduledTo": "a",
+ "contents.schemasPageTitle": "Contenuti",
+ "contents.searchPlaceholder": "Ricerca testuale",
+ "contents.searchSchemasPlaceholder": "Cerca schemi...",
+ "contents.selectionCount": "{count} elementi selezionati",
+ "contents.statusFieldDescription": "Stato dell'elemento del contenuto.",
+ "contents.statusQueries": "Stato Query",
+ "contents.stockPhotoEmpty": "Nessuna selezione",
+ "contents.stockPhotoSearch": "Cerca foto su Unsplash",
+ "contents.unsavedChangesText": "Non hai salvato le modifiche. Vuoi salvarle adesso?",
+ "contents.unsavedChangesTitle": "Modifiche non salvate",
+ "contents.updated": "Contenuto aggiornato con successo.",
+ "contents.updateFailed": "Non è stato possibile aggiornare il contenuto. Per favore ricarica.",
+ "contents.validationHint": "Ricorda di verificare tutte le lingue quando vedi errori di validazione.",
+ "contents.versionCompare": "Confronta",
+ "contents.versionDelete": "Cancella questa Versione",
+ "contents.versionFieldDescription": "La versione dell'elemento del contenuto",
+ "contents.versionViewing": "Stai guardando la versione **{version}**.",
+ "contents.viewLatest": "Visualizza l'ultima",
+ "contents.viewReset": "Imposta la visualizzazione predefinita",
+ "contributors.add": "Aggiungi un collaboratore",
+ "contributors.addFailed": "Non è stato possibile aggiungere collaboratori. Per favore ricarica.",
+ "contributors.contributorAssigned": "Un nuovo utente, con indirizzo email, è stato creato e aggiunto come collaboratore.",
+ "contributors.contributorAssignedExisting": "L'utente è stato assegnato",
+ "contributors.contributorAssignedInvited": "L'utente è stato invitato e assegnato.",
+ "contributors.contributorAssignedOld": "L'utente è stato aggiunto come collaboratore.",
+ "contributors.deleteConfirmText": "Sei sicuro di voler rimuovere il collaboratore?",
+ "contributors.deleteConfirmTitle": "Rimuovi il collaboratore",
+ "contributors.deleteFailed": "Non è stato possibile cancellare il collaboratore. Per favore ricarica.",
+ "contributors.emailPlaceholder": "Cerca un utente esistente o invitalo tramite email",
+ "contributors.empty": "Nessun collaboratore trovato.",
+ "contributors.import.emailsDetected": "Email trovate: {count}",
+ "contributors.import.run": "Aggiungi Collaboratori",
+ "contributors.import.run2": "Importa",
+ "contributors.importButton": "Aggiungi più collaboratori contemporaneamente",
+ "contributors.importHintg": "Team numeroso?",
+ "contributors.importTitle": "Importa collaboratori",
+ "contributors.loadFailed": "Non è stato possibile caricare contributors. Per favore ricarica.",
+ "contributors.planHint": "Il tuo piano prevede un numero massimo di {maxContributors} collaboratori.",
+ "contributors.refreshTooltip": "Aggiorna i collaboratori (CTRL + SHIFT + R)",
+ "contributors.reloaded": "Collaboratori aggiornati.",
+ "contributors.search": "Cerca",
+ "contributors.userNotFound": "L'utente non esiste.",
+ "dashboard.apiCallsCard": "Chiamate API ",
+ "dashboard.apiCallsChart": "Grafico delle chiamate API",
+ "dashboard.apiCallsLimitLabel": "Limite mensile",
+ "dashboard.apiCallsSummaryCard": "Riepilogo chiamate API",
+ "dashboard.apiDocumentationCard": "Documentazione delle API",
+ "dashboard.apiPerformanceCard": "Performance(ms) delle API: {summary}ms avg",
+ "dashboard.apiPerformanceChart": "Diagramma delle Performance delle API",
+ "dashboard.assetSizeCard": "Dimensione delle risorse (MB",
+ "dashboard.assetSizeLabel": "Dimensione totale",
+ "dashboard.assetSizeLimitLabel": "Limite totale",
+ "dashboard.assetTotalSize": "Dimensione totale dello Storage per le risorse",
+ "dashboard.assetUpdloadsCountChart": "Diagramma del numero di risorse caricate",
+ "dashboard.assetUploadsCard": "Risorse caricate",
+ "dashboard.assetUploadsSizeChart": "Diagramma della dimensione delle risorse caricate",
+ "dashboard.configSaved": "Configurazione salvata.",
+ "dashboard.contentApi": "API dei contenuti",
+ "dashboard.contentApiDescription": "Documentazione OpenAPI 3.0 compatibile per i contenuti della tua app.",
+ "dashboard.contentsSummaryCard": "Numero di elementi",
+ "dashboard.currentMonthLabel": "Questo mese",
+ "dashboard.downloadLog": "Scarica i Log",
+ "dashboard.editConfig": "Modifica la configurazione",
+ "dashboard.githubCard": "Github",
+ "dashboard.githubCardDescription": "Ottieni il codice sorgente da GitHub e segnala bug o richiedi assistenza.",
+ "dashboard.historyCard": "Cronologia",
+ "dashboard.pageTitle": "Dashboard",
+ "dashboard.resetConfigConfirmText": "Sei sicuro di voler riportare la dashboard alle impostazioni predefinite?",
+ "dashboard.resetConfigConfirmTitle": "Ripristina la configurazione",
+ "dashboard.schemaNewCard": "Nuovo Schema",
+ "dashboard.schemaNewCardDescription": "Uno schena definisce la struttura di un tipo di contenuto.",
+ "dashboard.schemasCard": "Schemi",
+ "dashboard.schemasCardDescription": "Panoramica del modello dei dati di questa app.",
+ "dashboard.stackedChart": "Istogramma in pila",
+ "dashboard.supportCard": "Feedback & Assistenza",
+ "dashboard.supportCardDescription": "Fornisci feedback e richiedi funzionalità per aiutarci a migliorare Squidex..",
+ "dashboard.trafficChart": "Diagramma del traffico delle API",
+ "dashboard.trafficHeader": "Traffico (MB)",
+ "dashboard.trafficLimitLabel": "Limite mensile",
+ "dashboard.trafficSummaryCard": "Riepilogo del traffico delle API",
+ "dashboard.welcomeText": "Benvenuto su **{app}** dashboard.",
+ "dashboard.welcomeTitle": "Ciao {user}",
+ "eventConsumers.loadFailed": "Non è stato possibile caricare event consumers. Per favore ricarica.",
+ "eventConsumers.pageTitle": "Eventi degli utenti",
+ "eventConsumers.position": "Posizione",
+ "eventConsumers.refreshTooltip": "Aggiorna gli eventi degli utenti (CTRL + SHIFT + R)",
+ "eventConsumers.reloaded": "Eventi degli utenti aggiornati.",
+ "eventConsumers.resetFailed": "Non è stato possibile ripristinare gli eventi degli utenti. Per favore ricarica.",
+ "eventConsumers.resetTooltip": "Ripristina gli event degli utenti",
+ "eventConsumers.startFailed": "Non è stato possibile far partire l'evento dell'utente. Per favore ricarica.",
+ "eventConsumers.startTooltip": "Inizia l'evento utente",
+ "eventConsumers.stopFailed": "Non è stato possibile fermare l'evento dell'utente. Per favore ricarica.",
+ "eventConsumers.stopTooltip": "Interrompi l'evento dell'utente",
+ "features.loadFailed": "Non è stato possibile caricare le funzionalità. Per favore ricarica.",
+ "history.loadFailed": "Non è stato possibile caricare la cronologia. Per favore ricarica.",
+ "history.title": "Attività",
+ "languages.add": "Aggiungi lingua",
+ "languages.addFailed": "Non è stato possibile aggiungere la lingua. Per favore ricarica.",
+ "languages.deleteConfirmText": "Sei sicuro di voler rimuovere la lingua?",
+ "languages.deleteConfirmTitle": "Rimuovi la lingua",
+ "languages.deleteFailed": "Non è stato possibile cancellare la lingua. Per favore ricarica.",
+ "languages.loadFailed": "Non è stato possibile caricare le lingue. Per favore ricarica.",
+ "languages.master": "è la principale",
+ "languages.masterHint": "Se non è stata impostata nessuna lingua come alternativa, le altre lingue hanno la lingua principale come alternativa.",
+ "languages.optional": "E' Opzionale",
+ "languages.optionalHint": "Se sono presenti campi obbligatori questi non devono essere compilati anche per le lingue opzionali.",
+ "languages.refreshTooltip": "Aggiorna le lingue (CTRL + SHIFT + R)",
+ "languages.reloaded": "Lingue ricaricate.",
+ "languages.updateFailed": "Non è stato possibile cambiare la lingua. Per favore ricarica.",
+ "news.headline": "Che cosa c'è di nuovo?",
+ "news.title": "Nuove funzionalità",
+ "notifo.subscripeTooltip": "Fai clic su questo pulsante per iscriverti a tutte le modifiche e ricevere le notifiche push.",
+ "patterns.deleteConfirmText": "Sei sicuro di voler rimuovere il pattern?",
+ "patterns.deleteConfirmTitle": "Cancella il pattern",
+ "patterns.deleteFailed": "Non è stato possibile rimuovere il pattern. Per favore ricarica.",
+ "patterns.empty": "Nessun pattern è stato ancora creato.",
+ "patterns.loadFailed": "Non è stato possibile aggiungere il pattern. Per favore ricarica.",
+ "patterns.nameValidationMessage": "Il nome può contenere solo lettere, numeri, trattini e spazi.",
+ "patterns.refreshTooltip": "Aggiorna i pattern (CTRL + SHIFT + R)",
+ "patterns.reloaded": "Pattern ricaricati.",
+ "patterns.updateFailed": "Non è stato possibile aggiornare pattern. Per favore ricarica.",
+ "plans.billingPortal": "Portal di Fatturazione",
+ "plans.billingPortalHint": "Vai al Portal di fatturazione per lo storico dei pagamenti e una panoramica per l'abbonamento.",
+ "plans.change": "Cambia",
+ "plans.changeConfirmTitle": "Cambia abbonamento",
+ "plans.changeFailed": "Non è stato possibile cambiare il piano. Per favore ricarica.",
+ "plans.includedCalls": "Chiamate API",
+ "plans.includedContributors": "Collaboratori",
+ "plans.includedStorage": "Spazio disco",
+ "plans.includedTraffic": "Traffico",
+ "plans.loadFailed": "Non è stato possibile caricare i piani. Per favore ricarica.",
+ "plans.noPlanConfigured": "Nessun piano è stato impostato, quest'app ha spazio disco ha un uso illiminato.",
+ "plans.notPlanOwner": "Non hai creato nessun abbonamento, pertanto non è possibile cambiare il piano.",
+ "plans.perMonth": "Al Mese",
+ "plans.perYear": "all'Anno",
+ "plans.refreshTooltip": "Aggiorna i piani (CTRL + SHIFT + R)",
+ "plans.reloaded": "Piano aggiornati.",
+ "plans.selected": "Selezionato",
+ "profile.title": "Profilo",
+ "profile.userEmail": "Accesso con",
+ "roles.add": "Aggiungi un ruolo",
+ "roles.addFailed": "Non è stato possibile aggiungere il ruolo. Per favore ricarica.",
+ "roles.default.owner": "Hai come amministratore tutte le funzionalità, compreso cancellare le app.",
+ "roles.default.reader": "Hai un'utenza in sola lettura sia per i contenuti che per le risorse.",
+ "roles.defaults.developer": "Hai un'utenza che può visualizzare le API, modificare le risorse, i contenuti, gli schema, le regole, i workflows e i pattern.",
+ "roles.defaults.editor": "Hai un'utenzaCan che può modificare le risorse, i conteuti e visualizzare i workflow.",
+ "roles.deleteConfirmText": "Cancella il ruolo",
+ "roles.deleteConfirmTitle": "Sei sicuro di voler eliminare il ruolo?",
+ "roles.loadFailed": "Non è stato possibile caricare i ruoli. Per favore ricarica.",
+ "roles.loadPermissionsFailed": "Non è stato possibile caricare i permessi. Per favore ricarica.",
+ "roles.refreshTooltip": "Aggiorna i ruoli (CTRL + SHIFT + R)",
+ "roles.reloaded": "Ruoli ricaricati.",
+ "roles.revokeFailed": "Non è stato possibile rimuovere il ruolo. Per favore ricarica.",
+ "roles.roleNamePlaceholder": "Inserisci il nome del ruolo",
+ "roles.updateFailed": "Non è stato possibile aggiornare il ruolo. Per favore ricarica.",
+ "rules.actionEdit": "Mdifica l'Azione",
+ "rules.cancelFailed": "Non è stato possibile eliminare la regola. Per favore ricarica.",
+ "rules.create": "Crea un nuova Regola",
+ "rules.createFailed": "Non è stato possibile creare una nuova regola. Per favore ricarica.",
+ "rules.createTooltip": "Nuova regola (CTRL + SHIFT + G)",
+ "rules.deleteConfirmText": "Sei sicuro di voler eliminare la regola?",
+ "rules.deleteConfirmTitle": "Cancella la regola",
+ "rules.deleteFailed": "Non è stato possibile eliminare la regola. Per favore ricarica.",
+ "rules.disableFailed": "Non è stato possibile disabilitare la regola. Per favore ricarica.",
+ "rules.empty": "Nessuna regola è stato ancora creata.",
+ "rules.emptyAddRule": "Aggiungi una regola",
+ "rules.enableFailed": "Non è stato possibile abilitare la regola. Per favore ricarica.",
+ "rules.enqueued": "La regola è stata aggiunta alle code.",
+ "rules.listPageTitle": "Regole",
+ "rules.loadFailed": "Non è stato possibile caricare le regole. Per favore ricarica.",
+ "rules.readMore": "Leggi di più",
+ "rules.refreshEventsTooltip": "Aggiorna gli Eventi (CTRL + SHIFT + R)",
+ "rules.refreshTooltip": "Aggiorna le Regole (CTRL + SHIFT + R)",
+ "rules.reloaded": "Regole ricaricate.",
+ "rules.restarted": "La Regola sarà eseguita fra pochi secondi.",
+ "rules.ruleEvents.cancelFailed": "Non è stato possibile cancellare l'evento della regola. Per favore ricarica.",
+ "rules.ruleEvents.enqueue": "Metti in coda",
+ "rules.ruleEvents.enqueued": "Eventi messo in coda. L'evento potrà essere rieseguto fra pochi secondi.",
+ "rules.ruleEvents.enqueueFailed": "Non è stato possibile mettere in coda l'evento della regola. Per favore ricarica.",
+ "rules.ruleEvents.lastInvokedLabel": "Ultima chiamata",
+ "rules.ruleEvents.listPageTitle": "Eventi della Regola",
+ "rules.ruleEvents.loadFailed": "Non è stato possibile caricare gli eventi. Per favore ricarica.",
+ "rules.ruleEvents.nextAttemptLabel": "Successivo",
+ "rules.ruleEvents.numAttemptsLabel": "Tentativi",
+ "rules.ruleEvents.reloaded": "Eventi della regola ricaricati.",
+ "rules.ruleSyntax.if": "If",
+ "rules.ruleSyntax.then": "then",
+ "rules.run": "Esegui",
+ "rules.runFailed": "Non è stato possibile eseguire la regola. Per favore ricarica.",
+ "rules.runningRule": "La regola '{name}' è attualmente in esecuzione.",
+ "rules.runRuleConfirmText": "Sei sicuro di voler eseguire la regola per tutti gli eventi?",
+ "rules.runRuleConfirmTitle": "Esegui la regola",
+ "rules.stop": "La regola si fermerà al più presto.",
+ "rules.triggerConfirmText": "Sei sicuro che voler attivare la regola?",
+ "rules.triggerConfirmTitle": "Attiva la regola",
+ "rules.triggerEdit": "Modifica l'Attivazione",
+ "rules.triggerFailed": "Non è stato possibile attivare la regola. Per favore ricarica.",
+ "rules.unnamed": "Regola senza nome",
+ "rules.updateFailed": "Non è stato possibile aggiornare la regola. Per favore ricarica.",
+ "rules.wizard.actionHint": "La selezione del tipo di azione non potrà essere modificata successivamente.",
+ "rules.wizard.selectAction": "Seleziona l'Azione",
+ "rules.wizard.selectTrigger": "Seleziona l'Attivazione",
+ "rules.wizard.triggerHint": "La selezione del tipo di attivazione non potrà essere modificata successivamente.",
+ "schemas.addField": "Aggiungi un Campo",
+ "schemas.addFieldAndClose": "Crea e chiudi",
+ "schemas.addFieldAndCreate": "Crea e aggiungi il campo",
+ "schemas.addFieldAndEdit": "Crea e modifica il campo",
+ "schemas.addFieldButton": "Aggiungi il Campo",
+ "schemas.addFieldFailed": "Non è stato possibile aggiungere il campo. Per favore ricarica.",
+ "schemas.addNestedField": "Aggiungi un campo annidato",
+ "schemas.changeCategoryFailed": "Non è stato possibile cambiare la categoria. Per favore ricarica.",
+ "schemas.clone": "Clona lo Schema",
+ "schemas.contextMenuTour": "Apri il menu per cancellare lo schema o per inserire alcuni script che modificano il contenuto.",
+ "schemas.create": "Crea uno Schema",
+ "schemas.createCategory": "Crea una nuova categoria...",
+ "schemas.createFailed": "Non è stato possibile creare lo schema. Per favore ricarica.",
+ "schemas.createSchemaTooltip": "Nuovo Schema (CTRL + SHIFT + G)",
+ "schemas.deleteConfirmText": "Sei sicuro di voler eliminare lo schema?",
+ "schemas.deleteConfirmTitle": "Cancella lo schema",
+ "schemas.deleteFailed": "Non è stato possibile cancellare lo schema. Per favore ricarica.",
+ "schemas.deleteFieldFailed": "Non è stato possibile cancellare il campo. Per favore ricarica.",
+ "schemas.deleteRuleConfirmText": "Sei sicuro di cancellare questa regola per il campo?",
+ "schemas.deleteRuleConfirmTitle": "Cancellare la regola per il campo",
+ "schemas.deleteUrlConfirmText": "Sei sicuro di voler rimuovere questa URL?",
+ "schemas.deleteUrlConfirmTitle": "Cancella URL",
+ "schemas.disableFieldFailed": "Non è stato possibile disabilitare il campo. Per favore ricarica.",
+ "schemas.enableFieldFailed": "Non è stato possibile abilitare il campo. Per favore ricarica.",
+ "schemas.export.deleteFields": "Cancella i campi",
+ "schemas.export.recreateFields": "Ricrea i campi",
+ "schemas.export.synchronize": "Sincronizza",
+ "schemas.field.allowedValues": "Valori consentiti",
+ "schemas.field.defaultValue": "Valori predefiniti",
+ "schemas.field.deleteConfirmText": "Sei sicuro di voler eliminare il campo?",
+ "schemas.field.deleteConfirmTitle": "Cancella il campo",
+ "schemas.field.disable": "Disabilita nella UI",
+ "schemas.field.disabledMarker": "Disabilitato",
+ "schemas.field.editor": "Editor",
+ "schemas.field.editorUrl": "Editor Url",
+ "schemas.field.editorUrlHint": "Url del tuo plugin se usi un custom editor.",
+ "schemas.field.empty": "Nessun campo è stato ancora creato.",
+ "schemas.field.enable": "Abilita nella UI",
+ "schemas.field.enabledMarker": "Abilitato",
+ "schemas.field.hiddenMarker": "Nasconsto",
+ "schemas.field.hide": "Nascondi nelle API",
+ "schemas.field.hintsHint": "Descrivi questo schema per la documentazione e le interfacce utente.",
+ "schemas.field.inlineEditable": "Modificabile sulla stessa linea",
+ "schemas.field.labelHint": "Nome da visualizzare per la documentazione e le interfacce utente.",
+ "schemas.field.localizable": "Consente la localizzazione",
+ "schemas.field.localizableHint": "Puoi impostare il campo per consentire la localizzazione, ossia che dipende dalla lingua che utilizzi come ad esempio i nomi delle città.",
+ "schemas.field.localizableMarker": "consente la localizzazione",
+ "schemas.field.lock": "Blocca e impedisce i cambiamenti",
+ "schemas.field.lockConfirmText": "Attenzione: Bloccare un campo è un'azione irreversibile! Se blocchi il campo non potrai più sbloccarlo o cancellarlo o cambiarlo. Sei sicuro di voler bloccare il campo?",
+ "schemas.field.lockedMarker": "Bloccato",
+ "schemas.field.nameHint": "Il nome del campo nelle chiamate API response.",
+ "schemas.field.namePlaceholder": "Inserisci il nome del campo",
+ "schemas.field.nameValidationMessage": "Il nome deve essere valido per il javascript in formato camel case.",
+ "schemas.field.placeholder": "Segnaposto",
+ "schemas.field.placeholderHint": "Definisci il segnaposto per la verifica dell'input.",
+ "schemas.field.required": "Obbligatorio",
+ "schemas.field.show": "Mostra nelle API",
+ "schemas.field.tabCommon": "Comune",
+ "schemas.field.tabEditing": "Modifica",
+ "schemas.field.tabValidation": "Validazione",
+ "schemas.field.tagsHint": "Tag per segnalare il tuo campo nei processi automatici.",
+ "schemas.field.unique": "Univoco",
+ "schemas.field.visibleMarker": "Visibile",
+ "schemas.fieldTypes.array.count": "Elementi",
+ "schemas.fieldTypes.array.countMax": "Max num. Elementi",
+ "schemas.fieldTypes.array.countMin": "Min num. Elementi",
+ "schemas.fieldTypes.array.description": "Lista di oggetti incorporati.",
+ "schemas.fieldTypes.assets.allowDuplicates": "Consente valori duplicati",
+ "schemas.fieldTypes.assets.count": "Conteggio",
+ "schemas.fieldTypes.assets.countMax": "Max num di Risorse",
+ "schemas.fieldTypes.assets.countMin": "Min num. di Risorse",
+ "schemas.fieldTypes.assets.description": "Immagini, video, documenti.",
+ "schemas.fieldTypes.assets.fileExtensions": "Estensioni dei File",
+ "schemas.fieldTypes.assets.mustBeImage": "Deve essere un'immagine",
+ "schemas.fieldTypes.assets.previewFileName": "Solamente il nome del file",
+ "schemas.fieldTypes.assets.previewImage": "Solamente thumbnail o il nome del file se non è un immagine",
+ "schemas.fieldTypes.assets.previewImageAndFileName": "Thumbnail e nome del file",
+ "schemas.fieldTypes.assets.previewMode": "Modalità anteprima",
+ "schemas.fieldTypes.assets.previewModeHint": "Anteprima delle risorse nella lista dei contenuti.",
+ "schemas.fieldTypes.assets.resolve": "Risolvi il nome della prima risorsa",
+ "schemas.fieldTypes.assets.resolveHint": "Mostra la prima risorsa collegata nella lista dei contenuti.",
+ "schemas.fieldTypes.assets.size": "Dimensione",
+ "schemas.fieldTypes.assets.sizeMax": "Dimensione Min",
+ "schemas.fieldTypes.assets.sizeMin": "Dimensione Max",
+ "schemas.fieldTypes.boolean.description": "Si o no, vero o falso.",
+ "schemas.fieldTypes.dateTime.defaultMode": "Modalità predefinita",
+ "schemas.fieldTypes.dateTime.description": "Data degli eventi, orari di apertura.",
+ "schemas.fieldTypes.dateTime.rangeMax": "Valore Max",
+ "schemas.fieldTypes.dateTime.rangeMin": "Valore Min",
+ "schemas.fieldTypes.geolocation.description": "Coordinate: latitudine e longitudine.",
+ "schemas.fieldTypes.json.description": "Dati in formato JSON, per gli sviluppatori.",
+ "schemas.fieldTypes.number.description": "ID, numero d'ordine, valutazione, quantità.",
+ "schemas.fieldTypes.number.range": "Intervallo",
+ "schemas.fieldTypes.number.rangeMax": "Valore Max",
+ "schemas.fieldTypes.number.rangeMin": "Valore Min ",
+ "schemas.fieldTypes.references.count": "Elementi",
+ "schemas.fieldTypes.references.countMax": "Numero Max Elementi",
+ "schemas.fieldTypes.references.countMin": "Numero Min Elementi",
+ "schemas.fieldTypes.references.description": "Link ad altri elementi del contenuto.",
+ "schemas.fieldTypes.references.resolveHint": "Mostra il nome dell'elemento collegato (reference) nella lista dei contenuti quando il numero massimo di elementi è impostato a 1.",
+ "schemas.fieldTypes.string.description": "Titoli, nomi, paragrafi.",
+ "schemas.fieldTypes.string.length": "Lunghezza",
+ "schemas.fieldTypes.string.lengthMax": "Lunghezza Max",
+ "schemas.fieldTypes.string.lengthMin": "Lunghezza Min",
+ "schemas.fieldTypes.string.pattern": "Regex Pattern",
+ "schemas.fieldTypes.string.patternMessage": "Messaggio del Pattern",
+ "schemas.fieldTypes.string.suggestions": "Suggestions",
+ "schemas.fieldTypes.tags.count": "Items",
+ "schemas.fieldTypes.tags.countMax": "Max Items",
+ "schemas.fieldTypes.tags.countMin": "Min Items",
+ "schemas.fieldTypes.tags.description": "Formato speciale per i tag.",
+ "schemas.fieldTypes.ui.description": "Separatore per il pannello delle modifiche della UI.",
+ "schemas.hideFieldFailed": "Non è stato possibile nascondere il campo. Per favore ricarica.",
+ "schemas.import": "Importa uno schema",
+ "schemas.listFields": "Lista dei Campi",
+ "schemas.listFieldsEmpty": "Incolla qui il campo o riordina i campi da mostrare nella lista dei contenuti. Se non imposti una lista di campi da visualizzare, viene utilizzato il primo della lista.",
+ "schemas.loadFailed": "Non è stato possibile caricare gli schemi. Per favore ricarica.",
+ "schemas.loadSchemaFailed": "Non è stato possibile caricare lo schema. Per favore ricarica.",
+ "schemas.lockFieldFailed": "Non è stato possibile bloccare il campo. Per favore ricarica.",
+ "schemas.modeMultiple": "Contenuti multipli",
+ "schemas.modeMultipleDescription": "Ideale per contenuti multipli come post di blog, pagine, autori, prodotti...",
+ "schemas.modeSingle": "Singolo contenuto",
+ "schemas.modeSingleDescription": "Ideale per contenuti singoli come la pagina principale, privacy, impostazioni...",
+ "schemas.nameWarning": "Questi valori non possono essere cambiati in un secondo momento.",
+ "schemas.previewUrls.empty": "Nessuna url per l'anteprima è stato configurato.",
+ "schemas.previewUrls.help": "Riguardo all'URL dell'anteprima controlla la pagina della guida integrata per saperne di più.",
+ "schemas.previewUrls.namePlaceholder": "Web o Mobile",
+ "schemas.previewUrls.title": "URL dell'anteprima",
+ "schemas.previewUrls.urlPlaceholder": "URL con variabili",
+ "schemas.published": "Pubblicato",
+ "schemas.publishedTour": "!Per poter creare un contenuto devi prima aver pubblicato il relativo schema.",
+ "schemas.publishFailed": "Non è stato possibile pubblicare lo schema. Per favore ricarica.",
+ "schemas.referenceFields": "Campi per i collegamenti (Reference)",
+ "schemas.referenceFieldsEmpty": "Trascina qui il file qui oppure riordina i campi da visualizzare nella lista che viene visualizzata quando colleghi il contenuto ad un altro. Quando non è impostato alcun campo per il contenuto che si desidera collegare, sono visualizzati la lista dei campi in ordine di utilizzo.",
+ "schemas.reloaded": "Schemai ricaricati.",
+ "schemas.reorderFieldsFailed": "Non è stato possibile riordinare i campi. Per favore ricarica.",
+ "schemas.rules.action": "Azione",
+ "schemas.rules.condition": "Condizioni dentro il Javascript",
+ "schemas.rules.empty": "Non è stata configurata nessuna regola per il campo.",
+ "schemas.rules.title": "Regole per il campo",
+ "schemas.rules.when": "quando",
+ "schemas.saved": "Lo Schema è stato salvato con successo.",
+ "schemas.saveFieldAndClose": "Salva e chiudi",
+ "schemas.saveFieldAndNew": "Salva e aggiungi un campo",
+ "schemas.schemaHintsHint": "Descrivi questo schema per la documentazione e le interfacce utente.",
+ "schemas.schemaLabelHint": "Nome da visualizzare per la documentazione e le interfacce utente.",
+ "schemas.schemaNameHint": "Puoi utilizzare solo lettere, numeri e trattini e un numero massimo di 40 caratteri.",
+ "schemas.schemaNameValidationMessage": "Il nome può contenere solo lettere, numeri, trattini e spazi.",
+ "schemas.schemaTagsHint": "Tag per descrivere il tuo schema per i processi automatici.",
+ "schemas.searchPlaceholder": "Cerca negli schemi...",
+ "schemas.showFieldFailed": "Non è stato possibile mostrare il campo. Per favore ricarica.",
+ "schemas.synchronized": "Lo Schema è stato sincronizzato con successo.",
+ "schemas.synchronizeFailed": "Non è stato possibile sincronizzare lo schema. Per favore ricarica.",
+ "schemas.tabFields": "Campi",
+ "schemas.tabJson": "Json",
+ "schemas.tabMore": "Di più",
+ "schemas.tabScripts": "Script",
+ "schemas.tabUI": "UI",
+ "schemas.ui": "Campi assegnati",
+ "schemas.ui.unassignedFields": "UnCampi non assegnati",
+ "schemas.unpublished": "Non pubblicato",
+ "schemas.unpublishFailed": "Non è stato possibile togliere dalla pubblicazione lo schema. Per favore ricarica.",
+ "schemas.updateFailed": "Non è stato possibile aggiornare schema. Per favore ricarica.",
+ "schemas.updateFieldFailed": "Non è stato possibile aggiornare il campo. Per favore ricarica.",
+ "schemas.updatePreviewUrlsFailed": "Non è stato possibile configure le url dell'anteprima. Per favore ricarica.",
+ "schemas.updateRulesFailed": "Non è stato possibile aggiornare le regole dello schema. Per favore ricarica.",
+ "schemas.updateScriptsFailed": "Non è stato possibile aggiornare gli script dello schema. Per favore ricarica.",
+ "schemas.updateUIFieldsFailed": "Non è stato possibile aggiornare i campi della UI. Per favore ricarica.",
+ "search.addFilter": "Aggiungi un Filtro",
+ "search.addGroup": "Aggiungi un Gruppo",
+ "search.addSorting": "Aggiungi ordinamento",
+ "search.advancedTour": "Fai clic su questa icona per visualizzare il menu della ricerca avanzata!",
+ "search.customQuery": "Query personalizzata",
+ "search.fullTextTour": "Cerca contenuti utilizzando la ricerca testuale su tutti i campi e le lingue!",
+ "search.help": "Ulteriori informazioni sui filtri su [Documentation](https://https://docs.squidex.io/04-guides/02-api.html).",
+ "search.myQueries": "Le mie query",
+ "search.nameQuery": "Dai un nome alla query",
+ "search.queriesEmpty": "Ricerca per {types} e utilizza l'icona nella ricerca per salvare la query per tutti i collaboratori.",
+ "search.queryAllNewestFirst": "Tutto (newest first)",
+ "search.queryAllOldestFirst": "Tutto (oldest first)",
+ "search.quickNavPlaceholder": "Navigazione veloce (Press 'q')",
+ "search.saveQueryMyself": "Salva la query solamente per me.",
+ "search.searchFailed": "Non è stato possibile eseguire la ricerca. Per favore ricarica.",
+ "search.sharedQueries": "Query condivise",
+ "search.sorting": "Ordinamento",
+ "start.login": "Entra su Squidex",
+ "start.loginHint": "Il pulsante per accedere aprirà un popup. Una volta effettuato l'accesso sarai indirizzato al portale per la gestione di Squidex.",
+ "start.madeBy": "Realizzato con orgoglio da",
+ "start.madeByCopyright": "Sebastian Stehle e Collaboratori, 2016-2020",
+ "tour.joinForum": "Unisciti al nostro Forum",
+ "tour.joinGithub": "Unisciti a Github",
+ "tour.skip": "Salta il Tour",
+ "tour.step0Next": "Guardiamoci intorno",
+ "tour.step0Text": "Puoi iniziare subito a gestire e distribuire i tuoi contenuti, ma prima vorremmo illustrarti alcune nozioni di base...\n\nIn questo modo",
+ "tour.step1Next": "Continua",
+ "tour.step1Text": "Un'App è il repository per il tuo progetto, ad es. (un blog, un negozio sul web o una app per dispositivi mobili). Puoi assegnare collaboratori alla tua App per lavorare insieme.\n\nPuoi creare un numero illimitato di app in Squidex per gestire più progetti contemporaneamente.",
+ "tour.step2Next": "Vai avanti!",
+ "tour.step2Text": "Gli Schemi definiscono la struttura per i tuoi contenuti, i campi e i tipi di dato per ogni tipo di contenuto.\n\nPrima di creare un contenuto riferito al tuo schema, assicurati di aver pubblicato lo schema premendo il pulsante 'Pubblica' visualizzato nell'editor dei contenuti.",
+ "tour.step3Next": "Ci siamo quasi!",
+ "tour.step3Text": "I contenuti della tua app sono raggruppati tramite gli schemi.\n\nSeleziona uno schema pubblicato e poi crea il relativo contenuto.",
+ "tour.step4Next": "Fatto!",
+ "tour.step4Text": "Le risorse contengono tutti i file che tu puoi collegare ai tuoi contenuti. Per esempio immagini, video o documenti.\n\nPuoi caricare qui le risorse e usarle successivamente oppure caricarle direttamente quando stai creando un contenuto utilizzando un campo risorse.",
+ "tour.step5Text": "Ma non è tutto il supporto che possiamo fornire.\n\nPer maggiori informazioni visita il sito https://docs.squidex.io/>.\n\nVuoi far parte della nostra community?",
+ "tour.step5Title": "Fantastico, ora conosci le basi!",
+ "tour.tooltipConfirm": "Capito",
+ "tour.tooltipStop": "Ferma il Tour",
+ "tour.welcome": "Benvenuto su",
+ "tour.welcomeProduct": "Squidex CMS",
+ "translate.translateFailed": "Non è stato possibile tradurre il testo. Per favore ricarica.",
+ "usages.loadCallsFailed": "Non è stato possibile caricare la pagina per l'utilizzo delle chiamate. Per favore ricarica.",
+ "usages.loadMonthlyCallsFailed": "Non è stato possibile caricare le chiamate mensili delle API calls. Per favore ricarica.",
+ "usages.loadStorageFailed": "Non è stato possibile caricare lo spazio disco utilizzato. Per favore ricarica.",
+ "usages.loadTodayStorageFailed": "Non è stato possibile caricare lo spazio disco utilizzato oggi. Per favore ricarica.",
+ "users.create": "Nuovo",
+ "users.createFailed": "Non è stato possibile creare l'utente. Per favore ricarica.",
+ "users.createPageTitle": "Crea un utente",
+ "users.createTitle": "Nuovo utente",
+ "users.createTooltip": "Nuovo utente (CTRL + N)",
+ "users.editPageTitle": "Modifica l'utente",
+ "users.editTitle": "Modifica l'utente",
+ "users.listPageTitle": "Gestione Utente",
+ "users.listTitle": "Utenti",
+ "users.loadFailed": "Non è stato possibile caricare gli utenti. Per favore ricarica.",
+ "users.loadUserFailed": "Non è stato possibile caricare l'utente. Per favore ricarica.",
+ "users.lockTooltip": "Utente bloccato",
+ "users.passwordConfirmValidationMessage": "Le password devono essere uguali.",
+ "users.refreshTooltip": "Aggiorna gli Utenti (CTRL + SHIFT + R)",
+ "users.reloaded": "Utenti ricaricati.",
+ "users.search": "Cerca l'utente",
+ "users.unlockTooltip": "Sblocca l'utente",
+ "users.updateFailed": "Non è stato possibile aggiornare l'utente. Per favore ricarica.",
+ "validation.between": "{field} deve essere tra '{min}' e '{max}'.",
+ "validation.betweenlength": "{field|upper} deve essere tra {minlength} e {maxlength} elemento(i).",
+ "validation.betweenlengthstring": "{field|upper} deve essere tra {minlength} e {maxlength} carattere(i).",
+ "validation.email": "{field|upper} deve essere un indirizzo email.",
+ "validation.exactly": "{field|upper} deve essere esattamente '{expected}'.",
+ "validation.exactlylength": "{field|upper} deve essere esattamente {expected} elemento(i).",
+ "validation.exactlylengthstring": "{field|upper} deve essere esattamente {expected} carattere(i).",
+ "validation.match": "{message}",
+ "validation.max": "{field|upper} deve essere minore o uguale a '{max}'.",
+ "validation.maxlength": "{field|upper} non deve avere più di {requiredlength} elemento(i).",
+ "validation.maxlengthstring": "{field|upper} non deve avere più di {requiredlength} carattere(i).",
+ "validation.min": "{field|upper} deve essere maggiore o uguale a '{min}'.",
+ "validation.minlength": "{field|upper} deve avere almeno {requiredlength} elemento(i).",
+ "validation.minlengthstring": "{field|upper} deve avere almeno {requiredlength} carattere(i).",
+ "validation.pattern": "{field|upper} non corrisponde al pattern.",
+ "validation.patternmessage": "{message}",
+ "validation.required": "{field|upper} è obbligatorio.",
+ "validation.requiredTrue": "{field|upper} è obbligatorio.",
+ "validation.uniquestrings": "{field|upper} non deve contenere valori duplicati.",
+ "validation.validarrayvalues": "{field|upper} contiene valori non validicontains an invalid value: {invalidvalue}.",
+ "validation.validdatetime": "{field|upper} non è una data e ora valida.",
+ "validation.validvalues": "{field|upper} non è un valore valido.",
+ "workflows.add": "Aggiungi un Workflow",
+ "workflows.addStep": "Aggiungi uno Step",
+ "workflows.createFailed": "Non è stato possibile creare un workflow. Per favore ricarica.",
+ "workflows.deleteConfirmText": "Sei sicuro di voler eliminare il workflow?",
+ "workflows.deleteConfirmTitle": "Cancella il workflow",
+ "workflows.deleteFailed": "Non è stato possibile cancellare il Workflow. Per favore ricarica.",
+ "workflows.empty": "Nessun workflow è stato ancora creato.",
+ "workflows.loadFailed": "Non è stato possibile caricare i workflow. Per favore ricarica.",
+ "workflows.notNamed": "Workflow senza nome",
+ "workflows.preventUpdates": "Impedisci gli aggiornamenti",
+ "workflows.publishedNotRemovable": "Non è possibile rimuoverlo",
+ "workflows.refreshTooltip": "Aggiorna i workflow (CTRL + SHIFT + R)",
+ "workflows.reloaded": "Workflow ricaricati.",
+ "workflows.saved": "Il Workflow è stato salvato.",
+ "workflows.schemasHint": "Limita questo workflow ad uno schema specifico, o lascialo bianco per applicarlo a tutti gli schemi.",
+ "workflows.syntax.expression": "Espressione",
+ "workflows.syntax.for": "per",
+ "workflows.syntax.when": "quando",
+ "workflows.tabEdit": "Modifica",
+ "workflows.tabVisualize": "Visualizza",
+ "workflows.updateFailed": "Non è stato possibile aggiornare il Workflow. Per favore ricarica.",
+ "workflows.workflowNameHint": "Nome facoltativo per il workflow.",
+ "workflows.workflowNamePlaceholder": "Inserisci il nome del workflow"
+}
\ No newline at end of file
diff --git a/backend/i18n/source/frontend_nl.json b/backend/i18n/source/frontend_nl.json
index bb003b741..5fb1e6b6a 100644
--- a/backend/i18n/source/frontend_nl.json
+++ b/backend/i18n/source/frontend_nl.json
@@ -70,16 +70,16 @@
"assets.fileTooBig": "Asset is te groot.",
"assets.folderName": "Mapnaam",
"assets.folderNameHint": "De mapnaam wordt gebruikt als weergavenaam en mag niet uniek zijn.",
- "assets.insertAssets": "Assets invoegen",
+ "assets.insertAssets": "Bestanden invoegen",
"assets.linkSelected": "Link geselecteerde items ({count})",
- "assets.listPageTitle": "Assets",
+ "assets.listPageTitle": "Bestanden",
"assets.loadFailed": "Laden van bestanden is mislukt. Laad opnieuw.",
"assets.loadFoldersFailed": "Laden van mappen is mislukt. Laad opnieuw.",
"assets.metadata": "Metadata",
"assets.metadataAdd": "Metadata toevoegen",
"assets.moveFailed": "Verplaatsen van item is mislukt. Laad opnieuw.",
"assets.protected": "Beschermd",
- "assets.refreshTooltip": "Assets vernieuwen (CTRL + SHIFT + R)",
+ "assets.refreshTooltip": "Bestanden vernieuwen (CTRL + SHIFT + R)",
"assets.reloaded": "Bestanden herladen.",
"assets.removeConfirmText": "Wil je het bestand echt verwijderen?",
"assets.removeConfirmTitle": "Verwijder bestand",
@@ -90,6 +90,8 @@
"assets.searchByName": "Zoeken op naam",
"assets.searchByTags": "Zoeken op tags",
"assets.selectMany": "Selecteer middelen",
+ "assets.specialFolder.parent": "",
+ "assets.specialFolder.root": "Bestanden",
"assets.tabFocusPoint": "Focuspunt",
"assets.tabHistory": "Geschiedenis",
"assets.tabImage": "Afbeelding",
diff --git a/backend/i18n/translator/Squidex.Translator/Commands.cs b/backend/i18n/translator/Squidex.Translator/Commands.cs
index e559f09b5..b57344f4e 100644
--- a/backend/i18n/translator/Squidex.Translator/Commands.cs
+++ b/backend/i18n/translator/Squidex.Translator/Commands.cs
@@ -120,7 +120,7 @@ namespace Squidex.Translator
throw new ArgumentException("Folder does not exist.");
}
- var locales = new string[] { "en", "nl" };
+ var locales = new string[] { "en", "nl", "it" };
var translationsDirectory = new DirectoryInfo(Path.Combine(arguments.Folder, "backend", "i18n"));
var translationsService = new TranslationService(translationsDirectory, fileName, locales, arguments.SingleWords);
diff --git a/backend/i18n/translator/Squidex.Translator/Processes/CheckBackend.cs b/backend/i18n/translator/Squidex.Translator/Processes/CheckBackend.cs
index 55f7b827f..b7bcf0e47 100644
--- a/backend/i18n/translator/Squidex.Translator/Processes/CheckBackend.cs
+++ b/backend/i18n/translator/Squidex.Translator/Processes/CheckBackend.cs
@@ -32,19 +32,25 @@ namespace Squidex.Translator.Processes
{
var content = File.ReadAllText(file.FullName);
- var matches = Regex.Matches(content, "T\\.Get\\(\"(?[^\"]*)\"");
-
var translations = new HashSet();
- foreach (Match match in matches)
+ void AddTranslations(string regex)
{
- var key = match.Groups["Key"].Value;
+ var matches = Regex.Matches(content, regex, RegexOptions.Singleline);
+
+ foreach (Match match in matches)
+ {
+ var key = match.Groups["Key"].Value;
- translations.Add(key);
+ translations.Add(key);
- all.Add(key);
+ all.Add(key);
+ }
}
+ AddTranslations("T\\.Get\\(\"(?[^\"]*)\"");
+ AddTranslations("\"(?history\\.[^\"]*)\"");
+
Helper.CheckForFile(service, relativeName, translations);
}
diff --git a/backend/i18n/translator/Squidex.Translator/Processes/CheckFrontend.cs b/backend/i18n/translator/Squidex.Translator/Processes/CheckFrontend.cs
index 70070ff25..ef215cd1a 100644
--- a/backend/i18n/translator/Squidex.Translator/Processes/CheckFrontend.cs
+++ b/backend/i18n/translator/Squidex.Translator/Processes/CheckFrontend.cs
@@ -64,26 +64,19 @@ namespace Squidex.Translator.Processes
var translations = new HashSet();
- var matches0 = Regex.Matches(content, "\"i18n\\:(?[^\"]+)\"", RegexOptions.Singleline);
-
- foreach (Match match in matches0)
+ void AddTranslations(string regex)
{
- translations.Add(match.Groups["Key"].Value);
- }
-
- var matches1 = Regex.Matches(content, "'i18n\\:(?[^\']+)'", RegexOptions.Singleline);
+ var matches = Regex.Matches(content, regex, RegexOptions.Singleline);
- foreach (Match match in matches1)
- {
- translations.Add(match.Groups["Key"].Value);
+ foreach (Match match in matches)
+ {
+ translations.Add(match.Groups["Key"].Value);
+ }
}
- var matches2 = Regex.Matches(content, "'(?[^\']+)' \\| sqxTranslate", RegexOptions.Singleline);
-
- foreach (Match match in matches2)
- {
- translations.Add(match.Groups["Key"].Value);
- }
+ AddTranslations("\"i18n\\:(?[^\"]+)\"");
+ AddTranslations("'i18n\\:(?[^\']+)'");
+ AddTranslations("'(?[^\']+)' \\| sqxTranslate");
return translations;
}
@@ -94,26 +87,19 @@ namespace Squidex.Translator.Processes
var translations = new HashSet();
- var matches1 = Regex.Matches(content, "'i18n\\:(?[^\']+)'", RegexOptions.Singleline);
-
- foreach (Match match in matches1)
+ void AddTranslations(string regex)
{
- translations.Add(match.Groups["Key"].Value);
- }
-
- var matches2 = Regex.Matches(content, "localizer.get\\('(?[^\']+)'\\)", RegexOptions.Singleline);
+ var matches = Regex.Matches(content, regex, RegexOptions.Singleline);
- foreach (Match match in matches2)
- {
- translations.Add(match.Groups["Key"].Value);
+ foreach (Match match in matches)
+ {
+ translations.Add(match.Groups["Key"].Value);
+ }
}
- var matches3 = Regex.Matches(content, "localizer.getOrKey\\('(?[^\']+)'\\)", RegexOptions.Singleline);
-
- foreach (Match match in matches3)
- {
- translations.Add(match.Groups["Key"].Value);
- }
+ AddTranslations("'i18n\\:(?[^\']+)'");
+ AddTranslations("localizer.get\\('(?[^\']+)'\\)");
+ AddTranslations("localizer.getOrKey\\('(?[^\']+)'\\)");
return translations;
}
diff --git a/backend/i18n/translator/Squidex.Translator/Processes/GenerateBackendResources.cs b/backend/i18n/translator/Squidex.Translator/Processes/GenerateBackendResources.cs
index c22301d5d..8a13038eb 100644
--- a/backend/i18n/translator/Squidex.Translator/Processes/GenerateBackendResources.cs
+++ b/backend/i18n/translator/Squidex.Translator/Processes/GenerateBackendResources.cs
@@ -5,8 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
+using System;
using System.IO;
using System.Resources.NetStandard;
+using System.Text.RegularExpressions;
using Squidex.Translator.State;
namespace Squidex.Translator.Processes
@@ -41,6 +43,16 @@ namespace Squidex.Translator.Processes
foreach (var (key, value) in texts)
{
writer.AddResource(key, value);
+
+ if (key.StartsWith("annotations_", StringComparison.OrdinalIgnoreCase))
+ {
+ var i = 0;
+
+ var dotnetKey = $"dotnet_{key}";
+ var dotnetValue = Regex.Replace(value, "{[^}]*}", m => $"{{{i++}}}");
+
+ writer.AddResource(dotnetKey, dotnetValue);
+ }
}
}
diff --git a/backend/i18n/translator/Squidex.Translator/Processes/Helper.cs b/backend/i18n/translator/Squidex.Translator/Processes/Helper.cs
index f72b1fe05..998587374 100644
--- a/backend/i18n/translator/Squidex.Translator/Processes/Helper.cs
+++ b/backend/i18n/translator/Squidex.Translator/Processes/Helper.cs
@@ -72,8 +72,9 @@ namespace Squidex.Translator.Processes
foreach (var key in service.MainTranslations.Keys)
{
if (!translations.Contains(key) &&
- !key.StartsWith("validation.", StringComparison.OrdinalIgnoreCase) &&
- !key.StartsWith("aspnet_", StringComparison.OrdinalIgnoreCase))
+ !key.StartsWith("common.", StringComparison.OrdinalIgnoreCase) &&
+ !key.StartsWith("dotnet_", StringComparison.OrdinalIgnoreCase) &&
+ !key.StartsWith("validation.", StringComparison.OrdinalIgnoreCase))
{
notUsed.Add(key);
}
@@ -106,7 +107,7 @@ namespace Squidex.Translator.Processes
var parts = key.Split(".");
- if (parts[0] != "common" && parts[0] != "validation")
+ if (parts.Length > 1 && parts[0] != "common" && parts[0] != "validation")
{
prefixes.Add(parts[0]);
}
diff --git a/backend/src/Squidex.Domain.Users/UserManagerExtensions.cs b/backend/src/Squidex.Domain.Users/UserManagerExtensions.cs
index 8214d8286..c4f39e65e 100644
--- a/backend/src/Squidex.Domain.Users/UserManagerExtensions.cs
+++ b/backend/src/Squidex.Domain.Users/UserManagerExtensions.cs
@@ -12,6 +12,7 @@ using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Squidex.Infrastructure;
+using Squidex.Infrastructure.Translations;
using Squidex.Infrastructure.Validation;
namespace Squidex.Domain.Users
@@ -241,7 +242,7 @@ namespace Squidex.Domain.Users
if (!result.Succeeded)
{
- throw new ValidationException(result.Errors.Select(x => new ValidationError(x.Description)).ToList());
+ throw new ValidationException(result.Errors.Select(x => new ValidationError(x.Localize())).ToList());
}
}
@@ -249,5 +250,22 @@ namespace Squidex.Domain.Users
{
return values.SyncClaims(userManager, user);
}
+
+ public static string Localize(this IdentityResult result)
+ {
+ return string.Join(". ", result.Errors.Select(x => x.Localize()));
+ }
+
+ public static string Localize(this IdentityError error)
+ {
+ if (!string.IsNullOrWhiteSpace(error.Code))
+ {
+ return T.Get($"dotnet_identity_{error.Code}", error.Description);
+ }
+ else
+ {
+ return error.Description;
+ }
+ }
}
}
diff --git a/backend/src/Squidex.Infrastructure/Translations/LocalizedCompareAttribute.cs b/backend/src/Squidex.Infrastructure/Validation/LocalizedCompareAttribute.cs
similarity index 82%
rename from backend/src/Squidex.Infrastructure/Translations/LocalizedCompareAttribute.cs
rename to backend/src/Squidex.Infrastructure/Validation/LocalizedCompareAttribute.cs
index 1be871b67..766b11e31 100644
--- a/backend/src/Squidex.Infrastructure/Translations/LocalizedCompareAttribute.cs
+++ b/backend/src/Squidex.Infrastructure/Validation/LocalizedCompareAttribute.cs
@@ -6,9 +6,10 @@
// ==========================================================================
using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Translations;
using Squidex.Text;
-namespace Squidex.Infrastructure.Translations
+namespace Squidex.Infrastructure.Validation
{
public sealed class LocalizedCompareAttribute : CompareAttribute
{
@@ -23,7 +24,7 @@ namespace Squidex.Infrastructure.Translations
var other = T.Get($"common.{OtherProperty.ToCamelCase()}", OtherProperty);
- return T.Get("annotations_Compare", new { property, other });
+ return T.Get("annotations_Compare", base.FormatErrorMessage(name), new { property, other });
}
}
}
diff --git a/backend/src/Squidex.Infrastructure/Validation/LocalizedEmailAddressAttribute.cs b/backend/src/Squidex.Infrastructure/Validation/LocalizedEmailAddressAttribute.cs
new file mode 100644
index 000000000..e16ff40aa
--- /dev/null
+++ b/backend/src/Squidex.Infrastructure/Validation/LocalizedEmailAddressAttribute.cs
@@ -0,0 +1,30 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System;
+using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Translations;
+using Squidex.Text;
+
+namespace Squidex.Infrastructure.Validation
+{
+ [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
+ public class LocalizedEmailAddressAttribute : ValidationAttribute
+ {
+ public override bool IsValid(object value)
+ {
+ return !(value is string s) || s.IsEmail();
+ }
+
+ public override string FormatErrorMessage(string name)
+ {
+ var property = T.Get($"common.{name.ToCamelCase()}", name);
+
+ return T.Get("annotations_EmailAddress", base.FormatErrorMessage(name), new { property });
+ }
+ }
+}
diff --git a/backend/src/Squidex.Infrastructure/Validation/LocalizedRangeAttribute.cs b/backend/src/Squidex.Infrastructure/Validation/LocalizedRangeAttribute.cs
new file mode 100644
index 000000000..068fc4e73
--- /dev/null
+++ b/backend/src/Squidex.Infrastructure/Validation/LocalizedRangeAttribute.cs
@@ -0,0 +1,38 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System;
+using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Translations;
+using Squidex.Text;
+
+namespace Squidex.Infrastructure.Validation
+{
+ [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
+ public sealed class LocalizedRangeAttribute : RangeAttribute
+ {
+ public LocalizedRangeAttribute(int minimum, int maximum)
+ : base(minimum, maximum)
+ {
+ }
+
+ public LocalizedRangeAttribute(double minimum, double maximum)
+ : base(minimum, maximum)
+ {
+ }
+
+ public override string FormatErrorMessage(string name)
+ {
+ var property = T.Get($"common.{name.ToCamelCase()}", name);
+
+ var min = Minimum;
+ var max = Maximum;
+
+ return T.Get("annotations_Range", base.FormatErrorMessage(name), new { property, min, max });
+ }
+ }
+}
diff --git a/backend/src/Squidex.Infrastructure/Validation/LocalizedRegularExpressionAttribute.cs b/backend/src/Squidex.Infrastructure/Validation/LocalizedRegularExpressionAttribute.cs
new file mode 100644
index 000000000..e837aaeab
--- /dev/null
+++ b/backend/src/Squidex.Infrastructure/Validation/LocalizedRegularExpressionAttribute.cs
@@ -0,0 +1,30 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System;
+using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Translations;
+using Squidex.Text;
+
+namespace Squidex.Infrastructure.Validation
+{
+ [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
+ public sealed class LocalizedRegularExpressionAttribute : RegularExpressionAttribute
+ {
+ public LocalizedRegularExpressionAttribute(string pattern)
+ : base(pattern)
+ {
+ }
+
+ public override string FormatErrorMessage(string name)
+ {
+ var property = T.Get($"common.{name.ToCamelCase()}", name);
+
+ return T.Get("annotations_RegularExpression", base.FormatErrorMessage(name), new { property });
+ }
+ }
+}
diff --git a/backend/src/Squidex.Infrastructure/Translations/LocalizedRequired.cs b/backend/src/Squidex.Infrastructure/Validation/LocalizedRequiredAttribute.cs
similarity index 73%
rename from backend/src/Squidex.Infrastructure/Translations/LocalizedRequired.cs
rename to backend/src/Squidex.Infrastructure/Validation/LocalizedRequiredAttribute.cs
index 542602535..2eebfda78 100644
--- a/backend/src/Squidex.Infrastructure/Translations/LocalizedRequired.cs
+++ b/backend/src/Squidex.Infrastructure/Validation/LocalizedRequiredAttribute.cs
@@ -7,18 +7,19 @@
using System;
using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Translations;
using Squidex.Text;
-namespace Squidex.Infrastructure.Translations
+namespace Squidex.Infrastructure.Validation
{
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
- public class LocalizedRequired : RequiredAttribute
+ public class LocalizedRequiredAttribute : RequiredAttribute
{
public override string FormatErrorMessage(string name)
{
var property = T.Get($"common.{name.ToCamelCase()}", name);
- return T.Get("annotations_Required", new { property });
+ return T.Get("annotations_Required", base.FormatErrorMessage(name), new { property });
}
}
}
diff --git a/backend/src/Squidex.Infrastructure/Validation/LocalizedStringLengthAttribute.cs b/backend/src/Squidex.Infrastructure/Validation/LocalizedStringLengthAttribute.cs
new file mode 100644
index 000000000..951cf1c3a
--- /dev/null
+++ b/backend/src/Squidex.Infrastructure/Validation/LocalizedStringLengthAttribute.cs
@@ -0,0 +1,38 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Translations;
+using Squidex.Text;
+
+namespace Squidex.Infrastructure.Validation
+{
+ public sealed class LocalizedStringLengthAttribute : StringLengthAttribute
+ {
+ public LocalizedStringLengthAttribute(int maximumLength)
+ : base(maximumLength)
+ {
+ }
+
+ public override string FormatErrorMessage(string name)
+ {
+ var property = T.Get($"common.{name.ToCamelCase()}", name);
+
+ var min = MinimumLength;
+ var max = MaximumLength;
+
+ var args = new { property, min, max };
+
+ if (min > 0)
+ {
+ return T.Get("annotations_StringLengthMinimum", base.FormatErrorMessage(name), args);
+ }
+
+ return T.Get("annotations_StringLength", base.FormatErrorMessage(name), args);
+ }
+ }
+}
diff --git a/backend/src/Squidex.Shared/Texts.it.resx b/backend/src/Squidex.Shared/Texts.it.resx
new file mode 100644
index 000000000..2a6b14c96
--- /dev/null
+++ b/backend/src/Squidex.Shared/Texts.it.resx
@@ -0,0 +1,1138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Il campo {name|lower} deve essere un URL assoluto.
+
+
+ Il campo {0} deve essere un URL assoluto.
+
+
+ Il campo {name|lower} deve essere uguale a {other|lower}.
+
+
+ Il campo {0} deve essere uguale a {1}.
+
+
+ The field {name|lower} is not a valid email address.
+
+
+ The field {0} is not a valid email address.
+
+
+ The field {name|lower} must be between {min} and {max}.
+
+
+ The field {0} must be between {1} and {2}.
+
+
+ The field {name|lower} is not.
+
+
+ The field {0} is not.
+
+
+ Il campo è {name|lower} obbligatorio.
+
+
+ Il campo è {0} obbligatorio.
+
+
+ The field {name|lower} must be a string with a maximum length of {max}.
+
+
+ The field {0} must be a string with a maximum length of {1}.
+
+
+ The field {name|lower} must be a string with a minimum length of {min} and a maximum length of {max}.
+
+
+ The field {0} must be a string with a minimum length of {1} and a maximum length of {2}.
+
+
+ La App è stata già archiviata.
+
+
+ Un client con lo stesso id esiste già.
+
+
+ Non puoi cambiare il tuo ruolo.
+
+
+ Hai raggiunto il numero massimo di contributori previsto per il tuo piano.
+
+
+ Non è possibile rimuovere l'unico owner.
+
+
+ La App non ha configurato una lingua alternativa'{fallback}'.
+
+
+ La lingua è stata già inserita.
+
+
+ La lingua master language non ha lingue alternative.
+
+
+ La lingua master non può essere opzionale.
+
+
+ La lingua master non può essere rimossa.
+
+
+ Esiste già un'app con lo stesso nome.
+
+
+ Il file non è una immagine
+
+
+ Esiste già un pattern con lo stesso nome.
+
+
+ Questo pattern esiste già con un altro nome.
+
+
+ Non esiste un piano con questo id.
+
+
+ Solo l'utente che ha configurato il piano inizialmente può modificarlo.
+
+
+ Non è possibile cancellare un ruolo predefinito.
+
+
+ Non è possibile modificare un ruolo predefinito.
+
+
+ Esiste già un ruolo con lo stesso nome.
+
+
+ Non è possibile rimuovere un ruolo quando è assegnato ad un ruolo.
+
+
+ Non è possibile rimuovere un ruolo quando questo è assegnato ad un collaboratore.
+
+
+ La risorsa è stata già eliminata
+
+
+ La cartella delle risorse è stata già eliminata
+
+
+ La cartella delle risorse non esiste.
+
+
+ Non è possibile aggiungere una cartella al proprio figlio.
+
+
+ Hai raggiunto la dimensione massima consentito per le risorse.
+
+
+ E' in esecuzione una altro processo di backup.
+
+
+ Non puoi avere più di {max} backup.
+
+
+ E' in esecuzione un'operazione di restore.
+
+
+ Puoi solo accedere alle tue notifiche.
+
+
+ E' stato creato un commento da un altro utente.
+
+
+ Azione
+
+
+ Altezza
+
+
+ Larghezza
+
+
+ Valore predefinito calcolato
+
+
+ ID Client
+
+
+ ID Client
+
+
+ Secret Client
+
+
+ Content type
+
+
+ ID o Email del collaboratore
+
+
+ Data
+
+
+ Valore predefinito
+
+
+ Nome da visualizzare
+
+
+ Redattore
+
+
+ Email
+
+
+ Campo
+
+
+ Campi ID
+
+
+ Campo nome
+
+
+ File
+
+
+ Nome della cartella
+
+
+ La query di ricerca non supporta queste condizioni.
+
+
+ Il content-type del file non è definito.
+
+
+ Il nome del file name non è definito.
+
+
+ Il modello non è valido.
+
+
+ Il corpo della request ha un formato non valido.
+
+
+ Non consentito per i client.
+
+
+ Errore di validazione
+
+
+ Step iniziale
+
+
+ Esecuzione dello script fallita, Errore Javascript: {message}
+
+
+ Uno script ha proibito l'operazione.
+
+
+ Esecuzione dello script fallita, errore di sintassi nel Javascript: {message}
+
+
+ Lo script ha rifiutato l'operazione.
+
+
+ Codice della lingua
+
+
+ Accedi
+
+
+ Esci
+
+
+ Max characters
+
+
+ Altezza massima
+
+
+ Numeri massimo di elementi
+
+
+ Lunghezza massima
+
+
+ Dimensione massima
+
+
+ Valore massimo
+
+
+ Larghezza massima
+
+
+ Max words
+
+
+ Min characters
+
+
+ Altezza minima
+
+
+ Numero minimo elementi
+
+
+ Lunghezza minima
+
+
+ Dimensione minima
+
+
+ Valore minimo
+
+
+ Larghezza massima
+
+
+ Min words
+
+
+ Nome
+
+
+ - non trovato -
+
+
+ Num. giorni
+
+
+ Fallito parsando la query: {message}
+
+
+ OData $filter condizione non valida: {ex.Message}
+
+
+ OData operazione non supportata.
+
+
+ OData $search condizione non valida: {ex.Message}
+
+
+ Vecchia password
+
+
+ Altro
+
+
+ Partizionamento
+
+
+ Password
+
+
+ Conferma password
+
+
+ Pattern
+
+
+ Permessi
+
+
+ ID del piano
+
+
+ Anteprima URL
+
+
+ Squidex Headless CMS
+
+
+ Proprietà
+
+
+ Proprietà
+
+
+ Al momento l'applicazione è in sola lettura.
+
+
+ Contiene un collegamento '{id}' non valido.
+
+
+ Contiene dei collegamenti '{id}' ad uno schema errato.
+
+
+ Rimuovi
+
+
+ Il numero di risultati è troppo grande per essere recuperato. Utilizza il parametro $take per ridurre il numero di elementi.
+
+
+ Ruolo
+
+
+ Salva
+
+
+ ID Schema
+
+
+ Iscriviti
+
+
+ Testo
+
+
+ Trigger
+
+
+ Workflow
+
+
+ Step
+
+
+ Transizione
+
+
+ Il contento è stato già eliminato.
+
+
+ Ci sono più contenuti che corrispondono alla query.
+
+
+ Puoi creare versioni del contenuto solo se questo è pubblicato.
+
+
+ Non c'è niente da eliminare.
+
+
+ Errore nel json, atteso un array di string guid.
+
+
+ Errore nel json, attesp un array di objects.
+
+
+ Errore nel json, atteso un array di string.
+
+
+ Errore nel json, atteso un boolean.
+
+
+ Errore nel json, atteso un object latitudine/longitudine.
+
+
+ La latitudine deve essere tra -90 and 90.
+
+
+ La longitude deve essere tra -180 and 180.
+
+
+ E' possibile impostare la geolocalizzazione solo impostando latitudine e longitudine.
+
+
+ Errore nel json,, atteso un number.
+
+
+ Errore nel json, atteso una string.
+
+
+ {count} Collegamenti(s)
+
+
+ Il contenuto singleton non può essere aggiornato
+
+
+ Il contenuto singleton non può essere creato.
+
+
+ Il contenuto singleton non può essere eliminato.
+
+
+ L'ora deve essere futura.
+
+
+ Non è possibile cambiare stato da {oldStatus} a {newStatus}.
+
+
+ Deve essere le proporzioni {width}:{height}.
+
+
+ Id {id} non trovato.
+
+
+ Deve essere tra {min} e {max}.
+
+
+ Deve avere esattamente {count} carattere(i).
+
+
+ Deve essere tra {min} e {max} carattere(i).
+
+
+ Non può avere valori duplicati.
+
+
+ Deve essere esattamente {value}.
+
+
+ Deve essere un'estensione consentita.
+
+
+ Non è un'immagine.
+
+
+ Valore non consentito.
+
+
+ Deve avere esattamente {count} elemento(i).
+
+
+ Deve essere tra {min} e {max} elemento(i).
+
+
+ Deve esseer minore o uguale a {max}.
+
+
+ Must not have more than {max} text character(s).
+
+
+ L'altezza {height}px deve essere inferiore a {max}px.
+
+
+ La dimensione {size} deve essere inferiore a {max}.
+
+
+ La larghezza {width}px deve essere inferiore a {max}px.
+
+
+ Non deve avere più di {max} elemento(i).
+
+
+ Non deve avere più di {max} carattere(i).
+
+
+ Must not have more than {max} word(s).
+
+
+ Deve essere maggiore o uguale a {min}.
+
+
+ L'altezza {height}px deve essere maggiore di {min}px.
+
+
+ La dimensione {size} deve essere maggiore di {min}.
+
+
+ La larghezza {width}px deve essere maggiore di {min}px.
+
+
+ Deve avere almento {min} elemento(i).
+
+
+ Deve avere almeno {min} carattere(i).
+
+
+ Must have at least {min} text character(s).
+
+
+ Must have at least {min} word(s).
+
+
+ Il valore non deve essere definito.
+
+
+ Must have exactly {count} text character(s).
+
+
+ Must have between {min} and {max} text character(s).
+
+
+ Non è un valore consentito.
+
+
+ Deve seguire il pattern.
+
+
+ La Regex è troppo lenta.
+
+
+ Il campo è obbligatorio.
+
+
+ Esiste un altro contenuto con lo stesso valore.
+
+
+ Non è noto {fieldType}.
+
+
+ Must have exactly {count} word(s).
+
+
+ Must have between {min} and {max} word(s).
+
+
+ Il workflow del contenuto impedisce la pubblicazione.
+
+
+ Il workflow non consente le modifiche per lo stato {status}
+
+
+ An unknown failure has occurred.
+
+
+ Email is already taken.
+
+
+ User name is already taken.
+
+
+ Email is invalid.
+
+
+ User name '{0}' is invalid, can only contain letters or digits.
+
+
+ A user with this login already exists.
+
+
+ Incorrect password.
+
+
+ Passwords must have at least one digit ('0'-'9').
+
+
+ Passwords must have at least one lowercase ('a'-'z').
+
+
+ Passwords must have at least one non alphanumeric character.
+
+
+ Passwords must use at least {0} different characters.
+
+
+ Passwords must have at least one uppercase ('A'-'Z').
+
+
+ Passwords is too short.
+
+
+ This password has previously appeared in a data breach and should never be used. If you have ever used it anywhere before, change it!
+
+
+ User is locked out.
+
+
+ La query Json non è valida: {message}
+
+
+ La query Json non è valida: {message}
+
+
+ L'entità ({id}) è stata cancellata.
+
+
+ L'entità ({id}) non esiste.
+
+
+ L'entità ({id}) requested version {expectedVersion}, but found {currentVersion}.
+
+
+ aggiunto client {[Id]} all'app
+
+
+ Revocato client {[Id]}
+
+
+ Aggiornato client {[Id]}
+
+
+ Associato {user:[Contributor]} al ruolo {[Role]}
+
+
+ Rimosso {user:[Contributor]} dall'app
+
+
+ aggiunta lingua {[Language]}
+
+
+ rimossa lingua {[Language]}
+
+
+ cambiata la lingua master in {[Language]}
+
+
+ aggiornata la lingua {[Language]}
+
+
+ adggiunto pattern {[Name]}
+
+
+ eliminato pattern {[PatternId]}
+
+
+ modificato pattern {[Name]}
+
+
+ cambiato il piano in {[Plan]}
+
+
+ riconfigurato il piano
+
+
+ aggiunto il ruolo {[Name]}
+
+
+ eliminato role {[Name]}
+
+
+ aggiornato role {[Name]}
+
+
+ risorsa sostituita.
+
+
+ risorsa aggiornata.
+
+
+ risorsa caricata.
+
+
+ creato il contenuto {[Schema]}.
+
+
+ cancellato il contenuto {[Schema]}.
+
+
+ creata una nuova bozza.
+
+
+ cancellata la bozza.
+
+
+ impostato per cambiare lo stato del contenuto {[Schema]} in {[Status]}.
+
+
+ fallita l'impostazione per cambiare lo stato del contenuto {[Schema]}.
+
+
+ aggiornato il contenuto {[Schema]}.
+
+
+ creato lo schema {[Name]}.
+
+
+ cancellato lo schema {[Name]}.
+
+
+ aggiunto il campo {[Field]} allo schema {[Name]}.
+
+
+ cancellato il campo {[Field]} dallo schema {[Name]}.
+
+
+ disabilitato il campo {[Field]} allo schema {[Name]}.
+
+
+ nascosto il campo {[Field]} dallo schema {[Name]}.
+
+
+ bloccato il campo {[Field]} dallo schema {[Name]}.
+
+
+ mostrato il campo {[Field]} dallo schema {[Name]}.
+
+
+ riordinati i campi dello schema {[Name]}.
+
+
+ aggiornato il campo {[Field]} dello schema {[Name]}.
+
+
+ pubblicato lo schema {[Name]}.
+
+
+ configurato lo script per lo schema {[Name]}.
+
+
+ rimosso dalla pubblicazione lo schema {[Name]}.
+
+
+ aggiornato lo schema {[Name]}.
+
+
+ cambiato lo stato del contenuto {[Schema]} in {[Status]}.
+
+
+ Il tuo indirizzo email è impostato su privato in Github. Impostalo come pubblico per poter utilizzare il login Github.
+
+
+ La regola è stata già cancellata.
+
+
+ E' in esecuzione un'altra regola.
+
+
+ Lo schema è stato già cancellato.
+
+
+ Il valore predefinito calcolato e il valore predefinito non possono essere utilizzati insieme.
+
+
+ Il campo '{field}' è stato aggiunto due volte.
+
+
+ Il campo non può essere un campo UI.
+
+
+ Il campo dello schema è bloccato.
+
+
+ Esiste già un campo con lo stesso nome.
+
+
+ Il campo non appartiene allo schema.
+
+
+ Non tutti i campi hanno degli ID associati.
+
+
+ Esiste già uno schema con lo stesso nome.
+
+
+ Non hai i permessi per questo schema.
+
+
+ Lo schema {id} non esiste.
+
+
+ Non è consentita per l'editor di tipo radio la modifica in linea.
+
+
+ Solo i campi di tipo array possono avere campi annidati.
+
+
+ Non è possibile annidare un campo di tipo array.
+
+
+ E' possibile risolvere il nome del collegamento solamente quando il numero massimo di elementi è 1.
+
+
+ E' possibile la modifica in linea solamente per dropdown menu, slugs e campi di input.
+
+
+ I Radio button e dropdown menu hanno bisogno che siano definiti dei valori.
+
+
+ Checkboxes e dropdown menu hanno bisogno che siano definiti dei valori.
+
+
+ Il campo UI non può essere disabilitato.
+
+
+ Il campo UI non può essere abilitato.
+
+
+ Il campo UI non può essere nascosto.
+
+
+ Il campo UI non può essere mostrato.
+
+
+ Contenuto {name}
+
+
+ Contenuti {name}
+
+
+ Schema {name}
+
+
+ Questa password risulta essere stata compromessa e non dovrebbe essere mai utilizzata. Se l'hai utilizzata in precedenza, cambiala!
+
+
+ Questa operazione non è consentita, il tuo account potrebbe essere bloccato.
+
+
+ Accesso negato
+
+
+ Sono d'accordo!
+
+
+ Cookie & Statistiche
+
+
+ <p>Comprendo e accetto che Squidex utilizzi i cookie allo scopo di assicurare una migliore esperienza di utilizzo della piattaforma e per archiviare lo status del login. </p><p> Comprendo e accetto che Squidex abbia integrato Google Analytics (con funzioni di anonimizzazione). Google Analytics è un servizio di analisi web per raccogliere e analizzare dati sul comportamento degli utenti. </p><p> Accetto il <a href="{privacyUrl}" target="_blank" rel="noopener">privacy policies</a>.</p>
+
+
+ E-Mail automatiche (Opzionale)
+
+
+ Comprendo e accetto che Squidex invii e-mail per informarmi su nuove funzionalità, modifiche importanti e tempi di inattività
+
+
+ Abbiamo bisogno del tuo consenso
+
+
+ Devi dare il consenso.
+
+
+ Information Personali
+
+
+ Comprendo e accetto che Squidex raccolga le seguenti informazioni private che vengono recuperate da fornitori di autenticazione esterni come Google, Microsoft o Github. <ul class="personal-information"> <li> Le informazioni personali di base (nome, cognome e immagine) vengono fornite a tutti gli altri utenti in modo che questi possano aggiungerti al loro spazio di lavoro. </li><li> In qualsiasi momento hai la possibilità di modificare queste informazioni per rendere anonimo il tuo account. </li><li> Il tuo account utente ha un identificatore univoco e per tutte le tue modifiche monitoriamo che tu abbia apportato queste modifiche e fornito queste informazioni ad altri utenti. </li></ul>
+
+
+ Acconsento
+
+
+ Operazione non riuscita
+
+
+ Siamo dispiaciuti, qualcosa non ha funzionato correttamente.
+
+
+ Errore
+
+
+ Si è verificata un errore inaspettato.
+
+
+ Il tuo account è bloccato, si prega di contattare l'amministratore.
+
+
+ Account bloccato
+
+
+ Non puoi bloccare te stesso.
+
+
+
+
+
+ Inserisci l'email
+
+
+ Email o password non corretti
+
+
+ {action} con <strong>{provider}</strong>
+
+
+ Clicca qui per accedere
+
+
+ Sei già registrato?
+
+
+ Clicca qui per registrarti
+
+
+ Non hai ancora un account?
+
+
+ Inserisci la password
+
+
+ o
+
+
+ Uscito!
+
+
+ !Per favore chiudi questo popup.
+
+
+ Esci
+
+
+ La login è stata aggiunta con successo.
+
+
+ Cambia la password
+
+
+ Password cambiata con successo.
+
+
+ Utilizza le credenziali client per accedere alle API utilizzando il profilo che ha le informazioni e i permessi corretti
+
+
+ Client
+
+
+ Confermare
+
+
+ Creato
+
+
+ Secret client generato con successo.
+
+
+ Profile modificato
+
+
+ Non mostrare il mio profilo agli altri utentiDo not show my profile to other users
+
+
+ Login
+
+
+ Password
+
+
+ Informazioni personali
+
+
+ Utilizza proprietà personalizzate per regole e script.
+
+
+ Proprietà
+
+
+ Aggiungi una nuova proprietà
+
+
+ Il provider per l'autenticazione è stato rimosso correttamente.
+
+
+ Imposta la Password
+
+
+ Password impostata con successo.
+
+
+ Profilo
+
+
+ Account aggiornato con successo.
+
+
+ Account aggiornato con successo.
+
+
+ Carica un'immagine
+
+
+ Immagine caricata con successo.
+
+
+ Non puoi sbloccare te stesso.
+
+
+ L'utente non ha i permessi per accedere.
+
+
+ Non trovo l'utente.
+
+
+ {property|upper} deve essere tra {min} e {max}.
+
+
+ {property|upper} must be greater or equal to {other|lower}.
+
+
+ {property|upper} deve essere maggiore di {other|lower}.
+
+
+ {property|upper} non è un nome di una proprietà Javascript.
+
+
+ {property|upper} deve essere minore o uguale a {other|lower}.
+
+
+ {property|upper} deve essere minore di {other|lower}.
+
+
+ L'immagine non è un'immagine valida.
+
+
+ Puoi caricare solo un file.
+
+
+ {property|upper} è obbligatorio.
+
+
+ Se {property1|lower} o {property2|lower} sono usate entrambe devono essere definite.
+
+
+ Il valore deve essere impostato.
+
+
+ {property|upper} non è uno slug valido.
+
+
+ {property|upper} non è un valore valido.
+
+
+ Workflow multipli sono associati a tutti gli schema.
+
+
+ Lo step iniziale non può essere quello pubblico.
+
+
+ Il Workflow deve avere uno step pubbico.
+
+
+ La Transition ha un obiettivo non valido.
+
+
+ Lo schema '{schema}' è associato a diversi workflow.
+
+
\ No newline at end of file
diff --git a/backend/src/Squidex.Shared/Texts.nl.resx b/backend/src/Squidex.Shared/Texts.nl.resx
index 9e8e50fea..f7cad376b 100644
--- a/backend/src/Squidex.Shared/Texts.nl.resx
+++ b/backend/src/Squidex.Shared/Texts.nl.resx
@@ -61,12 +61,51 @@
Het veld {name|lower} moet een absolute URL zijn.
+
+ Het veld {0} moet een absolute URL zijn.
+
Het veld {name|lower} moet hetzelfde zijn als {other|lower}.
+
+ Het veld {0} moet hetzelfde zijn als {1}.
+
+
+ The field {name|lower} is not a valid email address.
+
+
+ The field {0} is not a valid email address.
+
+
+ The field {name|lower} must be between {min} and {max}.
+
+
+ The field {0} must be between {1} and {2}.
+
+
+ The field {name|lower} is not.
+
+
+ The field {0} is not.
+
Het veld {name|lower} is verplicht.
+
+ Het veld {0} is verplicht.
+
+
+ The field {name|lower} must be a string with a maximum length of {max}.
+
+
+ The field {0} must be a string with a maximum length of {1}.
+
+
+ The field {name|lower} must be a string with a minimum length of {min} and a maximum length of {max}.
+
+
+ The field {0} must be a string with a minimum length of {1} and a maximum length of {2}.
+
App is al gearchiveerd.
@@ -130,15 +169,6 @@
Kan een rol niet verwijderen wanneer een bijdrager is toegewezen.
-
- Het veld {0} moet een absolute URL zijn.
-
-
- Het veld {0} moet hetzelfde zijn als {other|lower}.
-
-
- Het veld {0} is verplicht.
-
Asset is al verwijderd
@@ -601,6 +631,51 @@
De werkstroom staat geen updates toe met status {status}
+
+ Er is een onbekende fout opgetreden.
+
+
+ E-mail is al in gebruik.
+
+
+ Gebruikersnaam is al in gebruik.
+
+
+ E-mail is ongeldig.
+
+
+ Gebruikersnaam '{0}' is ongeldig, mag alleen letters of cijfers bevatten.
+
+
+ Er bestaat al een gebruiker met deze login.
+
+
+ Onjuist wachtwoord.
+
+
+ Wachtwoorden moeten minstens één cijfer bevatten ('0' - '9').
+
+
+ Wachtwoorden moeten minstens één kleine letter ('a' - 'z') bevatten.
+
+
+ Wachtwoorden moeten minstens één niet-alfanumeriek teken bevatten.
+
+
+ Wachtwoorden moeten minstens {0} verschillende tekens bevatten.
+
+
+ Wachtwoorden moeten minstens één hoofdletter ('A' - 'Z') hebben.
+
+
+ Wachtwoorden zijn te kort.
+
+
+ Dit wachtwoord is eerder verschenen in een datalek en mag nooit worden gebruikt. Als je het ooit eerder ergens hebt gebruikt, verander het dan!
+
+
+ Gebruiker is uitgesloten.
+
Json-query niet geldig: {message}
diff --git a/backend/src/Squidex.Shared/Texts.resx b/backend/src/Squidex.Shared/Texts.resx
index 010411938..ddc1b1405 100644
--- a/backend/src/Squidex.Shared/Texts.resx
+++ b/backend/src/Squidex.Shared/Texts.resx
@@ -61,12 +61,51 @@
The field {name|lower} must be an absolute URL.
+
+ The field {0} must be an absolute URL.
+
The field {name|lower} must be the same as {other|lower}.
+
+ The field {0} must be the same as {1}.
+
+
+ The field {name|lower} is not a valid email address.
+
+
+ The field {0} is not a valid email address.
+
+
+ The field {name|lower} must be between {min} and {max}.
+
+
+ The field {0} must be between {1} and {2}.
+
+
+ The field {name|lower} is not.
+
+
+ The field {0} is not.
+
The field {name|lower} is required.
+
+ The field {0} is required.
+
+
+ The field {name|lower} must be a string with a maximum length of {max}.
+
+
+ The field {0} must be a string with a maximum length of {1}.
+
+
+ The field {name|lower} must be a string with a minimum length of {min} and a maximum length of {max}.
+
+
+ The field {0} must be a string with a minimum length of {1} and a maximum length of {2}.
+
App has already been archived.
@@ -130,15 +169,6 @@
Cannot remove a role when a contributor is assigned.
-
- The field {0} must be an absolute URL.
-
-
- The field {0} must be the same as {other|lower}.
-
-
- The field {0} is required.
-
Asset has already been deleted
@@ -601,6 +631,51 @@
The workflow does not allow updates at status {status}
+
+ An unknown failure has occurred.
+
+
+ Email is already taken.
+
+
+ User name is already taken.
+
+
+ Email is invalid.
+
+
+ User name '{0}' is invalid, can only contain letters or digits.
+
+
+ A user with this login already exists.
+
+
+ Incorrect password.
+
+
+ Passwords must have at least one digit ('0'-'9').
+
+
+ Passwords must have at least one lowercase ('a'-'z').
+
+
+ Passwords must have at least one non alphanumeric character.
+
+
+ Passwords must use at least {0} different characters.
+
+
+ Passwords must have at least one uppercase ('A'-'Z').
+
+
+ Passwords is too short.
+
+
+ This password has previously appeared in a data breach and should never be used. If you have ever used it anywhere before, change it!
+
+
+ User is locked out.
+
Json query not valid: {message}
diff --git a/backend/src/Squidex.Web/ApiModelValidationAttribute.cs b/backend/src/Squidex.Web/ApiModelValidationAttribute.cs
index bebf46230..5b9f67e4a 100644
--- a/backend/src/Squidex.Web/ApiModelValidationAttribute.cs
+++ b/backend/src/Squidex.Web/ApiModelValidationAttribute.cs
@@ -43,7 +43,7 @@ namespace Squidex.Web
{
if (!string.IsNullOrWhiteSpace(error.ErrorMessage) && ShouldExpose(error))
{
- errors.Add(new ValidationError(error.ErrorMessage, key));
+ errors.Add(new ValidationError(error.ErrorMessage));
}
else if (error.Exception is JsonException jsonException)
{
diff --git a/backend/src/Squidex.Web/EntityCreatedDto.cs b/backend/src/Squidex.Web/EntityCreatedDto.cs
index 4946e1af8..615e8f190 100644
--- a/backend/src/Squidex.Web/EntityCreatedDto.cs
+++ b/backend/src/Squidex.Web/EntityCreatedDto.cs
@@ -7,12 +7,13 @@
using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure.Commands;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Web
{
public sealed class EntityCreatedDto
{
- [Required]
+ [LocalizedRequired]
[Display(Description = "Id of the created entity.")]
public string? Id { get; set; }
diff --git a/backend/src/Squidex.Web/ErrorDto.cs b/backend/src/Squidex.Web/ErrorDto.cs
index e659674e3..5e27bf63c 100644
--- a/backend/src/Squidex.Web/ErrorDto.cs
+++ b/backend/src/Squidex.Web/ErrorDto.cs
@@ -6,12 +6,13 @@
// ==========================================================================
using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Web
{
public sealed class ErrorDto
{
- [Required]
+ [LocalizedRequired]
[Display(Description = "Error message.")]
public string? Message { get; set; }
diff --git a/backend/src/Squidex.Web/Resource.cs b/backend/src/Squidex.Web/Resource.cs
index 9989a8441..305fc2767 100644
--- a/backend/src/Squidex.Web/Resource.cs
+++ b/backend/src/Squidex.Web/Resource.cs
@@ -9,14 +9,15 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json;
using Squidex.Infrastructure;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Web
{
public abstract class Resource
{
- [JsonProperty("_links")]
- [Required]
+ [LocalizedRequired]
[Display(Description = "The links.")]
+ [JsonProperty("_links")]
public Dictionary Links { get; } = new Dictionary();
public void AddSelfLink(string href)
diff --git a/backend/src/Squidex.Web/ResourceLink.cs b/backend/src/Squidex.Web/ResourceLink.cs
index 9003ecb80..2b7a95735 100644
--- a/backend/src/Squidex.Web/ResourceLink.cs
+++ b/backend/src/Squidex.Web/ResourceLink.cs
@@ -6,16 +6,17 @@
// ==========================================================================
using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Web
{
public class ResourceLink
{
- [Required]
+ [LocalizedRequired]
[Display(Description = "The link url.")]
public string Href { get; set; }
- [Required]
+ [LocalizedRequired]
[Display(Description = "The link method.")]
public string Method { get; set; }
diff --git a/backend/src/Squidex.Web/Services/StringLocalizer.cs b/backend/src/Squidex.Web/Services/StringLocalizer.cs
index 78b758ce9..51b55cd84 100644
--- a/backend/src/Squidex.Web/Services/StringLocalizer.cs
+++ b/backend/src/Squidex.Web/Services/StringLocalizer.cs
@@ -39,11 +39,18 @@ namespace Squidex.Web.Services
TranslateProperty(name, arguments, currentCulture);
- var (result, found) = translationService.Get(currentCulture, $"aspnet_{name}", name);
+ var (result, found) = translationService.Get(currentCulture, $"dotnet_{name}", name);
if (arguments != null && found)
{
- result = string.Format(currentCulture, result, arguments);
+ try
+ {
+ result = string.Format(currentCulture, result, arguments);
+ }
+ catch (FormatException)
+ {
+ return new LocalizedString(name, name, true);
+ }
}
return new LocalizedString(name, result, !found);
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddLanguageDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddLanguageDto.cs
index ff2207f29..389741b35 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddLanguageDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddLanguageDto.cs
@@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models
{
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The language to add.
///
- [Required]
+ [LocalizedRequired]
public Language Language { get; set; }
public AddLanguage ToCommand()
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddRoleDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddRoleDto.cs
index 73dde6cf8..674077366 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddRoleDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddRoleDto.cs
@@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models
{
@@ -15,7 +15,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The role name.
///
- [Required]
+ [LocalizedRequired]
public string Name { get; set; }
public AddRole ToCommand()
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddWorkflowDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddWorkflowDto.cs
index be751858b..ae97660e8 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddWorkflowDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddWorkflowDto.cs
@@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models
{
@@ -15,7 +15,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The name of the workflow.
///
- [Required]
+ [LocalizedRequired]
public string Name { get; set; }
public AddWorkflow ToCommand()
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppDto.cs
index 2224b2e9f..ab3a6719c 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppDto.cs
@@ -7,7 +7,6 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using NodaTime;
using Squidex.Areas.Api.Controllers.Assets;
using Squidex.Areas.Api.Controllers.Backups;
@@ -19,6 +18,7 @@ using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Domain.Apps.Entities.Apps.Plans;
using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Security;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
using P = Squidex.Shared.Permissions;
@@ -31,8 +31,8 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The name of the app.
///
- [Required]
- [RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
+ [LocalizedRequired]
+ [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs
index 694fddc97..89c5faac4 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs
@@ -5,11 +5,11 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Core.Apps;
using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Infrastructure;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -19,19 +19,19 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The iso code of the language.
///
- [Required]
+ [LocalizedRequired]
public string Iso2Code { get; set; }
///
/// The english name of the language.
///
- [Required]
+ [LocalizedRequired]
public string EnglishName { get; set; }
///
/// The fallback languages.
///
- [Required]
+ [LocalizedRequired]
public Language[] Fallback { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs
index 5a84af22d..f7377c871 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Apps;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The languages.
///
- [Required]
+ [LocalizedRequired]
public AppLanguageDto[] Items { get; set; }
public static AppLanguagesDto FromApp(IAppEntity app, Resources resources)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AssignContributorDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AssignContributorDto.cs
index 7f1d69d1d..dee824cf8 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AssignContributorDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AssignContributorDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Roles = Squidex.Domain.Apps.Core.Apps.Role;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The id or email of the user to add to the app.
///
- [Required]
+ [LocalizedRequired]
public string ContributorId { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientDto.cs
index ea4618e2b..3ad78f4c5 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Apps;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -17,19 +17,19 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The client id.
///
- [Required]
+ [LocalizedRequired]
public string Id { get; set; }
///
/// The client secret.
///
- [Required]
+ [LocalizedRequired]
public string Secret { get; set; }
///
/// The client name.
///
- [Required]
+ [LocalizedRequired]
public string Name { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientsDto.cs
index 3c5c81b66..ebea5004f 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientsDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Apps;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The clients.
///
- [Required]
+ [LocalizedRequired]
public ClientDto[] Items { get; set; }
public static ClientsDto FromApp(IAppEntity app, Resources resources)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorDto.cs
index 30392e186..4114a908d 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorDto.cs
@@ -6,8 +6,8 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure.Translations;
+using Squidex.Infrastructure.Validation;
using Squidex.Shared.Users;
using Squidex.Web;
@@ -18,19 +18,19 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The id of the user that contributes to the app.
///
- [Required]
+ [LocalizedRequired]
public string ContributorId { get; set; }
///
/// The display name.
///
- [Required]
+ [LocalizedRequired]
public string ContributorName { get; set; }
///
/// The email address.
///
- [Required]
+ [LocalizedRequired]
public string ContributorEmail { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorsDto.cs
index 938cea57d..1cd10df58 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorsDto.cs
@@ -5,12 +5,12 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Domain.Apps.Entities.Apps.Plans;
+using Squidex.Infrastructure.Validation;
using Squidex.Shared.Users;
using Squidex.Web;
@@ -21,7 +21,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The contributors.
///
- [Required]
+ [LocalizedRequired]
public ContributorDto[] Items { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateAppDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateAppDto.cs
index 7a849c274..6a833aa0f 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateAppDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateAppDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models
{
@@ -16,8 +16,8 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The name of the app.
///
- [Required]
- [RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
+ [LocalizedRequired]
+ [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateClientDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateClientDto.cs
index 9ee102525..7a688aced 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateClientDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateClientDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models
{
@@ -16,8 +16,8 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The id of the client.
///
- [Required]
- [RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
+ [LocalizedRequired]
+ [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Id { get; set; }
public AttachClient ToCommand()
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternDto.cs
index 39761d261..dd034af09 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternDto.cs
@@ -6,9 +6,9 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Apps;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -23,13 +23,13 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The name of the suggestion.
///
- [Required]
+ [LocalizedRequired]
public string Name { get; set; }
///
/// The regex pattern.
///
- [Required]
+ [LocalizedRequired]
public string Pattern { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternsDto.cs
index e209aa4ac..9142ae6b1 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternsDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Apps;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The patterns.
///
- [Required]
+ [LocalizedRequired]
public PatternDto[] Items { get; set; }
public static PatternsDto FromApp(IAppEntity app, Resources resources)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RoleDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RoleDto.cs
index 5934268d8..7953cbac0 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RoleDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RoleDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Core.Apps;
using Squidex.Domain.Apps.Entities.Apps;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -19,7 +19,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The role name.
///
- [Required]
+ [LocalizedRequired]
public string Name { get; set; }
///
@@ -40,7 +40,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// Associated list of permissions.
///
- [Required]
+ [LocalizedRequired]
public IEnumerable Permissions { get; set; }
public static RoleDto FromRole(Role role, IAppEntity app)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RolesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RolesDto.cs
index 72e813696..2d73751e8 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RolesDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RolesDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Apps;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The roles.
///
- [Required]
+ [LocalizedRequired]
public RoleDto[] Items { get; set; }
public static RolesDto FromApp(IAppEntity app, Resources resources)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateClientDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateClientDto.cs
index cddec99cd..6c772eeca 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateClientDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateClientDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models
{
@@ -16,7 +16,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The new display name of the client.
///
- [StringLength(20)]
+ [LocalizedStringLength(20)]
public string? Name { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdatePatternDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdatePatternDto.cs
index 384c1c909..68cc10b9e 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdatePatternDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdatePatternDto.cs
@@ -6,9 +6,9 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models
{
@@ -17,13 +17,13 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The name of the suggestion.
///
- [Required]
+ [LocalizedRequired]
public string Name { get; set; }
///
/// The regex pattern.
///
- [Required]
+ [LocalizedRequired]
public string Pattern { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateRoleDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateRoleDto.cs
index 7f881e513..bcc356964 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateRoleDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateRoleDto.cs
@@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models
{
@@ -15,7 +15,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// Associated list of permissions.
///
- [Required]
+ [LocalizedRequired]
public string[] Permissions { get; set; }
public UpdateRole ToCommand(string name)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateWorkflowDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateWorkflowDto.cs
index cac16339f..5c2fde490 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateWorkflowDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateWorkflowDto.cs
@@ -7,10 +7,10 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Entities.Apps.Commands;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models
{
@@ -24,7 +24,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The workflow steps.
///
- [Required]
+ [LocalizedRequired]
public Dictionary Steps { get; set; }
///
@@ -35,7 +35,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The initial step.
///
- [Required]
+ [LocalizedRequired]
public Status Initial { get; set; }
public UpdateWorkflow ToCommand(Guid id)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowDto.cs
index 69351c835..d6e98bdfc 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowDto.cs
@@ -7,10 +7,10 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -30,7 +30,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The workflow steps.
///
- [Required]
+ [LocalizedRequired]
public Dictionary Steps { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowStepDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowStepDto.cs
index b49a5e3d8..2d4bce96d 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowStepDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowStepDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using NoUpdateType = Squidex.Domain.Apps.Core.Contents.NoUpdate;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -19,7 +19,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The transitions.
///
- [Required]
+ [LocalizedRequired]
public Dictionary Transitions { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowsDto.cs
index 52e65188b..3be52d787 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowsDto.cs
@@ -5,11 +5,11 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Domain.Apps.Entities.Contents;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models
@@ -19,13 +19,13 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
///
/// The workflow.
///
- [Required]
+ [LocalizedRequired]
public WorkflowDto[] Items { get; set; }
///
/// The errros that should be fixed.
///
- [Required]
+ [LocalizedRequired]
public string[] Errors { get; set; }
public static async Task FromAppAsync(IWorkflowsValidator workflowsValidator, IAppEntity app, Resources resources)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetDto.cs
index 826727184..d737a0f11 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetDto.cs
@@ -7,13 +7,13 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json;
using NodaTime;
using Squidex.Domain.Apps.Core.Assets;
using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Assets.Models
@@ -33,7 +33,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
///
/// The file name.
///
- [Required]
+ [LocalizedRequired]
public string FileName { get; set; }
///
@@ -49,37 +49,37 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
///
/// The slug.
///
- [Required]
+ [LocalizedRequired]
public string Slug { get; set; }
///
/// The mime type.
///
- [Required]
+ [LocalizedRequired]
public string MimeType { get; set; }
///
/// The file type.
///
- [Required]
+ [LocalizedRequired]
public string FileType { get; set; }
///
/// The formatted text representation of the metadata.
///
- [Required]
+ [LocalizedRequired]
public string MetadataText { get; set; }
///
/// The asset metadata.
///
- [Required]
+ [LocalizedRequired]
public AssetMetadata Metadata { get; set; }
///
/// The asset tags.
///
- [Required]
+ [LocalizedRequired]
public HashSet? Tags { get; set; }
///
@@ -100,13 +100,13 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
///
/// The user that has created the schema.
///
- [Required]
+ [LocalizedRequired]
public RefToken CreatedBy { get; set; }
///
/// The user that has updated the asset.
///
- [Required]
+ [LocalizedRequired]
public RefToken LastModifiedBy { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFolderDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFolderDto.cs
index 6c8db0ba6..b2d2e4204 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFolderDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFolderDto.cs
@@ -6,9 +6,9 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Assets.Models
@@ -28,7 +28,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
///
/// The folder name.
///
- [Required]
+ [LocalizedRequired]
public string FolderName { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFoldersDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFoldersDto.cs
index 97b0bb917..b69f814c0 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFoldersDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFoldersDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Infrastructure;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Assets.Models
@@ -24,13 +24,13 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
///
/// The assets folders.
///
- [Required]
+ [LocalizedRequired]
public AssetFolderDto[] Items { get; set; }
///
/// The path to the current folder.
///
- [Required]
+ [LocalizedRequired]
public AssetFolderDto[] Path { get; set; }
public static AssetFoldersDto FromAssets(IResultList assetFolders, IEnumerable path, Resources resources)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetsDto.cs
index 0c9f2acfc..89b864e67 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetsDto.cs
@@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Infrastructure;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Assets.Models
@@ -23,7 +23,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
///
/// The assets.
///
- [Required]
+ [LocalizedRequired]
public AssetDto[] Items { get; set; }
public static AssetsDto FromAssets(IResultList assets, Resources resources)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/CreateAssetFolderDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/CreateAssetFolderDto.cs
index 1b2154b43..354ffd70f 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/CreateAssetFolderDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/CreateAssetFolderDto.cs
@@ -6,9 +6,9 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Assets.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Assets.Models
{
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
///
/// The name of the folder.
///
- [Required]
+ [LocalizedRequired]
public string FolderName { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/RenameAssetFolderDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/RenameAssetFolderDto.cs
index c0b4568e9..b74263815 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/RenameAssetFolderDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/RenameAssetFolderDto.cs
@@ -6,9 +6,9 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Assets.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Assets.Models
{
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
///
/// The name of the folder.
///
- [Required]
+ [LocalizedRequired]
public string FolderName { get; set; }
public RenameAssetFolder ToCommand(Guid id)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobsDto.cs
index 6cb57905f..8f18609bb 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobsDto.cs
@@ -6,9 +6,9 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Backup;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Backups.Models
@@ -18,7 +18,7 @@ namespace Squidex.Areas.Api.Controllers.Backups.Models
///
/// The backups.
///
- [Required]
+ [LocalizedRequired]
public BackupJobDto[] Items { get; set; }
public static BackupJobsDto FromBackups(IEnumerable backups, Resources resources)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreJobDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreJobDto.cs
index d28d77ab0..9a5fd2212 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreJobDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreJobDto.cs
@@ -7,10 +7,10 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using NodaTime;
using Squidex.Domain.Apps.Entities.Backup;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Backups.Models
{
@@ -19,13 +19,13 @@ namespace Squidex.Areas.Api.Controllers.Backups.Models
///
/// The uri to load from.
///
- [Required]
+ [LocalizedRequired]
public Uri Url { get; set; }
///
/// The status log.
///
- [Required]
+ [LocalizedRequired]
public List Log { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreRequestDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreRequestDto.cs
index f51bc342b..01fa64122 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreRequestDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreRequestDto.cs
@@ -6,7 +6,7 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Backups.Models
{
@@ -15,13 +15,13 @@ namespace Squidex.Areas.Api.Controllers.Backups.Models
///
/// The name of the app.
///
- [RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
+ [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; }
///
/// The url to the restore file.
///
- [Required]
+ [LocalizedRequired]
public Uri Url { get; set; }
}
}
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Comments/Models/CommentDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Comments/Models/CommentDto.cs
index 25bbd699f..bbfb07438 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Comments/Models/CommentDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Comments/Models/CommentDto.cs
@@ -6,12 +6,12 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using NodaTime;
using Squidex.Domain.Apps.Core.Comments;
using Squidex.Domain.Apps.Entities.Comments.Commands;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Comments.Models
{
@@ -25,19 +25,19 @@ namespace Squidex.Areas.Api.Controllers.Comments.Models
///
/// The time when the comment was created or updated last.
///
- [Required]
+ [LocalizedRequired]
public Instant Time { get; set; }
///
/// The user who created or updated the comment.
///
- [Required]
+ [LocalizedRequired]
public RefToken User { get; set; }
///
/// The text of the comment.
///
- [Required]
+ [LocalizedRequired]
public string Text { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Comments/Models/UpsertCommentDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Comments/Models/UpsertCommentDto.cs
index 0a17abffa..2398f39f5 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Comments/Models/UpsertCommentDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Comments/Models/UpsertCommentDto.cs
@@ -6,9 +6,9 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Comments.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Comments.Models
{
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Comments.Models
///
/// The comment text.
///
- [Required]
+ [LocalizedRequired]
public string Text { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/BulkUpdateDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/BulkUpdateDto.cs
index 57aefa206..bee7918e9 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/BulkUpdateDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/BulkUpdateDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Contents.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models
{
@@ -18,7 +18,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
///
/// The contents to update or insert.
///
- [Required]
+ [LocalizedRequired]
public List Jobs { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ChangeStatusDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ChangeStatusDto.cs
index 7a89789c9..8d4f5a030 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ChangeStatusDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ChangeStatusDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using NodaTime;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Entities.Contents.Commands;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models
{
@@ -18,7 +18,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
///
/// The new status.
///
- [Required]
+ [LocalizedRequired]
public Status Status { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs
index fbe8555c6..7239e1abe 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs
@@ -6,7 +6,6 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using NodaTime;
using Squidex.Areas.Api.Controllers.Schemas.Models;
@@ -16,6 +15,7 @@ using Squidex.Domain.Apps.Entities;
using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Contents.Models
@@ -30,19 +30,19 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
///
/// The user that has created the content item.
///
- [Required]
+ [LocalizedRequired]
public RefToken CreatedBy { get; set; }
///
/// The user that has updated the content item.
///
- [Required]
+ [LocalizedRequired]
public RefToken LastModifiedBy { get; set; }
///
/// The data of the content item.
///
- [Required]
+ [LocalizedRequired]
public object Data { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsDto.cs
index eec6b3ae9..83d8aa4c2 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsDto.cs
@@ -5,13 +5,13 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Squidex.Domain.Apps.Entities;
using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Domain.Apps.Entities.Schemas;
using Squidex.Infrastructure;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Contents.Models
@@ -26,13 +26,13 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
///
/// The content items.
///
- [Required]
+ [LocalizedRequired]
public ContentDto[] Items { get; set; }
///
/// The possible statuses.
///
- [Required]
+ [LocalizedRequired]
public StatusInfoDto[] Statuses { get; set; }
public static async Task FromContentsAsync(IResultList contents, Context context, Resources resources,
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsIdsQueryDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsIdsQueryDto.cs
index b31cd5b07..01a7986f5 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsIdsQueryDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsIdsQueryDto.cs
@@ -7,7 +7,7 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models
{
@@ -16,7 +16,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
///
/// The list of ids to query.
///
- [Required]
+ [LocalizedRequired]
public List Ids { get; set; }
}
}
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ImportContentsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ImportContentsDto.cs
index a4c25fa54..2d20e1c7a 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ImportContentsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ImportContentsDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Entities.Contents.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models
{
@@ -18,7 +18,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
///
/// The data to import.
///
- [Required]
+ [LocalizedRequired]
public List Datas { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ScheduleJobDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ScheduleJobDto.cs
index 265afeb98..3058f4be3 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ScheduleJobDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ScheduleJobDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using NodaTime;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Infrastructure;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models
{
@@ -38,7 +38,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
///
/// The user who schedule the content.
///
- [Required]
+ [LocalizedRequired]
public RefToken ScheduledBy { get; set; }
}
}
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/StatusInfoDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/StatusInfoDto.cs
index 510ba8a7a..c2c14958e 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/StatusInfoDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/StatusInfoDto.cs
@@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Contents;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models
{
@@ -15,13 +15,13 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
///
/// The name of the status.
///
- [Required]
+ [LocalizedRequired]
public Status Status { get; set; }
///
/// The color of the status.
///
- [Required]
+ [LocalizedRequired]
public string Color { get; set; }
public static StatusInfoDto FromStatusInfo(StatusInfo statusInfo)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/History/Models/HistoryEventDto.cs b/backend/src/Squidex/Areas/Api/Controllers/History/Models/HistoryEventDto.cs
index 4247d1adc..4922f4134 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/History/Models/HistoryEventDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/History/Models/HistoryEventDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using NodaTime;
using Squidex.Domain.Apps.Entities.History;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.History.Models
{
@@ -18,19 +18,19 @@ namespace Squidex.Areas.Api.Controllers.History.Models
///
/// The message for the event.
///
- [Required]
+ [LocalizedRequired]
public string Message { get; set; }
///
/// The type of the original event.
///
- [Required]
+ [LocalizedRequired]
public string EventType { get; set; }
///
/// The user who called the action.
///
- [Required]
+ [LocalizedRequired]
public string Actor { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/LanguageDto.cs b/backend/src/Squidex/Areas/Api/Controllers/LanguageDto.cs
index 4d4c369fa..891c730fb 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/LanguageDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/LanguageDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers
{
@@ -16,13 +16,13 @@ namespace Squidex.Areas.Api.Controllers
///
/// The iso code of the language.
///
- [Required]
+ [LocalizedRequired]
public string Iso2Code { get; set; }
///
/// The english name of the language.
///
- [Required]
+ [LocalizedRequired]
public string EnglishName { get; set; }
public static LanguageDto FromLanguage(Language language)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeatureDto.cs b/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeatureDto.cs
index a484d21b5..839eb5496 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeatureDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeatureDto.cs
@@ -5,7 +5,7 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.News.Models
{
@@ -14,13 +14,13 @@ namespace Squidex.Areas.Api.Controllers.News.Models
///
/// The name of the feature.
///
- [Required]
+ [LocalizedRequired]
public string Name { get; set; }
///
/// The description text.
///
- [Required]
+ [LocalizedRequired]
public string Text { get; set; }
}
}
diff --git a/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs
index b0535aaa3..3f16aec58 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs
@@ -6,7 +6,7 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.News.Models
{
@@ -15,7 +15,7 @@ namespace Squidex.Areas.Api.Controllers.News.Models
///
/// The latest features.
///
- [Required]
+ [LocalizedRequired]
public List Features { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/AppPlansDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/AppPlansDto.cs
index c7d45d74b..091ee1356 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/AppPlansDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/AppPlansDto.cs
@@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Domain.Apps.Entities.Apps.Plans;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Plans.Models
{
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Plans.Models
///
/// The available plans.
///
- [Required]
+ [LocalizedRequired]
public PlanDto[] Plans { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/ChangePlanDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/ChangePlanDto.cs
index ef3de233c..8cf0c5939 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/ChangePlanDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/ChangePlanDto.cs
@@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Http;
using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Plans.Models
{
@@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Plans.Models
///
/// The new plan id.
///
- [Required]
+ [LocalizedRequired]
public string PlanId { get; set; }
public ChangePlan ToCommand(HttpContext httpContext)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/PlanDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/PlanDto.cs
index bdc4d4c78..051d73523 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/PlanDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Plans/Models/PlanDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Plans;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Plans.Models
{
@@ -16,19 +16,19 @@ namespace Squidex.Areas.Api.Controllers.Plans.Models
///
/// The id of the plan.
///
- [Required]
+ [LocalizedRequired]
public string Id { get; set; }
///
/// The name of the plan.
///
- [Required]
+ [LocalizedRequired]
public string Name { get; set; }
///
/// The monthly costs of the plan.
///
- [Required]
+ [LocalizedRequired]
public string Costs { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/CreateRuleDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/CreateRuleDto.cs
index 235637e99..c117463cd 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/CreateRuleDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/CreateRuleDto.cs
@@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json;
using Squidex.Domain.Apps.Core.Rules;
using Squidex.Domain.Apps.Entities.Rules.Commands;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Rules.Models
{
@@ -17,13 +17,13 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
///
/// The trigger properties.
///
- [Required]
+ [LocalizedRequired]
public RuleTriggerDto Trigger { get; set; }
///
/// The action properties.
///
- [Required]
+ [LocalizedRequired]
[JsonConverter(typeof(RuleActionConverter))]
public RuleAction Action { get; set; }
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleDto.cs
index a844c6f19..68e35177a 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleDto.cs
@@ -6,7 +6,6 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json;
using NodaTime;
using Squidex.Areas.Api.Controllers.Rules.Models.Converters;
@@ -14,6 +13,7 @@ using Squidex.Domain.Apps.Core.Rules;
using Squidex.Domain.Apps.Entities.Rules;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Rules.Models
@@ -28,13 +28,13 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
///
/// The user that has created the rule.
///
- [Required]
+ [LocalizedRequired]
public RefToken CreatedBy { get; set; }
///
/// The user that has updated the rule.
///
- [Required]
+ [LocalizedRequired]
public RefToken LastModifiedBy { get; set; }
///
@@ -65,13 +65,13 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
///
/// The trigger properties.
///
- [Required]
+ [LocalizedRequired]
public RuleTriggerDto Trigger { get; set; }
///
/// The action properties.
///
- [Required]
+ [LocalizedRequired]
[JsonConverter(typeof(RuleActionConverter))]
public RuleAction Action { get; set; }
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementDto.cs
index c146e2afa..5b78ff011 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementDto.cs
@@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Rules.Models
{
@@ -17,13 +17,13 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
///
/// Describes the action or trigger type.
///
- [Required]
+ [LocalizedRequired]
public string Description { get; set; }
///
/// The label for the action or trigger type.
///
- [Required]
+ [LocalizedRequired]
public string Display { get; set; }
///
@@ -49,7 +49,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
///
/// The properties.
///
- [Required]
+ [LocalizedRequired]
public RuleElementPropertyDto[] Properties { get; set; }
public static RuleElementDto FromDefinition(RuleActionDefinition definition)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementPropertyDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementPropertyDto.cs
index 432e13317..f6180f369 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementPropertyDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementPropertyDto.cs
@@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Rules.Models
{
@@ -15,19 +15,19 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
///
/// The html editor.
///
- [Required]
+ [LocalizedRequired]
public RuleActionPropertyEditor Editor { get; set; }
///
/// The name of the editor.
///
- [Required]
+ [LocalizedRequired]
public string Name { get; set; }
///
/// The label to use.
///
- [Required]
+ [LocalizedRequired]
public string Display { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventDto.cs
index 3866c88b7..40f9cbcde 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventDto.cs
@@ -6,11 +6,11 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using NodaTime;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Entities.Rules;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Rules.Models
@@ -30,13 +30,13 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
///
/// The description.
///
- [Required]
+ [LocalizedRequired]
public string Description { get; set; }
///
/// The name of the event.
///
- [Required]
+ [LocalizedRequired]
public string EventName { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventsDto.cs
index d5a77fa1d..7b8889934 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventsDto.cs
@@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Rules;
using Squidex.Infrastructure;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Rules.Models
@@ -18,7 +18,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
///
/// The rule events.
///
- [Required]
+ [LocalizedRequired]
public RuleEventDto[] Items { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RulesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RulesDto.cs
index c46cf07e7..4511cec35 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RulesDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RulesDto.cs
@@ -7,9 +7,9 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Rules;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Rules.Models
@@ -19,7 +19,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
///
/// The rules.
///
- [Required]
+ [LocalizedRequired]
public RuleDto[] Items { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedRuleTriggerDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedRuleTriggerDto.cs
index dbf304a39..fc6bf03e5 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedRuleTriggerDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedRuleTriggerDto.cs
@@ -5,12 +5,12 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Core.Rules;
using Squidex.Domain.Apps.Core.Rules.Triggers;
using Squidex.Infrastructure.Collections;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Rules.Models.Triggers
{
@@ -19,7 +19,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models.Triggers
///
/// The schema settings.
///
- [Required]
+ [LocalizedRequired]
public ContentChangedRuleTriggerSchemaDto[] Schemas { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/UsageRuleTriggerDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/UsageRuleTriggerDto.cs
index e5dbce7bc..0bd27eec0 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/UsageRuleTriggerDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/UsageRuleTriggerDto.cs
@@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Rules;
using Squidex.Domain.Apps.Core.Rules.Triggers;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Rules.Models.Triggers
{
@@ -22,7 +22,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models.Triggers
///
/// The number of days to check or null for the current month.
///
- [Range(1, 30)]
+ [LocalizedRange(1, 30)]
public int? NumDays { get; set; }
public override RuleTrigger ToTrigger()
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/AddFieldDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/AddFieldDto.cs
index bb8822ff6..dfd0bd8bc 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/AddFieldDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/AddFieldDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
{
@@ -16,8 +16,8 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The name of the field. Must be unique within the schema.
///
- [Required]
- [RegularExpression("^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*$")]
+ [LocalizedRequired]
+ [LocalizedRegularExpression("^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*$")]
public string Name { get; set; }
///
@@ -28,7 +28,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The field properties.
///
- [Required]
+ [LocalizedRequired]
public FieldPropertiesDto Properties { get; set; }
public AddField ToCommand(long? parentId = null)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/CreateSchemaDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/CreateSchemaDto.cs
index fa088af3b..1fad4c9b7 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/CreateSchemaDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/CreateSchemaDto.cs
@@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
{
@@ -15,8 +15,8 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The name of the schema.
///
- [Required]
- [RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
+ [LocalizedRequired]
+ [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldDto.cs
index 17f7e79b8..86c9f6605 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldDto.cs
@@ -6,11 +6,11 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using Squidex.Areas.Api.Controllers.Schemas.Models.Converters;
using Squidex.Areas.Api.Controllers.Schemas.Models.Fields;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
@@ -25,8 +25,8 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The name of the field. Must be unique within the schema.
///
- [Required]
- [RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
+ [LocalizedRequired]
+ [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; }
///
@@ -47,13 +47,13 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// Defines the partitioning of the field.
///
- [Required]
+ [LocalizedRequired]
public string Partitioning { get; set; }
///
/// The field properties.
///
- [Required]
+ [LocalizedRequired]
public FieldPropertiesDto Properties { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldPropertiesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldPropertiesDto.cs
index c3644a4f6..1d2888b4b 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldPropertiesDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldPropertiesDto.cs
@@ -7,11 +7,11 @@
using System;
using System.Collections.ObjectModel;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Squidex.Domain.Apps.Core.Schemas;
+using Squidex.Infrastructure.Validation;
using Squidex.Web.Json;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
@@ -23,19 +23,19 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// Optional label for the editor.
///
- [StringLength(100)]
+ [LocalizedStringLength(100)]
public string? Label { get; set; }
///
/// Hints to describe the schema.
///
- [StringLength(1000)]
+ [LocalizedStringLength(1000)]
public string? Hints { get; set; }
///
/// Placeholder to show when no value has been entered.
///
- [StringLength(100)]
+ [LocalizedStringLength(100)]
public string? Placeholder { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldRuleDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldRuleDto.cs
index f1dcb191e..c08d1d37b 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldRuleDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldRuleDto.cs
@@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
{
@@ -17,13 +17,13 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The action to perform when the condition is met.
///
- [Required]
+ [LocalizedRequired]
public FieldRuleAction Action { get; set; }
///
/// The field to update.
///
- [Required]
+ [LocalizedRequired]
public string Field { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/NestedFieldDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/NestedFieldDto.cs
index 236a2876d..bdc29ad1a 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/NestedFieldDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/NestedFieldDto.cs
@@ -5,7 +5,7 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
@@ -20,8 +20,8 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The name of the field. Must be unique within the schema.
///
- [Required]
- [RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
+ [LocalizedRequired]
+ [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; }
///
@@ -42,7 +42,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The field properties.
///
- [Required]
+ [LocalizedRequired]
public FieldPropertiesDto Properties { get; set; }
public void CreateLinks(Resources resources, string schema, long parentId, bool allowUpdate)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/ReorderFieldsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/ReorderFieldsDto.cs
index ab28c7f99..04b592fee 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/ReorderFieldsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/ReorderFieldsDto.cs
@@ -6,8 +6,8 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
{
@@ -16,7 +16,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The field ids in the target order.
///
- [Required]
+ [LocalizedRequired]
public List FieldIds { get; set; }
public ReorderFields ToCommand(long? parentId = null)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaDetailsDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaDetailsDto.cs
index 2643a14fa..6c37198d9 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaDetailsDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaDetailsDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Schemas;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
@@ -21,25 +21,25 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The scripts.
///
- [Required]
+ [LocalizedRequired]
public SchemaScriptsDto Scripts { get; set; } = new SchemaScriptsDto();
///
/// The preview Urls.
///
- [Required]
+ [LocalizedRequired]
public Dictionary PreviewUrls { get; set; } = EmptyPreviewUrls;
///
/// The name of fields that are used in content lists.
///
- [Required]
+ [LocalizedRequired]
public List FieldsInLists { get; set; }
///
/// The name of fields that are used in content references.
///
- [Required]
+ [LocalizedRequired]
public List FieldsInReferences { get; set; }
///
@@ -50,7 +50,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The list of fields.
///
- [Required]
+ [LocalizedRequired]
public List Fields { get; set; }
public static SchemaDetailsDto FromSchemaWithDetails(ISchemaEntity schema, Resources resources)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaDto.cs
index a833c76bf..fd62289e4 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaDto.cs
@@ -6,12 +6,12 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using NodaTime;
using Squidex.Areas.Api.Controllers.Contents;
using Squidex.Domain.Apps.Entities.Schemas;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
@@ -26,8 +26,8 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The name of the schema. Unique within the app.
///
- [Required]
- [RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
+ [LocalizedRequired]
+ [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; }
///
@@ -38,7 +38,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The schema properties.
///
- [Required]
+ [LocalizedRequired]
public SchemaPropertiesDto Properties { get; set; } = new SchemaPropertiesDto();
///
@@ -54,13 +54,13 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The user that has created the schema.
///
- [Required]
+ [LocalizedRequired]
public RefToken CreatedBy { get; set; }
///
/// The user that has updated the schema.
///
- [Required]
+ [LocalizedRequired]
public RefToken LastModifiedBy { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaPropertiesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaPropertiesDto.cs
index 071213aeb..cc629a5e5 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaPropertiesDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaPropertiesDto.cs
@@ -6,7 +6,7 @@
// ==========================================================================
using System.Collections.ObjectModel;
-using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
{
@@ -15,13 +15,13 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// Optional label for the editor.
///
- [StringLength(100)]
+ [LocalizedStringLength(100)]
public string? Label { get; set; }
///
/// Hints to describe the schema.
///
- [StringLength(1000)]
+ [LocalizedStringLength(1000)]
public string? Hints { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpdateFieldDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpdateFieldDto.cs
index 173b9271a..4b5063a91 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpdateFieldDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpdateFieldDto.cs
@@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
{
@@ -15,7 +15,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The field properties.
///
- [Required]
+ [LocalizedRequired]
public FieldPropertiesDto Properties { get; set; }
public UpdateField ToCommand(long id, long? parentId = null)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpdateSchemaDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpdateSchemaDto.cs
index d360cab25..576fc669f 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpdateSchemaDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpdateSchemaDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System.Collections.ObjectModel;
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
{
@@ -18,13 +18,13 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// Optional label for the editor.
///
- [StringLength(100)]
+ [LocalizedStringLength(100)]
public string? Label { get; set; }
///
/// Hints to describe the schema.
///
- [StringLength(1000)]
+ [LocalizedStringLength(1000)]
public string? Hints { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpsertSchemaFieldDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpsertSchemaFieldDto.cs
index 53b872400..fae6abe03 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpsertSchemaFieldDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpsertSchemaFieldDto.cs
@@ -6,7 +6,7 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
{
@@ -15,8 +15,8 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The name of the field. Must be unique within the schema.
///
- [Required]
- [RegularExpression("^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*$")]
+ [LocalizedRequired]
+ [LocalizedRegularExpression("^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*$")]
public string Name { get; set; }
///
@@ -42,7 +42,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The field properties.
///
- [Required]
+ [LocalizedRequired]
public FieldPropertiesDto Properties { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpsertSchemaNestedFieldDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpsertSchemaNestedFieldDto.cs
index 823bddd69..2d3c07b89 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpsertSchemaNestedFieldDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/UpsertSchemaNestedFieldDto.cs
@@ -5,7 +5,7 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Schemas.Models
{
@@ -14,8 +14,8 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The name of the field. Must be unique within the schema.
///
- [Required]
- [RegularExpression("^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*$")]
+ [LocalizedRequired]
+ [LocalizedRegularExpression("^[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*$")]
public string Name { get; set; }
///
@@ -36,7 +36,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
///
/// The field properties.
///
- [Required]
+ [LocalizedRequired]
public FieldPropertiesDto Properties { get; set; }
}
}
\ No newline at end of file
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Search/Models/SearchResultDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Search/Models/SearchResultDto.cs
index 4cf504122..90f431ffc 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Search/Models/SearchResultDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Search/Models/SearchResultDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Search;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Search.Models
@@ -17,13 +17,13 @@ namespace Squidex.Areas.Api.Controllers.Search.Models
///
/// The name of the search result.
///
- [Required]
+ [LocalizedRequired]
public string Name { get; set; }
///
/// The type of the search result.
///
- [Required]
+ [LocalizedRequired]
public SearchResultType Type { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsageDtoDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsageDtoDto.cs
index 9cdffd8a9..851d0f944 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsageDtoDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsageDtoDto.cs
@@ -6,10 +6,10 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Apps.Entities.Apps.Plans;
using Squidex.Infrastructure.UsageTracking;
+using Squidex.Infrastructure.Validation;
#pragma warning disable CS0618 // Type or member is obsolete
@@ -60,7 +60,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics.Models
///
/// The statistics by date and group.
///
- [Required]
+ [LocalizedRequired]
public Dictionary Details { get; set; }
public static CallsUsageDtoDto FromStats(IAppLimitsPlan plan, ApiStatsSummary summary, Dictionary> details)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Translations/Models/TranslateDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Translations/Models/TranslateDto.cs
index ee0c643de..d50575cac 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Translations/Models/TranslateDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Translations/Models/TranslateDto.cs
@@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Translations.Models
{
@@ -15,13 +15,13 @@ namespace Squidex.Areas.Api.Controllers.Translations.Models
///
/// The text to translate.
///
- [Required]
+ [LocalizedRequired]
public string Text { get; set; }
///
/// The target language.
///
- [Required]
+ [LocalizedRequired]
public Language TargetLanguage { get; set; }
///
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Users/Models/CreateUserDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Users/Models/CreateUserDto.cs
index 9dbd2feac..a173895f6 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Users/Models/CreateUserDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Users/Models/CreateUserDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Users;
using Squidex.Infrastructure.Security;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Users.Models
{
@@ -16,26 +16,26 @@ namespace Squidex.Areas.Api.Controllers.Users.Models
///
/// The email of the user. Unique value.
///
- [Required]
- [EmailAddress]
+ [LocalizedRequired]
+ [LocalizedEmailAddress]
public string Email { get; set; }
///
/// The display name (usually first name and last name) of the user.
///
- [Required]
+ [LocalizedRequired]
public string DisplayName { get; set; }
///
/// The password of the user.
///
- [Required]
+ [LocalizedRequired]
public string Password { get; set; }
///
/// Additional permissions for the user.
///
- [Required]
+ [LocalizedRequired]
public string[] Permissions { get; set; }
public UserValues ToValues()
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UpdateUserDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UpdateUserDto.cs
index 3ab37ac61..fd726ea9e 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UpdateUserDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UpdateUserDto.cs
@@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Users;
using Squidex.Infrastructure.Security;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Users.Models
{
@@ -16,14 +16,14 @@ namespace Squidex.Areas.Api.Controllers.Users.Models
///
/// The email of the user. Unique value.
///
- [Required]
- [EmailAddress]
+ [LocalizedRequired]
+ [LocalizedEmailAddress]
public string Email { get; set; }
///
/// The display name (usually first name and last name) of the user.
///
- [Required]
+ [LocalizedRequired]
public string DisplayName { get; set; }
///
@@ -34,7 +34,7 @@ namespace Squidex.Areas.Api.Controllers.Users.Models
///
/// Additional permissions for the user.
///
- [Required]
+ [LocalizedRequired]
public string[] Permissions { get; set; }
public UserValues ToValues()
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UserDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UserDto.cs
index d95fccd7e..6c51fe683 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UserDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UserDto.cs
@@ -6,8 +6,8 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure.Reflection;
+using Squidex.Infrastructure.Validation;
using Squidex.Shared.Users;
using Squidex.Web;
@@ -18,31 +18,31 @@ namespace Squidex.Areas.Api.Controllers.Users.Models
///
/// The id of the user.
///
- [Required]
+ [LocalizedRequired]
public string Id { get; set; }
///
/// The email of the user. Unique value.
///
- [Required]
+ [LocalizedRequired]
public string Email { get; set; }
///
/// The display name (usually first name and last name) of the user.
///
- [Required]
+ [LocalizedRequired]
public string DisplayName { get; set; }
///
/// Determines if the user is locked.
///
- [Required]
+ [LocalizedRequired]
public bool IsLocked { get; set; }
///
/// Additional permissions for the user.
///
- [Required]
+ [LocalizedRequired]
public IEnumerable Permissions { get; set; }
public static UserDto FromUser(IUser user, Resources resources)
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UsersDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UsersDto.cs
index 1468dba3e..de247f7a2 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UsersDto.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Users/Models/UsersDto.cs
@@ -6,9 +6,9 @@
// ==========================================================================
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Linq;
using Squidex.Domain.Users;
+using Squidex.Infrastructure.Validation;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Users.Models
@@ -23,7 +23,7 @@ namespace Squidex.Areas.Api.Controllers.Users.Models
///
/// The users.
///
- [Required]
+ [LocalizedRequired]
public UserDto[] Items { get; set; }
public static UsersDto FromResults(IEnumerable items, long total, Resources resources)
diff --git a/backend/src/Squidex/Areas/IdentityServer/Controllers/Account/LoginModel.cs b/backend/src/Squidex/Areas/IdentityServer/Controllers/Account/LoginModel.cs
index 69abd354e..fa0dbbb58 100644
--- a/backend/src/Squidex/Areas/IdentityServer/Controllers/Account/LoginModel.cs
+++ b/backend/src/Squidex/Areas/IdentityServer/Controllers/Account/LoginModel.cs
@@ -5,7 +5,7 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using Squidex.Infrastructure.Translations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.IdentityServer.Controllers.Account
{
@@ -14,7 +14,7 @@ namespace Squidex.Areas.IdentityServer.Controllers.Account
[LocalizedRequired]
public string Email { get; set; }
- [LocalizedRequired]
+ [LocalizedRequiredAttribute]
public string Password { get; set; }
}
}
diff --git a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ChangePasswordModel.cs b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ChangePasswordModel.cs
index 9ef52234a..0d73e06be 100644
--- a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ChangePasswordModel.cs
+++ b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ChangePasswordModel.cs
@@ -5,7 +5,7 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using Squidex.Infrastructure.Translations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.IdentityServer.Controllers.Profile
{
@@ -14,7 +14,7 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
[LocalizedRequired]
public string OldPassword { get; set; }
- [LocalizedRequired]
+ [LocalizedRequiredAttribute]
public string Password { get; set; }
[LocalizedCompare(nameof(Password))]
diff --git a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ChangeProfileModel.cs b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ChangeProfileModel.cs
index 67bac754e..2cd6cdadd 100644
--- a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ChangeProfileModel.cs
+++ b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ChangeProfileModel.cs
@@ -6,7 +6,7 @@
// ==========================================================================
using Squidex.Domain.Users;
-using Squidex.Infrastructure.Translations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.IdentityServer.Controllers.Profile
{
@@ -15,7 +15,7 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
[LocalizedRequired]
public string Email { get; set; }
- [LocalizedRequired]
+ [LocalizedRequiredAttribute]
public string DisplayName { get; set; }
public bool IsHidden { get; set; }
diff --git a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ProfileController.cs b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ProfileController.cs
index 8b98e7ca2..5c9782cac 100644
--- a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ProfileController.cs
+++ b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ProfileController.cs
@@ -169,7 +169,9 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
{
if (file.Count != 1)
{
- return IdentityResult.Failed(new IdentityError { Description = T.Get("validation.onlyOneFile") });
+ var description = T.Get("validation.onlyOneFile");
+
+ return IdentityResult.Failed(new IdentityError { Code = "PictureNotOneFile", Description = description });
}
using (var thumbnailStream = new MemoryStream())
@@ -182,7 +184,9 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
}
catch
{
- return IdentityResult.Failed(new IdentityError { Description = T.Get("validation.notAnImage") });
+ var description = T.Get("validation.notAnImage");
+
+ return IdentityResult.Failed(new IdentityError { Code = "PictureNotAnImage", Description = description });
}
await userPictureStore.UploadAsync(user.Id, thumbnailStream);
@@ -217,7 +221,7 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
return RedirectToAction(nameof(Profile), new { successMessage });
}
- errorMessage = string.Join(". ", result.Errors.Select(x => x.Description));
+ errorMessage = result.Localize();
}
catch
{
diff --git a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/RemoveLoginModel.cs b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/RemoveLoginModel.cs
index 2d17d96d8..5ab25bda2 100644
--- a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/RemoveLoginModel.cs
+++ b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/RemoveLoginModel.cs
@@ -5,7 +5,7 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using Squidex.Infrastructure.Translations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.IdentityServer.Controllers.Profile
{
@@ -14,7 +14,7 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
[LocalizedRequired]
public string LoginProvider { get; set; }
- [LocalizedRequired]
+ [LocalizedRequiredAttribute]
public string ProviderKey { get; set; }
}
}
diff --git a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/SetPasswordModel.cs b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/SetPasswordModel.cs
index 568ca4c1d..08b4b086c 100644
--- a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/SetPasswordModel.cs
+++ b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/SetPasswordModel.cs
@@ -5,7 +5,7 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using Squidex.Infrastructure.Translations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.IdentityServer.Controllers.Profile
{
@@ -14,7 +14,7 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
[LocalizedRequired]
public string Password { get; set; }
- [LocalizedRequired]
+ [LocalizedRequiredAttribute]
public string PasswordConfirm { get; set; }
}
}
diff --git a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/UserProperty.cs b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/UserProperty.cs
index d1dce20a3..e97f26117 100644
--- a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/UserProperty.cs
+++ b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/UserProperty.cs
@@ -5,7 +5,7 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
-using Squidex.Infrastructure.Translations;
+using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.IdentityServer.Controllers.Profile
{
@@ -14,7 +14,7 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
[LocalizedRequired]
public string Name { get; set; }
- [LocalizedRequired]
+ [LocalizedRequiredAttribute]
public string Value { get; set; }
public (string Name, string Value) ToTuple()
diff --git a/backend/src/Squidex/Config/Web/WebExtensions.cs b/backend/src/Squidex/Config/Web/WebExtensions.cs
index 94e7caa1c..2671186ad 100644
--- a/backend/src/Squidex/Config/Web/WebExtensions.cs
+++ b/backend/src/Squidex/Config/Web/WebExtensions.cs
@@ -35,7 +35,7 @@ namespace Squidex.Config.Web
public static IApplicationBuilder UseSquidexLocalization(this IApplicationBuilder app)
{
- var supportedCultures = new[] { "en", "nl" };
+ var supportedCultures = new[] { "en", "nl", "it" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture(supportedCultures[0])
diff --git a/backend/src/Squidex/Squidex.csproj b/backend/src/Squidex/Squidex.csproj
index 6ec90ec91..a3e297f9b 100644
--- a/backend/src/Squidex/Squidex.csproj
+++ b/backend/src/Squidex/Squidex.csproj
@@ -126,6 +126,7 @@
+
diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleElementRegistryTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleElementRegistryTests.cs
index 9b67ab1aa..3cfca4238 100644
--- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleElementRegistryTests.cs
+++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleElementRegistryTests.cs
@@ -11,6 +11,7 @@ using System.Linq;
using FluentAssertions;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules;
+using Squidex.Infrastructure.Validation;
using Xunit;
namespace Squidex.Domain.Apps.Core.Operations.HandleRules
@@ -49,7 +50,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
ReadMore = "https://www.readmore.com/")]
public sealed class MyRuleAction : RuleAction
{
- [Required]
+ [LocalizedRequired]
[Display(Name = "Url Name", Description = "Url Description")]
[DataType(DataType.Url)]
[Formattable]
diff --git a/frontend/app/features/content/shared/list/content-list-header.component.html b/frontend/app/features/content/shared/list/content-list-header.component.html
index 707012dc1..05652bed0 100644
--- a/frontend/app/features/content/shared/list/content-list-header.component.html
+++ b/frontend/app/features/content/shared/list/content-list-header.component.html
@@ -1,9 +1,9 @@
-
+
-
-
+
-
+
-
-
+
-
+
-
+
-
+
-
+
-
+ maxLength) {
- return { betweenlength: { minLength, maxLength, actual: length }};
+ return { betweenlength: { minlength: minLength, maxlength: maxLength, actual: length }};
}
}
diff --git a/frontend/app/framework/angular/http/http-extensions.ts b/frontend/app/framework/angular/http/http-extensions.ts
index 539457fa2..e0a14e455 100644
--- a/frontend/app/framework/angular/http/http-extensions.ts
+++ b/frontend/app/framework/angular/http/http-extensions.ts
@@ -81,6 +81,7 @@ export module HTTP {
export const pretifyError = (message: string) => (source: Observable) =>
source.pipe(catchError((response: HttpErrorResponse) => {
const error = parseError(response, message);
+
return throwError(error);
}));
diff --git a/frontend/app/shared/components/assets/asset-folder.component.html b/frontend/app/shared/components/assets/asset-folder.component.html
index 39a4237ea..079c6bf76 100644
--- a/frontend/app/shared/components/assets/asset-folder.component.html
+++ b/frontend/app/shared/components/assets/asset-folder.component.html
@@ -5,7 +5,7 @@