Browse Source

Merge branch 'rel-8.3' into microservice-tutorial

# Conflicts:
#	docs/en/tutorials/microservice/index.md
pull/21456/head
ahmetfarukulu 2 years ago
parent
commit
41ff0d3bfc
  1. 14
      .github/workflows/auto-pr.yml
  2. 18
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/sv.json
  3. 640
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sv.json
  4. 256
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/sv.json
  5. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/sv.json
  6. 1215
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sv.json
  7. 269
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/sv.json
  8. 9
      abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/sv.json
  9. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/sv.json
  10. 1828
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/sv.json
  11. 4
      common.props
  12. 2
      docs/en/Community-Articles/2020-08-18-Using-DevExtreme-Components-With-The-ABP-Framework/Using-DevExtreme-Components-With-The-ABP-Framework.md
  13. 2
      docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/POST.md
  14. 2
      docs/en/Community-Articles/2021-01-20-How-to-Integrate-the-MatBlazor-Blazor-Component/POST.md
  15. 2
      docs/en/Community-Articles/2021-04-22-How-to-Integrate-the-Syncfusion-Blazor-Component/POST.md
  16. 2
      docs/en/Community-Articles/2023-02-22-Streamline-Localization-In-Your-ABP-Project/POST.md
  17. 2
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/Post.md
  18. 5
      docs/en/cli/index.md
  19. 60
      docs/en/deployment/clustered-environment.md
  20. 6
      docs/en/deployment/configuring-openIddict.md
  21. 37
      docs/en/deployment/configuring-production.md
  22. 12
      docs/en/deployment/distributed-microservice.md
  23. 4
      docs/en/deployment/index.md
  24. 20
      docs/en/deployment/optimizing-production.md
  25. 12
      docs/en/deployment/ssl.md
  26. 170
      docs/en/docs-nav.json
  27. 1
      docs/en/docs-params.json
  28. 2
      docs/en/framework/api-development/index.md
  29. 2
      docs/en/framework/api-development/standard-apis/index.md
  30. 2
      docs/en/framework/architecture/best-practices/application-layer-overview.md
  31. 2
      docs/en/framework/architecture/best-practices/data-access-overview.md
  32. 2
      docs/en/framework/architecture/best-practices/domain-layer-overview.md
  33. 2
      docs/en/framework/architecture/domain-driven-design/application-layer.md
  34. 2
      docs/en/framework/architecture/domain-driven-design/domain-layer.md
  35. 2
      docs/en/framework/architecture/modularity/basics.md
  36. 2
      docs/en/framework/architecture/modularity/extending/module-entity-extensions.md
  37. 4
      docs/en/framework/data/entity-framework-core/migrations.md
  38. 8
      docs/en/framework/fundamentals/dynamic-claims.md
  39. 8
      docs/en/framework/fundamentals/exception-handling.md
  40. 2
      docs/en/framework/fundamentals/index.md
  41. 4
      docs/en/framework/fundamentals/localization.md
  42. 2
      docs/en/framework/infrastructure/audit-logging.md
  43. 25
      docs/en/framework/infrastructure/event-bus/index.md
  44. 2
      docs/en/framework/infrastructure/index.md
  45. 2
      docs/en/framework/infrastructure/json.md
  46. 12
      docs/en/framework/ui/angular/account-module.md
  47. 2
      docs/en/framework/ui/angular/current-user.md
  48. 6
      docs/en/framework/ui/angular/datetime-format-pipe.md
  49. 143
      docs/en/framework/ui/angular/entity-filters.md
  50. 16
      docs/en/framework/ui/angular/environment.md
  51. 4
      docs/en/framework/ui/angular/http-error-handling.md
  52. BIN
      docs/en/framework/ui/angular/images/angular-advanced-entity-filters-with-custom-content-above-filter.png
  53. BIN
      docs/en/framework/ui/angular/images/angular-advanced-entity-filters-with-form.png
  54. BIN
      docs/en/framework/ui/angular/images/angular-advanced-entity-filters-without-form.png
  55. BIN
      docs/en/framework/ui/angular/images/angular-advanced-entity-filters.png
  56. BIN
      docs/en/framework/ui/angular/images/angular-lookup-select.gif
  57. BIN
      docs/en/framework/ui/angular/images/angular-lookup-typeahead.gif
  58. BIN
      docs/en/framework/ui/angular/images/grouped-menu-mobile.png
  59. BIN
      docs/en/framework/ui/angular/images/grouped-menu.png
  60. BIN
      docs/en/framework/ui/angular/images/manage-profile-page-new-tab.png
  61. BIN
      docs/en/framework/ui/angular/images/manage-profile-page.png
  62. 4
      docs/en/framework/ui/angular/localization.md
  63. 98
      docs/en/framework/ui/angular/lookup-components.md
  64. 77
      docs/en/framework/ui/angular/manage-profile-page-tabs.md
  65. 13
      docs/en/framework/ui/angular/modifying-the-menu.md
  66. 14
      docs/en/framework/ui/angular/overview.md
  67. 2
      docs/en/framework/ui/angular/quick-start.md
  68. 2
      docs/en/framework/ui/angular/sorting-navigation-elements.md
  69. 2
      docs/en/framework/ui/blazor/branding.md
  70. 2
      docs/en/framework/ui/blazor/components/submit-button.md
  71. 2
      docs/en/framework/ui/index.md
  72. 2
      docs/en/framework/ui/mvc-razor-pages/basic-theme.md
  73. 2
      docs/en/framework/ui/mvc-razor-pages/branding.md
  74. 6
      docs/en/get-started/console.md
  75. BIN
      docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png
  76. BIN
      docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options.png
  77. 4
      docs/en/get-started/index.md
  78. 14
      docs/en/get-started/layered-web-application.md
  79. 2
      docs/en/get-started/microservice.md
  80. 6
      docs/en/get-started/wpf.md
  81. 32
      docs/en/guides/ms-multi-tenant-domain-resolving.md
  82. BIN
      docs/en/images/abp-overall-diagram-1600.png
  83. BIN
      docs/en/images/pen-test-alert-list-8.3.png
  84. BIN
      docs/en/images/suite-add-existing-solution-8.3.png
  85. 11
      docs/en/index.md
  86. 22
      docs/en/modules/account/impersonation.md
  87. 6
      docs/en/modules/chat.md
  88. 2
      docs/en/modules/cms-kit-pro/index.md
  89. 4
      docs/en/modules/docs.md
  90. 12
      docs/en/modules/gdpr.md
  91. 2
      docs/en/modules/openiddict-pro.md
  92. 4
      docs/en/modules/openiddict.md
  93. 2
      docs/en/modules/tenant-management.md
  94. 120
      docs/en/others/penetration-test-report.md
  95. 2
      docs/en/release-info/index.md
  96. 63
      docs/en/release-info/migration-guides/abp-8-2.md
  97. 18
      docs/en/release-info/migration-guides/abp-8-3.md
  98. 1
      docs/en/release-info/migration-guides/pro/openiddict-mvc.md
  99. 4
      docs/en/release-info/upgrading.md
  100. 22
      docs/en/samples/index.md

14
.github/workflows/auto-pr.yml

@ -1,4 +1,4 @@
name: Merge branch dev with rel-8.3
name: Merge branch rel-9.0 with rel-8.3
on:
push:
branches:
@ -7,7 +7,7 @@ permissions:
contents: read
jobs:
merge-dev-with-rel-8-3:
merge-rel-9-0-with-rel-8-3:
permissions:
contents: write # for peter-evans/create-pull-request to create branch
pull-requests: write # for peter-evans/create-pull-request to create a PR
@ -15,7 +15,7 @@ jobs:
steps:
- uses: actions/checkout@v2
with:
ref: dev
ref: rel-9.0
- name: Reset promotion branch
run: |
git fetch origin rel-8.3:rel-8.3
@ -24,13 +24,15 @@ jobs:
uses: peter-evans/create-pull-request@v3
with:
branch: auto-merge/rel-8-3/${{github.run_number}}
title: Merge branch dev with rel-8.3
body: This PR generated automatically to merge dev with rel-8.3. Please review the changed files before merging to prevent any errors that may occur.
title: Merge branch rel-9.0 with rel-8.3
body: This PR generated automatically to merge rel-9.0 with rel-8.3. Please review the changed files before merging to prevent any errors that may occur.
reviewers: maliming
draft: true
token: ${{ github.token }}
- name: Merge Pull Request
env:
GH_TOKEN: ${{ secrets.BOT_SECRET }}
run: |
gh pr ready
gh pr review auto-merge/rel-8-3/${{github.run_number}} --approve
gh pr merge auto-merge/rel-8-3/${{github.run_number}} --merge --auto --delete-branch
gh pr merge auto-merge/rel-8-3/${{github.run_number}} --merge --auto --delete-branch

18
abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/sv.json

@ -0,0 +1,18 @@
{
"culture": "sv",
"texts": {
"Account": "ABP-konto - Logga in och registrera dig | ABP.IO",
"Welcome": "Välkommen",
"UseOneOfTheFollowingLinksToContinue": "Använd någon av följande länkar för att fortsätta",
"FrameworkHomePage": "Ramverkets startsida",
"FrameworkDocumentation": "Dokumentation av ramverk",
"OfficialBlog": "Officiell blogg",
"CommercialHomePage": "Kommersiell hemsida",
"CommercialSupportWebSite": "Webbplats för kommersiellt stöd",
"CommunityWebSite": "ABP:s gemensamma webbplats",
"ManageAccount": "Mitt konto | ABP.IO",
"ManageYourProfile": "Hantera din profil",
"ReturnToApplication": "Återgå till ansökan",
"IdentityUserNotAvailable:Deleted": "Den här e-postadressen är inte tillgänglig. Anledning till detta: Redan raderad."
}
}

640
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sv.json

@ -0,0 +1,640 @@
{
"culture": "sv",
"texts": {
"Permission:Organizations": "Organisationer",
"Permission:Manage": "Hantera organisationer",
"Permission:DiscountRequests": "Rabattförfrågningar",
"Permission:DiscountManage": "Hantera rabattförfrågningar",
"Permission:Disable": "Avaktivera",
"Permission:Enable": "Aktivera",
"Permission:EnableSendEmail": "Aktivera skicka e-post",
"Permission:SendEmail": "Skicka e-post",
"Permission:NpmPackages": "NPM-paket",
"Permission:NugetPackages": "Nuget-paket",
"Permission:Maintenance": "Underhåll",
"Permission:Maintain": "Behålla",
"Permission:ClearCaches": "Rensa cacheminnen",
"Permission:Modules": "Moduler",
"Permission:Packages": "Paket",
"Permission:Edit": "Redigera",
"Permission:Delete": "Radera",
"Permission:Create": "Skapa",
"Permission:Accounting": "Redovisning",
"Permission:Accounting:Quotation": "Offert",
"Permission:Accounting:Invoice": "Faktura",
"Menu:Organizations": "Organisationer",
"Menu:Accounting": "Redovisning",
"Menu:Packages": "Paket",
"Menu:DiscountRequests": "Rabattförfrågningar",
"NpmPackageDeletionWarningMessage": "Detta NPM-paket kommer att raderas. Kan du bekräfta det?",
"NugetPackageDeletionWarningMessage": "Detta Nuget-paket kommer att raderas. Kan du bekräfta det?",
"ModuleDeletionWarningMessage": "Denna modul kommer att raderas. Kan du bekräfta det?",
"Name": "Namn",
"DisplayName": "Visa namn",
"ShortDescription": "Kort beskrivning",
"NameFilter": "Namn",
"CreationTime": "Skapelsetid",
"IsPro": "Är pro",
"IsFreeToActiveLicenseOwners": "Gratis för licensinnehavare",
"ShowOnModuleList": "Visa på modullistan",
"EfCoreConfigureMethodName": "Konfigurera metodnamn",
"IsProFilter": "Är pro",
"ApplicationType": "Typ av applikation",
"Target": "Mål",
"TargetFilter": "Mål",
"ModuleClass": "Modul klass",
"NugetPackageTarget.DomainShared": "Delad domän",
"NugetPackageTarget.Domain": "Domän",
"NugetPackageTarget.Application": "Tillämpning",
"NugetPackageTarget.ApplicationContracts": "Ansökan Kontrakt",
"NugetPackageTarget.HttpApi": "Http Api",
"NugetPackageTarget.HttpApiClient": "Http Api-klient",
"NugetPackageTarget.Web": "Webb",
"NugetPackageTarget.EntityFrameworkCore": "DeleteAllEntityFramework Core",
"NugetPackageTarget.MongoDB": "MongoDB",
"Edit": "Redigera",
"Delete": "Radera",
"Refresh": "Uppdatera",
"NpmPackages": "NPM-paket",
"NugetPackages": "Nuget-paket",
"NpmPackageCount": "Antal NPM-paket",
"NugetPackageCount": "Antal Nuget-paket",
"Module": "Moduler",
"ModuleInfo": "Modulinformation",
"CreateANpmPackage": "Skapa ett NPM-paket",
"CreateAModule": "Skapa en modul",
"CreateANugetPackage": "Skapa ett Nuget-paket",
"AddNew": "Lägg till ny",
"PackageAlreadyExist{0}": "\"{0}\"-paketet är redan tillagt.",
"ModuleAlreadyExist{0}": "\"{0}\"-modulen är redan tillagd.",
"ClearCache": "Rensa cache",
"SuccessfullyCleared": "Framgångsrikt rensad",
"Menu:NpmPackages": "NPM-paket",
"Menu:Modules": "Moduler",
"Menu:Maintenance": "Underhåll",
"Menu:NugetPackages": "NuGet-paket",
"CreateAnOrganization": "Skapa en organisation",
"Organizations": "Organisationer",
"LongName": "Långt namn",
"LicenseType": "Typ av licens",
"MissingLicenseTypeField": "Fältet för licenstyp är obligatoriskt!",
"LicenseStartTime": "Licensens starttid",
"LicenseEndTime": "Licensens sluttid",
"AllowedDeveloperCount": "Tillåtet antal utvecklare",
"UserNameOrEmailAddress": "Användarnamn eller e-postadress",
"AddOwner": "Lägg till ägare",
"UserName": "Användarnamn",
"Email": "E-post",
"Developers": "Utvecklare",
"AddDeveloper": "Lägg till utvecklare",
"Create": "Skapa",
"UserNotFound": "Användaren hittades inte",
"{0}WillBeRemovedFromDevelopers": "{0} Kommer att tas bort från utvecklare, bekräftar du?",
"{0}WillBeRemovedFromOwners": "{Kommer att tas bort från ägarna, bekräftar du?",
"{0}WillBeRemovedFromMembers": "{0} Kommer att tas bort från medlemmar, bekräftar du?",
"Computers": "Datorer",
"UniqueComputerId": "Unikt dator-ID",
"LastSeenDate": "Datum för senaste observation",
"{0}Computer{1}WillBeRemovedFromRecords": "Dator för {0} ({1}) kommer att tas bort från register",
"OrganizationDeletionWarningMessage": "Organisationen kommer att raderas",
"DeletingLastOwnerWarningMessage": "En organisation måste ha minst en ägare! Därför kan du inte ta bort den här ägaren",
"This{0}AlreadyExistInThisOrganization": "Denna {0} finns redan i denna organisation",
"AreYouSureYouWantToDeleteAllComputers": "Är du säker på att du vill radera alla datorer?",
"DeleteAll": "Radera alla",
"DoYouWantToCreateNewUser": "Vill du skapa en ny användare?",
"MasterModules": "Master-moduler",
"OrganizationName": "Organisationens namn",
"CreationDate": "Datum för skapande",
"LicenseStartDate": "Licensens startdatum",
"LicenseEndDate": "Licensens slutdatum",
"OrganizationNamePlaceholder": "Organisationens namn...",
"TotalQuestionCountPlaceholder": "Totalt antal frågor...",
"RemainingQuestionCountPlaceholder": "Kvarstående frågor är...",
"LicenseTypePlaceholder": "Licenstyp...",
"CreationDatePlaceholder": "Datum för skapande...",
"LicenseStartDatePlaceholder": "Licensens startdatum...",
"LicenseEndDatePlaceholder": "Licensens slutdatum...",
"UsernameOrEmail": "Användarnamn eller e-post",
"UsernameOrEmailPlaceholder": "Användarnamn eller e-post...",
"Member": "Ledamot",
"PurchaseOrderNo": "Inköpsorder nr",
"QuotationDate": "Datum för offert",
"CompanyName": "Företagets namn",
"CompanyAddress": "Företagets adress",
"Price": "Pris",
"DiscountText": "Rabatt text",
"DiscountQuantity": "Rabatt kvantitet",
"DiscountPrice": "Rabatterat pris",
"Quotation": "Offert",
"ExtraText": "Extra text",
"ExtraAmount": "Extra belopp",
"DownloadQuotation": "Ladda ner offert",
"Invoice": "Faktura",
"TaxNumber": "Skattenummer",
"InvoiceNumber": "Fakturanummer",
"InvoiceDate": "Fakturadatum",
"InvoiceNote": "Fakturanota",
"Quantity": "Kvantitet",
"AddProduct": "Lägg till produkt",
"AddProductWarning": "Du måste lägga till produkt!",
"TotalPrice": "Totalt pris",
"Generate": "Generera",
"MissingQuantityField": "Kvantitetsfältet är obligatoriskt!",
"MissingPriceField": "Prisfältet är obligatoriskt!",
"CodeUsageStatus": "Status",
"Country": "Land",
"DeveloperCount": "Antal utvecklare",
"RequestCode": "Begär kod",
"WebSite": "Webbplats",
"GithubUsername": "Användarnamn för Github",
"PhoneNumber": "Telefonnummer",
"ProjectDescription": "Projektbeskrivning",
"Referrer": "Hänvisare",
"DiscountRequests": "Begäran om rabatt",
"Copylink": "Kopiera länk",
"Disable": "Avaktivera",
"Enable": "Aktivera",
"EnableSendEmail": "Aktivera skicka e-post",
"SendEmail": "Skicka e-post",
"SuccessfullyDisabled": "Framgångsrikt avaktiverad",
"SuccessfullyEnabled": "Framgångsrikt aktiverad",
"EmailSent": "Skickad e-post",
"SuccessfullySent": "Framgångsrikt skickat",
"SuccessfullyDeleted": "Framgångsrikt raderad",
"DiscountRequestDeletionWarningMessage": "Begäran om rabatt kommer att raderas",
"BusinessType": "Typ av verksamhet",
"TotalQuestionCount": "Totalt antal frågor",
"RemainingQuestionCount": "Antal återstående frågor",
"TotalQuestionMustBeGreaterWarningMessage": "TotalQuestionCount måste vara större än RemainingQuestionCount !",
"QuestionCountsMustBeGreaterThanZero": "TotalQuestionCount och RemainingQuestionCount måste vara noll eller större än noll!",
"UnlimitedQuestionCount": "Obegränsat antal frågor",
"Notes": "Anteckningar",
"Menu:Community": "Gemenskap",
"Menu:Posts": "Inlägg",
"Wait": "Vänta",
"Approve": "Godkänna",
"Reject": "Avvisa",
"Details": "Detaljer",
"Url": "Url",
"Title": "Titel",
"ContentSource": "Källa för innehåll",
"Status": "Status",
"ReadPost": "Läs inlägget",
"PostHasBeenWaiting": "Posten har väntat",
"PostHasBeenApproved": "Inlägget har godkänts",
"PostHasBeenRejected": "Inlägget har avvisats",
"Permission:Community": "Gemenskap",
"Permission:CommunityPost": "Post",
"Link": "Link",
"Enum:ContentSource:0": "Github",
"Enum:ContentSource:1": "Extern",
"Enum:Status:0": "Väntar på",
"Enum:Status:1": "Avvisad",
"Enum:Status:2": "Godkänd",
"Summary": "Sammanfattning",
"AuthorName": "Författarens namn",
"CoverImage": "Omslagsbild",
"RemoveCacheConfirmationMessage": "Är du säker på att du tar bort cacheminnet för \"{0}\" -posten?",
"SuccessfullyRemoved": "Framgångsrikt rensad",
"RemoveCache": "Ta bort cachen",
"Language": "Språk",
"Optional": "Valfritt",
"CreatePostLanguageInfo": "Det språk som inlägget är skrivet på",
"Enum:ContentSource:2": "Videoinlägg",
"VideoPreview": "Förhandsgranskning av video",
"VideoPreviewErrorMessage": "Angiven video-URL kunde inte hämtas från Youtube. Detta kan orsakas av att videon är privat eller att den angivna webbadressen inte är tillgänglig.",
"DeleteCoverImage": "Ta bort omslagsbild",
"DeleteCoverImageConfirmationMessage": "Är du säker att du vill ta bort omslagsbilden för \"{0}\"?",
"DeleteCoverImageSuccessMessage": "Omslagsbilden har raderats framgångsrikt",
"PaymentsOf": "Betalningar av",
"ShowPaymentsOfOrganization": "Betalningar",
"Date": "Datum",
"Products": "Produkter",
"TotalAmount": "Totalt belopp",
"Currency": "Valuta",
"Gateway": "Gateway",
"State": "Stat",
"FailReason": "Orsak till misslyckande",
"ReIndexAllPosts": "Återindexera alla inlägg",
"ReIndexAllPostsConfirmationMessage": "Är du säker på att du vill indexera om alla inlägg?",
"SuccessfullyReIndexAllPosts": "Alla inlägg har framgångsrikt indexerats om.",
"Permission:FullSearch": "Fulltextsökning",
"Menu:CliAnalytics": "CLI Analys",
"Menu:Reports": "Dynamiska rapporter",
"TemplateName": "Mallens namn",
"TemplateVersion": "Mallversion",
"DatabaseProvider": "Databasleverantör",
"IsTiered": "Är Tiered",
"ProjectName": "Projektets namn",
"Username": "Användarens namn",
"Tool": "Verktyg",
"Command": "Kommando",
"UiFramework": "Ramverk för användargränssnitt",
"Options": "Alternativ",
"CliAnalytics": "Cli Analytics",
"Reports": "Dynamiska rapporter",
"Permission:CliAnalyticses": "Cli Analyticses",
"Permission:CliAnalytics": "Cli Analytics",
"Permission:Reports": "Rapporter",
"Search": "Sök",
"ClearFilter": "Rensa filter",
"LicensePrivateKey": "Licens privat nyckel",
"LicensePublicKey": "Licens offentlig nyckel",
"ApiKey": "NuGet API-nyckel",
"ShowInvoiceRequestsOfOrganization": "Fakturaförfrågningar",
"ShowQuestionsOfOrganization": "Frågor och svar",
"Question": "Fråga",
"Open": "Öppna",
"Questions": "Frågor och svar",
"InvoiceRequests": "Fakturaförfrågningar",
"Address": "Adress",
"TaxNo": "Skatt Nej",
"Permission:InvoiceRequest": "Fakturabegäran",
"Permission:Question": "Fråga",
"AddNoteSuccessMessage": "Not framgångsrikt tillagd",
"NameSurname": "Namn Efternamn",
"Note": "Notera",
"Add": "Lägg till",
"ProjectDownloads": "Projektnedladdningar",
"ShowProjectDownloadsOfOrganization": "Projektnedladdningar",
"ShowAuditLogsOfOrganization": "Granskningsloggar",
"Enum:EntityChangeType:0": "Skapad",
"Enum:EntityChangeType:1": "Uppdaterad",
"Enum:EntityChangeType:2": "Borttagen",
"TenantId": "Hyresgäst-ID",
"ChangeTime": "Ändra tid",
"EntityTypeFullName": "Fullständigt namn på entitetstyp",
"AuditLogsFor{0}Organization": "Granskningsloggar för organisationen \"{0}\"",
"Permission:EntityChange": "Förändring av enhet",
"Permission:ProjectDownload": "Projekt Ladda ner",
"Permission:PaymentRequest": "Begäran om betalning",
"CreatorEmailAddress": "E-postadress till skaparen",
"EmailSendDate": "Datum för e-postutskick",
"PaymentRequestsFor{0}Organization": "Betalningsförfrågningar för \"{0}\" organisation",
"PaymentDetails": "Betalningsinformation",
"PaymentProduct": "Betalning Produkt",
"ProductName": "Produktens namn",
"Code": "Kod",
"GenerateInvoice": "Generera faktura",
"ExportOrganizationsToExcel": "Exportera till Excel",
"ThisExtensionIsNotAllowed": "Denna förlängning är inte tillåten.",
"TheFileIsTooLarge": "Filen är för stor!",
"PostDeletionConfirmationMessage": "Är du säker på att du vill radera det här inlägget?",
"ChooseCoverImage": "Välj en omslagsbild...",
"Menu:Quotation": "Offert",
"Menu:Invoice": "Faktura",
"Menu:Quotation/Invoice": "Offert/faktura",
"Menu:PaymentRequests": "Betalningsförfrågningar",
"Permission:PaymentRequests": "Betalningsförfrågningar",
"PaymentRequests": "Betalningsförfrågningar",
"Creator": "Skapare",
"ExtraProperties": "Extra egenskaper",
"Organization": "Organisation",
"Waiting": "Väntar på",
"Completed": "Färdigställd",
"Failed": "Misslyckades",
"PaymentRequestDeletionWarningMessage": "Denna betalningsbegäran kommer att raderas. Kan du bekräfta det?",
"Payment": "Betalning",
"AddPayment": "Lägg till betalning",
"Enum:PurchaseType:1": "Ny licens",
"Enum:PurchaseType:2": "Licensförlängning",
"Enum:PurchaseType:3": "Uppgradering av licens",
"Enum:PurchaseType:4": "Ytterligare utvecklare",
"LicenceType": "Typ av licens",
"PurchaseType": "Typ av köp",
"ReceiptNo": "Kvitto nr",
"PaymentTime": "Betalningstid",
"ProductPrice": "Produktens pris",
"AdditionalDeveloper": "Ytterligare utvecklare",
"ThisPaymentHasBeenAlreadyUsed": "Denna betalning har redan använts",
"PaymentTimeCannotBeFutureTime": "Betalningstid kan inte vara en framtida tid!",
"SaveAndDownload": "Spara och ladda ner",
"BillingInfo": "Faktureringsinformation",
"DeleteInvoice": "Ta bort faktura",
"PaymentStateSetTo": "Betalningsstatus satt till {0}",
"ChangeState": "Ändra tillstånd",
"Permission:TrialLicense": "Trial-licens",
"Menu:TrialLicenses": "Preliminära licenser",
"TrialLicenses": "Preliminära licenser",
"UserNameFilter": "Användarnamn",
"TrialLicenseStatusFilter": "Status",
"TrialLicenseStartDateFilter": "Startdatum",
"TrialLicenseEndDateFilter": "Slutdatum",
"FirstName": "Förnamn",
"LastName": "Efternamn",
"StartDate": "Startdatum",
"EndDate": "Slutdatum",
"PurchasedDate": "Inköpsdatum",
"OrganizationDetail": "Organisation Detalj",
"TrialLicenseStatus": "Status för provlicens",
"TrialLicenseDetail": "Trial licens detalj",
"AcceptsMarketingCommunications": "Marknadskommunikation",
"PurposeOfUsage": "Syfte med användningen",
"CountryName": "Landets namn",
"CompanySize": "Företagets storlek",
"DetailTrialLicense": "Detaljer",
"Requested": "Begärd",
"Activated": "Aktiverad",
"PurchasedToNormalLicense": "Köpte",
"Expired": "Utgått",
"TrialLicenseDeletionWarningMessage": "Är du säker på att du vill ta bort testlicensen? Testlicens, organisation och supportkonton kommer att raderas!",
"LicenseCategoryFilter": "Licenskategori",
"Permission:SendWelcomeEmail": "Skicka välkomstmejl",
"SendWelcomeEmail": "Skicka välkomstmejl",
"SendWelcomeEmailWarningMessage": "Är du säker på att du vill skicka ett välkomstmeddelande till organisationens medlemmar?",
"SendWelcomeEmailSuccessMessage": "Välkomstmejl skickat framgångsrikt!",
"Activate": "Aktivera",
"ActivateTrialLicenseWarningMessage": " När du aktiverar en testlicens skickas ett välkomstmeddelande till användaren. Vill du aktivera det?",
"ActivateTrialLicenseSuccessMessage": "Aktiverades framgångsrikt och välkomstmeddelandet skickades till organisationsmedlemmarna.",
"PaymentRequestId": "Betalningsbegäran Id",
"AdditionalDeveloperCount": "Ytterligare antal utvecklare",
"LicensePrice": "Licenspris",
"PurchaseDate": "Köpdatum",
"IsAbpBookDownloaded": "Mastering ABP Book nedladdad?",
"IsMasteringAbpBookDownloadEnabled": "ABP Book nedladdning aktiverad",
"Permission:Accounting:CustomPaymentLinkGenerator": "Anpassad betalningslänk",
"CustomPaymentLink": "Anpassad betalningslänk",
"Menu:CustomPaymentLink": "Anpassad betalningslänk",
"Amount": "Belopp",
"GenerateCustomPaymentLink": "Generera anpassad betalningslänk",
"GeneratedPaymentLink": "Genererad betalningslänk",
"CopyText": "Kopiera text",
"Permission:CommunityEvents": "Händelser",
"Menu:Events": "Händelser",
"Events": "Händelser",
"EventType": "Typ av händelse",
"Number": "Antal",
"RegistrationURL": "URL för registrering",
"URL": "URL",
"EventDeletionConfirmationMessage": "Är du säker på att du vill ta bort den här händelsen?",
"Enum:EventType:0": "Samtal med gemenskapen",
"CreateAnEvent": "Skapa ett evenemang",
"Permission:CommunitySpeakers": "Högtalare",
"CreateASpeaker": "Skapa en högtalare",
"Speakers": "Högtalare",
"Image": "Bild",
"GithubURL": "URL till Github",
"SpeakerDeletionConfirmationMessage": "Är du säker att du vill ta bort den här högtalaren?",
"Menu:Speakers": "Högtalare",
"ChooseSpeakerImage": "Välj en högtalarbild...",
"SpeakerImage": "Bild på högtalare",
"AddSpeaker": "Lägg till högtalare",
"ShowPurchaseItemsOfOrganizations": "Köp av föremål",
"Enum:OrganizationPurchaseState:0": "Ej levererad",
"Enum:OrganizationPurchaseState:1": "Levereras",
"PurchaseItems": "Köp av föremål",
"SuccessfullyUpdated": "Framgångsrikt uppdaterad",
"SuccessfullyAdded": "Framgångsrikt tillagt",
"PurchaseState": "Status för köp",
"ShowBetweenDayCount": "Visa mellan dagarna",
"PurchaseOrder": "Inköpsorder",
"ShowCreateInvoiceOfOrganization": "Skapa faktura",
"ShowCreateQuotationOfOrganization": "Skapa offert/faktura",
"BookDiscounts": "Boka rabatter",
"Permission:BookDiscount": "Boka rabatt",
"Menu:BookDiscounts": "Boka rabatter",
"BookType": "Typ av bok",
"PurchasePlatform": "Plattform för inköp",
"StartTime": "Starttid",
"EndTime": "Sluttid",
"CreateABookDiscount": "Skapa en bokrabatt",
"BookDiscountDeletionConfirmationMessage": "Är du säker på att du vill ta bort den här bokrabatten?",
"CustomPaymentFlexSwitchDescription": "Med licens",
"AllowFeatureUpgradeOnLicenseExpire": "Tillåt uppgradering av funktioner när licensen löper ut",
"Deleted{0}": "[Raderad {0}]",
"Tags": "Etiketter",
"SetTagsInfo": "Taggar ska vara kommaseparerade. Exempel: CSharp, Entity Framework",
"RejectTrialLicenseWarningMessage": "Är du säker på att du vill avvisa denna begäran om testlicens?",
"ExportToExcel": "Exportera till Excel",
"OverallTotalPrice": "Totalt totalpris",
"OverallDiscountPrice": "Totalt Rabatt Pris",
"OverallDiscountText": "Övergripande rabatt Text",
"SelectReport": "- Välj rapport",
"NoDataAvailable": "Inga uppgifter tillgängliga",
"StatisticsOfCachedContents": "Statistik över cachelagrat NuGet-paketinnehåll för nuget.abp.io",
"Compact": "Kompakt",
"EditSettings": "Redigera inställningar",
"CurrentEstimatedSize": "Nuvarande uppskattad storlek",
"CurrentEntryCount": "Aktuellt antal poster",
"TotalHits": "Totalt antal träffar",
"TotalMisses": "Totalt antal missar",
"NoResponseFrom": "Inget svar från",
"ContentCacheSlidingExpirationByDay": "Innehållscache glidande utgång per dag",
"MaxDaysForCaching": "Max dagar för cachelagring",
"Enabled": "Aktiverad",
"Menu:NugetPackagesContentCache": "NuGet Cache",
"NugetPackagesContentCache": "NuGet Cache för innehåll",
"SlidingExpritionByDayInfo": "Hämtar eller anger hur länge en cache-post kan vara inaktiv (t.ex. inte åtkommen) innan den tas bort. Detta kommer inte att förlänga postens livstid utöver den absoluta expirationen.",
"MaxDaysForCachingInfo": "Hämtar eller anger en absolut utgångstid i förhållande till nu.",
"CurrentEstimatedSizeInfo": "Anger en uppskattad summa av alla NuGet-pakets innehållsstorlek som för närvarande finns i minnescachen",
"CurrentEntryCountInfo": "Anger antalet instanser som för närvarande finns i minnescachen.",
"TotalHitsInfo": "Anger det totala antalet cache-missar. En cacheträff inträffar när en fil begärs från en cache och cachen kan uppfylla denna begäran.",
"TotalMissesInfo": "Anger det totala antalet träffar i cachen. En cachemiss är när cacheminnet inte innehåller det begärda innehållet.",
"Permission:VersionHistory": "Versionshistorik",
"Caches": "Cacher",
"VersionHistories": "Versionshistorik",
"Version": "Version",
"PublishDate": "Publiceringsdatum",
"IsStableVersion": "Stabil version",
"IsActive": "Aktiv",
"NewVersion": "Ny version",
"VersionHistoryDeletionConfirmationMessage": "Är du säker på att du vill radera den här versionen?",
"CreateAbpConsultantLogoInfo": "Maximal filstorlek: <b>1MB</b> <br/> Filtyper som stöds: <b>jpg, jpeg, png, SVG, WebP</b>",
"UrlCode": "Url-kod",
"Clear": "Klart",
"Permission:AbpConsultant": "ABP Konsult",
"Menu:AbpConsultants": "ABP Konsulter",
"CreateAbpConsultant": "Skapa ABP-konsult",
"UrlCodeIsNotAvailable": "Url-koden används av en annan ABP-konsult.",
"AbpConsultants": "ABP Konsulter",
"AbpConsultant": "ABP Konsult",
"AbpConsultantEdit": "Edit ABP Konsult",
"AbpConsultantCreate": "Skapa ABP-konsult",
"WhoWeAreItem": "Vilka vi är Artikel",
"FieldIsRequired": "{0} krävs.",
"FieldIsNotValid": " {0} är inte giltig.",
"InterestedLicenseType": "Intresserad licenstyp",
"MoveWaitList": "Flytta till väntelista",
"CommunityLinkTitle": "Öppna på community-webbplatsen",
"CommunityLink": "Link",
"IpAddress": "Ip-adress",
"ReloadFromSource": "Ladda om från källan",
"ReloadFromSourceConfirmationMessage": "Detta inlägg kommer att uppdateras från \"{0}\". Vill du fortsätta?",
"UnitPrice": "Enhetspris",
"OverallDiscountAmount": "Totalt rabattbelopp",
"DiscountAmount": "Diskonteringsbelopp",
"FullChangeHistory": "Fullständig ändringshistorik",
"Permission:RefreshReleaseLogs": "Uppdatera release-loggar",
"ReleaseLogs": "Release Loggar",
"AuthorUserName": "Användarnamn för författare",
"Type": "Typ",
"TotalDiscount": "Total rabatt",
"SubTotal": "Subtotal",
"TotalDue": "Totalt förfallna",
"QuotationNo": "Offert nr",
"ValidTill": "Giltig till och med",
"QuotationNote": "Citatanteckning",
"QuotationTemplate.Address:": "Adress:",
"QuotationTemplate.VATNo:": "Momsregistreringsnummer",
"QuotationTemplate.Phone:": "Telefon:",
"QuotationTemplate.E-mail:": "E-post:",
"QuotationTemplate.Quotation": "Offert",
"QuotationTemplate.To": "Till",
"QuotationTemplate.Details": "Detaljer",
"QuotationTemplate.QuotationNo:": "Citat #:",
"QuotationTemplate.IssueDate:": "Utgivningsdatum:",
"QuotationTemplate.ValidTill:": "Giltig till:",
"QuotationTemplate.ValidDays": "{0} dagar",
"QuotationTemplate.Description": "Beskrivning",
"QuotationTemplate.UnitPrice": "Enhetspris",
"QuotationTemplate.Qty": "Antal",
"QuotationTemplate.Discount": "Rabatt",
"QuotationTemplate.Total": "Totalt",
"QuotationTemplate.Notes": "Anteckningar",
"QuotationTemplate.SubTotal:": "Sub Total :",
"QuotationTemplate.Tax/VAT:": "Skatt / moms (%{0}) :",
"QuotationTemplate.TotalDiscount:": "Total rabatt :",
"QuotationTemplate.TOTALDUE:": "TOTAL SKULD :",
"QuotationTemplate.BankAccount": "Information om vårt bankkonto finns på {0}.",
"Permission:Raffles": "Lottdragning",
"Permission:Draw": "Dragning",
"Menu:Raffles": "Raffles",
"RaffleIsNotDrawable": "Lottdragning är inte dragbar",
"WinnerCountMustBeGreaterThanZero": "Antalet vinnare måste vara större än noll",
"FullDescription": "Fullständig beskrivning",
"VisibilityStartDate": "Synlighet Startdatum",
"VisibilityEndDate": "Slutdatum för synlighet",
"RaffleDate": "Lottdragning Datum",
"SubscriptionCode": "Prenumerationskod",
"GroupCode": "Gruppkod",
"MaxWinnerCount": "Max antal vinnare",
"ReDraw": "Rita om",
"EditRaffle": "Redigera utlottning",
"Raffles": "Raffles",
"CreateARaffle": "Skapa en utlottning",
"Draw": "Dragning",
"Enum:RaffleStatus:0": "Aktiv",
"Enum:RaffleStatus:1": "Nästa",
"Enum:RaffleStatus:2": "Tidigare",
"DrawDone": "Ritning klar",
"HomePageShowType": "Startsida Visa typ",
"None": "Ingen",
"Card": "Kort",
"Horizontal": "Horisontell",
"Winners": "Vinnare",
"StartDateMustBeLessThanEndDate": "Startdatum måste vara mindre än slutdatum",
"VisibilityStartDateMustBeLessThanVisibilityEndDate": "Startdatum för synlighet måste vara mindre än slutdatum för synlighet",
"StartDateMustBeGreaterThanVisibilityStartDate": "Startdatum måste vara större än startdatum för synlighet",
"EndDateMustBeLessThanVisibilityEndDate": "Slutdatum måste vara mindre än visibilitetens slutdatum",
"DrawnDone": "Ritad Gjord",
"AddColor": "Lägg till färg",
"Colors": "Färger",
"RemoveColor": "Ta bort färg",
"MaxColorCountWarning": "Du kan lägga till upp till {0} färger",
"MinColorCountWarning": "Du måste lägga till minst {0} färger",
"RaffleDeletionConfirmationMessage": "Är du säker på att du vill ta bort den här utlottningen?",
"CreateRaffle": "Skapa utlottning",
"RemoveImage": "Ta bort bild",
"SavedSuccessfully": "Sparades framgångsrikt",
"Menu:CommunityTalks": "Samtal med gemenskapen",
"Menu:Conferences": "Konferenser",
"Menu:OtherLiveEvents": "Andra live-evenemang",
"Menu:SponsoredConferences": "Sponsrade konferenser",
"Logo": "Logotyp",
"Slug": "Snigel",
"CompanyUrl": "Företagets webbadress",
"TalkTitle": "Titel på samtal",
"AbstractTopic": "Sammanfattning Ämne",
"Bio": "Bio",
"LinkedIn": "LinkedIn",
"Github": "Github",
"Twitch": "Twitch",
"Youtube": "Youtube",
"Twitter": "Twitter",
"PersonalWebsite": "Personlig webbplats",
"VideoId": "Video Id",
"Order": "Beställning",
"Image1x1": "Bild 1x1",
"Image16x9": "Bild 16x9",
"Banner": "Banner",
"Speaker": "Högtalare",
"SessionDate": "Datum för session",
"AddSession": "Lägg till session",
"AddSponsor": "Lägg till sponsor",
"SponsorLogo": "Sponsorlogotyp",
"RegistrationUrl": "Url för registrering",
"AllowAbpStudioBetaAccess": "Tillåt åtkomst till ABP Studio Beta",
"TotalQuestionCanNotBeNullMessage": "Total fråga kan inte vara null",
"Permission:OrganizationAutoRenewalPayments": "Betalningar för automatisk förnyelse av organisation",
"Permission:RetryFailedPayments": "Försök på nytt med misslyckade betalningar",
"AutoRenewalIsNotEnabled": "Automatisk förnyelse är inte aktiverad!",
"LicenseIsNotExpired": "Licensen har inte gått ut!",
"PaymentNotFound": "Betalning hittades inte!",
"PaymentAlreadyTried": "Betalning redan försökt!",
"PaymentIsNotFailed": "Betalning är inte misslyckad!",
"OrganizationIdIsNull": "OrganizationId är null!",
"Menu:AutoRenewals": "Förnyelse av bilar",
"OrganizationAutoRenewalPayments": "Betalningar för automatisk förnyelse av organisation",
"PaymentDate": "Betalningsdag",
"TryCount": "Försök räkna",
"ErrorMessage": "Felmeddelande",
"ErrorCode": "Felkod",
"CreditCard": "Kreditkort",
"BuyerName": "Köparens namn",
"BuyerSurname": "Köparens efternamn",
"BuyerEmail": "Köparens e-post",
"AutoRenewalStartTime": "Starttid för automatisk förnyelse",
"AutoRenewalEndTime": "Sluttid för automatisk förnyelse",
"AutoRenewalEnabled": "Automatisk förnyelse aktiverad",
"LastAutoRenewalPaymentTime": "Sista betalningstid för automatisk förnyelse",
"OrganizationDoesNotHaveACreditCard": "Organisationen har inte ett kreditkort!",
"OrganizationDoesNotHaveACreditCardInGateway": "Organisationen har inte ett kreditkort i porten!",
"Permission:EditWinners": "Redigera vinnare",
"Permission:ChangeDrawingStatus": "Ändra ritningsstatus",
"Menu:Licenses": "Licensiering",
"OrganizationId": "Organisations-ID",
"RemoveAllWinnersConfirmationMessage": "Är du säker på att du vill ta bort alla vinnare?",
"AutoRenewals": "Förnyelse av bilar",
"OrganizationHasCreditCard": "Organisationen har kreditkort. Vänligen ta bort kreditkortet först!",
"DisplayName:DontSendEmailForLicenseExpire": "Skicka inte e-post för att licensen löper ut",
"DontSendEmailForLicenseExpire": "Skicka inte e-post för att licensen löper ut",
"SuccessfullyChanged": "Framgångsrikt ändrat",
"WinnerCountMustBeLessThanMaxWinnerCount": "Antalet vinnare måste vara mindre än det maximala antalet vinnare",
"NoChangesDetected": "Inga förändringar upptäckta",
"ProductCount": "Produkträkning",
"Actions": "Åtgärder",
"CreateInvoice": "Skapa faktura",
"IsVisible": "Synlig",
"Menu:Testimonials": "Vittnesmål",
"TestimonialDeletionConfirmationMessage": "Är du säker på att du vill ta bort detta vittnesmål?",
"FullName": "Fullständigt namn",
"TestimonialText": "Text i vittnesmål",
"ExperienceYear": "Erfarenhetsår",
"Position": "Titel",
"YearsOfExperience": "Erfarenhetsår",
"AllowedLicenses": "Tillåtna licenser",
"AllowedModules": "Tillåtna moduler",
"ModuleName": "Modulens namn",
"NonYet": "Inte ännu",
"Permission:Testimonials": "Vittnesmål",
"SelectCompanySizePlaceholder": "Företagets storlek",
"SelectExperienceYearPlaceholder": "Erfarenhetsår",
"SelectCountryPlaceholder": "Land",
"DeleteImageConfirmationMessage": "Är du säker att du vill ta bort bilden för \"{0}\"?",
"DeleteImageSuccessMessage": "Bilden har raderats framgångsrikt",
"DeleteImage": "Ta bort bild",
"NetTerms": "Villkor (dagar)",
"Menu:DynamicReports": "Dynamiska rapporter",
"Menu:Others": "Övriga",
"Menu:Packs&Modules": "Paket & moduler",
"ReleaseCaches": "Frigör cachen",
"Menu:HeroSections": "Hjälte-sektioner",
"HeroSections": "Hjälte-sektioner",
"DynamicReports": "Dynamiska rapporter",
"Menu:ReportsMenu": "Rapporter",
"Permission:HeroSections": "Hjälte-sektioner",
"RedirectLink": "Omdirigera länk",
"HeroSectionsDeletionConfirmationMessage": "Är du säker på att du vill ta bort hjälteavsnittet?",
"AbpStudioName": "Abp Studio namn"
}
}

256
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/sv.json

@ -0,0 +1,256 @@
{
"culture": "sv",
"texts": {
"Volo.AbpIo.Domain:010004": "Maximalt antal medlemmar uppnått!",
"Volo.AbpIo.Domain:010005": "Maximalt antal ägare uppnått!",
"Volo.AbpIo.Domain:010006": "Den här användaren är redan ägare i den här organisationen!",
"Volo.AbpIo.Domain:010007": "Den här användaren är redan en utvecklare i den här organisationen!",
"Volo.AbpIo.Domain:010008": "Tillåtet antal utvecklare kan inte vara mindre än nuvarande antal utvecklare!",
"Volo.AbpIo.Domain:010009": "Tillåtet antal utvecklare kan inte vara mindre än 0!",
"Volo.AbpIo.Domain:010010": "Maximalt antal mac-adresser har överskridits!",
"Volo.AbpIo.Domain:010011": "Personlig licens kan inte ha mer än 1 utvecklare!",
"Volo.AbpIo.Domain:010012": "Licensen kan inte förlängas en månad efter att licensen har löpt ut!",
"Volo.AbpIo.Domain:020001": "Det gick inte att ta bort detta NPM-paket eftersom \"{NugetPackages}\" Nuget-paket är beroende av detta paket.",
"Volo.AbpIo.Domain:020002": "Det gick inte att ta bort detta NPM-paket eftersom \"{Moduler}\" Moduler använder detta paket.",
"Volo.AbpIo.Domain:020003": "Det gick inte att ta bort detta NPM-paket eftersom \"{Modules}\" Moduler använder det här paketet och \"{NugetPackages}\" Nuget-paket är beroende av detta paket.",
"Volo.AbpIo.Domain:020004": "Det gick inte att ta bort detta Nuget-paket eftersom \"{Moduler}\" Moduler använder detta paket.",
"Volo.AbpIo.Domain:030000": "Du har redan avslutat din provperiod.",
"Volo.AbpIo.Domain:030001": "Det här organisationsnamnet finns redan.",
"Volo.AbpIo.Domain:030002": "Efter aktivering kan du inte ändra testlicensen till -requested- status!",
"Volo.AbpIo.Domain:030003": "Det finns ingen sådan status!",
"Volo.AbpIo.Domain:030004": "Status kunde inte ändras på grund av ett oväntat fel!",
"Volo.AbpIo.Domain:030005": "Start- och slutdatum kan uppdateras när testlicensen är i statusen -aktiverad!",
"Volo.AbpIo.Domain:030006": "Slutdatumet måste vara större än startdatumet!",
"Volo.AbpIo.Domain:030007": "Denna testlicens har redan aktiverats!",
"Volo.AbpIo.Domain:030008": "Köpdatumet kan endast ställas in när statusen är -köpt-!",
"Volo.AbpIo.Domain:030009": "Användaren hittades inte!",
"Volo.AbpIo.Domain:030010": "För att köpa testlicensen måste du först aktivera din testlicens!",
"Volo.AbpIo.Domain:030011": "Du kan inte ta bort en testlicens när den är köpt!",
"Volo.AbpIo.Domain:030012": "En användare har endast rätt till 1 gratis provperiod. Du har redan använt din testlicens.",
"Volo.AbpIo.Domain:030013": "En användare med en aktiv licens kan inte starta en testlicens.",
"Volo.AbpIo.Domain:040000": "Telemetri finns redan!",
"Volo.AbpIo.Domain:050000": "Organisationen har kreditkort. Du kan inte ta bort det!",
"Volo.AbpIo.Domain:070000": "Organisationsnamnet får endast innehålla latinska bokstäver, siffror, punkter och bindestreck!",
"Volo.AbpIo.Domain:070001": "Företagsnamnet får endast innehålla latinska bokstäver, siffror, punkter, mellanslag och bindestreck!",
"WantToLearn?": "Vill du lära dig mer?",
"ReadyToGetStarted?": "Är du redo att komma igång?",
"JoinOurCommunity": "Gå med i vår community",
"GetStartedUpper": "KOM IGÅNG",
"ForkMeOnGitHub": "Fork mig på GitHub",
"Features": "Funktioner",
"GetStarted": "Kom igång",
"Documents": "Dokument",
"Community": "Gemenskap",
"ContributionGuide": "Bidragsguide",
"Blog": "Blogg",
"Commercial": "Kommersiell",
"MyAccount": "Mitt konto",
"Permission:License": "Licens",
"Permission:UserInfo": "Användarinformation",
"SeeDocuments": "Se dokument",
"Samples": "Prover",
"Framework": "Ramverk",
"Support": "Stöd",
"FreeDDDBook": "Gratis e-bok om DDD",
"New": "Nya",
"Volo.AbpIo.Domain:020005": "Licensförlängningsåret får inte vara lägre än {MinExtendLicenseYear} år och inte högre än {MaxExtendLicenseYear} år",
"TrialLicensePeriodHasExpired": "Din testlicensperiod löpte ut för {0} dagar sedan.",
"TrialLicensePeriodWillExpire": "Din testlicensperiod kommer att löpa ut om {0} dagar.",
"TrialLicensePeriodExpireToday": "Din testlicensperiod kommer att löpa ut idag.",
"PurchaseNow": "Köp nu!",
"LatestReleaseLogs": "Senaste versionsloggar",
"RoadMap": "Vägkarta",
"FAQ": "VANLIGA FRÅGOR",
"SourceCode": "Källkod",
"SeeAllPosts": "Se alla inlägg",
"Contribute": "Bidra",
"LiveDemo": "Live Demo",
"GetLicense": "Skaffa licens",
"OpenSource": "Öppen källkod",
"WebApplication": "Webbapplikation",
"MeetTheABP": "Möt ABP",
"CompleteWebDevelopment": "En komplett webbutveckling",
"Platform": "Plattform",
"ABPDescription": "Ett ramverk med öppen källkod för utveckling av webbapplikationer för ASP.NET Core. Det erbjuder en komplett infrastruktur genom att följa bästa praxis för programvaruutveckling.",
"StrongInfrastructure": "Stark infrastruktur",
"CompleteArchitecture": "Komplett arkitektur",
"DeveloperFocused": "Fokus på utvecklare",
"ShareYourExperiences": "Dela dina erfarenheter av ABP-ramverket",
"LatestPosts": "Senaste inlägg",
"LatestVideos": "Senaste videor",
"Views": "Utsikt",
"LearnLatestNewsAboutABPFramework": "Få information om händelser i ABP som nya utgåvor, fria källor, inlägg och mycket mer.",
"DeveloperTools": "Verktyg för utvecklare",
"StartupTemplates": "Mallar för nystartade företag",
"ApplicationModules": "Applikationsmoduler",
"UI": "UI",
"Themes": "Teman",
"Premium": "Premium",
"PrivacyPolicy": "Integritetspolicy",
"TermsAndConditions": "Villkor och anvisningar",
"WouldLikeToReceiveMarketingMaterials": "Jag skulle vilja få marknadsföringsmaterial som produkterbjudanden och specialerbjudanden.",
"JoinOurMarketingNewsletter": "Anmäl dig till vårt marknadsföringsnyhetsbrev",
"CommunityPrivacyPolicyConfirmation": "Jag godkänner de allmänna villkoren och <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"/Privacy\">Privatlivspolicyn</a>.",
"WouldLikeToReceiveNotification": "Jag skulle vilja få de senaste nyheterna från abp.io webbplatser.",
"CommercialNewsletterConfirmationMessage": "Jag samtycker till <a href=\"/TermsConditions\">Terms & Conditions</a> och <a href=\"/Privacy\">Privacy Policy</a>.",
"FreeDDDEBook": "Gratis e-bok om DDD",
"AdditionalServices": "Ytterligare tjänster",
"Learn": "Lär dig",
"AccountOverview": "Översikt över konton",
"MyOrganizations": "Mina organisationer",
"MySupportQuestions": "Mina frågor om support",
"MyProfile": "Min profil",
"Logout": "Logga ut",
"Home": "Hem",
"Posts": "Inlägg",
"Videos": "Videor",
"JoinTheABPCommunity": "Gå med i ABP:s gemenskap",
"SubmitYourPost": "Skicka in ditt inlägg",
"Modules": "Moduler",
"Tools": "Verktyg",
"Pricing": "Prissättning",
"ChangeLogs": "Ändra loggar",
"SubscribeToNewsletter": "Prenumerera på nyhetsbrevet",
"SubscribeToNewsletterDescription": "Få information om händelser i ABP som nya utgåvor, fria källor, inlägg och mycket mer.",
"EmailAddress": "E-postadress",
"Subscribe": "Prenumerera",
"WelcomeToABP": "Välkommen till ABP",
"EULA": "EULA",
"ABPCommercialIntroductionMessage": "Förbyggda applikationsmoduler, avancerade startmallar, verktyg för snabb applikationsutveckling, professionella UI-teman och premiumsupport.",
"MasteringAbpFrameworkEBook": "Behärskar ABP-ramverket",
"MasteringTheABPFrameworkExplanation": "Mastering ABP Framework e-bok; skriven av skaparen av ABP Framework, hjälper dig att få en fullständig förståelse för ramverket och moderna tekniker för utveckling av webbapplikationer.",
"Speakers": "Högtalare",
"PreviousEvents": "Tidigare händelser",
"WatchTheEvent": "Titta på evenemanget",
"RegisterNow": "Registrera dig nu",
"ThereIsNoEvent": "Det finns ingen händelse.",
"Events": "Händelser",
"Volo.AbpIo.Domain:080000": "Det finns redan ett inköpsobjekt som heter \"{Namn}\"",
"MasteringAbpFrameworkBook": "Bok: Att bemästra ABP:s ramverk",
"ABPIO-CommonPreferenceDefinition": "Få de senaste nyheterna om ABP Platform som nya inlägg, evenemang och mer.",
"BuiltOn": "Inbyggd",
"AbpFramework": "ABP-ramverk",
"Volo.AbpIo.Domain:080001": "Starttiden får inte vara större än sluttiden",
"Enum:BookType:0": "Behärskar ABP-ramverket",
"Enum:PurchasePlatform:0": "Amazonas",
"Enum:PurchasePlatform:1": "Förpackningar",
"Copied": "Kopierat!",
"CouldNotCopy": "Kunde inte kopiera!",
"CopyNotSupportByYourBrowser": "Den här funktionen fungerar inte i den webbläsare du använder.",
"City": "Stad",
"ZipCode": "Postnummer",
"Address": "Adress",
"Homepage": "Hemsida",
"Year": "År",
"Year_Plural": "År",
"Copyright": "Copyright © <a href=\"{0}\" target=\"_blank\">{1}</a>",
"DomainDrivenDesign": "Domänstyrd design",
"CrossCuttingConcerns": "Tvärgående angelägenheter",
"AbpCommunity": "ABP Gemenskap",
"Footer_GithubStarCount": "{0} Stjärnor på GitHub",
"Footer_NugetDownloadCount": "{Nedladdningar på NuGet",
"AbpDescription": "ABP är ett applikationsramverk med öppen källkod som fokuserar på AspNet Core-baserad utveckling av webbapplikationer. Upprepa inte dig själv, fokusera på din egen affärskod.",
"Layout_AbpFramework_MetaTitle": "ABP Framework | Ramverk för webbapplikationer med öppen källkod för ASP.NET Core",
"CommunityTalks_CountdownDays": "Dagar",
"CommunityTalks_CountdownHours": "Timmar",
"CommunityTalks_CountdownMinutes": "Min",
"CommunityTalks_CountdownSeconds": "Sek",
"SeePreviousEvents": "Se tidigare evenemang",
"CookieConsent_Accept": "Acceptera",
"CookieConsent_Explanation_1": "Vi använder cookies för att ge dig den bästa upplevelsen på vår webbplats.",
"CookieConsent_Explanation_2": "Om du fortsätter att surfa samtycker du till vår <a href=\"/Privacy\">Privatpolicy och cookiepolicy.</a>.",
"Error_Page_400_Title": "Det uppstod ett problem med att visa den begärda sidan.",
"Error_Page_400_Description_1": "Vanligtvis betyder det att ett oväntat fel inträffade när vi behandlade din begäran.",
"Error_Page_400_Description_2": "Om problemet kvarstår, kontakta oss på <a href=\"mailto:info@abp.io\">info@abp.io</a> så hjälper vi dig att komma vidare.",
"GoToHomepage": "Gå till hemsidan",
"Error_Page_404_Title": "Sidan hittades inte!",
"Error_Page_404_Description_1": "Det här är inte den webbsida du letar efter.",
"Error_Page_500_Title": "Det ser ut som om något gick fel!",
"Error_Page_500_Description_1": "Vi spårar dessa fel automatiskt, men om problemet kvarstår är du välkommen att <br /> kontakta oss. Under tiden kan du prova att uppdatera.",
"Error_Page_500_Description_2": "Kontakta oss på <a href=\"mailto:info@abp.io\" target=\"_blank\">info@abp.io</a>.",
"Books": "Böcker",
"ABPDiscordServer": "ABP Discord Server",
"ABPCommunityTalks": "ABP:s samtal med allmänheten",
"ABPCommunityPosts": "ABP Gemenskap Inlägg",
"BuyAndGetMonths": "KÖP 12 MÅNADER, <span>FÅ 14 MÅNADER!</span>",
"GetYourDeal": "Få ditt erbjudande",
"BuyOrRenewLicense": "Köp eller förnya licensen nu och få 2 extra månader!",
"BuyOrRenewLicenseToGetExtra2Months": "Köp eller förnya licens nu och få 2 extra månader! SKYNDA DIG UPP! ⏰ Sista dag: {0}",
"HurryUp": "SKYNDA PÅ!",
"LastDay": "Sista dagen: {0}",
"BuyNewLicenseBetweenDatesToGetBenefit": "Köp en ny licens mellan {0} och {1} för att få förmånen i extra 2 månader!",
"CheckAllCommunityTalks": "Kontrollera alla inlägg i gemenskapen",
"ReadMore": "Läs mer om",
"ContinueReading": "Fortsätta läsa",
"Post": "Post",
"ExploreTheContentsCreatedByTheCoreABPTeamAndTheABPCommunity": "Utforska innehållet som skapats av ABP:s kärnteam och ABP:s community.",
"WelcomeFallCampaign": "Välkommen till höstkampanjen!",
"GiveAwayForNewPurchases": "Application Development Classroom Training kommer att ges bort för de nya inköpen!",
"BlackFriday": "<strong>BLACK</strong> <span>FRIDAY</span>",
"ValidForExistingCustomers": "Gäller även för <br> befintliga kunder!",
"CampaignBetweenDates": "Från {0} <br>Till {1}",
"SaveUpTo": "<span>Spara</span> Upp till<strong>${0}K</strong>",
"ImplementingDDD": "Implementering av domändriven design",
"ExploreTheEBook": "Utforska e-boken",
"ExploreTheBook": "Utforska boken",
"ConsultantType": "Typ av konsultverksamhet",
"Expert": "ABP Expert",
"Partner": "ABP Partner",
"Industry": "Industri",
"Location": "Plats",
"Contact": "Kontakt",
"Partner_Year": "Partnerskapsår",
"Info": "Info",
"SpokenLanguages": "Talade språk",
"SocialMedia": "Sociala medier",
"Activity": "Aktivitet",
"Type": "Typ",
"Contribution": "Bidrag",
"WhoWeAre": "Vilka vi är",
"Icons": "Ikoner",
"Url": "Url",
"Icon": "Ikon",
"RecentActivities": "Senaste aktiviteterna",
"SpringCampaign": "Välkommen <br>Vårens försäljning!",
"SpringCampaign2": "<span>Begränsat <br> tidserbjudande!</span>",
"AboutUs": "Om oss",
"HowItWorks": "Hur fungerar det?",
"ReleaseNotes": "Releaseanteckningar",
"DetailedChangeNotes": "Detaljerade ändringsanteckningar",
"SeeTrainings": "Se utbildningar",
"NoContent": "Inget innehåll",
"More": "Mer om",
"WhyABPIOPlatform": "Varför ABP.IO Platform?",
"AbpStudio": "ABP Studio",
"ExtraMonths": "{0}<span>EXTRA MÅNADER</span>",
"RSS": "RSS",
"RSSFeed": "RSS-flöde",
"Articles": "Artiklar",
"Organizations": "Organisationer",
"ManageAccount": "Hantera konto",
"CommunityProfile": "Gemenskapsprofil",
"BlogProfile": "Bloggprofil",
"Tickets": "Tickets",
"Raffles": "Raffles",
"Status": "Status",
"Resources": "Resurser",
"Video Courses": "Videokurser",
"Packages": "Paket",
"Trainings": "Utbildningar",
"MeetTheABPCommunity": "Möt ABP <span class=\"gradient-community\">Community</span>",
"DisplayName:CommunityIndexPagePoll": "Community Index Page Poll",
"ReturnOnInvestment": "Avkastning på investeringar",
"PromotionalOffers": "Kampanjerbjudanden",
"PromotionalOffersDefinition": "Rabatter, säsongskampanjer etc.",
"EventsDefinition": "Community Talks, webbseminarier, ABP .NET-konferens, etc.",
"ReleaseNotesDefinition": "ABP.IO Plattformsreleaser, nya produkter etc.",
"Newsletter": "Nyhetsbrev",
"NewsletterDefinition": "Blogginlägg, nyheter om samhället etc.",
"OrganizationOverview": "Översikt över organisationen",
"EmailPreferences": "Inställningar för e-post",
"VideoCourses": "Viktiga videor",
"DoYouAgreePrivacyPolicy": "Genom att klicka på <b>Prenumerera</b>-knappen godkänner du <a href=\"https://account.abp.io/Account/TermsConditions\">Villkor och bestämmelser</a> och <a href=\"https://account.abp.io/Account/Privacy\">Privatlivspolicy</a>.",
"AbpConferenceDescription": "ABP Conference är ett virtuellt evenemang för .NET-utvecklare där de kan lära sig mer och få kontakt med andra.",
"Mobile": "Mobil"
}
}

8
abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/sv.json

@ -0,0 +1,8 @@
{
"culture": "sv",
"texts": {
"AbpTitle": "Läs alla blogginlägg",
"AbpDescription": "ABP är ett applikationsramverk med öppen källkod som fokuserar på AspNet Core-baserad utveckling av webbapplikationer. Upprepa inte dig själv, fokusera på din egen affärskod.",
"AbpDefinition": "ABP-blogg för .NET-utveckling, plattformsoberoende, ASP.NET-applikationsmallar, ABP-relaterade nyheter och mer..."
}
}

1215
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sv.json

File diff suppressed because it is too large

269
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/sv.json

@ -0,0 +1,269 @@
{
"culture": "sv",
"texts": {
"Permission:CommunityPost": "Gemenskapens inlägg",
"Permission:Edit": "Redigera",
"Waiting": "Väntar på",
"Approved": "Godkänd",
"Rejected": "Avvisad",
"Wait": "Vänta",
"Approve": "Godkänna",
"Reject": "Avvisa",
"ReadPost": "Läs inlägget",
"Status": "Status",
"ContentSource": "Källa för innehåll",
"Details": "Detaljer",
"Title": "Titel",
"CreationTime": "Skapelsetid",
"Save": "Spara",
"SameUrlAlreadyExist": "Samma URL finns redan! Du måste ändra webbadressen!",
"UrlIsNotValid": "Url är inte giltig.",
"UrlNotFound": "Url hittades inte.",
"UrlContentNotFound": "Url-innehållet hittades inte.",
"Summary": "Sammanfattning",
"MostRead": "Mest läst",
"Latest": "Senaste",
"ContributeAbpCommunity": "Bidra till ABP:s gemenskap",
"SubmitYourPost": "Skicka in ditt inlägg",
"ContributionGuide": "Bidragsguide",
"BugReport": "Bugg-rapport",
"SeeAllPosts": "Se alla inlägg",
"WelcomeToABP": "Välkommen till ABP",
"EmailNotValid": "Vänligen ange en giltig e-postadress.",
"FeatureRequest": "Begäran om funktion",
"CreatePostTitleInfo": "Titel på det inlägg som ska visas i inläggslistan.",
"CreatePostSummaryInfo": "En kort sammanfattning av inlägget som ska visas i inläggslistan. Maximal längd: <b>{0}</b>",
"CreatePostCoverInfo": "För att skapa ett effektivt inlägg, lägg till ett omslagsfoto. Ladda upp bilder i bildförhållandet <b>16:9</b> för bästa visning.<br/> Maximal filstorlek är <b>1MB.</b>",
"ThisExtensionIsNotAllowed": "Denna förlängning är inte tillåten.",
"TheFileIsTooLarge": "Filen är för stor.",
"GoToThePost": "Gå till inlägget",
"GoToTheVideo": "Gå till videon",
"Contribute": "Bidra",
"OverallProgress": "Övergripande framsteg",
"Done": "Klar",
"Open": "Öppna",
"Closed": "Stängt",
"RecentQuestionFrom": "Senaste frågan från {0}",
"Stackoverflow": "Stackoverflow",
"Votes": "röster",
"Answer": "Svar",
"Views": "utsikt",
"Answered": "Besvarad",
"WaitingForYourAnswer": "Väntar på ditt svar",
"Asked": "aska",
"AllQuestions": "Alla frågor",
"NextVersion": "Nästa version",
"MilestoneErrorMessage": "Det gick inte att få aktuell milstolpsinformation från Github.",
"QuestionItemErrorMessage": "Kunde inte få de senaste frågeuppgifterna från Stackoverflow.",
"Oops": "Oops!",
"CreatePostSuccessMessage": "Ditt inlägg har skickats in med framgång. Det kommer att publiceras efter granskning av webbplatsadministratören.",
"Browse": "Bläddra",
"CoverImage": "Omslagsbild",
"ShareYourExperiencesWithTheABPFramework": "Dela dina erfarenheter av ABP-ramverket!",
"Optional": "Valfritt",
"UpdateUserWebSiteInfo": "Exempel: https://johndoe.com",
"UpdateUserTwitterInfo": "Exempel: johndoe",
"UpdateUserGithubInfo": "Exempel: johndoe",
"UpdateUserLinkedinInfo": "Exempel: https://www.linkedin.com/...",
"UpdateUserCompanyInfo": "Exempel: Volosoft",
"UpdateUserJobTitleInfo": "Exempel: Programvaruutvecklare",
"UserName": "Användarnamn",
"Company": "Företag",
"PersonalWebsite": "Personlig webbplats",
"RegistrationDate": "Registreringsdatum",
"Social": "Sociala",
"Biography": "Biografi",
"HasNoPublishedPostsYet": "har inga publicerade inlägg ännu",
"Author": "Författaren",
"LatestGithubAnnouncements": "Senaste Github-tillkännagivanden",
"SeeAllAnnouncements": "Se alla tillkännagivanden",
"LatestBlogPost": "Senaste blogginlägget",
"Edit": "Redigera",
"ProfileImageChange": "Ändra profilbilden",
"BlogItemErrorMessage": "Kunde inte få den senaste informationen om blogginlägg från ABP.",
"PlannedReleaseDate": "Planerat utgivningsdatum",
"CommunityPostRequestErrorMessage": "Det gick inte att få den senaste postförfrågan från Github.",
"PostRequestFromGithubIssue": "Det finns inga postförfrågningar nu.",
"LatestPosts": "Senaste inlägg",
"ArticleRequests": "Begär ett innehåll",
"ArticleRequestsDescription": "Vill du se ett specifikt innehåll här? Du kan be communityn att skapa det!",
"LatestContentRequests": "Senaste förfrågningar om innehåll",
"AllPostRequests": "Se alla postförfrågningar",
"SubscribeToTheNewsletter": "Prenumerera på nyhetsbrevet",
"NewsletterEmailDefinition": "Få information om vad som händer i ABP, t.ex. nya utgåvor, fria källor, inlägg och mycket mer.",
"NoThanks": "Nej, tack.",
"MaybeLater": "Kanske senare",
"JoinOurPostNewsletter": "Anmäl dig till vårt nyhetsbrev",
"Community": "Gemenskap",
"Marketing": "Marknadsföring",
"CommunityPrivacyPolicyConfirmation": "Jag godkänner de allmänna villkoren och <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">Integritetspolicy</a>.",
"PostRequestMessageTitle": "<a href=\"https://github.com/abpframework/abp/issues/new\">Öppna en fråga</a> på GitHub för att begära ett inlägg / en handledning som du vill se på den här webbplatsen.",
"PostRequestMessageBody": "Här är en lista över de inlägg som efterfrågats av communityn. Vill du skriva ett efterfrågat inlägg? Klicka på önskemålet och delta i diskussionen.",
"Language": "Språk",
"CreatePostLanguageInfo": "Språket för inläggets innehåll.",
"VideoPost": "Videoinlägg",
"Post": "Post",
"Read": "Läs",
"CreateGithubPostUrlInfo": "Fullständig URL till Markdown-filen på GitHub (<a href=\"https://github.com/abpframework/abp/blob/dev/docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md\" target=\"blank\">exempel</a>).",
"CreateVideoContentUrlInfo": "Inläggets ursprungliga URL på Youtube.",
"CreateExternalPostUrlInfo": "Inläggets ursprungliga externa webbadress.",
"VideoContentForm": "Skicka in video på YouTube",
"GithubPostForm": "Skicka inlägg på GitHub",
"ExternalPostForm": "Skicka in ett externt innehåll",
"HowToPost": "Hur postar jag?",
"Posts": "Inlägg",
"VideoUrl": "Video webbadress",
"GithubPostUrl": "Url för GitHub-post",
"ExternalPostUrl": "Url för externt inlägg",
"ThankYouForContribution": "Tack för att du bidrar till ABP Community. Vi tar gärna emot artiklar och videohandledning om ABP Framework, .NET, ASP.NET Core och allmänna ämnen inom programvaruutveckling.",
"GithubPost": "GitHub-inlägg",
"GithubPostSubmitStepOne": "<span class=\"font-weight-bold\">1.</span> Skriv ett inlägg på ett offentligt GitHub-arkiv med Markdown-formatet. <a target=\"_blank\" class=\"fw-6 text-white text-decoration-underline\" href=\"https://github.com/abpframework/abp/blob/dev/docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md\">exempel</a>",
"GithubPostSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span> Skicka in din URL till inlägget med hjälp av formuläret.",
"GithubPostSubmitStepThree": "<span class=\"font-weight-bold\">3.</span> Ditt inlägg kommer att återges på denna webbplats.",
"YoutubeVideo": "Youtube-video",
"YoutubeVideoSubmitStepOne": "<span class=\"font-weight-bold\">1.</span> Publicera din video på YouTube.",
"YoutubeVideoSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span> Skicka in video-URL:en med hjälp av formuläret.",
"YoutubeVideoSubmitStepThree": "<span class=\"font-weight-bold\">3.</span> Besökare kommer att kunna titta på ditt videoinnehåll direkt på denna webbplats.",
"ExternalContent": "Externt innehåll",
"ExternalContentSubmitStepOne": "<span class=\"font-weight-bold\">1.</span> Skapa innehåll på en publik plattform (Medium, din egen blogg eller var du vill).",
"ExternalContentSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span> Skicka in URL:en för ditt innehåll med hjälp av formuläret.",
"ExternalContentSubmitStepThree": "<span class=\"font-weight-bold\">3.</span> Besökare omdirigeras till innehållet på den ursprungliga webbplatsen.",
"ChooseYourContentType": "Välj det sätt som du vill lägga till ditt innehåll på.",
"PostContentViaGithub": "Jag vill lägga till mitt inlägg med <span class=\"icon-with-text-github\"> GitHub</span> i enlighet med markdown-reglerna.",
"PostContentViaYoutube": "Jag vill dela mina videor som finns på <span class=\"icon-with-text-youtube\"> Youtube</span> här.",
"PostContentViaExternalSource": "Jag vill lägga till det innehåll jag publicerade på <b>en annan plattform</b> här.",
"GitHubUserNameValidationMessage": "Ditt Github-användarnamn kan inte innehålla blanksteg, kontrollera att ditt Github-användarnamn är korrekt.",
"PersonalSiteUrlValidationMessage": "URL:en till din personliga webbplats får inte innehålla blanksteg, kontrollera att URL:en till din personliga webbplats är korrekt.",
"TwitterUserNameValidationMessage": "Ditt Twitter-användarnamn får inte innehålla blanksteg, kontrollera att ditt Twitter-användarnamn är korrekt.",
"LinkedinUrlValidationMessage": "Din LinkedIn-URL får inte innehålla blanksteg, kontrollera att din LinkedIn-URL är korrekt.",
"NoPostsFound": "Inga inlägg hittades!",
"SearchInPosts": "Sök i inlägg...",
"MinimumSearchContent": "Du måste ange minst 3 tecken!",
"Volo.AbpIo.Domain:060001": "Källans URL(\"{PostUrl}\") är inte Github URL",
"Volo.AbpIo.Domain:060002": "Inläggets innehåll är inte tillgängligt från GitHub(\"{PostUrl}\")-resursen.",
"Volo.AbpIo.Domain:060003": "Inget innehåll i inlägget hittades!",
"SeeMore": "Se mer",
"JoinTheABPCommunity": "Gå med i ABP:s gemenskap",
"ABPCommunityTalks": "ABP:s samtal med allmänheten",
"LiveDemo": "Live Demo",
"GetLicense": "Skaffa licens",
"GetStarted": "Kom igång",
"SourceCode": "Källkod",
"LeaveComment": "Lämna kommentar",
"ShowMore": "Visa mer",
"NoPublishedPostsYet": "Inga publicerade inlägg ännu.",
"Name": "Namn",
"Surname": "Efternamn",
"WebSite": "Webbplats",
"FullURL": "Full URL",
"JobTitle": "Befattning",
"Prev": "Före",
"Previous": "Föregående",
"Next": "Nästa",
"Share": "Aktie",
"SortBy": "Sortera efter",
"NoPublishedEventsYet": "Inga publicerade händelser ännu.",
"SubscribeYoutubeChannel": "Prenumerera på Youtube-kanalen",
"Enum:EventType:0": "Samtal",
"MemberNotPublishedPostYet": "Denna medlem har inte publicerat några inlägg ännu.",
"TimeAgo": "för {0} sedan",
"Discord_Page_JoinCommunityMessage": "Gå med i ABP Discord Community",
"Discord_Page_Announce": "Vi är glada att kunna presentera ABP Community Discord Server!",
"Discord_Page_Description_1": "ABP Community har vuxit sedan dag ett. Vi ville ta det till nästa steg genom att skapa en officiell ABP Discord-server så att ABP-communityn kan interagera med varandra med hjälp av underverk som snabbmeddelanden.",
"Discord_Page_Description_2": "ABP Community Discord Server är platsen där du kan visa upp dina skapelser med ABP Framework, dela de tips som fungerade för dig, få de senaste nyheterna och tillkännagivandena om ABP Framework, bara chatta med medlemmar i samhället för att utbyta idéer och ha kul!",
"Discord_Page_Description_3": "Denna ABP Community Discord Server är den officiella med ABP Core Team närvarande på servern för att övervaka.",
"Discord_Page_JoinToServer": "Gå med i ABP Discord Server",
"Events_Page_MetaTitle": "ABP:s evenemang för allmänheten",
"Events_Page_MetaDescription": "Live-showerna, som leds av ABP-teamet, är avslappnade sessioner fulla av community-innehåll, demonstrationer, frågor och svar och diskussioner om vad som händer i ABP.",
"Events_Page_Title": "ABP<span class=\"gradient-community\"> Community</span> Samtal",
"Members_Page_WritingFromUser": "Läs skrivning från {0} på ABP Community.",
"Post_Create_Page_MetaTitle": "Ny post",
"Post_Create_Page_MetaDescription": "Skapa ditt inlägg för att dela med dig av dina erfarenheter om ABP-ramverket och bidra till ABP-communityn.",
"Post_Create_Page_CreateNewPost": "Skapa nytt inlägg",
"Post_Index_Page_MetaDescription": "ABP Communitys syfte är att skapa en bidragsmiljö för utvecklare som använder ABP-ramverket.",
"Layout_Title": "{0} | ABP Gemenskap",
"Layout_MetaDescription": "Ett nav för ABP Framework, .NET och programvaruutveckling. Få tillgång till artiklar, handledning, nyheter och bidra till ABP-communityn.",
"Index_Page_CommunityIntroduction": "Detta är ett nav för ABP Framework, .NET och programvaruutveckling. Du kan läsa artiklarna, titta på videohandledningarna, få information om ABP:s utvecklingsframsteg och ABP-relaterade evenemang, hjälpa andra utvecklare och dela med dig av din expertis till ABP-communityn.",
"TagsInArticle": "Taggar i artikel",
"IConsentToMedium": "Jag samtycker till publicering av detta inlägg på https://medium.com/volosoft.",
"SearchResultsFor": "Sökresultat för <span class=\"fw-bold\">\"{0}\"</span>",
"SeeMoreVideos": "Se fler videor",
"DiscordPageTitle": "ABP Discord Gemenskap",
"ViewVideo": "Visa video",
"AbpCommunityTitleContent": "ABP Community - ABP-ramverk med öppen källkod",
"CommunitySlogan": "En unik community-plattform för <span class=\"{0}\">ABP-älskare</span>.",
"RaffleIsNotActive": "Lottdragningen är inte aktiv",
"YouAreAlreadyJoinedToThisRaffle": "Du är redan med i utlottningen!",
"InvalidSubscriptionCode": "Ogiltig prenumerationskod",
"Raffle:{0}": "Lottdragning: {0}",
"Join": "Gå med",
"Leave": "Lämna",
"LoginToJoin": "Logga in för att gå med",
"ToEnd:": "För att avsluta:",
"ToStart:": "Det är en början:",
"days": "dagar",
"hrs": "timmar",
"min": "min",
"sec": "sek",
"Winners": "Vinnare",
"To{0}LuckyWinners": "till {0} lyckliga vinnare",
"ActiveRaffles": "Aktiva <span class=\"gradient-community\">Rafflar</span>.",
"UpcomingRaffles": "Kommande <span class=\"gradient-community\">Rafflar</span>",
"CompletedRaffles": "Färdigställda <span class=\"gradient-community\">Rafflar</span>",
"NoActiveRaffleTitle": "Ingen aktiv utlottning är tillgänglig för tillfället.",
"NoActiveRaffleDescription": "Ingen aktiv utlottning är tillgänglig för tillfället.",
"RaffleSubscriptionCodeInputMessage": "Denna utlottning kräver en registreringskod. Vänligen ange registreringskoden nedan:",
"RaffleSubscriptionCodeInputErrorMessage": "Registreringskoden är felaktig. Vänligen försök igen.",
"GoodJob!": "Bra jobbat!",
"RaffleJoinSuccessMessage": "Du är nu registrerad för utlottningen. Du kommer att informeras via e-post om du vinner priset!",
"RaffleLoginAndRegisterMessage": "Du måste logga in för att delta i utlottningen! Om du inte har registrerat dig ännu kan du skapa ett konto gratis nu.",
"Ok": "Ok",
"SeeDetails": "Se detaljer",
"WaitingForTheDraw": "Vänta på dragningen!",
"AllAttendees": "Alla deltagare",
"SeeRaffleDetail": "Se Raffle detalj",
"SeeRaffle": "Se Raffle",
"ParticipationIsComplete": "Deltagandet är fullständigt.",
"ABPCoreDevelopmentTeam": "ABP Core utvecklingsteam",
"RegisterTheEvent": "Registrera evenemanget",
"GoToConferencePage": "Gå till konferenssidan",
"BuyTicket": "Buy Ticket",
"SeeEvent": "Se evenemang",
"PreviousEvents": "<span class=\"text-sekundär\">Tidigare</span> evenemang",
"OtherLiveEvents": "Andra live-evenemang",
"SponsoredConferences": "Sponsrade konferenser",
"SponsoredConferencesDescription": "Vi är stolta över att stödja .NET-communities och evenemang för programvaruutvecklare.",
"UpcomingEvents": "<span class=\"text-info\">Kommande</span> evenemang",
"UpcomingCommunityTalkEventDescription": "Live-showerna, som leds av ABP-teamet, är avslappnade sessioner fulla av community-innehåll, demonstrationer, frågor och svar och diskussioner om vad som händer i ABP.",
"UpcomingConferenceEventDescription": "ABP .NET Conference är ett virtuellt evenemang för .NET-utvecklare där de kan träffas och lyssna på föredrag om .NET-världen, vanliga metoder för programvaruutveckling och ABP Framework med öppen källkod.",
"LastOneYear": "Senaste 1 året",
"AllTimes": "Alla tider",
"TopContributors": "De största bidragsgivarna",
"{0}Posts": "{0} Inlägg",
"LATESTPOSTS": "SENASTE INLÄGGNINGAR",
"NoContributorsFound": "Inga bidragsgivare hittades!",
"LatestPost": "Senaste inlägget",
"MEMBERSINCE{0}": "MEDLEM EFTERSOM {0}",
"CopyLink": "Kopiera länk",
"ShareOnTwitter": "Dela på Twitter",
"ShareOnLinkedIn": "Dela på LinkedIn",
"MoreFrom{0}": "Mer från {0}",
"SeeAllFrom{0}": "Se alla från {0}",
"MostWatched": "Mest bevakade",
"Articles({0})": "Artiklar ({0})",
"Videos({0})": "Videor ({0})",
"LatestArticles": "Senaste artiklar",
"RaffleHeader": "Hej ABP Community Member!",
"RafflesInfo": "<br>Det här är utlottningssidan som är avsedd att visa vår uppskattning för att du är en aktiv gemenskapsmedlem. Vi gör <a class=\"fw-6 \" href=\"https://community.abp.io/events\">ABP Community Talks</a> <a target=\"_blank\" class=\"fw-6\" href=\"https://abp.io/conference/2023\">,ABP .NET Conference</a>, deltar eller sponsrar .NET-relaterade evenemang där vi ger bort några gåvor. <br><br>Du kan följa den här sidan för att se kommande lotterier, delta i dem eller se tidigare lotterier som vi dragit inklusive vinnarna. <br><br>Tack för att du är en aktiv medlem! Vi ses i de kommande lotterierna.",
"RafflesInfoTitle": "ABP Community <span class=\"gradient-community\">Rafflar</span>.",
"ToLuckyWinner": "till 1 lycklig vinnare",
"MarkdownSupported": "Stöd för <a href=\"https://www.markdownguide.org/basic-syntax/\">Markdown</a>.",
"Preview": "Förhandsgranskning",
"VisitPage": "Besök sidan",
"VisitVideoCourseDescription": "Om du vill lära dig grunderna i ABP-ramverket kan du kolla in videokurserna ABP Essentials.",
"EditProfile": "Redigera profil",
"ConfirmEmailForPost": "För att kunna göra inlägg måste du bekräfta din e-post. Gå till account.abp.io/Account/Manage och verifiera din e-postadress under fliken Personal Info.",
"DailyPostCreateLimitation": "Du har nått den dagliga gränsen för skapande av inlägg. Du kan skapa ett nytt inlägg i {0}.",
"YourAccountDisabled": "Ditt användarkonto är inaktiverat!"
}
}

9
abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/sv.json

@ -0,0 +1,9 @@
{
"culture": "sv",
"texts": {
"Buy": "Köp",
"SeeBookDetails": "Se bokdetaljer",
"MasteringAbpFrameworkEBookDescription": "Den här boken hjälper dig att få en fullständig förståelse för ramverket och moderna tekniker för utveckling av webbapplikationer.",
"Feedback": "Återkoppling"
}
}

6
abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/sv.json

@ -0,0 +1,6 @@
{
"culture": "sv",
"texts": {
"FAQ": "VANLIGA FRÅGOR"
}
}

1828
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/sv.json

File diff suppressed because it is too large

4
common.props

@ -1,8 +1,8 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>8.3.1</Version>
<LeptonXVersion>3.3.1</LeptonXVersion>
<Version>8.3.4</Version>
<LeptonXVersion>3.3.4</LeptonXVersion>
<NoWarn>$(NoWarn);CS1591;CS0436</NoWarn>
<PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>https://abp.io/</PackageProjectUrl>

2
docs/en/Community-Articles/2020-08-18-Using-DevExtreme-Components-With-The-ABP-Framework/Using-DevExtreme-Components-With-The-ABP-Framework.md

@ -1,4 +1,4 @@
## Using DevExtreme Components With the ABP Framework
# Using DevExtreme Components With the ABP Framework
Hi, in this step by step article, I will show you how to integrate [DevExtreme](https://js.devexpress.com/) components into ABP Framework-based applications.

2
docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/POST.md

@ -1,4 +1,4 @@
## Using DevExpress Blazor UI Components With the ABP Framework
# Using DevExpress Blazor UI Components With the ABP Framework
Hi, in this step by step article, I will show you how to integrate [DevExpress](https://demos.devexpress.com/blazor/) blazor UI components into ABP Framework-based applications.

2
docs/en/Community-Articles/2021-01-20-How-to-Integrate-the-MatBlazor-Blazor-Component/POST.md

@ -1,4 +1,4 @@
## Using MatBlazor UI Components With the ABP Framework
# Using MatBlazor UI Components With the ABP Framework
Hi, in this step by step article, I will show you how to integrate [MatBlazor](https://www.matblazor.com/), a blazor UI components into ABP Framework-based applications.

2
docs/en/Community-Articles/2021-04-22-How-to-Integrate-the-Syncfusion-Blazor-Component/POST.md

@ -1,4 +1,4 @@
## Integrating SyncFusion UI with ABP Framework Blazor UI
# Integrating SyncFusion UI with ABP Framework Blazor UI
Hi, in this step by step article, I will show you how to integrate [Syncfusion](https://www.syncfusion.com/blazor-components), a blazor UI components into ABP Framework-based applications.

2
docs/en/Community-Articles/2023-02-22-Streamline-Localization-In-Your-ABP-Project/POST.md

@ -1,4 +1,4 @@
## Streamline Localization in Your ABP Project
# Streamline Localization in Your ABP Project
Making localization changes to an ABP project can be a daunting task, especially if you're dealing with multiple languages and translations. During development, it's easy to overlook some changes and that leads to inconsistencies across different languages. Fortunately, I have developed a tool that can help streamline the localization process and ensure consistency across different languages.

2
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/Post.md

@ -1,4 +1,4 @@
## Introduction
# Introduction
In this article, I will talk about the relationships of IdentityUser in every web application that can be created with the ABP framework. When you read this article, you will learn how to extend the user entity in the applications you develop using the ABP framework with a primitive type, extending the user by associating the user with another entity (User-many-to-one-X).

5
docs/en/cli/index.md

@ -2,7 +2,7 @@
ABP CLI (Command Line Interface) is a command line tool to perform some common operations for ABP based solutions or ABP Studio features.
> 🛈 With **v8.2+**, the old/legacy ABP CLI has been replaced with a new CLI system to align with the new templating system and [ABP Studio](../studio/index.md). The new ABP CLI commands are explained in this documentation. However, if you want to learn more about the differences between the old and new CLIs, want to learn the reason for the change, or need guidance to use the old ABP CLI, please refer to the [Old vs New CLI](differences-between-old-and-new-cli.md) documentation.
> With **v8.2+**, the old/legacy ABP CLI has been replaced with a new CLI system to align with the new templating system and [ABP Studio](../studio/index.md). The new ABP CLI commands are explained in this documentation. However, if you want to learn more about the differences between the old and new CLIs, want to learn the reason for the change, or need guidance to use the old ABP CLI, please refer to the [Old vs New CLI](differences-between-old-and-new-cli.md) documentation.
>
> You may need to remove the Old CLI before installing the New CLI, by running the following command: `dotnet tool uninstall -g Volo.Abp.Cli`
@ -141,6 +141,9 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md
* `angular`: Angular UI. There are some additional options for this template:
* `--tiered`: The Auth Server project comes as a separate project and runs at a different endpoint. It separates the Auth Server from the API Host application. If not specified, you will have a single endpoint in the server side. (*Available for* ***Team*** *or higher licenses*)
* `--progressive-web-app` or `-pwa`: Specifies the project as Progressive Web Application.
* `blazor-webapp`: Blazor Web App UI. There are some additional options for this template:
* `--tiered`: The Auth Server and the API Host project comes as separate projects and run at different endpoints. It has 3 startup projects: *HttpApi.Host*, *AuthServer* and *Blazor* and and each runs on different endpoints. If not specified, you will have a single endpoint for your web project.
* `--progressive-web-app` or `-pwa`: Specifies the project as Progressive Web Application.
* `blazor`: Blazor UI. There are some additional options for this template:
* `--tiered`The Auth Server project comes as a separate project and runs at a different endpoint. It separates the Auth Server from the API Host application. If not specified, you will have a single endpoint in the server side. (*Available for* ***Team*** *or higher licenses*)
* `--progressive-web-app` or `-pwa`: Specifies the project as Progressive Web Application.

60
docs/en/deployment/clustered-environment.md

@ -1,14 +1,15 @@
# Deploying to a Clustered Environment
This document introduces the topics that you should consider when you are deploying your application to a clustered environment where **multiple instances of your application run concurrently**, and explains how you can deal with these topics in your ABP based application.
This document explains the topics that you should consider when deploying your application to a clustered environment where multiple instances of your application run concurrently.
It explains how you can deal with these topics in your ABP application.
> This document is valid regardless you have a monolith application or a microservice solution. The Application term is used for a process. An application can be a monolith web application, a service in a microservice solution, a console application, or another kind of an executable process.
>
> For example, if you are deploying your application to Kubernetes and configure your application or service to run in multiple pods, then your application or service runs in a clustered environment.
> This document is eligible for both monolith and microservice solutions.
> The Application term is used for a process. An application can be a monolith web application, a service in a microservice solution, a console application, or another executable process.
> For example, if you are deploying your application to Kubernetes and configuring your application or service to run in multiple pods, then your application or service runs in a clustered environment.
## Understanding the Clustered Environment
> You can skip this section if you are already familiar with clustered deployment and load balancers.
> You can skip this section if you are familiar with clustered deployment and load balancers.
### Single Instance Deployment
@ -16,11 +17,15 @@ Consider an application deployed as a **single instance**, as illustrated in the
![deployment-single-instance](../images/deployment-single-instance.png)
Browsers and other client applications can directly make HTTP requests to your application. You can put a web server (e.g. IIS or NGINX) between the clients and your application, but you still have a single application instance running in a single server or container. Single-instance configuration is **limited to scale** since it runs in a single server and you are limited with the server's capacity.
Browsers and other client applications can directly make HTTP requests to your application.
You can locate a web server (e.g. IIS or NGINX) between the clients and your application, but you still have a single application instance running in a single server or container.
A single instance configuration is **limited by scale** because it runs on a single server, and the capacity of the server may limit the application's performance.
### Clustered Deployment
**Clustered deployment** is the way of running **multiple instances** of your application **concurrently** in a single or multiple servers. In this way, different instances can serve different requests and you can scale by adding new servers to the system. The following figure shows a typical implementation of clustering using a **load balancer**:
**Clustered deployment** is the way of running **multiple instances** of your application **concurrently** in a single or multiple servers.
In this architecture, different instances can serve different requests, and you can scale them by adding new servers to the system.
The following figure shows a typical implementation of clustering using a **load balancer**:
![deployment-clustered](../images/deployment-clustered.png)
@ -28,53 +33,56 @@ Browsers and other client applications can directly make HTTP requests to your a
[Load balancers](https://en.wikipedia.org/wiki/Load_balancing_(computing)) have a lot of features, but they fundamentally **forward an incoming HTTP request** to an instance of your application and return your response back to the client application.
Load balancers can use different algorithms for selecting the application instance while determining the application instance that is used to deliver the incoming request. **Round Robin** is one of the simplest and most used algorithms. Requests are delivered to the application instances in rotation. First instance gets the first request, second instance gets the second, and so on. It returns to the first instance after all the instances are used, and the algorithm goes like that for the next requests.
Load balancers can use different algorithms to route the requests to an application instance. [Round Robin](https://en.wikipedia.org/wiki/Round-robin_scheduling) is one of the simplest and most used algorithms. Requests are delivered to the application instances in rotation. The first instance gets the first request; the second instance gets the second, and so on. It returns to the first instance after all the instances are used, and the algorithm iterates like this until the next request.
### Potential Problems
Once multiple instances of your application run in parallel, you should carefully consider the following topics:
* Any **state (data) stored in memory** of your application will become a problem when you have multiple instances. A state stored in memory of an application instance may not be available in the next request since the next request will be handled by a different application instance. While there are some solutions (like sticky sessions) to overcome this problem user-basis, it is a **best practice to design your application as stateless** if you want to run it in a cluster, container or/and cloud.
* Any **state (data) stored in memory** of your application will become a problem when you have multiple instances. A state stored in the memory of an application instance may not be available in the next request since the next request will be handled by a different application instance. While there are some solutions (like sticky sessions) to overcome this problem on a user basis, it is a **best practice to design your application as stateless** if you want to run it in a cluster, container or/and cloud.
* **In-memory caching** is a kind of in-memory state and should not be used in a clustered application. You should use **distributed caching** instead.
* You shouldn't store data in the **local file system**. It should be available to all instances of your application. Different application instance may run in different containers or servers and they may not be able to have access to the same file system. You can use a **cloud or external storage provider** as a solution.
* If you have **background workers** or **job queue managers**, you should be careful since multiple instances may try to execute the same job or perform the same work concurrently. As a result, you may have the same work done multiple times or you may get a lot of errors while trying to access and change the same resources.
* If you have **background workers** or **job queue managers**, you should be careful since multiple instances may try to execute the same job or perform the same work concurrently. As a result, you may have the same work done multiple times, or you may get a lot of errors while trying to access and change the same resources.
You may have more problems with clustered deployment, but these are the most common ones. ABP has been designed to be compatible with the clustered deployment scenario. The following sections explain what you should do when you are deploying your ABP based application to a clustered environment.
## Switching to a Distributed Cache
ASP.NET Core provides different kind of caching features. [In-memory cache](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory) stores your objects in the memory of the local server and is only available to the application that stored the object. Non-sticky sessions in a clustered environment should use the [distributed caching](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed) except some specific scenarios (for example, you can cache a local CSS file into memory. It is read-only data and it is the same in all application instances. You can cache it in memory for performance reasons without any problem).
ASP.NET Core provides different kinds of caching features. [In-memory cache](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory) stores your objects in the memory of the local server and is only available to the application that stores the object. Non-sticky sessions in a clustered environment should use the [distributed caching](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed) except for some specific scenarios (for example, you can cache a local CSS file into memory. It is read-only data and it is the same in all application instances. You can cache it in memory for performance reasons without any problem).
[ABP's Distributed Cache](../framework/fundamentals/caching.md) extends [ASP.NET Core's distributed cache](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed) infrastructure. It works in-memory by default. You should configure an actual distributed cache provider when you want to deploy your application to a clustered environment.
[ABP's Distributed Cache](../framework/fundamentals/caching.md) extends [ASP.NET Core's distributed cache](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed) infrastructure. It works in memory by default. You should configure an actual distributed cache provider when you want to deploy your application to a clustered environment.
> You should configure the cache provider for clustered deployment, even if your application doesn't directly use `IDistributedCache`. Because the ABP and the pre-built [application modules](../modules) are using distributed cache.
> You should configure the cache provider for clustered deployment, even if your application doesn't directly use `IDistributedCache`.
> The ABP and the pre-built [application modules](../modules) use distributed cache.
ASP.NET Core provides multiple integrations to use as your distributed cache provider, like [Redis](https://redis.io/) and [NCache](https://www.alachisoft.com/ncache/). You can follow [Microsoft's documentation](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed) to learn how to use them in your applications.
If you decided to use Redis as your distributed cache provider, **follow [ABP's Redis Cache Integration document](../framework/fundamentals/redis-cache.md)** for the steps you need to follow to install it into your application and setup your Redis configuration.
> Based on your preferences while creating a new ABP solution, Redis cache might be pre-installed in your solution. For example, if you have selected the *Tiered* option with the MVC UI, Redis cache comes as pre-installed. Because, in this case, you have two applications in your solution and they should use the same cache source to be consistent.
> Depending on your preferences when creating a new ABP solution, Redis cache might be pre-installed.
> For example, if you select the *Tiered* option with the MVC UI, the Redis cache will be pre-installed by default.
> Because, in this case, you have two applications in your solution that should use the same cache source to be consistent.
## Using a Proper BLOB Storage Provider
If you have used ABP's [BLOB Storing](../framework/infrastructure/blob-storing) feature with the [File System provider](../framework/infrastructure/blob-storing/file-system.md), you should use another provider in your clustered environment since the File System provider uses the application's local file system.
If you use ABP's [BLOB Storing](../framework/infrastructure/blob-storing) feature with the [File System provider](../framework/infrastructure/blob-storing/file-system.md), you should use another provider in your clustered environment since the File System provider uses the application's local file system.
The [Database BLOB provider](../framework/infrastructure/blob-storing/database.md) is the easiest way since it uses your application's main database (or another database if you configure) to store BLOBs. However, you should remember that BLOBs are large objects and may quickly increase your database's size.
The [Database BLOB provider](../framework/infrastructure/blob-storing/database.md) is the easiest way since it uses your application's main database (or another database if you configure it) to store BLOBs. However, you should remember that BLOBs are large objects and may quickly increase your database's size.
> [ABP](https://abp.io/) startup solution templates come with the database BLOB provider as pre-installed, and stores BLOBs in the application's database.
> [ABP](https://abp.io/) startup solution templates come with the database BLOB provider as pre-installed and store BLOBs in the application's database.
Check the [BLOB Storing](../framework/infrastructure/blob-storing) document to see all the available BLOB storage providers.
## Configuring Background Jobs
ABP's [background job system](../framework/infrastructure/background-jobs) is used to queue tasks to be executed in the background. Background job queue is persistent and a queued task is guaranteed to be executed (it is re-tried if it fails).
ABP's [background job system](../framework/infrastructure/background-jobs) queues tasks to be executed in the background. The background job queue is persistent, and a queued task is guaranteed to be executed (it will retry if it fails).
ABP's default background job manager is compatible with clustered environments. It uses a [distributed lock](../framework/infrastructure/distributed-locking.md) to ensure that the jobs are executed only in a single application instance at a time. See the *Configuring a Distributed Lock Provider* section below to learn how to configure a distributed lock provider for your application, so the default background job manager properly works in a clustered environment.
ABP's default background job manager is compatible with clustered environments. It uses a [distributed lock](../framework/infrastructure/distributed-locking.md) to ensure that the jobs are executed only in a single application instance at a time. See the *Configuring a Distributed Lock Provider* section below to learn how to configure a distributed lock provider for your application. Hence, the default background job manager properly works in a clustered environment.
If you don't want to use a distributed lock provider, you may go with the following options:
* Stop the background job manager (set `AbpBackgroundJobOptions.IsJobExecutionEnabled` to `false`) in all application instances except one of them, so only the single instance executes the jobs (while other application instances can still queue jobs).
* Stop the background job manager (set `AbpBackgroundJobOptions.IsJobExecutionEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background jobs. This can be a good option if your background jobs consume high system resources (CPU, RAM or Disk), so you can deploy that background application to a dedicated server and your background jobs don't affect your application's performance.
* Stop the background job manager (set `AbpBackgroundJobOptions.IsJobExecutionEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background jobs. This can be a good option if your background jobs consume high system resources (CPU, RAM, disk), you can deploy that background application to a dedicated server and your background jobs don't affect your application's performance.
> If you are using an external background job integration (e.g. [Hangfire](../framework//infrastructure/background-workers/hangfire.md) or [Quartz](../framework//infrastructure/background-workers/quartz.md)) instead of the default background job manager, then please refer to your provider's documentation to learn how it should be configured for a clustered environment.
@ -82,13 +90,13 @@ If you don't want to use a distributed lock provider, you may go with the follow
ABP provides a distributed locking abstraction with an implementation made with the [DistributedLock](https://github.com/madelson/DistributedLock) library. A distributed lock is used to control concurrent access to a shared resource by multiple applications to prevent corruption of the resource because of concurrent writes. The ABP and some pre-built [application modules](../modules) are using distributed locking for several reasons.
However, the distributed lock system works in-process by default. That means it is not distributed actually, unless you configure a distributed lock provider. So, please follow the [distributed lock](../framework/infrastructure/distributed-locking.md) document to configure a provider for your application, if it is not already configured.
However, the distributed lock system works in-process by default. That means it is not actually distributed unless you configure a distributed lock provider. So, please follow the [distributed lock](../framework/infrastructure/distributed-locking.md) document to configure a provider for your application if it is not already configured.
## Configuring SignalR
ABP provides [SignalR](../framework/real-time/signalr.md) integration packages to simplify integration and usage. SignalR can be used whenever you need to add real-time web functionality (real-time messaging, real-time notification etc.) into your application.
SignalR requires that all HTTP requests for a specific connection be handled (needs to keep track of all its connections) by the same server process. So, when SignalR is running on a clustered environment (with multiple servers) **"sticky sessions"** must be used.
SignalR requires that all HTTP requests for a specific connection be handled (needs to keep track of all its connections) using the same server process. So, when SignalR is running on a clustered environment (with multiple servers), **"sticky sessions"** must be used.
If you are considering [scaling out](https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0#scale-out) your servers and don't want to have inconsistency with the active socket connections, you can use [Azure SignalR Service](https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0#azure-signalr-service) or [Redis backplane](https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0#redis-backplane).
@ -100,10 +108,10 @@ ASP.NET Core provides [hosted services](https://docs.microsoft.com/en-us/aspnet/
If your application has tasks running in the background, you should consider how they will behave in a clustered environment, especially if your background tasks are using the same resources. You should design your background tasks so that they continue to work properly in the clustered environment.
Assume that your background worker in your SaaS application checks user subscriptions and sends emails if their subscription renewal date approaches. If the background task runs in multiple application instances, it is probable to send the same email many times to some users, which will disturb them.
Suppose your SaaS application checks user subscriptions in the background and sends emails to those whose subscription renewal dates are approaching. If the background task runs on multiple application instances, users may get duplicate e-mails.
We suggest you to use one of the following approaches to overcome the problem:
Use one of the following approaches to overcome the **multiple workers same pool problem**:
* Implement your background workers so that they work in a clustered environment without any problem. Using the [distributed lock](../framework/infrastructure/distributed-locking.md) to ensure concurrency control is a way of doing that. A background worker in an application instance may handle a distributed lock, so the workers in other application instances will wait for the lock. In this way, only one worker does the actual work, while others wait in idle. If you implement this, your workers run safely without caring about how the application is deployed.
* Implement your background workers so that they work in a clustered environment without any problems. Using the [distributed lock](../framework/infrastructure/distributed-locking.md) to ensure concurrency control is a way of doing that. A background worker in an application instance may handle a distributed lock, so the workers in other application instances will wait for the lock. In this way, only one worker does the actual work while others wait in an idle state. If you implement this, your workers run safely without caring about how the application is deployed.
* Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances except one of them, so only the single instance runs the workers.
* Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background tasks. This can be a good option if your background workers consume high system resources (CPU, RAM or Disk), so you can deploy that background application to a dedicated server and your background tasks don't affect your application's performance.
* Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background tasks. This can be a good option if your background workers consume high system resources (CPU, RAM, disk), so you can deploy that background application to a dedicated server and your background tasks don't affect your application's performance.

6
docs/en/deployment/configuring-openIddict.md

@ -26,7 +26,7 @@ public override void PreConfigureServices(ServiceConfigurationContext context)
## Development Environment
We've enabled `AddDevelopmentEncryptionAndSigningCertificate` by default on the development environment. It registers (and generates if necessary) a user-specific development encryption/development signing certificate. This is a certificate used for signing and encrypting the tokens and for **development environment only**.
`AddDevelopmentEncryptionAndSigningCertificate` is enabled by default on the development environment. It registers (and also generates, if necessary, a user-specific development encryption/development signing certificate. This is a certificate used for signing and encrypting the tokens and for **development environment only**.
`AddDevelopmentEncryptionAndSigningCertificate` cannot be used in applications deployed on IIS or Azure App Service: trying to use them on IIS or Azure App Service will result in an exception being thrown at runtime (unless the application pool is configured to [load a user profile](https://learn.microsoft.com/en-us/iis/manage/configuring-security/application-pool-identities#user-profile)).
@ -34,9 +34,9 @@ To avoid that, consider creating self-signed certificates and storing them in th
## Production Environment
We've disabled `AddDevelopmentEncryptionAndSigningCertificate` in the production environment and tried to setup signing and encrypting certificates using `openiddict.pfx` file.
`AddDevelopmentEncryptionAndSigningCertificate` is disabled in production environment. Signing and encryption of certificates is done using `openiddict.pfx` file in production environment.
You can use the `dotnet dev-certs https -v -ep openiddict.pfx -p 00000000-0000-0000-0000-000000000000` command to generate the `authserver.pfx` certificate.
You can use the `dotnet dev-certs https -v -ep openiddict.pfx -p 00000000-0000-0000-0000-000000000000` command to generate the `openiddict.pfx` certificate.
> `00000000-0000-0000-0000-000000000000` is the password of the certificate, you can change it to any password you want.

37
docs/en/deployment/configuring-production.md

@ -1,10 +1,13 @@
# Configuring Your Application for Production Environments
ABP has a lot of options to configure and fine-tune its features. They are all explained in their own documents. Default values for these options are pretty well for most of the deployment environments. However, you may need to care about some options based on how you've structured your deployment environment. In this document, we will highlight these kind of options. So, it is highly recommended to read this document in order to not have unexpected behaviors in your system in production.
ABP predefines the configurations for the best performance for common deployment scenarios.
However, depending on how you have structured your deployment environment, you may need to consider some extra options. This document highlights these options.
It is highly recommended that you read it to prevent unexpected behaviors in your production environment.
## Distributed Cache Prefix
ABP's [distributed cache infrastructure](../framework/fundamentals/caching.md) provides an option to set a key prefix for all of your data that is saved into your distributed cache provider. The default value of this option is not set (it is `null`). If you are using a distributed cache server that is shared by different applications, then you can set a prefix value to isolate an application's cache data from others.
ABP's [distributed cache infrastructure](../framework/fundamentals/caching.md) provides an option to set a key prefix for all your data saved into your distributed cache provider.
The default value of this option is not set (it is `null`). If you are using a distributed cache server that is shared by different applications, then you can set a prefix value to isolate an application's cache data from others.
````csharp
Configure<AbpDistributedCacheOptions>(options =>
@ -13,19 +16,21 @@ Configure<AbpDistributedCacheOptions>(options =>
});
````
That's all. ABP, then will add this prefix to all of your cache keys in your application as along as you use ABP's `IDistributedCache<TCacheItem>` or `IDistributedCache<TCacheItem,TKey>` services. See the [Caching documentation](../framework/fundamentals/caching.md) if you are new to distributed caching.
That's all! This prefix will be added to all cache keys in your application, as long as you use ABP's `IDistributedCache<TCacheItem>` or `IDistributedCache<TCacheItem,TKey>` services.
If you are new to distributed caching, check out the [caching documentation](../framework/fundamentals/caching.md).
> **Warning**: If you use ASP.NET Core's standard `IDistributedCache` service, it's your responsibility to add the key prefix (you can get the value by injecting `IOptions<AbpDistributedCacheOptions>`). ABP can not do it.
> **Warning**: If you use ASP.NET Core's standard `IDistributedCache` [service](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.caching.distributed.idistributedcache), it is your responsibility to add the key prefix (you can get the value by injecting `IOptions<AbpDistributedCacheOptions>`). ABP can not do it anymore.
> **Warning**: Even if you have never used distributed caching in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your caching server is shared among multiple systems.
> **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed cache server. In such systems, all applications (or services) should normally use the same cache prefix, because you want all the applications to use the same cache data to have consistency between them.
> **Warning**: If you are building a microservice architecture, then you will have multiple applications that share the same distributed cache server. All applications (sub-services) in these systems should use the same cache prefix and cache values to have application-wide consistency.
> **Warning**: Some of ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured.
> **Warning**: Some of ABP's startup templates are pre-configured to set a prefix value for the distributed cache. If your application code is already configured, please check it.
## Distributed Lock Prefix
ABP's [distributed locking infrastructure](../framework/infrastructure/distributed-locking.md) provides an option to set a prefix for all the keys you are using in the distributed lock server. The default value of this option is not set (it is `null`). If you are using a distributed lock server that is shared by different applications, then you can set a prefix value to isolate an application's lock from others.
ABP's [distributed locking infrastructure](../framework/infrastructure/distributed-locking.md) provides an option to set a prefix for all the keys you use in the distributed lock server. The default value of this option is not set (it is `null`). If you use a distributed lock server shared by different applications, you can set a prefix value to isolate an application's lock from others.
````csharp
Configure<AbpDistributedLockOptions>(options =>
@ -34,29 +39,31 @@ Configure<AbpDistributedLockOptions>(options =>
});
````
That's all. ABP, then will add this prefix to all of your keys in your application. See the [Distributed Locking documentation](../framework/infrastructure/distributed-locking.md) if you are new to distributed locking.
That's all! ABP will add this prefix to all of your keys in your application. See the [Distributed Locking documentation](../framework/infrastructure/distributed-locking.md) if you are new to distributed locking.
> **Warning**: Even if you have never used distributed locking in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your distributed lock server is shared among multiple systems.
> **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed locking server. In such systems, all applications (or services) should normally use the same lock prefix, because you want to globally lock your resources in your system.
> **Warning**: Some of ABP's startup templates are pre-configured to set a prefix value for distributed locking. So, please check your application code if it is already configured.
> **Warning**: Some of ABP's startup templates are pre-configured to set a prefix value for distributed locking. Please check your application code to see if it has already been configured.
## Email Sender
ABP's [Email Sending](../framework/infrastructure/emailing.md) system abstracts sending emails from your application and module code and allows you to configure the email provider and settings in a single place.
Email service is configured to write email contents to the standard [application log](../framework/fundamentals/logging.md) in development environment. You should configure the email settings to be able to send emails to users in your production environment.
For the development environment, ABP will not send real emails. The email service is configured to write email contents in the development environment's standard [application log](../framework/fundamentals/logging.md). By default, it will write to the `Logs.txt` in your host project's `Logs` folder. You should configure the email settings to be able to send emails to users in your production environment.
Please see the [Email Sending](../framework/infrastructure/emailing.md) document to learn how to configure its settings to really send emails.
See the [Sending Email](../framework/infrastructure/emailing.md) document to learn what settings to configure to send actual email without writing to the logs.
> **Warning**: If you don't configure the email settings, you will get errors while trying to send emails. For example, the [Account module](../modules/account.md)'s *Password Reset* feature sends email to the users to reset their passwords if they forget it.
## SMS Sender
ABP's [SMS Sending abstraction](../framework/infrastructure/sms-sending.md) provides a unified interface to send SMS to users. However, its implementation is left to you. Because, typically a paid SMS service is used to send SMS, and ABP doesn't depend on a specific SMS provider.
ABP's [SMS Sending abstraction](../framework/infrastructure/sms-sending.md) provides a unified interface for sending SMS to users.
However, its implementation is left to you. Typically, a paid SMS service is used to send SMS, and ABP doesn't depend on a specific SMS provider.
> PRO users can use the [Twilio SMS module](../modules/twilio-sms.md) to send SMS.
So, if you are using the `ISmsSender` service, you must implement it yourself, as shown in the following code block:
In the following code-block you can see where to implement the `ISmsSender` service:
````csharp
public class MySmsSender : ISmsSender, ITransientDependency
@ -89,11 +96,11 @@ Configure<AbpStringEncryptionOptions>(options =>
});
````
Note that ABP CLI automatically sets the password to a random value on a new project creation. However, it is stored in the `appsettings.json` file and is generally added to your source control. It is suggested to use [User Secrets](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets) or [Environment Variables](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration) to set that value.
Note that ABP CLI automatically sets the password to a random value on new project creation. However, it is stored in the `appsettings.json` file and is generally added to your source control. It is suggested to use [User Secrets](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets) or [Environment Variables](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration) to set that value.
## Logging
ABP uses .NET's standard [Logging services](../framework/fundamentals/logging.md). So, it is compatible with any logging provider that works with .NET. ABP's startup solution templates come with [Serilog](https://serilog.net/) pre-installed and configured for you. It writes logs to file system and console with the initial configuration. File system is useful for development environment, but it is suggested you to use a different provider for your production environment, like Elasticsearch, database or any other provider that can properly work.
ABP uses .NET's standard [Logging services](../framework/fundamentals/logging.md). So, it is compatible with any logging provider that works with .NET. ABP's startup solution templates come with [Serilog](https://serilog.net/) pre-installed and configured for you. It writes logs to the file system and console with the initial configuration. The file system is useful for the development environment, but it is suggested you use a different provider for your production environment, like Elasticsearch, database or any other provider that can properly work.
## The Swagger UI

12
docs/en/deployment/distributed-microservice.md

@ -1,6 +1,6 @@
# Deploying Distributed / Microservice Solutions
The ABP is designed to consider distributed and microservice systems, where you have multiple applications and/or services communicating internally. All of its features are compatible with distributed scenarios. This document highlights some points you should care about when you deploy your distributed or microservice solution.
ABP is designed for distributed and microservice systems, where multiple applications and/or services communicate internally. All of its features are compatible with distributed scenarios. This document highlights some points you should consider when deploying your distributed or microservice solution.
## Application Name & Instance Id
@ -9,7 +9,7 @@ ABP provides the `IApplicationInfoAccessor` service that provides the following
* `ApplicationName`: A human-readable name for an application. It is a unique value for an application.
* `InstanceId`: A random (GUID) value generated by the ABP each time you start the application.
These values are used by the ABP in several places to distinguish the application and the application instance (process) in the system. For example, the [audit logging](../framework/infrastructure/audit-logging.md) system saves the `ApplicationName` in each audit log record written by the related application, so you can understand which application has created the audit log entry. So, if your system consists of multiple applications saving audit logs to a single point, you should be sure that each application has a different `ApplicationName`.
ABP uses these values in several places to distinguish the application and the application instance (process) in the system. For example, the [audit logging](../framework/infrastructure/audit-logging.md) system saves the `ApplicationName` in each audit log record written by the related application so you can understand which application has created the audit log entry. So, if your system consists of multiple applications saving audit logs to a single point, you should be sure that each application has a different `ApplicationName`.
The `ApplicationName` property's value is set automatically from the **entry assembly's name** (generally, the project name in a .NET solution) by default, which is proper for most cases, since each application typically has a unique entry assembly name.
@ -32,13 +32,13 @@ await builder.AddApplicationAsync<OrderingServiceHttpApiHostModule>(options =>
## Using a Distributed Event Bus
ABP's [Distributed Event Bus](../framework/infrastructure/event-bus/distributed) system provides a standard interface to communicate with other applications and services. While the name is "distributed", the default implementation is in-process. That means, your applications / services can not communicate with each other unless you explicitly configure a distributed event bus provider.
ABP's [Distributed Event Bus](../framework/infrastructure/event-bus/distributed) system provides a standard interface for communicating with other applications and services. While the name is "distributed," the default implementation is in process. That means your applications/services can not communicate with each other unless you explicitly configure a distributed event bus provider.
If you are building a distributed system, then the applications should communicate through an external distributed messaging server. Please follow the [Distributed Event Bus](../framework/infrastructure/event-bus/distributed) document to learn how to install and configure your distributed event bus provider.
The applications should communicate through an external distributed messaging server if you are building a distributed system. Please follow the [Distributed Event Bus](../framework/infrastructure/event-bus/distributed) document to learn how to install and configure your distributed event bus provider.
> **Warning**: Even if you don't use the distributed event bus directly in your application code, the ABP and some of the modules you are using may use it. So, if you are building a distributed system, always configure a distributed event bus provider.
> **Warning**: Even if you do not use the distributed event bus directly in your application code, ABP and some of the modules you are using may use it. So, if you are building a distributed system, always configure a distributed event bus provider.
> **Info**: [Clustered deployment](./clustered-environment.md) of a single application is not considered as a distributed system. So, if you only have a single application with multiple instances serving behind a load balancer, a real distributed messaging server may not be needed.
> **Info**: [Clustered deployment](./clustered-environment.md) of a single application is not considered as distributed system. So, a real distributed messaging server may not be needed if you only have a single application with multiple instances serving behind a load balancer.
## See Also

4
docs/en/deployment/index.md

@ -1,6 +1,6 @@
# Deployment
Deploying an ABP application is not different than deploying any .NET or ASP.NET Core application. You can deploy it to a cloud provider (e.g. Azure, AWS, Google Could) or on-premise server, IIS or any other web server. ABP's documentation doesn't contain much information on deployment. You can refer to your provider's documentation.
Deploying an ABP application is not different than deploying any .NET or ASP.NET Core application. You can deploy it to a cloud provider (e.g., Azure, AWS, Google Could) or an on-premise server, IIS or any other web server. ABP's documentation doesn't contain much information on deployment. You can refer to your provider's documentation.
However, there are some topics that you should care about when you are deploying your applications. Most of them are general software deployment considerations, but you should understand how to handle them within your ABP based applications. We've prepared guides for this purpose and we suggest you to read these guides carefully before designing your deployment configuration.
@ -9,6 +9,6 @@ However, there are some topics that you should care about when you are deploying
* [Configuring SSL certificate(HTTPS)](./ssl.md): Explains how to configure SSL certificate(HTTPS) for your application.
* [Configuring OpenIddict](./configuring-openIddict.md): Notes for some essential configurations for OpenIddict.
* [Configuring for Production](./configuring-production.md): Notes for some essential configurations for production environments.
* [Optimization for Production](./optimizing-production.md): Tips and suggestions for optimizing your application on production environments.
* [Optimization for Production](./optimizing-production.md): Tips and suggestions for optimizing your application in production environments.
* [Deploying to a Clustered Environment](./clustered-environment.md): Explains how to configure your application when you want to run multiple instances of your application concurrently.
* [Deploying Distributed / Microservice Solutions](./distributed-microservice.md): Deployment notes for solutions consisting of multiple applications and/or services.

20
docs/en/deployment/optimizing-production.md

@ -1,22 +1,26 @@
# Optimizing Your Application for Production Environments
ABP and the startup solution templates are configured well to get the maximum performance on production environments. However, there are still some points you need to pay attention to in order to optimize your system in production. In this document, we will mention some of these topics.
ABP and the startup solution templates are configured well to get the maximum performance on production environments.
However, you still need to pay attention to some points to optimize your system in production.
This document will explain optimization points for the production environment.
## Caching Static Contents
The following items are contents that can be cached in the client side (typically in the Browser) or in a CDN server:
The following items are contents that can be cached on the client side (typically in the Browser) or in a CDN server:
* **Static images** can always be cached. Here, you should be careful that if you change an image, use a different file name, or use a versioning query-string parameter, so the browser (or CDN) understands it's been changed.
* **CSS and JavaScript files**. ABP's [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) system always uses a query-string versioning parameter and a hash value in the files names of the CSS & JavaScript files for the [MVC (Razor Pages)](../framework/ui/mvc-razor-pages/overall.md) UI. So, you can safely cache these files in the client side or in a CDN server.
* **Static images** can always be cached. Here, you should be careful that if you change an image, use a different file name, or use a versioning query-string parameter so the browser (or CDN) understands it's been changed.
* **CSS and JavaScript files**. ABP's [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) system always uses a query-string versioning parameter and a hash value in the files names of the CSS & JavaScript files for the [MVC (Razor Pages)](../framework/ui/mvc-razor-pages/overall.md) UI. So you can safely cache these files on the client side or on a CDN server.
* **Application bundle files** of an [Angular UI](../framework/ui/angular/quick-start.md) application.
* **[Application Localization Endpoint](../framework/api-development/standard-apis/localization.md)** can be cached per culture (it already has a `cultureName` query string parameter) if you don't use dynamic localization on the server-side. ABP's [Language Management](https://abp.io/modules/Volo.LanguageManagement) module provides dynamic localization. If you're using it, you can't cache that endpoint forever. However, you can still cache it for a while. Applying dynamic localization text changes to the application can delay for a few minutes, even for a few hours in a real life scenario.
* **[Application Localization Endpoint](../framework/api-development/standard-apis/localization.md)** can be cached per culture (it already has a `cultureName` query string parameter) if you don't use dynamic localization on the server-side. ABP's [Language Management](https://abp.io/modules/Volo.LanguageManagement) module provides dynamic localization. If you're using it, you can't cache that endpoint forever. However, you can still cache it for a while. Applying dynamic localization text changes to the application can delay a few minutes, even a few hours, in a real-life scenario.
There may be more ways based on your solution structure and deployment environment, but these are the essential points you should consider to client-side cache in a production environment.
There may be more ways based on your solution structure and deployment environment, but these are the essential points you should consider for client-side cache in a production environment.
## Bundling & Minification for MVC (Razor Pages) UI
ABP's [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) system automatically bundles, minifies and versions your CSS and JavaScript files in production environment. Normally, you don't need to do anything, if you haven't disabled it yourself in your application code. It is important to follow the [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) document and truly use the system to get the maximum optimization.
ABP's [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) system automatically bundles, minifies and versions your CSS and JavaScript files in the production environment.
Normally, you don't need to do anything if you have not disabled it yourself in your application code.
It is important to follow the [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) document and truly use the system to get the maximum optimization.
## Background Jobs
ABP's [Background Jobs](../framework/infrastructure/background-jobs) system provides an abstraction with a basic implementation to enqueue jobs and execute them in a background thread. ABP's Default Background Job Manager may not be enough if you are adding too many jobs to the queue and want them to be executed in parallel by multiple servers with a high performance. If you need these, you should consider to configure a dedicated background job software, like [Hangfire](https://www.hangfire.io/). ABP has a pre-built [Hangfire integration](../framework/infrastructure/background-jobs/hangfire.md), so you can switch to Hangfire without changing your application code.
ABP's [Background Jobs](../framework/infrastructure/background-jobs) system provides an abstraction with a basic implementation to enqueue jobs and execute them in a background thread. ABP's Default Background Job Manager may not be enough if you are adding too many jobs to the queue and want them to be executed in parallel by multiple servers with a high performance. If you need these, you should consider configuring a dedicated background job software, like [Hangfire](https://www.hangfire.io/). ABP has a pre-built [Hangfire integration](../framework/infrastructure/background-jobs/hangfire.md), so you can switch to Hangfire without changing your application code.

12
docs/en/deployment/ssl.md

@ -1,10 +1,10 @@
# Configuring Configuring SSL certificate(HTTPS)
# Configuring SSL certificate(HTTPS)
A website needs an SSL certificate in order to keep user data secure, verify ownership of the website, prevent attackers from creating a fake version of the site, and gain user trust.
A website needs an SSL certificate to keep user data secure, verify ownership, prevent attackers from creating a fake version of the site, and gain user trust.
This document introduces how to get and use SSL certificate(HTTPS) for your application.
This document introduces how to get and use an SSL certificate (HTTPS) for your application.
## Get a SSL Certificate from a Certificate Authority
## Get an SSL Certificate from a Certificate Authority
You can get a SSL certificate from a certificate authority (CA) such as [Let's Encrypt](https://letsencrypt.org/) or [Cloudflare](https://www.cloudflare.com/learning/ssl/what-is-an-ssl-certificate/) and so on.
@ -18,7 +18,7 @@ Once you have a certificate, you need to configure your web server to use it. Th
You can create a self-signed certificate for testing purposes or internal use.
There is an article about [how to create a self-signed certificate](https://learn.microsoft.com/en-us/dotnet/core/additional-tools/self-signed-certificates-guide), If you are using IIS, you can use the following this document to [obtain a Certificate](https://learn.microsoft.com/en-us/iis/manage/configuring-security/how-to-set-up-ssl-on-iis#obtain-a-certificate)
There is an article about [how to create a self-signed certificate](https://learn.microsoft.com/en-us/dotnet/core/additional-tools/self-signed-certificates-guide); if you are using IIS, you can use the following document to [obtain a Certificate](https://learn.microsoft.com/en-us/iis/manage/configuring-security/how-to-set-up-ssl-on-iis#obtain-a-certificate)
## Common Problems
@ -31,4 +31,4 @@ This error may occur when using IIS. You need to trust your certificate by `Mana
* [ABP IIS Deployment](./index.md)
* [HTTPS in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/security/enforcing-ssl)
* [Let's Encrypt](https://letsencrypt.org/getting-started)
* [Cloudflare's Free SSL / TLS](https://www.cloudflare.com/application-services/products/ssl/)
* [Cloudflare's Free SSL / TLS](https://www.cloudflare.com/application-services/products/ssl/)

170
docs/en/docs-nav.json

@ -1,41 +1,41 @@
{
"items": [
{
"text": "Get started",
"text": "Get Started",
"items": [
{
"text": "Overview",
"path": "get-started"
},
{
"text": "Single-layer solution",
"text": "Single Layer Web Application",
"path": "get-started/single-layer-web-application.md"
},
{
"text": "Layered solution",
"text": "Layered Web Application",
"path": "get-started/layered-web-application.md"
},
{
"text": "Microservice solution",
"text": "Microservice Solution",
"path": "get-started/microservice.md"
},
{
"text": "Others",
"items": [
{
"text": "Empty ASP.NET Core application",
"text": "Empty ASP.NET Core Application",
"path": "get-started/empty-aspnet-core-application.md"
},
{
"text": "MAUI application",
"text": "MAUI Application",
"path": "get-started/maui.md"
},
{
"text": "WPF application",
"text": "WPF Application",
"path": "get-started/wpf.md"
},
{
"text": "Console application",
"text": "Console Application",
"path": "get-started/console.md"
}
]
@ -57,11 +57,11 @@
"path": "tutorials/todo"
},
{
"text": "Single-layer solution",
"text": "Single-Layer Solution",
"path": "tutorials/todo/single-layer"
},
{
"text": "Layered solution",
"text": "Layered Solution",
"path": "tutorials/todo/layered"
}
]
@ -74,19 +74,19 @@
"path": "tutorials/book-store"
},
{
"text": "1: Creating the server side",
"text": "1: Creating the Server Side",
"path": "tutorials/book-store/part-01.md"
},
{
"text": "2: The Book List page",
"text": "2: The Book List Page",
"path": "tutorials/book-store/part-02.md"
},
{
"text": "3: Creating, updating and deleting books",
"text": "3: Creating, Updating and Deleting Books",
"path": "tutorials/book-store/part-03.md"
},
{
"text": "4: Integration tests",
"text": "4: Integration Tests",
"path": "tutorials/book-store/part-04.md"
},
{
@ -94,23 +94,23 @@
"path": "tutorials/book-store/part-05.md"
},
{
"text": "6: Authors: Domain layer",
"text": "6: Authors: Domain Layer",
"path": "tutorials/book-store/part-06.md"
},
{
"text": "7: Authors: Database integration",
"text": "7: Authors: Database Integration",
"path": "tutorials/book-store/part-07.md"
},
{
"text": "8: Authors: Application layer",
"text": "8: Authors: Application Layer",
"path": "tutorials/book-store/part-08.md"
},
{
"text": "9: Authors: User interface",
"text": "9: Authors: User Interface",
"path": "tutorials/book-store/part-09.md"
},
{
"text": "10: Book to author relation",
"text": "10: Book to Author Relation",
"path": "tutorials/book-store/part-10.md"
}
]
@ -123,35 +123,35 @@
"path": "tutorials/modular-crm/index.md"
},
{
"text": "1: Creating the initial solution",
"text": "1: Creating the Initial Solution",
"path": "tutorials/modular-crm/part-01.md"
},
{
"text": "2: Creating the initial Products module",
"text": "2: Creating the Initial Products Module",
"path": "tutorials/modular-crm/part-02.md"
},
{
"text": "3: Building the Products module",
"text": "3: Building the Products Module",
"path": "tutorials/modular-crm/part-03.md"
},
{
"text": "4: Creating the initial Ordering module",
"text": "4: Creating the Initial Ordering Module",
"path": "tutorials/modular-crm/part-04.md"
},
{
"text": "5: Building the Ordering module",
"text": "5: Building the Ordering Module",
"path": "tutorials/modular-crm/part-05.md"
},
{
"text": "6: Integrating the modules: Implementing Integration Services",
"text": "6: Integrating the Modules: Implementing Integration Services",
"path": "tutorials/modular-crm/part-06.md"
},
{
"text": "7: Integrating the modules: Communication via Messages (Events)",
"text": "7: Integrating the Modules: Communication via Messages (Events)",
"path": "tutorials/modular-crm/part-07.md"
},
{
"text": "8: Integrating the modules: Joining the Products and Orders Data",
"text": "8: Integrating the Modules: Joining the Products and Orders Data",
"path": "tutorials/modular-crm/part-08.md"
}
]
@ -214,7 +214,7 @@
"path": "cli"
},
{
"text": "Examples for the new command",
"text": "New Solution Sample Commands",
"path": "cli/new-command-samples.md"
}
]
@ -264,8 +264,8 @@
"path": "studio/concepts.md"
},
{
"text": "Version Compatibility",
"path": "studio/version-compatibility.md"
"text": "Version Mapping",
"path": "studio/version-mapping.md"
},
{
"text": "Release Notes",
@ -293,7 +293,7 @@
"path": "suite/add-solution.md"
},
{
"text": "Creating new ABP solution",
"text": "Creating New ABP Solution",
"path": "suite/create-solution.md"
},
{
@ -308,7 +308,7 @@
"path": "suite/creating-many-to-many-relationship.md"
},
{
"text": "Generating from an Existing Database",
"text": "Generating From an Existing Database",
"path": "suite/generating-entities-from-an-existing-database-table.md"
},
{
@ -338,7 +338,7 @@
"path": "suite/editing-templates.md"
},
{
"text": "How to uninstall",
"text": "How to Uninstall",
"path": "suite/how-to-uninstall.md"
}
]
@ -373,7 +373,7 @@
]
},
{
"text": "Caching",
"text": "Distributed Caching",
"items": [
{
"text": "Overview",
@ -690,7 +690,7 @@
"path": "framework/architecture"
},
{
"text": "Best Practices",
"text": "Module Development Best Practices",
"items": [
{
"text": "Overview",
@ -926,7 +926,7 @@
"items": [
{
"text": "Overview",
"path": "framework/ui/mvc-razor-pages/overall"
"path": "framework/ui/mvc-razor-pages/overall.md"
},
{
"text": "Navigation / Menus",
@ -1221,7 +1221,7 @@
"text": "Other Components",
"items": [
{
"text": "SubmitButton",
"text": "SubmitButton Component",
"path": "framework/ui/blazor/components/submit-button.md"
}
]
@ -1263,6 +1263,10 @@
{
"text": "Angular",
"items": [
{
"text": "Overview",
"path": "framework/ui/angular/overview.md"
},
{
"text": "Quick Start",
"path": "framework/ui/angular/quick-start.md"
@ -1315,7 +1319,7 @@
"path": "framework/ui/angular/http-requests.md"
},
{
"text": "Customize Error Handling",
"text": "Error Handling",
"path": "framework/ui/angular/http-error-handling.md"
}
]
@ -1475,6 +1479,10 @@
"text": "Modifying the Menu",
"path": "framework/ui/angular/modifying-the-menu.md"
},
{
"text": "Manage Profile Page Tabs",
"path": "framework/ui/angular/manage-profile-page-tabs.md"
},
{
"text": "Sorting Navigation Elements",
"path": "framework/ui/angular/sorting-navigation-elements.md"
@ -1528,6 +1536,18 @@
{
"text": "Card",
"path": "framework/ui/angular/card-component.md"
},
{
"text": "Password Complexity Indicator",
"path": "framework/ui/angular/password-complexity-indicator-component.md"
},
{
"text": "Lookup Components(Pro)",
"path": "framework/ui/angular/lookup-components.md"
},
{
"text": "Entity Filters(Pro)",
"path": "framework/ui/angular/entity-filters.md"
}
]
}
@ -1655,13 +1675,62 @@
"text": "Overview",
"path": "solution-templates"
},
{
"text": "Template Guide",
"path": "solution-templates/guide.md"
},
{
"text": "Single-Layer Solution",
"path": "solution-templates/single-layer-web-application"
},
{
"text": "Layered Solution",
"path": "solution-templates/layered-web-application"
"path": "solution-templates/layered-web-application",
"items": [
{
"text": "Deployment",
"path": "solution-templates/layered-web-application/deployment",
"items": [
{
"text": "Docker Deployment",
"path": "solution-templates/layered-web-application/deployment/deployment-docker-compose.md"
},
{
"text": "Azure Deployment",
"items": [
{
"text": "Deploy to Azure Web App Service",
"path": "solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md"
},
{
"text": "Creating an Azure Web App Service Environment",
"path": "solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md"
},
{
"text": "Customizing the Configuration of Your ABP Application",
"path": "solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md"
},
{
"text": "Deploying Application With GitHub Actions",
"path": "solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md"
}
]
},
{
"text": "IIS Deployment",
"path": "solution-templates/layered-web-application/deployment/deployment-iis.md"
},
{
"text": "IdentityServer Deployment",
"path": "solution-templates/layered-web-application/deployment/identityserver-deployment.md"
},
{
"text": "OpenIddict Deployment",
"path": "solution-templates/layered-web-application/deployment/openiddict-deployment.md"
}
]
}
]
},
{
"text": "Microservice Solution",
@ -1686,7 +1755,16 @@
},
{
"text": "Account (Pro)",
"path": "modules/account-pro.md"
"items": [
{
"text": "Overview",
"path": "modules/account-pro.md"
},
{
"text": "Tenant impersonation & User impersonation",
"path": "modules/account/impersonation.md"
}
]
},
{
"text": "Audit Logging",
@ -1899,13 +1977,17 @@
"text": "Overview",
"path": "samples"
},
{
"text": "EventHub",
"path": "https://github.com/abpframework/eventhub"
},
{
"text": "eShopOnAbp",
"path": "https://github.com/abpframework/eShopOnAbp"
},
{
"text": "EventHub",
"path": "https://github.com/abpframework/eventhub"
"text": "CMS Kit Demo",
"path": "https://github.com/abpframework/cms-kit-demo"
},
{
"text": "Easy CRM",
@ -1983,7 +2065,7 @@
"path": "others/why-abp-platform.md"
},
{
"text": "Free license vs Pro licenses?",
"text": "Free (Open Source) License vs Commercial (Pro) Licenses",
"path": "others/free-licenses-vs-pro-licenses.md"
},
{
@ -1991,7 +2073,7 @@
"path": "others/penetration-test-report.md"
},
{
"text": "ASP.NET Zero vs ABP",
"text": "ABP vs ASP.NET Zero",
"path": "others/aspnet-zero-vs-abp.md"
},
{

1
docs/en/docs-params.json

@ -7,6 +7,7 @@
"MVC": "MVC / Razor Pages",
"Blazor": "Blazor WebAssembly",
"BlazorServer": "Blazor Server",
"BlazorWebApp": "Blazor WebApp",
"NG": "Angular"
}
},

2
docs/en/framework/api-development/index.md

@ -1,4 +1,4 @@
## API Development
# API Development
The following documents explain the concepts, infrastructure and integrations to build HTTP APIs with ABP:

2
docs/en/framework/api-development/standard-apis/index.md

@ -1,4 +1,4 @@
## Standard HTTP API Endpoints
# Standard HTTP API Endpoints
ABP provides some pre-built and standard endpoints that contains useful information about the application or service, such as localization entries and settings. Here, is the list of the pre-built endpoints:

2
docs/en/framework/architecture/best-practices/application-layer-overview.md

@ -1,4 +1,4 @@
## Best Practices: Application Layer
# Best Practices: Application Layer
The following documents suggest some best-practices that you can use while implementing the application layer of your solution by following the Domain Driven Design principles:

2
docs/en/framework/architecture/best-practices/data-access-overview.md

@ -1,4 +1,4 @@
## Best Practices: Data Access
# Best Practices: Data Access
The following documents suggest some best-practices that you can use while implementing the database integration layer of your solution by following Domain Driven Design principles:

2
docs/en/framework/architecture/best-practices/domain-layer-overview.md

@ -1,4 +1,4 @@
## Best Practices: Domain Layer
# Best Practices: Domain Layer
The following documents suggest some best-practices that you can use while implementing the domain layer of your solution by following the Domain Driven Design principles:

2
docs/en/framework/architecture/domain-driven-design/application-layer.md

@ -1,4 +1,4 @@
## Domain Driven Design: Application Layer
# Domain Driven Design: Application Layer
Application Layer mediates between the Presentation and Domain Layers. Orchestrates business objects to perform specific application tasks and implements use cases as the application logic. Here, is the list of the building blocks of the Application Layer:

2
docs/en/framework/architecture/domain-driven-design/domain-layer.md

@ -1,4 +1,4 @@
## Domain Driven Design: Domain Layer
# Domain Driven Design: Domain Layer
Domain Layer contains business objects and the core (domain) business rules of the application and it's the heart of the application. Here, is the list of building blocks of the Domain Layer:

2
docs/en/framework/architecture/modularity/basics.md

@ -7,7 +7,7 @@ ABP was designed to support to build fully modular applications and systems wher
* This document introduces the basics of the module system.
* [Module development best practice guide](../best-practices) explains some **best practices** to develop **re-usable application modules** based on **DDD** principles and layers. A module designed based on this guide will be **database independent** and can be deployed as a **microservice** if needed.
* [Pre-built application modules](../../../modules) are **ready to use** in any kind of application.
* [Module startup template](../../../solution-templates/layered-web-application) is a jump start way to **create a new module**.
* [Module startup template](../../../solution-templates/application-module) is a jump start way to **create a new module**.
* [ABP CLI](../../../cli/index.md) has commands to support modular development.
* All other framework features are compatible to the modularity system.

2
docs/en/framework/architecture/modularity/extending/module-entity-extensions.md

@ -48,7 +48,7 @@ public static void ConfigureExtraProperties()
* `AddOrUpdateProperty` gets a second argument (the `property =>` lambda expression) to configure additional options for the new property.
* We can add data annotation attributes like shown here, just like adding a data annotation attribute to a class property.
#### Create & Update Forms
### Create & Update Forms
Once you define a property, it appears in the create and update forms of the related entity:

4
docs/en/framework/data/entity-framework-core/migrations.md

@ -4,7 +4,7 @@ This document begins by **introducing the default structure** provided by [the a
> This document is for who want to fully understand and customize the database structure comes with [the application startup template](../../../solution-templates/layered-web-application). If you simply want to create entities and manage your code first migrations, just follow [the startup tutorials](../../../tutorials/book-store/part-01.md).
### Source Code
## Source Code
You can find the source code of the example project referenced by this document [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo). However, you need to read and understand this document in order to understand the example project's source code.
@ -554,4 +554,4 @@ This document explains how to split your databases and manage your database migr
## Source Code
You can find the source code of the example project referenced by this document [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo). You can also find the changes explained in this document as a [single commit](https://github.com/abpframework/abp-samples/pull/95/commits/c2ffd76175e0a6fdfcf6477bbaea23dc2793fedd).
You can find the source code of the example project referenced by this document [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo). You can also find the changes explained in this document as a [single commit](https://github.com/abpframework/abp-samples/pull/95/commits/c2ffd76175e0a6fdfcf6477bbaea23dc2793fedd).

8
docs/en/framework/fundamentals/dynamic-claims.md

@ -1,8 +1,8 @@
# Dynamic Claims
When a client authenticates and obtains an access token or an authentication cookie, the claims in that token or cookie are not changed unless it re-authenticates. For most of the claims, that may not be a problem since claims are not frequently changing values. However, some claims may be changed and these changes should be reflected to the current session immediately. For example, we can revoke a role from a user and that should be immediately effective, otherwise user will continue to use that role's permissions until re-login to the application.
When a client authenticates and obtains an access token or an authentication cookie, the claims in that token or cookie are not changed unless it re-authenticates. That is not a problem for most claims since the claim values do not frequently change. However, for some claims, it may be required to immediately see the impact after the claim values change in the current session. For example, if a role is revoked from a user, you want to see its effect in the next request. Otherwise, the user will continue to use that role's permissions until re-login to the application.
ABP's dynamic claims feature is used to automatically and dynamically override the configured claim values in the client's authentication token/cookie by the latest values of these claims.
ABP's dynamic claims feature dynamically overrides the configured claim values in the client's authentication token/cookie with the latest values of these claims.
## How to Use
@ -10,7 +10,7 @@ This feature is disabled by default. You should enable it for your application a
> **Beginning from the v8.0, all the [startup templates](../../solution-templates) are pre-configured and the dynamic claims feature is enabled by default. So, if you have created a solution with v8.0 and above, you don't need to make any configuration. Follow the instructions only if you've upgraded from a version lower than 8.0.**
### Enabling the Dynamic Claims
### Enabling / Disabling the Dynamic Claims
You can enable it by the following code:
@ -19,7 +19,7 @@ public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
{
options.IsDynamicClaimsEnabled = true;
options.IsDynamicClaimsEnabled = true; //set it "true" to enable "Dynamic Claims" or "false" to disable it.
});
}
````

8
docs/en/framework/fundamentals/exception-handling.md

@ -31,7 +31,7 @@ Error Message is an instance of the `RemoteServiceErrorResponse` class. The simp
There are **optional fields** those can be filled based upon the exception that has occurred.
##### Error Code
#### Error Code
Error **code** is an optional and unique string value for the exception. Thrown `Exception` should implement the `IHasErrorCode` interface to fill this field. Example JSON value:
@ -46,7 +46,7 @@ Error **code** is an optional and unique string value for the exception. Thrown
Error code can also be used to localize the exception and customize the HTTP status code (see the related sections below).
##### Error Details
#### Error Details
Error **details** in an optional field of the JSON error message. Thrown `Exception` should implement the `IHasErrorDetails` interface to fill this field. Example JSON value:
@ -60,7 +60,7 @@ Error **details** in an optional field of the JSON error message. Thrown `Except
}
```
##### Validation Errors
#### Validation Errors
**validationErrors** is a standard field that is filled if the thrown exception implements the `IHasValidationErrors` interface.
@ -340,4 +340,4 @@ Here, a list of the options you can configure:
## See Also
* [Video tutorial](https://abp.io/video-courses/essentials/exception-handling)
* [Video tutorial](https://abp.io/video-courses/essentials/exception-handling)

2
docs/en/framework/fundamentals/index.md

@ -1,4 +1,4 @@
## ABP Fundamentals: Overview
# ABP Fundamentals: Overview
The following documents explains the fundamental building blocks to create ABP solutions:

4
docs/en/framework/fundamentals/localization.md

@ -183,7 +183,7 @@ public class MyService : ITransientDependency
}
````
##### Format Arguments
### Format Arguments
Format arguments can be passed after the localization key. If your message is `Hello {0}, welcome!`, then you can pass the `{0}` argument to the localizer like `_localizer["HelloMessage", "John"]`.
@ -255,4 +255,4 @@ See the following documents to learn how to reuse the same localization texts in
* [Localization for the MVC / Razor Pages UI](../ui/mvc-razor-pages/javascript-api/localization)
* [Localization for the Blazor UI](../ui/blazor/localization.md)
* [Localization for the Angular UI](../ui/angular/localization.md)
* [Video tutorial](https://abp.io/video-courses/essentials/localization)
* [Video tutorial](https://abp.io/video-courses/essentials/localization)

2
docs/en/framework/infrastructure/audit-logging.md

@ -14,7 +14,7 @@ An **audit log object** (see the Audit Log Object section below) is typically cr
> [Startup templates](../../solution-templates) are configured for the audit logging system which is suitable for most of the applications. Use this document for a detailed control over the audit log system.
### Database Provider Support
## Database Provider Support
* Fully supported by the [Entity Framework Core](../data/entity-framework-core) provider.
* Entity change logging is not supported by the [MongoDB](../data/mongodb) provider. Other features work as expected.

25
docs/en/framework/infrastructure/event-bus/index.md

@ -6,5 +6,26 @@ An event bus is a mediator that transfers a message from a sender to a receiver.
ABP provides two type of event buses;
* **[Local Event Bus](local)** is suitable for in-process messaging.
* **[Distributed Event Bus](distributed)** is suitable for inter-process messaging, like microservices publishing and subscribing to distributed events.
* **[Local Event Bus](local/index.md)** is suitable for in-process messaging.
* **[Distributed Event Bus](distributed/index.md)** is suitable for inter-process messaging, like publishing and subscribing to distributed events in a distributed/microservice system.
## Event Bus Guiding
You may confuse which event bus to use in your application. Here, a few example scenarios:
* If you are building a microservice system, use the distributed event bus for **inter-microservice communication**. If you are publishing an event and always handling it in the same microservice, you can use the local event bus for that event.
* If you are building a modular monolith application, use the distributed event bus for **inter-module communication**. Since the distributed event bus works in-process by default (unless you configure a real distributed event bus provider). In that way, if you migrate to a microservice system later, these inter-module communication can become a inter-microservice communication without any code change (with just installing a distributed event bus provide package). If you are publishing an event and always handling it in the same module, you can use the local event bus for that event.
* If you are building a monolith (non-modular) application, you can always use the local event bus.
The distributed event bus works in-process by default. Unless you don't configure a real distributed event bus provider, it works just like the local event bus. Once you configure a real distributed event bus provider, all your events become distributed.
So, you use the local event bus only if you an event should always remain in-process in any scenario. For other type of events, use the distributed event bus.
### Technical Differences
There are some technical differences between the local and distributed event bus:
* You can send entities or other non-serializable objects using the local event bus since these objects are not serialized/deserialized on event publishing. On the other hand, distributed event bus serializes/deserializes objects once you use a real distributed event bus provider.
* The local event bus is always transactional in the database level. For distributed event bus, you should enable inbox/outbox pattern to ensure data consistency once you use a real distributed event bus provider.
These differences are because of the distributed event bus supports distributed scenarios while the local event bus is only used for in-process messaging. When you don't set up a real distributed event bus provider, these differences are not valid.

2
docs/en/framework/infrastructure/index.md

@ -1,4 +1,4 @@
## ABP Infrastructure
# ABP Infrastructure
ABP provides a complete infrastructure for creating real world software solutions with modern architectures based on the .NET platform. Each of the following documents explains an infrastructure feature:

2
docs/en/framework/infrastructure/json.md

@ -63,7 +63,7 @@ Properties:
Add [Volo.Abp.Json.Newtonsoft](https://www.nuget.org/packages/Volo.Abp.Json.Newtonsoft) package and depends on `AbpJsonNewtonsoftModule` to replace the `System Text Json`.
#### AbpNewtonsoftJsonSerializerOptions
### AbpNewtonsoftJsonSerializerOptions
- **JsonSerializerSettings(`Newtonsoft.Json.JsonSerializerSettings`)**: Global options for Newtonsoft library operations. See [here](https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonSerializerSettings.htm) for reference.

12
docs/en/framework/ui/angular/account-module.md

@ -7,7 +7,7 @@ If you add the account module to your project;
- "My account" link in the current user dropdown on the top bar will redirect the user to a page in the account module.
- You can switch the authentication flow to the resource owner password flow.
### Account Module Implementation
## Account Module Implementation
Install the `@abp/ng.account` NPM package by running the below command:
@ -49,7 +49,7 @@ const routes: Routes = [
export class AppRoutingModule {}
```
### Account Public Module Implementation for Commercial Templates
## Account Public Module Implementation for Commercial Templates
The pro startup template comes with `@volo/abp.ng.account` package. You should update the package version to v4.3 or higher version. The package can be updated by running the following command:
@ -97,11 +97,11 @@ const routes: Routes = [
export class AppRoutingModule {}
```
### My Account Page
## My Account Page
Before v4.3, the "My account" link in the current user dropdown on the top bar redirected the user to MVC's profile management page. As of v4.3, if you added the account module to your project, the same link will land on a page in the Angular UI account module instead.
### Personal Info Page Confirm Message
## Personal Info Page Confirm Message
When the user changes their own data on the personal settings tab in My Account, The data can not update the CurrentUser key of Application-Configuration. The information of the user is stored in claims. The only way to apply this information to the CurrentUser of Application-Configuration is user should log out and log in. When the Refresh-Token feature is implemented, it will be fixed. So We've added a confirmation alert.
@ -119,11 +119,11 @@ const routes: Routes = [
export class AppRoutingModule {}
```
### Security Logs Page [COMMERCIAL]
## Security Logs Page [COMMERCIAL]
Before v4.3, the "Security Logs" link in the current user dropdown on the top bar redirected the user to MVC's security logs page. As of v4.3, if you added the account module to your project, the same link will land on a page in the Angular UI account public module instead.
### Resource Owner Password Flow
## Resource Owner Password Flow
OAuth is preconfigured as authorization code flow in Angular application templates by default. If you added the account module to your project, you can switch the flow to resource owner password flow by changing the OAuth configuration in the _environment.ts_ files as shown below:

2
docs/en/framework/ui/angular/current-user.md

@ -2,7 +2,7 @@
The current user information stored in Config State.
### How to Get a Current User Information Configuration
## How to Get a Current User Information Configuration
You can use the `getOne` or `getOne$` method of `ConfigStateService` to get a specific configuration property. For that, the property name should be passed to the method as parameter.

6
docs/en/framework/ui/angular/datetime-format-pipe.md

@ -11,21 +11,21 @@ Example
ShortDate, ShortTime and ShortDateTime format data like angular's data pipe but easier. Also the pipes get format from config service by culture.
# ShortDate Pipe
## ShortDate Pipe
```html
<span> {{today | shortDate }}</span>
```
# ShortTime Pipe
## ShortTime Pipe
```html
<span> {{today | shortTime }}</span>
```
# ShortDateTime Pipe
## ShortDateTime Pipe
```html
<span> {{today | shortDateTime }}</span>

143
docs/en/framework/ui/angular/entity-filters.md

@ -0,0 +1,143 @@
# Entity Filters
Every CRUD page includes some sort of inputs to filter the listed data. Some of the inputs are common among all of the entities like the `Search` box. In addition, every entity has its own advanced filters depending on its fields. To reduce the amount of code written on every CRUD page, the Angular UI of ABP Commercial introduces a new type of component called `abp-advanced-entity-filters`
## Setup
The components are in the _@volo/abp.commercial.ng.ui_ package, which is included in the ABP templates. So, as long as your project is a product of these templates and unless you delete the package, you have access to the entity filter components.
You can either import the `CommercialUiModule` which contains other components as well as `AdvancedEntityFilters` or you can directly import the `AdvancedEntityFiltersModule` if you do not need other components. Here is how you import them in your Angular module:
```javascript
import {
CommercialUiModule,
AdvancedEntityFiltersModule,
} from "@volo/abp.commercial.ng.ui";
@NgModule({
imports: [
// other imports
CommercialUiModule,
// OR
AdvancedEntityFiltersModule,
],
// rest of the module metadata
})
export class YourModule {}
```
## Usage
Let's take a look at the `Users` page from the `Identity` module.
![ABP Angular UI Users Page with Advanced Entity Filters](./images/angular-advanced-entity-filters.png)
As shown in the screenshot, `abp-advanced-entity-filters` usually contain two parts, an entity filter (common among entities), i.e. `abp-entity-filter`, and entity-specific filters which are encapsulated within the `abp-advanced-entity-filters-form` component.
`users.component.html`
```html
<abp-advanced-entity-filters [list]="list" localizationSourceName="AbpIdentity">
<abp-advanced-entity-filters-form>
<form #filterForm (keyup.enter)="list.get()">
<div class="row">
<!-- Form elements are omitted -->
<div class="col-12 col-sm-auto align-self-end mb-3">
<div class="row">
<div class="col-6 col-sm-auto d-grid">
<button
type="button"
class="btn btn-outline-primary"
(click)="clearFilters()"
>
<span>{%{{{ 'AbpUi::Clear' | abpLocalization }}}%}</span>
</button>
</div>
<div class="col-6 col-sm-auto d-grid">
<button
type="button"
class="btn btn-primary"
(click)="list.get()"
>
<span>{%{{{ 'AbpUi::Refresh' | abpLocalization }}}%}</span>
</button>
</div>
</div>
</div>
</div>
</form>
</abp-advanced-entity-filters-form>
</abp-advanced-entity-filters>
```
The `abp-advanced-entity-filters` already contains the `abp-entity-filter` component so you do not need to pass it. However, the `abp-entity-filter` component needs an instance of `ListService` which is usually stored in the `list` field of the page. You can also change the placeholder of the component via `entityFilterPlaceholder` input which is passed into the `abpLocalization` pipe so that it uses the translated text. Default is `'AbpUi::PagerSearch'`
E.g
```html
<abp-advanced-entity-filters
[list]="list"
entityFilterPlaceholder="AbpUi::PagerSearch"
>
<!-- ... -->
</abp-advanced-entity-filters>
```
### Inputs
- `list`: an instance of `ListService`
- `entityFilterPlaceholder`: the placeholder of `abp-entity-filter` component. Default: `'AbpUi::PagerSearch'`
- `localizationSourceName`: the localization source of the current page. E.g: `AbpIdentity`
### Inner components
Some entities are simple and do not require any filter other than the `abp-entity-filter`. In this case, you can simply use the `abp-advanced-entity-filters` without anything in between.
E.g.
Let's remove `form` from the `Users` page
```html
<abp-advanced-entity-filters [list]="list" localizationSourceName="AbpIdentity">
</abp-advanced-entity-filters>
```
![ABP Angular UI Users Page with Advanced Entity Filters without form](./images/angular-advanced-entity-filters-without-form.png)
If your component needs other filters, you can pass your own `form` within the `abp-advanced-entity-filters-form` component. This will render your form as well as a toggle (`abp-advanced-entity-filters-toggle`) to show and hide the form
E.g.
```html
<abp-advanced-entity-filters [list]="list" localizationSourceName="AbpIdentity">
<abp-advanced-entity-filters-form>
<form>
<!-- Content is omitted for sake of simplicity -->
</form>
</abp-advanced-entity-filters-form>
</abp-advanced-entity-filters>
```
![ABP Angular UI Users Page with Advanced Entity Filters with form](./images/angular-advanced-entity-filters-with-form.png)
Last but not least, if you need to render some content above the `abp-entity-filter` component, you can use the `abp-advanced-entity-filters-above-search`.
E.g.
```html
<abp-advanced-entity-filters [list]="list" localizationSourceName="AbpIdentity">
<abp-advanced-entity-filters-above-search>
<h3>Custom Content above entity-filter</h3>
</abp-advanced-entity-filters-above-search>
<abp-advanced-entity-filters-form>
<form>
<!-- Content is omitted for sake of simplicity -->
</form>
</abp-advanced-entity-filters-form>
</abp-advanced-entity-filters>
```
![ABP Angular UI Users Page with Advanced Entity Filters with custom content above filter](./images/angular-advanced-entity-filters-with-custom-content-above-filter.png)

16
docs/en/framework/ui/angular/environment.md

@ -101,6 +101,22 @@ export interface RemoteEnv {
- `method`: HTTP method to be used when retrieving environment config. Default: `GET`
- `headers`: If extra headers are needed for the request, it can be set through this field.
## Provide Environment Variable to Core Module
`environment` variable comes from angular host application.
```js
import { environment } from '../environments/environment';
@NgModule({
imports: [
//...other imports
CoreModule.forRoot({
environment
}),
]
})
```
## EnvironmentService
` EnvironmentService` is a singleton service, i.e. provided in root level of your application, and keeps the environment in the internal store.

4
docs/en/framework/ui/angular/http-error-handling.md

@ -1,6 +1,6 @@
# HTTP Error Handling
### Error Configurations
## Error Configurations
ABP offers a configurations for errors handling like below
@ -27,7 +27,7 @@ export class AppModule {}
```
- `ErrorScreenErrorCodes` the error codes that you can pass to `skipHandledErrorCodes` and `forWhichErrors`.
- `skipHandledErrorCodes` the error codes those you don't want to handle it.
- `skipHandledErrorCodes` the error codes those you don't want to handle.
- `errorScreen` the screen that you want to show when a route error occurs.
- `component` component that you want to show.
- `forWhichErrors` same as `ErrorScreenErrorCodes`

BIN
docs/en/framework/ui/angular/images/angular-advanced-entity-filters-with-custom-content-above-filter.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
docs/en/framework/ui/angular/images/angular-advanced-entity-filters-with-form.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
docs/en/framework/ui/angular/images/angular-advanced-entity-filters-without-form.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

BIN
docs/en/framework/ui/angular/images/angular-advanced-entity-filters.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
docs/en/framework/ui/angular/images/angular-lookup-select.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

BIN
docs/en/framework/ui/angular/images/angular-lookup-typeahead.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

BIN
docs/en/framework/ui/angular/images/grouped-menu-mobile.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
docs/en/framework/ui/angular/images/grouped-menu.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
docs/en/framework/ui/angular/images/manage-profile-page-new-tab.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
docs/en/framework/ui/angular/images/manage-profile-page.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

4
docs/en/framework/ui/angular/localization.md

@ -215,7 +215,7 @@ The localizations above can be used like this:
As of v2.9 ABP has RTL support. If you are generating a new project with v2.9 and above, everything is set, you do not need to do any changes. If you are migrating your project from an earlier version, please follow the 2 steps below:
#### Step 1. Create Chunks for Bootstrap LTR and RTL
### Step 1. Create Chunks for Bootstrap LTR and RTL
Find [styles configuration in angular.json](https://angular.io/guide/workspace-config#style-script-config) and make sure the chunks in your project has `bootstrap-rtl.min` and `bootstrap-ltr.min` as shown below.
@ -257,7 +257,7 @@ Find [styles configuration in angular.json](https://angular.io/guide/workspace-c
}
```
#### Step 2. Clear Lazy Loaded Fontawesome in AppComponent
### Step 2. Clear Lazy Loaded Fontawesome in AppComponent
If you have created and injected chunks for Fontawesome as seen above, you no longer need the lazy loading in the `AppComponent` which was implemented before v2.9. Simply remove them. The `AppComponent` in the template of the new version looks like this:

98
docs/en/framework/ui/angular/lookup-components.md

@ -0,0 +1,98 @@
# Lookup Components
The Angular UI of ABP Commercial introduces some components with `abp-lookup-...` selector prefix. These components are used for retrieving relational entity data.
## Setup
The components are in the _@volo/abp.commercial.ng.ui_ package, which is included in the ABP templates. So, as long as your project is a product of these templates and unless you delete the package, you have access to the lookup components. Here is how you import them in your Angular module:
```javascript
import { CommercialUiModule } from '@volo/abp.commercial.ng.ui';
@NgModule({
imports: [
// other imports
CommercialUiModule,
],
// rest of the module metadata
})
export class YourModule {}
```
Now you can use the lookup components in your components declared by this module.
## Lookup HTTP Requests
The lookup requests are used by all lookup components to get the related entity records. Because of lexical this, _they must be arrow functions_.
```javascript
@Injectable({
providedIn: 'root'
})
export class AuthorService {
getCountryLookup = (input: LookupRequestDto) =>
this.restService.request<any, PagedResultDto<LookupDto<string>>>({
method: 'GET',
url: '/api/app/authors/country-lookup',
params: { filter: input.filter, skipCount: input.skipCount, maxResultCount: input.maxResultCount },
},
{ apiName: this.apiName });
// rest of the service is removed for brevity
}
```
## Lookup Typeahead Component
Typeahead is a good choice when you have an unknown number of records for the related entity or you want to improve the UX with a search ability. Although not the best scenario, the country picker below shows how the lookup typeahead works:
![ABP Angular UI Typeahead Lookup](./images/angular-lookup-typeahead.gif)
Here is how it is used in the template.
```html
<abp-lookup-typeahead
cid="author-country-id"
formControlName="countryId"
displayNameProp="name"
[editingData]="selected?.country"
[getFn]="service.getCountryLookup"
></abp-lookup-typeahead>
```
The available properties are as follows:
- **cid:** The id of the form control (e.g. an input or a select element) inside the lookup component. Lets form controls respond to `<label>` events.
- **editingData:** The related entity data if a record is being updated.
- **displayNameProp:** The property of the updated record to use as a display name in the form control.
- **lookupNameProp:** The property of the entity to use as a display name in options. Should macth the lookup HTTP request interface. _(default: displayName)_
- **lookupIdProp:** The property of the entity to use as the unique key in options. Should macth the lookup HTTP request interface. _(default: id)_
- **maxResultCount:** The maximum number of options to display. _(default: 10)_
- **getFn:** A function to get the related entity records with HTTP requests. Because of lexical this, _it must be a an arrow function_.
- **disabled:** This property lets you disable/enable a lookup component. _(default: false)_.
## Lookup Select Component
Select is a good choice when you have a low (and usually fixed) number of records for the related entity and search is not necessary. The country picker below shows how the lookup select works:
![ABP Angular UI Select Lookup](./images/angular-lookup-select.gif)
Here is how it is used in the template.
```html
<abp-lookup-select
cid="author-country-id"
formControlName="countryId"
displayNameProp="name"
[getFn]="service.getCountryLookup"
></abp-lookup-select>
```
The available properties are as follows:
- **cid:** The id of the form control (e.g. an input or a select element) inside the lookup component. Lets form controls respond to `<label>` events.
- **displayNameProp:** The property of the updated record to use as a display name in the form control.
- **lookupNameProp:** The property of the entity to use as a display name in options. Should macth the lookup HTTP request interface. _(default: displayName)_
- **lookupIdProp:** The property of the entity to use as the unique key in options. Should macth the lookup HTTP request interface. _(default: id)_
- **getFn:** A function to get the related entity records with HTTP requests. Because of lexical this, _it must be a an arrow function_.
- **disabled:** This property lets you disable/enable a lookup component. _(default: false)_.

77
docs/en/framework/ui/angular/manage-profile-page-tabs.md

@ -0,0 +1,77 @@
# Manage Profile Page Tabs
![manage profile page](./images/manage-profile-page.png)
The tabs in the manage profile page can be managed via `ManageProfileTabsService` which is exposed by the `@volo/abp.ng.account/public/config` package. You can add, remove, or edit a tab with using this service.
See the example below, covers all features:
```ts
// manage-profile-tabs.provider.ts
import { APP_INITIALIZER, Component } from "@angular/core";
import { TwoFactorTabComponent } from "@volo/abp.ng.account/public";
import {
eAccountManageProfileTabNames,
ManageProfileTabsService,
} from "@volo/abp.ng.account/public/config";
import { MyAwesomeTabComponent } from "./my-awesome-tab/my-awesome-tab.component";
@Component({
standalone: true,
selector: "abp-my-awesome-tab",
template: `My Awesome Tab`,
})
class MyAwesomeTabComponent {}
export const MANAGE_PROFILE_TAB_PROVIDER = {
provide: APP_INITIALIZER,
useFactory: configureManageProfileTabs,
deps: [ManageProfileTabsService],
multi: true,
};
export function configureManageProfileTabs(tabs: ManageProfileTabsService) {
return () => {
tabs.add([
{
name: "::MyAwesomeTab", // supports localization keys
order: 5,
component: MyAwesomeTabComponent,
},
]);
tabs.patch(eAccountManageProfileTabNames.TwoFactor, {
name: "Two factor authentication",
component: TwoFactorTabComponent,
});
tabs.remove([eAccountManageProfileTabNames.ProfilePicture]);
};
}
```
```ts
//app.module.ts
import { MANAGE_PROFILE_TAB_PROVIDER } from "./manage-profile-tabs.provider";
@NgModule({
providers: [MANAGE_PROFILE_TAB_PROVIDER],
})
export class AppModule {}
```
What we have done above;
- Created the `manage-profile-page-tabs.provider.ts`.
- Determined the `configureManageProfileTabs` function to perform manage profile tabs actions.
- Added a new tab labeled "My awesome tab".
- Renamed the "Two factor" tab label.
- Removed the "Profile picture" tab.
- Determined the `MANAGE_PROFILE_TAB_PROVIDER` to be able to run the `configureManageProfileTabs` function on initialization.
- Registered the `MANAGE_PROFILE_TAB_PROVIDER` to the `AppModule` providers.
See the result:
![my awesome tab](./images/manage-profile-page-new-tab.png)

13
docs/en/framework/ui/angular/modifying-the-menu.md

@ -344,3 +344,16 @@ export class AppComponent {
* Patched the languages dropdown element with new `requiredPolicy` and new `order`.
* Removed the current user dropdown element.
## Grouped Menu (Pro)
**This feature is only applied for [LeptonX](https://abp.io/docs/latest/themes/lepton-x/angular) theme**
### Web
![groupped-menu](./images/grouped-menu.png)
### Mobile
![groupped-menu-mobile](./images/grouped-menu-mobile.png)

14
docs/en/framework/ui/angular/overview.md

@ -0,0 +1,14 @@
# Angular UI
[Angular](https://angular.dev/) is a framework for building interactive, client-side web UIs using [TypeScript](https://www.typescriptlang.org) and [NodeJS](https://nodejs.org).
ABP Angular provides the infrastructure to communicate with the ABP backend and offers utilities to simplify frontend development. We’ll explore and dive into the details under the following main topics:
- Development
- Core Functionality
- Utilities
- Customization
- Components
You can also make a [Quick Start](./quick-start.md)

2
docs/en/framework/ui/angular/quick-start.md

@ -1,5 +1,7 @@
# ABP Angular Quick Start
**In this version ABP uses Angular [17.3.x](https://github.com/angular/angular/tree/17.3.x) version. You don't have to install Angular CLI globally**
## How to Prepare Development Environment
Please follow the steps below to prepare your development environment for Angular.

2
docs/en/framework/ui/angular/sorting-navigation-elements.md

@ -5,7 +5,7 @@ This documentation describes how the navigation elements are sorted and how to c
- When you want to add the `Navigation Element` you can use the `RoutesService`. For more details, see the [document](../angular/modifying-the-menu.md).
- However, in this documentation, we will talk more about how to sort the navigation elements.
### Order Property
## Order Property
- Normally, you are able to sort your routes with this property. But you can customize our default sorting algorithm.

2
docs/en/framework/ui/blazor/branding.md

@ -24,8 +24,6 @@ namespace MyCompanyName.MyProjectName.Blazor
}
````
> Currently, setting the `AppName` is only applicable to the [Basic Theme](./basic-theme.md), it does not have any effect on the other [official themes](../../../ui-themes).
The result will be like shown below:
![branding-appname](../../../images/branding-appname.png)

2
docs/en/framework/ui/blazor/components/submit-button.md

@ -1,4 +1,4 @@
# Blazor UI: SubmitButton component
# Blazor UI: SubmitButton Component
`SubmitButton` is a simple wrapper around `Button` component. It is used to be placed inside of page Form or Modal dialogs where it can response to user actions and to be activated as a default button by pressing an ENTER key. Once clicked it will go into the `disabled` state and also it will show a small loading indicator until clicked event is finished.

2
docs/en/framework/ui/index.md

@ -1,4 +1,4 @@
## ABP UI Options
# ABP UI Options
ABP provides several options for building the user interface (UI) in your applications. Here are some of the officially supported UI options you can use with ABP:

2
docs/en/framework/ui/mvc-razor-pages/basic-theme.md

@ -85,7 +85,7 @@ See the [User Interface Customization Guide](customization-user-interface.md) to
You can run the following [ABP CLI](../../../cli) command in **Web** project directory to copy the source code to your solution:
`abp add-module Volo.BasicTheme --with-source-code --add-to-solution-file`
`abp add-source-code Volo.Abp.BasicTheme`
----

2
docs/en/framework/ui/mvc-razor-pages/branding.md

@ -26,8 +26,6 @@ namespace MyProject.Web
}
````
> Currently, setting the `AppName` is only applicable to the [Basic Theme](./basic-theme.md), it does not have any effect on the other [official themes](../../../ui-themes).
The result will be like shown below:
![bookstore-added-logo](../../../images/bookstore-added-logo.png)

6
docs/en/get-started/console.md

@ -10,12 +10,14 @@ First, install the [ABP CLI](../cli) if you haven't installed before:
dotnet tool install -g Volo.Abp.Studio.Cli
````
Then use the `abp new` command in an empty folder to create a new solution:
Then use the `abp new` command in an empty folder to create a new solution (with the `--old` parameter at the end of the command):
````bash
abp new Acme.MyConsoleApp -t console
abp new Acme.MyConsoleApp -t console --old
````
> **Note**: Since this startup template is not provided by the new ABP Studio Templates yet, you need to pass the `--old` parameter at the end of the command to use the old CLI & templating system for this startup template.
`Acme.MyConsoleApp` is the solution name, like *YourCompany.YourProduct*. You can use single level, two-levels or three-levels naming.
## Solution Structure

BIN
docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 83 KiB

BIN
docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 88 KiB

4
docs/en/get-started/index.md

@ -12,3 +12,7 @@ Please select one of the following documents best fits for your application:
- [MAUI Application](maui.md)
- [WPF Application](wpf.md)
- [Console Application](console.md)
## Which Startup Template is Suitable for Me?
You can see the *[Solution Template Selection Guide](../solution-templates/guide.md)* if you are not sure which solution template is suitable for you.

14
docs/en/get-started/layered-web-application.md

@ -3,7 +3,7 @@
````json
//[doc-params]
{
"UI": ["MVC", "Blazor", "BlazorServer", "NG"],
"UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"],
"DB": ["EF", "Mongo"],
"Tiered": ["Yes", "No"]
}
@ -41,7 +41,7 @@ The following tools should be installed on your development machine:
## Creating a New Solution
> 🛈 This document uses [ABP Studio](../studio/index.md) to create new ABP solutions. **ABP Studio** is in the beta version now. If you have any issues, you can use the [ABP CLI](../cli/index.md) to create new solutions. You can also use the [getting started page](https://abp.io/get-started) to easily build ABP CLI commands for new project creations.
> This document uses [ABP Studio](../studio/index.md) to create new ABP solutions. **ABP Studio** is in the beta version now. If you have any issues, you can use the [ABP CLI](../cli/index.md) to create new solutions. You can also use the [getting started page](https://abp.io/get-started) to easily build ABP CLI commands for new project creations.
> ABP startup solution templates have many options for your specific needs. If you don't understand an option that probably means you don't need it. We selected common defaults for you, so you can leave these options as they are.
@ -119,7 +119,7 @@ Here, you can select the database management systems (DBMS){{ if DB == "EF" }} a
![abp-studio-new-solution-dialog-additional-options](images/abp-studio-new-solution-dialog-additional-options.png)
If you uncheck the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files, such as Helm charts and other Kubernetes-related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login.
If you uncheck the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files, such as Helm charts and other Kubernetes-related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login. Lastly, you can specify the *Include Tests* option to include or exclude the test projects from the solution.
Now, we are ready to allow ABP Studio to create our solution. Just click the *Create* button and let the ABP Studio do the rest for you. After clicking the Create button, the dialog is closed and your solution is loaded into ABP Studio:
@ -162,7 +162,7 @@ You can start the following application(s):
{{ else if UI == "Blazor" }}
{{ if Tiered == "No" }}- `Acme.BookStore.HttpApi.Host`{{ end }}
- `Acme.BookStore.Blazor`
{{ else if UI == "BlazorServer" }}
{{ else if UI == "BlazorServer" || UI == "BlazorWebApp" }}
- `Acme.BookStore.Blazor`
{{ else }}
- `Acme.BookStore.Web`
@ -174,7 +174,7 @@ You can start the following application(s):
> Notice that the services running in docker-compose are exposed to your localhost. If any service in your localhost is already using the same port(s), you will get an error. In that case, stop your local services first.
{{ end }}
Once the `Acme.BookStore.{{ if UI == "NG" }}Angular{{ else if UI == "BlazorServer" || UI == "Blazor" }}Blazor{{ else }}Web{{ end }}` application started, you can right-click it and select the *Browse* command:
Once the `Acme.BookStore.{{ if UI == "NG" }}Angular{{ else if UI == "BlazorServer" || UI == "Blazor" || UI == "BlazorWebApp" }}Blazor{{ else }}Web{{ end }}` application started, you can right-click it and select the *Browse* command:
![abp-studio-quick-start-browse-command](images/abp-studio-quick-start-browse-command.png)
@ -206,7 +206,7 @@ Once the solution is opened in Visual Studio, you should see a screen like shown
![visual-studio-bookstore-application](images/visual-studio-bookstore-application.png)
Right-click the `Acme.BookStore.{{ if UI == "NG" || UI == "Blazor" }}HttpApi.Host{{ else if UI == "BlazorServer" }}Blazor{{ else }}Web{{ end }}` project and select the *Set as Startup Project* command. You can then hit *F5* or *Ctrl + F5* to run the web application. It will run and open the application UI in your default browser:
Right-click the `Acme.BookStore.{{ if UI == "NG" || UI == "Blazor" }}HttpApi.Host{{ else if UI == "BlazorServer" || UI == "BlazorWebApp" }}Blazor{{ else }}Web{{ end }}` project and select the *Set as Startup Project* command. You can then hit *F5* or *Ctrl + F5* to run the web application. It will run and open the application UI in your default browser:
![bookstore-browser-users-page](images/bookstore-browser-users-page.png)
@ -242,4 +242,4 @@ Before starting the mobile application, ensure that you configure it for [react-
> For example in non-tiered MVC with public website application:
![solution-runner-public-website](images/solution-runner-public-website.png)
![solution-runner-public-website](images/solution-runner-public-website.png)

2
docs/en/get-started/microservice.md

@ -71,7 +71,7 @@ Click the Next button to see *Additional Options* selection:
![abp-studio-new-solution-dialog-additional-options](images/abp-studio-new-solution-dialog-additional-options-microservice.png)
If you unchecked the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files which include the Helm charts and other Kubernetes related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login.
If you unchecked the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files which include the Helm charts and other Kubernetes related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login. Lastly, you can specify the *Include Tests* option to include the test projects in the solution.
Now, we are ready to allow ABP Studio to create our solution. Just click the *Create* button and let the ABP Studio do the rest for you. After clicking the *Create* button, the dialog is closed and your solution is loaded into ABP Studio:

6
docs/en/get-started/wpf.md

@ -10,12 +10,14 @@ First, install the [ABP CLI](../cli) if you haven't installed before:
dotnet tool install -g Volo.Abp.Studio.Cli
````
Then use the `abp new` command in an empty folder to create a new solution:
Then use the `abp new` command in an empty folder to create a new solution (with the `--old` parameter at the end of the command):
````bash
abp new Acme.MyWpfApp -t wpf
abp new Acme.MyWpfApp -t wpf --old
````
> **Note**: Since this startup template is not provided by the new ABP Studio Templates yet, you need to pass the `--old` parameter at the end of the command to use the old CLI & templating system for this startup template.
`Acme.MyWpfApp` is the solution name, like *YourCompany.YourProduct*. You can use single level, two-levels or three-levels naming.
## Solution Structure

32
docs/en/guides/ms-multi-tenant-domain-resolving.md

@ -270,6 +270,7 @@ Your request from the browser to the subdomain will be accepted by the ingress-c
Update your charts ingress.yaml files. Ex for **administration-ingress.yaml**:
{%{
```yaml
spec:
tls:
@ -303,6 +304,7 @@ spec:
port:
number: 80
```
}%}
**Update all the application, gateway and microservice ingress.yaml files.** Eventually, when deploy the application, you will be seeing:
![updated-ingress](../images/updated-ingress.png)
@ -311,6 +313,7 @@ spec:
Navigate to applications, gateways and microservices' **x-deployment.yaml** file and override the newly introduced `TenantDomain` key:
{%{
```yaml
... Removed for brevity
- name: "TenantDomain" # Add this key
@ -319,11 +322,13 @@ Navigate to applications, gateways and microservices' **x-deployment.yaml** file
value: "{{ .Values.config.authServer.authority }}"
...
```
}%}
> **Update all the application, gateway and microservice deployment.yaml files.**
**For AuthServer, also add the WildCardDomains that is used to handle subdomain *redirect* and *post_logout redirect* URIs to the authserver-deployment.yaml file:**
{%{
```yaml
... Removed for brevity
- name: "TenantDomain"
@ -348,6 +353,7 @@ Navigate to applications, gateways and microservices' **x-deployment.yaml** file
value: "{{ .Values.wildCardDomains.productService }}"
...
```
}%}
Afterwards, update the **values.yaml** file for all the sub-charts (administration, authserver etc):
@ -383,7 +389,7 @@ wildCardDomains:
After updating the **deployment.yaml** and **values.yaml** files of all the application, gateway and microservices' navigate to the **mystore chart values.yaml** file located under the k8s/Mystore/values.yaml that overrides all the sub-charts:
**AuthServer:**
{%{
```yaml
# auth-server sub-chart override
authserver:
@ -402,11 +408,13 @@ authserver:
saasService: "https://{0}.saas.mystore.dev"
productService: "https://{0}.product.mystore.dev"
```
}%}
You may also get CORS error when authenticating SwaggerUI of your gateways or microservices. Add Override the AuthServer CORS values with the subdomain to solve this problem:
**identityService:**
{%{
```yaml
# identity-service sub-chart override
identity:
@ -416,9 +424,10 @@ identity:
... Removed for brevity
tenantDomain: "https://{0}.identity.mystore.dev"
```
}%}
**administrationService:**
{%{
```yaml
# administration-service sub-chart override
administration:
@ -428,9 +437,11 @@ administration:
... Removed for brevity
tenantDomain: "https://{0}.administration.mystore.dev"
```
}%}
**saasService:**
{%{
```yaml
# saas-service sub-chart override
saas:
@ -440,9 +451,9 @@ saas:
... Removed for brevity
tenantDomain: "https://{0}.saas.mystore.dev"
```
}%}
**productService:**
{%{
```yaml
# product-service sub-chart override
product:
@ -452,9 +463,10 @@ product:
... Removed for brevity
tenantDomain: "https://{0}.product.mystore.dev"
```
}%}
**gateway-web:**
{%{
```yaml
# saas-service sub-chart override
gateway-web:
@ -464,9 +476,10 @@ gateway-web:
... Removed for brevity
tenantDomain: "https://{0}.gateway-web.mystore.dev"
```
}%}
**gateway-web-public:**
{%{
```yaml
# gateway-web-public sub-chart override
gateway-web-public:
@ -476,9 +489,10 @@ gateway-web-public:
... Removed for brevity
tenantDomain: "https://{0}.gateway-public.mystore.dev"
```
}%}
**publicweb:**
{%{
```yaml
# Public Web application sub-chart override
publicweb:
@ -489,9 +503,10 @@ publicweb:
... Removed for brevity
tenantDomain: "https://{0}.mystore.dev"
```
}%}
**angular:**
{%{
```yaml
# Angular back-office application sub-chart override
angular:
@ -505,6 +520,7 @@ angular:
strictDiscoveryDocumentValidation: false
skipIssuerCheck: true
```
}%}
> If you are using Web or BlazorServer application for back-office, it is similar configuration with the public-web application

BIN
docs/en/images/abp-overall-diagram-1600.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 KiB

BIN
docs/en/images/pen-test-alert-list-8.3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
docs/en/images/suite-add-existing-solution-8.3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

11
docs/en/index.md

@ -2,6 +2,7 @@
ABP offers an **opinionated architecture** to build enterprise software solutions with **best practices** on top of the **.NET** and the **ASP.NET Core** platforms. It provides the fundamental infrastructure, production-ready startup templates, pre-built application modules, UI themes, tooling, guides and documentation to implement that architecture properly and **automate the details** and repetitive works as much as possible.
## Why ABP Platform?
The following pages outline why you should use the ABP Platform and how it is used:
* [Why choose ABP?](https://abp.io/why-choose-abp)
@ -29,10 +30,20 @@ ABP can work with any database provider, while the following providers are suppo
<img width="340" src="images/db-options.png" alt="ABP Database Providers" />
## The ABP Platform
ABP **bridges the gap** between ASP.NET Core and **real-world business application requirements**, allowing you to focus on your business code.
The following diagram contains the core components of the **ABP Platform** and shows how ABP sits between **ASP.NET Core** and **Your Application**:
![abp-overall-diagram-1600](images/abp-overall-diagram-1600.png)
## Exploring the Documentation
ABP has a **comprehensive documentation** that not only explains ABP, but also includes **guides** and **samples** to help you on creating a **maintainable solution** by introducing and discussing common **software development principle and best practices**.
The next sections highlight important ABP components and provides links to related documents.
### The Framework
#### Architecture

22
docs/en/modules/account/impersonation.md

@ -71,7 +71,7 @@ No need to do anything here.
#### Web
1. Depends `AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)` on your `WebModule`
2. Chnage the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
2. Change the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
```cs
public class AccountController : AbpAccountImpersonationChallengeAccountController
@ -197,7 +197,7 @@ No need to do anything here.
1. Depends `AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)` and `AbpAccountPublicBlazorServerModule(Volo.Abp.Account.Pro.Public.Blazor.Server)` on your `BlazorModule`
2. Chnage the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
2. Change the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
```cs
public class AccountController : AbpAccountImpersonationChallengeAccountController
{
@ -258,6 +258,20 @@ if (!consoleAndAngularClientId.IsNullOrWhiteSpace())
}
```
Add `impersonation: { userImpersonation: true, tenantImpersonation: true}` object to `oAuthConfig` of `environment` if not exits.
```js
export const environment = {
//Other props..
oAuthConfig: {
//Other props..
impersonation: {
userImpersonation: true,
tenantImpersonation: true,
},
},
```
### Blazor WASM
It is currently not supported.
@ -287,7 +301,7 @@ public override void ConfigureServices(ServiceConfigurationContext context)
#### Web
1. Depends `AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)` on your `WebModule`
2. Chnage the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
2. Change the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
```cs
public class AccountController : AbpAccountImpersonationChallengeAccountController
@ -353,7 +367,7 @@ public override void ConfigureServices(ServiceConfigurationContext context)
1. Depends `AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)` and `AbpAccountPublicBlazorServerModule(Volo.Abp.Account.Pro.Public.Blazor.Server)` on your `BlazorModule`
2. Chnage the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
2. Change the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
```cs
public class AccountController : AbpAccountImpersonationChallengeAccountController
{

6
docs/en/modules/chat.md

@ -100,19 +100,19 @@ You can visit [Chat module package list page](https://abp.io/packages?moduleName
## User interface
#### Manage chat feature
### Manage chat feature
Chat module defines the chat feature, you need to enable the chat feature to use chat.
![chat-feature](../images/chat-feature.png)
#### Chat page
### Chat page
This is the page that users send messages to each other.
![chat-page](../images/chat-page.png)
#### Chat icon on navigation bar
### Chat icon on navigation bar
An icon that shows unread message count of the user and leads to chat page when clicked is added to navigation menu.

2
docs/en/modules/cms-kit-pro/index.md

@ -1,4 +1,4 @@
# CMS Kit Pro Module (Pro)
# CMS Kit Module (Pro)
> You must have an ABP Team or a higher license to use this module.

4
docs/en/modules/docs.md

@ -367,7 +367,7 @@ You can use [ABP](https://github.com/abpframework/abp/) GitHub documents to conf
For `SQL` databases, you can use the below `T-SQL` command to insert the specified sample into your `DocsProjects` table:
```mssql
INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName], [ConcurrencyStamp]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'', N'12f21123e08e4f15bedbae0b2d939659')
INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName], [ConcurrencyStamp]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP (GitHub)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'GitHub', N'{"GitHubRootUrl":"https://github.com/abpframework/abp/tree/{version}/docs","GitHubAccessToken":"","GitHubUserAgent":""}', N'/', N'dev', N'', N'12f21123e08e4f15bedbae0b2d939659')
```
Be aware that `GitHubAccessToken` is masked. It's a private token and you must get your own token and replace the `***` string.
@ -407,7 +407,7 @@ You can use [ABP](https://github.com/abpframework/abp/) GitHub documents to conf
For `SQL` databases, you can use the below `T-SQL` command to insert the specified sample into your `DocsProjects` table:
```mssql
INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'')
INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName], [ConcurrencyStamp]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'', N'12f21123e08e4f15bedbae0b2d939659')
```
Add one of the sample projects above and run the application. In the menu you will see `Documents` link, click the menu link to open the documents page.

12
docs/en/modules/gdpr.md

@ -236,9 +236,17 @@ This [Event Transfer Object](../framework/infrastructure/event-bus/distributed#e
Cookie Consent can be used to inform the users of the application, before saving any specific data about the users.
This feature is enabled by default for the [Application](../solution-templates/layered-web-application) and [Application Single Layer](../solution-templates/single-layer-web-application) Startup Templates.
This feature is enabled by default for the [Application](../solution-templates/layered-web-application) and [Application Single Layer](../solution-templates/single-layer-web-application) Startup Templates. You can easily enable/disable showing Cookie Consent by configuring the `AbpCookieConsentOptions`
> You can easily enable/disable to show the Cookie Consent by configuring the `AbpCookieConsentOptions`, which explained above.
If you want to override the texts in the Cookie Consent component, you just need to define the following localization keys in your localization resource files and change text as you wish:
```json
"ThisWebsiteUsesCookie": "This website uses cookies to ensure you get the best experience on the website.",
"CookieConsentAgreePolicies": "If you continue to browse, then you agree to our {0} and {1}.",
"CookieConsentAgreePolicy": "If you continue to browse, then you agree to our {0}.",
```
> Refer to the [Localization documentation](../framework/fundamentals/localization.md) for more info about defining localization resources and overriding existing localization entries that comes from pre-built modules.
### Configuring the Cookie Consent

2
docs/en/modules/openiddict-pro.md

@ -333,7 +333,7 @@ LogoutController -> connect/logout
UserInfoController -> connect/userinfo
```
#### AbpOpenIddictAspNetCoreOptions
### AbpOpenIddictAspNetCoreOptions
`AbpOpenIddictAspNetCoreOptions` can be configured in the `PreConfigureServices` method of your OpenIddict [module](../framework/architecture/modularity/basics.md).

4
docs/en/modules/openiddict.md

@ -1,4 +1,4 @@
## ABP OpenIddict Module
# ABP OpenIddict Module
OpenIddict module provides an integration with the [OpenIddict](https://github.com/openiddict/openiddict-core) which provides advanced authentication features like single sign-on, single log-out, and API access control. This module persists applications, scopes, and other OpenIddict-related objects to the database.
@ -516,7 +516,7 @@ In the module's `app` directory there are six projects(including `angular`)
* `OpenIddict.Demo.Client.BlazorWASM:` ASP NET Core Blazor application using `OidcAuthentication` for authentication.
* `angular`: An angular application that integrates the abp ng modules and uses oauth for authentication.
#### How to run?
### How to run?
Confirm the connection string of `appsettings.json` in the `OpenIddict.Demo.Server` project. Running the project will automatically create the database and initialize the data.
After running the `OpenIddict.Demo.API` project, then you can run the rest of the projects to test.

2
docs/en/modules/tenant-management.md

@ -6,7 +6,7 @@
> Please **refer to the [Multi-Tenancy](../framework/architecture/multi-tenancy) documentation** to understand the multi-tenancy system of the ABP. This document focuses on the Tenant Management module.
### About the ABP SaaS Module
## About the ABP SaaS Module
The [SaaS Module](https://abp.io/modules/Volo.Saas) is an alternative implementation of this module with more features and possibilities. It is distributed as a part of the [ABP](https://abp.io/) subscription.

120
docs/en/others/penetration-test-report.md

@ -1,6 +1,6 @@
# ABP Penetration Test Report
The ABP Commercial MVC `v8.2.0` application template has been tested against security vulnerabilities by the [OWASP ZAP v2.14.0](https://www.zaproxy.org/) tool. The demo web application was started on the `https://localhost:44349` address. The below alerts have been reported by the pentest tool. These alerts are sorted by the risk level as high, medium, and low. The informational alerts are not mentioned in this document.
The ABP Commercial MVC `v8.3.0` application template has been tested against security vulnerabilities by the [OWASP ZAP v2.14.0](https://www.zaproxy.org/) tool. The demo web application was started on the `https://localhost:44349` address. The below alerts have been reported by the pentest tool. These alerts are sorted by the risk level as high, medium, and low. The informational alerts are not mentioned in this document.
Many of these alerts are **false-positive**, meaning the vulnerability scanner detected these issues, but they are not exploitable. It's clearly explained for each false-positive alert why this alert is a false-positive.
@ -10,14 +10,15 @@ In the next sections, you will find the affected URLs, attack parameters (reques
There are high _(red flag)_, medium _(orange flag)_, low _(yellow flag)_, and informational _(blue flag)_ alerts.
![penetration-test-8.2.0](../images/pen-test-alert-list-8.2.png)
w
![penetration-test-8.3.0](../images/pen-test-alert-list-8.3.png)
> The informational alerts are not mentioned in this document. These alerts are not raising any risks on your application and they are optional.
### Path Traversal [Risk: High] - False Positive
- *[GET] - https://localhost:44349/api/audit-logging/audit-logs?startTime=&endTime=&url=&userName=&applicationName=&clientIpAddress=&correlationId=&httpMethod=audit-logs&httpStatusCode=&maxExecutionDuration=&minExecutionDuration=&hasException=true&sorting=executionTime+desc&skipCount=0&maxResultCount=10* (attack: **httpMethod=audit-logs**)
- *[POST] - https://localhost:44349/Account/Login* (attack: **\Login**)
- *[POST] - https://localhost:44349/Account/Register* (attack: **\Register**)
- *[POST] - https://localhost:44349/Account/SecurityLogs* (attack: **\SecurityLogs**)
- *[POST] - https://localhost:44349/Identity/SecurityLogs* (attack: **\SecurityLogs**)
@ -49,6 +50,18 @@ SQL injection may be possible. SQL injection is a web security vulnerability tha
ABP uses Entity Framework Core and LINQ. **It's safe against SQL Injection because it passes all data to the database via SQL parameters.** LINQ queries are not composed by using string manipulation or concatenation, that's why they are not susceptible to traditional SQL injection attacks. Therefore, this is a **false-positive** alert.
### SQL Injection - Authentication Bypass [Risk: High] - False Positive
* *[POST] — https://localhost:44349/Account/Login* (attack: **false AND 1=1 --**)
**Description**:
SQL injection may be possible on a login page, potentially allowing the application's authentication mechanism to be bypassed.
**Solution**:
This alert indicates that we must not trust client side input (even if there is client side validation in place) and check all data on the server side. ABP Framework already does that and makes server-side validations while authenticating a user. Therefore this is a **false-positive** alert.
### Absence of Anti-CSRF Tokens [Risk: Medium] — False Positive
* *[GET] - https://localhost:44349/Account/LinkUsers/LinkUsersModal?returnUrl=/SettingManagement*
@ -113,8 +126,8 @@ Configure<AbpSecurityHeadersOptions>(options =>
### Format String Error [Risk: Medium] - False Positive
- *[GET] — https://localhost:44349/Abp/Languages/Switch?culture=ZAP%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%0A&returnUrl=%2F&uiCulture=ar*
- *[GET] — https://localhost:44349/Abp/ApplicationLocalizationScript?cultureName=ZAP%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%0A*
- *[GET] — https://localhost:44349/Abp/Languages/Switch?culture=ZAP%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%0A&returnUrl=%2F&uiCulture=ar* (with combination of different parameters)
- *[GET] — https://localhost:44349/Abp/ApplicationLocalizationScript?cultureName=ZAP%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%0A* (with combination of different parameters)
**Description:**
@ -148,19 +161,21 @@ Injection using XSL transformations may be possible and may allow an attacker to
**Explanation**:
This is a **false-positive** alert. v8.2.0 uses .NET 8 and the XSLT transformation is not possible on .NET5 or higher.
This is a **false-positive** alert. v8.3.0 uses .NET 8 and the XSLT transformation is not possible on .NET5 or higher.
### Application Error Disclosure [Risk: Low] — False Positive
- *[POST] — https://localhost:44349/Account/ImpersonateUser*
- *[POST] — https://localhost:44349/Saas/Host/Editions*
- *[POST] — https://localhost:44349/Saas/Host/Tenants*
**Description:**
The reported page contains an error/warning message that may disclose sensitive information like the location of the file that produced the unhandled exception. This information can be used to launch further attacks against the web application. The alert could be a false positive if the error message is found inside a documentation page.
The reported pages contain an error/warning message that may disclose sensitive information like the location of the file that produced the unhandled exception. This information can be used to launch further attacks against the web application. The alert could be a false positive if the error message is found inside a documentation page.
**Explanation:**
This vulnerability was reported as a **positive** alert because the application ran in `Development` mode. ABP Framework throws exceptions for developers in the `Development` environment. We set the environment to `Production` and re-run the test, then the server sent a *500-Internal Error* without the error disclosed. Therefore this alert is **false-positive**. Further information can be found in the following issue: [github.com/abpframework/abp/issues/14177](https://github.com/abpframework/abp/issues/14177#issuecomment-1268206947).
This vulnerability was reported as a **positive** alert because the application ran in `Development` mode. ABP throws exceptions for developers in the `Development` environment. We set the environment to `Production` and re-run the test, then the server sent a *500-Internal Error* without the error disclosed. Therefore this alert is **false-positive**. Further information can be found in the following issue: [github.com/abpframework/abp/issues/14177](https://github.com/abpframework/abp/issues/14177#issuecomment-1268206947).
### Cookie No `HttpOnly` Flag [Risk: Low] — Positive (No need for a fix)
@ -326,89 +341,10 @@ The `X-Content-Type-Options` header allows you to avoid MIME type sniffing by sa
You can add the [ABP's Security Header Middleware](../framework/ui/mvc-razor-pages/security-headers.md#security-headers-middleware) into the request pipeline to set the `X-Content-Type-Options` as *no-sniff*. Also, this middleware adds other pre-defined security headers to your application, including `X-XSS-Protection`, `X-Frame-Options` and `Content-Security-Policy` (if it's enabled). Read [Security Headers](../framework/ui/mvc-razor-pages/security-headers.md) documentation for more info.
## Other Alerts
The following alerts are reported by the community or our customers in v8.1+.
### Disclosed Microsoft Client Secret [Risk: Medium] - Positive (No need for a fix)
* *[GET] — https://localhost:44349/setting-management*
**Description**:
Secrets shall never be exposed to unauthorized parties. This exposure can result from improper storage, insecure transmission, or inadequate access controls. In this specific case the owner of the user account is authorized to read and modify the secret. In case of administrative accounts, it could lead to further damages, by performing lateral movements, by using the credentials to access other services.
**Explanation**:
The endpoint `/setting-management/` requires permission to be visited and can only be accessed via authorized users. It is the setting page to configure the application settings including the *default localization language*, *timezone*, *layout type*, *password settings* and more...
### Incorrect Session Handling – Insufficient Session Termination [Risk: Low] - Positive
* *[GET] — https://localhost:44349/Account/Logout*
**Description**:
Application logout functionality does not terminate the user's session. This increases the risk of unauthorized application access via successful session hijacking attacks, users leaving their computers unattended, and/or a local attacker utilizing the browser history. On logout, user sessions should be invalidated and all relevant session identifiers, authentication tokens and application state information deleted or overwritten both on server and on client side.
**Explanation**:
You can track the status of this case at [github.com/abpframework/abp/issues/19576](https://github.com/abpframework/abp/issues/19576).
### Information Disclosure via Configuration Scripts [Risk: Low] - Positive (No need for a fix)
## Other Alerts (Fixed)
- *[GET] — https://localhost:44349/Abp/ApplicationConfigurationScript* or *https://localhost:44349/api/abp/application-configuration*
- *[GET] — https://localhost:44349/Abp/ServiceProxyScript*
**Description**:
When users authenticate to the application, their browsers issue requests to 2 endpoints that host configuration scripts for the application framework. The first contains information about the passwords that are accepted by the application. This information can be used by the attackers to narrow down their dictionaries and only focus on the possible passwords for their
attacks. The second, on the other hand, discloses some endpoints that are unavailable to the users with low privileges.
**Explanation**:
* **Application Configuration Script**:
These 2 endpoints are used by ABP application templates. The first one `/Abp/ApplicationConfigurationScript` provides configuration and user based definitions with JSON format. This data is important for SPA based applications to get the current language, localization texts, policies, settings, user info, current tenant or time zone information. This is not a data leak. User specific data can only be accessed after user logon. Other data are application-wide used not dangerous for unauthenticated users. For more information check out the [Application Configuration](../framework/api-development/standard-apis/configuration.md) document.
* **Service Proxy Script**:
This endpoint provides auto-generated JavaScript AJAX call methods for the backend operations. This may disclosure information about the host API methods. On the other hand, it makes easy to consume the HTTP APIs from JavaScript side. ABP Application Services are automatically converted to JavaScript proxies. But it does not mean that these JavaScript methods can be executed anonymously. The attacker still needs to log in to perform operations. For more information check out the [Service Proxy Script](../framework/ui/mvc-razor-pages/dynamic-javascript-proxies.md) document. If you want to disable this functionality, check out [github.com/abpframework/abp/issues/12297](https://github.com/abpframework/abp/issues/12297)
### User E-mail Address Enumeration [Risk: Low] - Positive
* *[GET] — https://localhost:44349/Account/ForgotPassword*
**Description**:
It is possible to collect valid email addresses by interacting with the "Forgot Password" function of the
application. This vulnerability is useful to increase the efficiency of brute force attacks.
**Explanation**:
If the email is known, it is easier to find the corresponding password. With the "Forgot Password" function, the attacker can enumerate valid email addresses as the function returns `Cannot find the given email` error, when there is no user registered with the provided e-mail address. This vulnerability has been fixed with v8.2, see the related issue for more info: [github.com/abpframework/abp/issues/19588](https://github.com/abpframework/abp/issues/19588).
### Software Version Disclosure [Risk: Low] - Positive (No need for a fix)
* *[GET] — https://localhost:44349/*
**Description**:
The assessed web server discloses its version number within the HTTP response headers. This information facilitates attackers in planning future attacks and can be used in the automation of the attack process. It is unnecessary to share this information with the clients of the web application. The vulnerability can be verified by issuing HTTP requests and inspecting HTTP response headers. HTTP header "Server" contains the version information.
The following header was received in server responses: `Server: Microsoft-IIS/10.0` or `Server: Microsoft-HTTPAPI/2.0`.
**Explanation**:
This is not directly related to ABP. It's a header added by the IIS server. So you can disable this header with the `web.config` file:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<security>
<requestFiltering removeServerHeader="true" />
</security>
</system.webServer>
</configuration>
```
The following alerts were reported by the community or our customers in v8.2 and fixed:
The following issue has been opened for this vulnerability, you can follow it at [github.com/abpframework/abp/issues/19589](https://github.com/abpframework/abp/issues/19589).
* https://github.com/abpframework/abp/issues/19576
* https://github.com/abpframework/abp/issues/19588
* https://github.com/abpframework/abp/issues/19589

2
docs/en/release-info/index.md

@ -1,4 +1,4 @@
## Release Information
# Release Information
* [Release Notes](./release-notes.md)
* [Migration Guides](./migration-guides/index.md)

63
docs/en/release-info/migration-guides/abp-8-2.md

@ -16,9 +16,6 @@ This document is a guide for upgrading ABP v8.x solutions to ABP v8.2. There are
Before this version, all of the projects above were targeting multiple frameworks (**netstandard2.0**, **netstandard2.1** and **net8.0**), with this version, we started to only target **net8.0** for these template projects. Note that, all other shared libraries still target multiple frameworks.
> This change should not affect your pre-existing solutions and you don't need to make any changes in your application. See the PR for more info: https://github.com/abpframework/abp/pull/19565
## Upgraded AutoMapper to 13.0.1
In this version, **AutoMapper** library version upgraded to 13.0.1. See [the release notes of AutoMapper v13.0.1](https://github.com/AutoMapper/AutoMapper/releases/tag/v13.0.1) for more information.
## Added default padding to `.tab-content` class for Basic Theme
@ -60,4 +57,62 @@ In this version, the Angular UI has been updated to use the Angular version 17.3
The **Session Management** feature allows you to prevent concurrent login and manage user sessions.
In this version, a new entity called `IdentitySession` has been added to the framework and you should create a new migration and apply it to your database.
In this version, a new entity called `IdentitySession` has been added to the framework and you should create a new migration and apply it to your database.
## Upgraded NuGet Dependencies
You can see the following list of NuGet libraries that have been upgraded with this release, if you are using one of these packages explicitly, you may consider upgrading them in your solution:
| Package | Old Version | New Version |
| ---------------------------------------------------------- | ----------- | ----------- |
| AutoMapper | 12.0.1 | 13.0.1 |
| Blazorise | 1.4.1 | 1.5.2 |
| Blazorise.Bootstrap5 | 1.4.1 | 1.5.2 |
| Blazorise.Icons.FontAwesome | 1.4.1 | 1.5.2 |
| Blazorise.Components | 1.4.1 | 1.5.2 |
| Blazorise.DataGrid | 1.4.1 | 1.5.2 |
| Blazorise.Snackbar | 1.4.1 | 1.5.2 |
| Hangfire.AspNetCore | 1.8.6 | 1.8.14 |
| Hangfire.SqlServer | 1.8.6 | 1.8.14 |
| Microsoft.AspNetCore.Authentication.JwtBearer | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Authentication.OpenIdConnect | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Authorization | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Components | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Components.Authorization | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Components.Web | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Components.WebAssembly | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Components.WebAssembly.Server | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Components.WebAssembly.Authentication | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Components.WebAssembly.DevServer | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.DataProtection.StackExchangeRedis | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Mvc.NewtonsoftJson | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.Mvc.Testing | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.TestHost | 8.0.0 | 8.0.4 |
| Microsoft.AspNetCore.WebUtilities | 8.0.0 | 8.0.4 |
| Microsoft.Data.SqlClient | 8.0.0 | 8.0.4 |
| Microsoft.EntityFrameworkCore | 8.0.0 | 8.0.4 |
| Microsoft.EntityFrameworkCore.Design | 8.0.0 | 8.0.4 |
| Microsoft.EntityFrameworkCore.InMemory | 8.0.0 | 8.0.4 |
| Microsoft.EntityFrameworkCore.Proxies | 8.0.0 | 8.0.4 |
| Microsoft.EntityFrameworkCore.Relational | 8.0.0 | 8.0.4 |
| Microsoft.EntityFrameworkCore.Sqlite | 8.0.0 | 8.0.4 |
| Microsoft.EntityFrameworkCore.SqlServer | 8.0.0 | 8.0.4 |
| Microsoft.EntityFrameworkCore.Tools | 8.0.0 | 8.0.4 |
| Microsoft.Extensions.DependencyInjection.Abstractions | 8.0.0 | 8.0.1 |
| Microsoft.Extensions.FileProviders.Embedded | 8.0.0 | 8.0.4 |
| Microsoft.Extensions.Logging.Abstractions | 8.0.0 | 8.0.1 |
| Microsoft.Extensions.Options | 8.0.0 | 8.0.2 |
| Microsoft.IdentityModel.Protocols.OpenIdConnect | - | 7.5.1 |
| Microsoft.IdentityModel.Tokens | - | 7.5.1 |
| Microsoft.IdentityModel.JsonWebTokens | - | 7.5.1 |
| System.IdentityModel.Tokens.Jwt | - | 7.5.1 |
| OpenIddict.Abstractions | 5.1.0 | 5.5.0 |
| OpenIddict.Core | 5.1.0 | 5.5.0 |
| OpenIddict.Server.AspNetCore | 5.1.0 | 5.5.0 |
| OpenIddict.Validation.AspNetCore | 5.1.0 | 5.5.0 |
| OpenIddict.Validation.ServerIntegration | 5.1.0 | 5.5.0 |
| Oracle.EntityFrameworkCore | 8.21.121 | 8.23.40 |
| Pomelo.EntityFrameworkCore.MySql | 8.0.0 | 8.0.2 |
| SixLabors.ImageSharp | 3.0.2 | 3.1.4 |

18
docs/en/release-info/migration-guides/abp-8-3.md

@ -53,6 +53,24 @@ See the PR for more info: https://github.com/abpframework/abp/pull/19340
We wish to formally inform you that ABP version 8.3 has been upgraded to incorporate Angular version 18. Consequently, we recommend migrating your application to [Angular v18](https://angular.dev/update-guide) to ensure compatibility.
#### Tenant impersonation & User impersonation
Add the `impersonation: { userImpersonation: true, tenantImpersonation: true}` object to the `oAuthConfig` of the environment if it does not exit.
```
export const environment = {
//Other props..
oAuthConfig: {
//Other props..
impersonation: {
userImpersonation: true,
tenantImpersonation: true,
},
},
```
See https://abp.io/docs/latest/modules/account/impersonation#angular
## PRO
> Please check the **Open-Source (Framework)** section before reading this section. The listed topics might affect your application and you might need to take care of them.

1
docs/en/release-info/migration-guides/pro/openiddict-mvc.md

@ -261,6 +261,7 @@ This project is renamed to **AuthServer** after v6.0.0. You can also refactor an
"RequireHttpsMetadata": "false",
"SwaggerClientId": "MyApplication_Swagger"
},
```
## See Also

4
docs/en/release-info/upgrading.md

@ -20,7 +20,7 @@ Run this command in the terminal while you are in the root folder of your soluti
When you upgrade to a new version, it is good to check if there is a database schema change and upgrade your database schema if your database provider is **Entity Framework Core**;
* Use `Add-Migration "Upgraded_To_Abp_8_2"` or a similar command in the Package Manager Console (PMC) to create a new migration (Set the `EntityFrameworkCore` as the Default project in the PMC and `.DbMigrator` as the Startup Project in the Solution Explorer, in the Visual Studio).
* Use `Add-Migration "Upgraded_To_Abp_8_3"` or a similar command in the Package Manager Console (PMC) to create a new migration (Set the `EntityFrameworkCore` as the Default project in the PMC and `.DbMigrator` as the Startup Project in the Solution Explorer, in the Visual Studio).
* Apply the database migrations to your database. If available, you can run the `.DbMigrator` application to upgrade the database and seed the initial data.
> If `Add-Migration` generates an empty migration (that means no schema change), you can use `Remove-Migration` to delete it before executing the `.DbMigrator`.
@ -57,4 +57,4 @@ Preview releases and nightly builds can help you to try new features and adapt y
## See Also
* [Migration Guides](migration-guides)
* [Migration Guides](migration-guides)

22
docs/en/samples/index.md

@ -1,22 +1,34 @@
# Sample Applications
# ABP Samples
Here, a list of official samples built with ABP.
## Event Hub
A reference application built with ABP. It implements the Domain Driven Design with multiple application layers.
* [Live demo](https://www.openeventhub.com/)
* [Source code](https://github.com/abpframework/eventhub)
## eShopOnAbp
Reference microservice solution built with ABP and .NET.
* [Live demo](https://www.eshoponabp.com/)
* [Source code](https://github.com/abpframework/eShopOnAbp)
## Event Hub
## CMS Kit Demo
A reference application built with ABP. It implements the Domain Driven Design with multiple application layers.
A minimal example website built with the [CMS Kit module](../modules/cms-kit/index.md).
* [Source code](https://github.com/abpframework/eventhub)
* [Live demo](https://cms-kit-demo.abpdemo.com/)
* [Source code](https://github.com/abpframework/cms-kit-demo)
## Easy CRM
A middle-size CRM application built with ABP. [Click here](easy-crm.md) to see the details.
A middle-size CRM application built with ABP.
* [Live demo](http://easycrm.abp.io/)
* [Click here](easy-crm.md) to see the details and download the source code.
## Book Store

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

Loading…
Cancel
Save