diff --git a/docs/en/Concurrency-Check.md b/docs/en/Concurrency-Check.md index e22afe82b8..9bad5f816f 100644 --- a/docs/en/Concurrency-Check.md +++ b/docs/en/Concurrency-Check.md @@ -1,3 +1,147 @@ ## Concurrency Check -TODO \ No newline at end of file +### Introduction + +Concurrency Check (also known as **Concurrency Control**) refers to specific mechanisms used to ensure data consistency in the presence of concurrent changes (multiple processes, users access or change the same data in a database at the same time). + +There are two commonly used concurrency control mechanisms/approaches: +* **Optimistic Concurrency Control**: Optimistic Concurrency Control allows multiple users to attempt to **update** the same record without informing the users that others are also attempting to **update** it. + + * If a user successfully updates the record, the other users need to get the latest changes for the current record to be able to make changes. + * ABP's concurrency check system uses the **Optimistic Concurrency Control**. + +* **Pessimistic Concurrency Control**: Pessimistic Concurrency Control prevents simultaneous updates to records and uses a locking mechanism. For more information please see [here](https://www.martinfowler.com/eaaCatalog/pessimisticOfflineLock.html). + +### Usage + +#### `IHasConcurrencyStamp` Interface + +To enable **concurrency control** to your entity class, you should implement the `IHasConcurrencyStamp` interface, directly or indirectly. + +```csharp +public interface IHasConcurrencyStamp +{ + public string ConcurrencyStamp { get; set; } +} +``` + +* It is the base interface for **concurrency control** and only has a simple property named `ConcurrencyStamp`. +* While a new record is **creating**, if the entity implements the `IHasConcurrencyStamp` interface, ABP Framework automatically sets a unique value to the **ConcurrencyStamp** property. +* While a record is **updating**, ABP Framework compares the **ConcurrencyStamp** property of the entity with the provided **ConcurrencyStamp** value by the user and if the values match, it automatically updates the **ConcurrencyStamp** property with the new unique value. If there is a mismatch, `AbpDbConcurrencyException` is thrown. + +**Example: Applying Concurrency Control for the Book Entity** + +Implement the `IHasConcurrencyStamp` interface for your entity: + +```csharp +public class Book : Entity, IHasConcurrencyStamp +{ + public string ConcurrencyStamp { get; set; } + + //... +} +``` + +Also, implement your output and update the DTO classes from the `IHasConcurrencyStamp` interface: + +```csharp +public class BookDto : EntityDto, IHasConcurrencyStamp +{ + //... + + public string ConcurrencyStamp { get; set; } +} + +public class UpdateBookDto : IHasConcurrencyStamp +{ + //... + + public string ConcurrencyStamp { get; set; } +} +``` + +Set the **ConcurrencyStamp** input value to the entity in the **UpdateAsync** method of your application service, for that purpose you can use the `SetConcurrencyStampIfNotNull` method as below: + +```csharp +public class BookAppService : ApplicationService, IBookAppService +{ + //... + + public virtual async Task UpdateAsync(Guid id, UpdateBookDto input) + { + var book = await BookRepository.GetAsync(id); + + book.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); + + //set other input values to the entity ... + + await BookRepository.UpdateAsync(book); + } +} +``` + +* After that, when multiple users try to update the same record at the same time, the concurrency stamp mismatch occurs and `AbpDbConcurrencyException` is thrown. + +#### Base Classes + +[Aggregate Root](./Entities.md#aggregateroot-class) entity classes already implement the `IHasConcurrencyStamp` interface. So, if you are deriving from one of these base classes, you don't need to manually implement the `IHasConcurrencyStamp` interface: + +- `AggregateRoot`, `AggregateRoot` +- `CreationAuditedAggregateRoot`, `CreationAuditedAggregateRoot` +- `AuditedAggregateRoot`, `AuditedAggregateRoot` +- `FullAuditedAggregateRoot`, `FullAuditedAggregateRoot` + +**Example: Applying Concurrency Control for the Book Entity** + +You can inherit your entity from one of [the base classes](#base-classes): + +```csharp +public class Book : FullAuditedAggregateRoot +{ + //... +} +``` + +Then, you can implement your output and update the DTO classes from the `IHasConcurrencyStamp` interface: + +```csharp +public class BookDto : EntityDto, IHasConcurrencyStamp +{ + //... + + public string ConcurrencyStamp { get; set; } +} + +public class UpdateBookDto : IHasConcurrencyStamp +{ + //... + + public string ConcurrencyStamp { get; set; } +} +``` + +Set the **ConcurrencyStamp** input value to the entity in the **UpdateAsync** method of your application service, for that purpose you can use the `SetConcurrencyStampIfNotNull` method as below: + +```csharp +public class BookAppService : ApplicationService, IBookAppService +{ + //... + + public virtual async Task UpdateAsync(Guid id, UpdateBookDto input) + { + var book = await BookRepository.GetAsync(id); + + book.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); + + //set other input values to the entity ... + + await BookRepository.UpdateAsync(book); + } +} +``` + +After that, when multiple users try to update the same record at the same time, the concurrency stamp mismatch occurs and `AbpDbConcurrencyException` is thrown. You can either handle the exception manually or let the ABP Framework handle it for you. + +ABP Framework shows a user-friendly error message as in the image below, if you don't handle the exception manually. + +![Optimistic Concurrency](./images/optimistic-concurrency.png) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 710ad2d45e..15f93b86c6 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -284,10 +284,18 @@ } ] }, + { + "text": "Cancellation Token Provider", + "path": "Cancellation-Token-Provider.md" + }, { "text": "CSRF/XSRF & Anti Forgery", "path": "CSRF-Anti-Forgery.md" }, + { + "text": "Concurrency Check", + "path": "Concurrency-Check.md" + }, { "text": "Current User", "path": "CurrentUser.md" @@ -317,10 +325,6 @@ } ] }, - { - "text": "SMS Sending", - "path": "SMS-Sending.md" - }, { "text": "Event Bus", "items": [ @@ -356,10 +360,6 @@ } ] }, - { - "text": "JSON", - "path": "JSON.md" - }, { "text": "Features", "path": "Features.md" @@ -372,10 +372,22 @@ "text": "GUID Generation", "path": "Guid-Generation.md" }, + { + "text": "JSON", + "path": "JSON.md" + }, { "text": "Object to Object Mapping", "path": "Object-To-Object-Mapping.md" }, + { + "text": "Simple State Checker", + "path": "SimpleStateChecker.md" + }, + { + "text": "SMS Sending", + "path": "SMS-Sending.md" + }, { "text": "String Encryption", "path": "String-Encryption.md" @@ -401,14 +413,6 @@ { "text": "Virtual File System", "path": "Virtual-File-System.md" - }, - { - "text": "Cancellation Token Provider", - "path": "Cancellation-Token-Provider.md" - }, - { - "text": "Simple State Checker", - "path": "SimpleStateChecker.md" } ] }, diff --git a/docs/en/images/optimistic-concurrency.png b/docs/en/images/optimistic-concurrency.png new file mode 100644 index 0000000000..85253594c8 Binary files /dev/null and b/docs/en/images/optimistic-concurrency.png differ diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json index e5c709b951..173166135b 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "تم تغيير كلمة مرورك بنجاح.", "PersonalSettingsSavedMessage": "تم حفظ إعداداتك الشخصية بنجاح.", "Volo.Abp.Identity:DefaultError": "حدث خطأ.", - "Volo.Abp.Identity:ConcurrencyFailure": "فشل التزامن المتفائل ، تم تعديل الكائن.", + "Volo.Abp.Identity:ConcurrencyFailure": "فشل التحقق من التزامن المتفائل. تم تعديل الكيان الذي تعمل عليه بواسطة مستخدم آخر. الرجاء تجاهل التغييرات الخاصة بك وحاول مرة أخرى.", "Volo.Abp.Identity:DuplicateEmail": "البريد الإلكتروني '{0}' مستخدم بالفعل.", "Volo.Abp.Identity:DuplicateRoleName": "اسم الدور '{0}' مأخوذ بالفعل.", "Volo.Abp.Identity:DuplicateUserName": "اسم المستخدم '{0}' مأخوذ بالفعل.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json index f209355b43..37e49117ce 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Vaše heslo bylo úspěšně změněno.", "PersonalSettingsSavedMessage": "Vaše osobní nastavení bylo úspěšně uloženo.", "Volo.Abp.Identity:DefaultError": "Došlo k neznámé chybě.", - "Volo.Abp.Identity:ConcurrencyFailure": "Selhání optimistické souběžnosti, objekt byl změněn.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optimistická kontrola souběžnosti se nezdařila. Entita, na které pracujete, byla změněna jiným uživatelem. Zahoďte změny a zkuste to znovu.", "Volo.Abp.Identity:DuplicateEmail": "Email '{0}' již existuje.", "Volo.Abp.Identity:DuplicateRoleName": "Role '{0}' již existuje.", "Volo.Abp.Identity:DuplicateUserName": "Uživatelské jméno '{0}' již existuje.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de-DE.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de-DE.json index cb927227ea..c489832a7c 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de-DE.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de-DE.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.", "PersonalSettingsSavedMessage": "Ihre persönlichen Einstellungen wurden erfolgreich gespeichert.", "Volo.Abp.Identity:DefaultError": "Ein unbekannter Fehler ist aufgetreten.", - "Volo.Abp.Identity:ConcurrencyFailure": "Optimitic Concurrency-Fehler, Objekt wurde geändert.", + "Volo.Abp.Identity:ConcurrencyFailure": "Die optimistische Gleichzeitigkeitsprüfung ist fehlgeschlagen. Die Entität, an der Sie arbeiten, wurde von einem anderen Benutzer geändert. Bitte verwerfen Sie Ihre Änderungen und versuchen Sie es erneut.", "Volo.Abp.Identity:DuplicateEmail": "E-Mail '{0}' ist bereits vergeben.", "Volo.Abp.Identity:DuplicateRoleName": "Der Rollenname '{0}' ist bereits vergeben.", "Volo.Abp.Identity:DuplicateUserName": "Der Benutzername '{0}' ist bereits vergeben.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json index a8da0baae1..c42db49981 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json @@ -36,7 +36,7 @@ "PasswordChangedMessage": "Ihr Passwort wurde erfolgreich geändert.", "PersonalSettingsSavedMessage": "Ihre persönlichen Einstellungen wurden erfolgreich gespeichert.", "Volo.Abp.Identity:DefaultError": "Ein unbekannter Fehler ist aufgetreten.", - "Volo.Abp.Identity:ConcurrencyFailure": "Optimistischer Nebenläufigkeitsfehler, Objekt wurde geändert.", + "Volo.Abp.Identity:ConcurrencyFailure": "Die optimistische Gleichzeitigkeitsprüfung ist fehlgeschlagen. Die Entität, an der Sie arbeiten, wurde von einem anderen Benutzer geändert. Bitte verwerfen Sie Ihre Änderungen und versuchen Sie es erneut.", "Volo.Abp.Identity:DuplicateEmail": "E-Mail '{0}' ist bereits vergeben.", "Volo.Abp.Identity:DuplicateRoleName": "Der Rollenname '{0}' ist bereits vergeben.", "Volo.Abp.Identity:DuplicateUserName": "Der Benutzername '{0}' ist bereits vergeben.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json index ef9a64e982..3dadb593af 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json @@ -36,7 +36,7 @@ "PasswordChangedMessage": "Your password has been changed successfully.", "PersonalSettingsSavedMessage": "Your personal settings has been saved successfully.", "Volo.Abp.Identity:DefaultError": "An unknown failure has occurred.", - "Volo.Abp.Identity:ConcurrencyFailure": "Optimistic concurrency failure, object has been modified.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optimistic concurrency check has been failed. The entity you're working on has modified by another user. Please discard your changes and try again.", "Volo.Abp.Identity:DuplicateEmail": "Email '{0}' is already taken.", "Volo.Abp.Identity:DuplicateRoleName": "Role name '{0}' has already been taken.", "Volo.Abp.Identity:DuplicateUserName": "Username '{0}' has already been taken.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json index f01681e69f..d0485b1e93 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Your password has been changed successfully.", "PersonalSettingsSavedMessage": "Your personal settings has been saved successfully.", "Volo.Abp.Identity:DefaultError": "An unknown failure has occurred.", - "Volo.Abp.Identity:ConcurrencyFailure": "Optimistic concurrency failure, object has been modified.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optimistic concurrency check has been failed. The entity you're working on has modified by another user. Please discard your changes and try again.", "Volo.Abp.Identity:DuplicateEmail": "Email '{0}' is already taken.", "Volo.Abp.Identity:DuplicateRoleName": "Role name '{0}' is already taken.", "Volo.Abp.Identity:DuplicateUserName": "Username '{0}' is already taken.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json index f57f679053..e3e1fddc31 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Tu contraseña ha sido cambiada satisfactoriamente.", "PersonalSettingsSavedMessage": "Tu configuración personal ha sido guardada satisfactoriamente.", "Volo.Abp.Identity:DefaultError": "Error desconocido.", - "Volo.Abp.Identity:ConcurrencyFailure": "Fallo de concurrencia optimista", + "Volo.Abp.Identity:ConcurrencyFailure": "Se ha producido un error en la comprobación de simultaneidad optimista. La entidad en la que está trabajando ha sido modificada por otro usuario. Descarte los cambios y vuelva a intentarlo.", "Volo.Abp.Identity:DuplicateEmail": "E-mail '{0}' está en uso.", "Volo.Abp.Identity:DuplicateRoleName": "El nombre de rol '{0}' ya está en uso.", "Volo.Abp.Identity:DuplicateUserName": "El nombre de usuario '{0}' ya está en uso.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json index 1bcf4fe404..9d7d2b4b85 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Salasanasi on vaihdettu onnistuneesti.", "PersonalSettingsSavedMessage": "Henkilökohtaiset asetuksesi on tallennettu.", "Volo.Abp.Identity:DefaultError": "Tuntematon vika on tapahtunut.", - "Volo.Abp.Identity:ConcurrencyFailure": "Optimistinen samanaikaisuuden epäonnistuminen, kohdetta on muokattu.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optimistinen samanaikaisuuden tarkistus epäonnistui. Toinen käyttäjä on muokannut entiteettiä, jonka parissa työskentelet. Hylkää muutokset ja yritä uudelleen.", "Volo.Abp.Identity:DuplicateEmail": "Sähköposti {0} on jo otettu.", "Volo.Abp.Identity:DuplicateRoleName": "Roolin nimi {0} on jo otettu.", "Volo.Abp.Identity:DuplicateUserName": "Käyttäjätunnus {0} on jo otettu.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json index 44d4b0cfe4..d34a0568a9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Votre mot de passe a été modifié avec succès.", "PersonalSettingsSavedMessage": "Vos paramètres personnels ont été enregistrés avec succès.", "Volo.Abp.Identity:DefaultError": "Une défaillance inconnue s’est produite.", - "Volo.Abp.Identity:ConcurrencyFailure": "Échec optimiste de la concurrence, l’objet a été modifié.", + "Volo.Abp.Identity:ConcurrencyFailure": "La vérification de la simultanéité optimiste a échoué. L'entité sur laquelle vous travaillez a été modifiée par un autre utilisateur. Veuillez annuler vos modifications et réessayer.", "Volo.Abp.Identity:DuplicateEmail": "E-mail '{0}' est déjà prise.", "Volo.Abp.Identity:DuplicateRoleName": "Le nom de rôle '{0}' est déjà pris.", "Volo.Abp.Identity:DuplicateUserName": "Le nom d’utilisateur '{0}' est déjà pris.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json index c26d9eb22b..9e31f898d5 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "तुम्हारा पासवर्ड सफलतापूर्वक बदल दिया गया है।", "PersonalSettingsSavedMessage": "आपकी व्यक्तिगत सेटिंग्स सफलतापूर्वक सहेज ली गई हैं।", "Volo.Abp.Identity:DefaultError": "एक अज्ञात विफलता हुई है।", - "Volo.Abp.Identity:ConcurrencyFailure": "आशावादी संगरोध विफलता, ऑब्जेक्ट संशोधित किया गया है।", + "Volo.Abp.Identity:ConcurrencyFailure": "आशावादी समवर्ती जाँच विफल हो गई है। आप जिस निकाय पर काम कर रहे हैं, उसे किसी अन्य उपयोगकर्ता द्वारा संशोधित किया गया है। कृपया अपने परिवर्तन त्यागें और पुनः प्रयास करें।", "Volo.Abp.Identity:DuplicateEmail": "ईमेल '{0}' पहले से ही लिया गया है।", "Volo.Abp.Identity:DuplicateRoleName": "भूमिका नाम '{0}' पहले से ही लिया गया है।", "Volo.Abp.Identity:DuplicateUserName": "उपयोगकर्ता नाम '{0}' पहले से ही लिया गया है।", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json index 397d7456d4..d63b3f5b76 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Jelszavát sikeresen megváltoztattuk.", "PersonalSettingsSavedMessage": "Személyes beállításait sikeresen mentette.", "Volo.Abp.Identity:DefaultError": "Ismeretlen hiba történt.", - "Volo.Abp.Identity:ConcurrencyFailure": "Optimista párhuzamossági hiba, az objektum módosult.", + "Volo.Abp.Identity:ConcurrencyFailure": "Az optimista párhuzamosság-ellenőrzés sikertelen. Az entitást, amelyen dolgozik, egy másik felhasználó módosította. Kérjük, dobja el a módosításokat, és próbálja újra.", "Volo.Abp.Identity:DuplicateEmail": "Az '{0}' email cím már foglalt.", "Volo.Abp.Identity:DuplicateRoleName": "Szerepkör neve '{0}' foglalt.", "Volo.Abp.Identity:DuplicateUserName": "'{0}' felahsználónév foglalt.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json index c987bbfc10..196bda39e6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Lykilorðinu þínu hefur verið breytt.", "PersonalSettingsSavedMessage": "Stillingarnar þínar hafa verið vistaðar", "Volo.Abp.Identity:DefaultError": "Óþekkt villa hefur komið upp.", - "Volo.Abp.Identity:ConcurrencyFailure": "Bjartsýn samhliða bilun, hlut hefur verið breytt.", + "Volo.Abp.Identity:ConcurrencyFailure": "Bjartsýn samhliðaskoðun hefur mistekist. Einingin sem þú ert að vinna á hefur breytt af öðrum notanda. Vinsamlegast fargaðu breytingunum og reyndu aftur.", "Volo.Abp.Identity:DuplicateEmail": "Netfang '{0}' er nú þegar í notkun.", "Volo.Abp.Identity:DuplicateRoleName": "Hlutverkanafn '{0}' nú þegar til.", "Volo.Abp.Identity:DuplicateUserName": "Notandanafn '{0}' er nú þegar í notkun.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json index 7552b6cb75..729061108d 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "La tua password è stata modificata con successo.", "PersonalSettingsSavedMessage": "Le tue impostazioni personali sono state salvate con successo.", "Volo.Abp.Identity:DefaultError": "Si è verificato un errore sconosciuto.", - "Volo.Abp.Identity:ConcurrencyFailure": "Errore di concorrenza ottimistica, l'oggetto è stato modificato.", + "Volo.Abp.Identity:ConcurrencyFailure": "Il controllo della concorrenza ottimistica non è riuscito. L'entità su cui stai lavorando è stata modificata da un altro utente. Annulla le modifiche e riprova.", "Volo.Abp.Identity:DuplicateEmail": "L'email '{0}' è già stata accettata.", "Volo.Abp.Identity:DuplicateRoleName": "Il nome del ruolo '{0}' è già stato utilizzato.", "Volo.Abp.Identity:DuplicateUserName": "Il nome utente '{0}' è già in uso.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json index 9fe1d23e08..63755a66d1 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Uw wachtwoord is met succes veranderd.", "PersonalSettingsSavedMessage": "Uw persoonlijke instellingen zijn succesvol opgeslagen.", "Volo.Abp.Identity:DefaultError": "Er is een onbekende fout opgetreden.", - "Volo.Abp.Identity:ConcurrencyFailure": "Optimistische gelijktijdigheidsfout, object is al gewijzigd.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optimistische gelijktijdigheidscontrole is mislukt. De entiteit waaraan u werkt, is gewijzigd door een andere gebruiker. Negeer uw wijzigingen en probeer het opnieuw.", "Volo.Abp.Identity:DuplicateEmail": "E-mail '{0}' is al in gebruik.", "Volo.Abp.Identity:DuplicateRoleName": "De rol naam '{0}' is al in gebruik.", "Volo.Abp.Identity:DuplicateUserName": "Gebruikersnaam '{0}' is al in gebruik.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json index 08551b5615..2ca4863845 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Twoje hasło zostało zmienione pomyślnie.", "PersonalSettingsSavedMessage": "Twoje personalne ustawienia zostały zapisane pomyślnie.", "Volo.Abp.Identity:DefaultError": "Wystąpił niespodziewany błąd.", - "Volo.Abp.Identity:ConcurrencyFailure": "Optymistyczny błąd współbierzności, obiekt został zmodyfikowany.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optymistyczne sprawdzenie współbieżności nie powiodło się. Jednostka, nad którą pracujesz, została zmodyfikowana przez innego użytkownika. Odrzuć zmiany i spróbuj ponownie.", "Volo.Abp.Identity:DuplicateEmail": "Email '{0}' już istnieje.", "Volo.Abp.Identity:DuplicateRoleName": "Rola '{0}' już istnieje.", "Volo.Abp.Identity:DuplicateUserName": "Nazwa użytkownika '{0}' już istnieje.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json index 61e9d5b661..1701a17613 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Sua senha foi alterada com sucesso.", "PersonalSettingsSavedMessage": "Suas configurações pessoais foram salvas com sucesso.", "Volo.Abp.Identity:DefaultError": "Ocorreu uma falha desconhecida.", - "Volo.Abp.Identity:ConcurrencyFailure": "Falha de concorrência otimista, o objeto foi modificado.", + "Volo.Abp.Identity:ConcurrencyFailure": "A verificação de simultaneidade otimista falhou. A entidade em que você está trabalhando foi modificada por outro usuário. Por favor, descarte suas alterações e tente novamente.", "Volo.Abp.Identity:DuplicateEmail": "O e-mail '{0}' já está em uso.", "Volo.Abp.Identity:DuplicateRoleName": "O nome de perfil '{0}' já está em uso.", "Volo.Abp.Identity:DuplicateUserName": "O usuário '{0}' já está em uso.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json index 03e0c875de..85b549a646 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Parola dumneavoastră a fost schimbată cu succes.", "PersonalSettingsSavedMessage": "Setările personale ale dumneavoastră au fost salvate cu succes.", "Volo.Abp.Identity:DefaultError": "A intervenit o eroare neaşteptată.", - "Volo.Abp.Identity:ConcurrencyFailure": "Eşec concurenţial optimist, obiectul a fost modificat.", + "Volo.Abp.Identity:ConcurrencyFailure": "Verificarea optimistă a concurenței a eșuat. Entitatea la care lucrați a fost modificată de un alt utilizator. Vă rugăm să renunțați la modificări și să încercați din nou.", "Volo.Abp.Identity:DuplicateEmail": "Emailul '{0}' este deja luat.", "Volo.Abp.Identity:DuplicateRoleName": "Numele de rol '{0}' este deja luat.", "Volo.Abp.Identity:DuplicateUserName": "Numele de utilizator '{0}' este deja luat.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json index f84c574ac4..817474e47d 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Ваш пароль был успешно изменен.", "PersonalSettingsSavedMessage": "Ваши персональные настройки были успешно сохранены.", "Volo.Abp.Identity:DefaultError": "Возникла непредвиденная ошибка.", - "Volo.Abp.Identity:ConcurrencyFailure": "Ошибка оптимального управления многопоточностью, объект был изменен.", + "Volo.Abp.Identity:ConcurrencyFailure": "Проверка оптимистического параллелизма не удалась. Объект, над которым вы работаете, был изменен другим пользователем. Отмените изменения и повторите попытку.", "Volo.Abp.Identity:DuplicateEmail": "Электронная почта '{0}' уже зарегистрирована.", "Volo.Abp.Identity:DuplicateRoleName": "Имя роли '{0}' уже занято.", "Volo.Abp.Identity:DuplicateUserName": "Имя пользователя '{0}' уже занято.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json index 34671cfa19..57beb70419 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Vaše heslo bolo úspešne zmenené.", "PersonalSettingsSavedMessage": "Vaše osobné nastavenia boli úspešne uložené.", "Volo.Abp.Identity:DefaultError": "Došlo k neznámej chybe.", - "Volo.Abp.Identity:ConcurrencyFailure": "Zlyhanie v dôsledku súbežných akcií, objekt už bol upravený.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optimistická kontrola súbežnosti zlyhala. Entita, na ktorej pracujete, bola upravená iným používateľom. Zahoďte zmeny a skúste to znova.", "Volo.Abp.Identity:DuplicateEmail": "Email '{0}' sa už používa.", "Volo.Abp.Identity:DuplicateRoleName": "Názov roly '{0}' sa už používa.", "Volo.Abp.Identity:DuplicateUserName": "Užívateľské meno '{0}' sa už používa.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json index fe2b9c3cc8..8181130e22 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Vaše geslo je bilo uspešno spremenjeno.", "PersonalSettingsSavedMessage": "Vaše osebne nastavitve so bile uspešno shranjene.", "Volo.Abp.Identity:DefaultError": "Zgodila se je neznana napaka.", - "Volo.Abp.Identity:ConcurrencyFailure": "Napaka pri optimistični sočasnosti, objekt je bil spremenjen.", + "Volo.Abp.Identity:ConcurrencyFailure": "Optimistično preverjanje sočasnosti ni uspelo. Entitet, na katerem delate, je spremenil drug uporabnik. Zavrzite spremembe in poskusite znova.", "Volo.Abp.Identity:DuplicateEmail": "E-poštni naslov '{0}' je že zaseden.", "Volo.Abp.Identity:DuplicateRoleName": "Naziv vloge '{0}' je že zasedeno.", "Volo.Abp.Identity:DuplicateUserName": "Uporabniško ime '{0}' je že zasedeno.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json index ef14dedff4..b55de9e3a3 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Şifreniz başarıyla değiştirildi.", "PersonalSettingsSavedMessage": "Kişisel bilgileriniz başarıyla kaydedildi.", "Volo.Abp.Identity:DefaultError": "Bilinmeyen bir hata oluştu.", - "Volo.Abp.Identity:ConcurrencyFailure": "İyimser eşzamanlılık hatası. Nesne değiştirilmiş.", + "Volo.Abp.Identity:ConcurrencyFailure": "İyimser eşzamanlılık denetimi başarısız oldu. Üzerinde çalıştığınız varlık başka bir kullanıcı tarafından değiştirildi. Lütfen değişikliklerinizi geri alın ve tekrar deneyin.", "Volo.Abp.Identity:DuplicateEmail": "'{0}' email adresi zaten alınmış.", "Volo.Abp.Identity:DuplicateRoleName": "'{0}' rol ismi zaten alınmış.", "Volo.Abp.Identity:DuplicateUserName": "'{0}' kullanıcı adı zaten alınmış.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json index 76a70597ae..a1de33308a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "Mật khẩu của bạn đã được thay đổi thành công.", "PersonalSettingsSavedMessage": "Thiết lập của bạn đã được lưu lại thành công.", "Volo.Abp.Identity:DefaultError": "Một thất bại chưa biết đã xảy ra.", - "Volo.Abp.Identity:ConcurrencyFailure": "Thất bại đồng thời lạc quan, đối tượng đã được sửa đổi.", + "Volo.Abp.Identity:ConcurrencyFailure": "Kiểm tra đồng thời lạc quan đã không thành công. Thực thể bạn đang làm việc đã bị người dùng khác sửa đổi. Vui lòng hủy các thay đổi của bạn và thử lại.", "Volo.Abp.Identity:DuplicateEmail": "Email '{0}' đã được sử dụng.", "Volo.Abp.Identity:DuplicateRoleName": "Tên vài trò '{0}' đã được sử dụng.", "Volo.Abp.Identity:DuplicateUserName": "User name '{0}' đã được sử dụng.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json index 4e70855f26..228296c0f6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "你已成功更改密码.", "PersonalSettingsSavedMessage": "你的个人设置保存成功.", "Volo.Abp.Identity:DefaultError": "发生了一个未知错误.", - "Volo.Abp.Identity:ConcurrencyFailure": "对象已被修改,乐观并发失败.", + "Volo.Abp.Identity:ConcurrencyFailure": "乐观并发检查失败. 你正在处理的对象已被其他用户修改. 请放弃你的更改, 然后重试.", "Volo.Abp.Identity:DuplicateEmail": "邮箱 '{0}' 已存在.", "Volo.Abp.Identity:DuplicateRoleName": "角色名 '{0}' 已存在.", "Volo.Abp.Identity:DuplicateUserName": "用户名 '{0}' 已存在.", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json index 7ee45887ca..a255929a1a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json @@ -37,7 +37,7 @@ "PasswordChangedMessage": "你已成功更改密碼.", "PersonalSettingsSavedMessage": "你的個人設置保存成功.", "Volo.Abp.Identity:DefaultError": "發生了一個未知錯誤.", - "Volo.Abp.Identity:ConcurrencyFailure": "對象已被修改,因樂觀並行控制導致失敗.", + "Volo.Abp.Identity:ConcurrencyFailure": "樂觀並行控制檢查失敗. 你正在處理的對象已被其他用戶修改. 請放棄你的更改, 然後重試.", "Volo.Abp.Identity:DuplicateEmail": "電子信箱 '{0}' 已存在.", "Volo.Abp.Identity:DuplicateRoleName": "角色名 '{0}' 已存在.", "Volo.Abp.Identity:DuplicateUserName": "使用者名稱 '{0}' 已存在.",