Browse Source

Feature/it (#573)

* First italian translation.

Co-authored-by: fpisu-sardit <70273645+fpisu-sardit@users.noreply.github.com>
Co-authored-by: MartijnDijkgraaf <martijndijkgraaf96@gmail.com>
pull/575/head
Sebastian Stehle 5 years ago
committed by GitHub
parent
commit
fd93ddc6ff
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs
  2. 4
      backend/extensions/Squidex.Extensions/Actions/AzureQueue/AzureQueueAction.cs
  3. 3
      backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs
  4. 8
      backend/extensions/Squidex.Extensions/Actions/Discourse/DiscourseAction.cs
  5. 4
      backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs
  6. 19
      backend/extensions/Squidex.Extensions/Actions/Email/EmailAction.cs
  7. 5
      backend/extensions/Squidex.Extensions/Actions/Fastly/FastlyAction.cs
  8. 3
      backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaAction.cs
  9. 7
      backend/extensions/Squidex.Extensions/Actions/Medium/MediumAction.cs
  10. 5
      backend/extensions/Squidex.Extensions/Actions/Notification/NotificationAction.cs
  11. 5
      backend/extensions/Squidex.Extensions/Actions/Prerender/PrerenderAction.cs
  12. 4
      backend/extensions/Squidex.Extensions/Actions/Slack/SlackAction.cs
  13. 7
      backend/extensions/Squidex.Extensions/Actions/Twitter/TweetAction.cs
  14. 3
      backend/extensions/Squidex.Extensions/Actions/Webhook/WebhookAction.cs
  15. 9
      backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj
  16. 24
      backend/i18n/frontend_en.json
  17. 888
      backend/i18n/frontend_it.json
  18. 30
      backend/i18n/frontend_nl.json
  19. 4
      backend/i18n/source/backend__ignore.json
  20. 23
      backend/i18n/source/backend_en.json
  21. 320
      backend/i18n/source/backend_it.json
  22. 18
      backend/i18n/source/backend_nl.json
  23. 4
      backend/i18n/source/frontend__ignore.json
  24. 24
      backend/i18n/source/frontend_en.json
  25. 848
      backend/i18n/source/frontend_it.json
  26. 8
      backend/i18n/source/frontend_nl.json
  27. 2
      backend/i18n/translator/Squidex.Translator/Commands.cs
  28. 10
      backend/i18n/translator/Squidex.Translator/Processes/CheckBackend.cs
  29. 42
      backend/i18n/translator/Squidex.Translator/Processes/CheckFrontend.cs
  30. 12
      backend/i18n/translator/Squidex.Translator/Processes/GenerateBackendResources.cs
  31. 7
      backend/i18n/translator/Squidex.Translator/Processes/Helper.cs
  32. 20
      backend/src/Squidex.Domain.Users/UserManagerExtensions.cs
  33. 5
      backend/src/Squidex.Infrastructure/Validation/LocalizedCompareAttribute.cs
  34. 30
      backend/src/Squidex.Infrastructure/Validation/LocalizedEmailAddressAttribute.cs
  35. 38
      backend/src/Squidex.Infrastructure/Validation/LocalizedRangeAttribute.cs
  36. 30
      backend/src/Squidex.Infrastructure/Validation/LocalizedRegularExpressionAttribute.cs
  37. 7
      backend/src/Squidex.Infrastructure/Validation/LocalizedRequiredAttribute.cs
  38. 38
      backend/src/Squidex.Infrastructure/Validation/LocalizedStringLengthAttribute.cs
  39. 1138
      backend/src/Squidex.Shared/Texts.it.resx
  40. 93
      backend/src/Squidex.Shared/Texts.nl.resx
  41. 93
      backend/src/Squidex.Shared/Texts.resx
  42. 2
      backend/src/Squidex.Web/ApiModelValidationAttribute.cs
  43. 3
      backend/src/Squidex.Web/EntityCreatedDto.cs
  44. 3
      backend/src/Squidex.Web/ErrorDto.cs
  45. 5
      backend/src/Squidex.Web/Resource.cs
  46. 5
      backend/src/Squidex.Web/ResourceLink.cs
  47. 9
      backend/src/Squidex.Web/Services/StringLocalizer.cs
  48. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddLanguageDto.cs
  49. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddRoleDto.cs
  50. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddWorkflowDto.cs
  51. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppDto.cs
  52. 8
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs
  53. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs
  54. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AssignContributorDto.cs
  55. 8
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientDto.cs
  56. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientsDto.cs
  57. 8
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorDto.cs
  58. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorsDto.cs
  59. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateAppDto.cs
  60. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateClientDto.cs
  61. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternDto.cs
  62. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternsDto.cs
  63. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RoleDto.cs
  64. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RolesDto.cs
  65. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateClientDto.cs
  66. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdatePatternDto.cs
  67. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateRoleDto.cs
  68. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateWorkflowDto.cs
  69. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowDto.cs
  70. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowStepDto.cs
  71. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowsDto.cs
  72. 20
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetDto.cs
  73. 4
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFolderDto.cs
  74. 6
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFoldersDto.cs
  75. 4
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetsDto.cs
  76. 4
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/CreateAssetFolderDto.cs
  77. 4
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/RenameAssetFolderDto.cs
  78. 4
      backend/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobsDto.cs
  79. 6
      backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreJobDto.cs
  80. 6
      backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreRequestDto.cs
  81. 8
      backend/src/Squidex/Areas/Api/Controllers/Comments/Models/CommentDto.cs
  82. 4
      backend/src/Squidex/Areas/Api/Controllers/Comments/Models/UpsertCommentDto.cs
  83. 4
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/BulkUpdateDto.cs
  84. 4
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ChangeStatusDto.cs
  85. 8
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs
  86. 6
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsDto.cs
  87. 4
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsIdsQueryDto.cs
  88. 4
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ImportContentsDto.cs
  89. 4
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ScheduleJobDto.cs
  90. 6
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/StatusInfoDto.cs
  91. 8
      backend/src/Squidex/Areas/Api/Controllers/History/Models/HistoryEventDto.cs
  92. 6
      backend/src/Squidex/Areas/Api/Controllers/LanguageDto.cs
  93. 6
      backend/src/Squidex/Areas/Api/Controllers/News/Models/FeatureDto.cs
  94. 4
      backend/src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs
  95. 4
      backend/src/Squidex/Areas/Api/Controllers/Plans/Models/AppPlansDto.cs
  96. 4
      backend/src/Squidex/Areas/Api/Controllers/Plans/Models/ChangePlanDto.cs
  97. 8
      backend/src/Squidex/Areas/Api/Controllers/Plans/Models/PlanDto.cs
  98. 6
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/CreateRuleDto.cs
  99. 10
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleDto.cs
  100. 8
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementDto.cs

7
backend/extensions/Squidex.Extensions/Actions/Algolia/AlgoliaAction.cs

@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Algolia namespace Squidex.Extensions.Actions.Algolia
{ {
@ -20,19 +21,19 @@ namespace Squidex.Extensions.Actions.Algolia
ReadMore = "https://www.algolia.com/")] ReadMore = "https://www.algolia.com/")]
public sealed class AlgoliaAction : RuleAction public sealed class AlgoliaAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "Application Id", Description = "The application ID.")] [Display(Name = "Application Id", Description = "The application ID.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]
public string AppId { get; set; } public string AppId { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Api Key", Description = "The API key to grant access to Squidex.")] [Display(Name = "Api Key", Description = "The API key to grant access to Squidex.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]
public string ApiKey { get; set; } public string ApiKey { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Index Name", Description = "The name of the index.")] [Display(Name = "Index Name", Description = "The name of the index.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]

4
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/")] ReadMore = "https://azure.microsoft.com/en-us/services/storage/queues/")]
public sealed class AzureQueueAction : RuleAction public sealed class AzureQueueAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "Connection", Description = "The connection string to the storage account.")] [Display(Name = "Connection", Description = "The connection string to the storage account.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]
public string ConnectionString { get; set; } public string ConnectionString { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Queue", Description = "The name of the queue.")] [Display(Name = "Queue", Description = "The name of the queue.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]

3
backend/extensions/Squidex.Extensions/Actions/Comment/CommentAction.cs

@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Comment namespace Squidex.Extensions.Actions.Comment
{ {
@ -19,7 +20,7 @@ namespace Squidex.Extensions.Actions.Comment
Description = "Create a comment for a content event.")] Description = "Create a comment for a content event.")]
public sealed class CommentAction : RuleAction public sealed class CommentAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "Text", Description = "The comment text.")] [Display(Name = "Text", Description = "The comment text.")]
[DataType(DataType.MultilineText)] [DataType(DataType.MultilineText)]
[Formattable] [Formattable]

8
backend/extensions/Squidex.Extensions/Actions/Discourse/DiscourseAction.cs

@ -23,22 +23,22 @@ namespace Squidex.Extensions.Actions.Discourse
public sealed class DiscourseAction : RuleAction public sealed class DiscourseAction : RuleAction
{ {
[AbsoluteUrl] [AbsoluteUrl]
[Required] [LocalizedRequired]
[Display(Name = "Server Url", Description = "The url to the discourse server.")] [Display(Name = "Server Url", Description = "The url to the discourse server.")]
[DataType(DataType.Url)] [DataType(DataType.Url)]
public Uri Url { get; set; } public Uri Url { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Api Key", Description = "The api key to authenticate to your discourse server.")] [Display(Name = "Api Key", Description = "The api key to authenticate to your discourse server.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string ApiKey { get; set; } public string ApiKey { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Api User", Description = "The api username to authenticate to your discourse server.")] [Display(Name = "Api User", Description = "The api username to authenticate to your discourse server.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string ApiUsername { get; set; } public string ApiUsername { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Text", Description = "The text as markdown.")] [Display(Name = "Text", Description = "The text as markdown.")]
[DataType(DataType.MultilineText)] [DataType(DataType.MultilineText)]
[Formattable] [Formattable]

4
backend/extensions/Squidex.Extensions/Actions/ElasticSearch/ElasticSearchAction.cs

@ -23,12 +23,12 @@ namespace Squidex.Extensions.Actions.ElasticSearch
public sealed class ElasticSearchAction : RuleAction public sealed class ElasticSearchAction : RuleAction
{ {
[AbsoluteUrl] [AbsoluteUrl]
[Required] [LocalizedRequired]
[Display(Name = "Server Url", Description = "The url to the elastic search instance or cluster.")] [Display(Name = "Server Url", Description = "The url to the elastic search instance or cluster.")]
[DataType(DataType.Url)] [DataType(DataType.Url)]
public Uri Host { get; set; } public Uri Host { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Index Name", Description = "The name of the index.")] [Display(Name = "Index Name", Description = "The name of the index.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]

19
backend/extensions/Squidex.Extensions/Actions/Email/EmailAction.cs

@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Email namespace Squidex.Extensions.Actions.Email
{ {
@ -20,51 +21,51 @@ namespace Squidex.Extensions.Actions.Email
ReadMore = "https://en.wikipedia.org/wiki/Email")] ReadMore = "https://en.wikipedia.org/wiki/Email")]
public sealed class EmailAction : RuleAction public sealed class EmailAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "Server Host", Description = "The IP address or host to the SMTP server.")] [Display(Name = "Server Host", Description = "The IP address or host to the SMTP server.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string ServerHost { get; set; } public string ServerHost { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Server Port", Description = "The port to the SMTP server.")] [Display(Name = "Server Port", Description = "The port to the SMTP server.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public int ServerPort { get; set; } 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.")] [Display(Name = "Use SSL", Description = "Specify whether the SMPT client uses Secure Sockets Layer (SSL) to encrypt the connection.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public bool ServerUseSsl { get; set; } public bool ServerUseSsl { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Username", Description = "The username for the SMTP server.")] [Display(Name = "Username", Description = "The username for the SMTP server.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]
public string ServerUsername { get; set; } public string ServerUsername { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Password", Description = "The password for the SMTP server.")] [Display(Name = "Password", Description = "The password for the SMTP server.")]
[DataType(DataType.Password)] [DataType(DataType.Password)]
public string ServerPassword { get; set; } public string ServerPassword { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "From Address", Description = "The email sending address.")] [Display(Name = "From Address", Description = "The email sending address.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]
public string MessageFrom { get; set; } public string MessageFrom { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "To Address", Description = "The email message will be sent to.")] [Display(Name = "To Address", Description = "The email message will be sent to.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]
public string MessageTo { get; set; } public string MessageTo { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Subject", Description = "The subject line for this email message.")] [Display(Name = "Subject", Description = "The subject line for this email message.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]
public string MessageSubject { get; set; } public string MessageSubject { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Body", Description = "The message body.")] [Display(Name = "Body", Description = "The message body.")]
[DataType(DataType.MultilineText)] [DataType(DataType.MultilineText)]
[Formattable] [Formattable]

5
backend/extensions/Squidex.Extensions/Actions/Fastly/FastlyAction.cs

@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Fastly namespace Squidex.Extensions.Actions.Fastly
{ {
@ -20,12 +21,12 @@ namespace Squidex.Extensions.Actions.Fastly
ReadMore = "https://www.fastly.com/")] ReadMore = "https://www.fastly.com/")]
public sealed class FastlyAction : RuleAction public sealed class FastlyAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "Api Key", Description = "The API key to grant access to Squidex.")] [Display(Name = "Api Key", Description = "The API key to grant access to Squidex.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string ApiKey { get; set; } public string ApiKey { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Service Id", Description = "The ID of the fastly service.")] [Display(Name = "Service Id", Description = "The ID of the fastly service.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string ServiceId { get; set; } public string ServiceId { get; set; }

3
backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaAction.cs

@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Kafka namespace Squidex.Extensions.Actions.Kafka
{ {
@ -20,7 +21,7 @@ namespace Squidex.Extensions.Actions.Kafka
ReadMore = "https://kafka.apache.org/quickstart")] ReadMore = "https://kafka.apache.org/quickstart")]
public sealed class KafkaAction : RuleAction public sealed class KafkaAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "Topic Name", Description = "The name of the topic.")] [Display(Name = "Topic Name", Description = "The name of the topic.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]

7
backend/extensions/Squidex.Extensions/Actions/Medium/MediumAction.cs

@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Medium namespace Squidex.Extensions.Actions.Medium
{ {
@ -20,18 +21,18 @@ namespace Squidex.Extensions.Actions.Medium
ReadMore = "https://medium.com/")] ReadMore = "https://medium.com/")]
public sealed class MediumAction : RuleAction public sealed class MediumAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "Access Token", Description = "The self issued access token.")] [Display(Name = "Access Token", Description = "The self issued access token.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string AccessToken { get; set; } public string AccessToken { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Title", Description = "The title, used for the url.")] [Display(Name = "Title", Description = "The title, used for the url.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]
public string Title { get; set; } public string Title { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Content", Description = "The content, either html or markdown.")] [Display(Name = "Content", Description = "The content, either html or markdown.")]
[DataType(DataType.MultilineText)] [DataType(DataType.MultilineText)]
[Formattable] [Formattable]

5
backend/extensions/Squidex.Extensions/Actions/Notification/NotificationAction.cs

@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Notification namespace Squidex.Extensions.Actions.Notification
{ {
@ -19,12 +20,12 @@ namespace Squidex.Extensions.Actions.Notification
Description = "Send an integrated notification to a user.")] Description = "Send an integrated notification to a user.")]
public sealed class NotificationAction : RuleAction public sealed class NotificationAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "User", Description = "The user id or email.")] [Display(Name = "User", Description = "The user id or email.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string User { get; set; } public string User { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Title", Description = "The text to send.")] [Display(Name = "Title", Description = "The text to send.")]
[DataType(DataType.MultilineText)] [DataType(DataType.MultilineText)]
[Formattable] [Formattable]

5
backend/extensions/Squidex.Extensions/Actions/Prerender/PrerenderAction.cs

@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Prerender namespace Squidex.Extensions.Actions.Prerender
{ {
@ -20,13 +21,13 @@ namespace Squidex.Extensions.Actions.Prerender
ReadMore = "https://prerender.io")] ReadMore = "https://prerender.io")]
public sealed class PrerenderAction : RuleAction public sealed class PrerenderAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "Token", Description = "The prerender token from your account.")] [Display(Name = "Token", Description = "The prerender token from your account.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]
public string Token { get; set; } public string Token { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Url", Description = "The url to recache.")] [Display(Name = "Url", Description = "The url to recache.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string Url { get; set; } public string Url { get; set; }

4
backend/extensions/Squidex.Extensions/Actions/Slack/SlackAction.cs

@ -23,12 +23,12 @@ namespace Squidex.Extensions.Actions.Slack
public sealed class SlackAction : RuleAction public sealed class SlackAction : RuleAction
{ {
[AbsoluteUrl] [AbsoluteUrl]
[Required] [LocalizedRequired]
[Display(Name = "Webhook Url", Description = "The slack webhook url.")] [Display(Name = "Webhook Url", Description = "The slack webhook url.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public Uri WebhookUrl { get; set; } public Uri WebhookUrl { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Text", Description = "The text that is sent as message to slack.")] [Display(Name = "Text", Description = "The text that is sent as message to slack.")]
[DataType(DataType.MultilineText)] [DataType(DataType.MultilineText)]
[Formattable] [Formattable]

7
backend/extensions/Squidex.Extensions/Actions/Twitter/TweetAction.cs

@ -8,6 +8,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Twitter namespace Squidex.Extensions.Actions.Twitter
{ {
@ -20,17 +21,17 @@ namespace Squidex.Extensions.Actions.Twitter
ReadMore = "https://twitter.com")] ReadMore = "https://twitter.com")]
public sealed class TweetAction : RuleAction public sealed class TweetAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "Access Token", Description = " The generated access token.")] [Display(Name = "Access Token", Description = " The generated access token.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string AccessToken { get; set; } public string AccessToken { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Access Secret", Description = " The generated access secret.")] [Display(Name = "Access Secret", Description = " The generated access secret.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
public string AccessSecret { get; set; } public string AccessSecret { get; set; }
[Required] [LocalizedRequired]
[Display(Name = "Text", Description = "The text that is sent as tweet to twitter.")] [Display(Name = "Text", Description = "The text that is sent as tweet to twitter.")]
[DataType(DataType.MultilineText)] [DataType(DataType.MultilineText)]
[Formattable] [Formattable]

3
backend/extensions/Squidex.Extensions/Actions/Webhook/WebhookAction.cs

@ -9,6 +9,7 @@ using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure.Validation;
namespace Squidex.Extensions.Actions.Webhook namespace Squidex.Extensions.Actions.Webhook
{ {
@ -21,7 +22,7 @@ namespace Squidex.Extensions.Actions.Webhook
ReadMore = "https://en.wikipedia.org/wiki/Webhook")] ReadMore = "https://en.wikipedia.org/wiki/Webhook")]
public sealed class WebhookAction : RuleAction public sealed class WebhookAction : RuleAction
{ {
[Required] [LocalizedRequired]
[Display(Name = "Url", Description = "The url to the webhook.")] [Display(Name = "Url", Description = "The url to the webhook.")]
[DataType(DataType.Text)] [DataType(DataType.Text)]
[Formattable] [Formattable]

9
backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj

@ -8,14 +8,15 @@
<ProjectReference Include="..\..\src\Squidex.Web\Squidex.Web.csproj" /> <ProjectReference Include="..\..\src\Squidex.Web\Squidex.Web.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Algolia.Search" Version="6.8.0" /> <PackageReference Include="Algolia.Search" Version="6.6.0" />
<PackageReference Include="Confluent.Apache.Avro" Version="1.7.7.7" /> <PackageReference Include="Confluent.Apache.Avro" Version="1.7.7.7" />
<PackageReference Include="Confluent.Kafka" Version="1.5.1" /> <PackageReference Include="Confluent.Kafka" Version="1.4.3" />
<PackageReference Include="Confluent.SchemaRegistry.Serdes" Version="1.3.0" /> <PackageReference Include="Confluent.SchemaRegistry.Serdes" Version="1.3.0" />
<PackageReference Include="CoreTweet" Version="1.0.0.483" /> <PackageReference Include="CoreTweet" Version="1.0.0.483" />
<PackageReference Include="Datadog.Trace" Version="1.19.1" /> <PackageReference Include="Datadog.Trace" Version="1.17.0" />
<PackageReference Include="Elasticsearch.Net" Version="7.9.0" /> <PackageReference Include="Elasticsearch.Net" Version="7.7.1" />
<PackageReference Include="Microsoft.Extensions.Http" Version="3.1.4" /> <PackageReference Include="Microsoft.Extensions.Http" Version="3.1.4" />
<PackageReference Include="Microsoft.OData.Core" Version="7.6.4" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="NodaTime" Version="3.0.0" /> <PackageReference Include="NodaTime" Version="3.0.0" />
<PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" /> <PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" />

24
backend/i18n/frontend_en.json

@ -90,6 +90,8 @@
"assets.searchByName": "Search by name", "assets.searchByName": "Search by name",
"assets.searchByTags": "Search by tags", "assets.searchByTags": "Search by tags",
"assets.selectMany": "Select assets", "assets.selectMany": "Select assets",
"assets.specialFolder.parent": "<Parent>",
"assets.specialFolder.root": "Assets",
"assets.tabFocusPoint": "Focus Point", "assets.tabFocusPoint": "Focus Point",
"assets.tabHistory": "History", "assets.tabHistory": "History",
"assets.tabImage": "Image", "assets.tabImage": "Image",
@ -273,6 +275,16 @@
"common.preview": "Preview", "common.preview": "Preview",
"common.product": "Squidex Headless CMS", "common.product": "Squidex Headless CMS",
"common.project": "Project", "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.refresh": "Refresh",
"common.rename": "Rename", "common.rename": "Rename",
"common.requiredHint": "required", "common.requiredHint": "required",
@ -347,6 +359,7 @@
"contents.draftStatus": "New Version", "contents.draftStatus": "New Version",
"contents.editPageTitle": "Edit Content", "contents.editPageTitle": "Edit Content",
"contents.editTitle": "Edit Content", "contents.editTitle": "Edit Content",
"contents.invariantFieldDescription": "The '{fieldName}' field of the content item.",
"contents.languageModeAll": "All Languages", "contents.languageModeAll": "All Languages",
"contents.languageModeSingle": "Single Language", "contents.languageModeSingle": "Single Language",
"contents.lastModifiedByFieldDescription": "The user who modified the content item the last time.", "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.loadDataFailed": "Failed to load data. Please reload.",
"contents.loadFailed": "Failed to load contents. Please reload.", "contents.loadFailed": "Failed to load contents. Please reload.",
"contents.loadVersionFailed": "Failed to version a new version. 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.newStatusFieldDescription": "The new status of the content item.",
"contents.noReference": "- No Reference -", "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?**", "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.statusQueries": "Status Queries",
"contents.stockPhotoEmpty": "Nothing selected", "contents.stockPhotoEmpty": "Nothing selected",
"contents.stockPhotoSearch": "Search for Photos by Unsplash", "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.unsavedChangesText": "You have unsaved changes. Do you want to load them now?",
"contents.unsavedChangesTitle": "Unsaved changes", "contents.unsavedChangesTitle": "Unsaved changes",
"contents.updated": "Content updated successfully.", "contents.updated": "Content updated successfully.",

888
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": "<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 `<la directory per scaricare la tua Squidex CLI>` 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 <i class=\"icon-star-empty\"></i> 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"
}

30
backend/i18n/frontend_nl.json

@ -70,16 +70,16 @@
"assets.fileTooBig": "Asset is te groot.", "assets.fileTooBig": "Asset is te groot.",
"assets.folderName": "Mapnaam", "assets.folderName": "Mapnaam",
"assets.folderNameHint": "De mapnaam wordt gebruikt als weergavenaam en mag niet uniek zijn.", "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.linkSelected": "Link geselecteerde items ({count})",
"assets.listPageTitle": "Assets", "assets.listPageTitle": "Bestanden",
"assets.loadFailed": "Laden van bestanden is mislukt. Laad opnieuw.", "assets.loadFailed": "Laden van bestanden is mislukt. Laad opnieuw.",
"assets.loadFoldersFailed": "Laden van mappen is mislukt. Laad opnieuw.", "assets.loadFoldersFailed": "Laden van mappen is mislukt. Laad opnieuw.",
"assets.metadata": "Metadata", "assets.metadata": "Metadata",
"assets.metadataAdd": "Metadata toevoegen", "assets.metadataAdd": "Metadata toevoegen",
"assets.moveFailed": "Verplaatsen van item is mislukt. Laad opnieuw.", "assets.moveFailed": "Verplaatsen van item is mislukt. Laad opnieuw.",
"assets.protected": "Beschermd", "assets.protected": "Beschermd",
"assets.refreshTooltip": "Assets vernieuwen (CTRL + SHIFT + R)", "assets.refreshTooltip": "Bestanden vernieuwen (CTRL + SHIFT + R)",
"assets.reloaded": "Bestanden herladen.", "assets.reloaded": "Bestanden herladen.",
"assets.removeConfirmText": "Wil je het bestand echt verwijderen?", "assets.removeConfirmText": "Wil je het bestand echt verwijderen?",
"assets.removeConfirmTitle": "Verwijder bestand", "assets.removeConfirmTitle": "Verwijder bestand",
@ -90,6 +90,8 @@
"assets.searchByName": "Zoeken op naam", "assets.searchByName": "Zoeken op naam",
"assets.searchByTags": "Zoeken op tags", "assets.searchByTags": "Zoeken op tags",
"assets.selectMany": "Selecteer middelen", "assets.selectMany": "Selecteer middelen",
"assets.specialFolder.parent": "<Hoofdmap>",
"assets.specialFolder.root": "Bestanden",
"assets.tabFocusPoint": "Focuspunt", "assets.tabFocusPoint": "Focuspunt",
"assets.tabHistory": "Geschiedenis", "assets.tabHistory": "Geschiedenis",
"assets.tabImage": "Afbeelding", "assets.tabImage": "Afbeelding",
@ -273,6 +275,16 @@
"common.preview": "Preview", "common.preview": "Preview",
"common.product": "Squidex Headless CMS", "common.product": "Squidex Headless CMS",
"common.project": "Project", "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.refresh": "Vernieuwen",
"common.rename": "Hernoemen", "common.rename": "Hernoemen",
"common.requiredHint": "verplicht", "common.requiredHint": "verplicht",
@ -347,6 +359,7 @@
"contents.draftStatus": "Nieuwe versie", "contents.draftStatus": "Nieuwe versie",
"contents.editPageTitle": "Inhoud bewerken", "contents.editPageTitle": "Inhoud bewerken",
"contents.editTitle": "Inhoud bewerken", "contents.editTitle": "Inhoud bewerken",
"contents.invariantFieldDescription": "The '{fieldName}' field of the content item.",
"contents.languageModeAll": "Alle talen", "contents.languageModeAll": "Alle talen",
"contents.languageModeSingle": "Enkele taal", "contents.languageModeSingle": "Enkele taal",
"contents.lastModifiedByFieldDescription": "De gebruiker die het inhoudsitem de laatste keer heeft gewijzigd.", "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.loadDataFailed": "Laden van gegevens is mislukt. Laad opnieuw.",
"contents.loadFailed": "Laden van inhoud 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.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.newStatusFieldDescription": "De nieuwe status van het item.",
"contents.noReference": "- Geen referentie -", "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?**", "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.statusQueries": "Statusquery's",
"contents.stockPhotoEmpty": "Niets geselecteerd", "contents.stockPhotoEmpty": "Niets geselecteerd",
"contents.stockPhotoSearch": "Zoeken naar foto's op Unsplash", "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.unsavedChangesText": "Je hebt niet-opgeslagen wijzigingen. Wil je ze nu laden?",
"contents.unsavedChangesTitle": "Niet-opgeslagen wijzigingen", "contents.unsavedChangesTitle": "Niet-opgeslagen wijzigingen",
"contents.updated": "Inhoud succesvol bijgewerkt.", "contents.updated": "Inhoud succesvol bijgewerkt.",

4
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/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": [ "/Squidex.Domain.Apps.Entities/Notifications/NotificationEmailSender.cs": [

23
backend/i18n/source/backend_en.json

@ -1,7 +1,12 @@
{ {
"annotations_AbsoluteUrl": "The field {name|lower} must be an absolute URL.", "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_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_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.alreadyArchieved": "App has already been archived.",
"apps.clients.idAlreadyExists": "A client with the same id already exists.", "apps.clients.idAlreadyExists": "A client with the same id already exists.",
"apps.contributors.cannotChangeYourself": "You cannot change your own role.", "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.nameAlreadyExists": "A role with the same name already exists.",
"apps.roles.usedRoleByClientsNotRemovable": "Cannot remove a role when a client is assigned.", "apps.roles.usedRoleByClientsNotRemovable": "Cannot remove a role when a client is assigned.",
"apps.roles.usedRoleByContributorsNotRemovable": "Cannot remove a role when a contributor 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.assetAlreadyDeleted": "Asset has already been deleted",
"assets.assetFolderAlreadyDeleted": "Asset folder has already been deleted", "assets.assetFolderAlreadyDeleted": "Asset folder has already been deleted",
"assets.folderNotFound": "Asset folder does not exist.", "assets.folderNotFound": "Asset folder does not exist.",
@ -180,6 +182,21 @@
"contents.validation.wordsBetween": "Must have between {min} and {max} word(s).", "contents.validation.wordsBetween": "Must have between {min} and {max} word(s).",
"contents.workflowErorPublishing": "Content workflow prevents publishing.", "contents.workflowErorPublishing": "Content workflow prevents publishing.",
"contents.workflowErrorUpdate": "The workflow does not allow updates at status {status}", "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.invalidJsonQuery": "Json query not valid: {message}",
"exception.invalidJsonQueryJson": "Json query not valid json: {message}", "exception.invalidJsonQueryJson": "Json query not valid json: {message}",
"exceptions.domainObjectDeleted": "Entity ({id}) has been deleted.", "exceptions.domainObjectDeleted": "Entity ({id}) has been deleted.",

320
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": "<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>",
"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. <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>",
"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 <strong>{provider}</strong>",
"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."
}

18
backend/i18n/source/backend_nl.json

@ -23,9 +23,6 @@
"apps.roles.nameAlreadyExists": "Er bestaat al een rol met dezelfde naam.", "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.usedRoleByClientsNotRemovable": "Kan een rol niet verwijderen wanneer een client is toegewezen.",
"apps.roles.usedRoleByContributorsNotRemovable": "Kan een rol niet verwijderen wanneer een bijdrager 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.assetAlreadyDeleted": "Asset is al verwijderd",
"assets.assetFolderAlreadyDeleted": "Assetmap is al verwijderd", "assets.assetFolderAlreadyDeleted": "Assetmap is al verwijderd",
"assets.folderNotFound": "Assetmap bestaat niet.", "assets.folderNotFound": "Assetmap bestaat niet.",
@ -180,6 +177,21 @@
"contents.validation.wordsBetween": "Moet tussen {min} en {max} woord (en) bevatten.", "contents.validation.wordsBetween": "Moet tussen {min} en {max} woord (en) bevatten.",
"contents.workflowErorPublishing": "Contentworkflow verhindert publiceren.", "contents.workflowErorPublishing": "Contentworkflow verhindert publiceren.",
"contents.workflowErrorUpdate": "De werkstroom staat geen updates toe met status {status}", "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.invalidJsonQuery": "Json-query niet geldig: {message}",
"exception.invalidJsonQueryJson": "Json-query is niet geldig json: {message}", "exception.invalidJsonQueryJson": "Json-query is niet geldig json: {message}",
"exceptions.domainObjectDeleted": "Entiteit ({id}) is verwijderd.", "exceptions.domainObjectDeleted": "Entiteit ({id}) is verwijderd.",

4
backend/i18n/source/frontend__ignore.json

@ -19,8 +19,8 @@
"#{{index + 1}}" "#{{index + 1}}"
], ],
"/features/content/shared/forms/field-editor.component.html": [ "/features/content/shared/forms/field-editor.component.html": [
"{{field.displayName}} {{displaySuffix}}", "*",
"*" "{{field.displayName}} {{displaySuffix}}"
], ],
"/features/content/shared/references/references-editor.component.html": [ "/features/content/shared/references/references-editor.component.html": [
"&middot;" "&middot;"

24
backend/i18n/source/frontend_en.json

@ -90,6 +90,8 @@
"assets.searchByName": "Search by name", "assets.searchByName": "Search by name",
"assets.searchByTags": "Search by tags", "assets.searchByTags": "Search by tags",
"assets.selectMany": "Select assets", "assets.selectMany": "Select assets",
"assets.specialFolder.parent": "<Parent>",
"assets.specialFolder.root": "Assets",
"assets.tabFocusPoint": "Focus Point", "assets.tabFocusPoint": "Focus Point",
"assets.tabHistory": "History", "assets.tabHistory": "History",
"assets.tabImage": "Image", "assets.tabImage": "Image",
@ -273,6 +275,16 @@
"common.preview": "Preview", "common.preview": "Preview",
"common.product": "Squidex Headless CMS", "common.product": "Squidex Headless CMS",
"common.project": "Project", "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.refresh": "Refresh",
"common.rename": "Rename", "common.rename": "Rename",
"common.requiredHint": "required", "common.requiredHint": "required",
@ -347,6 +359,7 @@
"contents.draftStatus": "New Version", "contents.draftStatus": "New Version",
"contents.editPageTitle": "Edit Content", "contents.editPageTitle": "Edit Content",
"contents.editTitle": "Edit Content", "contents.editTitle": "Edit Content",
"contents.invariantFieldDescription": "The '{fieldName}' field of the content item.",
"contents.languageModeAll": "All Languages", "contents.languageModeAll": "All Languages",
"contents.languageModeSingle": "Single Language", "contents.languageModeSingle": "Single Language",
"contents.lastModifiedByFieldDescription": "The user who modified the content item the last time.", "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.loadDataFailed": "Failed to load data. Please reload.",
"contents.loadFailed": "Failed to load contents. Please reload.", "contents.loadFailed": "Failed to load contents. Please reload.",
"contents.loadVersionFailed": "Failed to version a new version. 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.newStatusFieldDescription": "The new status of the content item.",
"contents.noReference": "- No Reference -", "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?**", "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.statusQueries": "Status Queries",
"contents.stockPhotoEmpty": "Nothing selected", "contents.stockPhotoEmpty": "Nothing selected",
"contents.stockPhotoSearch": "Search for Photos by Unsplash", "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.unsavedChangesText": "You have unsaved changes. Do you want to load them now?",
"contents.unsavedChangesTitle": "Unsaved changes", "contents.unsavedChangesTitle": "Unsaved changes",
"contents.updated": "Content updated successfully.", "contents.updated": "Content updated successfully.",

848
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 `<la directory per scaricare la tua Squidex CLI>` 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 <i class=\"icon-star-empty\"></i> 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"
}

8
backend/i18n/source/frontend_nl.json

@ -70,16 +70,16 @@
"assets.fileTooBig": "Asset is te groot.", "assets.fileTooBig": "Asset is te groot.",
"assets.folderName": "Mapnaam", "assets.folderName": "Mapnaam",
"assets.folderNameHint": "De mapnaam wordt gebruikt als weergavenaam en mag niet uniek zijn.", "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.linkSelected": "Link geselecteerde items ({count})",
"assets.listPageTitle": "Assets", "assets.listPageTitle": "Bestanden",
"assets.loadFailed": "Laden van bestanden is mislukt. Laad opnieuw.", "assets.loadFailed": "Laden van bestanden is mislukt. Laad opnieuw.",
"assets.loadFoldersFailed": "Laden van mappen is mislukt. Laad opnieuw.", "assets.loadFoldersFailed": "Laden van mappen is mislukt. Laad opnieuw.",
"assets.metadata": "Metadata", "assets.metadata": "Metadata",
"assets.metadataAdd": "Metadata toevoegen", "assets.metadataAdd": "Metadata toevoegen",
"assets.moveFailed": "Verplaatsen van item is mislukt. Laad opnieuw.", "assets.moveFailed": "Verplaatsen van item is mislukt. Laad opnieuw.",
"assets.protected": "Beschermd", "assets.protected": "Beschermd",
"assets.refreshTooltip": "Assets vernieuwen (CTRL + SHIFT + R)", "assets.refreshTooltip": "Bestanden vernieuwen (CTRL + SHIFT + R)",
"assets.reloaded": "Bestanden herladen.", "assets.reloaded": "Bestanden herladen.",
"assets.removeConfirmText": "Wil je het bestand echt verwijderen?", "assets.removeConfirmText": "Wil je het bestand echt verwijderen?",
"assets.removeConfirmTitle": "Verwijder bestand", "assets.removeConfirmTitle": "Verwijder bestand",
@ -90,6 +90,8 @@
"assets.searchByName": "Zoeken op naam", "assets.searchByName": "Zoeken op naam",
"assets.searchByTags": "Zoeken op tags", "assets.searchByTags": "Zoeken op tags",
"assets.selectMany": "Selecteer middelen", "assets.selectMany": "Selecteer middelen",
"assets.specialFolder.parent": "<Hoofdmap>",
"assets.specialFolder.root": "Bestanden",
"assets.tabFocusPoint": "Focuspunt", "assets.tabFocusPoint": "Focuspunt",
"assets.tabHistory": "Geschiedenis", "assets.tabHistory": "Geschiedenis",
"assets.tabImage": "Afbeelding", "assets.tabImage": "Afbeelding",

2
backend/i18n/translator/Squidex.Translator/Commands.cs

@ -120,7 +120,7 @@ namespace Squidex.Translator
throw new ArgumentException("Folder does not exist."); 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 translationsDirectory = new DirectoryInfo(Path.Combine(arguments.Folder, "backend", "i18n"));
var translationsService = new TranslationService(translationsDirectory, fileName, locales, arguments.SingleWords); var translationsService = new TranslationService(translationsDirectory, fileName, locales, arguments.SingleWords);

10
backend/i18n/translator/Squidex.Translator/Processes/CheckBackend.cs

@ -32,10 +32,12 @@ namespace Squidex.Translator.Processes
{ {
var content = File.ReadAllText(file.FullName); var content = File.ReadAllText(file.FullName);
var matches = Regex.Matches(content, "T\\.Get\\(\"(?<Key>[^\"]*)\"");
var translations = new HashSet<string>(); var translations = new HashSet<string>();
void AddTranslations(string regex)
{
var matches = Regex.Matches(content, regex, RegexOptions.Singleline);
foreach (Match match in matches) foreach (Match match in matches)
{ {
var key = match.Groups["Key"].Value; var key = match.Groups["Key"].Value;
@ -44,6 +46,10 @@ namespace Squidex.Translator.Processes
all.Add(key); all.Add(key);
} }
}
AddTranslations("T\\.Get\\(\"(?<Key>[^\"]*)\"");
AddTranslations("\"(?<Key>history\\.[^\"]*)\"");
Helper.CheckForFile(service, relativeName, translations); Helper.CheckForFile(service, relativeName, translations);
} }

42
backend/i18n/translator/Squidex.Translator/Processes/CheckFrontend.cs

@ -64,27 +64,20 @@ namespace Squidex.Translator.Processes
var translations = new HashSet<string>(); var translations = new HashSet<string>();
var matches0 = Regex.Matches(content, "\"i18n\\:(?<Key>[^\"]+)\"", RegexOptions.Singleline); void AddTranslations(string regex)
foreach (Match match in matches0)
{ {
translations.Add(match.Groups["Key"].Value); var matches = Regex.Matches(content, regex, RegexOptions.Singleline);
}
var matches1 = Regex.Matches(content, "'i18n\\:(?<Key>[^\']+)'", RegexOptions.Singleline); foreach (Match match in matches)
foreach (Match match in matches1)
{ {
translations.Add(match.Groups["Key"].Value); translations.Add(match.Groups["Key"].Value);
} }
var matches2 = Regex.Matches(content, "'(?<Key>[^\']+)' \\| sqxTranslate", RegexOptions.Singleline);
foreach (Match match in matches2)
{
translations.Add(match.Groups["Key"].Value);
} }
AddTranslations("\"i18n\\:(?<Key>[^\"]+)\"");
AddTranslations("'i18n\\:(?<Key>[^\']+)'");
AddTranslations("'(?<Key>[^\']+)' \\| sqxTranslate");
return translations; return translations;
} }
@ -94,27 +87,20 @@ namespace Squidex.Translator.Processes
var translations = new HashSet<string>(); var translations = new HashSet<string>();
var matches1 = Regex.Matches(content, "'i18n\\:(?<Key>[^\']+)'", RegexOptions.Singleline); void AddTranslations(string regex)
foreach (Match match in matches1)
{ {
translations.Add(match.Groups["Key"].Value); var matches = Regex.Matches(content, regex, RegexOptions.Singleline);
}
var matches2 = Regex.Matches(content, "localizer.get\\('(?<Key>[^\']+)'\\)", RegexOptions.Singleline); foreach (Match match in matches)
foreach (Match match in matches2)
{ {
translations.Add(match.Groups["Key"].Value); translations.Add(match.Groups["Key"].Value);
} }
var matches3 = Regex.Matches(content, "localizer.getOrKey\\('(?<Key>[^\']+)'\\)", RegexOptions.Singleline);
foreach (Match match in matches3)
{
translations.Add(match.Groups["Key"].Value);
} }
AddTranslations("'i18n\\:(?<Key>[^\']+)'");
AddTranslations("localizer.get\\('(?<Key>[^\']+)'\\)");
AddTranslations("localizer.getOrKey\\('(?<Key>[^\']+)'\\)");
return translations; return translations;
} }
} }

12
backend/i18n/translator/Squidex.Translator/Processes/GenerateBackendResources.cs

@ -5,8 +5,10 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System;
using System.IO; using System.IO;
using System.Resources.NetStandard; using System.Resources.NetStandard;
using System.Text.RegularExpressions;
using Squidex.Translator.State; using Squidex.Translator.State;
namespace Squidex.Translator.Processes namespace Squidex.Translator.Processes
@ -41,6 +43,16 @@ namespace Squidex.Translator.Processes
foreach (var (key, value) in texts) foreach (var (key, value) in texts)
{ {
writer.AddResource(key, value); 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);
}
} }
} }

7
backend/i18n/translator/Squidex.Translator/Processes/Helper.cs

@ -72,8 +72,9 @@ namespace Squidex.Translator.Processes
foreach (var key in service.MainTranslations.Keys) foreach (var key in service.MainTranslations.Keys)
{ {
if (!translations.Contains(key) && if (!translations.Contains(key) &&
!key.StartsWith("validation.", StringComparison.OrdinalIgnoreCase) && !key.StartsWith("common.", StringComparison.OrdinalIgnoreCase) &&
!key.StartsWith("aspnet_", StringComparison.OrdinalIgnoreCase)) !key.StartsWith("dotnet_", StringComparison.OrdinalIgnoreCase) &&
!key.StartsWith("validation.", StringComparison.OrdinalIgnoreCase))
{ {
notUsed.Add(key); notUsed.Add(key);
} }
@ -106,7 +107,7 @@ namespace Squidex.Translator.Processes
var parts = key.Split("."); 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]); prefixes.Add(parts[0]);
} }

20
backend/src/Squidex.Domain.Users/UserManagerExtensions.cs

@ -12,6 +12,7 @@ using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Translations;
using Squidex.Infrastructure.Validation; using Squidex.Infrastructure.Validation;
namespace Squidex.Domain.Users namespace Squidex.Domain.Users
@ -241,7 +242,7 @@ namespace Squidex.Domain.Users
if (!result.Succeeded) 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); 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;
}
}
} }
} }

5
backend/src/Squidex.Infrastructure/Translations/LocalizedCompareAttribute.cs → backend/src/Squidex.Infrastructure/Validation/LocalizedCompareAttribute.cs

@ -6,9 +6,10 @@
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure.Translations;
using Squidex.Text; using Squidex.Text;
namespace Squidex.Infrastructure.Translations namespace Squidex.Infrastructure.Validation
{ {
public sealed class LocalizedCompareAttribute : CompareAttribute public sealed class LocalizedCompareAttribute : CompareAttribute
{ {
@ -23,7 +24,7 @@ namespace Squidex.Infrastructure.Translations
var other = T.Get($"common.{OtherProperty.ToCamelCase()}", OtherProperty); 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 });
} }
} }
} }

30
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 });
}
}
}

38
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 });
}
}
}

30
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 });
}
}
}

7
backend/src/Squidex.Infrastructure/Translations/LocalizedRequired.cs → backend/src/Squidex.Infrastructure/Validation/LocalizedRequiredAttribute.cs

@ -7,18 +7,19 @@
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure.Translations;
using Squidex.Text; using Squidex.Text;
namespace Squidex.Infrastructure.Translations namespace Squidex.Infrastructure.Validation
{ {
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class LocalizedRequired : RequiredAttribute public class LocalizedRequiredAttribute : RequiredAttribute
{ {
public override string FormatErrorMessage(string name) public override string FormatErrorMessage(string name)
{ {
var property = T.Get($"common.{name.ToCamelCase()}", 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 });
} }
} }
} }

38
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);
}
}
}

1138
backend/src/Squidex.Shared/Texts.it.resx

File diff suppressed because it is too large

93
backend/src/Squidex.Shared/Texts.nl.resx

@ -61,12 +61,51 @@
<data name="annotations_AbsoluteUrl" xml:space="preserve"> <data name="annotations_AbsoluteUrl" xml:space="preserve">
<value>Het veld {name|lower} moet een absolute URL zijn.</value> <value>Het veld {name|lower} moet een absolute URL zijn.</value>
</data> </data>
<data name="dotnet_annotations_AbsoluteUrl" xml:space="preserve">
<value>Het veld {0} moet een absolute URL zijn.</value>
</data>
<data name="annotations_Compare" xml:space="preserve"> <data name="annotations_Compare" xml:space="preserve">
<value>Het veld {name|lower} moet hetzelfde zijn als {other|lower}.</value> <value>Het veld {name|lower} moet hetzelfde zijn als {other|lower}.</value>
</data> </data>
<data name="dotnet_annotations_Compare" xml:space="preserve">
<value>Het veld {0} moet hetzelfde zijn als {1}.</value>
</data>
<data name="annotations_EmailAddress" xml:space="preserve">
<value>The field {name|lower} is not a valid email address.</value>
</data>
<data name="dotnet_annotations_EmailAddress" xml:space="preserve">
<value>The field {0} is not a valid email address.</value>
</data>
<data name="annotations_Range" xml:space="preserve">
<value>The field {name|lower} must be between {min} and {max}.</value>
</data>
<data name="dotnet_annotations_Range" xml:space="preserve">
<value>The field {0} must be between {1} and {2}.</value>
</data>
<data name="annotations_RegularExpression" xml:space="preserve">
<value>The field {name|lower} is not.</value>
</data>
<data name="dotnet_annotations_RegularExpression" xml:space="preserve">
<value>The field {0} is not.</value>
</data>
<data name="annotations_Required" xml:space="preserve"> <data name="annotations_Required" xml:space="preserve">
<value>Het veld {name|lower} is verplicht.</value> <value>Het veld {name|lower} is verplicht.</value>
</data> </data>
<data name="dotnet_annotations_Required" xml:space="preserve">
<value>Het veld {0} is verplicht.</value>
</data>
<data name="annotations_StringLength" xml:space="preserve">
<value>The field {name|lower} must be a string with a maximum length of {max}.</value>
</data>
<data name="dotnet_annotations_StringLength" xml:space="preserve">
<value>The field {0} must be a string with a maximum length of {1}.</value>
</data>
<data name="annotations_StringLengthMinimum" xml:space="preserve">
<value>The field {name|lower} must be a string with a minimum length of {min} and a maximum length of {max}.</value>
</data>
<data name="dotnet_annotations_StringLengthMinimum" xml:space="preserve">
<value>The field {0} must be a string with a minimum length of {1} and a maximum length of {2}.</value>
</data>
<data name="apps.alreadyArchieved" xml:space="preserve"> <data name="apps.alreadyArchieved" xml:space="preserve">
<value>App is al gearchiveerd.</value> <value>App is al gearchiveerd.</value>
</data> </data>
@ -130,15 +169,6 @@
<data name="apps.roles.usedRoleByContributorsNotRemovable" xml:space="preserve"> <data name="apps.roles.usedRoleByContributorsNotRemovable" xml:space="preserve">
<value>Kan een rol niet verwijderen wanneer een bijdrager is toegewezen.</value> <value>Kan een rol niet verwijderen wanneer een bijdrager is toegewezen.</value>
</data> </data>
<data name="aspnet_annotations_AbsoluteUrl" xml:space="preserve">
<value>Het veld {0} moet een absolute URL zijn.</value>
</data>
<data name="aspnet_annotations_Compare" xml:space="preserve">
<value>Het veld {0} moet hetzelfde zijn als {other|lower}.</value>
</data>
<data name="aspnet_annotations_Required" xml:space="preserve">
<value>Het veld {0} is verplicht.</value>
</data>
<data name="assets.assetAlreadyDeleted" xml:space="preserve"> <data name="assets.assetAlreadyDeleted" xml:space="preserve">
<value>Asset is al verwijderd</value> <value>Asset is al verwijderd</value>
</data> </data>
@ -601,6 +631,51 @@
<data name="contents.workflowErrorUpdate" xml:space="preserve"> <data name="contents.workflowErrorUpdate" xml:space="preserve">
<value>De werkstroom staat geen updates toe met status {status}</value> <value>De werkstroom staat geen updates toe met status {status}</value>
</data> </data>
<data name="dotnet_identity_DefaultEror" xml:space="preserve">
<value>Er is een onbekende fout opgetreden.</value>
</data>
<data name="dotnet_identity_DuplicateEmail" xml:space="preserve">
<value>E-mail is al in gebruik.</value>
</data>
<data name="dotnet_identity_DuplicateUserName" xml:space="preserve">
<value>Gebruikersnaam is al in gebruik.</value>
</data>
<data name="dotnet_identity_InvalidEmail" xml:space="preserve">
<value>E-mail is ongeldig.</value>
</data>
<data name="dotnet_identity_InvalidUserName" xml:space="preserve">
<value>Gebruikersnaam '{0}' is ongeldig, mag alleen letters of cijfers bevatten.</value>
</data>
<data name="dotnet_identity_LoginAlreadyAssociated" xml:space="preserve">
<value>Er bestaat al een gebruiker met deze login.</value>
</data>
<data name="dotnet_identity_PasswordMismatch" xml:space="preserve">
<value>Onjuist wachtwoord.</value>
</data>
<data name="dotnet_identity_PasswordRequiresDigit" xml:space="preserve">
<value>Wachtwoorden moeten minstens één cijfer bevatten ('0' - '9').</value>
</data>
<data name="dotnet_identity_PasswordRequiresLower" xml:space="preserve">
<value>Wachtwoorden moeten minstens één kleine letter ('a' - 'z') bevatten.</value>
</data>
<data name="dotnet_identity_PasswordRequiresNonAlphanumeric" xml:space="preserve">
<value>Wachtwoorden moeten minstens één niet-alfanumeriek teken bevatten.</value>
</data>
<data name="dotnet_identity_PasswordRequiresUniqueChars" xml:space="preserve">
<value>Wachtwoorden moeten minstens {0} verschillende tekens bevatten.</value>
</data>
<data name="dotnet_identity_PasswordRequiresUpper" xml:space="preserve">
<value>Wachtwoorden moeten minstens één hoofdletter ('A' - 'Z') hebben.</value>
</data>
<data name="dotnet_identity_PasswordTooShort" xml:space="preserve">
<value>Wachtwoorden zijn te kort.</value>
</data>
<data name="dotnet_identity_PwnedError" xml:space="preserve">
<value>Dit wachtwoord is eerder verschenen in een datalek en mag nooit worden gebruikt. Als je het ooit eerder ergens hebt gebruikt, verander het dan!</value>
</data>
<data name="dotnet_identity_UserLockedOut" xml:space="preserve">
<value>Gebruiker is uitgesloten.</value>
</data>
<data name="exception.invalidJsonQuery" xml:space="preserve"> <data name="exception.invalidJsonQuery" xml:space="preserve">
<value>Json-query niet geldig: {message}</value> <value>Json-query niet geldig: {message}</value>
</data> </data>

93
backend/src/Squidex.Shared/Texts.resx

@ -61,12 +61,51 @@
<data name="annotations_AbsoluteUrl" xml:space="preserve"> <data name="annotations_AbsoluteUrl" xml:space="preserve">
<value>The field {name|lower} must be an absolute URL.</value> <value>The field {name|lower} must be an absolute URL.</value>
</data> </data>
<data name="dotnet_annotations_AbsoluteUrl" xml:space="preserve">
<value>The field {0} must be an absolute URL.</value>
</data>
<data name="annotations_Compare" xml:space="preserve"> <data name="annotations_Compare" xml:space="preserve">
<value>The field {name|lower} must be the same as {other|lower}.</value> <value>The field {name|lower} must be the same as {other|lower}.</value>
</data> </data>
<data name="dotnet_annotations_Compare" xml:space="preserve">
<value>The field {0} must be the same as {1}.</value>
</data>
<data name="annotations_EmailAddress" xml:space="preserve">
<value>The field {name|lower} is not a valid email address.</value>
</data>
<data name="dotnet_annotations_EmailAddress" xml:space="preserve">
<value>The field {0} is not a valid email address.</value>
</data>
<data name="annotations_Range" xml:space="preserve">
<value>The field {name|lower} must be between {min} and {max}.</value>
</data>
<data name="dotnet_annotations_Range" xml:space="preserve">
<value>The field {0} must be between {1} and {2}.</value>
</data>
<data name="annotations_RegularExpression" xml:space="preserve">
<value>The field {name|lower} is not.</value>
</data>
<data name="dotnet_annotations_RegularExpression" xml:space="preserve">
<value>The field {0} is not.</value>
</data>
<data name="annotations_Required" xml:space="preserve"> <data name="annotations_Required" xml:space="preserve">
<value>The field {name|lower} is required.</value> <value>The field {name|lower} is required.</value>
</data> </data>
<data name="dotnet_annotations_Required" xml:space="preserve">
<value>The field {0} is required.</value>
</data>
<data name="annotations_StringLength" xml:space="preserve">
<value>The field {name|lower} must be a string with a maximum length of {max}.</value>
</data>
<data name="dotnet_annotations_StringLength" xml:space="preserve">
<value>The field {0} must be a string with a maximum length of {1}.</value>
</data>
<data name="annotations_StringLengthMinimum" xml:space="preserve">
<value>The field {name|lower} must be a string with a minimum length of {min} and a maximum length of {max}.</value>
</data>
<data name="dotnet_annotations_StringLengthMinimum" xml:space="preserve">
<value>The field {0} must be a string with a minimum length of {1} and a maximum length of {2}.</value>
</data>
<data name="apps.alreadyArchieved" xml:space="preserve"> <data name="apps.alreadyArchieved" xml:space="preserve">
<value>App has already been archived.</value> <value>App has already been archived.</value>
</data> </data>
@ -130,15 +169,6 @@
<data name="apps.roles.usedRoleByContributorsNotRemovable" xml:space="preserve"> <data name="apps.roles.usedRoleByContributorsNotRemovable" xml:space="preserve">
<value>Cannot remove a role when a contributor is assigned.</value> <value>Cannot remove a role when a contributor is assigned.</value>
</data> </data>
<data name="aspnet_annotations_AbsoluteUrl" xml:space="preserve">
<value>The field {0} must be an absolute URL.</value>
</data>
<data name="aspnet_annotations_Compare" xml:space="preserve">
<value>The field {0} must be the same as {other|lower}.</value>
</data>
<data name="aspnet_annotations_Required" xml:space="preserve">
<value>The field {0} is required.</value>
</data>
<data name="assets.assetAlreadyDeleted" xml:space="preserve"> <data name="assets.assetAlreadyDeleted" xml:space="preserve">
<value>Asset has already been deleted</value> <value>Asset has already been deleted</value>
</data> </data>
@ -601,6 +631,51 @@
<data name="contents.workflowErrorUpdate" xml:space="preserve"> <data name="contents.workflowErrorUpdate" xml:space="preserve">
<value>The workflow does not allow updates at status {status}</value> <value>The workflow does not allow updates at status {status}</value>
</data> </data>
<data name="dotnet_identity_DefaultEror" xml:space="preserve">
<value>An unknown failure has occurred.</value>
</data>
<data name="dotnet_identity_DuplicateEmail" xml:space="preserve">
<value>Email is already taken.</value>
</data>
<data name="dotnet_identity_DuplicateUserName" xml:space="preserve">
<value>User name is already taken.</value>
</data>
<data name="dotnet_identity_InvalidEmail" xml:space="preserve">
<value>Email is invalid.</value>
</data>
<data name="dotnet_identity_InvalidUserName" xml:space="preserve">
<value>User name '{0}' is invalid, can only contain letters or digits.</value>
</data>
<data name="dotnet_identity_LoginAlreadyAssociated" xml:space="preserve">
<value>A user with this login already exists.</value>
</data>
<data name="dotnet_identity_PasswordMismatch" xml:space="preserve">
<value>Incorrect password.</value>
</data>
<data name="dotnet_identity_PasswordRequiresDigit" xml:space="preserve">
<value>Passwords must have at least one digit ('0'-'9').</value>
</data>
<data name="dotnet_identity_PasswordRequiresLower" xml:space="preserve">
<value>Passwords must have at least one lowercase ('a'-'z').</value>
</data>
<data name="dotnet_identity_PasswordRequiresNonAlphanumeric" xml:space="preserve">
<value>Passwords must have at least one non alphanumeric character.</value>
</data>
<data name="dotnet_identity_PasswordRequiresUniqueChars" xml:space="preserve">
<value>Passwords must use at least {0} different characters.</value>
</data>
<data name="dotnet_identity_PasswordRequiresUpper" xml:space="preserve">
<value>Passwords must have at least one uppercase ('A'-'Z').</value>
</data>
<data name="dotnet_identity_PasswordTooShort" xml:space="preserve">
<value>Passwords is too short.</value>
</data>
<data name="dotnet_identity_PwnedError" xml:space="preserve">
<value>This password has previously appeared in a data breach and should never be used. If you have ever used it anywhere before, change it!</value>
</data>
<data name="dotnet_identity_UserLockedOut" xml:space="preserve">
<value>User is locked out.</value>
</data>
<data name="exception.invalidJsonQuery" xml:space="preserve"> <data name="exception.invalidJsonQuery" xml:space="preserve">
<value>Json query not valid: {message}</value> <value>Json query not valid: {message}</value>
</data> </data>

2
backend/src/Squidex.Web/ApiModelValidationAttribute.cs

@ -43,7 +43,7 @@ namespace Squidex.Web
{ {
if (!string.IsNullOrWhiteSpace(error.ErrorMessage) && ShouldExpose(error)) 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) else if (error.Exception is JsonException jsonException)
{ {

3
backend/src/Squidex.Web/EntityCreatedDto.cs

@ -7,12 +7,13 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Commands;
using Squidex.Infrastructure.Validation;
namespace Squidex.Web namespace Squidex.Web
{ {
public sealed class EntityCreatedDto public sealed class EntityCreatedDto
{ {
[Required] [LocalizedRequired]
[Display(Description = "Id of the created entity.")] [Display(Description = "Id of the created entity.")]
public string? Id { get; set; } public string? Id { get; set; }

3
backend/src/Squidex.Web/ErrorDto.cs

@ -6,12 +6,13 @@
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure.Validation;
namespace Squidex.Web namespace Squidex.Web
{ {
public sealed class ErrorDto public sealed class ErrorDto
{ {
[Required] [LocalizedRequired]
[Display(Description = "Error message.")] [Display(Description = "Error message.")]
public string? Message { get; set; } public string? Message { get; set; }

5
backend/src/Squidex.Web/Resource.cs

@ -9,14 +9,15 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json; using Newtonsoft.Json;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Validation;
namespace Squidex.Web namespace Squidex.Web
{ {
public abstract class Resource public abstract class Resource
{ {
[JsonProperty("_links")] [LocalizedRequired]
[Required]
[Display(Description = "The links.")] [Display(Description = "The links.")]
[JsonProperty("_links")]
public Dictionary<string, ResourceLink> Links { get; } = new Dictionary<string, ResourceLink>(); public Dictionary<string, ResourceLink> Links { get; } = new Dictionary<string, ResourceLink>();
public void AddSelfLink(string href) public void AddSelfLink(string href)

5
backend/src/Squidex.Web/ResourceLink.cs

@ -6,16 +6,17 @@
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure.Validation;
namespace Squidex.Web namespace Squidex.Web
{ {
public class ResourceLink public class ResourceLink
{ {
[Required] [LocalizedRequired]
[Display(Description = "The link url.")] [Display(Description = "The link url.")]
public string Href { get; set; } public string Href { get; set; }
[Required] [LocalizedRequired]
[Display(Description = "The link method.")] [Display(Description = "The link method.")]
public string Method { get; set; } public string Method { get; set; }

9
backend/src/Squidex.Web/Services/StringLocalizer.cs

@ -39,12 +39,19 @@ namespace Squidex.Web.Services
TranslateProperty(name, arguments, currentCulture); 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) if (arguments != null && found)
{
try
{ {
result = string.Format(currentCulture, result, arguments); result = string.Format(currentCulture, result, arguments);
} }
catch (FormatException)
{
return new LocalizedString(name, name, true);
}
}
return new LocalizedString(name, result, !found); return new LocalizedString(name, result, !found);
} }

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddLanguageDto.cs

@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
{ {
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The language to add. /// The language to add.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Language Language { get; set; } public Language Language { get; set; }
public AddLanguage ToCommand() public AddLanguage ToCommand()

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddRoleDto.cs

@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
{ {
@ -15,7 +15,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The role name. /// The role name.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Name { get; set; } public string Name { get; set; }
public AddRole ToCommand() public AddRole ToCommand()

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AddWorkflowDto.cs

@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
{ {
@ -15,7 +15,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The name of the workflow. /// The name of the workflow.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Name { get; set; } public string Name { get; set; }
public AddWorkflow ToCommand() public AddWorkflow ToCommand()

6
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppDto.cs

@ -7,7 +7,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using NodaTime; using NodaTime;
using Squidex.Areas.Api.Controllers.Assets; using Squidex.Areas.Api.Controllers.Assets;
using Squidex.Areas.Api.Controllers.Backups; 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.Domain.Apps.Entities.Apps.Plans;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Security; using Squidex.Infrastructure.Security;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
using P = Squidex.Shared.Permissions; using P = Squidex.Shared.Permissions;
@ -31,8 +31,8 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The name of the app. /// The name of the app.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
[RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")] [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>

8
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs

@ -5,11 +5,11 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Core.Apps; using Squidex.Domain.Apps.Core.Apps;
using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -19,19 +19,19 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The iso code of the language. /// The iso code of the language.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Iso2Code { get; set; } public string Iso2Code { get; set; }
/// <summary> /// <summary>
/// The english name of the language. /// The english name of the language.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string EnglishName { get; set; } public string EnglishName { get; set; }
/// <summary> /// <summary>
/// The fallback languages. /// The fallback languages.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Language[] Fallback { get; set; } public Language[] Fallback { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The languages. /// The languages.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public AppLanguageDto[] Items { get; set; } public AppLanguageDto[] Items { get; set; }
public static AppLanguagesDto FromApp(IAppEntity app, Resources resources) public static AppLanguagesDto FromApp(IAppEntity app, Resources resources)

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AssignContributorDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
using Roles = Squidex.Domain.Apps.Core.Apps.Role; using Roles = Squidex.Domain.Apps.Core.Apps.Role;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The id or email of the user to add to the app. /// The id or email of the user to add to the app.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string ContributorId { get; set; } public string ContributorId { get; set; }
/// <summary> /// <summary>

8
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Apps; using Squidex.Domain.Apps.Core.Apps;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -17,19 +17,19 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The client id. /// The client id.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Id { get; set; } public string Id { get; set; }
/// <summary> /// <summary>
/// The client secret. /// The client secret.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Secret { get; set; } public string Secret { get; set; }
/// <summary> /// <summary>
/// The client name. /// The client name.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ClientsDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The clients. /// The clients.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public ClientDto[] Items { get; set; } public ClientDto[] Items { get; set; }
public static ClientsDto FromApp(IAppEntity app, Resources resources) public static ClientsDto FromApp(IAppEntity app, Resources resources)

8
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorDto.cs

@ -6,8 +6,8 @@
// ========================================================================== // ==========================================================================
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Translations;
using Squidex.Infrastructure.Validation;
using Squidex.Shared.Users; using Squidex.Shared.Users;
using Squidex.Web; using Squidex.Web;
@ -18,19 +18,19 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The id of the user that contributes to the app. /// The id of the user that contributes to the app.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string ContributorId { get; set; } public string ContributorId { get; set; }
/// <summary> /// <summary>
/// The display name. /// The display name.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string ContributorName { get; set; } public string ContributorName { get; set; }
/// <summary> /// <summary>
/// The email address. /// The email address.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string ContributorEmail { get; set; } public string ContributorEmail { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorsDto.cs

@ -5,12 +5,12 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Domain.Apps.Entities.Apps.Plans; using Squidex.Domain.Apps.Entities.Apps.Plans;
using Squidex.Infrastructure.Validation;
using Squidex.Shared.Users; using Squidex.Shared.Users;
using Squidex.Web; using Squidex.Web;
@ -21,7 +21,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The contributors. /// The contributors.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public ContributorDto[] Items { get; set; } public ContributorDto[] Items { get; set; }
/// <summary> /// <summary>

6
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateAppDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
{ {
@ -16,8 +16,8 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The name of the app. /// The name of the app.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
[RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")] [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>

6
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateClientDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
{ {
@ -16,8 +16,8 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The id of the client. /// The id of the client.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
[RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")] [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Id { get; set; } public string Id { get; set; }
public AttachClient ToCommand() public AttachClient ToCommand()

6
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternDto.cs

@ -6,9 +6,9 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Apps; using Squidex.Domain.Apps.Core.Apps;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -23,13 +23,13 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The name of the suggestion. /// The name of the suggestion.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>
/// The regex pattern. /// The regex pattern.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Pattern { get; set; } public string Pattern { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternsDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The patterns. /// The patterns.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public PatternDto[] Items { get; set; } public PatternDto[] Items { get; set; }
public static PatternsDto FromApp(IAppEntity app, Resources resources) public static PatternsDto FromApp(IAppEntity app, Resources resources)

6
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RoleDto.cs

@ -6,10 +6,10 @@
// ========================================================================== // ==========================================================================
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Core.Apps; using Squidex.Domain.Apps.Core.Apps;
using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -19,7 +19,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The role name. /// The role name.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>
@ -40,7 +40,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// Associated list of permissions. /// Associated list of permissions.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public IEnumerable<string> Permissions { get; set; } public IEnumerable<string> Permissions { get; set; }
public static RoleDto FromRole(Role role, IAppEntity app) public static RoleDto FromRole(Role role, IAppEntity app)

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RolesDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The roles. /// The roles.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RoleDto[] Items { get; set; } public RoleDto[] Items { get; set; }
public static RolesDto FromApp(IAppEntity app, Resources resources) public static RolesDto FromApp(IAppEntity app, Resources resources)

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateClientDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
{ {
@ -16,7 +16,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The new display name of the client. /// The new display name of the client.
/// </summary> /// </summary>
[StringLength(20)] [LocalizedStringLength(20)]
public string? Name { get; set; } public string? Name { get; set; }
/// <summary> /// <summary>

6
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdatePatternDto.cs

@ -6,9 +6,9 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
{ {
@ -17,13 +17,13 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The name of the suggestion. /// The name of the suggestion.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>
/// The regex pattern. /// The regex pattern.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Pattern { get; set; } public string Pattern { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateRoleDto.cs

@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
{ {
@ -15,7 +15,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// Associated list of permissions. /// Associated list of permissions.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string[] Permissions { get; set; } public string[] Permissions { get; set; }
public UpdateRole ToCommand(string name) public UpdateRole ToCommand(string name)

6
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/UpdateWorkflowDto.cs

@ -7,10 +7,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
{ {
@ -24,7 +24,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The workflow steps. /// The workflow steps.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Dictionary<Status, WorkflowStepDto> Steps { get; set; } public Dictionary<Status, WorkflowStepDto> Steps { get; set; }
/// <summary> /// <summary>
@ -35,7 +35,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The initial step. /// The initial step.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Status Initial { get; set; } public Status Initial { get; set; }
public UpdateWorkflow ToCommand(Guid id) public UpdateWorkflow ToCommand(Guid id)

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowDto.cs

@ -7,10 +7,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -30,7 +30,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The workflow steps. /// The workflow steps.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Dictionary<Status, WorkflowStepDto> Steps { get; set; } public Dictionary<Status, WorkflowStepDto> Steps { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowStepDto.cs

@ -6,10 +6,10 @@
// ========================================================================== // ==========================================================================
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
using NoUpdateType = Squidex.Domain.Apps.Core.Contents.NoUpdate; using NoUpdateType = Squidex.Domain.Apps.Core.Contents.NoUpdate;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -19,7 +19,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The transitions. /// The transitions.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Dictionary<Status, WorkflowTransitionDto> Transitions { get; set; } public Dictionary<Status, WorkflowTransitionDto> Transitions { get; set; }
/// <summary> /// <summary>

6
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowsDto.cs

@ -5,11 +5,11 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Domain.Apps.Entities.Contents; using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Apps.Models namespace Squidex.Areas.Api.Controllers.Apps.Models
@ -19,13 +19,13 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// <summary> /// <summary>
/// The workflow. /// The workflow.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public WorkflowDto[] Items { get; set; } public WorkflowDto[] Items { get; set; }
/// <summary> /// <summary>
/// The errros that should be fixed. /// The errros that should be fixed.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string[] Errors { get; set; } public string[] Errors { get; set; }
public static async Task<WorkflowsDto> FromAppAsync(IWorkflowsValidator workflowsValidator, IAppEntity app, Resources resources) public static async Task<WorkflowsDto> FromAppAsync(IWorkflowsValidator workflowsValidator, IAppEntity app, Resources resources)

20
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetDto.cs

@ -7,13 +7,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json; using Newtonsoft.Json;
using NodaTime; using NodaTime;
using Squidex.Domain.Apps.Core.Assets; using Squidex.Domain.Apps.Core.Assets;
using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Assets.Models namespace Squidex.Areas.Api.Controllers.Assets.Models
@ -33,7 +33,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// <summary> /// <summary>
/// The file name. /// The file name.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string FileName { get; set; } public string FileName { get; set; }
/// <summary> /// <summary>
@ -49,37 +49,37 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// <summary> /// <summary>
/// The slug. /// The slug.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Slug { get; set; } public string Slug { get; set; }
/// <summary> /// <summary>
/// The mime type. /// The mime type.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string MimeType { get; set; } public string MimeType { get; set; }
/// <summary> /// <summary>
/// The file type. /// The file type.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string FileType { get; set; } public string FileType { get; set; }
/// <summary> /// <summary>
/// The formatted text representation of the metadata. /// The formatted text representation of the metadata.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string MetadataText { get; set; } public string MetadataText { get; set; }
/// <summary> /// <summary>
/// The asset metadata. /// The asset metadata.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public AssetMetadata Metadata { get; set; } public AssetMetadata Metadata { get; set; }
/// <summary> /// <summary>
/// The asset tags. /// The asset tags.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public HashSet<string>? Tags { get; set; } public HashSet<string>? Tags { get; set; }
/// <summary> /// <summary>
@ -100,13 +100,13 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// <summary> /// <summary>
/// The user that has created the schema. /// The user that has created the schema.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RefToken CreatedBy { get; set; } public RefToken CreatedBy { get; set; }
/// <summary> /// <summary>
/// The user that has updated the asset. /// The user that has updated the asset.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RefToken LastModifiedBy { get; set; } public RefToken LastModifiedBy { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFolderDto.cs

@ -6,9 +6,9 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Assets.Models namespace Squidex.Areas.Api.Controllers.Assets.Models
@ -28,7 +28,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// <summary> /// <summary>
/// The folder name. /// The folder name.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string FolderName { get; set; } public string FolderName { get; set; }
/// <summary> /// <summary>

6
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFoldersDto.cs

@ -6,10 +6,10 @@
// ========================================================================== // ==========================================================================
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Assets.Models namespace Squidex.Areas.Api.Controllers.Assets.Models
@ -24,13 +24,13 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// <summary> /// <summary>
/// The assets folders. /// The assets folders.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public AssetFolderDto[] Items { get; set; } public AssetFolderDto[] Items { get; set; }
/// <summary> /// <summary>
/// The path to the current folder. /// The path to the current folder.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public AssetFolderDto[] Path { get; set; } public AssetFolderDto[] Path { get; set; }
public static AssetFoldersDto FromAssets(IResultList<IAssetFolderEntity> assetFolders, IEnumerable<IAssetFolderEntity> path, Resources resources) public static AssetFoldersDto FromAssets(IResultList<IAssetFolderEntity> assetFolders, IEnumerable<IAssetFolderEntity> path, Resources resources)

4
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetsDto.cs

@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Assets.Models namespace Squidex.Areas.Api.Controllers.Assets.Models
@ -23,7 +23,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// <summary> /// <summary>
/// The assets. /// The assets.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public AssetDto[] Items { get; set; } public AssetDto[] Items { get; set; }
public static AssetsDto FromAssets(IResultList<IEnrichedAssetEntity> assets, Resources resources) public static AssetsDto FromAssets(IResultList<IEnrichedAssetEntity> assets, Resources resources)

4
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/CreateAssetFolderDto.cs

@ -6,9 +6,9 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Assets.Commands; using Squidex.Domain.Apps.Entities.Assets.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Assets.Models namespace Squidex.Areas.Api.Controllers.Assets.Models
{ {
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// <summary> /// <summary>
/// The name of the folder. /// The name of the folder.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string FolderName { get; set; } public string FolderName { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/RenameAssetFolderDto.cs

@ -6,9 +6,9 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Assets.Commands; using Squidex.Domain.Apps.Entities.Assets.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Assets.Models namespace Squidex.Areas.Api.Controllers.Assets.Models
{ {
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// <summary> /// <summary>
/// The name of the folder. /// The name of the folder.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string FolderName { get; set; } public string FolderName { get; set; }
public RenameAssetFolder ToCommand(Guid id) public RenameAssetFolder ToCommand(Guid id)

4
backend/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobsDto.cs

@ -6,9 +6,9 @@
// ========================================================================== // ==========================================================================
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Entities.Backup; using Squidex.Domain.Apps.Entities.Backup;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Backups.Models namespace Squidex.Areas.Api.Controllers.Backups.Models
@ -18,7 +18,7 @@ namespace Squidex.Areas.Api.Controllers.Backups.Models
/// <summary> /// <summary>
/// The backups. /// The backups.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public BackupJobDto[] Items { get; set; } public BackupJobDto[] Items { get; set; }
public static BackupJobsDto FromBackups(IEnumerable<IBackupJob> backups, Resources resources) public static BackupJobsDto FromBackups(IEnumerable<IBackupJob> backups, Resources resources)

6
backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreJobDto.cs

@ -7,10 +7,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using NodaTime; using NodaTime;
using Squidex.Domain.Apps.Entities.Backup; using Squidex.Domain.Apps.Entities.Backup;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Backups.Models namespace Squidex.Areas.Api.Controllers.Backups.Models
{ {
@ -19,13 +19,13 @@ namespace Squidex.Areas.Api.Controllers.Backups.Models
/// <summary> /// <summary>
/// The uri to load from. /// The uri to load from.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Uri Url { get; set; } public Uri Url { get; set; }
/// <summary> /// <summary>
/// The status log. /// The status log.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public List<string> Log { get; set; } public List<string> Log { get; set; }
/// <summary> /// <summary>

6
backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreRequestDto.cs

@ -6,7 +6,7 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations; using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Backups.Models namespace Squidex.Areas.Api.Controllers.Backups.Models
{ {
@ -15,13 +15,13 @@ namespace Squidex.Areas.Api.Controllers.Backups.Models
/// <summary> /// <summary>
/// The name of the app. /// The name of the app.
/// </summary> /// </summary>
[RegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")] [LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>
/// The url to the restore file. /// The url to the restore file.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Uri Url { get; set; } public Uri Url { get; set; }
} }
} }

8
backend/src/Squidex/Areas/Api/Controllers/Comments/Models/CommentDto.cs

@ -6,12 +6,12 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using NodaTime; using NodaTime;
using Squidex.Domain.Apps.Core.Comments; using Squidex.Domain.Apps.Core.Comments;
using Squidex.Domain.Apps.Entities.Comments.Commands; using Squidex.Domain.Apps.Entities.Comments.Commands;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Comments.Models namespace Squidex.Areas.Api.Controllers.Comments.Models
{ {
@ -25,19 +25,19 @@ namespace Squidex.Areas.Api.Controllers.Comments.Models
/// <summary> /// <summary>
/// The time when the comment was created or updated last. /// The time when the comment was created or updated last.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Instant Time { get; set; } public Instant Time { get; set; }
/// <summary> /// <summary>
/// The user who created or updated the comment. /// The user who created or updated the comment.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RefToken User { get; set; } public RefToken User { get; set; }
/// <summary> /// <summary>
/// The text of the comment. /// The text of the comment.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Text { get; set; } public string Text { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Comments/Models/UpsertCommentDto.cs

@ -6,9 +6,9 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Comments.Commands; using Squidex.Domain.Apps.Entities.Comments.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Comments.Models namespace Squidex.Areas.Api.Controllers.Comments.Models
{ {
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Comments.Models
/// <summary> /// <summary>
/// The comment text. /// The comment text.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Text { get; set; } public string Text { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/BulkUpdateDto.cs

@ -6,10 +6,10 @@
// ========================================================================== // ==========================================================================
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Entities.Contents.Commands; using Squidex.Domain.Apps.Entities.Contents.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models namespace Squidex.Areas.Api.Controllers.Contents.Models
{ {
@ -18,7 +18,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
/// <summary> /// <summary>
/// The contents to update or insert. /// The contents to update or insert.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public List<BulkUpdateJobDto> Jobs { get; set; } public List<BulkUpdateJobDto> Jobs { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ChangeStatusDto.cs

@ -6,10 +6,10 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using NodaTime; using NodaTime;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Entities.Contents.Commands; using Squidex.Domain.Apps.Entities.Contents.Commands;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models namespace Squidex.Areas.Api.Controllers.Contents.Models
{ {
@ -18,7 +18,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
/// <summary> /// <summary>
/// The new status. /// The new status.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Status Status { get; set; } public Status Status { get; set; }
/// <summary> /// <summary>

8
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs

@ -6,7 +6,6 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using NodaTime; using NodaTime;
using Squidex.Areas.Api.Controllers.Schemas.Models; using Squidex.Areas.Api.Controllers.Schemas.Models;
@ -16,6 +15,7 @@ using Squidex.Domain.Apps.Entities;
using Squidex.Domain.Apps.Entities.Contents; using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Contents.Models namespace Squidex.Areas.Api.Controllers.Contents.Models
@ -30,19 +30,19 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
/// <summary> /// <summary>
/// The user that has created the content item. /// The user that has created the content item.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RefToken CreatedBy { get; set; } public RefToken CreatedBy { get; set; }
/// <summary> /// <summary>
/// The user that has updated the content item. /// The user that has updated the content item.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RefToken LastModifiedBy { get; set; } public RefToken LastModifiedBy { get; set; }
/// <summary> /// <summary>
/// The data of the content item. /// The data of the content item.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public object Data { get; set; } public object Data { get; set; }
/// <summary> /// <summary>

6
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsDto.cs

@ -5,13 +5,13 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Squidex.Domain.Apps.Entities; using Squidex.Domain.Apps.Entities;
using Squidex.Domain.Apps.Entities.Contents; using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Domain.Apps.Entities.Schemas; using Squidex.Domain.Apps.Entities.Schemas;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Contents.Models namespace Squidex.Areas.Api.Controllers.Contents.Models
@ -26,13 +26,13 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
/// <summary> /// <summary>
/// The content items. /// The content items.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public ContentDto[] Items { get; set; } public ContentDto[] Items { get; set; }
/// <summary> /// <summary>
/// The possible statuses. /// The possible statuses.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public StatusInfoDto[] Statuses { get; set; } public StatusInfoDto[] Statuses { get; set; }
public static async Task<ContentsDto> FromContentsAsync(IResultList<IEnrichedContentEntity> contents, Context context, Resources resources, public static async Task<ContentsDto> FromContentsAsync(IResultList<IEnrichedContentEntity> contents, Context context, Resources resources,

4
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsIdsQueryDto.cs

@ -7,7 +7,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models namespace Squidex.Areas.Api.Controllers.Contents.Models
{ {
@ -16,7 +16,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
/// <summary> /// <summary>
/// The list of ids to query. /// The list of ids to query.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public List<Guid> Ids { get; set; } public List<Guid> Ids { get; set; }
} }
} }

4
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ImportContentsDto.cs

@ -6,10 +6,10 @@
// ========================================================================== // ==========================================================================
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Entities.Contents.Commands; using Squidex.Domain.Apps.Entities.Contents.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models namespace Squidex.Areas.Api.Controllers.Contents.Models
{ {
@ -18,7 +18,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
/// <summary> /// <summary>
/// The data to import. /// The data to import.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public List<NamedContentData> Datas { get; set; } public List<NamedContentData> Datas { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ScheduleJobDto.cs

@ -6,10 +6,10 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using NodaTime; using NodaTime;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models namespace Squidex.Areas.Api.Controllers.Contents.Models
{ {
@ -38,7 +38,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
/// <summary> /// <summary>
/// The user who schedule the content. /// The user who schedule the content.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RefToken ScheduledBy { get; set; } public RefToken ScheduledBy { get; set; }
} }
} }

6
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/StatusInfoDto.cs

@ -5,8 +5,8 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Contents.Models namespace Squidex.Areas.Api.Controllers.Contents.Models
{ {
@ -15,13 +15,13 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
/// <summary> /// <summary>
/// The name of the status. /// The name of the status.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public Status Status { get; set; } public Status Status { get; set; }
/// <summary> /// <summary>
/// The color of the status. /// The color of the status.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Color { get; set; } public string Color { get; set; }
public static StatusInfoDto FromStatusInfo(StatusInfo statusInfo) public static StatusInfoDto FromStatusInfo(StatusInfo statusInfo)

8
backend/src/Squidex/Areas/Api/Controllers/History/Models/HistoryEventDto.cs

@ -6,10 +6,10 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using NodaTime; using NodaTime;
using Squidex.Domain.Apps.Entities.History; using Squidex.Domain.Apps.Entities.History;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.History.Models namespace Squidex.Areas.Api.Controllers.History.Models
{ {
@ -18,19 +18,19 @@ namespace Squidex.Areas.Api.Controllers.History.Models
/// <summary> /// <summary>
/// The message for the event. /// The message for the event.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Message { get; set; } public string Message { get; set; }
/// <summary> /// <summary>
/// The type of the original event. /// The type of the original event.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string EventType { get; set; } public string EventType { get; set; }
/// <summary> /// <summary>
/// The user who called the action. /// The user who called the action.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Actor { get; set; } public string Actor { get; set; }
/// <summary> /// <summary>

6
backend/src/Squidex/Areas/Api/Controllers/LanguageDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers namespace Squidex.Areas.Api.Controllers
{ {
@ -16,13 +16,13 @@ namespace Squidex.Areas.Api.Controllers
/// <summary> /// <summary>
/// The iso code of the language. /// The iso code of the language.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Iso2Code { get; set; } public string Iso2Code { get; set; }
/// <summary> /// <summary>
/// The english name of the language. /// The english name of the language.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string EnglishName { get; set; } public string EnglishName { get; set; }
public static LanguageDto FromLanguage(Language language) public static LanguageDto FromLanguage(Language language)

6
backend/src/Squidex/Areas/Api/Controllers/News/Models/FeatureDto.cs

@ -5,7 +5,7 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations; using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.News.Models namespace Squidex.Areas.Api.Controllers.News.Models
{ {
@ -14,13 +14,13 @@ namespace Squidex.Areas.Api.Controllers.News.Models
/// <summary> /// <summary>
/// The name of the feature. /// The name of the feature.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>
/// The description text. /// The description text.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Text { get; set; } public string Text { get; set; }
} }
} }

4
backend/src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs

@ -6,7 +6,7 @@
// ========================================================================== // ==========================================================================
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.News.Models namespace Squidex.Areas.Api.Controllers.News.Models
{ {
@ -15,7 +15,7 @@ namespace Squidex.Areas.Api.Controllers.News.Models
/// <summary> /// <summary>
/// The latest features. /// The latest features.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public List<FeatureDto> Features { get; set; } public List<FeatureDto> Features { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Plans/Models/AppPlansDto.cs

@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Domain.Apps.Entities.Apps.Plans; using Squidex.Domain.Apps.Entities.Apps.Plans;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Plans.Models namespace Squidex.Areas.Api.Controllers.Plans.Models
{ {
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Plans.Models
/// <summary> /// <summary>
/// The available plans. /// The available plans.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public PlanDto[] Plans { get; set; } public PlanDto[] Plans { get; set; }
/// <summary> /// <summary>

4
backend/src/Squidex/Areas/Api/Controllers/Plans/Models/ChangePlanDto.cs

@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Plans.Models namespace Squidex.Areas.Api.Controllers.Plans.Models
{ {
@ -17,7 +17,7 @@ namespace Squidex.Areas.Api.Controllers.Plans.Models
/// <summary> /// <summary>
/// The new plan id. /// The new plan id.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string PlanId { get; set; } public string PlanId { get; set; }
public ChangePlan ToCommand(HttpContext httpContext) public ChangePlan ToCommand(HttpContext httpContext)

8
backend/src/Squidex/Areas/Api/Controllers/Plans/Models/PlanDto.cs

@ -5,9 +5,9 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Apps.Plans; using Squidex.Domain.Apps.Entities.Apps.Plans;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Plans.Models namespace Squidex.Areas.Api.Controllers.Plans.Models
{ {
@ -16,19 +16,19 @@ namespace Squidex.Areas.Api.Controllers.Plans.Models
/// <summary> /// <summary>
/// The id of the plan. /// The id of the plan.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Id { get; set; } public string Id { get; set; }
/// <summary> /// <summary>
/// The name of the plan. /// The name of the plan.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Name { get; set; } public string Name { get; set; }
/// <summary> /// <summary>
/// The monthly costs of the plan. /// The monthly costs of the plan.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Costs { get; set; } public string Costs { get; set; }
/// <summary> /// <summary>

6
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/CreateRuleDto.cs

@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json; using Newtonsoft.Json;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
using Squidex.Domain.Apps.Entities.Rules.Commands; using Squidex.Domain.Apps.Entities.Rules.Commands;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Rules.Models namespace Squidex.Areas.Api.Controllers.Rules.Models
{ {
@ -17,13 +17,13 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
/// <summary> /// <summary>
/// The trigger properties. /// The trigger properties.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RuleTriggerDto Trigger { get; set; } public RuleTriggerDto Trigger { get; set; }
/// <summary> /// <summary>
/// The action properties. /// The action properties.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
[JsonConverter(typeof(RuleActionConverter))] [JsonConverter(typeof(RuleActionConverter))]
public RuleAction Action { get; set; } public RuleAction Action { get; set; }

10
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleDto.cs

@ -6,7 +6,6 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json; using Newtonsoft.Json;
using NodaTime; using NodaTime;
using Squidex.Areas.Api.Controllers.Rules.Models.Converters; 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.Domain.Apps.Entities.Rules;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
using Squidex.Web; using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Rules.Models namespace Squidex.Areas.Api.Controllers.Rules.Models
@ -28,13 +28,13 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
/// <summary> /// <summary>
/// The user that has created the rule. /// The user that has created the rule.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RefToken CreatedBy { get; set; } public RefToken CreatedBy { get; set; }
/// <summary> /// <summary>
/// The user that has updated the rule. /// The user that has updated the rule.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RefToken LastModifiedBy { get; set; } public RefToken LastModifiedBy { get; set; }
/// <summary> /// <summary>
@ -65,13 +65,13 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
/// <summary> /// <summary>
/// The trigger properties. /// The trigger properties.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RuleTriggerDto Trigger { get; set; } public RuleTriggerDto Trigger { get; set; }
/// <summary> /// <summary>
/// The action properties. /// The action properties.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
[JsonConverter(typeof(RuleActionConverter))] [JsonConverter(typeof(RuleActionConverter))]
public RuleAction Action { get; set; } public RuleAction Action { get; set; }

8
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementDto.cs

@ -5,10 +5,10 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Validation;
namespace Squidex.Areas.Api.Controllers.Rules.Models namespace Squidex.Areas.Api.Controllers.Rules.Models
{ {
@ -17,13 +17,13 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
/// <summary> /// <summary>
/// Describes the action or trigger type. /// Describes the action or trigger type.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Description { get; set; } public string Description { get; set; }
/// <summary> /// <summary>
/// The label for the action or trigger type. /// The label for the action or trigger type.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public string Display { get; set; } public string Display { get; set; }
/// <summary> /// <summary>
@ -49,7 +49,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
/// <summary> /// <summary>
/// The properties. /// The properties.
/// </summary> /// </summary>
[Required] [LocalizedRequired]
public RuleElementPropertyDto[] Properties { get; set; } public RuleElementPropertyDto[] Properties { get; set; }
public static RuleElementDto FromDefinition(RuleActionDefinition definition) public static RuleElementDto FromDefinition(RuleActionDefinition definition)

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save