diff --git a/backend/i18n/__ignore.json b/backend/i18n/backend__ignore.json similarity index 100% rename from backend/i18n/__ignore.json rename to backend/i18n/backend__ignore.json diff --git a/backend/i18n/__todos.json b/backend/i18n/backend__todos.json similarity index 100% rename from backend/i18n/__todos.json rename to backend/i18n/backend__todos.json diff --git a/backend/i18n/texts_en.json b/backend/i18n/backend_en.json similarity index 97% rename from backend/i18n/texts_en.json rename to backend/i18n/backend_en.json index a7ad68fc1..790dd845c 100644 --- a/backend/i18n/texts_en.json +++ b/backend/i18n/backend_en.json @@ -23,11 +23,7 @@ "apps.roles.nameAlreadyExists": "A role with the same name already exists.", "apps.roles.usedRoleByClientsNotRemovable": "Cannot remove a role when a client is assigned.", "apps.roles.usedRoleByContributorsNotRemovable": "Cannot remove a role when a contributor is assigned.", - "apps.workflows.initialNotPublished": "Workflow must have a published step.", - "apps.workflows.publishedStepNotFound": "Transition has an invalid target.", - "aspnet_annotations_AbsoluteUrl": "The field {0} must be an absolute URL.", - "aspnet_annotations_Compare": "The field {0} must be the same as {1}.", - "aspnet_annotations_Required": "The field {0} is required.", + "workflows.publishedStepNotFound": "Transition has an invalid target.", "assets.assetAlreadyDeleted": "Asset has already been deleted", "assets.assetFolderAlreadyDeleted": "Asset folder has already been deleted", "assets.folderNotFound": "Asset folder does not exist.", @@ -223,7 +219,7 @@ "schemas.duplicateFieldName": "Field '{field}' has been added twice.", "schemas.fieldCannotBeUIField": "Field cannot be an UI field.", "schemas.fieldIsLocked": "Schema field is locked.", - "schemas.fieldName": "Field name", + "common.fieldName": "Field name", "schemas.fieldNameAlreadyExists": "A field with the same name already exists.", "schemas.fieldNotInSchema": "Field is not part of the schema.", "schemas.fieldsNotCovered": "Field ids do not cover all fields.", @@ -318,7 +314,7 @@ "validation.requiredValue": "Value must be defined.", "validation.slug": "{property|upper} is not a valid slug.", "validation.valid": "{property|upper} is not a valid value.", - "valiodation.notAnImage": "Picture is not a valid image.", + "validation.notAnImage": "Picture is not a valid image.", "workflows.initialNotPublished": "Initial step cannot be published step.", "workflows.overlap": "Multiple workflows cover all schemas.", "workflows.schemaOverlap": "The schema '{schema}' is covered by multiple workflows." diff --git a/frontend/i18n/__ignore.json b/backend/i18n/frontend__ignore.json similarity index 100% rename from frontend/i18n/__ignore.json rename to backend/i18n/frontend__ignore.json diff --git a/frontend/i18n/__todos.json b/backend/i18n/frontend__todos.json similarity index 100% rename from frontend/i18n/__todos.json rename to backend/i18n/frontend__todos.json diff --git a/frontend/i18n/texts_en.json b/backend/i18n/frontend_en.json similarity index 99% rename from frontend/i18n/texts_en.json rename to backend/i18n/frontend_en.json index 07d073e84..c7839c458 100644 --- a/frontend/i18n/texts_en.json +++ b/backend/i18n/frontend_en.json @@ -566,7 +566,8 @@ "rules.wizard.selectAction": "Select Action", "rules.wizard.selectTrigger": "Select Trigger", "rules.wizard.triggerHint": "The selection of the trigger type cannot be changed later.", - "schema.field.visibleMarker": "Visible", + "schemas.field.visibleMarker": "Visible", + "common.noValue": "- No value -", "schemas.addField": "Add Field", "schemas.addFieldAndClose": "Create and close", "schemas.addFieldAndCreate": "Create and add field", diff --git a/backend/i18n/translate.bat b/backend/i18n/translate.bat new file mode 100644 index 000000000..6c1ca637f --- /dev/null +++ b/backend/i18n/translate.bat @@ -0,0 +1,4 @@ +cd translator\Squidex.Translator +dotnet run translate gen-backend D:\Squidex +dotnet run translate check-backend D:\Squidex +dotnet run translate check-frontend D:\Squidex diff --git a/i18n/translator/Squidex.Translator.sln b/backend/i18n/translator/Squidex.Translator.sln similarity index 100% rename from i18n/translator/Squidex.Translator.sln rename to backend/i18n/translator/Squidex.Translator.sln diff --git a/i18n/translator/Squidex.Translator/Commands.cs b/backend/i18n/translator/Squidex.Translator/Commands.cs similarity index 93% rename from i18n/translator/Squidex.Translator/Commands.cs rename to backend/i18n/translator/Squidex.Translator/Commands.cs index 68dd7ec83..b744315d2 100644 --- a/i18n/translator/Squidex.Translator/Commands.cs +++ b/backend/i18n/translator/Squidex.Translator/Commands.cs @@ -32,7 +32,7 @@ namespace Squidex.Translator [Command(Name = "check-backend", Description = "Check backend files.")] public void CheckBackend(TranslateArguments arguments) { - var (folder, service) = Setup(arguments, "backend/i18n"); + var (folder, service) = Setup(arguments, "backend"); new CheckBackend(folder, service).Run(); } @@ -40,7 +40,7 @@ namespace Squidex.Translator [Command(Name = "check-frontend", Description = "Check frontend files.")] public void CheckFrontend(TranslateArguments arguments) { - var (folder, service) = Setup(arguments, "frontend/i18n"); + var (folder, service) = Setup(arguments, "frontend"); new CheckFrontend(folder, service).Run(); } @@ -48,7 +48,7 @@ namespace Squidex.Translator [Command(Name = "backend", Description = "Translate backend files.")] public void Backend(TranslateArguments arguments) { - var (folder, service) = Setup(arguments, "backend/i18n"); + var (folder, service) = Setup(arguments, "backend"); new TranslateBackend(folder, service).Run(); } @@ -56,7 +56,7 @@ namespace Squidex.Translator [Command(Name = "templates", Description = "Translate angular templates.")] public void Templates(TranslateArguments arguments) { - var (folder, service) = Setup(arguments, "frontend/i18n"); + var (folder, service) = Setup(arguments, "frontend"); new TranslateTemplates(folder, service).Run(arguments.Report); } @@ -64,7 +64,7 @@ namespace Squidex.Translator [Command(Name = "typescript", Description = "Translate typescript files.")] public void Typescript(TranslateArguments arguments) { - var (folder, service) = Setup(arguments, "frontend/i18n"); + var (folder, service) = Setup(arguments, "frontend"); new TranslateTypescript(folder, service).Run(); } @@ -72,7 +72,7 @@ namespace Squidex.Translator [Command(Name = "gen-backend", Description = "Generate the backend translations.")] public void GenerateBackend(TranslateArguments arguments) { - var (folder, service) = Setup(arguments, "backend/i18n"); + var (folder, service) = Setup(arguments, "backend"); new GenerateBackendResources(folder, service).Run(); } @@ -80,7 +80,7 @@ namespace Squidex.Translator [Command(Name = "migrate-backend", Description = "Migrate the backend files.")] public void MigrateBackend(TranslateArguments arguments) { - var (_, service) = Setup(arguments, "backend/i18n"); + var (_, service) = Setup(arguments, "backend"); service.Migrate(); } @@ -88,20 +88,20 @@ namespace Squidex.Translator [Command(Name = "migrate-frontend", Description = "Migrate the frontend files.")] public void MigrateFrontend(TranslateArguments arguments) { - var (_, service) = Setup(arguments, "frontend/i17n"); + var (_, service) = Setup(arguments, "frontend"); service.Migrate(); } - private static (DirectoryInfo, TranslationService) Setup(TranslateArguments arguments, string folder) + private static (DirectoryInfo, TranslationService) Setup(TranslateArguments arguments, string fileName) { if (!Directory.Exists(arguments.Folder)) { throw new ArgumentException("Folder does not exist."); } - var translationsDirectory = new DirectoryInfo(Path.Combine(arguments.Folder, folder)); - var translationsService = new TranslationService(translationsDirectory, arguments.SingleWords); + var translationsDirectory = new DirectoryInfo(Path.Combine(arguments.Folder, "backend", "i18n")); + var translationsService = new TranslationService(translationsDirectory, fileName, arguments.SingleWords); return (new DirectoryInfo(arguments.Folder), translationsService); } diff --git a/i18n/translator/Squidex.Translator/Extensions.cs b/backend/i18n/translator/Squidex.Translator/Extensions.cs similarity index 100% rename from i18n/translator/Squidex.Translator/Extensions.cs rename to backend/i18n/translator/Squidex.Translator/Extensions.cs diff --git a/i18n/translator/Squidex.Translator/Processes/Backend.cs b/backend/i18n/translator/Squidex.Translator/Processes/Backend.cs similarity index 100% rename from i18n/translator/Squidex.Translator/Processes/Backend.cs rename to backend/i18n/translator/Squidex.Translator/Processes/Backend.cs diff --git a/i18n/translator/Squidex.Translator/Processes/CheckBackend.cs b/backend/i18n/translator/Squidex.Translator/Processes/CheckBackend.cs similarity index 100% rename from i18n/translator/Squidex.Translator/Processes/CheckBackend.cs rename to backend/i18n/translator/Squidex.Translator/Processes/CheckBackend.cs diff --git a/i18n/translator/Squidex.Translator/Processes/CheckFrontend.cs b/backend/i18n/translator/Squidex.Translator/Processes/CheckFrontend.cs similarity index 100% rename from i18n/translator/Squidex.Translator/Processes/CheckFrontend.cs rename to backend/i18n/translator/Squidex.Translator/Processes/CheckFrontend.cs diff --git a/i18n/translator/Squidex.Translator/Processes/Frontend.cs b/backend/i18n/translator/Squidex.Translator/Processes/Frontend.cs similarity index 100% rename from i18n/translator/Squidex.Translator/Processes/Frontend.cs rename to backend/i18n/translator/Squidex.Translator/Processes/Frontend.cs diff --git a/i18n/translator/Squidex.Translator/Processes/GenerateBackendResources.cs b/backend/i18n/translator/Squidex.Translator/Processes/GenerateBackendResources.cs similarity index 100% rename from i18n/translator/Squidex.Translator/Processes/GenerateBackendResources.cs rename to backend/i18n/translator/Squidex.Translator/Processes/GenerateBackendResources.cs diff --git a/i18n/translator/Squidex.Translator/Processes/Helper.cs b/backend/i18n/translator/Squidex.Translator/Processes/Helper.cs similarity index 97% rename from i18n/translator/Squidex.Translator/Processes/Helper.cs rename to backend/i18n/translator/Squidex.Translator/Processes/Helper.cs index 676385007..e6c579778 100644 --- a/i18n/translator/Squidex.Translator/Processes/Helper.cs +++ b/backend/i18n/translator/Squidex.Translator/Processes/Helper.cs @@ -59,7 +59,7 @@ namespace Squidex.Translator.Processes var parts = key.Split("."); - if (parts[0] != "common") + if (parts[0] != "common" && parts[0] != "validation") { prefixes.Add(parts[0]); } diff --git a/i18n/translator/Squidex.Translator/Processes/TranslateBackend.cs b/backend/i18n/translator/Squidex.Translator/Processes/TranslateBackend.cs similarity index 100% rename from i18n/translator/Squidex.Translator/Processes/TranslateBackend.cs rename to backend/i18n/translator/Squidex.Translator/Processes/TranslateBackend.cs diff --git a/i18n/translator/Squidex.Translator/Processes/TranslateTemplates.cs b/backend/i18n/translator/Squidex.Translator/Processes/TranslateTemplates.cs similarity index 100% rename from i18n/translator/Squidex.Translator/Processes/TranslateTemplates.cs rename to backend/i18n/translator/Squidex.Translator/Processes/TranslateTemplates.cs diff --git a/i18n/translator/Squidex.Translator/Processes/TranslateTypescript.cs b/backend/i18n/translator/Squidex.Translator/Processes/TranslateTypescript.cs similarity index 100% rename from i18n/translator/Squidex.Translator/Processes/TranslateTypescript.cs rename to backend/i18n/translator/Squidex.Translator/Processes/TranslateTypescript.cs diff --git a/i18n/translator/Squidex.Translator/Program.cs b/backend/i18n/translator/Squidex.Translator/Program.cs similarity index 100% rename from i18n/translator/Squidex.Translator/Program.cs rename to backend/i18n/translator/Squidex.Translator/Program.cs diff --git a/i18n/translator/Squidex.Translator/Squidex.Translator.csproj b/backend/i18n/translator/Squidex.Translator/Squidex.Translator.csproj similarity index 85% rename from i18n/translator/Squidex.Translator/Squidex.Translator.csproj rename to backend/i18n/translator/Squidex.Translator/Squidex.Translator.csproj index a33878ff7..cbee9657e 100644 --- a/i18n/translator/Squidex.Translator/Squidex.Translator.csproj +++ b/backend/i18n/translator/Squidex.Translator/Squidex.Translator.csproj @@ -18,10 +18,10 @@ - ..\..\..\backend\Squidex.ruleset + ..\..\..\Squidex.ruleset - + diff --git a/i18n/translator/Squidex.Translator/State/Old/OldTranslatedText.cs b/backend/i18n/translator/Squidex.Translator/State/Old/OldTranslatedText.cs similarity index 100% rename from i18n/translator/Squidex.Translator/State/Old/OldTranslatedText.cs rename to backend/i18n/translator/Squidex.Translator/State/Old/OldTranslatedText.cs diff --git a/i18n/translator/Squidex.Translator/State/Old/OldTranslationState.cs b/backend/i18n/translator/Squidex.Translator/State/Old/OldTranslationState.cs similarity index 100% rename from i18n/translator/Squidex.Translator/State/Old/OldTranslationState.cs rename to backend/i18n/translator/Squidex.Translator/State/Old/OldTranslationState.cs diff --git a/i18n/translator/Squidex.Translator/State/Old/TextOrigin.cs b/backend/i18n/translator/Squidex.Translator/State/Old/TextOrigin.cs similarity index 100% rename from i18n/translator/Squidex.Translator/State/Old/TextOrigin.cs rename to backend/i18n/translator/Squidex.Translator/State/Old/TextOrigin.cs diff --git a/i18n/translator/Squidex.Translator/State/TranslatedTexts.cs b/backend/i18n/translator/Squidex.Translator/State/TranslatedTexts.cs similarity index 100% rename from i18n/translator/Squidex.Translator/State/TranslatedTexts.cs rename to backend/i18n/translator/Squidex.Translator/State/TranslatedTexts.cs diff --git a/i18n/translator/Squidex.Translator/State/TranslationService.cs b/backend/i18n/translator/Squidex.Translator/State/TranslationService.cs similarity index 88% rename from i18n/translator/Squidex.Translator/State/TranslationService.cs rename to backend/i18n/translator/Squidex.Translator/State/TranslationService.cs index 3fdc9fe13..f0b5ee027 100644 --- a/i18n/translator/Squidex.Translator/State/TranslationService.cs +++ b/backend/i18n/translator/Squidex.Translator/State/TranslationService.cs @@ -29,8 +29,9 @@ namespace Squidex.Translator.State private readonly TranslatedTexts translations; private readonly TranslationTodos translationsTodo; - private readonly TranslationsToIgnore ignoreList; + private readonly TranslationsToIgnore translationToIgnore; private readonly DirectoryInfo directory; + private readonly string fileName; private readonly bool onlySingleWords; private string previousPrefix; @@ -44,21 +45,22 @@ namespace Squidex.Translator.State SerializerOptions.Converters.Add(new JsonStringEnumConverter()); } - public TranslationService(DirectoryInfo directory, bool onlySingleWords) + public TranslationService(DirectoryInfo directory, string fileName, bool onlySingleWords) { this.directory = directory; - translations = Load("texts_en.json"); - translationsTodo = Load("__todos.json"); + this.fileName = fileName; - ignoreList = Load("__ignore.json"); + translations = Load("_en.json"); + translationsTodo = Load("__todos.json"); + translationToIgnore = Load("__ignore.json"); this.onlySingleWords = onlySingleWords; } private T Load(string name) where T : new() { - var fullName = Path.Combine(directory.FullName, name); + var fullName = Path.Combine(directory.FullName, $"{fileName}{name}"); if (File.Exists(fullName)) { @@ -118,10 +120,10 @@ namespace Squidex.Translator.State public void Save() { - Save("texts-en.json", translations); + Save("_en.json", translations); Save("__todos.json", translationsTodo); - Save("__ignore.json", ignoreList); + Save("__ignore.json", translationToIgnore); } public void Translate(string fileName, string text, string originText, Action handler, bool silent = false) @@ -245,9 +247,9 @@ namespace Squidex.Translator.State } } - private bool IsIgnored(string fileName, string text) + private bool IsIgnored(string name, string text) { - return ignoreList.TryGetValue(fileName, out var ignores) && (ignores.Contains(text) || ignores.Contains("*")); + return translationToIgnore.TryGetValue(name, out var ignores) && (ignores.Contains(text) || ignores.Contains("*")); } private void AddText(string key, string text) @@ -255,25 +257,25 @@ namespace Squidex.Translator.State translations[key] = text; } - private void AddIgnore(string fileName, string text) + private void AddIgnore(string name, string text) { - if (!ignoreList.TryGetValue(fileName, out var ignores)) + if (!translationToIgnore.TryGetValue(name, out var ignores)) { ignores = new SortedSet(); - ignoreList[fileName] = ignores; + translationToIgnore[name] = ignores; } ignores.Add(text); } - private void AddTodo(string fileName, string text) + private void AddTodo(string name, string text) { - if (!translationsTodo.TryGetValue(fileName, out var todos)) + if (!translationsTodo.TryGetValue(name, out var todos)) { todos = new SortedSet(); - translationsTodo[fileName] = todos; + translationsTodo[name] = todos; } todos.Add(text); diff --git a/i18n/translator/Squidex.Translator/State/TranslationTodos.cs b/backend/i18n/translator/Squidex.Translator/State/TranslationTodos.cs similarity index 100% rename from i18n/translator/Squidex.Translator/State/TranslationTodos.cs rename to backend/i18n/translator/Squidex.Translator/State/TranslationTodos.cs diff --git a/i18n/translator/Squidex.Translator/State/TranslationsToIgnore.cs b/backend/i18n/translator/Squidex.Translator/State/TranslationsToIgnore.cs similarity index 100% rename from i18n/translator/Squidex.Translator/State/TranslationsToIgnore.cs rename to backend/i18n/translator/Squidex.Translator/State/TranslationsToIgnore.cs diff --git a/backend/i18n__ignore.json b/backend/i18n__ignore.json index e9596e8ee..737bd389f 100644 --- a/backend/i18n__ignore.json +++ b/backend/i18n__ignore.json @@ -1,472 +1,217 @@ { - "/Migrations/OldTriggers/AssetChangedTrigger.cs": [ + "/_theme.html": [ "*" ], - "/Migrations/OldTriggers/ContentChangedTriggerSchema.cs": [ - "*" + "/app.module.ts": [ + "Application element not found" ], - "/Squidex.Domain.Apps.Core.Model/Apps/AppClients.cs": [ - "*" + "/features/apps/pages/apps-page.component.html": [ + "·", + "|" ], - "/Squidex.Domain.Apps.Core.Model/Contents/Json/ContentFieldDataConverter.cs": [ - "*" + "/features/content/pages/content/content-event.component.html": [ + "·" ], - "/Squidex.Domain.Apps.Core.Model/Freezable.cs": [ - "*" + "/features/content/pages/content/content-page.component.html": [ + "." ], - "/Squidex.Domain.Apps.Core.Model/InvariantPartitioning.cs": [ - "*" + "/features/content/shared/forms/array-item.component.html": [ + "#{{index + 1}}" ], - "/Squidex.Domain.Apps.Core.Model/Rules/Rule.cs": [ - "*" + "/features/content/shared/forms/field-editor.component.html": [ + "*", + "{{field.displayName}} {{displaySuffix}}" ], - "/Squidex.Domain.Apps.Core.Model/Schemas/FieldCollection.cs": [ - "*" + "/features/content/shared/references/references-editor.component.html": [ + "·" ], - "/Squidex.Domain.Apps.Core.Model/Schemas/NestedField{T}.cs": [ + "/features/rules/pages/rules/actions/generic-action.component.html": [ "*" ], - "/Squidex.Domain.Apps.Core.Model/Schemas/RootField{T}.cs": [ + "/features/rules/pages/rules/triggers/asset-changed-trigger.component.html": [ "*" ], - "/Squidex.Domain.Apps.Core.Operations/ConvertContent/StringFormatter.cs": [ - "{array.Count} {pluralName}", - "{lat}, {lon}", - "", - "0 {pluralName}", - "1 {singularName}" - ], - "/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueFactory.cs": [ - ", CultureInfo.InvariantCulture)}T00:00:00Z" - ], - "/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/ContentSchemaBuilder.cs": [ + "/features/rules/pages/rules/triggers/comment-trigger.component.html": [ "*" ], - "/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs": [ - "{field.Name} ({field.RawProperties.Hints})" - ], - "/Squidex.Domain.Apps.Core.Operations/HandleRules/Result.cs": [ + "/features/rules/pages/rules/triggers/content-changed-trigger.component.html": [ "*" ], - "/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs": [ + "/features/rules/pages/rules/triggers/schema-changed-trigger.component.html": [ "*" ], - "/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/ContentDataProperty.cs": [ + "/features/rules/pages/rules/triggers/usage-trigger.component.html": [ "*" ], - "/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/JsonMapper.cs": [ - "*" + "/features/schemas/pages/schema/fields/types/array-validation.component.html": [ + "-" ], - "/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/HttpJintExtension.cs": [ - "*" + "/features/schemas/pages/schema/fields/types/assets-validation.component.html": [ + "-", + "3", + "4", + "px" ], - "/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptOptions.cs": [ - "CanReject={CanReject}, CanDisallow={CanDisallow}, AsContext={AsContext}" + "/features/schemas/pages/schema/fields/types/boolean-ui.component.html": [ + "Checkbox", + "Toggle" ], - "/Squidex.Domain.Apps.Core.Operations/Templates/TemplateParseException.cs": [ - "*" + "/features/schemas/pages/schema/fields/types/date-time-ui.component.html": [ + "DateTime" ], - "/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/CollectionValidator.cs": [ - "Min length must be greater than max length." + "/features/schemas/pages/schema/fields/types/geolocation-ui.component.html": [ + "Map" ], - "/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RangeValidator.cs": [ - "Min value must be greater than max value." + "/features/schemas/pages/schema/fields/types/number-ui.component.html": [ + "Dropdown", + "Input", + "Radio", + "Stars" ], - "/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/StringLengthValidator.cs": [ - "Min length must be greater than max length." + "/features/schemas/pages/schema/fields/types/number-validation.component.html": [ + "-" ], - "/Squidex.Domain.Apps.Entities/Apps/AppUISettingsGrain.cs": [ - "Path does not lead to an object." + "/features/schemas/pages/schema/fields/types/references-ui.component.html": [ + "Checkboxes", + "Dropdown", + "List", + "Resolve reference" ], - "/Squidex.Domain.Apps.Entities/Apps/BackupApps.cs": [ - "The app id or name is not available." + "/features/schemas/pages/schema/fields/types/references-validation.component.html": [ + "-" ], - "/Squidex.Domain.Apps.Entities/Apps/Diagnostics/OrleansAppsHealthCheck.cs": [ - "*" + "/features/schemas/pages/schema/fields/types/string-ui.component.html": [ + "Color", + "Dropdown", + "HTML", + "Input", + "Markdown", + "Radio", + "RichText", + "StockPhoto", + "TextArea" ], - "/Squidex.Domain.Apps.Entities/Apps/Invitation/InvitationEventConsumer.cs": [ - "*" + "/features/schemas/pages/schema/fields/types/string-validation.component.html": [ + "-" ], - "/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs": [ - "*" + "/features/schemas/pages/schema/fields/types/tags-ui.component.html": [ + "Checkboxes", + "Dropdown" ], - "/Squidex.Domain.Apps.Entities/Apps/Templates/CreateIdentityCommandMiddleware.cs": [ - "*" + "/features/schemas/pages/schema/fields/types/tags-validation.component.html": [ + "-" ], - "/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfileCommandMiddleware.cs": [ - "*" + "/features/settings/pages/backups/backup.component.html": [ + "," ], - "/Squidex.Domain.Apps.Entities/Apps/Templates/DefaultScripts.cs": [ - "*" + "/features/settings/pages/clients/client-connect-form.component.html": [ + "1", + "2", + "3", + "4", + "nuget" ], - "/Squidex.Domain.Apps.Entities/Backup/BackupReader.cs": [ - "Cannot find attachment." + "/features/settings/pages/clients/client-connect-form.component.ts": [ + "Content-Type: application/x-www-form-urlencoded", + "grant_type=client_credentials&\r\n client_id=${app}:${client.id}&\r\n client_secret=${client.secret}&\r\n scope=squidex-api" ], - "/Squidex.Domain.Apps.Entities/Backup/RestoreGrain.cs": [ - "*" + "/features/settings/pages/contributors/import-contributors-dialog.component.html": [ + "user1@squidex.io;user2@squidex.io" ], - "/Squidex.Domain.Apps.Entities/Backup/TempFolderBackupArchiveLocation.cs": [ - "*" + "/framework/angular/forms/validators.ts": [ + "matchValidator(): other control is not found in parent group" ], - "/Squidex.Domain.Apps.Entities/Contents/ContentOperationContext.cs": [ - "Cannot resolve app with id {appId}.", - "Cannot resolve schema with id id {schemaId}." + "/framework/angular/modals/dialog-renderer.component.html": [ + "×" ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AllTypes.cs": [ - "*" + "/framework/angular/pager.component.html": [ + "10", + "20", + "30", + "50" ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AppQueriesGraphType.cs": [ - "*" + "/framework/angular/pipes/date-time.pipes.ts": [ + "dd. LLL yyyy", + "dd. MMM" ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AssetGraphType.cs": [ - "*" + "/framework/angular/pipes/money.pipe.ts": [ + "" ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/AssetsResultGraphType.cs": [ - "*" + "/framework/angular/pipes/numbers.pipes.ts": [ + " kMGTPEZY" ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataFlatGraphType.cs": [ + "/index.html": [ + "*" + ], + "/shared/components/app-form.component.html": [ + "appName" + ], + "/shared/components/forms/geolocation-editor.component.ts": [ + "© OpenStreetMap contributors" + ], + "/shared/components/forms/markdown-editor.component.ts": [ + "*", + "fa fa-bold", + "fa fa-header", + "fa fa-italic", + "fa fa-list-ul", + "fa fa-quote-left", + "Generic List" + ], + "/shared/components/forms/rich-editor.component.ts": [ + "code image media link lists advlist paste", + "undo redo | styleselect | bold italic | alignleft aligncenter | bullist numlist outdent indent | link image media | assets" + ], + "/shared/components/search/queries/filter-logical.component.html": [ + "AND", + "OR" + ], + "/shared/components/search/queries/sorting.component.html": [ + "ascending", + "descending" + ], + "/shared/components/search/search-form.component.ts": [ + "form-inline search-form" + ], + "/shared/services/auth.service.ts": [ "*" ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs": [ - "*" + "/shared/services/rules.service.ts": [ + "Asset changed", + "Content changed", + "For asset changes like uploaded, updated (reuploaded), renamed, deleted...", + "For content changes like created, updated, published, unpublished...", + "Manually triggered", + "Schema changed", + "To invoke processes manually, for example to update your static site...", + "Usage exceeded", + "User mentioned", + "When a schema definition has been created, updated, published or deleted...", + "When a user is mentioned in any comment...", + "When monthly API calls exceed a specified limit for one time a month..." ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentGraphType.cs": [ - "*" + "/shared/services/schemas.types.ts": [ + "Invalid properties type" ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentInterfaceGraphType.cs": [ - "*" - ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentsResultGraphType.cs": [ - "*" - ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedGraphType.cs": [ - "*" - ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Utils/GuidGraphType2.cs": [ - "*" - ], - "/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Utils/JsonGraphType.cs": [ - "*" - ], - "/Squidex.Domain.Apps.Entities/Contents/Text/Elastic/ElasticSearchTextIndex.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/Rules/Runner/RuleRunnerGrain.cs": [ - "Cannot find rule." - ], - "/Squidex.Domain.Apps.Entities/Rules/UsageTracking/UsageTriggerHandler.cs": [ - "Usage exceeded" - ], - "/Squidex.Domain.Users.MongoDb/MongoKeyStore.cs": [ - "*" - ], - "/Squidex.Infrastructure.Amazon/Assets/AmazonS3AssetStore.cs": [ - "*" - ], - "/Squidex.Infrastructure.Amazon/Assets/SeekFakerStream.cs": [ - "*" - ], - "/Squidex.Infrastructure.Azure/Assets/AzureBlobAssetStore.cs": [ - "*" - ], - "/Squidex.Infrastructure.Azure/Diagnostics/CosmosDbHealthCheck.cs": [ - "*" - ], - "/Squidex.Infrastructure.Azure/EventSourcing/CosmosDbEventStore_Writer.cs": [ - "*" - ], - "/Squidex.Infrastructure.Azure/EventSourcing/CosmosDbSubscription.cs": [ - "*" - ], - "/Squidex.Infrastructure.Azure/EventSourcing/FilterBuilder.cs": [ - "*" - ], - "/Squidex.Infrastructure.GetEventStore/Diagnostics/GetEventStoreHealthCheck.cs": [ - "*" - ], - "/Squidex.Infrastructure.GetEventStore/EventSourcing/GetEventStore.cs": [ - "*" - ], - "/Squidex.Infrastructure.GetEventStore/EventSourcing/GetEventStoreSubscription.cs": [ - "*" - ], - "/Squidex.Infrastructure.GetEventStore/EventSourcing/ProjectionClient.cs": [ - "*" - ], - "/Squidex.Infrastructure.GoogleCloud/Assets/GoogleCloudAssetStore.cs": [ - "*" - ], - "/Squidex.Infrastructure.MongoDb/Assets/MongoGridFsAssetStore.cs": [ - "*" - ], - "/Squidex.Infrastructure.MongoDb/Diagnostics/MongoDBHealthCheck.cs": [ - "*" - ], - "/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore_Writer.cs": [ - "*" - ], - "/Squidex.Infrastructure.MongoDb/MongoDb/MongoRepositoryBase.cs": [ - "*" - ], - "/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs": [ - "*" - ], - "/Squidex.Infrastructure.Redis/RedisPubSub.cs": [ - "*" - ], - "/Squidex.Infrastructure/Assets/AssetAlreadyExistsException.cs": [ - "*" - ], - "/Squidex.Infrastructure/Assets/AssetNotFoundException.cs": [ - "*" - ], - "/Squidex.Infrastructure/Assets/FolderAssetStore.cs": [ - "*" - ], - "/Squidex.Infrastructure/Assets/HasherStream.cs": [ - "*" - ], - "/Squidex.Infrastructure/Configuration/ConfigurationExtensions.cs": [ - "*" - ], - "/Squidex.Infrastructure/Diagnostics/GCHealthCheck.cs": [ - "*" - ], - "/Squidex.Infrastructure/Diagnostics/OrleansHealthCheck.cs": [ - "*" - ], - "/Squidex.Infrastructure/Email/SmtpEmailSender.cs": [ - "*" - ], - "/Squidex.Infrastructure/EventSourcing/DefaultEventDataFormatter.cs": [ - "*" - ], - "/Squidex.Infrastructure/EventSourcing/EventConsumersHealthCheck.cs": [ - "*" - ], - "/Squidex.Infrastructure/EventSourcing/WrongEventVersionException.cs": [ - "*" - ], - "/Squidex.Infrastructure/FileExtensions.cs": [ - "*" - ], - "/Squidex.Infrastructure/Guard.cs": [ - "*" - ], - "/Squidex.Infrastructure/Http/DumpFormatter.cs": [ - "*" - ], - "/Squidex.Infrastructure/Json/Newtonsoft/InstantConverter.cs": [ - "Not a valid date time, expected String or Date, but got {reader.TokenType}." - ], - "/Squidex.Infrastructure/Json/Newtonsoft/JsonValueConverter.cs": [ - "Unexpected end when reading Object." - ], - "/Squidex.Infrastructure/Json/Newtonsoft/NamedGuidIdConverter.cs": [ - "*" - ], - "/Squidex.Infrastructure/Json/Newtonsoft/NamedLongIdConverter.cs": [ - "*" - ], - "/Squidex.Infrastructure/Json/Newtonsoft/NamedStringIdConverter.cs": [ - "*" - ], - "/Squidex.Infrastructure/Json/Newtonsoft/RefTokenConverter.cs": [ - "*" - ], - "/Squidex.Infrastructure/Json/Objects/JsonArray.cs": [ - "*" - ], - "/Squidex.Infrastructure/Json/Objects/JsonObject.cs": [ - "*" - ], - "/Squidex.Infrastructure/Json/Objects/JsonValue.cs": [ - "*" - ], - "/Squidex.Infrastructure/Language.cs": [ - "*" - ], - "/Squidex.Infrastructure/Languages.cs": [ - "*" - ], - "/Squidex.Infrastructure/Log/Internal/ConsoleLogProcessor.cs": [ - "*" - ], - "/Squidex.Infrastructure/Log/Internal/FileLogProcessor.cs": [ - "*" - ], - "/Squidex.Infrastructure/Log/SemanticLog.cs": [ - "*" - ], - "/Squidex.Infrastructure/Migrations/MigrationFailedException.cs": [ - "*" - ], - "/Squidex.Infrastructure/Migrations/Migrator.cs": [ - "*" - ], - "/Squidex.Infrastructure/NamedId{T}.cs": [ - "*" - ], - "/Squidex.Infrastructure/Orleans/OrleansWrapperException.cs": [ - "*" - ], - "/Squidex.Infrastructure/Plugins/PluginManager.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/ClrValue.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/CompareFilter.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/Json/FilterConverter.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/Json/JsonFilterVisitor.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/Json/PropertyPathValidator.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/Json/ValueConverter.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/LogicalFilter.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/PropertyPath.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/Query.cs": [ - "*" - ], - "/Squidex.Infrastructure/Queries/SortNode.cs": [ - "*" - ], - "/Squidex.Infrastructure/Reflection/TypeNameRegistry.cs": [ - "*" - ], - "/Squidex.Infrastructure/RefToken.cs": [ - "*" - ], - "/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs": [ - "*" - ], - "/Squidex.Infrastructure/States/InconsistentStateException.cs": [ - "*" - ], - "/Squidex.Infrastructure/States/Persistence{TSnapshot,TKey}.cs": [ - "*" - ], - "/Squidex.Infrastructure/StringExtensions.cs": [ - "*" - ], - "/Squidex.Web/ApiController.cs": [ - "*" - ], - "/Squidex.Web/ApiExceptionConverter.cs": [ - ", e.PropertyNames.Select(FixPropertyName))}: {e.Message}" - ], - "/Squidex.Web/ApiExceptionFilterAttribute.cs": [ - "An unexpected exception has occurred." - ], - "/Squidex.Web/CommandMiddlewares/EnrichWithActorCommandMiddleware.cs": [ - "*" - ], - "/Squidex.Web/CommandMiddlewares/EnrichWithAppIdCommandMiddleware.cs": [ - "*" - ], - "/Squidex.Web/CommandMiddlewares/EnrichWithSchemaIdCommandMiddleware.cs": [ - "*" - ], - "/Squidex.Web/EntityCreatedDto.cs": [ - "*" - ], - "/Squidex.Web/ErrorDto.cs": [ - "*" - ], - "/Squidex.Web/Json/TypedJsonInheritanceConverter.cs": [ - "*" - ], - "/Squidex.Web/Pipeline/FileCallbackResultExecutor.cs": [ - "*" - ], - "/Squidex.Web/Pipeline/RequestExceptionMiddleware.cs": [ - "An unexpected exception has occurred." - ], - "/Squidex.Web/Pipeline/SameSiteCookiesServiceCollectionExtensions.cs": [ - "*" - ], - "/Squidex.Web/Resource.cs": [ - "*" - ], - "/Squidex.Web/ResourceLink.cs": [ - "*" - ], - "/Squidex.Web/UrlsOptions.cs": [ - "*" - ], - "/Squidex/Areas/Api/Config/OpenApi/ErrorDtoProcessor.cs": [ - "*" - ], - "/Squidex/Areas/Api/Config/OpenApi/ODataExtensions.cs": [ - "*" - ], - "/Squidex/Areas/Api/Config/OpenApi/OpenApiServices.cs": [ - "*" - ], - "/Squidex/Areas/Api/Config/OpenApi/SecurityProcessor.cs": [ - "*" - ], - "/Squidex/Areas/Api/Config/OpenApi/XmlResponseTypesProcessor.cs": [ - "*" - ], - "/Squidex/Areas/Api/Controllers/Contents/Generator/SchemaOpenApiGenerator.cs": [ - "*" - ], - "/Squidex/Areas/Api/Controllers/News/Service/FeaturesService.cs": [ - "data/version/iv ge {FeatureVersion}" - ], - "/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/AssetsFieldPropertiesDto.cs": [ - "Use ResolveFirst now" - ], - "/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs": [ - "*" - ], - "/Squidex/Areas/IdentityServer/Config/LazyClientStore.cs": [ - "*" - ], - "/Squidex/Areas/IdentityServer/Controllers/Extensions.cs": [ - "*" - ], - "/Squidex/Areas/IdentityServer/Controllers/Profile/RemoveLoginModel.cs": [ - "Provider key." - ], - "/Squidex/Config/Domain/EventPublishersServices.cs": [ - "*" - ], - "/Squidex/Config/Orleans/Helper.cs": [ - "*" - ], - "/Squidex/Config/Startup/LogConfigurationHost.cs": [ - "*" - ], - "/Squidex/Pipeline/OpenApi/NSwagHelper.cs": [ - "*" - ], - "/Squidex/Pipeline/Squid/SquidMiddleware.cs": [ + "/shared/state/contents.forms.visitors.ts": [ + "", + "yyyy-MM-dd HH:mm:ss" + ], + "/shared/state/patterns.forms.ts": [ + "[A-z0-9]+[A-z0-9\\- ]*[A-z0-9]" + ], + "/shared/state/query.ts": [ + "ends with", + "is empty", + "is equals to", + "is greater than", + "is greater than or equals to", + "is less than", + "is less than or equals to", + "is not equals to", + "starts with" + ], + "/theme/icomoon/demo.html": [ "*" ] } \ No newline at end of file diff --git a/backend/i18n__todos.json b/backend/i18n__todos.json index 6716dbd64..9e26dfeeb 100644 --- a/backend/i18n__todos.json +++ b/backend/i18n__todos.json @@ -1,20 +1 @@ -{ - "/Squidex.Domain.Apps.Core.Model/Freezable.cs": [ - "*" - ], - "/Squidex.Domain.Apps.Core.Model/InvariantPartitioning.cs": [ - "*" - ], - "/Squidex.Domain.Users.MongoDb/MongoKeyStore.cs": [ - "*" - ], - "/Squidex.Domain.Users/PwnedPasswordValidator.cs": [ - "This password has previously appeared in a data breach and should never be used. If you've ever used it anywhere before, change it!" - ], - "/Squidex.Infrastructure/FileExtensions.cs": [ - "*" - ], - "/Squidex.Infrastructure/Guard.cs": [ - "*" - ] -} \ No newline at end of file +{} \ No newline at end of file diff --git a/backend/i18n_en.json b/backend/i18n_en.json new file mode 100644 index 000000000..a906df87a --- /dev/null +++ b/backend/i18n_en.json @@ -0,0 +1,845 @@ +{ + "api.contentApi": "Content API", + "api.generalApi": "General API", + "api.graphql": "GraphQL", + "api.graphqlPageTitle": "GraphQL", + "api.pageTitle": "API", + "api.title": "API", + "apps.allApps": "All Apps", + "apps.appLoadFailed": "Failed to load app. Please reload.", + "apps.appNameHint": "You can only use letters, numbers and dashes and not more than 40 characters.", + "apps.appNameValidationMessage": "Name can contain lower case letters (a-z), numbers and dashes between.", + "apps.appNameWarning": "The app name cannot be changed later.", + "apps.appsButtonCreate": "Apps Overview", + "apps.appsButtonFallbackTitle": "Apps Overview", + "apps.archieve": "Archive App", + "apps.archieveConfirmText": "Remove pattern", + "apps.archieveConfirmTitle": "Do you really want to archive this app?", + "apps.archieveWarning": "Once you archive an app, there is no going back. Please be certain.", + "apps.archiveFailed": "Failed to archive app. Please reload.", + "apps.create": "Create App", + "apps.createBlankApp": "New App.", + "apps.createBlankAppDescription": "Create a new blank app without content and schemas.", + "apps.createBlogApp": "New Blog Sample", + "apps.createBlogAppDescription": "Start with our ready to use blog.", + "apps.createFailed": "Failed to create app. Please reload.", + "apps.createIdentityApp": "New Identity App", + "apps.createIdentityAppDescription": "Create app for Squidex Identity.", + "apps.createIdentityAppV2": "New Identity App V2", + "apps.createIdentityAppV2Description": "Create app for Squidex Identity V2.", + "apps.createProfileApp": "New Profile Sample", + "apps.createProfileAppDescription": "Create your profile page.", + "apps.createWithTemplate": "Create {template} Sample", + "apps.empty": "You are not collaborating to any app yet", + "apps.generalSettings": "General", + "apps.generalSettingsDangerZone": "General", + "apps.image": "Image", + "apps.imageDrop": "Drop to upload", + "apps.listPageTitle": "Apps", + "apps.loadFailed": "Failed to load apps. Please reload.", + "apps.removeImage": "Remove image", + "apps.removeImageFailed": "Failed to remove app image. Please reload.", + "apps.updateFailed": "Failed to update app. Please reload.", + "apps.upgradeHintCurrent": "You are on the {plan} plan.", + "apps.upgradeHintUpgrade": "Upgrade!", + "apps.uploadImage": "Drop an file to replace the app image. Use a square size.", + "apps.uploadImageButton": "Upload File", + "apps.uploadImageFailed": "Failed to upload image. Please reload.", + "apps.uploadImageTooBig": "App image is too big.", + "apps.welcomeSubtitle": "Welcome to Squidex.", + "apps.welcomeTitle": "Hi {user}", + "assets.createFolder": "Create Folder", + "assets.createFolderFailed": "Failed to create asset folder. Please reload.", + "assets.createFolderTooltip": "Create new folder (CTRL + SHIFT + G)", + "assets.deleteConfirmText": "Do you really want to delete the asset?", + "assets.deleteConfirmTitle": "Delete asset", + "assets.deleteFailed": "Failed to delete asset. Please reload.", + "assets.deleteFolderConfirmText": "Do you really want to delete the folder and all assets?", + "assets.deleteFolderConfirmTitle": "Delete folder", + "assets.deleteMetadataConfirmText": "Do you really want to remove this metadata?", + "assets.deleteMetadataConfirmTitle": "Remove metadata", + "assets.downloadVersion": "Download this Version", + "assets.dropToUpdate": "Drop to update", + "assets.duplicateFile": "Asset has already been uploaded.", + "assets.editor.flipHorizontally": "Flip Horizontally", + "assets.editor.flipVertically": "Flip Vertically", + "assets.editor.focusPointLabel": "Select position of focus point", + "assets.editor.focusPointPreview": "Preview for different sizes", + "assets.editor.rotateLeft": "Rotate Left", + "assets.editor.rotateRight": "Rotate Right", + "assets.fileTooBig": "Asset is too big.", + "assets.folderName": "Folder Name", + "assets.folderNameHint": "The folder name is used as display name and must not be unique.", + "assets.insertAssets": "Insert Assets", + "assets.linkSelected": "Link selected assets ({count})", + "assets.listPageTitle": "Assets", + "assets.loadFailed": "Failed to load assets. Please reload.", + "assets.loadFoldersFailed": "Failed to load asset folders. Please reload.", + "assets.metadata": "Metadata", + "assets.metadataAdd": "Add Metadata", + "assets.moveFailed": "Failed to move asset. Please reload.", + "assets.protected": "Protected", + "assets.refreshTooltip": "Refresh Assets (CTRL + SHIFT + R)", + "assets.reloaded": "Assets reloaded.", + "assets.renameFolder": "Rename Folder", + "assets.replaceConfirmText": "Do you really want to replace the asset with a newer version", + "assets.replaceConfirmTitle": "Replace asset?", + "assets.replaceFailed": "Failed to replace asset. Please reload.", + "assets.searchByName": "Search by name", + "assets.searchByTags": "Search by tags", + "assets.selectMany": "Select assets", + "assets.tabFocusPoint": "Focus Point", + "assets.tabHistory": "History", + "assets.tabImage": "Image", + "assets.tabMetadata": "Metadata", + "assets.updated": "Asset has been updated.", + "assets.updateFailed": "Failed to update asset. Please reload.", + "assets.updateFolderFailed": "Failed to update asset folder. Please reload.", + "assets.uploadByDialog": "Select File(s", + "assets.uploadByDrop": "Drop files here to upload", + "assets.uploaderUploadHere": "No upload in progress, drop files here.", + "assets.uploadFailed": "Failed to upload asset. Please reload.", + "assets.uploadHint": "Drop file on existing item to replace the asset with a newer version.", + "backups.backupCountAssetsLabel": "Assets", + "backups.backupCountAssetsTooltip": "Archived assets", + "backups.backupCountEventsLabel": "Events", + "backups.backupCountEventsTooltip": "Archived events", + "backups.backupDownload": "Download", + "backups.backupDownloadLink": "Ready", + "backups.backupDuration": "Duration", + "backups.deleteConfirmText": "Do you really want to delete the backup?", + "backups.deleteConfirmTitle": "Delete backup", + "backups.deleted": "Backup is about to be deleted.", + "backups.deleteFailed": "Failed to delete backup.", + "backups.empty": "No backups created yet.", + "backups.loadFailed": "Failed to load backups.", + "backups.maximumReached": "Your have reached the maximum number of backups: 10.", + "backups.refreshTooltip": "Refresh backups (CTRL + SHIFT + R)", + "backups.reloaded": "Backups reloaded.", + "backups.restore": "Restore Backup", + "backups.restoreFailed": "Failed to start restore.", + "backups.restoreLastStatus": "Last Restore Operation", + "backups.restoreLastUrl": "Url to backup", + "backups.restoreNewAppName": "Optional app name", + "backups.restorePageTitle": "Restore Backup", + "backups.restoreStarted": "Restore started, it can take several minutes to complete.", + "backups.restoreStartedLabel": "Started", + "backups.restoreStoppedLabel": "Stopped", + "backups.restoreTitle": "Restore Backup", + "backups.start": "Start Backup", + "backups.started": "Backup started, it can take several minutes to complete.", + "backups.startedLabel": "Started", + "backups.startFailed": "Failed to start backup.", + "clients.add": "Add Client", + "clients.addFailed": "Failed to add client. Please reload.", + "clients.allowAnonymous": "Allow anonymous access.", + "clients.allowAnonymousHint": "Allow access to the API without an access token to all resources that are configured via the role of this client. Do not give more than one client anonymous access.", + "clients.clientIdValidationMessage": "Name can only contain letters, numbers, dashes and spaces.", + "clients.clientNamePlaceholder": "Enter client name", + "clients.connect": "Connect", + "clients.connectWizard.cli": "Connect with Squidex CLI", + "clients.connectWizard.cliHint": "Download the CLI and connect to this app to start backups, sync schemas or export content.", + "clients.connectWizard.cliStep1": "Get the latest Squidex CLI", + "clients.connectWizard.cliStep1Download": "[Download the CLI from Github](https://github.com/Squidex/squidex-samples/releases)", + "clients.connectWizard.cliStep1Hint": "The releases contains binaries for all major operation system and a small download if you have .NET Core installed.", + "clients.connectWizard.cliStep2": "Add `` to your `$PATH` variable", + "clients.connectWizard.cliStep3": "Add your app name the CLI config", + "clients.connectWizard.cliStep3Hint": "You can manage configuration to multiple apps in the CLI and switch to an app.", + "clients.connectWizard.cliStep4": "Switch to your app in the CLI", + "clients.connectWizard.manually": "Connect manually", + "clients.connectWizard.manuallyHint": "Get instructions how to establish a connection with Postman or curl.", + "clients.connectWizard.manuallyStep1": "Get a token using curl", + "clients.connectWizard.manuallyStep2": "Just use the following token", + "clients.connectWizard.manuallyStep3": "Add the token as HTTP header to all requests", + "clients.connectWizard.manuallyTokenHint": "Tokens usally expire after 30days, but you can request multiple tokens.", + "clients.connectWizard.postManDocs": "Start with the Postman tutorial in the [Documentation](https://docs.squidex.io/02-documentation/developer-guides/api-overview/postman).", + "clients.connectWizard.sdk": "Connect to your App with SDK", + "clients.connectWizard.sdkHelp": "You need another SDK?", + "clients.connectWizard.sdkHelpLink": "Contact us in the Support Forum", + "clients.connectWizard.sdkHint": "Download an SDK and establish a connection to this app.", + "clients.connectWizard.sdkStep1": "Install the .NET SDK", + "clients.connectWizard.sdkStep1Download": "The SDK is available on [nuget](https://www.nuget.org/packages/Squidex.ClientLibrary/)", + "clients.connectWizard.sdkStep2": "Create a client manager", + "clients.connectWizard.step0Title": "Setup client", + "clients.connectWizard.step1Title": "Choose connection method", + "clients.connectWizard.step2Title": "Connect", + "clients.deleteConfirmText": "Do you really want to revoke the client?", + "clients.deleteConfirmTitle": "Revoke client", + "clients.empty": "No client created yet.", + "clients.loadFailed": "Failed to load clients. Please reload.", + "clients.refreshTooltip": "Refresh clients (CTRL + SHIFT + R)", + "clients.reloaded": "Clients reloaded.", + "clients.revokeFailed": "Failed to revoke client. Please reload.", + "clients.tokenFailed": "Failed to create token. Please retry.", + "comments.create": "Create a comment", + "comments.createFailed": "Failed to create comment.", + "comments.deleteConfirmText": "Do you really want to delete the comment?", + "comments.deleteConfirmTitle": "Delete comment", + "comments.deleteFailed": "Failed to delete comment.", + "comments.follow": "Follow", + "comments.loadFailed": "Failed to load comments.", + "comments.title": "Comments", + "comments.updateFailed": "Failed to update comment.", + "common.actions": "Actions", + "common.administration": "Administration", + "common.administrationPageTitle": "Administration", + "common.api": "API", + "common.apps": "Apps", + "common.aspectRatio": "AspectRatio", + "common.assets": "Assets", + "common.back": "Back", + "common.backups": "Backups", + "common.bytes": "bytes", + "common.cancel": "Cancel", + "common.clear": "Clear", + "common.clientId": "Client Id", + "common.clients": "Clients", + "common.clientSecret": "Client Secret", + "common.clipboardAdded": "Value has been added to your clipboard.", + "common.clone": "Clone", + "common.cluster": "Cluster", + "common.clusterPageTitle": "Cluster", + "common.comments": "Comments", + "common.confirm": "Confirm", + "common.consumers": "Consumers", + "common.content": "Content", + "common.contents": "Contents", + "common.continue": "Continue", + "common.contributors": "Contributors", + "common.create": "Create", + "common.created": "Created", + "common.date": "Date", + "common.dateTimeEditor.now": "Now", + "common.dateTimeEditor.nowTooltip": "Use Now (UTC)", + "common.dateTimeEditor.today": "Today", + "common.dateTimeEditor.todayTooltip": "Use Today (UTC)", + "common.delete": "Delete", + "common.description": "Description", + "common.displayName": "Display Name", + "common.edit": "Edit", + "common.email": "Email", + "common.error": "Error", + "common.errorBack": "Back to previous page.", + "common.errorNoPermission": "You do not have the permissions to do this.", + "common.errorNotFound": "Not Found", + "common.event": "Event", + "common.events": "Events", + "common.executed": "Executed", + "common.expertMode": "Expert Mode", + "common.failed": "Failed", + "common.fallback": "Fallback", + "common.field": "Field", + "common.files": "Files", + "common.filters": "Filters", + "common.folders": "Folders", + "common.generalSettings": "Common", + "common.generate": "Generate", + "common.github": "Github", + "common.height": "Height", + "common.help": "Help", + "common.helpTour": "Click the help icon to show a context specific help page. Go to", + "common.hide": "Hide", + "common.hints": "Hints", + "common.history": "History", + "common.httpConflict": "Failed to make the update. Another user has made a change. Please reload.", + "common.httpLimit": "You have exceeded the maximum limit of API calls.", + "common.label": "Label", + "common.languages": "Languages", + "common.latitudeShort": "Lat", + "common.loading": "Loading", + "common.logout": "Logout", + "common.logs": "Logs", + "common.longitudeShort": "Lon", + "common.mapHide": "Hide map", + "common.mapShow": "Show map", + "common.message": "Message", + "common.name": "Name", + "common.no": "No", + "common.nothingChanged": "Nothing has been changed.", + "common.noValue": "- No value -", + "common.or": "or", + "common.pagerInfo": "{itemFirst}-{itemLast} of {numberOfItems}", + "common.password": "Password", + "common.passwordConfirm": "Confirm Password", + "common.pattern": "Pattern", + "common.patterns": "Patterns", + "common.permissions": "Permissions", + "common.preview": "Preview", + "common.product": "Squidex Headless CMS", + "common.project": "Project", + "common.refresh": "Refresh", + "common.rename": "Rename", + "common.requiredHint": "required", + "common.reset": "Reset", + "common.restore": "Restore", + "common.role": "Role", + "common.roles": "Roles", + "common.rules": "Rules", + "common.sampleCodeLabel": "Sample Code at", + "common.save": "Save", + "common.saveShortcut": "CTRL + S", + "common.schemas": "Schemas", + "common.searchGoogleMaps": "Search Google Maps", + "common.searchResults": "Search Results", + "common.separateByLine": "Separate by line", + "common.settings": "Settings", + "common.sidebarTour": "The sidebar navigation contains useful context specific links. Here you can view the history how this schema has changed over time.", + "common.slug": "Slug", + "common.stars.max": "Must not have more more than 15 stars", + "common.status": "Status", + "common.statusChangeTo": "Change to", + "common.submit": "Submit", + "common.subscription": "Subscription", + "common.succeeded": "Succeeded", + "common.tagAdd": ", to add tag", + "common.tagAddReference": ", to add reference", + "common.tagAddSchema": ", to add schema", + "common.tags": "Tags", + "common.tagsAll": "All tags", + "common.time": "Time", + "common.update": "Update", + "common.url": "URL", + "common.users": "Users", + "common.value": "Value", + "common.width": "Width", + "common.workflow": "Workflow", + "common.workflows": "Workflows", + "common.yes": "Yes", + "contents.arrayAddItem": "Add Item", + "contents.arrayCloneItem": "Clone this item", + "contents.arrayCollapseAll": "Collapse all items", + "contents.arrayCollapseItem": "Collapse this item", + "contents.arrayExpandAll": "Expand all items", + "contents.arrayExpandItem": "Expand this item", + "contents.arrayMoveBottom": "Move this item to bottom", + "contents.arrayMoveDown": "Move this item down", + "contents.arrayMoveTop": "Move this item to top", + "contents.arrayMoveUp": "Move this item up", + "contents.arrayNoFields": "Add a nested field first to add items.", + "contents.assetsUpload": "Drop files or click", + "contents.autotranslate": "Autotranslate from master language", + "contents.changeStatusTo": "Change content item(s) to {action}", + "contents.changeStatusToImmediately": "Set to {action} immediately.", + "contents.changeStatusToLater": "Set to {action} at a later point date and time.", + "contents.contentNotValid": "Content element not valid, please check the field with the red bar on the left in all languages (if localizable).", + "contents.create": "New", + "contents.createContentTooltip": "New Content (CTRL + SHIFT + G)", + "contents.created": "Content created successfully.", + "contents.createdByFieldDescription": "The user who created the content item.", + "contents.createFailed": "Failed to create content. Please reload.", + "contents.createFieldDescription": "The date time when the content item was created.", + "contents.createPageTitle": "Create Content", + "contents.createTitle": "New Content", + "contents.currentStatusLabel": "Current Version", + "contents.deleteConfirmText": "Do you really want to delete the content?", + "contents.deleteConfirmTitle": "Delete content", + "contents.deleteFailed": "Failed to delete content. Please reload.", + "contents.deleteManyConfirmText": "Do you really want to delete the selected content items?", + "contents.deleteVersionConfirmText": "Do you really want to delete this version?", + "contents.deleteVersionFailed": "Failed to delete version. Please reload.", + "contents.draftNew": "New Draft", + "contents.draftStatus": "New Version", + "contents.editPageTitle": "Edit Content", + "contents.editTitle": "Edit Content", + "contents.languageModeAll": "All Languages", + "contents.languageModeSingle": "Single Language", + "contents.lastModifiedByFieldDescription": "The user who modified the content item the last time.", + "contents.lastModifiedFieldDescription": "The date time when the content item was modified the last time.", + "contents.lastUpdatedLabel": "Last Updated", + "contents.loadContent": "Load", + "contents.loadContentFailed": "Failed to load content. Please reload.", + "contents.loadDataFailed": "Failed to load data. Please reload.", + "contents.loadFailed": "Failed to load contents. Please reload.", + "contents.loadVersionFailed": "Failed to version a new version. Please reload.", + "contents.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.pendingChangesTextToClose": "You have unsaved changes.\n\nWhen you close the current content view you will loose them.\n\n**Do you want to continue anyway?**", + "contents.pendingChangesTitle": "Unsaved changes", + "contents.referencesCreateNew": "Add New", + "contents.referencesCreatePublish": "Create and Publish", + "contents.referencesLink": "Link selected contents ({count})", + "contents.referencesSelectExisting": "Select Existing", + "contents.referencesSelectSchema": "Select {schema}", + "contents.refreshTooltip": "Refresh Contents (CTRL + SHIFT + R)", + "contents.reloaded": "Contents reloaded.", + "contents.saveAndPublish": "Save and Publish", + "contents.scheduledAt": "at", + "contents.scheduledAtLabel": "at", + "contents.scheduledTo": "to", + "contents.schemasPageTitle": "Contents", + "contents.searchPlaceholder": "Fulltext search", + "contents.searchSchemasPlaceholder": "Search for schemas...", + "contents.selectionCount": "{count} items selected", + "contents.statusFieldDescription": "The status of the content item.", + "contents.statusQueries": "Status Queries", + "contents.stockPhotoEmpty": "Nothing selected", + "contents.stockPhotoSearch": "Search for Photos by Unsplash", + "contents.unsavedChangesText": "You have unsaved changes. Do you want to load them now?", + "contents.unsavedChangesTitle": "Unsaved changes", + "contents.updated": "Content updated successfully.", + "contents.updateFailed": "Failed to update content. Please reload.", + "contents.validationHint": "Please remember to check all languages when you see validation errors.", + "contents.versionCompare": "Compare", + "contents.versionDelete": "Delete this Version", + "contents.versionFieldDescription": "The version of the content item", + "contents.versionViewing": "Viewing version **{version}**.", + "contents.viewLatest": "View latest", + "contents.viewReset": "Reset Default View", + "contributors.add": "Add Contributor", + "contributors.addFailed": "Failed to add contributors. Please reload.", + "contributors.contributorAssigned": "A new user with the entered email address has been created and assigned as contributor.", + "contributors.contributorAssignedExisting": "User has been assigned", + "contributors.contributorAssignedInvited": "User has been invited and assigned.", + "contributors.contributorAssignedOld": "User has been added as contributor.", + "contributors.deleteConfirmText": "Do you really want to remove the contributor?", + "contributors.deleteConfirmTitle": "Remove contributor", + "contributors.deleteFailed": "Failed to delete contributors. Please reload.", + "contributors.emailPlaceholder": "Find existing user or invite by email", + "contributors.empty": "No contributors found.", + "contributors.import.emailsDetected": "Emails detected: {count}", + "contributors.import.run": "Add Contributors", + "contributors.import.run2": "Import", + "contributors.importButton": "Add many contributors at once", + "contributors.importHintg": "Big team?", + "contributors.importTitle": "Import contributors", + "contributors.loadFailed": "Failed to load contributors. Please reload.", + "contributors.planHint": "Your plan allows up to {maxContributors} contributors.", + "contributors.refreshTooltip": "Refresh contributors (CTRL + SHIFT + R)", + "contributors.reloaded": "Contributors reloaded.", + "contributors.search": "Search", + "contributors.userNotFound": "The user does not exist.", + "dashboard.apiCallsCard": "API Calls", + "dashboard.apiCallsChart": "API Calls Chart", + "dashboard.apiCallsLimitLabel": "Monthly limit", + "dashboard.apiCallsSummaryCard": "API Calls Summary", + "dashboard.apiDocumentation": "API Documentation", + "dashboard.apiPerformanceCard": "API Performance (ms): {summary}ms avg", + "dashboard.apiPerformanceChart": "API Performance Chart", + "dashboard.assetSizeCard": "Assets Size (MB", + "dashboard.assetSizeLabel": "Total Size", + "dashboard.assetSizeLimitLabel": "Total limit", + "dashboard.assetTotalSize": "Asset Total Storage Size", + "dashboard.assetUpdloadsCountChart": "Asset Uploads Count Chart", + "dashboard.assetUploadsCard": "Assets Uploads", + "dashboard.assetUploadsSizeChart": "Asset Uploads Size Chart", + "dashboard.configSaved": "Configuration saved.", + "dashboard.contentApi": "Content API", + "dashboard.contentApiDescription": "OpenAPI 3.0 compatible documentation for your app content.", + "dashboard.contentsSummaryCard": "Number of items", + "dashboard.currentMonthLabel": "This month", + "dashboard.downloadLog": "Download Log", + "dashboard.editConfig": "Edit Config", + "dashboard.github": "Github", + "dashboard.githubCardDescription": "Get the source code from Github and report bugs or ask for support.", + "dashboard.history": "History", + "dashboard.historyCard": "History", + "dashboard.pageTitle": "Dashboard", + "dashboard.resetConfigConfirmText": "Do you really want to reset the dashboard to the default?", + "dashboard.resetConfigConfirmTitle": "Reset config", + "dashboard.schemaNewCard": "New Schema", + "dashboard.schemaNewCardDescription": "A schema defines the structure of your content element.", + "dashboard.schemasCard": "Schemas", + "dashboard.schemasCardDescription": "Get an insight to the data model of this app.", + "dashboard.stackedChart": "Stacked", + "dashboard.supportCard": "Feedback & Support", + "dashboard.supportCardDescription": "Provide feedback and request features to help us to improve Squidex.", + "dashboard.trafficChart": "API Traffic Chart", + "dashboard.trafficSummaryCard": "Traffic (MB)", + "dashboard.welcomeText": "Welcome to **{app}** dashboard.", + "dashboard.welcomeTitle": "Hi {user}", + "eventConsumers.loadFailed": "Failed to load event consumers. Please reload.", + "eventConsumers.pageTitle": "Event Consumers", + "eventConsumers.position": "Position", + "eventConsumers.refreshTooltip": "Refresh event consumers (CTRL + SHIFT + R)", + "eventConsumers.reloaded": "Event Consumers reloaded.", + "eventConsumers.resetFailed": "Failed to reset event consumer. Please reload.", + "eventConsumers.resetTooltip": "Reset Event Consumer", + "eventConsumers.startFailed": "Failed to start event consumer. Please reload.", + "eventConsumers.startTooltip": "Start Event Consumer", + "eventConsumers.stopFailed": "Failed to stop event consumer. Please reload.", + "eventConsumers.stopTooltip": "Stop Event Consumer", + "features.loadFailed": "Failed to load features. Please reload.", + "history.loadFailed": "Failed to load history. Please reload.", + "history.title": "Activity", + "languages.add": "Add Language", + "languages.addFailed": "Failed to add language. Please reload.", + "languages.deleteConfirmText": "Do you really want to remove the language?", + "languages.deleteConfirmTitle": "Remove language", + "languages.deleteFailed": "Failed to delete language. Please reload.", + "languages.loadFailed": "Failed to load languages. Please reload.", + "languages.master": "Is Master", + "languages.masterHint": "Other languages fall back to the master if no fallback is defined.", + "languages.optional": "Is Optional", + "languages.optionalHint": "Values for optional languages must not be entered, even if field is required.", + "languages.refreshTooltip": "Refresh languages (CTRL + SHIFT + R)", + "languages.reloaded": "Languages reloaded.", + "languages.updateFailed": "Failed to change language. Please reload.", + "news.headline": "What's new?", + "news.title": "New Features", + "notifo.subscripeTooltip": "Click this button to subscribe to all changes and to receive push notifications.", + "patterns.deleteConfirmText": "Do you really want to remove this pattern?", + "patterns.deleteConfirmTitle": "Delete pattern", + "patterns.deleteFailed": "Failed to remove pattern. Please reload.", + "patterns.empty": "No pattern created yet.", + "patterns.loadFailed": "Failed to add pattern. Please reload.", + "patterns.nameValidationMessage": "Name can only contain letters, numbers, dashes and spaces.", + "patterns.refreshTooltip": "Refresh patterns (CTRL + SHIFT + R)", + "patterns.reloaded": "Patterns reloaded.", + "patterns.updateFailed": "Failed to update pattern. Please reload.", + "plans.billingPortal": "Billing Portal", + "plans.billingPortalHint": "Go to Billing Portal for payment history and subscription overview.", + "plans.change": "Change", + "plans.changeConfirmTitle": "Change subscription", + "plans.changeFailed": "Failed to change plan. Please reload.", + "plans.includedCalls": "API Calls", + "plans.includedContributors": "Contributors", + "plans.includedStorage": "Storage", + "plans.loadFailed": "Failed to load plans. Please reload.", + "plans.noPlanConfigured": "No plan configured, this app has unlimited usage.", + "plans.notPlanOwner": "You have not created the subscription. Therefore you cannot change the plan.", + "plans.perMonth": "Per Month", + "plans.perYear": "Per Year", + "plans.refreshTooltip": "Refresh Plans (CTRL + SHIFT + R)", + "plans.reloaded": "Plans reloaded.", + "plans.selected": "✓ Selected", + "profile.title": "Profile", + "profile.userEmail": "Signed in with", + "roles.add": "Add role", + "roles.addFailed": "Failed to add role. Please reload.", + "roles.default.owner": "Can do everything, including deleting the app.", + "roles.default.reader": "Can only read assets and contents.", + "roles.defaults.developer": "Can use the API view, edit assets, contents, schemas, rules, workflows and patterns.", + "roles.defaults.editor": "Can edit assets and contents and view workflows.", + "roles.deleteConfirmText": "Delete role", + "roles.deleteConfirmTitle": "Do you really want to delete the role?", + "roles.loadFailed": "Failed to load roles. Please reload.", + "roles.loadPermissionsFailed": "Failed to load permissions. Please reload.", + "roles.refreshTooltip": "Refresh roles (CTRL + SHIFT + R)", + "roles.reloaded": "Roles reloaded.", + "roles.revokeFailed": "Failed to revoke role. Please reload.", + "roles.roleNamePlaceholder": "Enter role name", + "roles.updateFailed": "Failed to update role. Please reload.", + "rules.actionEdit": "Edit Action", + "rules.cancelFailed": "Failed to cancel rule. Please reload.", + "rules.create": "Create new Rule", + "rules.createFailed": "Failed to create rule. Please reload.", + "rules.createTooltip": "New Rule (CTRL + SHIFT + G)", + "rules.deleteConfirmText": "Do you really want to delete the rule?", + "rules.deleteConfirmTitle": "Delete rule", + "rules.deleteFailed": "Failed to delete rule. Please reload.", + "rules.disableFailed": "Failed to disable rule. Please reload.", + "rules.empty": "No rule created yet.", + "rules.emptyAddRule": "Add Rule", + "rules.enableFailed": "Failed to enable rule. Please reload.", + "rules.enqueued": "Rule has been added to the queue.", + "rules.listPageTitle": "Rules", + "rules.loadFailed": "Failed to load Rules. Please reload.", + "rules.readMore": "Read More", + "rules.refreshEventsTooltip": "Refresh Events (CTRL + SHIFT + R)", + "rules.refreshTooltip": "Refresh Rules (CTRL + SHIFT + R)", + "rules.reloaded": "Rules reloaded.", + "rules.restarted": "Rule will start to run in a few seconds.", + "rules.ruleEvents.cancelFailed": "Failed to cancel rule event. Please reload.", + "rules.ruleEvents.enqueue": "Enqueue", + "rules.ruleEvents.enqueued": "Events enqueued. Will be resend in a few seconds.", + "rules.ruleEvents.enqueueFailed": "Failed to enqueue rule event. Please reload.", + "rules.ruleEvents.lastInvokedLabel": "Last Invocation", + "rules.ruleEvents.listPageTitle": "Rule Events", + "rules.ruleEvents.loadFailed": "Failed to load events. Please reload.", + "rules.ruleEvents.nextAttemptLabel": "Next", + "rules.ruleEvents.numAttemptsLabel": "Attempts", + "rules.ruleEvents.reloaded": "RuleEvents reloaded.", + "rules.ruleSyntax.if": "If", + "rules.ruleSyntax.then": "then", + "rules.run": "Run", + "rules.runFailed": "Failed to run rule. Please reload.", + "rules.runningRule": "Rule '{name}' is currently running.", + "rules.runRuleConfirmText": "Do you really want to run the rule for all events?", + "rules.runRuleConfirmTitle": "Run rule", + "rules.stop": "Rule will stop soon.", + "rules.triggerConfirmText": "Do you really want to trigger the rule?", + "rules.triggerConfirmTitle": "Trigger rule", + "rules.triggerEdit": "Edit Trigger", + "rules.triggerFailed": "Failed to trigger rule. Please reload.", + "rules.unnamed": "Unnamed Rule", + "rules.updateFailed": "Failed to update rule. Please reload.", + "rules.wizard.actionHint": "The selection of the action type cannot be changed later.", + "rules.wizard.selectAction": "Select Action", + "rules.wizard.selectTrigger": "Select Trigger", + "rules.wizard.triggerHint": "The selection of the trigger type cannot be changed later.", + "schemas.addField": "Add Field", + "schemas.addFieldAndClose": "Create and close", + "schemas.addFieldAndCreate": "Create and add field", + "schemas.addFieldAndEdit": "Create and edit field", + "schemas.addFieldFailed": "Failed to add field. Please reload.", + "schemas.addNestedField": "Add Nested Field", + "schemas.changeCategoryFailed": "Failed to change category. Please reload.", + "schemas.clone": "Clone Schema", + "schemas.contextMenuTour": "Open the context menu to delete the schema or to create some scripts for content changes.", + "schemas.create": "Create Schema", + "schemas.createCategory": "Create new category...", + "schemas.createFailed": "Failed to create schema. Please reload.", + "schemas.createSchemaTooltip": "New Schema (CTRL + SHIFT + G)", + "schemas.deleteConfirmText": "Do you really want to delete the schema?", + "schemas.deleteConfirmTitle": "Delete schema", + "schemas.deleteFailed": "Failed to delete schema. Please reload.", + "schemas.deleteFieldFailed": "Failed to delete field. Please reload.", + "schemas.deleteRuleConfirmText": "Do you really want to remove this Field Rule?", + "schemas.deleteRuleConfirmTitle": "Remove Field Rule", + "schemas.deleteUrlConfirmText": "Do you really want to remove this URL?", + "schemas.deleteUrlConfirmTitle": "Remove URL", + "schemas.disableFieldFailed": "Failed to disable field. Please reload.", + "schemas.enableFieldFailed": "Failed to enable field. Please reload.", + "schemas.export.deleteFields": "Delete fields", + "schemas.export.recreateFields": "Recreate fields", + "schemas.export.synchronize": "Synchronize", + "schemas.field.allowedValues": "Allowed Values", + "schemas.field.defaultValue": "Default Value", + "schemas.field.deleteConfirmText": "Do you really want to delete the field?", + "schemas.field.deleteConfirmTitle": "Delete field", + "schemas.field.disable": "Disable in UI", + "schemas.field.disabledMarker": "Disabled", + "schemas.field.editor": "Editor", + "schemas.field.editorUrl": "Editor Url", + "schemas.field.editorUrlHint": "Url to your plugin if you use a custom editor.", + "schemas.field.empty": "No field created yet.", + "schemas.field.enable": "Enable in UI", + "schemas.field.enabledMarker": "Enabled", + "schemas.field.hiddenMarker": "Hidden", + "schemas.field.hide": "Hide in API", + "schemas.field.hintsHint": "Describe this schema for documentation and user interfaces.", + "schemas.field.inlineEditable": "Inline Editable", + "schemas.field.labelHint": "Display name for documentation and user interfaces.", + "schemas.field.localizable": "Localizable", + "schemas.field.localizableHint": "You can mark the field as localizable. It means that is dependent on the language, for example a city name.", + "schemas.field.localizableMarker": "localizable", + "schemas.field.lock": "Lock and prevent changes", + "schemas.field.lockConfirmText": "WARNING: Locking a field cannot be undone! Locked field definitions cannot be unlocked, deleted, or changed anymore. Do you really want to lock this field?", + "schemas.field.lockedMarker": "Locked", + "schemas.field.nameHint": "The name of the field in the API response.", + "schemas.field.namePlaceholder": "Enter field name", + "schemas.field.nameValidationMessage": "Name must be a valid javascript name in camel case.", + "schemas.field.placeholder": "Placeholder", + "schemas.field.placeholderHint": "Define the placeholder for the input control.", + "schemas.field.required": "Required", + "schemas.field.show": "Show in API", + "schemas.field.tabCommon": "Common", + "schemas.field.tabEditing": "Editing", + "schemas.field.tabValidation": "Validation", + "schemas.field.tagsHint": "Tags to annotate your field for automation processes.", + "schemas.field.unique": "Unique", + "schemas.field.visibleMarker": "Visible", + "schemas.fieldTypes.array.count": "Items", + "schemas.fieldTypes.array.countMax": "Max Items", + "schemas.fieldTypes.array.countMin": "Min Items", + "schemas.fieldTypes.array.description": "List of embedded objects.", + "schemas.fieldTypes.assets.allowDuplicates": "Allow duplicate values", + "schemas.fieldTypes.assets.count": "Count", + "schemas.fieldTypes.assets.countMax": "Max Assets", + "schemas.fieldTypes.assets.countMin": "Min Assets", + "schemas.fieldTypes.assets.description": "Images, videos, documents.", + "schemas.fieldTypes.assets.fileExtensions": "File Extensions", + "schemas.fieldTypes.assets.mustBeImage": "Must be Image", + "schemas.fieldTypes.assets.previewMode": "PreviewMode", + "schemas.fieldTypes.assets.previewModeHint": "The preview mode for assets in content lists.", + "schemas.fieldTypes.assets.previewModeName": "Only file name", + "schemas.fieldTypes.assets.previewModeTumbnailName": "Thumbnail and file name", + "schemas.fieldTypes.assets.previewModeTumbnailOrName": "Only thumbnail or file name if not an image", + "schemas.fieldTypes.assets.resolve": "Resolve first asset", + "schemas.fieldTypes.assets.resolveHint": "Show the first referenced asset in the content list.", + "schemas.fieldTypes.assets.size": "Size", + "schemas.fieldTypes.assets.sizeMax": "Min Size", + "schemas.fieldTypes.assets.sizeMin": "Max Size", + "schemas.fieldTypes.boolean.description": "Yes or no, true or false.", + "schemas.fieldTypes.dateTime.defaultMode": "Default Mode", + "schemas.fieldTypes.dateTime.description": "Events date, opening hours.", + "schemas.fieldTypes.dateTime.rangeMax": "Max Value", + "schemas.fieldTypes.dateTime.rangeMin": "Min Value", + "schemas.fieldTypes.geolocation.description": "Coordinates: latitude and longitude.", + "schemas.fieldTypes.json.description": "Data in JSON format, for developers.", + "schemas.fieldTypes.number.description": "ID, order number, rating, quantity.", + "schemas.fieldTypes.number.range": "Range", + "schemas.fieldTypes.number.rangeMax": "Max Value", + "schemas.fieldTypes.number.rangeMin": "Min Value", + "schemas.fieldTypes.references.count": "Items", + "schemas.fieldTypes.references.countMax": "Max Items", + "schemas.fieldTypes.references.countMin": "Min Items", + "schemas.fieldTypes.references.description": "Links to other content items.", + "schemas.fieldTypes.references.resolveHint": "Show the name of the referenced item in content list when MaxItems is set to 1.", + "schemas.fieldTypes.string.description": "Titles, names, paragraphs.", + "schemas.fieldTypes.string.length": "Length", + "schemas.fieldTypes.string.lengthMax": "Max Length", + "schemas.fieldTypes.string.lengthMin": "Min Length", + "schemas.fieldTypes.string.pattern": "Regex Pattern", + "schemas.fieldTypes.string.patternMessage": "Pattern Message", + "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": "Special format for tags.", + "schemas.fieldTypes.ui.description": "Separator for editing UI.", + "schemas.hideFieldFailed": "Failed to hide field. Please reload.", + "schemas.import": "Import schema", + "schemas.listFields": "List Fields", + "schemas.listFieldsEmpty": "Drop field here or reorder them to show the fields in the content list. When no list field is defined, the first field is used.", + "schemas.loadFailed": "Failed to load schemas. Please reload.", + "schemas.loadSchemaFailed": "Failed to load schema. Please reload.", + "schemas.lockFieldFailed": "Failed to lock field. Please reload.", + "schemas.modeMultiple": "Multiple contents", + "schemas.modeMultipleDescription": "Best for multiple instances like blog posts, pages, authors, products...", + "schemas.modeSingle": "Single content", + "schemas.modeSingleDescription": "Best for single instances like the home page, privacy policies, settings...", + "schemas.nameWarning": "These values cannot be changed later.", + "schemas.previewUrls.empty": "No preview urls configured.", + "schemas.previewUrls.help": "Checkout the integrated help page to learn more about preview URL's.", + "schemas.previewUrls.namePlaceholder": "Web or Mobile", + "schemas.previewUrls.title": "Preview URLs", + "schemas.previewUrls.urlPlaceholder": "URL with variables", + "schemas.published": "Published", + "schemas.publishedTour": "Note, that you have to publish the schema before you can add content to it.", + "schemas.publishFailed": "Failed to publish schema. Please reload.", + "schemas.referenceFields": "Reference Fields", + "schemas.referenceFieldsEmpty": "Drop field here or reorder them to show the fields when referenced by another content. When no reference field is defined, the list fields are used instead.", + "schemas.reloaded": "Schemas reloaded.", + "schemas.reorderFieldsFailed": "Failed to reorder fields. Please reload.", + "schemas.rules.action": "Action", + "schemas.rules.condition": "Condition in Javascript", + "schemas.rules.empty": "No field rules configured.", + "schemas.rules.title": "Field Rules", + "schemas.rules.when": "when", + "schemas.saved": "Schema saved successfully.", + "schemas.saveFieldAndClose": "Save and close", + "schemas.saveFieldAndNew": "Save and add field", + "schemas.schemaHintsHint": "Describe this schema for documentation and user interfaces.", + "schemas.schemaLabelHint": "Display name for documentation and user interfaces.", + "schemas.schemaNameHint": "You can only use letters, numbers and dashes and not more than 40 characters.", + "schemas.schemaNameValidationMessage": "Name can only contain letters, numbers, dashes and spaces.", + "schemas.schemaTagsHint": "Tags to annotate your schema for automation processes.", + "schemas.searchPlaceholder": "Search for schemas...", + "schemas.showFieldFailed": "Failed to show field. Please reload.", + "schemas.synchronized": "Schema synchronized successfully.", + "schemas.synchronizeFailed": "Failed to synchronize schema. Please reload.", + "schemas.tabFields": "Fields", + "schemas.tabJson": "Json", + "schemas.tabMore": "More", + "schemas.tabScripts": "Scripts", + "schemas.tabUI": "UI", + "schemas.ui": "Assigned fields", + "schemas.ui.unassignedFields": "Unassigned fields", + "schemas.unpublished": "Unpublished", + "schemas.unpublishFailed": "Failed to unpublish schema. Please reload.", + "schemas.updateFailed": "Failed to update schema. Please reload.", + "schemas.updateFieldFailed": "Failed to update field. Please reload.", + "schemas.updatePreviewUrlsFailed": "Failed to configure preview urls. Please reload.", + "schemas.updateRulesFailed": "Failed to update schema rules. Please reload.", + "schemas.updateScriptsFailed": "Failed to update schema scripts. Please reload.", + "schemas.updateUIFieldsFailed": "Failed to update UI fields. Please reload.", + "search.addFilter": "Add Filter", + "search.addGroup": "Add Group", + "search.addSorting": "Add Sorting", + "search.advancedTour": "Click this icon to show the advanced search menu!", + "search.customQuery": "Custom Query", + "search.fullTextTour": "Search for content using full text search over all fields and languages!", + "search.help": "Read more about filtering in the [Documentation](https://https://docs.squidex.io/04-guides/02-api.html).", + "search.myQueries": "My queries", + "search.nameQuery": "Name your query", + "search.queriesEmpty": "Search for {types} and use icon in search form to save query for all contributors.", + "search.queryAllNewestFirst": "All (newest first)", + "search.queryAllOldestFirst": "All (oldest first)", + "search.quickNavPlaceholder": "Quick Nav (Press 'q')", + "search.saveQueryMyself": "Save the query only for myself.", + "search.searchFailed": "Failed to make search. Please reload.", + "search.sharedQueries": "Shared queries", + "search.sorting": "Sorting", + "start.login": "Login to Squidex", + "start.loginHint": "The login button will open a new popup. Once you are logged in successful we will redirect you to the Squidex management portal.", + "start.madeBy": "Proudly made by", + "start.madeByCopyright": "Qaisar Ahmad & Sebastian Stehle, 2016-2020", + "tour.joinForum": "Join our Forum", + "tour.joinGithub": "Join us on Github", + "tour.skip": "Skip Tour", + "tour.step0Next": "Let's take a look around", + "tour.step0Text": "You can start managing and distributing your content right away, but we we'd like to walk you through some basics first...\n\nHow'that", + "tour.step1Next": "Continue", + "tour.step1Text": "An App is the repository for your project, e.g. (blog, web shop or mobile app). You can assign contributors to your app to work together.\n\nYou can create an unlimited number of Apps in Squidex to manage multiple projects at the same time.", + "tour.step2Next": "Keep going!", + "tour.step2Text": "Schemas define the structure of your content, the fields and the data types of a content item.\n\nBefore you can add content to your schema, make sure to hit the 'Publish' button at the top to make the schema available to your content editors.", + "tour.step3Next": "Almost there!", + "tour.step3Text": "Content is the actual data in your app which is grouped by the schema.\n\nSelect a published schema first, then add content for this schema.", + "tour.step4Next": "Got It!", + "tour.step4Text": "The assets contains all files that can also be linked to your content. For example images, videos or documents.\n\nYou can upload the assets here and use them later or also upload them directly when you create a new content item with an asset field.", + "tour.step5Text": "But that's not all of the support we can provide.\n\nYou can got to https://docs.squidex.io/> to read more.\n\nDo you want to join our community?", + "tour.step5Title": "Awesome, now you know the basics!", + "tour.tooltipConfirm": "Got It", + "tour.tooltipStop": "Stop Tour", + "tour.welcome": "Welcome to", + "tour.welcomeProduct": "Squidex CMS", + "translate.translateFailed": "Failed to translate text. Please reload.", + "usages.loadCallsFailed": "Failed to load calls usage. Please reload.", + "usages.loadMonthlyCallsFailed": "Failed to load monthly API calls. Please reload.", + "usages.loadStorageFailed": "Failed to load storage usage. Please reload.", + "usages.loadTodayStorageFailed": "Failed to load todays storage size. Please reload.", + "users.create": "New", + "users.createFailed": "Failed to create user. Please reload.", + "users.createPageTitle": "Create User", + "users.createTitle": "New User", + "users.createTooltip": "New User (CTRL + N)", + "users.editPageTitle": "Edit User", + "users.editTitle": "Edit User", + "users.listPageTitle": "User Management", + "users.listTitle": "Users", + "users.loadFailed": "Failed to load users. Please reload.", + "users.loadUserFailed": "Failed to load user. Please reload.", + "users.lockTooltip": "Lock User", + "users.passwordConfirmValidationMessage": "Passwords must be the same.", + "users.refreshTooltip": "Refresh Users (CTRL + SHIFT + R)", + "users.reloaded": "Users reloaded.", + "users.search": "Search for user", + "users.unlockTooltip": "Unlock User", + "users.updateFailed": "Failed to update user. Please reload.", + "validation.between": "{field} must be between '{min}' and '{max}'.", + "validation.betweenlength": "{field|upper} must have between {minlength} and {maxlength} item(s).", + "validation.betweenlengthstring": "{field|upper} must have between {minlength} and {maxlength} character(s).", + "validation.email": "{field|upper} must be an email address.", + "validation.exactly": "{field|upper} must be exactly '{expected}'.", + "validation.exactlylength": "{field|upper} must have exactly {expected} item(s).", + "validation.exactlylengthstring": "{field|upper} must have exactly {expected} character(s).", + "validation.match": "{message}", + "validation.max": "{field|upper} must be less or equal to '{max}'.", + "validation.maxlength": "{field|upper} must not have more than {requiredlength} item(s).", + "validation.maxlengthstring": "{field|upper} must not have more than {requiredlength} character(s).", + "validation.min": "{field|upper} must be greater or equal to '{min}'.", + "validation.minlength": "{field|upper} must have at least {requiredlength} item(s).", + "validation.minlengthstring": "{field|upper} must have at least {requiredlength} character(s).", + "validation.pattern": "{field|upper} does not match to the pattern.", + "validation.patternmessage": "{message}", + "validation.required": "{field|upper} is required.", + "validation.requiredTrue": "{field|upper} is required.", + "validation.uniquestrings": "{field|upper} must not contain duplicate values.", + "validation.validarrayvalues": "{field|upper} contains an invalid value: {invalidvalue}.", + "validation.validdatetime": "{field|upper} is not a valid date time.", + "validation.validvalues": "{field|upper} is not a valid value.", + "workflows.add": "Add Workflow", + "workflows.addStep": "Add Step", + "workflows.createFailed": "Failed to create workflow. Please reload.", + "workflows.deleteConfirmText": "Do you really want to remove the workflow?", + "workflows.deleteConfirmTitle": "Delete workflow", + "workflows.deleteFailed": "Failed to delete Workflow. Please reload.", + "workflows.empty": "No workflows created yet.", + "workflows.loadFailed": "Failed to load workflows. Please reload.", + "workflows.notNamed": "Unnamed Workflow", + "workflows.preventUpdates": "Prevent updates", + "workflows.publishedNotRemovable": "Cannot be removed", + "workflows.refreshTooltip": "Refresh workflows (CTRL + SHIFT + R)", + "workflows.reloaded": "Workflows reloaded.", + "workflows.saved": "Workflow has been saved.", + "workflows.schemasHint": "Restrict this workflow to specific schemas or keep it empty for all schemas.", + "workflows.syntax.expression": "Expression", + "workflows.syntax.for": "for", + "workflows.syntax.when": "when", + "workflows.tabEdit": "Editing", + "workflows.tabVisualize": "Visualize", + "workflows.updateFailed": "Failed to update Workflow. Please reload.", + "workflows.workflowNameHint": "Optional name for the workflow.", + "workflows.workflowNamePlaceholder": "Enter workflow name" +} \ No newline at end of file diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppWorkflows.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppWorkflows.cs index 48b4553b0..c44870a2e 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppWorkflows.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppWorkflows.cs @@ -59,7 +59,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards if (!workflow.Steps.ContainsKey(Status.Published)) { - e(T.Get("apps.workflows.initialNotPublished"), stepsPrefix); + e(T.Get("workflows.initialNotPublished"), stepsPrefix); } foreach (var step in workflow.Steps) @@ -78,7 +78,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards if (!workflow.Steps.ContainsKey(status)) { - e(T.Get("apps.workflows.publishedStepNotFound"), transitionPrefix); + e(T.Get("workflows.publishedStepNotFound"), transitionPrefix); } if (transition == null) diff --git a/backend/src/Squidex.Infrastructure/Validation/AbsoluteUrlAttribute.cs b/backend/src/Squidex.Infrastructure/Validation/AbsoluteUrlAttribute.cs index a00f74188..b8945dfa9 100644 --- a/backend/src/Squidex.Infrastructure/Validation/AbsoluteUrlAttribute.cs +++ b/backend/src/Squidex.Infrastructure/Validation/AbsoluteUrlAttribute.cs @@ -17,7 +17,7 @@ namespace Squidex.Infrastructure.Validation { var property = T.Get($"common.{name.ToCamelCase()}", name); - return T.Get("annotations_absoluteUrl", new { property }); + return T.Get("aspnet_annotations_AbsoluteUrl", new { property }); } public override bool IsValid(object value) diff --git a/backend/src/Squidex.Shared/Texts.resx b/backend/src/Squidex.Shared/Texts.resx index 845ecd193..b891291b1 100644 --- a/backend/src/Squidex.Shared/Texts.resx +++ b/backend/src/Squidex.Shared/Texts.resx @@ -130,21 +130,6 @@ Cannot remove a role when a contributor is assigned. - - Workflow must have a published step. - - - Transition has an invalid target. - - - The field {0} must be an absolute URL. - - - The field {0} must be the same as {1}. - - - The field {0} is required. - Asset has already been deleted @@ -220,6 +205,9 @@ Field IDs + + Field name + File @@ -730,9 +718,6 @@ Schema field is locked. - - Field name - A field with the same name already exists. @@ -997,6 +982,9 @@ {property|upper} must be less than {other|lower}. + + Picture is not a valid image. + Can only upload one file. @@ -1015,15 +1003,15 @@ {property|upper} is not a valid value. - - Picture is not a valid image. - Initial step cannot be published step. Multiple workflows cover all schemas. + + Transition has an invalid target. + The schema '{schema}' is covered by multiple workflows. diff --git a/backend/src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs b/backend/src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs index 9a61a942c..df7327fbd 100644 --- a/backend/src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs +++ b/backend/src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs @@ -82,7 +82,7 @@ namespace Squidex.Areas.Frontend.Middlewares { var assembly = typeof(IndexExtensions).Assembly; - var resourceName = $"Squidex.Areas.Frontend.Resources.texts_{culture}.json"; + var resourceName = $"Squidex.Areas.Frontend.Resources.frontend_{culture}.json"; var resourceStream = assembly.GetManifestResourceStream(resourceName); if (resourceStream != null) diff --git a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ProfileController.cs b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ProfileController.cs index 4aa400bc4..8b98e7ca2 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ProfileController.cs +++ b/backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ProfileController.cs @@ -182,7 +182,7 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile } catch { - return IdentityResult.Failed(new IdentityError { Description = T.Get("valiodation.notAnImage") }); + return IdentityResult.Failed(new IdentityError { Description = T.Get("validation.notAnImage") }); } await userPictureStore.UploadAsync(user.Id, thumbnailStream); diff --git a/backend/src/Squidex/Squidex.csproj b/backend/src/Squidex/Squidex.csproj index 34d51f88b..f8a1e4f35 100644 --- a/backend/src/Squidex/Squidex.csproj +++ b/backend/src/Squidex/Squidex.csproj @@ -124,7 +124,7 @@ - + diff --git a/frontend/app/app.module.ts b/frontend/app/app.module.ts index 856292303..5b1634de6 100644 --- a/frontend/app/app.module.ts +++ b/frontend/app/app.module.ts @@ -57,7 +57,7 @@ export function configTranslations() { if (process.env.NODE_ENV === 'production') { return new LocalizerService(window['texts']); } else { - return new LocalizerService(require('./../i18n/texts_en.json')).logMissingKeys(); + return new LocalizerService(require('./../backend/i18n/frontend_en.json')).logMissingKeys(); } } diff --git a/frontend/app/features/schemas/pages/schema/fields/field.component.html b/frontend/app/features/schemas/pages/schema/fields/field.component.html index 9db01db8c..12c15e90e 100644 --- a/frontend/app/features/schemas/pages/schema/fields/field.component.html +++ b/frontend/app/features/schemas/pages/schema/fields/field.component.html @@ -14,7 +14,7 @@ - {{field.displayName}} + {{field.displayName}} {{ 'schemas.field.localizableMarker' | sqxTranslate }} diff --git a/i18n/translate.bat b/i18n/translate.bat deleted file mode 100644 index 5bd7f4c21..000000000 --- a/i18n/translate.bat +++ /dev/null @@ -1,2 +0,0 @@ -cd translator\Squidex.Translator -dotnet run translate gen-backend D:\Squidex