ABP framework is a modular, themeable, micro-service compatible application development framework for ASP.NET Core. It provides a complete architecture and a strong infrastructure to let you focus on your own business code rather than repeating yourself for every new project. It is based on the best practices of software development and popular tools you already know.
ABP framework is completely free, open source and community-driven. It also provides a free theme and some pre-built modules (e.g. identity management and tenant management).
",
"VisitTheFrameworkVSCommercialDocument": "Visit the following link for more information {1} ",
@@ -379,13 +383,11 @@
"TaxNoValidationMessage": "TAX/VAT No is too long!",
"NotesValidationMessage": "Notes field is too long!",
"CheckYourBillingInfo": "You can create your invoice only once! Check your billing information before creating your invoice.",
- "Volo.AbpIo.Commercial:030000": "You already used your trial period.",
- "Volo.AbpIo.Commercial:030001": "This organization name already exists.",
"StartYourFreeTrial": "Start your free trial",
"TrialLicenseModelInvalidErrorMessage": "One of the following fields is invalid: Country Name, Company Size, Industry or Purpose Of Usage.",
"Trial": "Trial",
"Purchased": "Purchased",
- "PurchaseLicense": "Purchase Now",
+ "PurchaseNow": "Purchase Now",
"PurchaseTrialLicenseMessage": "Your license expiration date is {0}. If you want to continue using the projects you created during your free trial period, you need to change the license keys in your appsettings.secrets.json files. Here is your license key:",
"TrialLicenseExpireMessage": "You are using the trial license and your trial license will expire on {0}.",
"TryForFree": "Try For Free",
@@ -488,26 +490,239 @@
"BackOfficeApplicationExplanation": "The actual web application of your system, with multiple UI framework options. You can create any kind of business application.",
"LandingWebsite": "Landing Website",
"LandingWebsiteExplanation": "A generic landing/public website that can be used for several purposes, like introducing your company, selling your products, etc.",
- "ABPFrameworkEBook": "E-Book: Mastering ABP Framework",
+ "ABPFrameworkEBook": "Mastering ABP Framework e-book",
"MasteringAbpFrameworkEBookDescription": "Included within your ABP Commercial license",
- "Volo.AbpIo.Domain:070000": "The organization name can only contain latin letters, numbers, dots and hyphens!",
- "Volo.AbpIo.Domain:070001": "The company name can only contain latin letters, numbers, dots, space and hyphens!",
"FullName": "Full Name",
"LicenseTypeNotCorrect": "The license type is not correct!",
"Trainings": "Trainings",
- "ChoseTrainingPlaceholder": "Chose the training...",
+ "ChooseTrainingPlaceholder": "Choose the training...",
"DoYouNeedTrainings": "Do you need one of these trainings?",
"DoYouNeedTraining": "Do you need {0} training?",
"GetInTouchUs": "Get in touch with us",
"ForMoreInformationClickHere": "For more information, click here.",
"IsGetOnboardingTraining": "Would you like to get onboarding & web application development training?",
"OnboardingWebApplicationDevelopmentTrainingMessage": "To schedule your training calendar, please contact {0} after creating the organization",
+ "CustomPurchaseMessage": "For the next step, click {0} to contact us.",
"Note": "Note",
"AdditionalNote": "Additional Note",
"OnboardingTrainingFaqTitle": "Do you have ABP onboarding training?",
"OnboardingTrainingFaqExplanation": "Yes, we have ABP Training Services to help you get your ABP project started fast. You will learn about ABP from an ABP core team member and you will get the skills to begin your ABP project. In the onboarding training, we will explain how to set up your development environment, install the required tools, create a fully functional CRUD page. The training will be live and the Zoom application will be used, and we are open to using other online meeting platforms. The language of the training will be English. You can also ask your questions about ABP during the sessions. A convenient time and date will be planned for both parties. To get more information, contact us at info@abp.io.",
"AddBasket": "Add to Basket",
"SendTrainingRequest": "Send Training Request",
- "OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* The English version of this document is the most up-to-date and the English version will prevail in any dispute."
+ "OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* The English version of this document is the most up-to-date and the English version will prevail in any dispute.",
+ "Pricing_Page_Title": "Plans & Pricing",
+ "Pricing_Page_Description": "Choose the features and functionality your business needs today. Buy an ABP Commercial license and create unlimited projects.",
+ "Pricing_Page_HurryUp": "Hurry Up!",
+ "Pricing_Page_BuyLicense": "Buy a license at 2021 prices until January 16!",
+ "Pricing_Page_ValidForExistingCustomers": "Also valid for existing customers and license renewals.",
+ "Pricing_Page_Hint1": "The license price includes a certain number of developer seats. If you have more developers, you can always purchase additional seats.",
+ "Pricing_Page_Hint2": "You can purchase more developer licenses now or in the future. Licenses are seat based, so you can transfer a seat from a developer to another.",
+ "Pricing_Page_Hint3": "You can develop unlimited count of different products with your license.",
+ "Pricing_Page_Hint4": "ABP Suite is a tool to assist your development to improve your productivity. It supports generating CRUD pages and creating new projects.",
+ "Pricing_Page_Hint5": "You can use all the pre-built modules in your applications.",
+ "Pricing_Page_Hint6": "You can use all the pre-built themes in your applications.",
+ "Pricing_Page_Hint7": "A startup template is a Visual Studio solution to make you jump-start to your project. All fundamental modules are added and pre-configured for you.",
+ "Pricing_Page_Hint8": "Mastering ABP Framework e-book explains how to implement .NET solutions with best practices. It is sold on Amazon.com and you can download the book for free within your license.",
+ "Pricing_Page_Hint9": "You can download the source-code of any module. You may want to add the source code to your solution to make radical changes or just keep it for yourself for security reasons.",
+ "Pricing_Page_Hint10": "Licenses are for lifetime. That means you can continue to develop your application forever. Accessing to the latest version and getting support are granted within the license period (1 year unless you renew it).",
+ "Pricing_Page_Hint11": "No restrictions on deployment! You can deploy to as many servers as you want, including the cloud services or on-premises.",
+ "Pricing_Page_Hint12": "You can update the modules, themes and tools to the latest version within your active license period. After your license expires, you need to renew it, to continue to get updates for bug fixes, new features and enhancements.",
+ "Pricing_Page_Hint13": "You can get the premium support for one year (you can renew your license to extend it).",
+ "Pricing_Page_Hint14": "Team and Business licenses have incident/question count limit. If you buy additional developer licenses, your incident limit increases by {0} (for the Team License) or {1} (for the Business License) per developer.",
+ "Pricing_Page_Hint15": "Only Enterprise License includes private support. You can send e-mail directly to the ABP Team or ask questions on support.abp.io with private ticket option. The private tickets are not visible to the public.",
+ "Pricing_Page_Hint16": "You can download the source-code of all ABP themes. You may want to add the source code to your solution to make radical changes or just keep it for yourself for security reasons.",
+ "Pricing_Page_Testimonial_1": "ABP Commercial allowed SC Ventures to deliver a bank-grade multi-tenant silo-database SaaS platform in 9 months to support the accounts receivable / accounts payable supply chain financing of significant value invoices from multiple integrated anchors. The modularity of ABP made it possible for the team to deliver in record time, pass all VAPT, and deploy the containerized micro-services stack via full CI/CD and pipelines into production.",
+ "Pricing_Page_Testimonial_2": "We are seeing the value of using ABP Commercial to reduce the overhead of custom development projects. And the team is able to unify the code pattern in different project streams. We see more potential in the framework for us to build new features faster than before. We trust we will be constantly seeing the value of leveraging ABP Commercial.",
+ "Pricing_Page_Testimonial_3": "We love ABP. We don't have to write everything from scratch. We start from out-of-the-box features and just focus on what we really need to write. Also, ABP is well-architected and the code is high quality with fewer bugs. If we would have to write everything we needed on our own, we might have to spend years. Once more things we like is that the new version, or issue fixing, or improvement come out very soon every other week. We don't wait too long.",
+ "Pricing_Page_Testimonial_4": "ABP Commercial is a fantastic product would recommend. Commercial products to market for our customers in a single configurable platform. The jump start that the framework and tooling provide any team is worth every cent. ABP Commercial was the best fit for our needs.",
+ "AbpBookDownloadArea_ClaimYourEBook": "Claim your Mastering ABP Framework E-Book",
+ "AddMemberModal_Warning_1": "If the username you are trying to add doesn't exist in the system, please ask your team member to register on {0} and share the username of his/her account with you.",
+ "MyOrganizations_Detail_WelcomeMessage": "Welcome to your organization, {0}",
+ "MyOrganizations_Detail_OrganizationManagement": "Organization Management",
+ "OrganizationDisplayName": "Organization Display Name",
+ "MyOrganizations_Detail_EditDisplayName": "Edit Display Name",
+ "MyOrganizations_Detail_UpgradeYourLicense": "Upgrade your license",
+ "MyOrganizations_Detail_LicenseStartAndExpiryDate": "License Start Date - Expiry Date",
+ "MyOrganizations_Detail_OwnerRightInfo": "You are using {0} of your {1} owners rights.",
+ "MyOrganizations_Detail_CopyApiKey": "Copy the Key",
+ "MyOrganizations_Detail_ApiKeyDescription": "The API Key is the token of PRO packages hosted on {1}.",
+ "MyOrganizations_Detail_YourPrivateNugetSource": "Your private NuGet source is {0}",
+ "MyOrganizations_Detail_PrivateNugetSourceWarning": "This is automatically added as a feed to your NuGet.Config in your ABP solution. Do not share your private key with unauthorized users!",
+ "MyOrganizations_Detail_DeveloperSeatInfo": "You are using {0} of your {1} developer seats.",
+ "NeedMoreSeatsForYourTeam": "Need more seats for your team?",
+ "MyOrganizations_Detail_PricePerYear": "{0} / per year",
+ "MyOrganizations_Detail_PurchaseDeveloperSeats": "Purchase Developer Seats",
+ "Invoices": "Invoices",
+ "RequestInvoice": "Request Invoice",
+ "OrderNumber": "Order Number",
+ "Date": "Date",
+ "Products": "Products",
+ "TotalPrice": "Total Price",
+ "ThereIsNoInvoice": "There is no invoice",
+ "MyOrganizations_Detail_PaymentProviderInfo": "If you have purchased your license through {0} gateway, it sends the PDF invoice to your email address, see {0} invoicing.",
+ "MyOrganizations_Detail_PayUInfo": "If you have purchased through the PayU gateway, click the \"Request Invoice\" button and fill in the billing information.",
+ "MyOrganizations_Detail_ConclusionInfo": "Your invoice request will be concluded within {0} business days.",
+ "ExtendYourLicense": "Extend Your {0} License",
+ "Continue": "Continue",
+ "PurchaseLicense": "Purchase {0} license",
+ "DownloadInvoiceModal_DownloadInvoice": "Download Invoice",
+ "DownloadInvoiceModal_SaveInformationOnlyOnce": "You can save your billing information only once.",
+ "InvoiceModal_EnterCompanyName": "Enter your legal company name...",
+ "InvoiceModal_EnterCompanyAddress": "Enter your legal company address...",
+ "InvoiceModal_EnterTaxNumber": "Enter your TAX/VAT number if available...",
+ "RequestInvoiceModal_EnterNotes": "Enter your extra message about your invoice...",
+ "PrePayment_PayWithIyzico": "You will pay with Iyzico",
+ "ContinueToCheckout": "Continue to Checkout",
+ "PrePayment_IyzicoRedirectionInfo": "You will be redirected to Iyzico Payment Gateway to complete your purchase securely.",
+ "PrePayment_IyzicoAcceptVisaAndMasterCard": "Iyzico accepts Visa and MasterCard.",
+ "Purchase": "Purchase",
+ "AcceptTermsAndConditions": "I have read, understand and accept the privacy policy, terms & conditions and EULA.",
+ "AcceptTermsAndConditionsWarningMessage": "Please accept the privacy policy and terms & conditions",
+ "SelectGatewayToContinue": "Please select a Gateway to continue!",
+ "GatewaySelection_SelectGateway": "Select a Payment Gateway",
+ "GatewaySelection_RedirectionMessage": "Next, you will be redirected to the selected payment gateway's website for the transaction.",
+ "PaymentSucceed_PaymentSuccessMessage": "Payment Successful",
+ "PaymentSucceed_ThanksForPurchase": "Thank you for your purchase!",
+ "PaymentSucceed_CreateYourOrganization": "Create your organization",
+ "PaymentSucceed_AddMeAsDeveloper": "I'm a developer too, add me as a a developer to my organization.",
+ "PaymentSucceed_CreateOrganization": "Create Organization",
+ "PaymentSucceed_OrganizationDescription": "An organization consists of developers and owners. The developers are users who write code on ABP project and will benefit from the {1} website. The owners are users who allocate developer seats and manage licensing.",
+ "PaymentSucceed_ViewOrganization": "Click here to view organization",
+ "Purchase_TotalAnnualPrice": "TOTAL (annual fee)",
+ "Purchase_TrainingPrice": "Training Price",
+ "Purchase_OnboardingTraining": "ABP Onboarding & Web Application Development Live Training",
+ "TotalDeveloperPrice": "Total Developer Price",
+ "Purchase_PricePerDeveloper": "{0} {1} per developer",
+ "Purchase_IncludedDeveloperInfo": "{0} {1} included.",
+ "Purchase_LicenseExtraDeveloperPurchaseMessage": "The {0} license contains {1} developer(s). You can add additional developers now or later.",
+ "StartupTemplates_Page_Title": "The Startup Templates",
+ "StartupTemplates_Page_Description": "ABP Commercial allows you to build solutions with any level of complexity. It provides two main pre-built startup solutions. You can select the one close to your requirements and build your own custom solution on top of it.",
+ "MicroserviceStartupSolutionForDotnet": "Microservice Startup Solution for .NET",
+ "MonolithSolutionForDotnet": "Monolith (modular) Solution for .NET",
+ "TrainingDetailsHeaderInfo_TrainingHour": "{0} hour(s)",
+ "Trainings_Content": "Content of Training",
+ "Trial_Page_StartYourFreeTrial": "Start Your Free Trial",
+ "Contact_Page_Title": "Contact with ABP Development Team",
+ "Contact_Page_Description": "Contact with ABP Development team, if you need any help or share your thoughts and opinions! ABP Support Team is ready to help.",
+ "Demo_Page_Title": "Create a Demo",
+ "Demo_Page_Description": "Create a free demo to see a sample application created using the ABP Commercial startup template. Don't repeat yourself for common application requirements.",
+ "Discounted_Page_Title": "Discounted pricing",
+ "Discounted_Page_Description": "Choose the features and functionality your business needs today. Buy an ABP Commercial license and create unlimited projects",
+ "Faq_Page_Title": "Frequently Asked Questions (FAQ)",
+ "Faq_Page_Description": "Do you have any questions? Search frequently asked questions or ask us a question using the contact form.",
+ "Faq_Page_SwiftCode": "SWIFT Code",
+ "Faq_Page_BankName": "Bank Name",
+ "Faq_Page_AccountName": "Account Name",
+ "Faq_Page_AccountNumber": "Account Number",
+ "Faq_Page_Currency": "Currency",
+ "Faq_Page_VatNumber": "VAT number",
+ "Faq_Page_OtherCurrenciesInfo": "For other currencies, see all accounts",
+ "ModuleDetail_Page_Title": "Module Detail - {0}",
+ "ProjectCreatedSuccess_Page_Title": "Your project created",
+ "ProjectCreatedSuccess_Page_Description": "Your ABP project created successfully!",
+ "Suite_Page_Title": "ABP Suite - Create CRUD Pages",
+ "Suite_Page_Description": "ABP Commercial provides rapid application development tooling to increase developer productivity. ABP Suite allows you to create CRUD pages easily.",
+ "Themes_Page_Title": "Modern and Functional UI Themes",
+ "Themes_Page_Description": "ABP Commercial provides multiple professional, modern UI themes. Create a free demo to have a quick view of what the UI looks like.",
+ "Tools_Page_Title": "Rapid Application Development Tools",
+ "Tools_Page_Description": "ABP Commercial provides rapid application development tooling to increase developer productivity. ABP Suite allows you to create CRUD pages easily.",
+ "DeveloperPrice": "Developer Price",
+ "AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0} developers",
+ "AdditionalDeveloperPaymentInfoSection_RemainingYear": "for {1} years",
+ "ExtendPaymentInfoSection_Description": "By extending/renewing your license, you will continue to get premium support. You will also be able to get major updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.",
+ "LicenseRenewalPrice": "License renewal price",
+ "LicensePrice": "License Price",
+ "TrialLicensePaymentInfoSection_Description": "Purchase license: By purchasing a license, you will continue to get premium support. You will also be able to get major updates for modules and themes. You will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development. See the license comparison table to check the differences between the license types.",
+ "SelectTargetLicense": "Select Target License",
+ "UpgradePaymentInfoSection_ExtendMyLicenseForOneYear": "Yes, extend my license expiration date for 1 year.",
+ "UpgradePaymentInfoSection_WantToExtendLicense": "Do you want to extend your license for {0} more year(s)?",
+ "UpgradePaymentInfoSection_UpgradingWillNotExtendLicense": "Upgrading will not extend your license expiration date!",
+ "UpgradePaymentInfoSection_LicenseUpgradeDescription": "By upgrading your license, you will promote to a higher license type which will allow you to get additional benefits. See the license comparison table to check the differences between the license types.",
+ "Landing_Page_CustomerStories": "Customer Stories",
+ "Landing_Page_OurGreatCustomers": "Our Great Customers",
+ "Landing_Page_WebApplicationFramework": "Web Application Framework",
+ "Landing_Page_WebDevelopmentPlatform": "Web Development Platform",
+ "Landing_Page_CompleteWebDevelopmentPlatform": "Complete Web Development Platform",
+ "Landing_Page_TryFreeDemo": "Try Free Demo",
+ "Landing_Page_StartingPointForWebApplications": "The starting point for ASP.NET Core based web applications! It is based on the ABP Framework for best web development.",
+ "Landing_Page_AbpProvidesSoftwareInfrastructure": "ABP Framework provides a software infrastructure to develop excellent web applications with best practices.",
+ "Landing_Page_MicroserviceCompatibleArchitecture": "Microservice Compatible Architecture",
+ "Landing_Page_PreBuiltApplicationModulesAndThemes": "Pre-Built Application Modules & Themes",
+ "Landing_Page_MultiTenantArchitecture": "Multi-Tenant Architecture",
+ "Landing_Page_MultiTenancyDescription": "SaaS applications made easy! Integrated multi-tenancy from database to UI.",
+ "Landing_Page_DDDIntroduction": "Designed and developed based on DDD patterns and principles. Provides a layered model for your application.",
+ "Landing_Page_CrossCuttingConcernsInfo": "Complete infrastructure for authorization, validation, exception handling, caching, audit logging, transaction management and more.",
+ "Landing_Page_PreBuiltApplicationModules": "Pre-Built Application Modules which include most common web application requirements.",
+ "Landing_Page_ChatModule": "Chat",
+ "Landing_Page_DocsModule": "Docs",
+ "Landing_Page_FileManagementModule": "Docs",
+ "Landing_Page_CustomerStory_1": "ABP Commercial allowed SC Ventures to deliver a bank-grade multi-tenant silo-database SaaS platform in 9 months to support the accounts receivable / accounts payable supply chain financing of significant value invoices from multiple integrated anchors. The modularity of ABP made it possible for the team to deliver in record time, pass all VAPT, and deploy the containerized micro-services stack via full CI/CD and pipelines into production.",
+ "Landing_Page_CustomerStory_2": "We are seeing the value of using ABP Commercial to reduce the overhead of custom development projects. And the team is able to unify the code pattern in different project streams. We see more potential in the framework for us to build new features faster than before. We trust we will be constantly seeing the value of leveraging ABP Commercial.",
+ "Landing_Page_CustomerStory_3": "We love ABP. We don't have to write everything from scratch. We start from out-of-the-box features and just focus on what we really need to write. Also, ABP is well-architected and the code is high quality with fewer bugs. If we would have to write everything we needed on our own, we might have to spend years. Once more things we like is that the new version, or issue fixing, or improvement come out very soon\n every other week. We don't wait too long.",
+ "Landing_Page_CustomerStory_4": "ABP Commercial is a fantastic product would recommend. Commercial products to market for our customers in a single configurable platform. The jump start that the framework and tooling provide any team is worth every cent. ABP Commercial was the best fit for our needs.",
+ "Landing_Page_AdditionalServices": "Custom or volume license, onboarding, live training & support, custom project development, porting existing projects and more...",
+ "Landing_Page_IncludedDeveloperLicenses": "Included {0} developer licenses",
+ "Landing_Page_SeeOnDemo": "See on Demo",
+ "Landing_Page_LeptonThemes": "LeptonThemes",
+ "Landing_Page_AccountModuleDescription_1": "This module implements the authentication system for an application;",
+ "Landing_Page_AccountModuleDescription_2": "Provides a login page with the username and password",
+ "Landing_Page_AccountModuleDescription_3": "Provides a register page to create a new account.",
+ "Landing_Page_AccountModuleDescription_4": "Provides a forgot password page to send a password reset link as an e-mail.",
+ "Landing_Page_AccountModuleDescription_5": "Provides email confirmation functionality with UI.",
+ "Landing_Page_AccountModuleDescription_6": "Implements two factor authentication (SMS and e-mail).",
+ "Landing_Page_AccountModuleDescription_7": "Implements user lockout (locks the account for the set amount of time when a certain number of failed logons occur due to invalid credentials within a certain interval of time).",
+ "Landing_Page_AccountModuleDescription_8": "Implements Identity Server authentication server UI and functionality.",
+ "Landing_Page_AccountModuleDescription_9": "Allows to switch between tenants in a multi-tenant environment.",
+ "Landing_Page_AccountModuleDescription_10": "Allows to change the UI language of the application.",
+ "Landing_Page_AuditLoggingModuleDescription_1": "This module provides the audit log reporting UI for the auditing infrastructure. Allows to search, filter and show audit log entries and entity change logs.",
+ "Landing_Page_AuditLoggingModuleDescription_2": "An audit log entry consists of critical data about each client request:",
+ "Landing_Page_AuditLoggingModuleDescription_3": "URL, Browser, IP address, client name",
+ "Landing_Page_AuditLoggingModuleDescription_4": "The user",
+ "Landing_Page_AuditLoggingModuleDescription_5": "HTTP method, HTTP return status code",
+ "Landing_Page_AuditLoggingModuleDescription_6": "Success/failure, exception details if available",
+ "Landing_Page_AuditLoggingModuleDescription_7": "Request execution duration",
+ "Landing_Page_AuditLoggingModuleDescription_8": "The entities have been created, deleted or updated in this request (with changed properties).",
+ "Landing_Page_BloggingModuleDescription_1": "This module adds a simple blog to your ABP application;",
+ "Landing_Page_BloggingModuleDescription_2": "Allows to create multiple blogs in a single application.",
+ "Landing_Page_BloggingModuleDescription_3": "Supports the Markdown format.",
+ "Landing_Page_BloggingModuleDescription_4": "Allows to write comment for a post.",
+ "Landing_Page_BloggingModuleDescription_5": "Allows to assign tags to the blog posts.",
+ "Landing_Page_BloggingModuleDescription_6": "See the blog.abp.io website as a live example of the blogging module.",
+ "Landing_Page_ChatModuleDescription_1": "This module is used for real-time messaging between users in application.",
+ "Landing_Page_ChatModuleDescription_2": "Real-time messaging on chat page.",
+ "Landing_Page_ChatModuleDescription_3": "Search users in application for new conversations.",
+ "Landing_Page_ChatModuleDescription_4": "Contact list for recent conversations.",
+ "Landing_Page_ChatModuleDescription_5": "New message notifications when user is looking at another page.",
+ "Landing_Page_ChatModuleDescription_6": "Total unread message count badge on menu icon.",
+ "Landing_Page_ChatModuleDescription_7": "Unread message count for each conversation.",
+ "Landing_Page_ChatModuleDescription_8": "Lazy loaded conversations.",
+ "Landing_Page_DocsModuleDescription_1": "This module is used to create technical documentation web sites;",
+ "Landing_Page_DocsModuleDescription_2": "Built-in GitHub integration: Directly write and manage documents on GitHub.",
+ "Landing_Page_DocsModuleDescription_3": "Versioning support directly integrated to GitHub releases.",
+ "Landing_Page_DocsModuleDescription_4": "Supports multi-language (with fallback support to the default language).",
+ "Landing_Page_DocsModuleDescription_5": "Supports the Markdown and HTML formats.",
+ "Landing_Page_DocsModuleDescription_6": "Provides a navigation and an outline section.",
+ "Landing_Page_DocsModuleDescription_7": "Allows to host multiple projects documentation in a single application.",
+ "Landing_Page_DocsModuleDescription_8": "Links to the file on GitHub, so anyone can easily contribute by clicking to the Edit link.",
+ "Landing_Page_DocsModuleDescription_9": "In addition to the GitHub source, allows to simply use a folder as the documentation source.",
+ "Landing_Page_FileManagementModuleDescription_1": "Upload, download and organize files in a hierarchical folder structure.",
+ "Landing_Page_FileManagementModuleDescription_2": "This module is used to upload, download and organize files in a hierarchical folder structure. It is also compatible to multi-tenancy and you can determine total size limit for your tenants.",
+ "Landing_Page_FileManagementModuleDescription_3": "This module is based on the BLOB Storing system, so it can use different storage providers to store the file contents.",
+ "Landing_Page_IdentityModuleDescription_1": "This module implements the User and Role system of an application;",
+ "Landing_Page_IdentityModuleDescription_2": "Built on the Microsoft's ASP.NET Core Identity library.",
+ "Landing_Page_IdentityModuleDescription_3": "Manage roles and users in the system. A user is allowed to have multiple roles.",
+ "Landing_Page_IdentityModuleDescription_4": "Set permissions in role and user levels.",
+ "Landing_Page_IdentityModuleDescription_5": "Enable/disable two factor authentication and user lockout per user.",
+ "Landing_Page_IdentityModuleDescription_6": "Manage basic user profile and password.",
+ "Landing_Page_IdentityModuleDescription_7": "Manage claim types in the system, set claims to roles and users.",
+ "Landing_Page_IdentityModuleDescription_8": "Setting page to manage password complexity, user sign-in, account and lockout.",
+ "Landing_Page_IdentityModuleDescription_9": "Supports LDAP authentication.",
+ "Landing_Page_IdentityModuleDescription_10": "Provides email & phone number verification.",
+ "Landing_Page_IdentityModuleDescription_11": "Supports social login integrations (Twitter, Facebook, GitHub etc...).",
+ "Landing_Page_IdentityModuleDescription_12": "Manage organization units in the system.",
+ "Landing_Page_PaymentModuleDescription_1": "Provides integration for different payment gateways.",
+ "Landing_Page_PaymentModuleDescription_2": "This module provides integration for payment gateways, so you can easily get payment from your customers.",
+ "Landing_Page_PaymentModuleDescription_3": "This module supports the following payment gateways",
+ "Welcome_Page_UseSameCredentialForCommercialWebsites": "Use the same credentials for both commercial.abp.io and support.abp.io."
}
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
index de04b36283..0ed3eda832 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
@@ -166,6 +166,24 @@
"NoPublishedEventsYet": "No published events yet.",
"SubscribeYoutubeChannel": "Subscribe to the Youtube Channel",
"Enum:EventType:0": "Talks",
- "MemberNotPublishedPostYet": "This member hasn't published any posts yet."
+ "MemberNotPublishedPostYet": "This member hasn't published any posts yet.",
+ "TimeAgo": "{0} ago",
+ "Discord_Page_JoinCommunityMessage": "Join ABP Discord Community",
+ "Discord_Page_Announce": "We are happy to announce ABP Community Discord Server!",
+ "Discord_Page_Description_1": "ABP Community has been growing since day one. We wanted to take it to the next step by creating an official ABP Discord server so the ABP Community can interact with each other using the wonders of instant messaging.",
+ "Discord_Page_Description_2": "ABP Community Discord Server is the place where you can showcase your creations using ABP Framework, share the tips that worked for you, catch up with the latest news and announcements about ABP Framework, just chat with community members to exchange ideas, and have fun!",
+ "Discord_Page_Description_3": "This ABP Community Discord Server is the official one with the ABP Core Team is present on the server to monitor.",
+ "Discord_Page_JoinToServer": "Join ABP Discord Server",
+ "Events_Page_MetaTitle": "ABP Community Events",
+ "Events_Page_MetaDescription": "The live shows, hosted by the ABP Team, are casual sessions full of community content, demos, Q&A, and discussions around what's happening in ABP.",
+ "Events_Page_Title": "ABP Community Talks",
+ "Events_Page_WritingFromUser": "Read writing from {0} on ABP Community.",
+ "Post_Create_Page_MetaTitle": "New Post",
+ "Post_Create_Page_MetaDescription": "Create your post for sharing your experiences about ABP framework and contributing the ABP Community.",
+ "Post_Create_Page_CreateNewPost": "Create New Post",
+ "Post_Index_Page_MetaDescription": "ABP Community's purpose is to create a contribution environment for developers who use the ABP framework.",
+ "Layout_Title": "{0} | ABP Community",
+ "Layout_MetaDescription": "ABP Community is an environment where people can share posts about ABP framework and follows the projects.",
+ "Index_Page_CommunityIntroduction": "This is a hub for ABP Framework, .NET and software development. You can read the articles, watch the video tutorials, get informed about ABP’s development progress and ABP-related events, help other developers and share your expertise with the ABP community."
}
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/en.json
index 189662ee7c..dbeeb1c68b 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/en.json
@@ -1,5 +1,6 @@
{
"culture": "en",
"texts": {
+ "FAQ": "FAQ"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/pt-BR.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/pt-BR.json
index 2012b4c128..8104167259 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/pt-BR.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/pt-BR.json
@@ -1,5 +1,6 @@
{
"culture": "pt-BR",
"texts": {
+ "FAQ": "FAQ"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/ro-RO.json
index c5a76c1617..55f0ad9787 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/ro-RO.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/ro-RO.json
@@ -1,5 +1,6 @@
{
"culture": "ro-RO",
"texts": {
+ "FAQ": "FAQ"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/sl.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/sl.json
index 103359cbc2..dc565e279e 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/sl.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/sl.json
@@ -1,5 +1,6 @@
{
"culture": "sl",
"texts": {
+ "FAQ": "FAQ"
}
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/tr.json
index 5af6a13c50..fce769c8f3 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/tr.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/tr.json
@@ -1,5 +1,6 @@
{
"culture": "tr",
"texts": {
+ "FAQ": "SSS"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hans.json
index df772fa60b..034381b5d1 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hans.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hans.json
@@ -1,5 +1,6 @@
{
"culture": "zh-Hans",
"texts": {
+ "FAQ": "常问问题"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hant.json
index 7de3798218..70347dfd09 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hant.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hant.json
@@ -1,5 +1,6 @@
{
"culture": "zh-Hant",
"texts": {
+ "FAQ": "常问问题"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
index d17259241c..41eda60de6 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
@@ -325,6 +325,53 @@
"CreateYourProjectNow": "Create Your Project Now",
"OrderOn": "Order on {0}",
"DownloadFreeDDDBook": "Download Free DDD Book",
- "WhatIsABPFramework": "What is the ABP Framework?"
+ "WhatIsABPFramework": "What is the ABP Framework?",
+ "TenantDatabase": "Tenant {0} Database",
+ "SharedDatabase": "Shared Database",
+ "ConnectionResolver": "Connection Resolver",
+ "TenantBasedDataFilter": "Tenant Based Data Filter",
+ "ApplicationCode": "Application Code",
+ "TenantResolution": "Tenant Resolution",
+ "TenantUser": "Tenant {0} User",
+ "CardTitle": "Card title",
+ "View": "View",
+ "Model": "Model",
+ "Email": "Email",
+ "Password": "Password",
+ "Address": "Address",
+ "Gender": "Gender",
+ "Male": "Male",
+ "Female": "Female",
+ "Submit": "Submit",
+ "Unspecified": "Unspecified",
+ "StaticFileMiddleware": "Static File Middleware",
+ "RazorViewEngine": "Razor View Engine",
+ "PhysicalFiles": "Physical Files (wwwroot)",
+ "EmbeddedFiles": "Embedded Files (DLL)",
+ "DynamicFiles": "Dynamic Files (Memory)",
+ "BuildSolutionsWithAbp": "Build maintainable .NET solutions by following software development best practices using ABP.",
+ "BuyOnAmazon": "Buy on Amazon",
+ "BuyOnPackt": "Buy on Packt",
+ "Discounted": "Discounted",
+ "MasteringAbpFramework_Book_KeyFeatures": "Key Features",
+ "MasteringAbpFramework_Book_Key_Features_Description_1": "Build robust, maintainable, modular, and scalable software solutions using ABP Framework.",
+ "MasteringAbpFramework_Book_Key_Features_Description_2": "Learn how to implement SOLID principles and domain-driven design in your web applications.",
+ "MasteringAbpFramework_Book_Key_Features_Description_3": "Discover how ABP Framework speeds up your development cycle by automating repetitive tasks.",
+ "MasteringAbpFramework_Book_Description": "Book Description",
+ "MasteringAbpFramework_Book_Description_Details_1": "ABP Framework is a complete infrastructure for creating modern web applications by following software \n development best practices and conventions. With ABP's high-level framework and ecosystem, you can \n implement the Don't Repeat Yourself (DRY) principle and focus on your business code.",
+ "MasteringAbpFramework_Book_Description_Details_2": "Written by the creator of ABP Framework, this book will help you to gain a complete understanding of the\n framework and modern web application development techniques. With step-by-step explanations of essential\n concepts and practical examples, you'll understand the requirements of a modern web solution and how ABP\n Framework makes it enjoyable to develop your own solutions. You'll discover the common requirements of\n enterprise web application development and explore the infrastructure provided by ABP. Throughout the\n book, you'll get to grips with software development best practices for building maintainable and modular\n web solutions.",
+ "MasteringAbpFramework_Book_Description_Details_3": "By the end of this book, you'll be able to create a complete web solution that is easy to develop,\n maintain, and test.",
+ "MasteringAbpFramework_Book_WhatYouWillLearn": "What you will learn",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_1": "Set up the development environment and get started with ABP Framework.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_2": "Work with Entity Framework Core and MongoDB to develop your data access layer.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_3": "Understand cross-cutting concerns and how ABP automates repetitive tasks.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_4": "Get to grips with implementing domain-driven design with ABP Framework.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_5": "Build UI pages and components with ASP.NET Core MVC (Razor Pages) and Blazor.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_6": "Work with multi-tenancy to create modular web applications.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_7": "Understand modularity and create reusable application modules.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_8": "Write unit, integration, and UI tests using ABP Framework.",
+ "MasteringAbpFramework_Book_WhoIsThisBookFor": "Who's this book for",
+ "MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "This book is for web developers who want to learn software architectures and best practices for building\n maintainable web-based solutions using Microsoft technologies and ABP Framework. Basic knowledge of C#\n and ASP.NET Core is necessary to get started with this book.",
+ "ComputersAndTechnology": "Computers & Technology"
}
}
diff --git a/common.props b/common.props
index 35dd3cfe40..e6c9c40c28 100644
--- a/common.props
+++ b/common.props
@@ -1,7 +1,7 @@
latest
- 5.4.0
+ 6.0.0$(NoWarn);CS1591;CS0436https://abp.io/assets/abp_nupkg.pnghttps://abp.io/
@@ -13,7 +13,7 @@
$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb
-
+ allruntime; build; native; contentfiles; analyzers
diff --git a/configureawait.props b/configureawait.props
index b0cf9ef298..92f22f85fb 100644
--- a/configureawait.props
+++ b/configureawait.props
@@ -1,7 +1,7 @@
-
+ Allruntime; build; native; contentfiles; analyzers
diff --git a/docs/cs/CLI.md b/docs/cs/CLI.md
index db6918384e..7782b29a91 100644
--- a/docs/cs/CLI.md
+++ b/docs/cs/CLI.md
@@ -45,9 +45,9 @@ abp new Acme.BookStore
* `mvc`: ASP.NET Core MVC. Pro tuto šablonu jsou dostupné dodatečné možnosti:
* `--tiered`: Vytvoří stupňovité řešení, kde jsou vrstvy Web a Http API fyzicky odděleny. Pokud není uvedeno, tak vytvoří vrstvené řešení, které je méně složité a vhodné pro většinu scénářů.
* `angular`: Angular. Pro tuto šablonu jsou dostupné dodatečné možnosti:
- * `--separate-identity-server`: Oddělí identity server aplikaci od API host aplikace. Pokud není uvedeno, bude na straně serveru jediný koncový bod.
+ * `--separate-auth-server`: Oddělí identity server aplikaci od API host aplikace. Pokud není uvedeno, bude na straně serveru jediný koncový bod.
* `none`: Bez UI. Pro tuto šablonu jsou dostupné dodatečné možnosti:
- * `--separate-identity-server`: Oddělí identity server aplikaci od API host aplikace. Pokud není uvedeno, bude na straně serveru jediný koncový bod.
+ * `--separate-auth-server`: Oddělí identity server aplikaci od API host aplikace. Pokud není uvedeno, bude na straně serveru jediný koncový bod.
* `--database-provider` nebo `-d`: Určuje poskytovatele databáze. Výchozí poskytovatel je `ef`. Dostupní poskytovatelé:
* `ef`: Entity Framework Core.
* `mongodb`: MongoDB.
diff --git a/docs/en/API/Swagger-Integration.md b/docs/en/API/Swagger-Integration.md
index f60655ccfb..56ee1de50e 100644
--- a/docs/en/API/Swagger-Integration.md
+++ b/docs/en/API/Swagger-Integration.md
@@ -101,7 +101,7 @@ services.AddAbpSwaggerGen(
For non MVC/Tiered applications, we need to configure Swagger with OAUTH to handle authorization.
-> ABP Framework uses IdentityServer by default. To get more information about IDS, check this [documentation](../Modules/IdentityServer.md).
+> ABP Framework uses OpenIddict by default. To get more information about OpenIddict, check this [documentation](../Modules/OpenIddict.md).
diff --git a/docs/en/Background-Workers-Hangfire.md b/docs/en/Background-Workers-Hangfire.md
index 4cbaf8cc24..b076cf0395 100644
--- a/docs/en/Background-Workers-Hangfire.md
+++ b/docs/en/Background-Workers-Hangfire.md
@@ -95,29 +95,29 @@ public class MyLogWorker : HangfireBackgroundWorkerBase, IMyLogWorker
## Register BackgroundWorkerManager
-After creating a background worker class, you should add it to the `IBackgroundWorkerManager`. The most common place is the `OnApplicationInitialization` method of your module class:
+After creating a background worker class, you should add it to the `IBackgroundWorkerManager`. The most common place is the `OnApplicationInitializationAsync` method of your module class:
```` csharp
[DependsOn(typeof(AbpBackgroundWorkersModule))]
public class MyModule : AbpModule
{
- public override void OnApplicationInitialization(
+ public override async Task OnApplicationInitializationAsync(
ApplicationInitializationContext context)
{
- context.AddBackgroundWorker();
+ await context.AddBackgroundWorkerAsync();
//If the interface is defined
- //context.AddBackgroundWorker();
+ //await context.AddBackgroundWorkerAsync();
}
}
````
-`context.AddBackgroundWorker(...)` is a shortcut extension method for the expression below:
+`context.AddBackgroundWorkerAsync(...)` is a shortcut extension method for the expression below:
```` csharp
context.ServiceProvider
.GetRequiredService()
- .Add(
+ .AddAsync(
context
.ServiceProvider
.GetRequiredService()
@@ -126,4 +126,4 @@ context.ServiceProvider
So, it resolves the given background worker and adds to the `IBackgroundWorkerManager`.
-While we generally add workers in OnApplicationInitialization, there are no restrictions on that. You can inject IBackgroundWorkerManager anywhere and add workers at runtime. Background worker manager will stop and release all the registered workers when your application is being shut down.
+While we generally add workers in `OnApplicationInitializationAsync`, there are no restrictions on that. You can inject `IBackgroundWorkerManager` anywhere and add workers at runtime. Background worker manager will stop and release all the registered workers when your application is being shut down.
diff --git a/docs/en/Background-Workers.md b/docs/en/Background-Workers.md
index e1cce6ae28..286d6ab7b0 100644
--- a/docs/en/Background-Workers.md
+++ b/docs/en/Background-Workers.md
@@ -80,16 +80,16 @@ public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase
## Register Background Worker
-After creating a background worker class, you should add it to the `IBackgroundWorkerManager`. The most common place is the `OnApplicationInitialization` method of your module class:
+After creating a background worker class, you should add it to the `IBackgroundWorkerManager`. The most common place is the `OnApplicationInitializationAsync` method of your module class:
````csharp
[DependsOn(typeof(AbpBackgroundWorkersModule))]
public class MyModule : AbpModule
{
- public override Task OnApplicationInitializationAsync(
+ public override async Task OnApplicationInitializationAsync(
ApplicationInitializationContext context)
{
- context.AddBackgroundWorkerAsync();
+ await context.AddBackgroundWorkerAsync();
}
}
````
@@ -108,7 +108,7 @@ await context.ServiceProvider
So, it resolves the given background worker and adds to the `IBackgroundWorkerManager`.
-While we generally add workers in `OnApplicationInitialization`, there are no restrictions on that. You can inject `IBackgroundWorkerManager` anywhere and add workers at runtime. Background worker manager will stop and release all the registered workers when your application is being shut down.
+While we generally add workers in `OnApplicationInitializationAsync`, there are no restrictions on that. You can inject `IBackgroundWorkerManager` anywhere and add workers at runtime. Background worker manager will stop and release all the registered workers when your application is being shut down.
## Options
diff --git a/docs/en/CLI-New-Command-Samples.md b/docs/en/CLI-New-Command-Samples.md
index 430ac01064..1a7a8a551a 100644
--- a/docs/en/CLI-New-Command-Samples.md
+++ b/docs/en/CLI-New-Command-Samples.md
@@ -15,7 +15,7 @@ The following commands are for creating Angular UI projects:
* **Entity Framework Core**, default app template, **separate Identity Server**, creates the project in a new folder:
```bash
- abp new Acme.BookStore -t app -u angular -m none --separate-identity-server --database-provider ef -csf
+ abp new Acme.BookStore -t app -u angular -m none --separate-auth-server --database-provider ef -csf
```
* **Entity Framework Core**, **custom connection string**, creates the project in a new folder:
@@ -33,7 +33,7 @@ The following commands are for creating Angular UI projects:
* **MongoDB**, default app template, no mobile app, **separate Identity Server**, creates the project in a new folder:
```bash
- abp new Acme.BookStore -t app -u angular -m none --separate-identity-server --database-provider mongodb -csf
+ abp new Acme.BookStore -t app -u angular -m none --separate-auth-server --database-provider mongodb -csf
```
## MVC
@@ -78,7 +78,7 @@ The following commands are for creating Blazor projects:
* **Entity Framework Core**, **separate Identity Server**, mobile app included:
```bash
- abp new Acme.BookStore -u blazor --separate-identity-server
+ abp new Acme.BookStore -u blazor --separate-auth-server
```
* **MongoDB**, no mobile app, creates the project in a new folder:
@@ -116,7 +116,7 @@ In the default app template, there is always a frontend project. In this option
* **Entity Framework Core**, separate Identity Server, creates the project in a new folder:
```bash
- abp new Acme.BookStore -u none --separate-identity-server -csf
+ abp new Acme.BookStore -u none --separate-auth-server -csf
```
* **MongoDB**, no mobile app:
diff --git a/docs/en/CLI.md b/docs/en/CLI.md
index 01f7a92b2f..a4e0ba9818 100644
--- a/docs/en/CLI.md
+++ b/docs/en/CLI.md
@@ -41,6 +41,7 @@ Here, is the list of all available commands before explaining their details:
* **`switch-to-stable`**: Switches to the latest stable versions of the ABP related packages on a solution.
* **`translate`**: Simplifies to translate localization files when you have multiple JSON [localization](Localization.md) files in a source control repository.
* **`login`**: Authenticates on your computer with your [abp.io](https://abp.io/) username and password.
+* **`login-info`**: Shows the current user's login information.
* **`logout`**: Logouts from your computer if you've authenticated before.
* **`bundle`**: Generates script and style references for an ABP Blazor project.
* **`install-libs`**: Install NPM Packages for MVC / Razor Pages and Blazor Server UI types.
@@ -91,15 +92,15 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample
* `mvc`: ASP.NET Core MVC. There are some additional options for this template:
* `--tiered`: Creates a tiered solution where Web and Http API layers are physically separated. If not specified, it creates a layered solution which is less complex and suitable for most scenarios.
* `angular`: Angular UI. There are some additional options for this template:
- * `--separate-identity-server`: The Identity Server project comes as a separate project and runs at a different endpoint. It separates the Identity Server from the API Host application. If not specified, you will have a single endpoint in the server side.
+ * `--separate-auth-server`: The Identity Server project comes as a separate project and runs at a different endpoint. It separates the Identity Server from the API Host application. If not specified, you will have a single endpoint in the server side.
* `--pwa`: Specifies the project as Progressive Web Application.
* `blazor`: Blazor UI. There are some additional options for this template:
- * `--separate-identity-server`The Identity Server project comes as a separate project and runs at a different endpoint. It separates the Identity Server from the API Host application. If not specified, you will have a single endpoint in the server side.
+ * `--separate-auth-server`The Identity Server project comes as a separate project and runs at a different endpoint. It separates the Identity Server from the API Host application. If not specified, you will have a single endpoint in the server side.
* `--pwa`: Specifies the project as Progressive Web Application.
* `blazor-server`: Blazor Server UI. There are some additional options for this template:
- * `--tiered`: The Identity Server and the API Host project comes as separate projects and run at different endpoints. It has 3 startup projects: *HttpApi.Host*, *IdentityServer* and *Blazor* and and each runs on different endpoints. If not specified, you will have a single endpoint for your web project.
+ * `--tiered`: The Identity 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.
* `none`: Without UI. No front-end layer will be created. There are some additional options for this template:
- * `--separate-identity-server`: The Identity Server project comes as a separate project and runs at a different endpoint. It separates the Identity Server from the API Host application. If not specified, you will have a single endpoint in the server side.
+ * `--separate-auth-server`: The Identity Server project comes as a separate project and runs at a different endpoint. It separates the Identity Server from the API Host application. If not specified, you will have a single endpoint in the server side.
* `--mobile` or `-m`: Specifies the mobile application framework. If not specified, no mobile application will be created. Available options:
* `react-native`: React Native.
* `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers:
@@ -137,7 +138,7 @@ See some [examples for the new command](CLI-New-Command-Samples.md) here.
### update
-Updating all ABP related packages can be tedious since there are many packages of the framework and modules. This command automatically updates all ABP related NuGet and NPM packages in a solution or project to the latest versions.
+Updating all ABP related packages can be tedious since there are many packages of the framework and modules. This command automatically updates all ABP related NuGet and NPM packages in a solution or project to the latest versions. You can run it in the root folder of your solutions.
Usage:
@@ -145,8 +146,11 @@ Usage:
abp update [options]
````
-* If you run in a directory with a .sln file, it updates all ABP related packages of the all projects of the solution to the latest versions.
* If you run in a directory with a .csproj file, it updates all ABP related packages of the project to the latest versions.
+* If you run in a directory with a .sln file, it updates all ABP related packages of the all projects of the solution to the latest versions.
+* If you run in a directory that contains multiple solutions in sub-folders, it can update all the solutions, including Angular projects.
+
+Note that this command can upgrade your solution from a previous version, and also can upgrade it from a preview release to the stable release of the same version.
#### Options
@@ -467,23 +471,21 @@ abp login -p -o # You can enter both your
A new login with an already active session overwrites the previous session.
-### logout
+### login-info
-Logs you out by removing the session token from your computer.
+Shows your login information such as **Name**, **Surname**, **Username**, **Email Address** and **Organization**.
-```
-abp logout
+```bash
+abp login-info
```
-#### Options
-
-* ```--working-directory``` or ```-wd```: Specifies the working directory. This option is useful when the command is executed outside of a GIT repository or when executing directory doesn't contain a .NET solution file.
-* ```--build-name``` or ```-n```: Specifies a name for the build. This option is useful when same repository is used for more than one different builds.
-* ```--dotnet-build-arguments``` or ```-a```: Arguments to pass ```dotnet build``` when building project files. This parameter must be passed like ```"\"{params}\""``` .
-* ```--force``` or ```-f```: Forces to build projects even they are not changed from the last successful build.
+### logout
-For more details, see [build command documentation](CLI-BuildCommand.md).
+Logs you out by removing the session token from your computer.
+```bash
+abp logout
+```
### bundle
diff --git a/docs/en/Community-Articles/2022-05-16-Consuming-Rest-Api-By-Using-Static-Proxy/POST.md b/docs/en/Community-Articles/2022-05-16-Consuming-Rest-Api-By-Using-Static-Proxy/POST.md
new file mode 100644
index 0000000000..e2ad154bdd
--- /dev/null
+++ b/docs/en/Community-Articles/2022-05-16-Consuming-Rest-Api-By-Using-Static-Proxy/POST.md
@@ -0,0 +1,243 @@
+# Consuming HTTP APIs from a .NET Client Using ABP's Client Proxy System
+
+In this article, I will explain how to consume HTTP APIs from a .NET application using ABP's [dynamic](https://docs.abp.io/en/abp/latest/API/Dynamic-CSharp-API-Clients) and [static](https://docs.abp.io/en/abp/latest/API/Static-CSharp-API-Clients) client-side proxy systems. I will start by creating a new project and consume the HTTP APIs from a .NET console application using dynamic client proxies. Then I will switch to static client proxies. Finally, I will glance at the differences and similarities between static and dynamic generic proxies.
+
+Here the main benefits of using the client-side proxy system (either dynamic or static):
+
+* Automatically maps C# method calls to remote server HTTP calls by considering the HTTP method, route, query string parameters, request payload and other details.
+* Authenticates the HTTP Client by adding an access token to the HTTP header.
+* Serializes to and deserialize from JSON.
+* Handles HTTP API versioning.
+* Adds correlation id, current tenant id and the current culture to the request.
+* Properly handles the error messages sent by the server and throws proper exceptions.
+
+## Create a new ABP application with the ABP CLI
+Firstly create a new solution via [ABP CLI](https://docs.abp.io/en/abp/latest/CLI):
+
+```shell
+abp new Acme.BookStore
+```
+
+> See ABP's [Getting Started document](https://docs.abp.io/en/abp/latest/Getting-Started-Setup-Environment?UI=MVC&DB=EF&Tiered=No) to learn how to create and run your application, if you haven't done it before.
+
+## Create the application service interface
+I will start by creating an application service and exposing it as an HTTP API to be consumed by remote clients. First, define an interface for the application service; Create an `IBookAppService` interface in the `Books` folder (namespace) of the `Acme.BookStore.Application.Contracts` project:
+
+````csharp
+using System.Threading.Tasks;
+using Volo.Abp.Application.Dtos;
+using Volo.Abp.Application.Services;
+
+namespace Acme.BookStore.Books
+{
+ public interface IBookAppService : IApplicationService
+ {
+ Task> GetListAsync();
+ }
+}
+````
+
+Also add a `BookDto` class inside the same `Books` folder:
+
+```csharp
+using System;
+using Volo.Abp.Application.Dtos;
+
+namespace Acme.BookStore.Books
+{
+ public class BookDto
+ {
+ public string Name { get; set; }
+ public string AuthorName { get; set; }
+ public float Price { get; set; }
+ }
+}
+```
+
+## Implement the application service
+It is time to implement the `IBookAppService` interface. Create a new class named `BookAppService` in the `Books` namespace (folder) of the `Acme.BookStore.Application` project:
+
+```csharp
+using Acme.BookStore.Permissions;
+using Microsoft.AspNetCore.Authorization;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Dtos;
+using Volo.Abp.Application.Services;
+
+namespace Acme.BookStore.Books
+{
+ public class BookAppService : ApplicationService, IBookAppService
+ {
+ public Task> GetListAsync()
+ {
+ var bookDtos = new List()
+ {
+ new BookDto(){ Name = "Hunger", AuthorName ="Knut Hamsun", Price = 50},
+ new BookDto(){ Name = "Crime and Punishment", AuthorName ="Dostoevsky", Price = 60},
+ new BookDto(){ Name = "For Whom the Bell Tolls", AuthorName ="Ernest Hemingway", Price = 70}
+ };
+ return Task.FromResult(new PagedResultDto(
+ bookDtos.Count,
+ bookDtos
+ ));
+ }
+ }
+}
+```
+It simply returns a list of books. You probably want to get the books from a database, but it doesn't matter for this article. If you want it, you can fully implement [this tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC&DB=EF).
+
+## Consume the app service from the console application
+The startup solution comes with an example .NET console application (`Acme.BookStore.HttpApi.Client.ConsoleTestApp`) that is fully configured to consume your HTTP APIs remotely. Change `ClientDemoService` as shown in the following `Acme.BookStore.HttpApi.Client.ConsoleTestApp` project (it is under the `test` folder).
+
+```csharp
+using Acme.BookStore.Books;
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Dtos;
+using Volo.Abp.DependencyInjection;
+
+namespace Acme.BookStore.HttpApi.Client.ConsoleTestApp;
+
+public class ClientDemoService : ITransientDependency
+{
+ private readonly IBookAppService _bookAppService;
+
+ public ClientDemoService(IBookAppService bookAppService )
+ {
+ _bookAppService = bookAppService;
+ }
+
+ public async Task RunAsync()
+ {
+ var listOfBooks = await _bookAppService.GetListAsync(new PagedAndSortedResultRequestDto());
+ Console.WriteLine($"Books: {string.Join(", ", listOfBooks.Items.Select(p => p.Name).ToList())}");
+ }
+}
+```
+
+We are basically injecting the `IBookAppService` interface to consume the remote service. ABP handles all the details (performing HTTP request, deserializing the resulting JSON object, etc) for us.
+
+You can run the application to see the output:
+
+```
+Books: Hunger, Crime and Punishment, For Whom the Bell Tolls
+```
+
+## Convert the application to use static client proxies
+The [application startup template](https://docs.abp.io/en/abp/latest/Startup-Templates/Application) comes pre-configured for the **dynamic** client proxy generation, in the `HttpApi.Client` project. If you want to switch to the **static** client proxies, you should change `context.Services.AddHttpClientProxies` to `context.Services.AddStaticHttpClientProxies` in the module class of your `HttpApi.Client` project:
+
+```csharp
+public class BookStoreHttpApiClientModule : AbpModule
+{
+ public const string RemoteServiceName = "Default";
+
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ // Other configurations...
+
+ context.Services.AddStaticHttpClientProxies(
+ typeof(BookStoreApplicationContractsModule).Assembly,
+ RemoteServiceName
+ );
+ }
+}
+```
+
+The `AddStaticHttpClientProxies` method gets an assembly, finds all service interfaces in the given assembly, and prepares for static client proxy generation.
+
+
+Now you're ready to generate the client proxy code by running the following command in the root folder of your client project **while your server-side project is running**:
+
+````bash
+abp generate-proxy -t csharp -u http://localhost:44397/
+````
+
+> The URL (`-u` parameter's value) might be different for your application. It should be the server's root URL.
+
+You should see the generated files under the selected folder:
+
+
+
+Now you can run the console client application again. You should see the same output:
+
+````
+Books: Hunger, Crime and Punishment, For Whom the Bell Tolls
+````
+
+## Add authorization
+The ABP Framework provides an [authorization system](https://docs.abp.io/en/abp/latest/Authorization) based on [ASP.NET Core's authorization infrastructure](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/introduction). We can define permissions and restrict access to some of our application's functionalities, so only the allowed users/clients can use these functionalities. Here, I will define a permission to be able to get the list of books.
+
+### Defining a permission
+
+Under `Acme.BookStore.Application.Contracts` open `BookStorePermissions` and paste the below code:
+```csharp
+namespace Acme.BookStore.Permissions;
+
+public static class BookStorePermissions
+{
+ public const string GroupName = "BookStore";
+
+ public static class Books
+ {
+ public const string Default = GroupName + ".Books";
+ }
+
+}
+```
+You also need to change `BookStorePermissionDefinitionProvider` under the same folder and project as follows:
+```csharp
+using Acme.BookStore.Localization;
+using Volo.Abp.Authorization.Permissions;
+using Volo.Abp.Localization;
+
+public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider
+{
+ public override void Define(IPermissionDefinitionContext context)
+ {
+ var bookStoreGroup = context.AddGroup(BookStorePermissions.GroupName);
+ bookStoreGroup.AddPermission(BookStorePermissions.Books.Default);
+ }
+}
+```
+### Authorizing the application service
+
+We can now add the `[Authorize(BookStorePermissions.Books.Default)]` attribute to the `BookAppService` class:
+
+```csharp
+[Authorize(BookStorePermissions.Books.Default)]
+public class BookAppService : ApplicationService, IBookAppService
+{
+ ...
+}
+```
+
+If you run the server now, then run the console client application, you will see the following error on the console application:
+
+```
+Unhandled exception. Volo.Abp.Http.Client.AbpRemoteCallException: Forbidden at
+Volo.Abp.Http.Client.ClientProxying.ClientProxyBase`1
+.ThrowExceptionForResponseAsync(HttpResponseMessage response)...
+```
+
+To fix the problem, we should grant permission to the admin user. We are granting permission to the admin user because the console application is configured to use the Resource Owner Password Grant Flow. That means the client application is consuming services on behalf of the admin user. You can see the configuration in the `appsettings.json` file of the console application.
+
+### Granting the permission
+
+Once you define the permissions, you can see them on the permission management modal.
+
+Go to the Administration -> Identity -> Roles page, select the Permissions action for the admin role to open the permission management modal:
+
+Grant the permissions you want and save the modal.
+
+## Dynamic vs static proxies
+
+Static generic proxies provide **better performance** because they don't need to run on runtime, but you should **re-generate** them once you change the API endpoint definition. Dynamic generic proxies don't need to be re-generated because they work on the runtime but they have a slight performance penalty.
+
+## Further Reading
+In this tutorial, I explained how you can create an example project and apply a static client proxy instead of a dynamic client proxy. I also summarized the differences between both approaches. If you want to get more information, you can read the following documents:
+
+* [Static C# API Client Proxies](https://docs.abp.io/en/abp/latest/API/Static-CSharp-API-Clients)
+* [Dynamic C# API Client Proxies](https://docs.abp.io/en/abp/latest/API/Dynamic-CSharp-API-Clients)
+* [Web Application Development Tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC&DB=EF)
diff --git a/docs/en/Community-Articles/2022-05-16-Consuming-Rest-Api-By-Using-Static-Proxy/permission.png b/docs/en/Community-Articles/2022-05-16-Consuming-Rest-Api-By-Using-Static-Proxy/permission.png
new file mode 100644
index 0000000000..60e6667993
Binary files /dev/null and b/docs/en/Community-Articles/2022-05-16-Consuming-Rest-Api-By-Using-Static-Proxy/permission.png differ
diff --git a/docs/en/Community-Articles/2022-05-16-Consuming-Rest-Api-By-Using-Static-Proxy/static-proxy.png b/docs/en/Community-Articles/2022-05-16-Consuming-Rest-Api-By-Using-Static-Proxy/static-proxy.png
new file mode 100644
index 0000000000..083c6cedfe
Binary files /dev/null and b/docs/en/Community-Articles/2022-05-16-Consuming-Rest-Api-By-Using-Static-Proxy/static-proxy.png differ
diff --git a/docs/en/Contribution/Index.md b/docs/en/Contribution/Index.md
index 6160aa3273..8ebac70c20 100644
--- a/docs/en/Contribution/Index.md
+++ b/docs/en/Contribution/Index.md
@@ -74,3 +74,7 @@ If you find any bug, please [create an issue on the Github repository](https://g
## Setup Frontend Development Environment
[How to contribute to abp.io as a frontend developer](How-to-Contribute-abp.io-as-a-frontend-developer.md)
+
+## See Also
+
+* [ABP Community Talks 2022.4: How can you contribute to the open source ABP Framework?](https://www.youtube.com/watch?v=Wz4Z-O-YoPg&list=PLsNclT2aHJcOsPustEkzG6DywiO8eh0lB)
\ No newline at end of file
diff --git a/docs/en/CurrentUser.md b/docs/en/CurrentUser.md
index 5a400dc098..ac2aaa20bf 100644
--- a/docs/en/CurrentUser.md
+++ b/docs/en/CurrentUser.md
@@ -90,7 +90,7 @@ Beside these standard methods, there are some extension methods:
For a web application, it gets the `User` property of the current `HttpContext`. For a non-web application, it returns the `Thread.CurrentPrincipal`.
-> You generally don't need to this low level `ICurrentPrincipalAccessor` service and directly work with the `ICurrentUser` explained above.
+> You generally don't need to use this low level `ICurrentPrincipalAccessor` service and just directly work with the `ICurrentUser` explained above.
### Basic Usage
diff --git a/docs/en/Distributed-Event-Bus.md b/docs/en/Distributed-Event-Bus.md
index 17dd69072a..5fe85a468d 100644
--- a/docs/en/Distributed-Event-Bus.md
+++ b/docs/en/Distributed-Event-Bus.md
@@ -298,9 +298,9 @@ This example;
## Transaction and Exception Handling
-Distributed event bus works in-process (since default implementation is `LocalDistributedEventBus`) unless you configure an actual provider (e.g. [Kafka](Distributed-Event-Bus-Kafka-Integration.md) or [Redis](Distributed-Event-Bus-RabbitMQ-Integration.md)). In-process event bus always executes event handlers in the same [unit of work](Unit-Of-Work.md) scope that you publishes the events in. That means, if an event handler throws an exception, then the related unit of work (the database transaction) is rolled back. In this way, your application logic and event handling logic becomes transactional (atomic) and consistent. If you want to ignore errors in an event handler, you must use a `try-catch` block in your handler and shouldn't re-throw the exception.
+Distributed event bus works in-process (since default implementation is `LocalDistributedEventBus`) unless you configure an actual provider (e.g. [Kafka](Distributed-Event-Bus-Kafka-Integration.md) or [RabbitMQ](Distributed-Event-Bus-RabbitMQ-Integration.md)). In-process event bus always executes event handlers in the same [unit of work](Unit-Of-Work.md) scope that you publishes the events in. That means, if an event handler throws an exception, then the related unit of work (the database transaction) is rolled back. In this way, your application logic and event handling logic becomes transactional (atomic) and consistent. If you want to ignore errors in an event handler, you must use a `try-catch` block in your handler and shouldn't re-throw the exception.
-When you switch to an actual distributed event bus provider (e.g. [Kafka](Distributed-Event-Bus-Kafka-Integration.md) or [Redis](Distributed-Event-Bus-RabbitMQ-Integration.md)), then the event handlers will be executed in different processes/applications as their purpose is to create distributed systems. In this case, the only way to implement transactional event publishing is to use the outbox/inbox patterns as explained in the *Outbox / Inbox for Transactional Events* section.
+When you switch to an actual distributed event bus provider (e.g. [Kafka](Distributed-Event-Bus-Kafka-Integration.md) or [RabbitMQ](Distributed-Event-Bus-RabbitMQ-Integration.md)), then the event handlers will be executed in different processes/applications as their purpose is to create distributed systems. In this case, the only way to implement transactional event publishing is to use the outbox/inbox patterns as explained in the *Outbox / Inbox for Transactional Events* section.
If you don't configure outbox/inbox pattern or use the `LocalDistributedEventBus`, then events are published at the end of the unit of work by default, just before the unit of work is completed (that means throwing exception in an event handler still rollbacks the unit of work), even if you publish them in the middle of unit of work. If you want to immediately publish the event, you can set `onUnitOfWorkComplete` to `false` while using `IDistributedEventBus.PublishAsync` method.
@@ -501,4 +501,4 @@ Configure(options =>
## See Also
-* [Local Event Bus](Local-Event-Bus.md)
\ No newline at end of file
+* [Local Event Bus](Local-Event-Bus.md)
diff --git a/docs/en/Getting-Started-Create-Solution.md b/docs/en/Getting-Started-Create-Solution.md
index d111637365..8b508ff348 100644
--- a/docs/en/Getting-Started-Create-Solution.md
+++ b/docs/en/Getting-Started-Create-Solution.md
@@ -20,7 +20,7 @@ We will use the ABP CLI to create a new ABP project.
Use the `new` command of the ABP CLI to create a new project:
````shell
-abp new Acme.BookStore{{if UI == "NG"}} -u angular{{else if UI == "Blazor"}} -u blazor{{else if UI == "BlazorServer"}} -u blazor-server{{end}}{{if DB == "Mongo"}} -d mongodb{{end}}{{if Tiered == "Yes"}}{{if UI == "MVC" || UI == "BlazorServer"}} --tiered{{else}} --separate-identity-server{{end}}{{end}}
+abp new Acme.BookStore{{if UI == "NG"}} -u angular{{else if UI == "Blazor"}} -u blazor{{else if UI == "BlazorServer"}} -u blazor-server{{end}}{{if DB == "Mongo"}} -d mongodb{{end}}{{if Tiered == "Yes"}}{{if UI == "MVC" || UI == "BlazorServer"}} --tiered{{else}} --separate-auth-server{{end}}{{end}}
````
*You can use different level of namespaces; e.g. BookStore, Acme.BookStore or Acme.Retail.BookStore.*
@@ -33,7 +33,7 @@ abp new Acme.BookStore{{if UI == "NG"}} -u angular{{else if UI == "Blazor"}} -u
{{ else }}
-* `--separate-identity-server` argument is used to separate the identity server application from the API host application. If not specified, you will have a single endpoint on the server.
+* `--separate-auth-server` argument is used to separate the identity server application from the API host application. If not specified, you will have a single endpoint on the server.
{{ end }}
diff --git a/docs/en/Getting-Started-React-Native.md b/docs/en/Getting-Started-React-Native.md
index 9199d370dc..ac6325b5fd 100644
--- a/docs/en/Getting-Started-React-Native.md
+++ b/docs/en/Getting-Started-React-Native.md
@@ -65,8 +65,8 @@ A React Native application running on an Android emulator or a physical phone **

-* Open the `appsettings.json` in the `.IdentityServer` folder. Replace the `localhost` address on the `SelfUrl` property with your local IP address.
-* Open the `launchSettings.json` in the `.IdentityServer/Properties` folder. Replace the `localhost` address on the `applicationUrl` properties with your local IP address.
+* Open the `appsettings.json` in the `.AuthServer` folder. Replace the `localhost` address on the `SelfUrl` property with your local IP address.
+* Open the `launchSettings.json` in the `.AuthServer/Properties` folder. Replace the `localhost` address on the `applicationUrl` properties with your local IP address.
* Open the `appsettings.json` in the `.HttpApi.Host` folder. Replace the `localhost` address on the `Authority` property with your local IP address.
* Open the `launchSettings.json` in the `.HttpApi.Host/Properties` folder. Replace the `localhost` address on the `applicationUrl` properties with your local IP address.
@@ -85,7 +85,7 @@ Run the backend application as described in the [getting started document](Getti
{{ if Tiered == "Yes" }}
-> Make sure that `issuer` matches the running address of the `.IdentityServer` project, `apiUrl` matches the running address of the `.HttpApi.Host` or `.Web` project.
+> Make sure that `issuer` matches the running address of the `.AuthServer` project, `apiUrl` matches the running address of the `.HttpApi.Host` or `.Web` project.
{{else}}
diff --git a/docs/en/Getting-Started-Running-Solution.md b/docs/en/Getting-Started-Running-Solution.md
index fe1d0de246..66230c7aef 100644
--- a/docs/en/Getting-Started-Running-Solution.md
+++ b/docs/en/Getting-Started-Running-Solution.md
@@ -15,7 +15,7 @@
### Connection String
-Check the **connection string** in the `appsettings.json` file under the {{if Tiered == "Yes"}}`.IdentityServer` and `.HttpApi.Host` projects{{else}}{{if UI=="MVC"}}`.Web` project{{else if UI=="BlazorServer"}}`.Blazor` project{{else}}`.HttpApi.Host` project{{end}}{{end}}.
+Check the **connection string** in the `appsettings.json` file under the {{if Tiered == "Yes"}}`.AuthServer` and `.HttpApi.Host` projects{{else}}{{if UI=="MVC"}}`.Web` project{{else if UI=="BlazorServer"}}`.Blazor` project{{else}}`.HttpApi.Host` project{{end}}{{end}}.
{{ if DB == "EF" }}
@@ -99,7 +99,7 @@ Right click to the `.DbMigrator` project and select **Set as StartUp Project**
> Tiered solutions use **Redis** as the distributed cache. Ensure that it is installed and running in your local computer. If you are using a remote Redis Server, set the configuration in the `appsettings.json` files of the projects below.
-1. Ensure that the `.IdentityServer` project is the startup project. Run this application that will open a **login** page in your browser.
+1. Ensure that the `.AuthServer` project is the startup project. Run this application that will open a **login** page in your browser.
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
@@ -137,7 +137,7 @@ Ensure that the {{if UI=="MVC"}}`.Web`{{else}}`.Blazor`{{end}} project is the st
> Tiered solutions use Redis as the distributed cache. Ensure that it is installed and running in your local computer. If you are using a remote Redis Server, set the configuration in the `appsettings.json` files of the projects below.
-Ensure that the `.IdentityServer` project is the startup project. Run the application which will open a **login** page in your browser.
+Ensure that the `.AuthServer` project is the startup project. Run the application which will open a **login** page in your browser.
> Use Ctrl+F5 in Visual Studio (instead of F5) to run the application without debugging. If you don't have a debug purpose, this will be faster.
diff --git a/docs/en/Index.md b/docs/en/Index.md
index 3f5c3dbf44..0a33c0e5a4 100644
--- a/docs/en/Index.md
+++ b/docs/en/Index.md
@@ -47,7 +47,7 @@ Application Modules provides pre-built application functionalities;
* [**Account**](Modules/Account.md): Provides UI for the account management and allows user to login/register to the application.
* **[Identity](Modules/Identity.md)**: Manages organization units, roles, users and their permissions, based on the Microsoft Identity library.
-* [**IdentityServer**](Modules/IdentityServer.md): Integrates to IdentityServer4.
+* [**OpenIddict**](Modules/OpenIddict.md): Integrates to OpenIddict.
* [**Tenant Management**](Modules/Tenant-Management.md): Manages tenants for a [multi-tenant](Multi-Tenancy.md) (SaaS) application.
See the [Application Modules](Modules/Index.md) document for all pre-built modules.
diff --git a/docs/en/Microservice-Architecture.md b/docs/en/Microservice-Architecture.md
index 7790e26f3c..b98323908d 100644
--- a/docs/en/Microservice-Architecture.md
+++ b/docs/en/Microservice-Architecture.md
@@ -23,8 +23,8 @@ One common advise to start a new solution is **always to start with a monolith**
However, developing such a well-modular application can be a problem since it is **hard to keep modules isolated** from each other as you would do it for microservices (see [Stefan Tilkov's article](https://martinfowler.com/articles/dont-start-monolith.html) about that). Microservice architecture naturally forces you to develop well isolated services, but in a modular monolithic application it's easy to tight couple modules to each other and design **weak module boundaries** and API contracts.
-ABP can help you in that point by offerring a **microservice-compatible, strict module architecture** where your module is splitted into multiple layers/projects and developed in its own VS solution completely isolated and independent from other modules. Such a developed module is a natural microservice yet it can be easily plugged-in a monolithic application. See the [module development best practice guide](Best-Practices/Index.md) that offers a **microservice-first module design**. All [standard ABP modules](https://github.com/abpframework/abp/tree/master/modules) are developed based on this guide. So, you can use these modules by embedding into your monolithic solution or deploy them separately and use via remote APIs. They can share a single database or can have their own database based on your simple configuration.
+ABP can help you in that point by offering a **microservice-compatible, strict module architecture** where your module is split into multiple layers/projects and developed in its own VS solution completely isolated and independent from other modules. Such a developed module is a natural microservice yet it can be easily plugged-in a monolithic application. See the [module development best practice guide](Best-Practices/Index.md) that offers a **microservice-first module design**. All [standard ABP modules](https://github.com/abpframework/abp/tree/master/modules) are developed based on this guide. So, you can use these modules by embedding into your monolithic solution or deploy them separately and use via remote APIs. They can share a single database or can have their own database based on your simple configuration.
-## Microservice Demo Solution
+## Microservice Demo Solution: eShopOnAbp
-The [sample microservice solution](Samples/Microservice-Demo.md) demonstrates a complete microservice solution based on the ABP framework.
+The [eShopOnAbp project](https://github.com/abpframework/eShopOnAbp) demonstrates a complete microservice solution based on the ABP framework.
diff --git a/docs/en/Modules/Account.md b/docs/en/Modules/Account.md
index 72f6f55c0e..7beb5b128d 100644
--- a/docs/en/Modules/Account.md
+++ b/docs/en/Modules/Account.md
@@ -2,7 +2,7 @@
Account module implements the basic authentication features like **login**, **register**, **forgot password** and **account management**.
-This module is based on [Microsoft's Identity library](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity) and the [Identity Module](Identity.md). It has [IdentityServer](https://github.com/IdentityServer) integration (based on the [IdentityServer Module](IdentityServer.md)) to provide **single sign-on**, access control and other advanced authentication features.
+This module is based on [Microsoft's Identity library](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity) and the [Identity Module](Identity.md). It has [IdentityServer](https://github.com/IdentityServer) integration (based on the [IdentityServer Module](IdentityServer.md)) and [OpenIddict](https://github.com/openiddict) integration (based on the [OpenIddict Module](OpenIddict.md)) to provide **single sign-on**, access control and other advanced authentication features.
## How to Install
@@ -42,6 +42,10 @@ Social/external login buttons becomes visible if you setup it. See the *Social/E

+## OpenIddict Integration
+
+[Volo.Abp.Account.Web.OpenIddict](https://www.nuget.org/packages/Volo.Abp.Account.Web.OpenIddict) package provides integration for the [OpenIddict](https://github.com/openiddict). This package comes as installed with the [application startup template](../Startup-Templates/Application.md). See the [OpenIddict Module](OpenIddict.md) documentation.
+
## IdentityServer Integration
[Volo.Abp.Account.Web.IdentityServer](https://www.nuget.org/packages/Volo.Abp.Account.Web.IdentityServer) package provides integration for the [IdentityServer](https://github.com/IdentityServer). This package comes as installed with the [application startup template](../Startup-Templates/Application.md). See the [IdentityServer Module](IdentityServer.md) documentation.
diff --git a/docs/en/Modules/Index.md b/docs/en/Modules/Index.md
index 35d46dece0..d5037665f0 100644
--- a/docs/en/Modules/Index.md
+++ b/docs/en/Modules/Index.md
@@ -19,6 +19,7 @@ There are some **free and open source** application modules developed and mainta
* [**Feature Management**](Feature-Management.md): Used to persist and manage the [features](../Features.md).
* **[Identity](Identity.md)**: Manages organization units, roles, users and their permissions, based on the Microsoft Identity library.
* [**IdentityServer**](IdentityServer.md): Integrates to IdentityServer4.
+* [**OpenIddict**](OpenIddict.md): Integrates to OpenIddict.
* [**Permission Management**](Permission-Management.md): Used to persist permissions.
* **[Setting Management](Setting-Management.md)**: Used to persist and manage the [settings](../Settings.md).
* [**Tenant Management**](Tenant-Management.md): Manages tenants for a [multi-tenant](../Multi-Tenancy.md) application.
diff --git a/docs/en/Modules/OpenIddict.md b/docs/en/Modules/OpenIddict.md
index 951a745aab..7d7e898eee 100644
--- a/docs/en/Modules/OpenIddict.md
+++ b/docs/en/Modules/OpenIddict.md
@@ -10,7 +10,7 @@ This module implements the domain logic and database integrations, but not provi
## Relations to Other Modules
-This module is based on the [Identity Module](Identity.md) and have an [integration package](https://www.nuget.org/packages/Volo.Abp.Account.Web.IdentityServer) with the [Account Module](Account.md).
+This module is based on the [Identity Module](Identity.md) and have an [integration package](https://www.nuget.org/packages/Volo.Abp.Account.Web.OpenIddict) with the [Account Module](Account.md).
## The module
@@ -131,11 +131,6 @@ Configure(options =>
For detailed information, please refer to: [OpenIddict claim destinations](https://documentation.openiddict.com/configuration/claim-destinations.html)
-#### About Validation
-
-The `OpenIddict.Validation.AspNetCore` and `OpenIddict.Validation` are not integrated in the module, we use the authentication component provided by Microsoft. If you are more familiar with it, you can use it in your project.
-
-
### EF Core module
Implements the above four repository interfaces.
diff --git a/docs/en/Road-Map.md b/docs/en/Road-Map.md
index 55a99be8b7..d7fb13a9a8 100644
--- a/docs/en/Road-Map.md
+++ b/docs/en/Road-Map.md
@@ -4,18 +4,18 @@ This document provides a road map, release schedule and planned features for the
## Next Versions
-### v5.4
+### v6.0
-In [5.4 milestone](https://github.com/abpframework/abp/milestone/67), we will be mostly working on the following topics:
+In [6.0 milestone](https://github.com/abpframework/abp/milestone/61), we will be mostly working on the following topics:
* Providing an OpenIddict integration to replace current IdentityServer4 integration.
* Maturing and documenting the [eShopOnAbp](https://github.com/abpframework/eShopOnAbp) project, writing a free e-book that explains the solution.
* Working on the [LeptonX](https://blog.abp.io/abp/LeptonX-Theme-for-ABP-Framework-Alpha-Release) theme and making it as the default theme for the ABP Framework UI options.
* Improvements on the existing features and providing more guides.
-The planned release date for v5.4 is **July, 2022**.
+The planned stable release date for v6.0 is **July, 2022**.
-> After the version 5.4, we will be working for 6.0 which will be released in the end of 2022 based on .NET 7.0.
+> After the version 6.0, we will be working for ABP 7.0 which will be released in the end of 2022 based on .NET 7.0.
## Backlog Items
diff --git a/docs/en/Samples/Index.md b/docs/en/Samples/Index.md
index 58543ba380..704cdf3808 100644
--- a/docs/en/Samples/Index.md
+++ b/docs/en/Samples/Index.md
@@ -2,15 +2,19 @@
Here, a list of official samples built with the ABP Framework. Most of these samples are located under the [abpframework/abp-samples](https://github.com/abpframework/abp-samples) GitHub repository.
-### Microservice Demo
+## eShopOnAbp
-A complete solution to demonstrate how to build systems based on the microservice architecture.
+Reference microservice solution built with the ABP Framework and .NET.
-* [The complete documentation for this sample](Microservice-Demo.md)
-* [Source code](https://github.com/abpframework/abp-samples/tree/master/MicroserviceDemo)
-* [Microservice architecture document](../Microservice-Architecture.md)
+* [Source code](https://github.com/abpframework/eShopOnAbp)
-### Book Store
+## EventHub
+
+This is a reference application built with the ABP Framework. It implements the Domain Driven Design with multiple application layers.
+
+* [Source code](https://github.com/abpframework/eventhub)
+
+## Book Store
A simple CRUD application to show basic principles of developing an application with the ABP Framework. The same sample was implemented with different technologies:
@@ -28,7 +32,7 @@ A simple CRUD application to show basic principles of developing an application
While there is no Razor Pages & MongoDB combination, you can check both documents to understand it since DB & UI selection don't effect each other.
-### Other Samples
+## Other Samples
* **Event Organizer**: A sample application to create events (meetups) and allow others to register the events. Developed using EF Core and Blazor UI.
* [Source code](https://github.com/abpframework/abp-samples/tree/master/EventOrganizer)
diff --git a/docs/en/Samples/Microservice-Demo.md b/docs/en/Samples/Microservice-Demo.md
index 285c2b10a0..1e2549338f 100644
--- a/docs/en/Samples/Microservice-Demo.md
+++ b/docs/en/Samples/Microservice-Demo.md
@@ -1,5 +1,7 @@
# Microservice Demo Solution
+> This solution is no longer maintained. See [the eShopOnAbp project](https://github.com/abpframework/eShopOnAbp) for the replacement solution.
+
*"Microservices are a software development technique—a variant of the **service-oriented architecture** (SOA) architectural style that structures an application as a collection of **loosely coupled services**. In a microservices architecture, services are **fine-grained** and the protocols are **lightweight**. The benefit of decomposing an application into different smaller services is that it improves **modularity**. This makes the application easier to understand, develop, test, and become more resilient to architecture erosion. It **parallelizes development** by enabling small autonomous teams to **develop, deploy and scale** their respective services independently. It also allows the architecture of an individual service to emerge through **continuous refactoring**. Microservices-based architectures enable **continuous delivery and deployment**."*
— [Wikipedia](https://en.wikipedia.org/wiki/Microservices)
diff --git a/docs/en/Startup-Templates/Application.md b/docs/en/Startup-Templates/Application.md
index 0f4372b621..028801c634 100644
--- a/docs/en/Startup-Templates/Application.md
+++ b/docs/en/Startup-Templates/Application.md
@@ -13,7 +13,7 @@ This document explains **the solution structure** and projects in details. If yo
You can use the [ABP CLI](../CLI.md) to create a new project using this startup template. Alternatively, you can directly create & download from the [Get Started](https://abp.io/get-started) page. CLI approach is used here.
-First, install the ABP CLI if you haven't installed before:
+First, install the ABP CLI if you haven't installed it before:
````bash
dotnet tool install -g Volo.Abp.Cli
@@ -25,8 +25,8 @@ Then use the `abp new` command in an empty folder to create a new solution:
abp new Acme.BookStore -t app
````
-* `Acme.BookStore` is the solution name, like *YourCompany.YourProduct*. You can use single level, two-levels or three-levels naming.
-* This example specified the template name (`-t` or `--template` option). However, `app` is already the default template if you don't specify it.
+* `Acme.BookStore` is the solution name, like *YourCompany.YourProduct*. You can use single-level, two-level or three-level naming.
+* This example specified the template name (`-t` or `--template` option). However, `app` is already the default template if you didn't specify it.
### Specify the UI Framework
@@ -36,7 +36,7 @@ This template provides multiple UI frameworks:
* `blazor`: Blazor UI
* `angular`: Angular UI
-Use `-u` or `--ui` option to specify the UI framework:
+Use the `-u` or `--ui` option to specify the UI framework:
````bash
abp new Acme.BookStore -u angular
@@ -61,7 +61,7 @@ This template supports the following mobile application frameworks:
- `react-native`: React Native
-Use `-m` (or `--mobile`) option to specify the mobile application framework:
+Use the `-m` (or `--mobile`) option to specify the mobile application framework:
````bash
abp new Acme.BookStore -m react-native
@@ -75,7 +75,7 @@ Based on the options you've specified, you will get a slightly different solutio
### Default Structure
-If you don't specify any additional option, you will have a solution like shown below:
+If you don't specify any additional options, you will have a solution as shown below:

@@ -93,7 +93,7 @@ This project contains constants, enums and other objects these are actually a pa
A `BookType` enum and a `BookConsts` class (which may have some constant fields for the `Book` entity, like `MaxNameLength`) are good candidates for this project.
-* This project has no dependency to other projects in the solution. All other projects depend on this directly or indirectly.
+* This project has no dependency on other projects in the solution. All other projects depend on this one directly or indirectly.
#### .Domain Project
@@ -105,7 +105,7 @@ A `Book` entity, a `BookManager` domain service and an `IBookRepository` interfa
#### .Application.Contracts Project
-This project mainly contains [application service](../Application-Services.md) **interfaces** and [Data Transfer Objects](../Data-Transfer-Objects.md) (DTO) of the application layer. It does exists to separate interface & implementation of the application layer. In this way, the interface project can be shared to the clients as a contract package.
+This project mainly contains [application service](../Application-Services.md) **interfaces** and [Data Transfer Objects](../Data-Transfer-Objects.md) (DTO) of the application layer. It exists to separate the interface & implementation of the application layer. In this way, the interface project can be shared to the clients as a contract package.
An `IBookAppService` interface and a `BookCreationDto` class are good candidates for this project.
@@ -130,7 +130,7 @@ This is the integration project for the EF Core. It defines the `DbContext` and
#### .DbMigrator Project
-This is a console application which simplifies to execute database migrations on development and production environments. When you run this application, it;
+This is a console application that simplifies the execution of database migrations on development and production environments. When you run this application, it:
* Creates the database if necessary.
* Applies the pending database migrations.
@@ -140,24 +140,24 @@ This is a console application which simplifies to execute database migrations on
Especially, seeding initial data is important at this point. ABP has a modular data seed infrastructure. See [its documentation](../Data-Seeding.md) for more about the data seeding.
-While creating database & applying migrations seems only necessary for relational databases, this projects comes even if you choose a NoSQL database provider (like MongoDB). In that case, it still seeds initial data which is necessary for the application.
+While creating database & applying migrations seem only necessary for relational databases, this project comes even if you choose a NoSQL database provider (like MongoDB). In that case, it still seeds the initial data which is necessary for the application.
* Depends on the `.EntityFrameworkCore` project (for EF Core) since it needs to access to the migrations.
-* Depends on the `.Application.Contracts` project to be able to access permission definitions, because initial data seeder grants all permissions for the admin role by default.
+* Depends on the `.Application.Contracts` project to be able to access permission definitions, because the initial data seeder grants all permissions to the admin role by default.
#### .HttpApi Project
This project is used to define your API Controllers.
-Most of time you don't need to manually define API Controllers since ABP's [Auto API Controllers](../API/Auto-API-Controllers.md) feature creates them automagically based on your application layer. However, in case of you need to write API controllers, this is the best place to do it.
+Most of the time you don't need to manually define API Controllers since ABP's [Auto API Controllers](../API/Auto-API-Controllers.md) feature creates them automagically based on your application layer. However, in case of you need to write API controllers, this is the best place to do it.
* Depends on the `.Application.Contracts` project to be able to inject the application service interfaces.
#### .HttpApi.Client Project
-This is a project that defines C# client proxies to use the HTTP APIs of the solution. You can share this library to 3rd-party clients, so they can easily consume your HTTP APIs in their Dotnet applications (For other type of applications, they can still use your APIs, either manually or using a tool in their own platform)
+This is a project that defines C# client proxies to use the HTTP APIs of the solution. You can share this library to 3rd-party clients, so they can easily consume your HTTP APIs in their Dotnet applications (For other types of applications, they can still use your APIs, either manually or using a tool in their own platform)
-Most of time you don't need to manually create C# client proxies, thanks to ABP's [Dynamic C# API Clients](../API/Dynamic-CSharp-API-Clients.md) feature.
+Most of the time you don't need to manually create C# client proxies, thanks to ABP's [Dynamic C# API Clients](../API/Dynamic-CSharp-API-Clients.md) feature.
`.HttpApi.Client.ConsoleTestApp` project is a console application created to demonstrate the usage of the client proxies.
@@ -169,17 +169,17 @@ Most of time you don't need to manually create C# client proxies, thanks to ABP'
This project contains the User Interface (UI) of the application if you are using ASP.NET Core MVC UI. It contains Razor pages, JavaScript files, CSS files, images and so on...
-This project contains the main `appsettings.json` file that contains the connection string and other configuration of the application.
+This project contains the main `appsettings.json` file that contains the connection string and other configurations of the application.
-* Depends on the `.HttpApi` since UI layer needs to use APIs and application service interfaces of the solution.
+* Depends on the `.HttpApi` project since the UI layer needs to use APIs and the application service interfaces of the solution.
> If you check the source code of the `.Web.csproj` file, you will see the references to the `.Application` and the `.EntityFrameworkCore` projects.
>
-> These references are actually not needed while coding your UI layer, because UI layer normally doesn't depend on the EF Core or the Application layer's implementation. This startup templates are ready for the tiered deployment, where API layer is hosted in a separate server than the UI layer.
+> These references are actually not needed while coding your UI layer, because the UI layer normally doesn't depend on the EF Core or the Application layer's implementation. These startup templates are ready for tiered deployment, where the API layer is hosted on a separate server than the UI layer.
>
> However, if you don't choose the `--tiered` option, these references will be in the .Web project to be able to host the Web, API and application layers in a single application endpoint.
>
-> This gives you to ability to use domain entities & repositories in your presentation layer. However, this is considered as a bad practice according to the DDD.
+> This gives you the ability to use domain entities & repositories in your presentation layer. However, this is considered as a bad practice according to DDD.
#### Test Projects
@@ -195,46 +195,46 @@ In addition, `.HttpApi.Client.ConsoleTestApp` is a console application (not an a
Test projects are prepared for integration testing;
-* It is fully integrated to ABP framework and all services in your application.
+* It is fully integrated into the ABP framework and all services in your application.
* It uses SQLite in-memory database for EF Core. For MongoDB, it uses the [Mongo2Go](https://github.com/Mongo2Go/Mongo2Go) library.
* Authorization is disabled, so any application service can be easily used in tests.
-You can still create unit tests for your classes which will be harder to write (because you will need to prepare mock/fake objects), but faster to run (because it only tests a single class and skips all initialization process).
+You can still create unit tests for your classes which will be harder to write (because you will need to prepare mock/fake objects), but faster to run (because it only tests a single class and skips all the initialization processes).
#### How to Run?
-Set `.Web` as the startup project and run the application. Default username is `admin` and password is `1q2w3E*`.
+Set `.Web` as the startup project and run the application. The default username is `admin` and the password is `1q2w3E*`.
See [Getting Started With the ASP.NET Core MVC Template](../Getting-Started-AspNetCore-MVC-Template.md) for more information.
### Tiered Structure
-If you have selected the ASP.NET Core UI and specified the `--tiered` option, the solution created will be a tiered solution. The purpose of the tiered structure is to be able to **deploy Web application and HTTP API to different servers**:
+If you have selected the ASP.NET Core UI and specified the `--tiered` option, the solution created will be a tiered solution. The purpose of the tiered structure is to be able to **deploy Web applications and HTTP API to different servers**:

* Browser runs your UI by executing HTML, CSS & JavaScript.
-* Web servers hosts static UI files (CSS, JavaScript, image... etc.) & dynamic components (e.g. Razor pages). It performs HTTP requests to the API server to execute the business logic of the application.
-* API Server hosts the HTTP APIs which then use application & domain layers of the application to perform the business logic.
+* Web servers host static UI files (CSS, JavaScript, image... etc.) & dynamic components (e.g. Razor pages). It performs HTTP requests to the API server to execute the business logic of the application.
+* The API Server hosts the HTTP APIs which then use the application & domain layers of the application to perform the business logic.
* Finally, database server hosts your database.
So, the resulting solution allows a 4-tiered deployment, by comparing to 3-tiered deployment of the default structure explained before.
-> Unless you actually need to such a 4-tiered deployment, its suggested to go with the default structure which is simpler to develop, deploy and maintain.
+> Unless you actually need such a 4-tiered deployment, it's suggested to go with the default structure which is simpler to develop, deploy and maintain.
The solution structure is shown below:

-As different from the default structure, two new projects come into play: `.IdentityServer` & `.HttpApi.Host`.
+As different from the default structure, two new projects come into play: `.AuthServer` & `.HttpApi.Host`.
-#### .IdentityServer Project
+#### .AuthServer Project
-This project is used as an authentication server for other projects. `.Web` project uses OpenId Connect Authentication to get identity and access tokens for the current user from the IdentityServer. Then uses the access token to call the HTTP API server. HTTP API server uses bearer token authentication to obtain claims from the access token to authorize the current user.
+This project is used as an authentication server for other projects. `.Web` project uses OpenId Connect Authentication to get identity and access tokens for the current user from the AuthServer. Then uses the access token to call the HTTP API server. HTTP API server uses bearer token authentication to obtain claims from the access token to authorize the current user.

-ABP uses the open source [IdentityServer4](https://identityserver.io/) framework for the authentication between applications. See [IdentityServer4 documentation](http://docs.identityserver.io) for details about the IdentityServer4 and OpenID Connect protocol.
+ABP uses the open source [OpenIddcit](https://github.com/openiddict/openiddict-core) framework for the authentication between applications. See [OpenIddcit documentation](https://documentation.openiddict.com/) for details about the OpenIddict and OpenID Connect protocol.
It has its own `appsettings.json` that contains database connection and other configurations.
@@ -246,17 +246,17 @@ This project is an application that hosts the API of the solution. It has its ow
Just like the default structure, this project contains the User Interface (UI) of the application. It contains razor pages, JavaScript files, style files, images and so on...
-This project contains an `appsettings.json` file, but this time it does not have a connection string because it never connects to the database. Instead, it mainly contains endpoint of the remote API server and the authentication server.
+This project contains an `appsettings.json` file, but this time it does not have a connection string because it never connects to the database. Instead, it mainly contains the endpoint of the remote API server and the authentication server.
#### Pre-requirements
-* [Redis](https://redis.io/): The applications use Redis as as distributed cache. So, you need to have Redis installed & running.
+* [Redis](https://redis.io/): The applications use Redis as a distributed cache. So, you need to have Redis installed & running.
#### How to Run?
You should run the application with the given order:
-* First, run the `.IdentityServer` since other applications depends on it.
+* First, run the `.AuthServer` since other applications depend on it.
* Then run the `.HttpApi.Host` since it is used by the `.Web` application.
* Finally, you can run the `.Web` project and login to the application (using `admin` as the username and `1q2w3E*` as the password).
@@ -286,9 +286,9 @@ Angular application module structure:
#### AppModule
-`AppModule` is the root module of the application. Some of ABP modules and some essential modules imported to the `AppModule`.
+`AppModule` is the root module of the application. Some of the ABP modules and some essential modules are imported to `AppModule`.
-ABP Config modules also have imported to `AppModule` for initially requirements of lazy-loadable ABP modules.
+ABP Config modules have also been imported to `AppModule` for initial requirements of the lazy-loadable ABP modules.
#### AppRoutingModule
@@ -315,22 +315,22 @@ You should add `routes` property in the `data` object to add a link on the menu
```
In the above example;
* If the user is not logged in, AuthGuard blocks access and redirects to the login page.
-* PermissionGuard checks the user's permission with `requiredPolicy` property of the `rotues` object. If the user is not authorized to access the page, the 403 page appears.
-* `name` property of `routes` is the menu link label. A localization key can be defined .
-* `iconClass` property of `routes` object is the menu link icon class.
-* `requiredPolicy` property of `routes` object is the required policy key to access the page.
+* PermissionGuard checks the user's permission with the `requiredPolicy` property of the `routes` object. If the user is not authorized to access the page, the 403 page appears.
+* The `name` property of `routes` is the menu link label. A localization key can be defined.
+* The `iconClass` property of the `routes` object is the menu link icon class.
+* The `requiredPolicy` property of the `routes` object is the required policy key to access the page.
After the above `routes` definition, if the user is authorized, the dashboard link will appear on the menu.
#### Shared Module
-The modules that may be required for all modules have imported to the `SharedModule`. You should import the `SharedModule` to all modules.
+The modules that may be required for all modules have been imported to the `SharedModule`. You should import `SharedModule` to all modules.
See the [Sharing Modules](https://angular.io/guide/sharing-ngmodules) document.
#### Environments
-The files under the `src/environments` folder has the essential configuration of the application.
+The files under the `src/environments` folder have the essential configuration of the application.
#### Home Module
@@ -338,11 +338,11 @@ Home module is an example lazy-loadable module that loads on the root address of
#### Styles
-The required style files added to `styles` array in the `angular.json`. `AppComponent` loads some style files lazily via `LazyLoadService` after the main bundle is loaded to shorten the first rendering time.
+The required style files are added to the `styles` array in `angular.json`. `AppComponent` loads some style files lazily via `LazyLoadService` after the main bundle is loaded to shorten the first rendering time.
#### Testing
-You should create your tests in the same folder as the file file you want to test.
+You should create your tests in the same folder as the file you want to test.
See the [testing document](https://angular.io/guide/testing).
@@ -356,7 +356,7 @@ See the [testing document](https://angular.io/guide/testing).
### React Native
-if `-m react-native` option is spesified in new project command, the solution includes the [React Native](https://reactnative.dev/) application in the `react-native` folder.
+If the `-m react-native` option is specified in the new project command, the solution includes the [React Native](https://reactnative.dev/) application in the `react-native` folder.
The server-side is similar to the solution described above. `*.HttpApi.Host` project serves the API, so the React Native application consumes it.
@@ -366,17 +366,17 @@ React Native application folder structure as like below:

-* `App.js` is bootstrap component of the application.
-* `Environment.js` file has the essential configuration of the application. `prod` and `dev` configurations defined in this file.
+* `App.js` is the bootstrap component of the application.
+* `Environment.js` file has the essential configuration of the application. `prod` and `dev` configurations are defined in this file.
* [Contexts](https://reactjs.org/docs/context.html) are created in the `src/contexts` folder.
-* [Higher order components](https://reactjs.org/docs/higher-order-components.html) are created in the`src/hocs` folder.
-* [Custom hooks](https://reactjs.org/docs/hooks-custom.html#extracting-a-custom-hook) are created in the`src/hooks`.
+* [Higher order components](https://reactjs.org/docs/higher-order-components.html) are created in the `src/hocs` folder.
+* [Custom hooks](https://reactjs.org/docs/hooks-custom.html#extracting-a-custom-hook) are created in `src/hooks`.
* [Axios interceptors](https://github.com/axios/axios#interceptors) are created in the `src/interceptors` folder.
* Utility functions are exported from `src/utils` folder.
#### Components
-Components that can be used on all screens are created in the `src/components` folder. All components have created as a function that able to use [hooks](https://reactjs.org/docs/hooks-intro.html).
+Components that can be used on all screens are created in the `src/components` folder. All components have been created as a function that is able to use [hooks](https://reactjs.org/docs/hooks-intro.html).
#### Screens
@@ -388,13 +388,13 @@ Each screen is used in a navigator in the `src/navigators` folder.
#### Navigation
-[React Navigation](https://reactnavigation.org/) is used as a navigation library. Navigators are created in the `src/navigators`. A [drawer](https://reactnavigation.org/docs/drawer-based-navigation/) navigator and several [stack](https://reactnavigation.org/docs/hello-react-navigation/#installing-the-stack-navigator-library) navigators have created in this folder. See the [above diagram](#screens) for navigation structure.
+[React Navigation](https://reactnavigation.org/) is used as a navigation library. Navigators are created in the `src/navigators`. A [drawer](https://reactnavigation.org/docs/drawer-based-navigation/) navigator and several [stack](https://reactnavigation.org/docs/hello-react-navigation/#installing-the-stack-navigator-library) navigators have been created in this folder. See the [above diagram](#screens) for the navigation structure.
#### State Management
-[Redux](https://redux.js.org/) is used as state management library. [Redux Toolkit](https://redux-toolkit.js.org/) library is used as a toolset for efficient Redux development.
+[Redux](https://redux.js.org/) is used as a state management library. [Redux Toolkit](https://redux-toolkit.js.org/) library is used as a toolset for efficient Redux development.
-Actions, reducers, sagas, selectors are created in the `src/store` folder. Store folder as like below:
+Actions, reducers, sagas and selectors are created in the `src/store` folder. Store folder is as below:

@@ -426,11 +426,11 @@ See the [Testing Overview](https://reactjs.org/docs/testing.html) document.
* [Native Base](https://nativebase.io/) is used as UI components library.
* [React Navigation](https://reactnavigation.org/) is used as navigation library.
-* [Axios](https://github.com/axios/axios) is used as HTTP client library.
+* [Axios](https://github.com/axios/axios) is used as an HTTP client library.
* [Redux](https://redux.js.org/) is used as state management library.
* [Redux Toolkit](https://redux-toolkit.js.org/) library is used as a toolset for efficient Redux development.
* [Redux-Saga](https://redux-saga.js.org/) is used to manage asynchronous processes.
-* [Redux Persist](https://github.com/rt2zz/redux-persist) is used as state persistance.
+* [Redux Persist](https://github.com/rt2zz/redux-persist) is used as state persistence.
* [Reselect](https://github.com/reduxjs/reselect) is used to create memoized selectors.
* [i18n-js](https://github.com/fnando/i18n-js) is used as i18n library.
* [expo-font](https://docs.expo.io/versions/latest/sdk/font/) library allows loading fonts easily.
diff --git a/docs/en/Startup-Templates/Module.md b/docs/en/Startup-Templates/Module.md
index c9ac6ccd48..afb6496ed5 100644
--- a/docs/en/Startup-Templates/Module.md
+++ b/docs/en/Startup-Templates/Module.md
@@ -139,7 +139,7 @@ Set `host/YourProjectName.Web.Unified` as the startup project, run `Update-Datab
In this scenario, there are three applications;
-* `.IdentityServer` application is an authentication server used by other applications. It has its own `appsettings.json` that contains database connection and other configurations.
+* `.AuthServer` application is an authentication server used by other applications. It has its own `appsettings.json` that contains database connection and other configurations.
* `.HttpApi.Host` hosts the HTTP API of the module. It has its own `appsettings.json` that contains database connections and other configurations.
* `.Web.Host` host the UI of the module. This project contains an `appsettings.json` file, but it does not have a connection string because it never connects to the database. Instead, it mainly contains endpoint of the remote API server and the authentication server.
@@ -147,7 +147,7 @@ The diagram below shows the relation of the applications:

-`.Web.Host` project uses OpenId Connect Authentication to get identity and access tokens for the current user from the `.IdentityServer`. Then uses the access token to call the `.HttpApi.Host`. HTTP API server uses bearer token authentication to obtain claims from the access token to authorize the current user.
+`.Web.Host` project uses OpenId Connect Authentication to get identity and access tokens for the current user from the `.AuthServer`. Then uses the access token to call the `.HttpApi.Host`. HTTP API server uses bearer token authentication to obtain claims from the access token to authorize the current user.
##### Pre-requirements
@@ -157,7 +157,7 @@ The diagram below shows the relation of the applications:
You should run the application with the given order:
-- First, run the `.IdentityServer` since other applications depends on it.
+- First, run the `.AuthServer` since other applications depends on it.
- Then run the `.HttpApi.Host` since it is used by the `.Web.Host` application.
- Finally, you can run the `.Web.Host` project and login to the application using `admin` as the username and `1q2w3E*` as the password.
@@ -195,7 +195,7 @@ The module you will develop depends on two of these ABP packages: _@abp/ng.core_
Once all dependencies are installed, follow the steps below to serve your development app:
-1. Make sure `.IdentityServer` and `*.HttpApi.Host` projects are up and running.
+1. Make sure `.AuthServer` and `*.HttpApi.Host` projects are up and running.
2. Open your terminal at the root folder, i.e. `angular`.
3. Run `yarn start` or `npm start`.
diff --git a/docs/en/Themes/LeptonXLite/angular.md b/docs/en/Themes/LeptonXLite/angular.md
index 6e4cbef317..805ababd69 100644
--- a/docs/en/Themes/LeptonXLite/angular.md
+++ b/docs/en/Themes/LeptonXLite/angular.md
@@ -79,4 +79,4 @@ To change the logos and brand color of `LeptonX`, simply add the following CSS t
### Server Side
-In order to migrate to LeptonX on your server side projects (Host and/or IdentityServer projects), please follow the [Server Side Migration](mvc.md) document.
+In order to migrate to LeptonX on your server side projects (Host and/or AuthServer projects), please follow the [Server Side Migration](mvc.md) document.
diff --git a/docs/en/Themes/LeptonXLite/blazor.md b/docs/en/Themes/LeptonXLite/blazor.md
index 7bc374746a..f443336e7c 100644
--- a/docs/en/Themes/LeptonXLite/blazor.md
+++ b/docs/en/Themes/LeptonXLite/blazor.md
@@ -16,11 +16,12 @@ LeptonX Lite has implementation for the ABP Framework Blazor WebAssembly & Blazo
## Installation
{{if UI == "Blazor"}}
-- Complete the [MVC Razor Pages Installation](mvc.md#installation) for the **HttpApi.Host** application first. _If the solution is tiered/micro-service, complete the MVC steps for all MVC applications such as **HttpApi.Host** and if identity server is separated, install to the **IdentityServer**_.
+- Complete the [MVC Razor Pages Installation](mvc.md#installation) for the **HttpApi.Host** application first. _If the solution is tiered/micro-service, complete the MVC steps for all MVC applications such as **HttpApi.Host** and if identity server is separated, install to the **OpenIddict**_.
+
+- Add **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme** package to your **Blazor WebAssembly** application with the following command:
-- Add **Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme** package to your **Blazor WebAssembly** application.
```bash
- dotnet add package Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme
+ dotnet add package Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme --prerelease
```
- Remove **Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme** reference from the project since it's not necessary after switching to LeptonX Lite.
@@ -51,11 +52,12 @@ builder.RootComponents.Add("#ApplicationContainer");
{{if UI == "BlazorServer"}}
-- Complete the [MVC Razor Pages Installation](mvc.md#installation) first. _If the solution is tiered/micro-service, complete the MVC steps for all MVC applications such as **HttpApi.Host** and **IdentityServer**_.
+- Complete the [MVC Razor Pages Installation](mvc.md#installation) first. _If the solution is tiered/micro-service, complete the MVC steps for all MVC applications such as **HttpApi.Host** and **AuthServer**_.
+
+- Add **Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme** package to your **Blazor server** application with the following command:
-- Add **Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme** package to your **Blazor server** application.
```bash
- dotnet add package Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme
+ dotnet add package Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme --prerelease
```
- Remove **Volo.Abp.AspNetCore.Components.Server.BasicTheme** reference from the project since it's not necessary after switching to LeptonX Lite.
diff --git a/docs/en/Tutorials/Todo/Index.md b/docs/en/Tutorials/Todo/Index.md
index 7b232c4873..b3e5a876df 100644
--- a/docs/en/Tutorials/Todo/Index.md
+++ b/docs/en/Tutorials/Todo/Index.md
@@ -96,13 +96,7 @@ Ensure that the `TodoApp.HttpApi.Host` project is the startup project, then run
You can explore and test your HTTP API with this UI. If it works, we can run the Angular client application.
-First, run the following command to restore the NPM packages;
-
-````bash
-npm install
-````
-
-It will take some time to install all the packages. Then you can run the application using the following command:
+You can run the application using the following command:
````bash
npm start
diff --git a/docs/en/UI/Angular/Account-Module.md b/docs/en/UI/Angular/Account-Module.md
index 3670a14f73..3b2363361a 100644
--- a/docs/en/UI/Angular/Account-Module.md
+++ b/docs/en/UI/Angular/Account-Module.md
@@ -110,7 +110,7 @@ export const environment = {
// other options removed for sake of brevity
oAuthConfig: {
- issuer: 'https://localhost:44305', // IdentityServer url
+ issuer: 'https://localhost:44305', // AuthServer url
clientId: 'MyProjectName_App',
dummyClientSecret: '1q2w3e*',
scope: 'offline_access MyProjectName',
diff --git a/docs/en/UI/Angular/GlobalFeatures.md b/docs/en/UI/Angular/GlobalFeatures.md
new file mode 100644
index 0000000000..c8f9ba78df
--- /dev/null
+++ b/docs/en/UI/Angular/GlobalFeatures.md
@@ -0,0 +1,47 @@
+# Angular: Global Features API
+
+The `ConfigStateService.getGlobalFeatures` API allows you to get the enabled features of the [Global Features](../../Global-Features.md) on the client side.
+
+> This document only explains the JavaScript API. See the [Global Features](../../Global-Features.md) document to understand the ABP Global Features system.
+
+## Usage
+
+````js
+
+import { ConfigStateService } from '@abp/ng.core';
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ /* class metadata here */
+})
+class DemoComponent implements OnInit {
+ constructor(private config: ConfigStateService) {}
+
+ ngOnInit(): void {
+ // Gets all enabled global features.
+ const getGlobalFeatures = this.config.getGlobalFeatures();
+
+ //Example result is: `{ enabledFeatures: [ 'Shopping.Payment', 'Ecommerce.Subscription' ] }`
+
+ // or
+ this.config.getGlobalFeatures$().subscribe(getGlobalFeatures => {
+ // use getGlobalFeatures here
+ })
+
+ // Check the global feature is enabled
+ this.config.getGlobalFeatureIsEnabled('Ecommerce.Subscription')
+
+ //Example result is `true`
+
+ this.config.getGlobalFeatureIsEnabled('My.Subscription')
+
+ //Example result is `false`
+
+ // or
+ this.config.getGlobalFeatureIsEnabled$('Ecommerce.Subscription').subscribe((isEnabled:boolean) => {
+ // use isEnabled here
+ })
+ }
+}
+
+
diff --git a/docs/en/UI/Angular/Loading-Directive.md b/docs/en/UI/Angular/Loading-Directive.md
new file mode 100644
index 0000000000..18ff4baaeb
--- /dev/null
+++ b/docs/en/UI/Angular/Loading-Directive.md
@@ -0,0 +1,44 @@
+# Loading Directive
+
+
+You may want to block a part of the UI and show a spinner for a while; the `LoadingDirective` directive makes this for you. `LoadingDirective` has been exposed by the `@abp/ng.theme.shared` package.
+
+
+## Getting Started
+
+In order to use the `LoadingDirective` in an HTML template, the **`ThemeSharedModule`** should be imported into your module like this:
+
+```js
+// ...
+import { ThemeSharedModule } from '@abp/ng.theme.shared';
+
+@NgModule({
+ //...
+ imports: [..., ThemeSharedModule],
+})
+export class MyFeatureModule {}
+```
+
+
+## Usage
+
+The `LoadingDirective` is easy to use. The directive's selector is **`abpLoading`**. By adding the `abpLoading` attribute to an HTML element, you can activate the `LoadingDirectiveective` for the HTML element when the value is true.
+
+See an example usage:
+
+```html
+
+ Lorem ipsum dolor sit, amet consectetur adipisicing elit. Laboriosam commodi quae aspernatur,
+ corporis velit et suscipit id consequuntur amet minima expedita cum reiciendis dolorum
+ cupiditate? Voluptas eaque voluptatum odio deleniti quo vel illum nemo accusamus nulla ratione
+ impedit dolorum expedita necessitatibus fugiat ullam beatae, optio eum cupiditate ducimus
+ architecto.
+
+```
+
+
+The `abpLoading` attribute has been added to the `
` element that contains very a long text inside to activate the `LoadingDirective`.
+
+See the result:
+
+
diff --git a/docs/en/UI/Angular/Multi-Tenancy.md b/docs/en/UI/Angular/Multi-Tenancy.md
index cded16e7d4..92f76435ca 100644
--- a/docs/en/UI/Angular/Multi-Tenancy.md
+++ b/docs/en/UI/Angular/Multi-Tenancy.md
@@ -119,7 +119,7 @@ After the configuration above, if your app runs on the `mytenant1.mydomain.com`,
After this replacement, the app will use the following URLs:
-- `https://mytenant1.ids.mydomain.com` as IdentityServer URL.
+- `https://mytenant1.ids.mydomain.com` as AuthServer URL.
- `https://mytenant1.api.mydomain.com` as default URL.
- `https://mytenant1.identity.mydomain.com` as `AbpIdentity` remote endpoint URL.
diff --git a/docs/en/UI/Angular/images/abp-loading.png b/docs/en/UI/Angular/images/abp-loading.png
new file mode 100644
index 0000000000..50073f6d63
Binary files /dev/null and b/docs/en/UI/Angular/images/abp-loading.png differ
diff --git a/docs/en/UI/AspNetCore/Branding.md b/docs/en/UI/AspNetCore/Branding.md
index aa1500401d..3a729d28db 100644
--- a/docs/en/UI/AspNetCore/Branding.md
+++ b/docs/en/UI/AspNetCore/Branding.md
@@ -21,7 +21,7 @@ namespace MyProject.Web
{
public override string AppName => "Book Store";
- public override string LogoUrl => "logo.png";
+ public override string LogoUrl => "/logo.png";
}
}
````
diff --git a/docs/en/UI/AspNetCore/JavaScript-API/GlobalFeatures.md b/docs/en/UI/AspNetCore/JavaScript-API/GlobalFeatures.md
new file mode 100644
index 0000000000..7b451addcd
--- /dev/null
+++ b/docs/en/UI/AspNetCore/JavaScript-API/GlobalFeatures.md
@@ -0,0 +1,24 @@
+# ASP.NET Core MVC / Razor Pages UI: JavaScript Global Features API
+
+`abp.globalFeatures` API allows you to get the enabled features of the [Global Features](../../../Global-Features.md) in the client side.
+
+> This document only explains the JavaScript API. See the [Global Features](../../../Global-Features.md) document to understand the ABP Global Features system.
+
+## Usage
+
+````js
+//Gets all enabled global features.
+> abp.globalFeatures.enabledFeatures
+
+[ 'Shopping.Payment', 'Ecommerce.Subscription' ]
+
+
+//Check the global feature is enabled
+> abp.globalFeatures.isEnabled('Ecommerce.Subscription')
+
+true
+
+> abp.globalFeatures.isEnabled('My.Subscription')
+
+false
+````
diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Index.md b/docs/en/UI/AspNetCore/JavaScript-API/Index.md
index 3473140392..21a3eeed93 100644
--- a/docs/en/UI/AspNetCore/JavaScript-API/Index.md
+++ b/docs/en/UI/AspNetCore/JavaScript-API/Index.md
@@ -10,6 +10,7 @@ ABP provides a set of JavaScript APIs for ASP.NET Core MVC / Razor Pages applica
* [DOM](DOM.md)
* [Events](Events.md)
* [Features](Features.md)
+* [Global Features](GlobalFeatures.md)
* [Localization](Localization.md)
* [Logging](Logging.md)
* [ResourceLoader](ResourceLoader.md)
diff --git a/docs/en/UI/AspNetCore/Theming.md b/docs/en/UI/AspNetCore/Theming.md
index 6a378cd29a..fd2e7312de 100644
--- a/docs/en/UI/AspNetCore/Theming.md
+++ b/docs/en/UI/AspNetCore/Theming.md
@@ -122,9 +122,13 @@ The empty layout provides an empty page. It typically includes the following par
## Implementing a Theme
-### The Easy Way
+### The Easiest Way
-The easiest way to create a new theme is to copy the [Basic Theme Source Code](https://github.com/abpframework/abp/blob/dev/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic) and customize it. Once you get a copy of the theme in your solution, remove the `Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic` NuGet package and reference to the local project.
+The easiest way of creating a new theme is adding [Basic Theme Source Code](https://github.com/abpframework/abp/tree/dev/modules/basic-theme) module with source codes and customizing it.
+
+```bash
+abp add-package Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic --with-source-code --add-to-solution-file
+```
### The ITheme Interface
diff --git a/docs/en/UI/Blazor/Authentication.md b/docs/en/UI/Blazor/Authentication.md
index 9dc34ebce5..db784795e8 100644
--- a/docs/en/UI/Blazor/Authentication.md
+++ b/docs/en/UI/Blazor/Authentication.md
@@ -1,11 +1,27 @@
# Blazor UI: Authentication
-The [application startup template](../../Startup-Templates/Application.md) is properly configured to use OpenId Connect to authenticate the user through the server side login form;
+````json
+//[doc-params]
+{
+ "UI": ["Blazor", "BlazorServer"]
+}
+````
+The [application startup template](../../Startup-Templates/Application.md) is properly configured to use OpenId Connect to authenticate the user;
+
+{{if UI == "BlazorServer"}}
+The Blazor Server application UI is actually a hybrid application that is combined with the MVC UI, and uses the login page provided by the MVC UI. When users enter a page that requires login, they are redirected to the `/Account/Login` page. Once they complete the login process, they are returned back to the application's UI. The login page also contains features like registration, password recovery, etc.
+
+{{end}}
+
+{{if UI == "Blazor"}}
* When the Blazor application needs to authenticate, it is redirected to the server side.
-* Users can enter username & password to login if they already have an account. If not, they can use the register form to create a new user. They can also use forgot password and other features. The server side uses IdentityServer4 to handle the authentication.
+* Users can enter username & password to login if they already have an account. If not, they can use the register form to create a new user. They can also use forgot password and other features. The server side uses OpenIddict to handle the authentication.
* Finally, they are redirected back to the Blazor application to complete the login process.
This is a typical and recommended approach to implement authentication in Single-Page Applications. The client side configuration is done in the startup template, so you can change it.
-See the [Blazor Security document](https://docs.microsoft.com/en-us/aspnet/core/blazor/security) to understand and customize the authentication process.
\ No newline at end of file
+
+See the [Blazor Security document](https://docs.microsoft.com/en-us/aspnet/core/blazor/security) to understand and customize the authentication process.
+
+{{end}}
\ No newline at end of file
diff --git a/docs/en/UI/Blazor/Basic-Theme.md b/docs/en/UI/Blazor/Basic-Theme.md
index 2c034f258a..1d2dfb5c11 100644
--- a/docs/en/UI/Blazor/Basic-Theme.md
+++ b/docs/en/UI/Blazor/Basic-Theme.md
@@ -1,5 +1,12 @@
# Blazor UI: Basic Theme
+````json
+//[doc-params]
+{
+ "UI": ["Blazor", "BlazorServer"]
+}
+````
+
The Basic Theme is a theme implementation for the Blazor UI. It is a minimalist theme that doesn't add any styling on top of the plain [Bootstrap](https://getbootstrap.com/). You can take the Basic Theme as the **base theme** and build your own theme or styling on top of it. See the *Customization* section.
> If you are looking for a professional, enterprise ready theme, you can check the [Lepton Theme](https://commercial.abp.io/themes), which is a part of the [ABP Commercial](https://commercial.abp.io/).
@@ -10,16 +17,46 @@ The Basic Theme is a theme implementation for the Blazor UI. It is a minimalist
**This theme is already installed** when you create a new solution using the [startup templates](../../Startup-Templates/Index.md). If you need to manually install it, follow the steps below:
+{{if UI == "Blazor"}}
+
* Install the [Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme) NuGet package to your web project.
* Add `AbpAspNetCoreComponentsWebAssemblyBasicThemeModule` into the `[DependsOn(...)]` attribute for your [module class](../../Module-Development-Basics.md) in the your Blazor UI project.
* Use `Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.Themes.Basic.App` as the root component of your application in the `ConfigureServices` method of your module:
-````csharp
-var builder = context.Services.GetSingletonInstance();
-builder.RootComponents.Add("#ApplicationContainer");
-````
+ ```csharp
+ var builder = context.Services.GetSingletonInstance();
+ builder.RootComponents.Add("#ApplicationContainer");
+ ```
+ `#ApplicationContainer` is a selector (like `
Loading...
`) in the `index.html`.
+
+* Execute `abp bundle` command under blazor project once.
+
+{{end}}
+
+{{if UI == "BlazorServer"}}
+
+* Make sure [AspNetCore Basic Theme](../AspNetCore/Basic-Theme.md) installation steps are completed.
+
+* Install the [Volo.Abp.AspNetCore.Components.Server.BasicTheme](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Components.Server.BasicTheme) NuGet package to your web project.
+
+* Add `AbpAspNetCoreComponentsServerBasicThemeModule` into the `[DependsOn(...)]` attribute for your [module class](../../Module-Development-Basics.md) in the your Blazor UI project.
+
+* Perform following changes in `Pages/_Host.cshtml` file
+ * Add usings at the top of the page.
+ ```html
+ @using Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling
+ @using Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic
+ ```
+ * Add Basic theme style bundles between `` tags.
+ ```html
+
+ ```
+ * Add `App` component of Basic Theme in the body section of page.
+ ```html
+
+ ```
-`#ApplicationContainer` is a selector (like `