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.

Accetto il privacy policies.

", + "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 @@
- {{assetFolder.folderName}} + {{assetFolder.folderName | sqxTranslate}}
@@ -40,8 +41,7 @@ [cdkDropListEnterPredicate]="canEnter">
-
diff --git a/frontend/app/shared/components/search/queries/filter-logical.component.html b/frontend/app/shared/components/search/queries/filter-logical.component.html index c656c2d54..450f107fa 100644 --- a/frontend/app/shared/components/search/queries/filter-logical.component.html +++ b/frontend/app/shared/components/search/queries/filter-logical.component.html @@ -25,7 +25,12 @@
- +
diff --git a/frontend/app/shared/components/search/queries/query-path.component.html b/frontend/app/shared/components/search/queries/query-path.component.html index 614ecc5bb..671fd7976 100644 --- a/frontend/app/shared/components/search/queries/query-path.component.html +++ b/frontend/app/shared/components/search/queries/query-path.component.html @@ -5,7 +5,7 @@
{{model.fields[field].displayName}}
- {{model.fields[field].description | sqxTranslate}} + {{model.fields[field].description | sqxTranslate: model.fields[field]}}
diff --git a/frontend/app/shared/components/search/queries/query.component.html b/frontend/app/shared/components/search/queries/query.component.html index 578ccfdca..06727e06d 100644 --- a/frontend/app/shared/components/search/queries/query.component.html +++ b/frontend/app/shared/components/search/queries/query.component.html @@ -1,10 +1,12 @@ - +

{{ 'search.sorting' | sqxTranslate }}

- +
diff --git a/frontend/app/shared/components/table-header.component.html b/frontend/app/shared/components/table-header.component.html index a2ce0143e..175ccbfd0 100644 --- a/frontend/app/shared/components/table-header.component.html +++ b/frontend/app/shared/components/table-header.component.html @@ -8,5 +8,5 @@ - {{text}} + {{text | sqxTranslate}} \ No newline at end of file diff --git a/frontend/app/shared/state/assets.state.ts b/frontend/app/shared/state/assets.state.ts index 5c02ae880..f52f93156 100644 --- a/frontend/app/shared/state/assets.state.ts +++ b/frontend/app/shared/state/assets.state.ts @@ -21,7 +21,7 @@ export type Tag = { name: string, count: number; }; const EMPTY_FOLDERS: { canCreate: boolean, items: ReadonlyArray, path?: ReadonlyArray } = { canCreate: false, items: [] }; -const ROOT_ITEM: AssetPathItem = { id: MathHelper.EMPTY_GUID, folderName: 'Assets' }; +const ROOT_ITEM: AssetPathItem = { id: MathHelper.EMPTY_GUID, folderName: 'i18n:assets.specialFolder.root' }; interface Snapshot { // All assets tags. @@ -457,7 +457,7 @@ function hasQuery(state: Snapshot) { } function getParent(path: ReadonlyArray) { - return path.length > 1 ? { folderName: '', id: path[path.length - 2].id } : undefined; + return path.length > 1 ? { folderName: 'i18n:assets.specialFolder.parent', id: path[path.length - 2].id } : undefined; } @Injectable() diff --git a/frontend/app/shared/state/query.ts b/frontend/app/shared/state/query.ts index caa6fa3a7..e63b4cd1d 100644 --- a/frontend/app/shared/state/query.ts +++ b/frontend/app/shared/state/query.ts @@ -25,7 +25,7 @@ export type QueryValueType = export interface FilterOperator { // The optional display value. - name?: string; + name: string; // The operator value. value: string; @@ -201,25 +201,25 @@ export function hasFilter(query?: Query) { } const EqualOperators: ReadonlyArray = [ - { name: 'is equals to', value: 'eq' }, - { name: 'is not equals to', value: 'ne' } + { name: 'i18n:common.queryOperators.eq', value: 'eq' }, + { name: 'i18n:common.queryOperators.ne', value: 'ne' } ]; const CompareOperator: ReadonlyArray = [ - { name: 'is less than', value: 'lt' }, - { name: 'is less than or equals to', value: 'le' }, - { name: 'is greater than', value: 'gt' }, - { name: 'is greater than or equals to', value: 'ge' } + { name: 'i18n:common.queryOperators.lt', value: 'lt' }, + { name: 'i18n:common.queryOperators.le', value: 'le' }, + { name: 'i18n:common.queryOperators.gt', value: 'gt' }, + { name: 'i18n:common.queryOperators.ge', value: 'ge' } ]; const StringOperators: ReadonlyArray = [ - { name: 'starts with', value: 'startsWith' }, - { name: 'ends with', value: 'endsWith' }, - { name: 'contains', value: 'contains' } + { name: 'i18n:common.queryOperators.startsWith', value: 'startsWith' }, + { name: 'i18n:common.queryOperators.endsWith', value: 'endsWith' }, + { name: 'i18n:common.queryOperators.contains', value: 'contains' } ]; const ArrayOperators: ReadonlyArray = [ - { value: 'is empty', noValue: true } + { name: 'i18n:common.queryOperators.empty', value: 'is empty', noValue: true } ]; const TypeBoolean: QueryFieldModel = { @@ -332,7 +332,8 @@ export function queryModelFromSchema(schema: SchemaDetailsDto, languages: Readon for (const code of languagesCodes) { const infos = { displayName: `${field.name} (${code})`, - description: `The '${field.displayName}' field of the content item (localized).` + description: 'i18n:contents.localizedFieldDescription', + fieldName: field.displayName }; model.fields[`data.${field.name}.${code}`] = { ...type, ...infos }; @@ -340,7 +341,8 @@ export function queryModelFromSchema(schema: SchemaDetailsDto, languages: Readon } else { const infos = { displayName: field.name, - description: `The '${field.displayName}' field of the content item.` + description: 'i18n:contents.invariantFieldDescription', + fieldName: field.displayName }; model.fields[`data.${field.name}.iv`] = { ...type, ...infos };