Browse Source

Merge branch 'dev' into liangshiwei/multi-lingual-entities

pull/5265/head
liangshiwei 6 years ago
parent
commit
0e4368fe36
  1. 3
      .github/ISSUE_TEMPLATE
  2. 24
      .github/workflows/auto-pr.yml
  3. 2
      .github/workflows/build-and-test.yml
  4. 2
      .gitignore
  5. 29
      Directory.Build.props
  6. 102
      README.md
  7. 14
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/de-DE.json
  8. 14
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en-GB.json
  9. 14
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/es.json
  10. 199
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/de-DE.json
  11. 202
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en-GB.json
  12. 12
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
  13. 199
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/es.json
  14. 9
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json
  15. 33
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/de-DE.json
  16. 35
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json
  17. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
  18. 33
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/es.json
  19. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json
  20. 35
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de-DE.json
  21. 39
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json
  22. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  23. 35
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json
  24. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
  25. 90
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/de-DE.json
  26. 106
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en-GB.json
  27. 61
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
  28. 90
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/es.json
  29. 31
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json
  30. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ar.json
  31. 190
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/de-DE.json
  32. 198
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en-GB.json
  33. 13
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
  34. 190
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/es.json
  35. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/pt-BR.json
  36. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json
  37. 13
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json
  38. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hant.json
  39. 12
      common.DotSettings
  40. 12
      common.props
  41. 53
      docs/en/API/Dynamic-CSharp-API-Clients.md
  42. 6
      docs/en/Application-Services.md
  43. 2
      docs/en/AspNet-Boilerplate-Migration-Guide.md
  44. 31
      docs/en/Authentication/Social-External-Logins.md
  45. 24
      docs/en/Authorization.md
  46. 132
      docs/en/Background-Jobs-RabbitMq.md
  47. 47
      docs/en/Background-Jobs.md
  48. 2
      docs/en/Background-Workers-Quartz.md
  49. 8
      docs/en/Background-Workers.md
  50. 2
      docs/en/Blob-Storing-Aliyun.md
  51. 2
      docs/en/Blob-Storing-Aws.md
  52. 2
      docs/en/Blob-Storing-Azure.md
  53. 2
      docs/en/Blob-Storing-Minio.md
  54. 4
      docs/en/Blob-Storing.md
  55. 8
      docs/en/Blog-Posts/2020-05-08 v2_7_Release/Post.md
  56. 143
      docs/en/Blog-Posts/2020-11-12 v4_0_Preview/POST.md
  57. BIN
      docs/en/Blog-Posts/2020-11-12 v4_0_Preview/abp-suite-auto-complete-dropdown.png
  58. 87
      docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/POST.md
  59. BIN
      docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/abp-contribution-graph-4-years.png
  60. BIN
      docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/ddd-implementation-guide-sample.png
  61. 202
      docs/en/Blog-Posts/2020-12-18 v4_1_Preview/POST.md
  62. BIN
      docs/en/Blog-Posts/2020-12-18 v4_1_Preview/abp-commercial-public-website.png
  63. BIN
      docs/en/Blog-Posts/2020-12-18 v4_1_Preview/blazor-identityserver-ui.png
  64. BIN
      docs/en/Blog-Posts/2020-12-18 v4_1_Preview/blazor-organization-units.png
  65. BIN
      docs/en/Blog-Posts/2020-12-18 v4_1_Preview/event-list-ui.png
  66. BIN
      docs/en/Blog-Posts/2020-12-18 v4_1_Preview/spanish-commercial-translation.png
  67. BIN
      docs/en/Blog-Posts/2020-12-18 v4_1_Preview/type-ahead.png
  68. 51
      docs/en/Blog-Posts/2021-01-07 v4_1_Release_Stable/POST.md
  69. 241
      docs/en/Blog-Posts/2021-01-14 v4_2_Preview/POST.md
  70. BIN
      docs/en/Blog-Posts/2021-01-14 v4_2_Preview/easy-crm.png
  71. BIN
      docs/en/Blog-Posts/2021-01-14 v4_2_Preview/microservice-template-diagram.png
  72. BIN
      docs/en/Blog-Posts/2021-01-14 v4_2_Preview/public-website.jpg
  73. BIN
      docs/en/Blog-Posts/2021-01-14 v4_2_Preview/swagger-authorize-modal.png
  74. BIN
      docs/en/Blog-Posts/2021-01-14 v4_2_Preview/swagger-authorize.png
  75. 51
      docs/en/CLI.md
  76. 45
      docs/en/CSRF-Anti-Forgery.md
  77. 11
      docs/en/Community-Articles/2020-04-19-Customize-the-SignIn-Manager/POST.md
  78. 48
      docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md
  79. 14
      docs/en/Community-Articles/2020-08-07-Passwordless-Authentication/POST.md
  80. 140
      docs/en/Community-Articles/2020-08-12-Patch-Chrome-Login-Issue-For-IdentityServer4/POST.md
  81. 2
      docs/en/Community-Articles/2020-08-31-Adding-User-Navigation-In-Suite/POST.md
  82. 12
      docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md
  83. 46
      docs/en/Community-Articles/2020-11-02-How-To-Add-New-Language/POST.md
  84. BIN
      docs/en/Community-Articles/2020-11-02-How-To-Add-New-Language/add-to-languages.png
  85. BIN
      docs/en/Community-Articles/2020-11-02-How-To-Add-New-Language/database-table.png
  86. BIN
      docs/en/Community-Articles/2020-11-02-How-To-Add-New-Language/language-target.png
  87. BIN
      docs/en/Community-Articles/2020-11-02-How-To-Add-New-Language/website-new-language.png
  88. 936
      docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md
  89. BIN
      docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-create-ui.png
  90. BIN
      docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-detail-ui.png
  91. BIN
      docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-list-ui.png
  92. BIN
      docs/en/Community-Articles/2020-12-04-Event-Organizer/images/index-title.png
  93. BIN
      docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-all.png
  94. BIN
      docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-create.png
  95. BIN
      docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-upcoming.png
  96. 110
      docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/POST.md
  97. BIN
      docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/both-example-result.png
  98. BIN
      docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/cover-image.png
  99. BIN
      docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-app-contract.png
  100. BIN
      docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-application.png

3
.github/ISSUE_TEMPLATE

@ -10,6 +10,7 @@ If you're creating a bug/problem report, please include followings:
* Your **ABP Framework version**. * Your **ABP Framework version**.
* Your **User Interface** type (Angular/MVC/React... etc.) if the issue is related to a specific UI * Your **User Interface** type (Angular/MVC/React... etc.) if the issue is related to a specific UI
* Your database provider(EF Core/MongoDB)
* Exception message and **stack trace** if available (check the logs). * Exception message and **stack trace** if available (check the logs).
* Steps needed to **reproduce** the problem. * Steps needed to **reproduce** the problem.
@ -21,4 +22,4 @@ Please use Stack Overflow for your questions about using the framework, template
https://stackoverflow.com/questions/tagged/abp https://stackoverflow.com/questions/tagged/abp
Use **abp** tag in your questions. Use **abp** tag in your questions.

24
.github/workflows/auto-pr.yml

@ -0,0 +1,24 @@
name: Merge branch dev with rel-4.2
on:
push:
branches:
- rel-4.2
jobs:
merge-dev-with-rel-4-2:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: dev
- name: Reset promotion branch
run: |
git fetch origin rel-4.2:rel-4.2
git reset --hard rel-4.2
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
branch: auto-merge/rel-4-2/${{github.run_number}}
title: Merge branch dev with rel-4.2
body: This PR generated automatically to merge dev with rel-4.2. Please review the changed files before merging to prevent any errors that may occur.
reviewers: ${{github.actor}}
token: ${{ github.token }}

2
.github/workflows/build-and-test.yml

@ -17,7 +17,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions/setup-dotnet@master - uses: actions/setup-dotnet@master
with: with:
dotnet-version: 5.0.100-rc.2.20479.15 dotnet-version: 5.0.100
- name: Build All - name: Build All
run: .\build-all.ps1 run: .\build-all.ps1

2
.gitignore

@ -6,6 +6,7 @@
*.user *.user
*.userosscache *.userosscache
*.sln.docstates *.sln.docstates
*.editorconfig
# User-specific files (MonoDevelop/Xamarin Studio) # User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs *.userprefs
@ -152,6 +153,7 @@ PublishScripts/
# NuGet Packages # NuGet Packages
*.nupkg *.nupkg
*.snupkg
# The packages folder can be ignored because of Package Restore # The packages folder can be ignored because of Package Restore
**/packages/* **/packages/*
# except build/, which is used as an MSBuild target. # except build/, which is used as an MSBuild target.

29
Directory.Build.props

@ -0,0 +1,29 @@
<Project>
<PropertyGroup>
<!-- All Microsoft packages -->
<MicrosoftPackageVersion>5.0.*</MicrosoftPackageVersion>
<!-- Microsoft.NET.Test.Sdk https://www.nuget.org/packages/Microsoft.NET.Test.Sdk -->
<MicrosoftNETTestSdkPackageVersion>16.8.3</MicrosoftNETTestSdkPackageVersion>
<!-- NSubstitute https://www.nuget.org/packages/NSubstitute -->
<NSubstitutePackageVersion>4.2.2</NSubstitutePackageVersion>
<!-- Shouldly https://www.nuget.org/packages/Shouldly -->
<ShouldlyPackageVersion>4.0.1</ShouldlyPackageVersion>
<!-- xunit https://www.nuget.org/packages/xUnit -->
<xUnitPackageVersion>2.4.1</xUnitPackageVersion>
<!-- xunit.extensibility.execution https://www.nuget.org/packages/xunit.extensibility.execution -->
<xUnitExtensibilityExecutionPackageVersion>2.4.1</xUnitExtensibilityExecutionPackageVersion>
<!-- xunit.runner.visualstudio https://www.nuget.org/packages/xunit.runner.visualstudio -->
<xUnitRunnerVisualstudioPackageVersion>2.4.3</xUnitRunnerVisualstudioPackageVersion>
<!-- Mongo2Go https://www.nuget.org/packages/Mongo2Go -->
<Mongo2GoPackageVersion>2.2.14</Mongo2GoPackageVersion>
</PropertyGroup>
</Project>

102
README.md

@ -2,22 +2,106 @@
![build and test](https://github.com/abpframework/abp/workflows/build%20and%20test/badge.svg) ![build and test](https://github.com/abpframework/abp/workflows/build%20and%20test/badge.svg)
[![NuGet](https://img.shields.io/nuget/v/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core) [![NuGet](https://img.shields.io/nuget/v/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core)
[![MyGet (with prereleases)](https://img.shields.io/myget/abp-nightly/vpre/Volo.Abp.svg?style=flat-square)](https://docs.abp.io/en/abp/latest/Nightly-Builds) [![NuGet (with prereleases)](https://img.shields.io/nuget/vpre/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core)
[![MyGet (nightly builds)](https://img.shields.io/myget/abp-nightly/vpre/Volo.Abp.svg?style=flat-square)](https://docs.abp.io/en/abp/latest/Nightly-Builds)
[![NuGet Download](https://img.shields.io/nuget/dt/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core) [![NuGet Download](https://img.shields.io/nuget/dt/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core)
ABP is an **open source application framework** focused on ASP.NET Core based web application development, but also supports developing other type of applications. ABP Framework is a complete **infrastructure** based on the **ASP.NET Core** to create **modern web applications** and **APIs** by following the software development **best practices** and the **latest technologies**.
## Links ## Getting Started
* <a href="https://abp.io/" target="_blank">Official Web Site</a> - [Getting Started Guide](https://docs.abp.io/en/abp/latest/Getting-Started) is the easiest way to start a new web application with the ABP Framework.
- [Web Application Development Tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1) is a complete tutorial to develop a full stack web application.
### Quick Start
Install the ABP CLI:
````bash
> dotnet tool install -g Volo.Abp.Cli
````
Create a new solution:
````bash
> abp new BookStore -u mvc -d ef
````
> See the [CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all available options.
### UI Framework Options
<img width="500" src="docs/en/images/ui-options.png">
### Database Provider Options
<img width="500" src="docs/en/images/db-options.png">
## What ABP Provides?
ABP provides a **full stack developer experience**.
### Architecture
<img src="docs/en/images/ddd-microservice-simple.png">
ABP offers a complete, **modular** and **layered** software architecture based on **[Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design)** principles and patterns. It also provides the necessary infrastructure and guiding to [implement this architecture](https://docs.abp.io/en/abp/latest/Domain-Driven-Design-Implementation-Guide).
ABP Framework is suitable for **[microservice solutions](https://docs.abp.io/en/abp/latest/Microservice-Architecture)** as well as monolithic applications.
### Infrastructure
There are a lot of features provided by the ABP Framework to achieve real world scenarios easier, like [Event Bus](https://docs.abp.io/en/abp/latest/Event-Bus), [Background Job System](https://docs.abp.io/en/abp/latest/Background-Jobs), [Audit Logging](https://docs.abp.io/en/abp/latest/Audit-Logging), [BLOB Storing](https://docs.abp.io/en/abp/latest/Blob-Storing), [Data Seeding](https://docs.abp.io/en/abp/latest/Data-Seeding), [Data Filtering](https://docs.abp.io/en/abp/latest/Data-Filtering), etc.
### Cross Cutting Concerns
ABP also simplifies (and even automates wherever possible) cross cutting concerns and common non-functional requirements like [Exception Handling](https://docs.abp.io/en/abp/latest/Exception-Handling), [Validation](https://docs.abp.io/en/abp/latest/Validation), [Authorization](https://docs.abp.io/en/abp/latest/Authorization), [Localization](https://docs.abp.io/en/abp/latest/Localization), [Caching](https://docs.abp.io/en/abp/latest/Caching), [Dependency Injection](https://docs.abp.io/en/abp/latest/Dependency-Injection), [Setting Management](https://docs.abp.io/en/abp/latest/Settings), etc.
### Application Modules
ABP is a modular framework and the Application Modules provide **pre-built application functionalities**;
- [**Account**](https://docs.abp.io/en/abp/latest/Modules/Account): Provides UI for the account management and allows user to login/register to the application.
- **[Identity](https://docs.abp.io/en/abp/latest/Modules/Identity)**: Manages organization units, roles, users and their permissions, based on the Microsoft Identity library.
- [**IdentityServer**](https://docs.abp.io/en/abp/latest/Modules/IdentityServer): Integrates to IdentityServer4.
- [**Tenant Management**](https://docs.abp.io/en/abp/latest/Modules/Tenant-Management): Manages tenants for a [multi-tenant](https://docs.abp.io/en/abp/latest/Multi-Tenancy) (SaaS) application.
See the [Application Modules](https://docs.abp.io/en/abp/latest/Modules/Index) document for all pre-built modules.
### Startup Templates
The [Startup templates](https://docs.abp.io/en/abp/latest/Startup-Templates/Index) are pre-built Visual Studio solution templates. You can create your own solution based on these templates to **immediately start your development**.
## ABP Community
### ABP Community Web Site
The [ABP Community](https://community.abp.io/) is a website to publish **articles** and share **knowledge** about the ABP Framework. You can also create content for the community!
### Blog
Follow the [ABP Blog](https://blog.abp.io/) to learn the latest happenings in the ABP Framework.
### Samples
See the [sample projects](https://docs.abp.io/en/abp/latest/Samples/Index) built with the ABP Framework.
### Want to Contribute?
ABP is a community-driven open source project. See [the contribution guide](https://docs.abp.io/en/abp/latest/Contribution/Index) if you want to be a part of this project.
## Official Links
* <a href="https://abp.io/" target="_blank">Main Web Site</a>
* <a href="https://abp.io/get-started" target="_blank">Get Started</a> * <a href="https://abp.io/get-started" target="_blank">Get Started</a>
* <a href="https://abp.io/features" target="_blank">Features</a> * <a href="https://abp.io/features" target="_blank">Features</a>
* <a href="https://docs.abp.io/" target="_blank">Documentation</a> * <a href="https://docs.abp.io/" target="_blank">Documentation</a>
* <a href="https://docs.abp.io/en/abp/latest/Samples/Index" target="_blank">Samples</a> * <a href="https://docs.abp.io/en/abp/latest/Samples/Index" target="_blank">Samples</a>
* <a href="https://blog.abp.io/" target="_blank">Blog</a> * <a href="https://blog.abp.io/" target="_blank">Blog</a>
* <a href="https://community.abp.io/" target="_blank">Community</a>
* <a href="https://stackoverflow.com/questions/tagged/abp" target="_blank">Stack overflow</a> * <a href="https://stackoverflow.com/questions/tagged/abp" target="_blank">Stack overflow</a>
* <a href="https://twitter.com/abpframework" target="_blank">Twitter</a> * <a href="https://twitter.com/abpframework" target="_blank">Twitter</a>
## Contribution ## Support the ABP Framework
ABP is an open source platform. Check [the contribution guide](docs/en/Contribution/Index.md) if you want to contribute to the project. Love ABP Framework? **Please give a star** to this repository :star:

14
abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/de-DE.json

@ -0,0 +1,14 @@
{
"culture": "de-DE",
"texts": {
"Account": "ABP Benutzerkonto - Anmeldung & Registrierung | ABP.IO",
"Welcome": "Willkommen",
"UseOneOfTheFollowingLinksToContinue": "Nutzen Sie einen der nachfolgenden Links um fortzusetzen",
"FrameworkHomePage": "Framework Website",
"FrameworkDocumentation": "Framework Dokumentation",
"OfficialBlog": "Offizieller Blog",
"CommercialHomePage": "Commercial Website",
"CommercialSupportWebSite": "Commercial Support-Website",
"CommunityWebSite": "ABP Community-Website"
}
}

14
abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en-GB.json

@ -0,0 +1,14 @@
{
"culture": "en-GB",
"texts": {
"Account": "ABP Account - Login & Register | ABP.IO",
"Welcome": "Welcome",
"UseOneOfTheFollowingLinksToContinue": "Use one of the following links to continue",
"FrameworkHomePage": "Framework home page",
"FrameworkDocumentation": "Framework documentation",
"OfficialBlog": "Official blog",
"CommercialHomePage": "Commercial home page",
"CommercialSupportWebSite": "Commercial support web site",
"CommunityWebSite": "ABP community web site"
}
}

14
abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/es.json

@ -0,0 +1,14 @@
{
"culture": "es",
"texts": {
"Account": "Cuenta de ABP - Iniciar sesión y registrarse | ABP.IO",
"Welcome": "Bienvenido",
"UseOneOfTheFollowingLinksToContinue": "Usa uno de los siguientes links para continuar",
"FrameworkHomePage": "Página de inicio del framework",
"FrameworkDocumentation": "Documentación del framework",
"OfficialBlog": "Blog Oficial",
"CommercialHomePage": "Página de inicio comercial",
"CommercialSupportWebSite": "Sitio web de soporte comercial",
"CommunityWebSite": "Sitio web comunidad ABP"
}
}

199
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/de-DE.json

@ -0,0 +1,199 @@
{
"culture": "de-DE",
"texts": {
"Permission:Organizations": "Organisationen",
"Permission:Manage": "Organisationen verwalten",
"Permission:DiscountRequests": "Rabattanfragen",
"Permission:DiscountManage": "Rabattanfragen verwalten",
"Permission:Disable": "Deaktivieren",
"Permission:Enable": "Aktivieren",
"Permission:EnableSendEmail": "E-Mail-Senden aktivieren",
"Permission:SendEmail": "E-Mail senden",
"Permission:NpmPackages": "NPM-Pakete",
"Permission:NugetPackages": "Nuget-Pakete",
"Permission:Maintenance": "Wartung",
"Permission:Maintain": "Warten",
"Permission:ClearCaches": "Caches leeren",
"Permission:Modules": "Module",
"Permission:Packages": "Pakete",
"Permission:Edit": "Bearbeiten",
"Permission:Delete": "Löschen",
"Permission:Create": "Erstellen",
"Permission:Accounting": "Abrechnung",
"Permission:Accounting:Quotation": "Angebot",
"Permission:Accounting:Invoice": "Rechnung",
"Menu:Organizations": "Organisationen",
"Menu:Accounting": "Abrechnung",
"Menu:Packages": "Pakete",
"Menu:DiscountRequests": "Rabattanfragen",
"NpmPackageDeletionWarningMessage": "Dieses NPM-Paket wird entfernt. Bestätigen Sie das?",
"NugetPackageDeletionWarningMessage": "Dieses Nuget-Paket wird entfernt. Bestägiten Sie das?",
"ModuleDeletionWarningMessage": "Dieses Modul wird entfernt. Bestätigen Sie das?",
"Name": "Name",
"DisplayName": "Anzeigename",
"ShortDescription": "Kurzbeschreibung",
"NameFilter": "Name",
"CreationTime": "Erstellungszeitpunkt",
"IsPro": "Ist pro",
"ShowOnModuleList": "In Modulliste anzeigen",
"EfCoreConfigureMethodName": "Methodenname konfigurieren",
"IsProFilter": "Ist pro",
"ApplicationType": "Anwendungstyp",
"Target": "Ziel",
"TargetFilter": "Ziel",
"ModuleClass": "Modulklasse",
"NugetPackageTarget.DomainShared": "Gemeinsame Domain",
"NugetPackageTarget.Domain": "Domain",
"NugetPackageTarget.Application": "Anwendung",
"NugetPackageTarget.ApplicationContracts": "Anwedungsverträge",
"NugetPackageTarget.HttpApi": "HTTP-API",
"NugetPackageTarget.HttpApiClient": "HTTP-API-Client",
"NugetPackageTarget.Web": "Web",
"NugetPackageTarget.EntityFrameworkCore": "DeleteAllEntityFramework Core",
"NugetPackageTarget.MongoDB": "MongoDB",
"Edit": "Bearbeiten",
"Delete": "Löschen",
"Refresh": "Aktualisieren",
"NpmPackages": "NPM-Pakete",
"NugetPackages": "Nuget-Pakete",
"NpmPackageCount": "NPM-Paketanzahl",
"NugetPackageCount": "Nuget-Paketanzahl",
"Module": "Module",
"ModuleInfo": "Modulinfo",
"CreateANpmPackage": "Erstellen Sie ein NPM Paket",
"CreateAModule": "Erstellen Sie in Modul",
"CreateANugetPackage": "Erstellen Sei ein Nuget-Paket",
"AddNew": "Neu hinzufügen",
"PackageAlreadyExist{0}": "\"{0}\" Paket ist bereits hinzugefügt.",
"ModuleAlreadyExist{0}": "\"{0}\" Modul ist bereits hinzugefügt.",
"ClearCache": "Cache leeren",
"SuccessfullyCleared": "Erfolgreich geleert",
"Menu:NpmPackages": "NPM-Pakete",
"Menu:Modules": "Module",
"Menu:Maintenance": "Wartung",
"Menu:NugetPackages": "Nuget-Pakete",
"CreateAnOrganization": "Erstellen Sie eine Organisation",
"Organizations": "Organisationen",
"LongName": "Lange Name",
"LicenseType": "Lizenztyp",
"MissingLicenseTypeField": "Das Feld Lizenztyp ist erforderlich!",
"LicenseStartTime": "Startzeit der Lizenz",
"LicenseEndTime": "Endzeit der Lizenz",
"AllowedDeveloperCount": "Zulässige Entwickleranzahl",
"UserNameOrEmailAddress": "Benutzername oder E-Mail-Adresse",
"AddOwner": "Besitzer hinzufügen",
"UserName": "Benutzername",
"Email": "E-Mail",
"Developers": "Entwickler",
"AddDeveloper": "Entwickler hinzufügen",
"Create": "Erstellen",
"UserNotFound": "Benutzer nicht gefunden",
"{0}WillBeRemovedFromDevelopers": "{0} wird von den Entwicklern entfernt. Bestätigen Sie das?",
"{0}WillBeRemovedFromOwners": "{0} wird von den Besitzern entfernt. Bestätigen Sie das?",
"Computers": "Computer",
"UniqueComputerId": "Eindeutig Computer-ID",
"LastSeenDate": "Zuletzt gesehenes Datum",
"{0}Computer{1}WillBeRemovedFromRecords": "Computer von {0} ({1}) wird aus den Datensätzen entfernt",
"OrganizationDeletionWarningMessage": "Organisation wird gelöscht",
"DeletingLastOwnerWarningMessage": "Eine Organisation muss zumindest einen Besitzer aufweisen! Daher können Sie diesen Besitzer nicht entfernen",
"This{0}AlreadyExistInThisOrganization": "Dies {0} existiert bereits in dieser Organisation",
"AreYouSureYouWantToDeleteAllComputers": "Sind Sie sicher, dass Sie alle Computer löschen möchten?",
"DeleteAll": "Alles Löschen",
"DoYouWantToCreateNewUser": "Möchten Sie einen neuen Benutzer erstellen?",
"MasterModules": "Master-Module",
"OrganizationName": "Organisationsname",
"CreationDate": "Erstellungsdatum",
"LicenseStartDate": "Startdatum der Lizenz",
"LicenseEndDate": "Enddatum der Lizenz",
"OrganizationNamePlaceholder": "Organisationsname...",
"TotalQuestionCountPlaceholder": "Gesamtzahl der Fragen...",
"RemainingQuestionCountPlaceholder": "Anzahl verbleibender Fragen...",
"LicenseTypePlaceholder": "Lizenztyp...",
"CreationDatePlaceholder": "Erstellungsdatum...",
"LicenseStartDatePlaceholder": "Startdatum der Lizenz...",
"LicenseEndDatePlaceholder": "Enddatum der Lizenz...",
"UsernameOrEmail": "Benutzername oder E-Mail-Adresse",
"UsernameOrEmailPlaceholder": "Benutzername oder E-Mail-Adresse...",
"Member": "Mitglied",
"PurchaseOrderNo": "Bestellnummer",
"QuotationDate": "Angebotsdatum",
"CompanyName": "Firmenname",
"CompanyAddress": "Firmenanschrift",
"Price": "Preis",
"DiscountText": "Rabatttext",
"DiscountQuantity": "Rabattmenge",
"DiscountPrice": "Rabattpreis",
"Quotation": "Angebot",
"ExtraText": "Zusätzlicher Text",
"ExtraAmount": "Zusätzliche Menge",
"DownloadQuotation": "Angebot herunterladen",
"Invoice": "Rechnung",
"TaxNumber": "Steuernummer",
"InvoiceNumber": "Rechnungsnummer",
"InvoiceDate": "Rechnungsdatum",
"InvoiceNote": "Rechnungsnotiz",
"Quantity": "Menge",
"AddProduct": "Produkt hinzufügen",
"AddProductWarning": "Sie müssen ein Produkt hinzufügen!",
"TotalPrice": "Gesamtpreis",
"Generate": "Generieren",
"MissingQuantityField": "Das Feld Menge ist erforderlich!",
"MissingPriceField": "Das Feld Preis ist erforderlich!",
"CodeUsageStatus": "Status",
"Country": "Land",
"DeveloperCount": "Entwickleranzahl",
"RequestCode": "Anfrage-Code",
"WebSite": "Webseite",
"GithubUsername": "Github Benutzername",
"PhoneNumber": "Telefonnummer",
"ProjectDescription": "Projektbeschreibung",
"Referrer": "Referrer",
"DiscountRequests": "Rabattanfrage",
"Copylink": "Link kopieren",
"Disable": "Deaktivieren",
"Enable": "Aktivieren",
"EnableSendEmail": "E-Mail-Senden aktivieren",
"SendEmail": "E-Mail senden",
"SuccessfullyDisabled": "Erfolgreich deaktiviert",
"SuccessfullyEnabled": "Erfolgreich aktiviert",
"EmailSent": "E-Mail gesendet",
"SuccessfullySent": "Erfolgreich gesendet",
"SuccessfullyDeleted": "Erfolgreich gelöscht",
"DiscountRequestDeletionWarningMessage": "Rabattanfrage wird gelöscht",
"BusinessType": "Unternehmensart",
"TotalQuestionCount": "Gesamtzahl der Fragen",
"RemainingQuestionCount": "Anzahl verbleibender Fragen",
"TotalQuestionMustBeGreaterWarningMessage": "TotalQuestionCount muss größer sein als RemainingQuestionCount !",
"QuestionCountsMustBeGreaterThanZero": "TotalQuestionCount und RemainingQuestionCount müssen Null oder größer als Null sein !",
"UnlimitedQuestionCount": "Unbegrenzte Anzahl von Fragen",
"Notes": "Anmerkungen",
"Menu:Community": "Community",
"Menu:Articles": "Beiträge",
"Wait": "Warten",
"Approve": "Genehmigen",
"Reject": "Ablehnen",
"Details": "Details",
"Url": "URL",
"Title": "Titel",
"ContentSource": "Inhaltsquelle",
"Status": "Status",
"ReadArticle": "Beitrag lesen",
"ArticleHasBeenWaiting": "Beitrag hat gewartet",
"ArticleHasBeenApproved": "Beitrag wurde genehmigt",
"ArticleHasBeenRejected": "Beitrag wurde abgelehnt",
"Permission:Community": "Community",
"Permission:CommunityArticle": "Beitrag",
"Link": "Link",
"Enum:ContentSource:0": "Github",
"Enum:ContentSource:1": "Extern",
"Enum:Status:0": "Wartend",
"Enum:Status:1": "Abgelehnt",
"Enum:Status:2": "Genehmigt",
"Summary": "Zusammenfassung",
"AuthorName": "Autorenname",
"CoverImage": "Titelbild",
"RemoveCacheConfirmationMessage": "Sind Sie sicher, dass Sie den Cache für den Artikel \"{0}\" entfernen wollen?",
"SuccessfullyRemoved": "Erfolgreich geleert",
"RemoveCache": "Cache entfernen"
}
}

202
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en-GB.json

@ -0,0 +1,202 @@
{
"culture": "en-GB",
"texts": {
"Permission:Organizations": "Organisations",
"Permission:Manage": "Manage Organisations",
"Permission:DiscountRequests": "Discount Requests",
"Permission:DiscountManage": "Manage Discount Requests",
"Permission:Disable": "Disable",
"Permission:Enable": "Enable",
"Permission:EnableSendEmail": "Enable Send Email",
"Permission:SendEmail": "Send Email",
"Permission:NpmPackages": "NPM Packages",
"Permission:NugetPackages": "Nuget Packages",
"Permission:Maintenance": "Maintenance",
"Permission:Maintain": "Maintain",
"Permission:ClearCaches": "Clear caches",
"Permission:Modules": "Modules",
"Permission:Packages": "Packages",
"Permission:Edit": "Edit",
"Permission:Delete": "Delete",
"Permission:Create": "Create",
"Permission:Accounting": "Accounting",
"Permission:Accounting:Quotation": "Quotation",
"Permission:Accounting:Invoice": "Invoice",
"Menu:Organizations": "Organisations",
"Menu:Accounting": "Accounting",
"Menu:Packages": "Packages",
"Menu:DiscountRequests": "Discount Requests",
"NpmPackageDeletionWarningMessage": "This NPM Package will be deleted. Please confirm this?",
"NugetPackageDeletionWarningMessage": "This Nuget Package will be deleted. Please confirm this?",
"ModuleDeletionWarningMessage": "This Module will be deleted. Please confirm this?",
"Name": "Name",
"DisplayName": "Display name",
"ShortDescription": "Short description",
"NameFilter": "Name",
"CreationTime": "Creation time",
"IsPro": "Is pro",
"ShowOnModuleList": "Show in module list",
"EfCoreConfigureMethodName": "Configure method name",
"IsProFilter": "Is pro",
"ApplicationType": "Application type",
"Target": "Target",
"TargetFilter": "Target",
"ModuleClass": "Module class",
"NugetPackageTarget.DomainShared": "Domain Shared",
"NugetPackageTarget.Domain": "Domain",
"NugetPackageTarget.Application": "Application",
"NugetPackageTarget.ApplicationContracts": "Application Contracts",
"NugetPackageTarget.HttpApi": "Http Api",
"NugetPackageTarget.HttpApiClient": "Http Api Client",
"NugetPackageTarget.Web": "Web",
"NugetPackageTarget.EntityFrameworkCore": "Delete Entity Framework Core",
"NugetPackageTarget.MongoDB": "MongoDB",
"Edit": "Edit",
"Delete": "Delete",
"Refresh": "Refresh",
"NpmPackages": "NPM Packages",
"NugetPackages": "Nuget Packages",
"NpmPackageCount": "NPM Package Count",
"NugetPackageCount": "Nuget Package Count",
"Module": "Modules",
"ModuleInfo": "Module info",
"CreateANpmPackage": "Create a NPM package",
"CreateAModule": "Create a module",
"CreateANugetPackage": "Create a Nuget package",
"AddNew": "Add new",
"PackageAlreadyExist{0}": "\"{0}\" package has already been added.",
"ModuleAlreadyExist{0}": "\"{0}\" module has already been added.",
"ClearCache": "Clear cache",
"SuccessfullyCleared": "Successfully cleared",
"Menu:NpmPackages": "NPM Packages",
"Menu:Modules": "Modules",
"Menu:Maintenance": "Maintenance",
"Menu:NugetPackages": "Nuget Packages",
"CreateAnOrganization": "Create an organisation",
"Organizations": "Organisations",
"LongName": "Long name",
"LicenseType": "License type",
"MissingLicenseTypeField": "The license type field is required!",
"LicenseStartTime": "License start time",
"LicenseEndTime": "License end time",
"AllowedDeveloperCount": "Allowed developer count",
"UserNameOrEmailAddress": "Username or email address",
"AddOwner": "Add owner",
"UserName": "Username",
"Email": "Email",
"Developers": "Developers",
"AddDeveloper": "Add developer",
"Create": "Create",
"UserNotFound": "User not found",
"{0}WillBeRemovedFromDevelopers": "{0} Will be removed from developers, please confirm?",
"{0}WillBeRemovedFromOwners": "{0} Will be removed from owners, please confirm?",
"Computers": "Computers",
"UniqueComputerId": "Unique computer id",
"LastSeenDate": "Last seen date",
"{0}Computer{1}WillBeRemovedFromRecords": "Computer of {0} ({1}) will be removed from records",
"OrganizationDeletionWarningMessage": "Organisation will be deleted",
"DeletingLastOwnerWarningMessage": "An organisation must have at least one owner, therefore you cannot remove this owner",
"This{0}AlreadyExistInThisOrganization": "{0} already exist in this organisation",
"AreYouSureYouWantToDeleteAllComputers": "Are you sure you want to delete all computers?",
"DeleteAll": "Delete all",
"DoYouWantToCreateNewUser": "Do you want to create new user?",
"MasterModules": "Master Modules",
"OrganizationName": "Organisation name",
"CreationDate": "Creation date",
"LicenseStartDate": "License start date",
"LicenseEndDate": "License end date",
"OrganizationNamePlaceholder": "Organisation name...",
"TotalQuestionCountPlaceholder": "Total question count...",
"RemainingQuestionCountPlaceholder": "Remaining question count...",
"LicenseTypePlaceholder": "License type...",
"CreationDatePlaceholder": "Creation date...",
"LicenseStartDatePlaceholder": "License start date...",
"LicenseEndDatePlaceholder": "License end date...",
"UsernameOrEmail": "Username or email",
"UsernameOrEmailPlaceholder": "Username or email...",
"Member": "Member",
"PurchaseOrderNo": "Purchase Order No.",
"QuotationDate": "Quotation date",
"CompanyName": "Company name",
"CompanyAddress": "Company address",
"Price": "Price",
"DiscountText": "Discount text",
"DiscountQuantity": "Discount quantity",
"DiscountPrice": "Discount price",
"Quotation": "Quotation",
"ExtraText": "Extra text",
"ExtraAmount": "Extra Amount",
"DownloadQuotation": "Download Quotation",
"Invoice": "Invoice",
"TaxNumber": "Tax No.",
"InvoiceNumber": "Invoice No.",
"InvoiceDate": "Invoice Date",
"InvoiceNote": "Invoice Note",
"Quantity": "Quantity",
"AddProduct": "Add Product",
"AddProductWarning": "You need to add a Product!",
"TotalPrice": "Total Price",
"Generate": "Generate",
"MissingQuantityField": "The Quantity field is required!",
"MissingPriceField": "The Price field is required!",
"CodeUsageStatus": "Status",
"Country": "Country",
"DeveloperCount": "Developer Count",
"RequestCode": "Request Code",
"WebSite": "Website",
"GithubUsername": "Github Username",
"PhoneNumber": "Phone Number",
"ProjectDescription": "Project Description",
"Referrer": "Referrer",
"DiscountRequests": "Discount Request",
"Copylink": "Copy Link",
"Disable": "Disable",
"Enable": "Enable",
"EnableSendEmail": "Enable Send Email",
"SendEmail": "Send Email",
"SuccessfullyDisabled": "Successfully disabled",
"SuccessfullyEnabled": "Successfully enabled",
"EmailSent": "Email sent",
"SuccessfullySent": "Successfully sent",
"SuccessfullyDeleted": "Successfully deleted",
"DiscountRequestDeletionWarningMessage": "Discount request will be deleted",
"BusinessType": "Business Type",
"TotalQuestionCount": "Total question count",
"RemainingQuestionCount": "Remaining question count",
"TotalQuestionMustBeGreaterWarningMessage": "TotalQuestionCount must be greater than RemainingQuestionCount!",
"QuestionCountsMustBeGreaterThanZero": "TotalQuestionCount and RemainingQuestionCount must be zero or greater than zero!",
"UnlimitedQuestionCount": "Unlimited question count",
"Notes": "Notes",
"Menu:Community": "Community",
"Menu:Articles": "Articles",
"Wait": "Wait",
"Approve": "Approve",
"Reject": "Reject",
"Details": "Details",
"Url": "Url",
"Title": "Title",
"ContentSource": "Content source",
"Status": "Status",
"ReadArticle": "Read article",
"ArticleHasBeenWaiting": "Article has been waiting",
"ArticleHasBeenApproved": "Article has been approved",
"ArticleHasBeenRejected": "Article has been rejected",
"Permission:Community": "Community",
"Permission:CommunityArticle": "Article",
"Link": "Link",
"Enum:ContentSource:0": "Github",
"Enum:ContentSource:1": "External",
"Enum:Status:0": "Waiting",
"Enum:Status:1": "Author name",
"Enum:Status:2": "Approved",
"Summary": "Summary",
"AuthorName": "Author",
"CoverImage": "Cover Image",
"RemoveCacheConfirmationMessage": "Are you sure you want remove the cache for \"{0}\" article?",
"SuccessfullyRemoved": "Successfully cleared",
"RemoveCache": "Remove Cache",
"Language": "Language",
"Optional": "Optional",
"CreateArticleLanguageInfo": "The language in which the article is written"
}
}

12
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json

@ -194,6 +194,14 @@
"CoverImage": "Cover Image", "CoverImage": "Cover Image",
"RemoveCacheConfirmationMessage": "Are you sure you remove the cache for \"{0}\" article?", "RemoveCacheConfirmationMessage": "Are you sure you remove the cache for \"{0}\" article?",
"SuccessfullyRemoved": "Successfully cleared", "SuccessfullyRemoved": "Successfully cleared",
"RemoveCache": "Remove Cache" "RemoveCache": "Remove Cache",
"Language": "Language",
"Optional": "Optional",
"CreateArticleLanguageInfo": "The language in which the post is written",
"Enum:ContentSource:2": "Video Post",
"DeleteCoverImage": "Delete Cover Image",
"DeleteCoverImageConfirmationMessage": "Are you sure you want to delete the cover image for \"{0}\"?",
"DeleteCoverImageSuccessMessage": "Cover image successfully deleted"
} }
} }

199
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/es.json

@ -0,0 +1,199 @@
{
"culture": "es",
"texts": {
"Permission:Organizations": "Organizaciones",
"Permission:Manage": "Gestionar organizaciones",
"Permission:DiscountRequests": "Solicitudes de descuento",
"Permission:DiscountManage": "Gestionar solicitudes de descuento",
"Permission:Disable": "Desactivar",
"Permission:Enable": "Activar",
"Permission:EnableSendEmail": "Activar enviar email",
"Permission:SendEmail": "Enviar email",
"Permission:NpmPackages": "Paquetes NPM",
"Permission:NugetPackages": "Paquetes Nuget",
"Permission:Maintenance": "Mantenimiento",
"Permission:Maintain": "Mantener",
"Permission:ClearCaches": "Borrar cachés",
"Permission:Modules": "Módulos",
"Permission:Packages": "Paquetes",
"Permission:Edit": "Editar",
"Permission:Delete": "Borrar",
"Permission:Create": "Crear",
"Permission:Accounting": "Contabilidad",
"Permission:Accounting:Quotation": "Cotización",
"Permission:Accounting:Invoice": "Factura",
"Menu:Organizations": "Organizaciones",
"Menu:Accounting": "Contabilidad",
"Menu:Packages": "Paquetes",
"Menu:DiscountRequests": "Solicitudes de descuento",
"NpmPackageDeletionWarningMessage": "Este NPM paquete será borrado. ¿Quieres confirmar?",
"NugetPackageDeletionWarningMessage": "Este NPM paquete será borrado. ¿Quieres confirmar?",
"ModuleDeletionWarningMessage": "Este NPM paquete será borrado. ¿Quieres confirmar?",
"Name": "Nombre",
"DisplayName": "Nombre para mostrar",
"ShortDescription": "Descripción corta",
"NameFilter": "Nombre",
"CreationTime": "Fecha de creación",
"IsPro": "Es pro",
"ShowOnModuleList": "Mostrar en la lista de módulos",
"EfCoreConfigureMethodName": "configurar nombre de método",
"IsProFilter": "Es pro",
"ApplicationType": "tipo de aplicación",
"Target": "Destino",
"TargetFilter": "Destino",
"ModuleClass": "Módulo de clase",
"NugetPackageTarget.DomainShared": "Dominio compartido",
"NugetPackageTarget.Domain": "Dominio",
"NugetPackageTarget.Application": "Aplicación",
"NugetPackageTarget.ApplicationContracts": "Contratos de aplicación",
"NugetPackageTarget.HttpApi": "Http Api",
"NugetPackageTarget.HttpApiClient": "Cliente Http Api",
"NugetPackageTarget.Web": "Web",
"NugetPackageTarget.EntityFrameworkCore": "Delete todo EntityFramework Core",
"NugetPackageTarget.MongoDB": "MongoDB",
"Edit": "Editar",
"Delete": "Borrar",
"Refresh": "Refrescar",
"NpmPackages": "Paquetes NPM",
"NugetPackages": "Paquetes Nuget",
"NpmPackageCount": "Número de paquetes NPM",
"NugetPackageCount": "Número de paquetes Nuget",
"Module": "Módulos",
"ModuleInfo": "Info de módulo",
"CreateANpmPackage": "Crear un paquete NPM",
"CreateAModule": "Crear un módulo",
"CreateANugetPackage": "Crear un paquete de Nuget",
"AddNew": "Añadir nuevo",
"PackageAlreadyExist{0}": "\"{0}\" paquete ya se encuentra añadido",
"ModuleAlreadyExist{0}": "\"{0}\" módulo ya se encuentra añadido.",
"ClearCache": "Borrar caché",
"SuccessfullyCleared": "Borrado satisfactoriamente",
"Menu:NpmPackages": "Paquetes de NPM",
"Menu:Modules": "Módulos",
"Menu:Maintenance": "Mantenimiento",
"Menu:NugetPackages": "Paquetes Nuget",
"CreateAnOrganization": "Crear una organización",
"Organizations": "Organizaciones",
"LongName": "Nombre largo",
"LicenseType": "Tipo de licencia",
"MissingLicenseTypeField": "El campo tipo de licencia es requerido!",
"LicenseStartTime": "Fecha de inicio de licencia",
"LicenseEndTime": "Fecha de caducidad de licencia",
"AllowedDeveloperCount": "Número de desarrolladores permitidos",
"UserNameOrEmailAddress": "Nombre de usuario o",
"AddOwner": "Añadir propietario",
"UserName": "Nombre de usuario",
"Email": "Email",
"Developers": "Desarrolladores",
"AddDeveloper": "Añadir desarrollador",
"Create": "Crear",
"UserNotFound": "Usuario no encontrado",
"{0}WillBeRemovedFromDevelopers": "{0} será eliminado de desarrolladores, ¿deseas continuar?",
"{0}WillBeRemovedFromOwners": "{0} será eliminado de propietarios, ¿deseas continuar?",
"Computers": "Ordenadores",
"UniqueComputerId": "Id única de ordenador",
"LastSeenDate": "Fecha de visto por última vez",
"{0}Computer{1}WillBeRemovedFromRecords": "El ordenador {0} ({1}) será eliminado de los registros",
"OrganizationDeletionWarningMessage": "La organización será eliminada",
"DeletingLastOwnerWarningMessage": "Una organización debe tener al menos un propietario!. Por lo tanto, tu no puedes eliminar este propietario",
"This{0}AlreadyExistInThisOrganization": "Este/a {0} ya existe en esta organización",
"AreYouSureYouWantToDeleteAllComputers": "Estás seguro tu quieres eliminar todos los ordenadores",
"DeleteAll": "Eliminar todo",
"DoYouWantToCreateNewUser": "¿Quieres crear un nuevo usuario?",
"MasterModules": "Módulos maestros",
"OrganizationName": "Nombre de organización",
"CreationDate": "Fecha de creación",
"LicenseStartDate": "Fecha de inicio de licencia",
"LicenseEndDate": "Fecha de caducidad de licencia",
"OrganizationNamePlaceholder": "Nombre de organización...",
"TotalQuestionCountPlaceholder": "Número total de preguntas...",
"RemainingQuestionCountPlaceholder": "Número de preguntas pendientes",
"LicenseTypePlaceholder": "Tipo de licencia...",
"CreationDatePlaceholder": "Fecha de creación...",
"LicenseStartDatePlaceholder": "Fecha de inicio de licencia...",
"LicenseEndDatePlaceholder": "Fecha de caducidad de licencia...",
"UsernameOrEmail": "Usuario o email",
"UsernameOrEmailPlaceholder": "Usuario o email...",
"Member": "Miembro",
"PurchaseOrderNo": "Número de orden de compra",
"QuotationDate": "Fecha de presupuesto",
"CompanyName": "Nombre de empresa",
"CompanyAddress": "Dirección de empresa",
"Price": "Precio",
"DiscountText": "Texto de descuento",
"DiscountQuantity": "Cantidad de descuento",
"DiscountPrice": "Precio de descuento",
"Quotation": "Presupuesto",
"ExtraText": "Texto extra",
"ExtraAmount": "Cantidad extra",
"DownloadQuotation": "Descarga el presupuesto",
"Invoice": "Factura",
"TaxNumber": "Identificación fiscal",
"InvoiceNumber": "Número de factura",
"InvoiceDate": "Fecha de factura",
"InvoiceNote": "Nota de factura",
"Quantity": "Cantidad",
"AddProduct": "Añadir producto",
"AddProductWarning": "Tu necesitas añadir un producto!",
"TotalPrice": "Precio total",
"Generate": "Generar",
"MissingQuantityField": "El campo cantidad es requerido!",
"MissingPriceField": "El campo precio es requerido!",
"CodeUsageStatus": "Estado",
"Country": "País",
"DeveloperCount": "Cuentas de desarrollo",
"RequestCode": "Solicitud de código",
"WebSite": "Sitio web",
"GithubUsername": "Nombre de usuario Github",
"PhoneNumber": "Número de teléfono",
"ProjectDescription": "Descripción del proyecto",
"Referrer": "Referente",
"DiscountRequests": "Solicitud de descuento",
"Copylink": "Copiar Link",
"Disable": "Deshabilitar",
"Enable": "Habilitar",
"EnableSendEmail": "Habilitar el envío de Email",
"SendEmail": "Enviar Email",
"SuccessfullyDisabled": "Deshabilitado correctamente",
"SuccessfullyEnabled": "Habilitado correctamente",
"EmailSent": "Email enviado",
"SuccessfullySent": "Enviado correctamente",
"SuccessfullyDeleted": "Borrado correctamente",
"DiscountRequestDeletionWarningMessage": "La solicitud de descuento será borrada",
"BusinessType": "Tipo de negocio",
"TotalQuestionCount": "Número total de preguntas",
"RemainingQuestionCount": "Número de preguntas restantes",
"TotalQuestionMustBeGreaterWarningMessage": "TotalQuestionCount debe ser mayor que RemainingQuestionCount !",
"QuestionCountsMustBeGreaterThanZero": "TotalQuestionCount y RemainingQuestionCount debe ser cero o más grande que cero !",
"UnlimitedQuestionCount": "Número de preguntas ilimitadas",
"Notes": "Notas",
"Menu:Community": "Comunidad",
"Menu:Articles": "Artículos",
"Wait": "Esperar",
"Approve": "Aprobar",
"Reject": "Rechazar",
"Details": "Detalles",
"Url": "Url",
"Title": "Título",
"ContentSource": "Fuente de contenido",
"Status": "Estado",
"ReadArticle": "Leer artículo",
"ArticleHasBeenWaiting": "El artículo ha sido puesto en espera",
"ArticleHasBeenApproved": "El artículo ha sido aprobado",
"ArticleHasBeenRejected": "El artículo ha sido rechazado",
"Permission:Community": "Comunidad",
"Permission:CommunityArticle": "Artículo",
"Link": "Link",
"Enum:ContentSource:0": "Github",
"Enum:ContentSource:1": "Externo",
"Enum:Status:0": "En espera",
"Enum:Status:1": "Rechazado",
"Enum:Status:2": "Aprobado",
"Summary": "Resumen",
"AuthorName": "Nombre del autor",
"CoverImage": "Imagen de portada",
"RemoveCacheConfirmationMessage": "¿Estás seguro que quieres borrar la caché para \"{0}\" artículo?",
"SuccessfullyRemoved": "Borrada correctamente",
"RemoveCache": ""
}
}

9
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json

@ -156,6 +156,13 @@
"RemainingQuestionCount": "Kalan soru sayısı", "RemainingQuestionCount": "Kalan soru sayısı",
"TotalQuestionMustBeGreaterWarningMessage": "Toplam soru sayısı kalan soru sayısından büyük olmalıdır!", "TotalQuestionMustBeGreaterWarningMessage": "Toplam soru sayısı kalan soru sayısından büyük olmalıdır!",
"QuestionCountsMustBeGreaterThanZero": "Toplam soru sayısı ve kalan soru sayısı sıfır veya sıfırdan daha büyük olmalıdır!", "QuestionCountsMustBeGreaterThanZero": "Toplam soru sayısı ve kalan soru sayısı sıfır veya sıfırdan daha büyük olmalıdır!",
"UnlimitedQuestionCount": "Sınırsız soru sayısı" "UnlimitedQuestionCount": "Sınırsız soru sayısı",
"Language": "Dil",
"Optional": "Opsiyonel",
"CreateArticleLanguageInfo": "Makalenin yazıldığı dil",
"Enum:ContentSource:2": "Video İçerik",
"DeleteCoverImage": "Kapak Fotoğrafını Sil",
"DeleteCoverImageConfirmationMessage": "Kapak fotoğrafını \"{0}\" isimli makale için silmek istediğinize emin misiniz?",
"DeleteCoverImageSuccessMessage": "Kapak fotoğrafı başarılı bir şekilde silinmiştir"
} }
} }

33
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/de-DE.json

@ -0,0 +1,33 @@
{
"culture": "de-DE",
"texts": {
"Volo.AbpIo.Domain:010004": "Maximale Mitgliederanzahl erreicht!",
"Volo.AbpIo.Domain:010005": "Miximale Besizeranzahl erreicht!",
"Volo.AbpIo.Domain:010006": "Dieser Benutzer ist bereits ein Besitzer in dieser Organisation!",
"Volo.AbpIo.Domain:010007": "Dieser Benutzer ist bereits ein Entwickler in dieser Organisation!",
"Volo.AbpIo.Domain:010008": "Die zulässige Entwickleranzahl darf nicht geringer sein als die aktuelle Entwickleranzahl!",
"Volo.AbpIo.Domain:010009": "Die zulässige Entwickleranzahl darf nicht kleiner als 0 sein!",
"Volo.AbpIo.Domain:010010": "Die maximale Anzahl der Mac-Adressen ist überschritten!",
"Volo.AbpIo.Domain:010011": "Die persönliche Lizenz kann nicht mehr als 1 Entwickler haben!",
"Volo.AbpIo.Domain:010012": "Die Lizenz kann nicht einen Monat nach Ablauf der Lizenz verlängert werden!",
"Volo.AbpIo.Domain:020001": "Dieses NPM-Paket konnte nicht gelöscht werden, da \"{NugetPackages}\" Nuget-Pakete von diesem Paket abhängig sind.",
"Volo.AbpIo.Domain:020002": "Dieses NPM-Paket konnte nicht gelöscht werden, da \"{Module}\" Module dieses Paket verwenden.",
"Volo.AbpIo.Domain:020003": "Dieses NPM-Paket konnte nicht gelöscht werden, da \"{Module}\" Module dieses Paket verwenden und \"{NugetPackages}\" Nuget-Pakete von diesem Paket abhängig sind.",
"Volo.AbpIo.Domain:020004": "Dieses Nuget-Paket konnte nicht gelöscht werden, da \"{Module}\" Module dieses Paket verwenden.",
"WantToLearn?": "Wollen Sie sich einlernen?",
"ReadyToGetStarted?": "Bereit anzufangen?",
"JoinOurCommunity": "Tritt unserer Community bei",
"GetStartedUpper": "LOSLEGEN",
"ForkMeOnGitHub": "Fork me on GitHub",
"Features": "Features",
"GetStarted": "Loslegen",
"Documents": "Unterlagen",
"Community": "Community",
"ContributionGuide": "Leitfaden für Mitwirkende",
"Blog": "Blog",
"Commercial": "Commercial",
"MyAccount": "Mein Benutzerkonto",
"SeeDocuments": "Siehe Unterlagen",
"Samples": "Beispiele"
}
}

35
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json

@ -0,0 +1,35 @@
{
"culture": "en-GB",
"texts": {
"Volo.AbpIo.Domain:010004": "Maximum member count reached!",
"Volo.AbpIo.Domain:010005": "Maximum owner count reached!",
"Volo.AbpIo.Domain:010006": "This user is already an owner in this organisation!",
"Volo.AbpIo.Domain:010007": "This user is already a developer in this organisation!",
"Volo.AbpIo.Domain:010008": "Allowed Developer Count can not be less then current developer count!",
"Volo.AbpIo.Domain:010009": "Allowed Developer Count can not be less then 0!",
"Volo.AbpIo.Domain:010010": "Maximum mac address count has been exceeded!",
"Volo.AbpIo.Domain:010011": "Personal license can't have more than 1 developer!",
"Volo.AbpIo.Domain:010012": "License can't be extended one month after license expires!",
"Volo.AbpIo.Domain:020001": "Couldn't delete this NPM Package because \"{NugetPackages}\" Nuget Packages are dependent to this package.",
"Volo.AbpIo.Domain:020002": "Couldn't delete this NPM Package because \"{Modules}\" Modules are using this package.",
"Volo.AbpIo.Domain:020003": "Couldn't delete this NPM Package because \"{Modules}\" Modules are using this package and \"{NugetPackages}\" Nuget Packages are dependent to this package.",
"Volo.AbpIo.Domain:020004": "Couldn't delete this Nuget Package because \"{Modules}\" Modules are using this package.",
"WantToLearn?": "Want to learn?",
"ReadyToGetStarted?": "Ready to get started?",
"JoinOurCommunity": "Join our community",
"GetStartedUpper": "GET STARTED",
"ForkMeOnGitHub": "Fork me on GitHub",
"Features": "Features",
"GetStarted": "Get Started",
"Documents": "Documents",
"Community": "Community",
"ContributionGuide": "Contribution Guide",
"Blog": "Blog",
"Commercial": "Commercial",
"MyAccount": "My account",
"Permission:License": "License",
"Permission:UserInfo": "User info",
"SeeDocuments": "See Documents",
"Samples": "Samples"
}
}

2
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json

@ -27,6 +27,8 @@
"Blog": "Blog", "Blog": "Blog",
"Commercial": "Commercial", "Commercial": "Commercial",
"MyAccount": "My account", "MyAccount": "My account",
"Permission:License": "License",
"Permission:UserInfo": "Usere info",
"SeeDocuments": "See Documents", "SeeDocuments": "See Documents",
"Samples": "Samples" "Samples": "Samples"
} }

33
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/es.json

@ -0,0 +1,33 @@
{
"culture": "es",
"texts": {
"Volo.AbpIo.Domain:010004": "Número máximo de miembros alcanzado!",
"Volo.AbpIo.Domain:010005": "Número máximo de propietarios alcanzado!",
"Volo.AbpIo.Domain:010006": "Este usuario ya es un propietario de esta organización!",
"Volo.AbpIo.Domain:010007": "Este usuario ya es un desarrollador en este organización!",
"Volo.AbpIo.Domain:010008": "Número de desarrolladores permitido no puede ser menor que el número actual de desarrolladores!",
"Volo.AbpIo.Domain:010009": "El número de desarrolladores no puede ser menor que cero!",
"Volo.AbpIo.Domain:010010": "Número máximo de dirección mac excedido!",
"Volo.AbpIo.Domain:010011": "Una licencia personal no puede tener más de un desarrollador!",
"Volo.AbpIo.Domain:010012": "La licencia no puede ser extendida un mes despues de que expire!",
"Volo.AbpIo.Domain:020001": "Este paquete NPM no pudo ser borrado porque \"{NugetPackages}\" paquetes Nuget son dependientes de este paquete.",
"Volo.AbpIo.Domain:020002": "Este paquete NPM no pudo ser borrado porque \"{Modules}\" modulos están usando este paquete.",
"Volo.AbpIo.Domain:020003": "Este paquete NPM no pudo ser borrado porque \"{Modules}\" modulos están usando este paquete.y \"{NugetPackages}\" paquetes Nuget son dependientes de este paquete.",
"Volo.AbpIo.Domain:020004": "Este paquete Nuget no pudo ser borrado porque \"{Modules}\" modulos están usando este paquete.",
"WantToLearn?": "¿Quieres aprender?",
"ReadyToGetStarted?": "¿Preparado para comenzar?",
"JoinOurCommunity": "Unete a nuestra comunidad",
"GetStartedUpper": "COMENZAR",
"ForkMeOnGitHub": "Fork en GitHub",
"Features": "Características",
"GetStarted": "Comenzar",
"Documents": "Documentos",
"Community": "Comunidad",
"ContributionGuide": "Guia de contribución",
"Blog": "Blog",
"Commercial": "Comercial",
"MyAccount": "Mi cuenta",
"SeeDocuments": "Ver documentos",
"Samples": "Ejemplos"
}
}

2
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json

@ -27,6 +27,8 @@
"Blog": "博客", "Blog": "博客",
"Commercial": "商业版", "Commercial": "商业版",
"MyAccount": "我的账户", "MyAccount": "我的账户",
"Permission:License": "许可",
"Permission:UserInfo": "用户信息",
"SeeDocuments": "查看文档", "SeeDocuments": "查看文档",
"Samples": "示例" "Samples": "示例"
} }

35
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de-DE.json

@ -0,0 +1,35 @@
{
"culture": "de-DE",
"texts": {
"OrganizationManagement": "Organisationsverwaltung",
"OrganizationList": "Organisationsauflistung",
"Volo.AbpIo.Commercial:010003": "Sie sind der Besitzer dieser Organisation!",
"OrganizationNotFoundMessage": "Keine Organisation gefunden!",
"DeveloperCount": "Zugeordnete / Gesamte Entwickler",
"QuestionCount": "Verbleibende / Gesamte Fragen",
"Unlimited": "Unbegrenzt",
"Owners": "Besitzer",
"AddMember": "Mitglied hinzufügen",
"AddOwner": "Besizer hinzufügen",
"AddDeveloper": "Entwickler hinzufügen",
"UserName": "Benutzername",
"Name": "Name",
"EmailAddress": "E-Mail-Adress",
"Developers": "Entwickler",
"LicenseType": "Lizenztyp",
"Manage": "Verwalten",
"StartDate": "Startdatum",
"EndDate": "Enddatum",
"Modules": "Module",
"LicenseExtendMessage": "Ihr Lizenzenddatum wird auf {0} verlängert",
"LicenseUpgradeMessage": "Ihre Lizenz wird auf {0} aktualisiert",
"LicenseAddDeveloperMessage": "{0} Entwickler zu Ihrer Lizenz hinzugefügt",
"Volo.AbpIo.Commercial:010004": "Kann den angegebenen Benutzer nicht finden! Der Benutzer muss sich bereits registriert haben.",
"MyOrganizations": "Meine Organisationen",
"ApiKey": "API-Schlüssel",
"UserNameNotFound": "Es gibt keinen Benutzer mit dem Benutzernamen {0}",
"SuccessfullyAddedToNewsletter": "Vielen Dank, dass Sie unseren Newsletter abonniert haben!",
"MyProfile": "Mein Profil",
"EmailNotValid": "Bitte geben Sie eine gültige E-Mail-Adresse ein."
}
}

39
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json

@ -0,0 +1,39 @@
{
"culture": "en-GB",
"texts": {
"OrganizationManagement": "Organisation Management",
"OrganizationList": "Organisation list",
"Volo.AbpIo.Commercial:010003": "You are not owner of this organisation!",
"OrganizationNotFoundMessage": "Organisation not found!",
"DeveloperCount": "Allocated / total developers",
"QuestionCount": "Remaining / total questions",
"Unlimited": "Unlimited",
"Owners": "Owners",
"AddMember": "Add member",
"AddOwner": "Add owner",
"AddDeveloper": "Add developer",
"UserName": "Username",
"Name": "Name",
"EmailAddress": "Email address",
"Developers": "Developers",
"LicenseType": "License type",
"Manage": "Manage",
"StartDate": "Start date",
"EndDate": "End date",
"Modules": "Modules",
"LicenseExtendMessage": "Your license end date is extended to {0}",
"LicenseUpgradeMessage": "Your license is upgraded to {0}",
"LicenseAddDeveloperMessage": "{0} developers added to your license",
"Volo.AbpIo.Commercial:010004": "Cannot find the specified user! The user must have already registered.",
"MyOrganizations": "My organisations",
"ApiKey": "API key",
"UserNameNotFound": "There is no user with username {0}",
"SuccessfullyAddedToNewsletter": "Thank you for subscribing to our newsletter!",
"MyProfile": "My Profile",
"EmailNotValid": "Please enter a valid email address.",
"JoinOurMarketingNewsletter": "Join our marketing newsletter",
"WouldLikeToReceiveMarketingMaterials": "I would like to receive marketing materials e.g. product deals & special offers.",
"StartUsingYourLicenseNow": "Start using your license now!",
"WelcomePage": "Welcome Page"
}
}

6
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json

@ -30,6 +30,10 @@
"UserNameNotFound": "There is no user with username {0}", "UserNameNotFound": "There is no user with username {0}",
"SuccessfullyAddedToNewsletter": "Thanks you for subscribing to our newsletter!", "SuccessfullyAddedToNewsletter": "Thanks you for subscribing to our newsletter!",
"MyProfile": "My profile", "MyProfile": "My profile",
"EmailNotValid": "Please enter a valid email address." "EmailNotValid": "Please enter a valid email address.",
"JoinOurMarketingNewsletter": "Join our marketing newsletter",
"WouldLikeToReceiveMarketingMaterials": "I would like to receive marketing materials like product deals & special offers.",
"StartUsingYourLicenseNow": "Start using your license now!",
"WelcomePage": "Welcome Page"
} }
} }

35
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json

@ -0,0 +1,35 @@
{
"culture": "es",
"texts": {
"OrganizationManagement": "Gestión de la organización",
"OrganizationList": "Lista organización",
"Volo.AbpIo.Commercial:010003": "Tu no eres el propietario de esta organización!",
"OrganizationNotFoundMessage": "Organización no encontrada!",
"DeveloperCount": "Total desarrolladores asignados",
"QuestionCount": "Total de preguntas restantes",
"Unlimited": "Ilimitado",
"Owners": "Propietarios",
"AddMember": "Añadir miembro",
"AddOwner": "Añadir propietario",
"AddDeveloper": "Añadir desarrollador",
"UserName": "Nombre de usuario",
"Name": "Nombre",
"EmailAddress": "Dirección de Email",
"Developers": "Desarrolladores",
"LicenseType": "Tipo de licencia",
"Manage": "Gestionar",
"StartDate": "Fecha de inicio",
"EndDate": "Fecha de fin",
"Modules": "Módulos",
"LicenseExtendMessage": "Tu fecha de finalización de tu licencia ha sido extendido a {0}",
"LicenseUpgradeMessage": "Tu licencia esta actualizada a {0}",
"LicenseAddDeveloperMessage": "{0} desarrolladores añadidos a tu licencia",
"Volo.AbpIo.Commercial:010004": "No se pudo encontrar el usuario especificado. El usuario debe estar ya registrado.",
"MyOrganizations": "Mis organizaciones",
"ApiKey": "API Key",
"UserNameNotFound": "No hay un usuario con el nombre de usuario {0}",
"SuccessfullyAddedToNewsletter": "Gracias por suscribirte a nuestro boletín de noticias!",
"MyProfile": "Mi perfil",
"EmailNotValid": "Por favor, introduce una dirección de email válida."
}
}

8
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json

@ -28,8 +28,12 @@
"MyOrganizations": "我的组织", "MyOrganizations": "我的组织",
"ApiKey": "API key", "ApiKey": "API key",
"UserNameNotFound": "没有用户名为{0}的用户", "UserNameNotFound": "没有用户名为{0}的用户",
"SuccessfullyAddedToNewsletter": "感谢你订阅我们的新闻通讯!", "SuccessfullyAddedToNewsletter": "感谢你订阅我们的新闻简讯!",
"MyProfile": "我的资料", "MyProfile": "我的资料",
"EmailNotValid": "请输入有效的电子邮件地址" "EmailNotValid": "请输入有效的电子邮件地址",
"JoinOurMarketingNewsletter": "加入我们的营销简讯",
"WouldLikeToReceiveMarketingMaterials": "我想收到市场营销资料,例如产品交易和特别优惠.",
"StartUsingYourLicenseNow": "立即开始使用你的许可证",
"WelcomePage": "欢迎页面"
} }
} }

90
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/de-DE.json

@ -0,0 +1,90 @@
{
"culture": "de-DE",
"texts": {
"Permission:CommunityArticle": "Community-Beitrag",
"Permission:Edit": "Bearbeiten",
"Waiting": "Wartend",
"Approved": "Genehmigt",
"Rejected": "Abgelehnt",
"Wait": "Warten",
"Approve": "Genehmigen",
"Reject": "Ablehnen",
"ReadArticle": "Beitrag lesen",
"Status": "Status",
"ContentSource": "Inhaltsquelle",
"Details": "Details",
"Url": "URL",
"Title": "Titel",
"CreationTime": "Erstellungszeitpunkt",
"Save": "Speichern",
"SameUrlAlreadyExist": "Dieselbe URL existiert bereits, wenn Sie diesen Beitrag hinzufügen möchten, sollten Sie die URL ändern!",
"UrlIsNotValid": "Der URL ist nicht korrekt.",
"UrlNotFound": "URL nicht gefunden.",
"UrlContentNotFound": "URL-Inhalt nicht gefunden",
"Summary": "Zusammenfassung",
"MostRead": "Meist gelesen",
"Latest": "Neueste",
"ContributeAbpCommunity": "Tragen Sie zur ABP Community bei",
"SubmitYourArticle": "Reichen Sie Ihren Beitrag ein",
"ContributionGuide": "Leitfaden für Mitwirkende",
"BugReport": "Fehler melden",
"SeeAllArticles": "Alle Beiträge anzeigen",
"WelcomeToABPCommunity!": "Willkommen in der ABP Community!",
"MyProfile": "Mein Profil",
"MyOrganizations": "Meine Organisationen",
"EmailNotValid": "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
"FeatureRequest": "Featureanfrage",
"CreateArticleTitleInfo": "Titel des Beitrags, der in der Beitragsliste angezeigt werden soll.",
"CreateArticleUrlInfo": "Original GitHub-/externe URL des Beitrags.",
"CreateArticleSummaryInfo": "Eine kurze Zusammenfassung des Beitrags, der in der Beitragsliste angezeigt werden soll.",
"CreateArticleCoverInfo": "Fügen Sie zum Erstellen eines effektiven Beitrags ein Titelbild hinzu. Laden Sie Bilder mit einem Seitenverhältnis von 16: 9 hoch, um die beste Ansicht zu erhalten.",
"ThisExtensionIsNotAllowed": "Diese Erweiterung ist nicht zulässig.",
"TheFileIsTooLarge": "Die Datei ist zu groß.",
"GoToTheArticle": "Gehe zum Beitrag",
"Contribute": "Beitragen",
"OverallProgress": "Gesamtfortschritt",
"Done": "Fertig",
"Open": "Offen",
"Closed": "Geschlossen",
"LatestQuestionOnThe": "Letzte Frage zum",
"Stackoverflow": "Stackoverflow",
"Votes": "Stimmen",
"Answer": "Antwort",
"Views": "Ansichten",
"Answered": "Beantwortet",
"WaitingForYourAnswer": "Warten auf Ihre Antwort",
"Asked": "gefragt",
"AllQuestions": "Alle Fragen",
"NextVersion": "Nächste Version",
"MilestoneErrorMessage": "Die aktuellen Meilensteindetails konnten von Github nicht abgerufen werden.",
"QuestionItemErrorMessage": "Die neuesten Fragendetails konnten von Stackoverflow nicht abgerufen werden.",
"Oops": "Hoppla!",
"CreateArticleSuccessMessage": "Der Beitrag wurde erfolgreich eingereicht. Er wird nach einer Überprüfung durch den Site-Administrator veröffentlicht.",
"ChooseCoverImage": "Ein Titelbild auswählen...",
"CoverImage": "Titelbild",
"ShareYourExperiencesWithTheABPFramework": "Ihre Erfahrungen mit dem ABP Framework teilen!",
"Optional": "Optional",
"UpdateUserWebSiteInfo": "Beispiel: https://johndoe.com",
"UpdateUserTwitterInfo": "Beispiel: johndoe",
"UpdateUserGithubInfo": "Beispiel: johndoe",
"UpdateUserLinkedinInfo": "Beispiel: https://www.linkedin.com/...",
"UpdateUserCompanyInfo": "Beispiel: Volosoft",
"UpdateUserJobTitleInfo": "Beispiel: Software Developer",
"UserName": "Benutzername",
"Company": "Firma",
"PersonalWebsite": "Persönliche Website",
"RegistrationDate": "Registrierungsdatum",
"Social": "Social",
"Biography": "Biographie",
"HasNoPublishedArticlesYet": "hat noch keine Beiträge veröffentlicht",
"Author": "Autor",
"LatestGithubAnnouncements": "Neueste Github-Ankündigungen",
"SeeAllAnnouncements": "Alle Ankündigungen anzeigen",
"LatestBlogPost": "Letzter Blog-Beitrag",
"Edit": "Bearbeiten",
"ProfileImageChange": "Ändern Sie das Profilbild",
"BlogItemErrorMessage": "Die neuesten Blogpost-Details konnten nicht abgerufen werden.",
"PlannedReleaseDate": "Geplantes Erscheinungsdatum",
"CommunityArticleRequestErrorMessage": "Die Anfrage nach den neuesten Beiträgen von Github konnte nicht abgerufen werden."
}
}

106
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en-GB.json

@ -0,0 +1,106 @@
{
"culture": "en-GB",
"texts": {
"Permission:CommunityArticle": "Community Article",
"Permission:Edit": "Edit",
"Waiting": "Waiting",
"Approved": "Approved",
"Rejected": "Rejected",
"Wait": "Wait",
"Approve": "Approve",
"Reject": "Reject",
"ReadArticle": "Read Article",
"Status": "Status",
"ContentSource": "Content Source",
"Details": "Details",
"Url": "Url",
"Title": "Title",
"CreationTime": "Creation time",
"Save": "Save",
"SameUrlAlreadyExist": "The Url already exists. If you want to add this article, you should change the url!",
"UrlIsNotValid": "Url is not valid.",
"UrlNotFound": "Url not found.",
"UrlContentNotFound": "Url content not found.",
"Summary": "Summary",
"MostRead": "Most Read",
"Latest": "Latest",
"ContributeAbpCommunity": "Contribute to the ABP Community",
"SubmitYourArticle": "Submit Your Article",
"ContributionGuide": "Contribution Guide",
"BugReport": "Bug Report",
"SeeAllArticles": "See All Articles",
"WelcomeToABPCommunity!": "Welcome to the ABP Community!",
"MyProfile": "My Profile",
"MyOrganizations": "My Organisations",
"EmailNotValid": "Please enter a valid email address.",
"FeatureRequest": "Feature Request",
"CreateArticleTitleInfo": "Title of the article to be shown on the article list.",
"CreateArticleUrlInfo": "Original GitHub/External URL of the article.",
"CreateArticleSummaryInfo": "A short summary of the article to be shown on the article list.",
"CreateArticleCoverInfo": "To create an effective article, add a cover photo and an upload 16:9 aspect ratio pictures for the best view (Maximum file size: 1MB)",
"ThisExtensionIsNotAllowed": "The extension is not allowed.",
"TheFileIsTooLarge": "The file is too large.",
"GoToTheArticle": "Go to the Article",
"Contribute": "Contribute",
"OverallProgress": "Overall Progress",
"Done": "Done",
"Open": "Open",
"Closed": "Closed",
"LatestQuestionOnThe": "Latest Question on the",
"Stackoverflow": "Stackoverflow",
"Votes": "votes",
"Answer": "Answer",
"Views": "views",
"Answered": "Answered",
"WaitingForYourAnswer": "Waiting for your answer",
"Asked": "asked",
"AllQuestions": "All Questions",
"NextVersion": "Next Version",
"MilestoneErrorMessage": "Couldn't get the current milestone details from Github.",
"QuestionItemErrorMessage": "Couldn't get the latest question details from Stackoverflow.",
"Oops": "Oops!",
"CreateArticleSuccessMessage": "The Article has been successfully submitted. It will be published once it has been reviewed by the site admin.",
"ChooseCoverImage": "Choose a cover image...",
"CoverImage": "Cover Image",
"ShareYourExperiencesWithTheABPFramework": "Share your experiences with the ABP Framework!",
"Optional": "Optional",
"UpdateUserWebSiteInfo": "Example: https://johndoe.com",
"UpdateUserTwitterInfo": "Example: johndoe",
"UpdateUserGithubInfo": "Example: johndoe",
"UpdateUserLinkedinInfo": "Example: https://www.linkedin.com/...",
"UpdateUserCompanyInfo": "Example: Volosoft",
"UpdateUserJobTitleInfo": "Example: Software Developer",
"UserName": "UserName",
"Company": "Company",
"PersonalWebsite": "Personal website",
"RegistrationDate": "Registration date",
"Social": "Social",
"Biography": "Biography",
"HasNoPublishedArticlesYet": "has no published articles yet",
"Author": "Author",
"LatestGithubAnnouncements": "Latest GitHub Announcements",
"SeeAllAnnouncements": "View all Announcements",
"LatestBlogPost": "Latest Blog Post",
"Edit": "Edit",
"ProfileImageChange": "Change the profile image",
"BlogItemErrorMessage": "Couldn't get the latest blog post details from ABP.",
"PlannedReleaseDate": "Planned release date",
"CommunityArticleRequestErrorMessage": "Couldn't get the latest article request from GitHub.",
"ArticleRequestFromGithubIssue": "There aren't any article requests at the moment.",
"LatestArticles": "Latest Articles",
"ArticleRequests": "Article Requests",
"AllArticleRequests": "See all Article requests",
"SubscribeToTheNewsletter": "Subscribe to the Newsletter",
"NewsletterEmailDefinition": "Receive information about what's happening in ABP; new releases, free sources, articles, and more.",
"NoThanks": "No thanks",
"MaybeLater": "Maybe later",
"JoinOurArticleNewsletter": "Join our article newsletter",
"Community": "Community",
"Marketing": "Marketing",
"CommunityPrivacyPolicyConfirmation": "I agree to the Terms & Conditions and <a href=\"https://commercial.abp.io/Privacy\">Privacy Policy</a>.",
"ArticleRequestMessageTitle": "<a href=\"https://github.com/abpframework/abp/issues/new\">Open an issue</a> on the GitHub to request an article/tutorial you want to see on this web site.",
"ArticleRequestMessageBody": "Here is the list of the requested articles by the Community. Do you want to write a requested article? Please click on the request and join the discussion.",
"Language": "Language",
"CreateArticleLanguageInfo": "The language in which the article is written"
}
}

61
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json

@ -25,19 +25,18 @@
"MostRead": "Most Read", "MostRead": "Most Read",
"Latest": "Latest", "Latest": "Latest",
"ContributeAbpCommunity": "Contribute to the ABP Community", "ContributeAbpCommunity": "Contribute to the ABP Community",
"SubmitYourArticle": "Submit Your Article", "SubmitYourArticle": "Submit Your Post",
"ContributionGuide": "Contribution Guide", "ContributionGuide": "Contribution Guide",
"BugReport": "Bug Report", "BugReport": "Bug Report",
"SeeAllArticles": "See All Articles", "SeeAllArticles": "See All Posts",
"WelcomeToABPCommunity!": "Welcome to the ABP Community!", "WelcomeToABPCommunity!": "Welcome to the ABP Community!",
"MyProfile": "My profile", "MyProfile": "My profile",
"MyOrganizations": "My organizations", "MyOrganizations": "My organizations",
"EmailNotValid": "Please enter a valid email address.", "EmailNotValid": "Please enter a valid email address.",
"FeatureRequest": "Feature Request", "FeatureRequest": "Feature Request",
"CreateArticleTitleInfo": "Title of the article to be shown on the article list.", "CreateArticleTitleInfo": "Title of the post to be shown on the post list.",
"CreateArticleUrlInfo": "Original GitHub/External URL of the article.", "CreateArticleSummaryInfo": "A short summary of the post to be shown on the post list.",
"CreateArticleSummaryInfo": "A short summary of the article to be shown on the article list.", "CreateArticleCoverInfo": "For creating an effective article, add a cover photo. Upload 16:9 aspect ratio pictures for the best view. Maximum file size: 1MB.",
"CreateArticleCoverInfo": "For creating an effective article, add a cover photo. Upload 16:9 aspect ratio pictures for the best view.",
"ThisExtensionIsNotAllowed": "This extension is not allowed.", "ThisExtensionIsNotAllowed": "This extension is not allowed.",
"TheFileIsTooLarge": "The file is too large.", "TheFileIsTooLarge": "The file is too large.",
"GoToTheArticle": "Go to the Article", "GoToTheArticle": "Go to the Article",
@ -85,6 +84,54 @@
"ProfileImageChange": "Change the profile image", "ProfileImageChange": "Change the profile image",
"BlogItemErrorMessage": "Could not get the latest blog post details from ABP.", "BlogItemErrorMessage": "Could not get the latest blog post details from ABP.",
"PlannedReleaseDate": "Planned release date", "PlannedReleaseDate": "Planned release date",
"CommunityArticleRequestErrorMessage": "Could not get the latest article request from Github." "CommunityArticleRequestErrorMessage": "Could not get the latest article request from Github.",
"ArticleRequestFromGithubIssue": "There are not any article requests now.",
"LatestArticles": "Latest Posts",
"ArticleRequests": "Article Requests",
"AllArticleRequests": "See All Article Requests",
"SubscribeToTheNewsletter": "Subscribe to the Newsletter",
"NewsletterEmailDefinition": "Get information about happenings in ABP like new releases, free sources, articles, and more.",
"NoThanks": "No, thanks",
"MaybeLater": "Maybe later",
"JoinOurArticleNewsletter": "Join our article newsletter",
"Community": "Community",
"Marketing": "Marketing",
"CommunityPrivacyPolicyConfirmation": "I agree to the Terms & Conditions and <a href=\"https://commercial.abp.io/Privacy\">Privacy Policy</a>.",
"ArticleRequestMessageTitle": "<a href=\"https://github.com/abpframework/abp/issues/new\">Open an issue</a> on the GitHub to request an article/tutorial you want to see on this web site.",
"ArticleRequestMessageBody": "Here, the list of the requested articles by the community. Do you want to write a requested article? Please click to the request and join to the discussion.",
"Language": "Language",
"CreateArticleLanguageInfo": "The language for the post content.",
"VideoPost": "Video Post",
"Article": "Article",
"Read": "Read",
"CreateGithubArticleUrlInfo": "Original GitHub URL of the article.",
"CreateVideoContentUrlInfo": "Original Youtube URL of the post.",
"CreateExternalArticleUrlInfo": "Original External Url of the article.",
"VideoContentForm": "Submit Video on YouTube",
"GithubPostForm": "Submit Article on GitHub",
"ExternalPostForm": "Submit an External Content",
"HowToPost": "How to Post?",
"Posts": "Posts",
"VideoUrl": "Video Url",
"GithubArticleUrl": "Github Article Url",
"ExternalArticleUrl": "External Article Url",
"CreatePostCoverInfo": "For creating an effective post, add a cover photo. Upload 16:9 aspect ratio pictures for the best view. Maximum file size: 1MB.",
"ThankYouForContribution": "Thank you for contributing to the ABP Community.",
"GithubArticle": "Github Article",
"GithubArticleSubmitStepOne": "<span class=\"font-weight-bold\">1.</span> Write an article on any public GitHub repository with the Markdown format. <a target=\"_blank\" href=\"https://github.com/abpframework/abp/blob/dev/docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md\">example</a>",
"GithubArticleSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span> Submit your article URL using the form.",
"GithubArticleSubmitStepThree": "<span class=\"font-weight-bold\">3.</span> Your article will be rendered in this web site.",
"YoutubeVideo": "Youtube Video",
"YoutubeVideoSubmitStepOne": "<span class=\"font-weight-bold\">1.</span> Publish your video on YouTube.",
"YoutubeVideoSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span> Submit the video URL using the form.",
"YoutubeVideoSubmitStepThree": "<span class=\"font-weight-bold\">3.</span> Visitors will be able to watch your video content directly on this website.",
"ExternalContent": "External Content",
"ExternalContentSubmitStepOne": "<span class=\"font-weight-bold\">1.</span> Create a content on any public platform (medium, your own blog or anywhere you like).",
"ExternalContentSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span> Submit your content URL using the form.",
"ExternalContentSubmitStepThree": "<span class=\"font-weight-bold\">3.</span> Visitors are redirected to the content on the original website.",
"ChooseYourContentType": "Please choose the way you want to add your content.",
"PostContentViaGithub": "I want to add my article with <span class=\"font-weight-bold\"><i class=\"fa fa-github\"></i> GitHub</span> in accordance with the markdown rules.",
"PostContentViaYoutube": "I want to share my videos available on <span class=\"font-weight-bold\"><i class=\"fa fa-youtube\"></i> Youtube</span> here.",
"PostContentViaExternalSource": "I want to add the content I published on <span class=\"font-weight-bold\">another platform</span> here."
} }
} }

90
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/es.json

@ -0,0 +1,90 @@
{
"culture": "es",
"texts": {
"Permission:CommunityArticle": "Artículo de comunidad",
"Permission:Edit": "Editar",
"Waiting": "Esperando",
"Approved": "Aprobado",
"Rejected": "Rechazado",
"Wait": "Esperar",
"Approve": "Aprobar",
"Reject": "Rechazar",
"ReadArticle": "Leer artículo",
"Status": "Estado",
"ContentSource": "Fuente de contenido",
"Details": "Detalles",
"Url": "Url",
"Title": "Título",
"CreationTime": "Fecha de creación",
"Save": "Guardar",
"SameUrlAlreadyExist": "La url ya existe si tu quieres añadir este artículo, tu debes cambiar la url!",
"UrlIsNotValid": "Url no es valida",
"UrlNotFound": "Url no encontrada",
"UrlContentNotFound": "Contenido de la Url no encontrado",
"Summary": "Resumen",
"MostRead": "Más leído",
"Latest": "Últimos",
"ContributeAbpCommunity": "Contribuye a la comunidad ABP",
"SubmitYourArticle": "Envía tu artículo",
"ContributionGuide": "Guía de contribución",
"BugReport": "Informe de errores",
"SeeAllArticles": "Ver todos los artículos",
"WelcomeToABPCommunity!": "Bienvenido a la comunidad ABP",
"MyProfile": "Mi perfil",
"MyOrganizations": "Mis organizaciones",
"EmailNotValid": "Por favor entra una dirección de email válida.",
"FeatureRequest": "Solucitud de característica",
"CreateArticleTitleInfo": "Título del artículo para ser mostrado en la lista de artículos.",
"CreateArticleUrlInfo": "Url original del artículo GitHub/ Externo",
"CreateArticleSummaryInfo": "Un pequeño resumen del artículo para ser mostrado en la lista de artículos.",
"CreateArticleCoverInfo": "Para crear un artículo eficaz, agregue una foto de portada. Cargue imágenes con una relación de aspecto de 16: 9 para obtener la mejor vista.",
"ThisExtensionIsNotAllowed": "Esta extensión no está permitida.",
"TheFileIsTooLarge": "El fichero es demasiado grande.",
"GoToTheArticle": "Ir a el artículo",
"Contribute": "Contribuir",
"OverallProgress": "Progreso general",
"Done": "Hecho",
"Open": "Abrir",
"Closed": "Cerrado",
"LatestQuestionOnThe": "Última pregunta en la",
"Stackoverflow": "Stackoverflow",
"Votes": "Votos",
"Answer": "Respuesta",
"Views": "Vistas",
"Answered": "Respondido",
"WaitingForYourAnswer": "Esperando tu respuesta",
"Asked": "Preguntado",
"AllQuestions": "Todas las preguntas",
"NextVersion": "Siguiente versión",
"MilestoneErrorMessage": "No se pudieron obtener los detalles del hito actual en Github.",
"QuestionItemErrorMessage": "no se pudieron obtener los detalles de pregunta actual en Stackoverflow.",
"Oops": "Oops!",
"CreateArticleSuccessMessage": "El artículo se ha enviado correctamente. Se publicará después de una revisión del administrador del sitio.",
"ChooseCoverImage": "Elige una imagen de portada...",
"CoverImage": "Imagen de portada",
"ShareYourExperiencesWithTheABPFramework": "Comparte tus experiencias con el ABP Framework!",
"Optional": "Opcional",
"UpdateUserWebSiteInfo": "Ejemplo: https://johndoe.com",
"UpdateUserTwitterInfo": "Ejemplo: johndoe",
"UpdateUserGithubInfo": "Ejemplo: johndoe",
"UpdateUserLinkedinInfo": "Ejemplo: https://www.linkedin.com/...",
"UpdateUserCompanyInfo": "Ejemplo: Volosoft",
"UpdateUserJobTitleInfo": "Ejemplo: desarrollador de software",
"UserName": "Nombre de usuario",
"Company": "Empresa",
"PersonalWebsite": "Sitio web personal",
"RegistrationDate": "Fecha de registro",
"Social": "Social",
"Biography": "Biografía",
"HasNoPublishedArticlesYet": "No has publicado articules todavía",
"Author": "Autor",
"LatestGithubAnnouncements": "Últimas notificaciones de Github",
"SeeAllAnnouncements": "Ver todos las notificaciones",
"LatestBlogPost": "",
"Edit": "Editar",
"ProfileImageChange": "Cambiar la imagen de perfil",
"BlogItemErrorMessage": "No se pudo obtener los detalles del último blog desde ABP.",
"PlannedReleaseDate": "Fecha de entrega planificada",
"CommunityArticleRequestErrorMessage": "No se pudo obtener la última petición de artículo desde Github"
}
}

31
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json

@ -35,7 +35,6 @@
"EmailNotValid": "请输入有效的电子邮箱地址.", "EmailNotValid": "请输入有效的电子邮箱地址.",
"FeatureRequest": "功能请求", "FeatureRequest": "功能请求",
"CreateArticleTitleInfo": "文章标题显示在文章列表中.", "CreateArticleTitleInfo": "文章标题显示在文章列表中.",
"CreateArticleUrlInfo": "文章的原始GitHub/外部URL.",
"CreateArticleSummaryInfo": "文章的简短摘要将显示在文章列表中.", "CreateArticleSummaryInfo": "文章的简短摘要将显示在文章列表中.",
"CreateArticleCoverInfo": "为了创建有效的文章,请添加封面图. 仅支持16:9的图片!", "CreateArticleCoverInfo": "为了创建有效的文章,请添加封面图. 仅支持16:9的图片!",
"ThisExtensionIsNotAllowed": "不允许此扩展名.", "ThisExtensionIsNotAllowed": "不允许此扩展名.",
@ -84,6 +83,34 @@
"Edit": "修改", "Edit": "修改",
"ProfileImageChange": "更改资料图片", "ProfileImageChange": "更改资料图片",
"BlogItemErrorMessage": "无法从ABP获取最新的博客文章详细信息.", "BlogItemErrorMessage": "无法从ABP获取最新的博客文章详细信息.",
"PlannedReleaseDate": "计划发布日期" "PlannedReleaseDate": "计划发布日期",
"CommunityArticleRequestErrorMessage": "无法从Github获取最新的文章请求.",
"ArticleRequestFromGithubIssue": "现在没有任何文章请求.",
"LatestArticles": "最新的帖子",
"ArticleRequests": "文章请求",
"AllArticleRequests": "查看所有文章请求",
"SubscribeToTheNewsletter": "订阅简讯",
"NewsletterEmailDefinition": "获取有关ABP发生的信息,例如新版本,免费资源,文章等.",
"NoThanks": "不用了,谢谢",
"MaybeLater": "以后再说",
"JoinOurArticleNewsletter": "加入我们的文章简讯",
"Community": "社区",
"Marketing": "营销",
"CommunityPrivacyPolicyConfirmation": "我同意条款和条件以及<a href=\"https://commercial.abp.io/Privacy\">隐私政策</a>.",
"ArticleRequestMessageTitle": "<a href=\"https://github.com/abpframework/abp/issues/new\">在GitHub上创建一个Issue</a>,以请求你要在此网站上查看的文章/教程.",
"ArticleRequestMessageBody": "在这里,是社区请求的文章列表. 您要写一篇要求的文章吗? 请单击该请求并加入讨论.",
"Language": "语言",
"CreateArticleLanguageInfo": "本文所用的语言",
"VideoPost": "视频",
"Article": "文章",
"Read": "阅读",
"CreateGithubArticleUrlInfo": "文章的原始GitHub链接.",
"CreateVideoContentUrlInfo": "文章的原始Youtube链接.",
"CreateExternalArticleUrlInfo": "本文的原始外部网址",
"VideoContentForm": "视频内容来源",
"GithubPostForm": "Github文章来源",
"ExternalPostForm": "外部文章来源",
"PostSourceTypeChooses": "我们接受文章的三种来源类型;",
"Posts": "文章"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ar.json

@ -156,6 +156,7 @@
"UiFramework": "إطار عمل واجهة المستخدم", "UiFramework": "إطار عمل واجهة المستخدم",
"EmailAddress": "البريد الإلكترونى", "EmailAddress": "البريد الإلكترونى",
"Mobile": "المحمول", "Mobile": "المحمول",
"ReactNative": "React Native" "ReactNative": "React Native",
"SelectLanguage": "اختار اللغة"
} }
} }

190
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/de-DE.json

@ -0,0 +1,190 @@
{
"culture": "de-DE",
"texts": {
"GetStarted": "Erste Schritte - Startvorlagen",
"Create": "Erstellen",
"NewProject": "Neues Projekt",
"DirectDownload": "Direkter Download",
"ProjectName": "Proejktname",
"ProjectType": "Projekttyp",
"DatabaseProvider": "Datenbankanbieter",
"NTier": "N-Tier",
"IncludeUserInterface": "Benutzeroberfläche einschließen",
"CreateNow": "Jetzt erstellen",
"TheStartupProject": "Das Startprojekt",
"Tutorial": "Lernprogramm",
"UsingCLI": "mit CLI",
"SeeDetails": "Details ansehen",
"AbpShortDescription": "ABP Framework ist eine vollständige Infrastruktur zum Erstellen moderner Webanwendungen unter Befolgung von Best Practices und Konventionen für Softwareentwicklung.",
"SourceCodeUpper": "QUELLCODE",
"LatestReleaseLogs": "Akteulle Release",
"Infrastructure": "Infrastrutkur",
"Architecture": "Architektur",
"Modular": "Modular",
"DontRepeatYourself": "Don't Repeat Yourself",
"DeveloperFocused": "Entwickler-Zentriert",
"FullStackApplicationInfrastructure": "Full-Stack-Anwendungsinfrastruktur.",
"DomainDrivenDesign": "Domain Driven Design",
"DomainDrivenDesignExplanation": "Entworfen und entwickelt basierend auf DDD-Mustern und -Prinzipien. Bietet ein Schichtenmodell für Ihre Anwendung.",
"Authorization": "Authorization",
"AuthorizationExplanation": "Erweiterte Autorisierung mit Benutzer-, Rollen- und fein abgestimmtem Berechtigungssystem. Aufbauend auf der Microsoft Identity-Bibliothek.",
"MultiTenancy": "Multi-Tenancy",
"MultiTenancyExplanationShort": "SaaS-Anwendungen leicht gemacht! Integrierte Mandantenfähigkeit von der Datenbank bis zur Benutzeroberfläche.",
"CrossCuttingConcerns": "Cross Cutting Concerns",
"CrossCuttingConcernsExplanationShort": "Komplette Infrastruktur für Autorisierung, Validierung, Ausnahmebehandlung, Caching, Überwachungsprotokollierung, Transaktionsverwaltung und mehr.",
"BuiltInBundlingMinification": "Built-In Bundling & Minification",
"BuiltInBundlingMinificationExplanation": "Für die Bundling und Minification müssen keine externen Tools verwendet werden. ABP bietet eine einfachere, dynamische, leistungsstarke, modulare und integrierte Methode!",
"VirtualFileSystem": "Virtual File System",
"VirtualFileSystemExplanation": "Betten Sie Ansichten, Skripte, Stile, Bilder ... in Pakete/Bibliotheken ein und verwenden Sie sie in verschiedenen Anwendungen wieder.",
"Theming": "Theming",
"ThemingExplanationShort": "Verwenden und passen Sie das Bootstrap-basierte Standard-UI-Design an oder erstellen Sie Ihr eigenes.",
"BootstrapTagHelpersDynamicForms": "Bootstrap Tag Helpers & Dynamic Forms",
"BootstrapTagHelpersDynamicFormsExplanation": "Anstatt die sich wiederholenden Details von Bootstrap-Komponenten manuell zu schreiben, verwenden Sie die Tag-Helper von ABP, um diese zu vereinfachen und dabei die Vorteile von Intellisense zu nutzen. Erstellen Sie mit dem dynamischen Formular-Tag-Helfer schnell UI-Formulare basierend auf einem C#-Modell.",
"HTTPAPIsDynamicProxies": "HTTP APIs & Dynamic Proxies",
"HTTPAPIsDynamicProxiesExplanation": "Stellen Sie Anwendungsdienste automatisch als HTTP-APIs im REST-Stil bereit und verwenden Sie diese mit dynamischen JavaScript- und C#-Proxys.",
"CompleteArchitectureInfo": "Moderne Architektur zur Erstellung wartbarer Softwarelösungen.",
"DomainDrivenDesignBasedLayeringModelExplanation": "Hilft Ihnen bei der Implementierung einer DDD-basierten Schichtarchitektur und beim Aufbau einer wartbaren Codebasis.",
"DomainDrivenDesignBasedLayeringModelExplanationCont": "Bietet Startvorlagen, Abstraktionen, Basisklassen, Dienste, Dokumentation und Anleitungen, mit denen Sie Ihre Anwendung basierend auf DDD-Mustern und -Prinzipien entwickeln können.",
"MicroserviceCompatibleModelExplanation": "Das Kernframework und die vorgefertigten Module sind unter Berücksichtigung der Microservice-Architektur konzipiert.",
"MicroserviceCompatibleModelExplanationCont": "Bietet Infrastruktur, Integrationen, Beispiele und Dokumentation zur einfacheren Implementierung von Microservice-Lösungen, ohne zusätzliche Komplexität zu verursachen, wenn Sie eine monolithische Anwendung wünschen.",
"ModularInfo": "ABP bietet ein Modulsystem, mit dem Sie wiederverwendbare Anwendungsmodule entwickeln, Ereignisse im Anwendungslebenszyklus verknüpfen und Abhängigkeiten zwischen Kernteilen Ihres Systems ausdrücken können.",
"PreBuiltModulesThemes": "Vorgefertigte Module & Themes",
"PreBuiltModulesThemesExplanation": "Open Source- und kommerzielle Module und Themes stehen bereit, um in Ihrer Geschäftsanwendung verwendet zu werden.",
"NuGetNPMPackages": "NuGet- & NPM-Pakete",
"NuGetNPMPackagesExplanation": "Bereitgestellt als NuGet- & NPM-Pakete. Einfach zu installieren und zu aktualisieren.",
"ExtensibleReplaceable": "Erweiterbar/Austauschbar",
"ExtensibleReplaceableExplanation": "Alle Dienste und Module sind auf Erweiterbarkeit ausgelegt. Sie können Dienste, Seiten, Stile und Komponenten ersetzen.",
"CrossCuttingConcernsExplanation2": "Halten Sie Ihre Codebasis kleiner, damit Sie sich auf ihre geschäftsspezifischen Code konzentrieren können.",
"CrossCuttingConcernsExplanation3": "Verbringen Sie keine Zeit damit, grundlegende Anwendungsanforderungen für jedes neue Projekte zu implementieren.",
"AuthenticationAuthorization": "Authentifizierung & Autorisierung",
"ExceptionHandling": "Fehlerbehandlung",
"Validation": "Validierung",
"DatabaseConnection": "Datenbankverbindung",
"TransactionManagement": "Transaktionsmanagement",
"AuditLogging": "Audit Logging",
"Caching": "Caching",
"Multitenancy": "Multimandantenfähigkeit",
"DataFiltering": "Datenfilterung",
"ConventionOverConfiguration": "Convention Over Configuration",
"ConventionOverConfigurationExplanation": "ABP implementiert standardmäßig allgemeine Anwendungskonventionen mit einer minimalen oder Null-Konfiguration.",
"ConventionOverConfigurationExplanationList1": "Automatische Registrierung bekannter Services für Dependency Injection.",
"ConventionOverConfigurationExplanationList2": "Stellt Anwendungsdienste mittels Namenskonventionen als HTTP-APIs bereit.",
"ConventionOverConfigurationExplanationList3": "Erstellt dynamische HTTP-Client-Proxys für C# und JavaScript.",
"ConventionOverConfigurationExplanationList4": "Bietet Standard-Repositorys für Ihre Entities.",
"ConventionOverConfigurationExplanationList5": "Verwaltet die Unit-of-Work gemäß Webanforderung oder Anwendungsdienstmethode.",
"ConventionOverConfigurationExplanationList6": "Triggert Erstellungs-, Aktualisierungs- und Lösch-Events für Ihre Entities.",
"BaseClasses": "Basisklassen",
"BaseClassesExplanation": "Vorgefertigte Basisklassen für gängige Anwendungsmuster.",
"DeveloperFocusedExplanation": "ABP ist für Entwickler",
"DeveloperFocusedExplanationCont": "Es zielt darauf ab, Ihre tägliche Softwareentwicklung zu vereinfachen, ohne Sie daran zu hindern, Low-Level-Code zu schreiben.",
"SeeAllFeatures": "Alle Features anzeigen",
"CLI_CommandLineInterface": "CLI (Command Line Interface)",
"CLI_CommandLineInterfaceExplanation": "Enthält eine CLI, mit der Sie die Erstellung neuer Projekte und das Hinzufügen neuer Module automatisieren können.",
"StartupTemplates": "Startvorlagen",
"StartupTemplatesExplanation": "Verschiedene Startvorlagen bieten eine vollständig konfigurierte Lösung, um Ihre Entwicklung zu beschleunigen.",
"BasedOnFamiliarTools": "Basierend auf vertrauten Tools",
"BasedOnFamiliarToolsExplanation": "Aufbauend auf und integriert mit beliebten Tools, die Sie bereits kennen. Geringe Lernkurve, einfache Anpassung, komfortable Entwicklung.",
"ORMIndependent": "ORM-unabhängig",
"ORMIndependentExplanation": "Das Kernframework ist ORM-/datenbankunabhängig und kann mit jeder Datenquelle arbeiten. Entity Framework Core- und MongoDB-Anbieter sind bereits verfügbar.",
"Features": "Entdecken Sie die ABP Framework-Features",
"ABPCLI": "ABP CLI",
"Modularity": "Modularität",
"BootstrapTagHelpers": "Bootstrap Tag Helpers",
"DynamicForms": "Dynamische Formulare",
"BundlingMinification": "Bundling & Minification",
"BackgroundJobs": "Background Jobs",
"BackgroundJobsExplanation": "Definieren Sie einfache Klassen, um Jobs im Hintergrund in der Warteschlange auszuführen. Verwenden Sie den integrierten Jobmanager oder integrieren Sie Ihren eigenen. <a href=\"{0}\"> Hangfire </a> & <a href=\"{1}\"> RabbitMQ </a> -Integrationen sind bereits verfügbar.",
"DDDInfrastructure": "DDD-Infrastruktur",
"DomainDrivenDesignInfrastructure": "Domain Driven Design-Infrastruktur",
"AutoRESTAPIs": "Auto REST APIs",
"DynamicClientProxies": "Dynamische Client-Proxies",
"DistributedEventBus": "Distributed Event Bus",
"DistributedEventBusWithRabbitMQIntegration": "Distributed Event Bus mit RabbitMQ-Integration",
"TestInfrastructure": "Test-Infrastruktur",
"AuditLoggingEntityHistories": "Audit Logging & Entity Histories",
"ObjectToObjectMapping": "Object to Object Mapping",
"ObjectToObjectMappingExplanation": "<a href=\"{0}\"> Object to Object Mapping </a> Abstraktion mit AutoMapper-Integration.",
"EmailSMSAbstractions": "E-Mail & SMS Abstraktionen",
"EmailSMSAbstractionsWithTemplatingSupport": "E-Mail- und SMS-Abstraktionen mit Vorlagenunterstützung",
"Localization": "Lokalisierung",
"SettingManagement": "Einstellungsverwaltung",
"ExtensionMethods": "Erweiterungsmethoden",
"ExtensionMethodsHelpers": "Erweiterungsmethoden & Helfer",
"AspectOrientedProgramming": "Aspektorientierte Programmierung",
"DependencyInjection": "Dependency Injection",
"DependencyInjectionByConventions": "Dependency Injection durch Konventionen",
"ABPCLIExplanation": "ABP CLI (Command Line Interface) ist ein Befehlszeilenprogramm zum Ausführen einiger gängiger Vorgänge für ABP-basierte Lösungen.",
"ModularityExplanation": "ABP bietet eine vollständige Infrastruktur zum Erstellen eigener Anwendungsmodule, die Entities, Services, Datenbankintegration, APIs, UI-Komponenten usw. enthalten können.",
"MultiTenancyExplanation": "Das ABP-Framework unterstützt nicht nur die Entwicklung von Multi-Mandantenanwendungen, sondern macht Ihren Code von der Mandantenfähigkeit auch weitgehend unabhängig.",
"MultiTenancyExplanation2": "Kann den aktuellen Mandanten automatisch ermitteln und Daten verschiedener Mandanten voneinander isolieren.",
"MultiTenancyExplanation3": "Unterstützt einzelne Datenbank-, Datenbank-pro-Mandanten- und Hybrid-Ansätze.",
"MultiTenancyExplanation4": "Sie konzentrieren sich auf Ihren geschäftsspezifischen Code und lassen das Framework die Mandantenfähigkeit für Sie übernehmen.",
"BootstrapTagHelpersExplanation": "Anstatt die sich wiederholenden Details von Bootstrap-Komponenten manuell zu schreiben, verwenden Sie die Tag-Helper von ABP, um diese zu vereinfachen und dabei die Vorteile von Intellisense zu nutzen. Sie können Bootstrap weitherhin verwenden, wann immer Sie es benötigen.",
"DynamicFormsExplanation": "Helfer für dynamische Formular- und Input-Tags können das vollständige Formular anhand einer C#-Klasse als Model erstellen.",
"AuthenticationAuthorizationExplanation": "Umfangreiche Authentifizierungs- und Autorisierungsoptionen, die in ASP.NET Core Identity & IdentityServer4 integriert sind. Bietet ein erweiterbares und detailliertes Berechtigungssystem.",
"CrossCuttingConcernsExplanation": "Wiederholen Sie sich nicht, um all diese allgemeinen Dinge immer wieder zu implementieren. Konzentrieren Sie sich auf Ihren geschäftsspezifischen Code und lassen Sie ihn von ABP durch Konventionen automatisieren.",
"DatabaseConnectionTransactionManagement": "Datenbankverbindungs- und Transaktionsmanagement",
"CorrelationIdTracking": "Correlation-ID-Verfolgung",
"BundlingMinificationExplanation": "ABP bietet ein einfaches, dynamisches, leistungsstarkes, modulares und integriertes Bundling- und Minification-System.",
"VirtualFileSystemnExplanation": "Das virtuelle Dateisystem ermöglicht die Verwaltung von Dateien, die physisch nicht auf dem Dateisystem (Datenträger) vorhanden sind. Es wird hauptsächlich verwendet, um Dateien (js, css, image, cshtml ...) in Assemblys einzubetten und sie zur Laufzeit wie physische Dateien zu verwenden.",
"ThemingExplanation": "Mit dem Theming-System können Sie Ihre Anwendung & Module Theme-unabhängig entwickeln, indem Sie eine Reihe gemeinsamer Basisbibliotheken und Layouts definieren, die auf dem neuesten Bootstrap-Framework basieren.",
"DomainDrivenDesignInfrastructureExplanation": "Eine vollständige Infrastruktur zum Erstellen von mehrschichtigen Anwendungen basierend auf den Domain Driven Design Entwurfsmustern und -prinzipien;",
"Specification": "Specification",
"Repository": "Repository",
"DomainService": "Domain Service",
"ValueObject": "Value Object",
"ApplicationService": "Application Service",
"DataTransferObject": "Data Transfer Object",
"AggregateRootEntity": "Aggregate Root, Entity",
"AutoRESTAPIsExplanation": "ABP kann Ihre Anwendungsservices gemäß Konvention automatisch als API-Controller konfigurieren.",
"DynamicClientProxiesExplanation": "Verwenden Sie Ihre APIs ganz einfach in JavaScript- und C#-Clients.",
"DistributedEventBusWithRabbitMQIntegrationExplanation": "Veröffentlichen und konsumieren Sie Distributed Events einfach mithilfe des integrierten Distributed Event Bus mit verfügbarer RabbitMQ-Integration.",
"TestInfrastructureExplanation": "Das Framework wurde unter Berücksichtigung von Unit- und Integrationstests entwickelt. Bietet Ihnen Basisklassen, um es einfacher zu machen. Startvorlagen werden mit vorkonfiguriert Tests geliefert.",
"AuditLoggingEntityHistoriesExplanation": "Integriertes Audit Logging für geschäftskritische Anwendungen. Audit Logging auf Request-, Service-, und Methodenebene sowie Entity-Historien mit Details auf Property-Ebene.",
"EmailSMSAbstractionsWithTemplatingSupportExplanation": "IEmailSender- und ISmsSender-Abstraktionen entkoppeln Ihre Anwendungslogik von der Infrastruktur. Das erweiterte E-Mail-Vorlagensystem ermöglicht das Erstellen und Lokalisieren von E-Mail-Vorlagen und deren einfache Verwendung bei Bedarf.",
"LocalizationExplanation": "Das Lokalisierungssystem ermöglicht das Erstellen von Ressourcen in einfachen JSON-Dateien und die Lokalisierung Ihrer Benutzeroberfläche. Es unterstützt erweiterte Szenarien wie Vererbung, Erweiterungen und JavaScript-Integration und ist vollständig mit dem Lokalisierungssystem von AspNet Core kompatibel.",
"SettingManagementExplanation": "Definieren Sie Einstellungen für Ihre Anwendung und erhalten Sie zur Laufzeit Werte basierend auf der aktuellen Konfiguration, dem Mandanten und dem Benutzer.",
"ExtensionMethodsHelpersExplanation": "Wiederholen Sie sich nicht einmal für triviale Codeteile. Erweiterungen und Helfer für Standardtypen machen Ihren Code viel sauberer und einfacher zu schreiben.",
"AspectOrientedProgrammingExplanation": "Bietet eine komfortable Infrastruktur zum Erstellen dynamischer Proxys und zum Implementieren der aspektorientierten Programmierung. Fangen Sie eine Klasse ab und führen Sie Ihren Code vor und nach jeder Methodenausführung aus.",
"DependencyInjectionByConventionsExplanation": "Sie müssen Ihre Klassen nicht manuell für die Dependency Injection registrieren. Registriert gängige Servicetypen automatisch gemäß Konvention. Für andere Arten von Services können Sie Schnittstellen und Attribute verwenden, um dies einfacher gestalten und an Ort und Stelle zu ermöglichen.",
"DataFilteringExplanation": "Definieren und verwenden Sie Datenfilter, die automatisch angewendet werden, wenn Sie Entities aus der Datenbank abfragen. Soft Delete- und Multimandanten-Filter sind sofort verfügbar, wenn Sie einfache Schnittstellen implementieren.",
"PublishEvents": "Events veröffentlichen",
"HandleEvents": "Auf Events reagieren",
"AndMore": "und mehr...",
"Code": "Code",
"Result": "Resultat",
"SeeTheDocumentForMoreInformation": "Weitere Informationen finden Sie in der <a href=\"{1}\"> {0} -Dokumentation </a>",
"IndexPageHeroSection": "<span class=\"first-line shine\"><strong>Open Source</strong></span><span class=\"second-line text-uppercase\">Webanwendung<br />Framework </span><span class=\"third-line shine2\"><strong>für ASP.Net Core</strong></span>",
"UiFramework": "UI-Framework",
"EmailAddress": "E-Mail-Adresse",
"Mobile": "Mobile",
"ReactNative": "React Native",
"Strong": "Stark",
"Complete": "Vollständig",
"BasedLayeringModel": "Based Layering Model",
"Microservice": "Microservice",
"Compatible": "Kompatibel",
"MeeTTheABPCommunityInfo": "Unsere Mission ist es, eine Umgebung zu schaffen, in der Entwickler sich gegenseitig mit Beiträgen, Tutorials, Fallstudien usw. helfen und Gleichgesinnte treffen können.",
"JoinTheABPCommunityInfo": "Beteiligen Sie sich an einer lebendigen Community und tragen Sie zum ABP Framework bei!",
"AllArticles": "Alle Beiträge",
"SubmitYourArticle": "Reichen Sie Ihren Beitrag ein",
"DynamicClientProxyDocument": "In der Dokumentation zu den Dynamischen Client-Proxies finden Sie Informationen zu <a href=\"{0}\">JavaScript</a> & <a href=\"{1}\">C#</a>.",
"EmailSMSAbstractionsDocument": "Weitere Informationen finden Sie in den Unterlagen <a href=\"{0}\">E-Mail-Senden</a> and <a href=\"{1}\">SMS-Senden</a>.",
"CreateProjectWizard": "Dieser Assistent erstellt ein neues Projekt aus der Startvorlage, die ordnungsgemäß konfiguriert ist, um Ihr Projekt zu starten.",
"TieredOption": "Erstellt eine Tiered Lösung, bei der Web- und HTTP-API-Ebenen physisch getrennt sind. Wenn diese Option nicht aktiviert ist, wird eine mehrschichtige Lösung erstellt, die weniger komplex und für die meisten Szenarien geeignet ist.",
"SeparateIdentityServerOption": "Trennt die Serverseite in zwei Anwendungen: Die erste ist für den Identitätsserver und die zweite für die serverseitige HTTP-API.",
"UseslatestPreVersion": "Verwendet die neueste Vorabversion",
"ReadTheDocumentation": "<span class=\"text-primary\">Lesen Sie</span><span class=\"text-success\">Die Dokumentation</span>",
"Documentation": "Dokumentation",
"GettingStartedTutorial": "Erste Schritte Tutorial",
"ApplicationDevelopmentTutorial": "Tutorial zur Anwendungsentwicklung",
"TheStartupTemplate": "Die Startvorlage",
"InstallABPCLIInfo": "ABP CLI ist der schnellste Weg, um eine neue Lösung mit dem ABP-Framework zu starten. Installieren Sie die ABP-CLI über die Eingabeaufforderung:",
"DifferentLevelOfNamespaces": "Sie können verschiedene Ebenen von Namespaces verwenden; z.B. BookStore, Acme.BookStore or Acme.Retail.BookStore.",
"ABPCLIExamplesInfo": "Der Befehl <strong>new</strong> erstellt eine <strong>mehrschichtige MVC-Anwendung</strong> mit <strong>Entity Framework Core</strong> als Datenbankanbieter. Es gibt jedoch zusätzliche Optionen. Beispiele:",
"SeeCliDocumentForMoreInformation": "Weitere Optionen finden Sie im <a href=\"{0}\">ABP CLI-Dokument</a> oder wählen Sie oben die Registerkarte \"Direkter Download\".",
"Optional": "Optional",
"LocalFrameworkRef": "Behalten Sie die lokale Projektreferenz für die Framework-Pakete bei.",
"SelectLanguage": "Sprache auswählen"
}
}

198
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en-GB.json

@ -0,0 +1,198 @@
{
"culture": "en-GB",
"texts": {
"GetStarted": "Get Started - Startup Templates",
"Create": "Create",
"NewProject": "New Project",
"DirectDownload": "Direct Download",
"ProjectName": "Project name",
"ProjectType": "Project type",
"DatabaseProvider": "Database provider",
"NTier": "N-Tier",
"IncludeUserInterface": "Include user interface",
"CreateNow": "Create now",
"TheStartupProject": "The startup project",
"Tutorial": "Tutorial",
"UsingCLI": "Using CLI",
"SeeDetails": "See Details",
"AbpShortDescription": "ABP Framework is a complete infrastructure to create modern web applications by following the software development best practices and conventions.",
"SourceCodeUpper": "SOURCE CODE",
"LatestReleaseLogs": "Latest release logs",
"Infrastructure": "Infrastructure",
"Architecture": "Architecture",
"Modular": "Modular",
"DontRepeatYourself": "Don’t Repeat Yourself",
"DeveloperFocused": "Developer Focused",
"FullStackApplicationInfrastructure": "Full stack application infrastructure.",
"DomainDrivenDesign": "Domain Driven Design",
"DomainDrivenDesignExplanation": "Designed and developed based on DDD patterns and principles. Provides a layered model for your application.",
"Authorization": "Authorisation",
"AuthorizationExplanation": "Advanced authorisation with user, role and fine-grained permission system. Built on the Microsoft Identity library.",
"MultiTenancy": "Multi-Tenancy",
"MultiTenancyExplanationShort": "SaaS applications made easy! Integrated multi-tenancy from database to UI.",
"CrossCuttingConcerns": "Cross Cutting Concerns",
"CrossCuttingConcernsExplanationShort": "Complete infrastructure for authorization, validation, exception handling, caching, audit logging, transaction management and more.",
"BuiltInBundlingMinification": "Built-In Bundling & Minification",
"BuiltInBundlingMinificationExplanation": "No need to use external tools for bundling & minification. ABP offers a simpler, dynamic, powerful, modular and built-in way!",
"VirtualFileSystem": "Virtual File System",
"VirtualFileSystemExplanation": "Embed views, scripts, styles, images... into packages/libraries and reuse them in different applications.",
"Theming": "Theming",
"ThemingExplanationShort": "Use and customise the bootstrap-based standard UI theme or create your own.",
"BootstrapTagHelpersDynamicForms": "Bootstrap Tag Helpers & Dynamic Forms",
"BootstrapTagHelpersDynamicFormsExplanation": "Instead of manually writing bootstrap components, Use ABP's tag helpers to simplify and take advantage of intellisense. Quickly build UI forms based on a C# model using the dynamic form tag helper.",
"HTTPAPIsDynamicProxies": "HTTP APIs & Dynamic Proxies",
"HTTPAPIsDynamicProxiesExplanation": "Automatically expose application services as REST style HTTP APIs, and consume them with dynamic JavaScript and C# proxies.",
"CompleteArchitectureInfo": "Modern architecture to create maintainable software solutions.",
"DomainDrivenDesignBasedLayeringModelExplanation": "Helps you to implement a DDD based layered architecture and build a maintainable code base.",
"DomainDrivenDesignBasedLayeringModelExplanationCont": "Provides startup templates, abstractions, base classes, services, documentation and guides to help you to develop your application based on DDD patterns & principles.",
"MicroserviceCompatibleModelExplanation": "The core framework & pre-build modules are designed with microservice architecture in mind.",
"MicroserviceCompatibleModelExplanationCont": "Provides infrastructure, integrations, samples and documentation to implement microservice solutions easier, while it doesn’t bring additional complexity if you want a monolithic application.",
"ModularInfo": "ABP provides a module system that allows you to develop reusable application modules, tie into application lifecycle events, and express dependencies between core parts of your system.",
"PreBuiltModulesThemes": "Pre-Built Modules & Themes",
"PreBuiltModulesThemesExplanation": "Open source and commercial modules & themes are ready to use in your business application.",
"NuGetNPMPackages": "NuGet & NPM Packages",
"NuGetNPMPackagesExplanation": "Distributed as NuGet & NPM packages. Easy to install and upgrade.",
"ExtensibleReplaceable": "Extensible/Replaceable",
"ExtensibleReplaceableExplanation": "All services & modules are designed extensibility in mind. You can replace services, pages, styles and components.",
"CrossCuttingConcernsExplanation2": "Keep your codebase smaller so you can maintain focus on the code that’s specific to your business.",
"CrossCuttingConcernsExplanation3": "Don’t spend time implementing common application requirements on multiple projects.",
"AuthenticationAuthorization": "Authentication & Authorization",
"ExceptionHandling": "Exception Handling",
"Validation": "Validation",
"DatabaseConnection": "Database Connection",
"TransactionManagement": "Transaction management",
"AuditLogging": "Audit Logging",
"Caching": "Caching",
"Multitenancy": "Multitenancy",
"DataFiltering": "Data filtering",
"ConventionOverConfiguration": "Convention Over Configuration",
"ConventionOverConfigurationExplanation": "ABP implements common application conventions by default with a minimal or zero configuration.",
"ConventionOverConfigurationExplanationList1": "Auto registers known services to dependency injection.",
"ConventionOverConfigurationExplanationList2": "Exposes application services as HTTP APIs by naming conventions.",
"ConventionOverConfigurationExplanationList3": "Creates dynamic HTTP client proxies for C# and JavaScript.",
"ConventionOverConfigurationExplanationList4": "Provides default repositories for your entities.",
"ConventionOverConfigurationExplanationList5": "Manages Unit of Work per web request or application service method.",
"ConventionOverConfigurationExplanationList6": "Publishes create, update & delete events for your entities.",
"BaseClasses": "Base Classes",
"BaseClassesExplanation": "Pre-built base classes for common application patterns.",
"DeveloperFocusedExplanation": "ABP is for developers.",
"DeveloperFocusedExplanationCont": "It aims to simplify your daily software development while not restricting you from writing low level code.",
"SeeAllFeatures": "See All Features",
"CLI_CommandLineInterface": "CLI (Command Line Interface)",
"CLI_CommandLineInterfaceExplanation": "Includes a CLI to help you automate the creation of new projects and the addition of new modules.",
"StartupTemplates": "Startup Templates",
"StartupTemplatesExplanation": "Various startup templates provide a fully configured solution to jump start your development.",
"BasedOnFamiliarTools": "Based on Familiar Tools",
"BasedOnFamiliarToolsExplanation": "Built and integrated with popular tools you already know. Low learning curve, easy adaptation, comfortable development.",
"ORMIndependent": "ORM Independent",
"ORMIndependentExplanation": "The core framework is ORM/database independent and can work with any data source. Entity Framework Core and MongoDB providers are already available.",
"Features": "Explore the ABP Framework Features",
"ABPCLI": "ABP CLI",
"Modularity": "Modularity",
"BootstrapTagHelpers": "Bootstrap Tag Helpers",
"DynamicForms": "Dynamic Forms",
"BundlingMinification": "Bundling & Minification",
"BackgroundJobs": "Background Jobs",
"BackgroundJobsExplanation": "Define simple classes to execute jobs in the background as queued. Use the built-in job manager or integrate your own. <a href=\"{0}\">Hangfire</a> & <a href=\"{1}\">RabbitMQ</a> integrations are already available.",
"DDDInfrastructure": "DDD Infrastructure",
"DomainDrivenDesignInfrastructure": "Domain Driven Design Infrastructure",
"AutoRESTAPIs": "Auto REST APIs",
"DynamicClientProxies": "Dynamic Client Proxies",
"DistributedEventBus": "Distributed Event Bus",
"DistributedEventBusWithRabbitMQIntegration": "Distributed Event Bus with RabbitMQ Integration",
"TestInfrastructure": "Test Infrastructure",
"AuditLoggingEntityHistories": "Audit Logging & Entity Histories",
"ObjectToObjectMapping": "Object to Object Mapping",
"ObjectToObjectMappingExplanation": "<a href=\"{0}\">Object to object mapping</a> abstraction with AutoMapper integration.",
"EmailSMSAbstractions": "Email & SMS Abstractions",
"EmailSMSAbstractionsWithTemplatingSupport": "Email & SMS Abstractions with Templating Support",
"Localization": "Localization",
"SettingManagement": "Setting Management",
"ExtensionMethods": "Extension Methods",
"ExtensionMethodsHelpers": "Extension Methods & Helpers",
"AspectOrientedProgramming": "Aspect Oriented Programming",
"DependencyInjection": "Dependency Injection",
"DependencyInjectionByConventions": "Dependency Injection by Conventions",
"ABPCLIExplanation": "The ABP CLI (Command Line Interface) is a command line tool to perform common operations for ABP based solutions.",
"ModularityExplanation": "ABP provides a complete infrastructure to build your own application modules those may have entities, services, database integration, APIs, UI components and so on.",
"MultiTenancyExplanation": "ABP framework not only supports to develop multi-tenant applications, but also makes your code mostly unaware of the multi-tenancy.",
"MultiTenancyExplanation2": "Can automatically determine the current Tenant and isolate each Tenant's data from each other.",
"MultiTenancyExplanation3": "Supports single database, database per tenant and hybrid approaches.",
"MultiTenancyExplanation4": "You focus on your business code and let the framework to handle multi-tenancy on behalf of you.",
"BootstrapTagHelpersExplanation": "Instead of manually writing the repeating details of bootstrap components, use ABP's tag helpers to simplify and take advantage of intellisense. You can use Bootstrap whenever you need it.",
"DynamicFormsExplanation": "Dynamic form & input tag helpers can create the complete form from a C# class as the model.",
"AuthenticationAuthorizationExplanation": "Rich authentication & authorization options integrated to ASP.NET Core Identity & IdentityServer4. Provides an extensible & detailed permission system.",
"CrossCuttingConcernsExplanation": "Don't repeat yourself when implementing common features. Instead, focus on your business logic and let ABP automate by convention.",
"DatabaseConnectionTransactionManagement": "Database Connection & Transaction Management",
"CorrelationIdTracking": "Correlation-Id Tracking",
"BundlingMinificationExplanation": "ABP offers a simple, dynamic, powerful, modular and built-in bundling & minification system.",
"VirtualFileSystemnExplanation": "The Virtual File System makes it possible to manage files those do not physically exist on the file system (disk). It's mainly used to embed (js, css, image, cshtml...) files into assemblies and use them like physical files on runtime.",
"ThemingExplanation": "Theming system allows to develop your application & modules theme independent by defining a set of common base libraries and layouts, based on the latest Bootstrap framework.",
"DomainDrivenDesignInfrastructureExplanation": "A complete infrastructure to build layered applications based on the Domain Driven Design patterns & principles.",
"Specification": "Specification",
"Repository": "Repository",
"DomainService": "Domain Service",
"ValueObject": "Value Object",
"ApplicationService": "Application Service",
"DataTransferObject": "Data Transfer Object",
"AggregateRootEntity": "Aggregate Root, Entity",
"AutoRESTAPIsExplanation": "ABP can automagically configure your application services as API Controllers by convention.",
"DynamicClientProxiesExplanation": "Easily consume your APIs from JavaScript and C# clients.",
"DistributedEventBusWithRabbitMQIntegrationExplanation": "Easily publish & consume distributed events using built-in Distributed Event Bus with RabbitMQ integration available.",
"TestInfrastructureExplanation": "The framework has been developed unit & integration testing in mind. Provides you base classes to make it easier. Startup templates come with pre-configured for testing.",
"AuditLoggingEntityHistoriesExplanation": "Built-in audit logging for business-critical applications. Request, service, method level audit logging and entity histories with property-level details.",
"EmailSMSAbstractionsWithTemplatingSupportExplanation": "IEmailSender and ISmsSender abstractions decouples your application logic from the infrastructure. Advanced email template system allows to create & localize email templates and easily use whenever needed.",
"LocalizationExplanation": "Localization system allows to create resources in plain JSON files and use them to localize your UI. It supports advanced scenarios like inheritance, extensions and JavaScript integration while it is fully compatible with AspNet Core's localization system.",
"SettingManagementExplanation": "Define settings for your application and get values on runtime based on the current configuration, tenant and user.",
"ExtensionMethodsHelpersExplanation": "Don't repeat yourself even for trivial code parts. Extensions & helpers for standard types makes your code much cleaner and easy to write.",
"AspectOrientedProgrammingExplanation": "Provides a comfortable infrastructure to create dynamic proxies and implement Aspect Oriented Programming. Intercept any class and execute your code before & after every method execution.",
"DependencyInjectionByConventionsExplanation": "No need to register your classes to dependency injection manually. Automatically registers common service types by convention. For other type of services, you can use interfaces and attributes to make it easier and in-place.",
"DataFilteringExplanation": "Define and use data filters those are automatically applied when you query entities from database. Soft Delete & Multi-Tenant filters are provided out of the box when you implement simple interfaces.",
"PublishEvents": "Publish Events",
"HandleEvents": "Handle Events",
"AndMore": "and more...",
"Code": "Code",
"Result": "Result",
"SeeTheDocumentForMoreInformation": "See the <a href=\"{1}\">{0} document</a> for more information",
"IndexPageHeroSection": "<span class=\"first-line shine\"><strong>open source</strong></span><span class=\"second-line text-uppercase\">Web Application<br />Framework </span><span class=\"third-line shine2\"><strong>for asp.net core</strong></span>",
"UiFramework": "UI Framework",
"EmailAddress": "Email address",
"Mobile": "Mobile",
"ReactNative": "React Native",
"Strong": "Strong",
"Complete": "Complete",
"BasedLayeringModel": "Based Layering Model",
"Microservice": "Microservice",
"Compatible": "Compatible",
"MeeTTheABPCommunityInfo": "Our mission is to create an environment where developers can help each other with articles, tutorials, case studies, etc. and meet like-minded people.",
"JoinTheABPCommunityInfo": "Get involved with a vibrant community and become a contributor to the ABP Framework!",
"AllArticles": "All Articles",
"SubmitYourArticle": "Submit Your Article",
"DynamicClientProxyDocument": "See the dynamic client proxy documentations for <a href=\"{0}\">JavaScript</a> & <a href=\"{1}\">C#</a>.",
"EmailSMSAbstractionsDocument": "See the <a href=\"{0}\">emailing</a> and <a href=\"{1}\">SMS sending</a> documents for more information.",
"CreateProjectWizard": "This wizard creates a new project from the startup template which is properly configured to jump start to your project.",
"TieredOption": "Creates a tiered solution where Web and Http API layers are physically separated. If not checked, creates a layered solution which is less complex and suitable for most scenarios.",
"SeparateIdentityServerOption": "Separates server side into two applications: First one is for the identity server and the second one is for your server side HTTP API.",
"UseslatestPreVersion": "Uses latest pre-release version",
"ReadTheDocumentation": "<span class=\"text-primary\">Read</span><span class=\"text-success\">The Documentation</span>",
"Documentation": "Documentation",
"GettingStartedTutorial": "Getting Started Tutorial",
"ApplicationDevelopmentTutorial": "Application Development Tutorial",
"TheStartupTemplate": "The Startup Template",
"InstallABPCLIInfo": "ABP CLI is the fastest way to start a new solution with the ABP framework. Install the ABP CLI using a command line window:",
"DifferentLevelOfNamespaces": "You can use different level of namespaces; e.g. BookStore, Acme.BookStore or Acme.Retail.BookStore.",
"ABPCLIExamplesInfo": "<strong>new</strong> command creates a <strong>layered MVC application</strong> with <strong>Entity Framework Core</strong> as the database provider. However, it has additional options. Examples:",
"SeeCliDocumentForMoreInformation": "See the <a href=\"{0}\">ABP CLI document</a> for more options or select the \"Direct Download\" tab above.",
"Optional": "Optional",
"LocalFrameworkRef": "Keep local project reference for the framework packages.",
"BlobStoring": "BLOB Storing",
"BlobStoringExplanation": "BLOB Storing system provides an abstraction to work with BLOBs. ABP provides some pre-built storage provider integrations (Azure, AWS, File System, Database, etc.) that you can easily use in your applications.",
"TextTemplating": "Text Templating",
"TextTemplatingExplanation": "Text templating is used to dynamically render contents based on a template and a model (a data object). For example, you can use it to create dynamic email contents with a pre-built template.",
"MultipleUIOptions": "Multiple UI Options",
"MultipleDBOptions": "Multiple Database Providers",
"MultipleUIOptionsExplanation": "The core framework is designed as UI independent and can work with any type of UI system, while there are multiple pre-built and integrated options are provided out of the box.",
"MultipleDBOptionsExplanation": "The framework can work with any data source, while the following providers are officially developed and supported:",
"SelectLanguage": "Select language"
}
}

13
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json

@ -45,7 +45,7 @@
"CompleteArchitectureInfo": "Modern architecture to create maintainable software solutions.", "CompleteArchitectureInfo": "Modern architecture to create maintainable software solutions.",
"DomainDrivenDesignBasedLayeringModelExplanation": "Helps you to implement a DDD based layered architecture and build a maintainable code base.", "DomainDrivenDesignBasedLayeringModelExplanation": "Helps you to implement a DDD based layered architecture and build a maintainable code base.",
"DomainDrivenDesignBasedLayeringModelExplanationCont": "Provides startup templates, abstractions, base classes, services, documentation and guides to help you to develop your application based on DDD patterns & principles.", "DomainDrivenDesignBasedLayeringModelExplanationCont": "Provides startup templates, abstractions, base classes, services, documentation and guides to help you to develop your application based on DDD patterns & principles.",
"MicroserviceCompatibleModelExplanation": "The core framework & pre-build modules are designed the microservice architecture in mind.", "MicroserviceCompatibleModelExplanation": "The core framework & pre-build modules are designed with microservice architecture in mind.",
"MicroserviceCompatibleModelExplanationCont": "Provides infrastructure, integrations, samples and documentation to implement microservice solutions easier, while it doesn\u2019t bring additional complexity if you want a monolithic application.", "MicroserviceCompatibleModelExplanationCont": "Provides infrastructure, integrations, samples and documentation to implement microservice solutions easier, while it doesn\u2019t bring additional complexity if you want a monolithic application.",
"ModularInfo": "ABP provides a module system that allows you to develop reusable application modules, tie into application lifecycle events, and express dependencies between core parts of your system.", "ModularInfo": "ABP provides a module system that allows you to develop reusable application modules, tie into application lifecycle events, and express dependencies between core parts of your system.",
"PreBuiltModulesThemes": "Pre-Built Modules & Themes", "PreBuiltModulesThemes": "Pre-Built Modules & Themes",
@ -184,6 +184,15 @@
"ABPCLIExamplesInfo": "<strong>new</strong> command creates a <strong>layered MVC application</strong> with <strong>Entity Framework Core</strong> as the database provider. However, it has additional options. Examples:", "ABPCLIExamplesInfo": "<strong>new</strong> command creates a <strong>layered MVC application</strong> with <strong>Entity Framework Core</strong> as the database provider. However, it has additional options. Examples:",
"SeeCliDocumentForMoreInformation": "See the <a href=\"{0}\">ABP CLI document</a> for more options or select the \"Direct Download\" tab above.", "SeeCliDocumentForMoreInformation": "See the <a href=\"{0}\">ABP CLI document</a> for more options or select the \"Direct Download\" tab above.",
"Optional": "Optional", "Optional": "Optional",
"LocalFrameworkRef": "Keep local project reference for the framework packages." "LocalFrameworkRef": "Keep local project reference for the framework packages.",
"BlobStoring": "BLOB Storing",
"BlobStoringExplanation": "BLOB Storing system provides an abstraction to work with BLOBs. ABP provides some pre-built storage provider integrations (Azure, AWS, File System, Database, etc.) that you can easily use in your applications.",
"TextTemplating": "Text Templating",
"TextTemplatingExplanation": "Text templating is used to dynamically render contents based on a template and a model (a data object). For example, you can use it to create dynamic email contents with a pre-built template.",
"MultipleUIOptions": "Multiple UI Options",
"MultipleDBOptions": "Multiple Database Providers",
"MultipleUIOptionsExplanation": "The core framework is designed as UI independent and can work with any type of UI system, while there are multiple pre-built and integrated options are provided out of the box.",
"MultipleDBOptionsExplanation": "The framework can work with any data source, while the following providers are officially developed and supported;",
"SelectLanguage": "Select language"
} }
} }

190
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/es.json

@ -0,0 +1,190 @@
{
"culture": "es",
"texts": {
"GetStarted": "Comencemos - Plantillas de inicio",
"Create": "Crear",
"NewProject": "Nuevo proyecto",
"DirectDownload": "Descarga directa",
"ProjectName": "Nombre de proyecto",
"ProjectType": "Tipo de proyecto",
"DatabaseProvider": "Proveedor de base de datos",
"NTier": "N-Capas",
"IncludeUserInterface": "Incluir interface de usuario",
"CreateNow": "Crear ahora",
"TheStartupProject": "El proyecto de inicio",
"Tutorial": "Tutorial",
"UsingCLI": "Usando CLI",
"SeeDetails": "Ver detalles",
"AbpShortDescription": "ABP Framework es una completa infraestructure para crear modernas aplicaciones web que sigue las mejores prácticas y convenciones de desarrollo de software.",
"SourceCodeUpper": "CÓDIGO FUENTE",
"LatestReleaseLogs": "Últimos registros de lanzamiento",
"Infrastructure": "infraestructura",
"Architecture": "Arquitectura",
"Modular": "Modular",
"DontRepeatYourself": "No te repitas tu mismo",
"DeveloperFocused": "Pensado para el desarrollador",
"FullStackApplicationInfrastructure": "infraestructura de aplicación Full stack",
"DomainDrivenDesign": "",
"DomainDrivenDesignExplanation": "Diseñado y desarrollado basandose en los patrones y principios de DDD. Promorciona una capa de modelo para tus aplicaciones.",
"Authorization": "Autorización",
"AuthorizationExplanation": "Sistema de autorización avanzado con usuarios, roles y permisos de granularidad-fina. Construido sobre la librería Microsoft Identity.",
"MultiTenancy": "Multi-inquilino",
"MultiTenancyExplanationShort": "Aplicaciones SaaS sencillas!, integradas con multi-inquilino desde la base de datos hasta la UI.",
"CrossCuttingConcerns": "Requerimientos comunes",
"CrossCuttingConcernsExplanationShort": "Completa infraestructura de autorización, validación, manejo de excepciones, caching, auditoría, gestión de transacciones y más.",
"BuiltInBundlingMinification": "Empaquetado y minificado integrado",
"BuiltInBundlingMinificationExplanation": "No se necesitan usar herramientas externas para el empaquetado y minificado. ABP ofrece un camino simple, dinámico, potente, modular e integrado.",
"VirtualFileSystem": "Sistema de ficheros virtual",
"VirtualFileSystemExplanation": "Incrusta vistas, scripts, estilos, imágenes en paquetes/ librerias y reusalos en diferentes aplicaciones.",
"Theming": "Temas",
"ThemingExplanationShort": "Usa y personaliza la UI estandar basada en bootstrap o crea tu propio tema.",
"BootstrapTagHelpersDynamicForms": "Boostrap Tag Helpers y formularios dinámicos",
"BootstrapTagHelpersDynamicFormsExplanation": "",
"HTTPAPIsDynamicProxies": "HTTP APIs y proxies dinámicos",
"HTTPAPIsDynamicProxiesExplanation": "Expon servicios de aplicación como REST HTPP APIs y consumelos dinámicamente desde proxies JavaScript y C#.",
"CompleteArchitectureInfo": "Arquitectura moderna para crear soluciones software sostenibles.",
"DomainDrivenDesignBasedLayeringModelExplanation": "Ayuda a implementar ",
"DomainDrivenDesignBasedLayeringModelExplanationCont": "Promorciona plantillas de inicio, clases base, servicios, documentación y guías de ayuda para desarrollar tu aplicación basada en patrones y principios DDD.",
"MicroserviceCompatibleModelExplanation": "El núcleo del framework y los modules pre-construidos están diseñados con una arquitectura microservicios en mente.",
"MicroserviceCompatibleModelExplanationCont": "Proporciona la infraestructura, integraciones, ejemplos y documentación para implementar soluciones microservicios más facilmente, mientras no trae complejidad adicional si quieres una aplicación monolítica.",
"ModularInfo": "ABP proporciona un sistema de modulos que te permite desarrollar modulos de aplicacion resusables. Conectado en el ciclo de eventos de aplicación y mínimas dependencias entre las partes principales de tu sistema.",
"PreBuiltModulesThemes": "Modulos y temas integrados",
"PreBuiltModulesThemesExplanation": "Módulos y temas de código abierto y comerciales preparados para usar en tu aplicación de negocio.",
"NuGetNPMPackages": "Paquetes Nuget y NPM",
"NuGetNPMPackagesExplanation": "Paquetes distribuidos a través de Nuget y NPM para instalar y actualizar.",
"ExtensibleReplaceable": "Extensible/ Reemplazable",
"ExtensibleReplaceableExplanation": "Todos los serivios y módulos están diseñados para ser extensibles. Tu puedes reemplazar servicios, páginas, estilos y componentes.",
"CrossCuttingConcernsExplanation2": "Mantiene tu código base más pequeño y te permite enforcate en el código que es especifico en tu negocio.",
"CrossCuttingConcernsExplanation3": "No pierdas tiempo implementando requerimientos comunes de aplicación en múltiples proyectos.",
"AuthenticationAuthorization": "Autenticación y autorización",
"ExceptionHandling": "Manejo de excepciones.",
"Validation": "Validación",
"DatabaseConnection": "Conexión a la base de datos",
"TransactionManagement": "Gestión de transacciones",
"AuditLogging": "Registro de auditoría",
"Caching": "Caché",
"Multitenancy": "Multi-inquilino",
"DataFiltering": "Filtrado de datos",
"ConventionOverConfiguration": "Convención sobre la configuración",
"ConventionOverConfigurationExplanation": "ABP implementa comunes convenciones de aplicación por defecto con una mínima o nula configuración.",
"ConventionOverConfigurationExplanationList1": "Los registradores conocen los servicios para la inyección de dependencias.",
"ConventionOverConfigurationExplanationList2": "Expone servicios de aplicación como APIs HTTP mediante convenciones de nomenclatura.",
"ConventionOverConfigurationExplanationList3": "Crea clientes proxies HTTP dinámicos para C# y JavaScript.",
"ConventionOverConfigurationExplanationList4": "Proporciona repositorios por defecto para tus entidades.",
"ConventionOverConfigurationExplanationList5": "Maneja Unit of Work por cada petición web o metodo de servicio de aplicación.",
"ConventionOverConfigurationExplanationList6": "Publica, crea, actualiza y borra eventos para tus entidades.",
"BaseClasses": "Clase base",
"BaseClassesExplanation": "Clases base integradas para patrones comunes de aplicación.",
"DeveloperFocusedExplanation": "ABP es para desarrolladores.",
"DeveloperFocusedExplanationCont": "Su objetivo es simplificar su desarrollo diario de software sin restringirle la escritura de código de bajo nivel.",
"SeeAllFeatures": "Ver todas las características",
"CLI_CommandLineInterface": "CLI (Command Line Interface)",
"CLI_CommandLineInterfaceExplanation": "Incluye un CLI que te ayuda a automatizar la creación de nuevos proyectos y añadir nuevos módulos.",
"StartupTemplates": "Plantillas de inicio",
"StartupTemplatesExplanation": "Varias plantillas de inicio proporcionan una solución completamente configurada lista para comenzar el desarrollo.",
"BasedOnFamiliarTools": "Basado en herramientas familiares",
"BasedOnFamiliarToolsExplanation": "Construido y diseñado con herramientas populares que tu ya conoces. Baja curva de aprendizaje, facil adaptación y desarrollo confortable.",
"ORMIndependent": "Independiente del ORM",
"ORMIndependentExplanation": "El núcleo del core es independiente del ORM/ base de datos y puedes trabajar con cualquier fuente de datos. Entity Framework Core y MongoDB están actualmente disponibles.",
"Features": "Explora las características de ABP Framework",
"ABPCLI": "ABP CLI",
"Modularity": "Modularidad",
"BootstrapTagHelpers": "Bootstrap Tag Helpers",
"DynamicForms": "Formularios dinámicos",
"BundlingMinification": "Empaquetado y Minimificación",
"BackgroundJobs": "",
"BackgroundJobsExplanation": "Defina clases simples para ejecutar trabajos en segundo plano como en cola. Utilice el administrador de trabajos integrado o integre el suyo propio. <a href=\"{0}\">Hangfire</a> & <a href=\"{1}\">RabbitMQ</a> integraciones están actualmente disponibles.",
"DDDInfrastructure": "infraestructura DSS",
"DomainDrivenDesignInfrastructure": "infraestructura Domain Driven Design",
"AutoRESTAPIs": "Auto REST APIs",
"DynamicClientProxies": "Clientes proxies dinámicos",
"DistributedEventBus": "Bus de eventos distribuido",
"DistributedEventBusWithRabbitMQIntegration": "Bus de eventos distribuido con la integración RabbitMQ ",
"TestInfrastructure": "infraestructura de Test",
"AuditLoggingEntityHistories": "Registro de auditoría y historial de entidades",
"ObjectToObjectMapping": "Mapeado objeto a objeto",
"ObjectToObjectMappingExplanation": "<a href=\"{0}\">Mapeado objeto a objeto</a> abstracción integrada con AutoMapper.",
"EmailSMSAbstractions": "Abstracciones para Email y SMS",
"EmailSMSAbstractionsWithTemplatingSupport": "Abstracciones para Email y SMS con soporte para plantillas",
"Localization": "Localización",
"SettingManagement": "Gestión de la configuración",
"ExtensionMethods": "Extension Methods",
"ExtensionMethodsHelpers": "Extension Methods & Helpers",
"AspectOrientedProgramming": "Programación orientada a aspectos",
"DependencyInjection": "Inyección de dependencias",
"DependencyInjectionByConventions": "Inyección de dependencias por convenciones",
"ABPCLIExplanation": "ABP CLI (Command Line Interface) es una herramienta en línea de comandos que proporciona ciertas tareas comunes para soluciones basadas en ABP.",
"ModularityExplanation": "ABP proporciona una infraestructura completa para construir tu propios módulos de aplicación que pueden contener entidades, servicios, base de datos integradas, APIs, componentes de UI y otros...",
"MultiTenancyExplanation": "ABP framework no sólo soporta el desarrollo de aplicaciones multi-inquilino, si no también hace que tu código no tenga que preocuparse de multi-inquilino.",
"MultiTenancyExplanation2": "Puedes determinar automaticamente el inquilino actual, y aislar los datos de diferentes inquilinos entre sí. ",
"MultiTenancyExplanation3": "Soporta base de datos única, base de datos por inquilino y enfoques híbridos.",
"MultiTenancyExplanation4": "Enfocate en tu código y deja al framework que maneje multi-inquilino en tu nombre.",
"BootstrapTagHelpersExplanation": "En vez de escribir repetidamente los detalle de componentes bootstrap, usa ABP's tag helpers para simplificarlo y obtener ventaja de intellisence. Tu puedes definitivamente usar Bootstrp cuando tu lo necesites.",
"DynamicFormsExplanation": "Los formularios dinámicos y tag helpers de entrada pueden crear el formulario completo a partir de una clase de C# como modelo. ",
"AuthenticationAuthorizationExplanation": "Autenticación enriquecidad y opciones de autorización integradas con ASP.NET Core Identity & IdentityServer4. Proporciona un extensible y detallado sistema de permisos.",
"CrossCuttingConcernsExplanation": "No te repitas tu mismo al implementar todas esas cosas comunes una y otra vez. Enfocate en tu negocio y permite a ABP automatizarlos por convención.",
"DatabaseConnectionTransactionManagement": "Conexión de base de datos y gestión de transacciones",
"CorrelationIdTracking": "Correlation-Id de seguimiento",
"BundlingMinificationExplanation": "ABP ofrece un sistema simple, dinámico, potente, modular y empaquetado & minificación ",
"VirtualFileSystemnExplanation": "El sistema de archivos virtuales permite administrar archivos que no existen físicamente en el sistema de archivos (disco). Se utiliza principalmente para incrustar (js, css, image, cshtml...) en ensamblados y utilizarlos como archivos físicos en tiempo de ejecución.",
"ThemingExplanation": "El sistema de temas permite desarrollar el tema de su aplicación y módulos independiente mediante la definición de un conjunto de bibliotecas y diseños base comunes, basado en el último marco de Trabajo bootstrap.",
"DomainDrivenDesignInfrastructureExplanation": "Una infraestructura completa para crear aplicaciones en capas basadas en los patrones y principios DDD",
"Specification": "Especificación",
"Repository": "Repositorios",
"DomainService": "Servicio de dominio",
"ValueObject": "Objetos de valor",
"ApplicationService": "Servicio de aplicación",
"DataTransferObject": "Objetos de transferencia de datos",
"AggregateRootEntity": "Agregado ráiz, Entidad",
"AutoRESTAPIsExplanation": "ABP puede configurar automáticamente los servicios de aplicación como controladores de API por convención.",
"DynamicClientProxiesExplanation": "Consuma fácilmente sus API de clientes de JavaScript y C#",
"DistributedEventBusWithRabbitMQIntegrationExplanation": "Publique y consuma eventos distribuidos fácilmente mediante el bus de eventos distribuido integrado con la integración RabbitMQ disponible.",
"TestInfrastructureExplanation": "El framework se ha desarrollado unitariamente y pruebas de integración. Proporciona clases base para que sea más fácil. Las plantillas de inicio vienen preconfiguradas para las pruebas.",
"AuditLoggingEntityHistoriesExplanation": "Registro de auditoría integrado para aplicaciones críticas para el negocio. Registro de auditorías de solicitud, servicio, nivel de método e historiales de entidades con detalles de nivel de propiedad.",
"EmailSMSAbstractionsWithTemplatingSupportExplanation": "Las abstracciones IEmailSender e ISmsSender desacoplan la lógica de la aplicación de la infraestructura. El sistema avanzado de plantillas de correo electrónico permite crear y localizar plantillas de correo electrónico y utilizarlas fácilmente cuando sea necesario.",
"LocalizationExplanation": "El sistema de localización permite crear recursos en archivos JSON sin formato y utilizarlos para localizar la interfaz de usuario. Admite escenarios avanzados como herencia, extensiones e integración de JavaScript, mientras que es totalmente compatible con el sistema de localización de AspNet Core.",
"SettingManagementExplanation": "Defina la configuración de la aplicación y obtenga valores en tiempo de ejecución en función de la configuración actual, el inquilino y el usuario.",
"ExtensionMethodsHelpersExplanation": "No te repitas ni siquiera para partes de código triviales. Extensiones y ayudantes para tipos estándar hace que su código sea mucho más limpio y fácil de escribir.",
"AspectOrientedProgrammingExplanation": "Proporciona una infraestructura cómoda para crear servidores proxy dinámicos e implementar la programación orientada a aspectos. Interceptar cualquier clase y ejecutar el código antes y después de cada ejecución del método.",
"DependencyInjectionByConventionsExplanation": "No es necesario registrar las clases en la inserción de dependencias manualmente. Registra automáticamente los tipos de servicio comunes por convención. Para otro tipo de servicios, puede utilizar interfaces y atributos para que sea más fácil y in situ.",
"DataFilteringExplanation": "Definir y usar filtros de datos que se aplican automáticamente al consultar entidades desde la base de datos. Los filtros Soft Delete & MultiTenant se proporcionan de fábrica cuando se implementan interfaces sencillas.",
"PublishEvents": "Publicar eventos",
"HandleEvents": "Manejar eventos",
"AndMore": "y más...",
"Code": "Código",
"Result": "Resultado",
"SeeTheDocumentForMoreInformation": "Ver el <a href=\"{1}\">{0} documento</a> para más información.",
"IndexPageHeroSection": "<span class=\"first-line shine\"><strong>Código fuente abierto</strong></span><span class=\"second-line text-uppercase\">Web Application<br />Framework </span><span class=\"third-line shine2\"><strong>para asp.net core</strong></span>",
"UiFramework": "UI Framework",
"EmailAddress": "Dirección de correo",
"Mobile": "Móvil",
"ReactNative": "React Nativo",
"Strong": "Fuerte",
"Complete": "Completar",
"BasedLayeringModel": "Módelo basado en capas",
"Microservice": "Microservicio",
"Compatible": "Compatible",
"MeeTTheABPCommunityInfo": "Nuestra misión es crear un entorno en el que los desarrolladores puedan ayudarse entre sí con artículos, tutoriales, estudios de casos, etc. y conocer personas de ideas afines.",
"JoinTheABPCommunityInfo": "¡Participe en una comunidad vibrante y conviértase en colaborador del Marco ABP!",
"AllArticles": "Todos los artículos",
"SubmitYourArticle": "Envía tu artículo",
"DynamicClientProxyDocument": "Ver la documentación del cliente proxy dinámico para <a href=\"{0}\">JavaScript</a> & <a href=\"{1}\">C#</a>.",
"EmailSMSAbstractionsDocument": "Ver los documentos de <a href=\"{0}\">emailing</a> y <a href=\"{1}\">envío SMS </a> para más información.",
"CreateProjectWizard": "Este asistente crea un nuevo proyecto a partir de la plantilla de inicio que está correctamente configurado para comenzar con su proyecto.",
"TieredOption": "Crea una solución por niveles en la que las capas de API Web y HTTP están separadas físicamente. Si no se marca, crea una solución en capas que es menos compleja y adecuada para la mayoría de los escenarios.",
"SeparateIdentityServerOption": "Separa el lado del servidor en dos aplicaciones: la primera es para el servidor de identidad y la segunda es para la API HTTP del lado del servidor.",
"UseslatestPreVersion": "Usar la última versión pre-release",
"ReadTheDocumentation": "<span class=\"text-primary\">Leer</span><span class=\"text-success\">La Documentación</span>",
"Documentation": "Documentación",
"GettingStartedTutorial": "Tutorial para iniciarse",
"ApplicationDevelopmentTutorial": "Tutorial de desarrollo de aplicación",
"TheStartupTemplate": "La Plantilla de Inicio",
"InstallABPCLIInfo": "ABP CLI es la forma más rápida de iniciar una nueva solución con el marco ABP. Instale la CLI de ABP mediante una ventana de línea de comandos:",
"DifferentLevelOfNamespaces": "Tu puedes usar diferentes niveles de espacio de nombres; ej. BookStore, Acme.BookStore or Acme.Retail.BookStore.",
"ABPCLIExamplesInfo": "<strong>nuevo</strong> comando crea una <strong>aplicación MVC por capas</strong> con <strong>Entity Framework Core</strong> como proveedor de base de datos. Sin embargo, tiene distintas opciones. Ejemplos:",
"SeeCliDocumentForMoreInformation": "Ver el <a href=\"{0}\">documento ABP CLI </a> para más opciones o selecciona la \"Direct Download\" pestaña de arriba.",
"Optional": "Opcional",
"LocalFrameworkRef": "Mantén la referencia al proyecto local para los paquetes del framework.",
"SelectLanguage": "Vali keel"
}
}

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/pt-BR.json

@ -154,6 +154,7 @@
"SeeTheDocumentForMoreInformation": "Consulte o <a href=\"{1}\">{0} documento</a> para obter mais informações", "SeeTheDocumentForMoreInformation": "Consulte o <a href=\"{1}\">{0} documento</a> para obter mais informações",
"IndexPageHeroSection": "<span class=\"first-line shine\"><strong>código aberto</strong></span><span class=\"second-line text-uppercase\">Aplicativo da Web<br />Framework </span><span class=\"third-line shine2\"><strong>para o ASP.NET Core</strong></span>", "IndexPageHeroSection": "<span class=\"first-line shine\"><strong>código aberto</strong></span><span class=\"second-line text-uppercase\">Aplicativo da Web<br />Framework </span><span class=\"third-line shine2\"><strong>para o ASP.NET Core</strong></span>",
"UiFramework": "UI Framework", "UiFramework": "UI Framework",
"EmailAddress": "Endereço de email" "EmailAddress": "Endereço de email",
"SelectLanguage": "Selecione o idioma"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json

@ -156,6 +156,7 @@
"UiFramework": "UI Framework", "UiFramework": "UI Framework",
"EmailAddress": "E-Posta Adresi", "EmailAddress": "E-Posta Adresi",
"Mobile": "Mobil", "Mobile": "Mobil",
"ReactNative": "React Native" "ReactNative": "React Native",
"SelectLanguage": "Dil seçin"
} }
} }

13
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json

@ -184,6 +184,15 @@
"ABPCLIExamplesInfo": "<strong>new</strong>命令创建一个 <strong>分层的MVC应用程序</strong> 使用 <strong>Entity Framework Core</strong> 做为数据库提供程序. 它还有其他选项. 示例:", "ABPCLIExamplesInfo": "<strong>new</strong>命令创建一个 <strong>分层的MVC应用程序</strong> 使用 <strong>Entity Framework Core</strong> 做为数据库提供程序. 它还有其他选项. 示例:",
"SeeCliDocumentForMoreInformation": "参阅 <a href=\"{0}\">ABP CLI 文档</a> 获得更多选项或选择上方的 \"直接下载\" 标签.", "SeeCliDocumentForMoreInformation": "参阅 <a href=\"{0}\">ABP CLI 文档</a> 获得更多选项或选择上方的 \"直接下载\" 标签.",
"Optional": "可选的", "Optional": "可选的",
"LocalFrameworkRef": "保留框架包的本地项目引用." "LocalFrameworkRef": "保留框架包的本地项目引用.",
"BlobStoring": "BLOB存储",
"BlobStoringExplanation": "BLOB存储系统提供了BLOB的抽象. ABP提供了一些预构建的存储提供程序集成(Azure,AWS,文件系统,数据库等),你可以轻松的在你的应用程序中使用它们.",
"TextTemplating": "文本模板",
"TextTemplatingExplanation": "文本模板是基于模板和模型(数据对象)使用动态渲染内容. 例如你可以使用预构建的模板来创建动态的电子邮件内容.",
"MultipleUIOptions": "多个UI选项",
"MultipleDBOptions": "多个数据库提供程序",
"MultipleUIOptionsExplanation": "核心框架设计为独立与UI,可以和任何类型的UI系统一起使用. 同时提供了多个开箱即用的预构建集成选项.",
"MultipleDBOptionsExplanation": "该框架可以使用任何数据源,并且以下提供程序已得到正式开发和支持;",
"SelectLanguage": "选择语言"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hant.json

@ -154,6 +154,7 @@
"SeeTheDocumentForMoreInformation": "查看<a href=\"{1}\">{0} 文件</a>獲得更多訊息", "SeeTheDocumentForMoreInformation": "查看<a href=\"{1}\">{0} 文件</a>獲得更多訊息",
"IndexPageHeroSection": "<span class=\"third-line shine2\"><strong>asp.net core的</strong></span><span class=\"first-line shine\"><strong>開源</strong></span><span class=\"second-line text-uppercase\">Web應用程式<br />框架 </span>", "IndexPageHeroSection": "<span class=\"third-line shine2\"><strong>asp.net core的</strong></span><span class=\"first-line shine\"><strong>開源</strong></span><span class=\"second-line text-uppercase\">Web應用程式<br />框架 </span>",
"UiFramework": "UI框架", "UiFramework": "UI框架",
"EmailAddress": "電子信箱地址" "EmailAddress": "電子信箱地址",
"SelectLanguage": "选择语言"
} }
} }

12
common.DotSettings

@ -20,6 +20,18 @@
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Async/@EntryIndexedValue">False</s:String> <s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Async/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Mutable/@EntryIndexedValue">False</s:String> <s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Mutable/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SQL/@EntryIndexedValue">SQL</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SQL/@EntryIndexedValue">SQL</s:String>
<s:Boolean x:Key="/Default/Environment/InlayHints/CppTypeNameHintsOptions/HideTypeNameHintsWhenTypeNameIsEvidentFromVariableName/@EntryValue">False</s:Boolean>
<s:String x:Key="/Default/Environment/InlayHints/CppTypeNameHintsOptions/ShowMethodReturnTypeNameHints/@EntryValue">Never</s:String>
<s:String x:Key="/Default/Environment/InlayHints/CppTypeNameHintsOptions/ShowTypeNameHintsForImplicitlyTypedVariables/@EntryValue">Never</s:String>
<s:Boolean x:Key="/Default/Environment/InlayHints/CSharpTypeNameHintsOptions/HideTypeNameHintsWhenTypeNameIsEvidentFromVariableName/@EntryValue">False</s:Boolean>
<s:String x:Key="/Default/Environment/InlayHints/CSharpTypeNameHintsOptions/ShowMethodReturnTypeNameHints/@EntryValue">Never</s:String>
<s:String x:Key="/Default/Environment/InlayHints/CSharpTypeNameHintsOptions/ShowTypeNameHintsForImplicitlyTypedVariables/@EntryValue">Never</s:String>
<s:String x:Key="/Default/Environment/InlayHints/CSharpTypeNameHintsOptions/ShowTypeNameHintsForLambdaExpressionParameters/@EntryValue">Never</s:String>
<s:String x:Key="/Default/Environment/InlayHints/CSharpTypeNameHintsOptions/ShowTypeNameHintsForLinqQueryRangeVariables/@EntryValue">Never</s:String>
<s:String x:Key="/Default/Environment/InlayHints/CSharpTypeNameHintsOptions/ShowTypeNameHintsForPatternMatchingExpressions/@EntryValue">Never</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002ECpp_002EDaemon_002EInlayHints_002ETypeNameHints_002ECppTypeNameHintsOptionsMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002ECpp_002EDaemon_002ETypeNameHints_002ECppTypeNameHintsOptionsMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002ECSharp_002ETypeNameHints_002ECSharpTypeNameHintsOptionsMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/TypeNameHintsOptions/HideTypeNameHintsWhenTypeNameIsEvidentFromVariableName/@EntryValue">False</s:Boolean> <s:Boolean x:Key="/Default/Environment/TypeNameHintsOptions/HideTypeNameHintsWhenTypeNameIsEvidentFromVariableName/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/Environment/TypeNameHintsOptions/ShowMethodReturnTypeNameHints/@EntryValue">False</s:Boolean> <s:Boolean x:Key="/Default/Environment/TypeNameHintsOptions/ShowMethodReturnTypeNameHints/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/Environment/TypeNameHintsOptions/ShowTypeNameHintsForImplicitlyTypedVariables/@EntryValue">False</s:Boolean> <s:Boolean x:Key="/Default/Environment/TypeNameHintsOptions/ShowTypeNameHintsForImplicitlyTypedVariables/@EntryValue">False</s:Boolean>

12
common.props

@ -1,7 +1,7 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Version>4.0.0</Version> <Version>4.3.0</Version>
<NoWarn>$(NoWarn);CS1591;CS0436</NoWarn> <NoWarn>$(NoWarn);CS1591;CS0436</NoWarn>
<PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl> <PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>https://abp.io/</PackageProjectUrl> <PackageProjectUrl>https://abp.io/</PackageProjectUrl>
@ -9,8 +9,14 @@
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/abpframework/abp/</RepositoryUrl> <RepositoryUrl>https://github.com/abpframework/abp/</RepositoryUrl>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
<!-- Include symbol files (*.pdb) in the built .nupkg -->
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.3" PrivateAssets="All" /> <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.0-beta-20204-02">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup> </ItemGroup>
</Project> </Project>

53
docs/en/API/Dynamic-CSharp-API-Clients.md

@ -1,10 +1,23 @@
# Dynamic C# API Clients # Dynamic C# API Client Proxies
ABP can dynamically create C# API client proxies to call remote HTTP services (REST APIs). In this way, you don't need to deal with `HttpClient` and other low level HTTP features to call remote services and get results. ABP can dynamically create C# API client proxies to call your remote HTTP services (REST APIs). In this way, you don't need to deal with `HttpClient` and other low level details to call remote services and get results.
Dynamic C# proxies automatically handles the following stuff for you;
* 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 access token to the HTTP header.
* **Serializes** to and deserialize from JSON.
* Handles HTTP API **versioning**.
* Add **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.
This system can be used by any type of .NET client to consume your HTTP APIs.
## Service Interface ## Service Interface
Your service/controller should implement an interface that is shared between the server and the client. So, first define a service interface in a shared library project. Example: Your service/controller should implement an interface that is shared between the server and the client. So, first define a service interface in a shared library project, typically in the `Application.Contracts` project if you've created your solution using the startup templates.
Example:
````csharp ````csharp
public interface IBookAppService : IApplicationService public interface IBookAppService : IApplicationService
@ -13,7 +26,7 @@ public interface IBookAppService : IApplicationService
} }
```` ````
Your interface should implement the `IRemoteService` interface to be automatically discovered. Since the `IApplicationService` inherits the `IRemoteService` interface, the `IBookAppService` above satisfies this condition. > Your interface should implement the `IRemoteService` interface to be automatically discovered. Since the `IApplicationService` inherits the `IRemoteService` interface, the `IBookAppService` above satisfies this condition.
Implement this class in your service application. You can use [auto API controller system](Auto-API-Controllers.md) to expose the service as a REST API endpoint. Implement this class in your service application. You can use [auto API controller system](Auto-API-Controllers.md) to expose the service as a REST API endpoint.
@ -55,6 +68,8 @@ public class MyClientAppModule : AbpModule
`AddHttpClientProxies` method gets an assembly, finds all service interfaces in the given assembly, creates and registers proxy classes. `AddHttpClientProxies` method gets an assembly, finds all service interfaces in the given assembly, creates and registers proxy classes.
> The startup templates already comes pre-configured for the client proxy generation, in the `HttpApi.Client` project.
### Endpoint Configuration ### Endpoint Configuration
`RemoteServices` section in the `appsettings.json` file is used to get remote service address by default. Simplest configuration is shown below: `RemoteServices` section in the `appsettings.json` file is used to get remote service address by default. Simplest configuration is shown below:
@ -106,7 +121,7 @@ While you can inject `IBookAppService` like above to use the client proxy, you c
### AbpRemoteServiceOptions ### AbpRemoteServiceOptions
`AbpRemoteServiceOptions` is automatically set from the `appsettings.json` by default. Alternatively, you can use `Configure` method to set or override it. Example: `AbpRemoteServiceOptions` is automatically set from the `appsettings.json` by default. Alternatively, you can configure it in the `ConfigureServices` method of your [module](../Module-Development-Basics.md) to set or override it. Example:
````csharp ````csharp
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
@ -162,4 +177,30 @@ context.Services.AddHttpClientProxies(
Using `asDefaultServices: false` may only be needed if your application has already an implementation of the service and you do not want to override/replace the other implementation by your client proxy. Using `asDefaultServices: false` may only be needed if your application has already an implementation of the service and you do not want to override/replace the other implementation by your client proxy.
> If you disable `asDefaultServices`, you can only use `IHttpClientProxy<T>` interface to use the client proxies. See the *IHttpClientProxy Interface* section above. > If you disable `asDefaultServices`, you can only use `IHttpClientProxy<T>` interface to use the client proxies. See the *IHttpClientProxy Interface* section above.
### Retry/Failure Logic & Polly Integration
If you want to add retry logic for the failing remote HTTP calls for the client proxies, you can configure the `AbpHttpClientBuilderOptions` in the `PreConfigureServices` method of your module class.
**Example: Use the [Polly](https://github.com/App-vNext/Polly) library to re-try 3 times on a failure**
````csharp
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<AbpHttpClientBuilderOptions>(options =>
{
options.ProxyClientBuildActions.Add((remoteServiceName, clientBuilder) =>
{
clientBuilder.AddTransientHttpErrorPolicy(policyBuilder =>
policyBuilder.WaitAndRetryAsync(
3,
i => TimeSpan.FromSeconds(Math.Pow(2, i))
)
);
});
});
}
````
This example uses the [Microsoft.Extensions.Http.Polly](https://www.nuget.org/packages/Microsoft.Extensions.Http.Polly) package. You also need to import the `Polly` namespace (`using Polly;`) to be able to use the `WaitAndRetryAsync` method.

6
docs/en/Application-Services.md

@ -342,12 +342,12 @@ public class DistrictAppService
{ {
} }
protected override async Task DeleteByIdAsync(DistrictKey id) protected async override Task DeleteByIdAsync(DistrictKey id)
{ {
await Repository.DeleteAsync(d => d.CityId == id.CityId && d.Name == id.Name); await Repository.DeleteAsync(d => d.CityId == id.CityId && d.Name == id.Name);
} }
protected override async Task<District> GetEntityByIdAsync(DistrictKey id) protected async override Task<District> GetEntityByIdAsync(DistrictKey id)
{ {
return await AsyncQueryableExecuter.FirstOrDefaultAsync( return await AsyncQueryableExecuter.FirstOrDefaultAsync(
Repository.Where(d => d.CityId == id.CityId && d.Name == id.Name) Repository.Where(d => d.CityId == id.CityId && d.Name == id.Name)
@ -400,7 +400,7 @@ public class MyPeopleAppService : CrudAppService<Person, PersonDto, Guid>
{ {
} }
protected override async Task CheckDeletePolicyAsync() protected async override Task CheckDeletePolicyAsync()
{ {
await AuthorizationService.CheckAsync("..."); await AuthorizationService.CheckAsync("...");
} }

2
docs/en/AspNet-Boilerplate-Migration-Guide.md

@ -438,7 +438,7 @@ ABP Framework uses and extends ASP.NET Core's [distributed caching abstraction](
### Logging ### Logging
ASP.NET Boilerplate uses Castle Windsor's [logging facility](http://docs.castleproject.org/Windsor.Logging-Facility.ashx) as an abstraction and supports multiple logging providers including Log4Net (the default one comes with the startup projects) and Serilog. You typically property-inject the logger: ASP.NET Boilerplate uses Castle Windsor's [logging facility](https://github.com/castleproject/Windsor/blob/master/docs/logging-facility.md) as an abstraction and supports multiple logging providers including Log4Net (the default one comes with the startup projects) and Serilog. You typically property-inject the logger:
````csharp ````csharp
using Castle.Core.Logging; //1: Import Logging namespace using Castle.Core.Logging; //1: Import Logging namespace

31
docs/en/Authentication/Social-External-Logins.md

@ -1,32 +1,3 @@
# Social/External Logins # Social/External Logins
The [Account Module](../Modules/Account.md) has already configured to handle social or external logins out of the box. You can follow the ASP.NET Core documentation to add a social/external login provider to your application. > This document has been moved. See the [Account Module](../Modules/Account.md) documentation.
## Example: Facebook Authentication
Follow the [ASP.NET Core Facebook integration document](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/facebook-logins) to support the Facebook login for your application.
#### Add the NuGet Package
Add the [Microsoft.AspNetCore.Authentication.Facebook](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.Facebook) package to your project. Based on your architecture, this can be `.Web`, `.IdentityServer` (for tiered setup) or `.Host` project.
#### Configure the Provider
Use the `.AddFacebook(...)` extension method in the `ConfigureServices` method of your [module](../Module-Development-Basics.md), to configure the client:
````csharp
context.Services.AddAuthentication()
.AddFacebook(facebook =>
{
facebook.AppId = "...";
facebook.AppSecret = "...";
facebook.Scope.Add("email");
facebook.Scope.Add("public_profile");
});
````
> It would be a better practice to use the `appsettings.json` or the ASP.NET Core User Secrets system to store your credentials, instead of a hard-coded value like that. Follow the [Microsoft's document](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/facebook-logins) to learn the user secrets usage.
## Angular UI
Beginning from the v3.1, the Angular UI uses authorization code flow (as a best practice) to authenticate the user by redirecting to the MVC UI login page. So, even if you are using the Angular UI, social/external login integration is same as explained above and it will work out of the box.

24
docs/en/Authorization.md

@ -234,7 +234,7 @@ context
When you write this code inside your permission definition provider, it finds the "role deletion" permission of the [Identity Module](Modules/Identity.md) and disabled the permission, so no one can delete a role on the application. When you write this code inside your permission definition provider, it finds the "role deletion" permission of the [Identity Module](Modules/Identity.md) and disabled the permission, so no one can delete a role on the application.
> Tip: It is better to check the value returned by the `GetPermissionOrNull` method since it may return null if the given permission was not defined. > Tip: It is better to check the value returned by the `GetPermissionOrNull` method since it may return null if the given permission was not defined.
## IAuthorizationService ## IAuthorizationService
@ -280,21 +280,11 @@ public async Task CreateAsync(CreateAuthorDto input)
## Check a Permission in JavaScript ## Check a Permission in JavaScript
You may need to check a policy/permission on the client side. See the following documents to learn how to re-use the authorization system on the client side:
### MVC UI * [ASP.NET Core MVC / Razor Pages UI: Authorization](UI/AspNetCore/JavaScript-API/Auth.md)
* [Angular UI Authorization](UI/Angular/Permission-Management.md)
For ASP.NET Core MVC / Razor Pages applications, you can use the `abp.auth` API. * [Blazor UI Authorization](UI/Blazor/Authorization.md)
**Example: Check if a given permission has been granted for the current user**
```js
abp.auth.isGranted('MyPermissionName');
```
### Angular UI
See the [permission management document](UI/Angular/Permission-Management.md) for the Angular UI.
## Permission Management ## Permission Management
@ -354,7 +344,7 @@ public class SystemAdminPermissionValueProvider : PermissionValueProvider
public override string Name => "SystemAdmin"; public override string Name => "SystemAdmin";
public override async Task<PermissionGrantResult> public async override Task<PermissionGrantResult>
CheckAsync(PermissionValueCheckContext context) CheckAsync(PermissionValueCheckContext context)
{ {
if (context.Principal?.FindFirst("User_Type")?.Value == "SystemAdmin") if (context.Principal?.FindFirst("User_Type")?.Value == "SystemAdmin")
@ -406,5 +396,5 @@ This is already done for the startup template integration tests.
## See Also ## See Also
* [Permission Management Module](Modules/Permission-Management.md) * [Permission Management Module](Modules/Permission-Management.md)
* [ASP.NET Core MVC / Razor Pages JavaScript Auth API](API/JavaScript-API/Auth.md) * [ASP.NET Core MVC / Razor Pages JavaScript Auth API](UI/AspNetCore/JavaScript-API/Auth.md)
* [Permission Management in Angular UI](UI/Angular/Permission-Management.md) * [Permission Management in Angular UI](UI/Angular/Permission-Management.md)

132
docs/en/Background-Jobs-RabbitMq.md

@ -1,3 +1,133 @@
# RabbitMQ Background Job Manager # RabbitMQ Background Job Manager
TODO RabbitMQ is an industry standard message broker. While it is typically used for inter-process communication (messaging / distributed events), it is pretty useful to store and execute background jobs in FIFO (First In First Out) order.
ABP Framework provides the [Volo.Abp.BackgroundJobs.RabbitMQ](https://www.nuget.org/packages/Volo.Abp.BackgroundJobs.RabbitMQ) NuGet package to use the RabbitMQ for background job execution.
> See the [background jobs document](Background-Jobs.md) to learn how to use the background job system. This document only shows how to install and configure the RabbitMQ integration.
## Installation
Use the ABP CLI to add [Volo.Abp.BackgroundJobs.RabbitMQ](https://www.nuget.org/packages/Volo.Abp.BackgroundJobs.RabbitMQ) NuGet package to your project:
* Install the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) if you haven't installed before.
* Open a command line (terminal) in the directory of the `.csproj` file you want to add the `Volo.Abp.BackgroundJobs.RabbitMQ` package.
* Run `abp add-package Volo.Abp.BackgroundJobs.RabbitMQ` command.
If you want to do it manually, install the [Volo.Abp.BackgroundJobs.RabbitMQ](https://www.nuget.org/packages/Volo.Abp.BackgroundJobs.RabbitMQ) NuGet package to your project and add `[DependsOn(typeof(AbpBackgroundJobsRabbitMqModule))]` to the [ABP module](Module-Development-Basics.md) class inside your project.
## Configuration
### Default Configuration
The default configuration automatically connects to the local RabbitMQ server (localhost) with the standard port. **In this case, no configuration needed.**
### RabbitMQ Connection(s)
You can configure the RabbitMQ connections using the standard [configuration system](Configuration.md), like using the `appsettings.json` file, or using the [options](Options.md) classes.
#### `appsettings.json` file configuration
This is the simplest way to configure the RabbitMQ connections. It is also very strong since you can use any other configuration source (like environment variables) that is [supported by the AspNet Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/).
**Example: Configuring the Default RabbitMQ Connection**
````json
{
"RabbitMQ": {
"Connections": {
"Default": {
"HostName": "123.123.123.123",
"Port": "5672"
}
}
}
}
````
You can use any of the [ConnectionFactry](http://rabbitmq.github.io/rabbitmq-dotnet-client/api/RabbitMQ.Client.ConnectionFactory.html#properties) properties as the connection properties. See [the RabbitMQ document](https://www.rabbitmq.com/dotnet-api-guide.html#exchanges-and-queues) to understand these options better.
Defining multiple connections is allowed. In this case, you can use different connections for different background job types (see the `AbpRabbitMqBackgroundJobOptions` section below).
**Example: Declare two connections**
````json
{
"RabbitMQ": {
"Connections": {
"Default": {
"HostName": "123.123.123.123"
},
"SecondConnection": {
"HostName": "321.321.321.321"
}
}
}
}
````
#### AbpRabbitMqOptions
`AbpRabbitMqOptions` class can be used to configure the connection strings for the RabbitMQ. You can configure this options inside the `ConfigureServices` of your [module](Module-Development-Basics.md).
**Example: Configure the connection**
````csharp
Configure<AbpRabbitMqOptions>(options =>
{
options.Connections.Default.UserName = "user";
options.Connections.Default.Password = "pass";
options.Connections.Default.HostName = "123.123.123.123";
options.Connections.Default.Port = 5672;
});
````
Using these options classes can be combined with the `appsettings.json` way. Configuring an option property in the code overrides the value in the configuration file.
### AbpRabbitMqBackgroundJobOptions
#### Job Queue Names
By default, each job type uses a separate queue. Queue names are calculated by combining a standard prefix and the job name. Default prefix is `AbpBackgroundJobs.` So, if the job name is `EmailSending` then the queue name in the RabbitMQ becomes `AbpBackgroundJobs.EmailSending`
> Use `BackgroundJobName` attribute on the background **job argument** class to specify the job name. Otherwise, the job name will be the full name (with namespace) of the job class.
#### Job Connections
By default, all the job types use the `Default` RabbitMQ connection.
#### Customization
`AbpRabbitMqBackgroundJobOptions` can be used to customize the queue names and the connections used by the jobs.
**Example:**
````csharp
Configure<AbpRabbitMqBackgroundJobOptions>(options =>
{
options.DefaultQueueNamePrefix = "my_app_jobs.";
options.JobQueues[typeof(EmailSendingArgs)] =
new JobQueueConfiguration(
typeof(EmailSendingArgs),
queueName: "my_app_jobs.emails",
connectionName: "SecondConnection"
);
});
````
* This example sets the default queue name prefix to `my_app_jobs.`. If different applications use the same RabbitMQ server, it would be important to use different prefixes for each application to not consume jobs of each other.
* Also specifies a different connection string for the `EmailSendingArgs`.
`JobQueueConfiguration` class has some additional options in its constructor;
* `queueName`: The queue name that is used for this job. The prefix is not added, so you need to specify the full name of the queue.
* `connectionName`: The RabbitMQ connection name (see the connection configuration above). This is optional and the default value is `Default`.
* `durable` (optional, default: `true`).
* `exclusive` (optional, default: `false`).
* `autoDelete` (optional, default: `false`)
See the RabbitMQ documentation if you want to understand the `durable`, `exclusive` and `autoDelete` options better, while most of the times the default configuration is what you want.
## See Also
* [Background Jobs](Background-Jobs.md)

47
docs/en/Background-Jobs.md

@ -13,7 +13,7 @@ Background jobs are **persistent** that means they will be **re-tried** and **ex
ABP provides an **abstraction** module and **several implementations** for background jobs. It has a built-in/default implementation as well as Hangfire, RabbitMQ and Quartz integrations. ABP provides an **abstraction** module and **several implementations** for background jobs. It has a built-in/default implementation as well as Hangfire, RabbitMQ and Quartz integrations.
`Volo.Abp.BackgroundJobs.Abstractions` nuget package provides needed services to create background jobs and queue background job items. If your module only depend on this package, it can be independent from the actual implementation/integration. `Volo.Abp.BackgroundJobs.Abstractions` NuGet package provides needed services to create background jobs and queue background job items. If your module only depend on this package, it can be independent from the actual implementation/integration.
> `Volo.Abp.BackgroundJobs.Abstractions` package is installed to the startup templates by default. > `Volo.Abp.BackgroundJobs.Abstractions` package is installed to the startup templates by default.
@ -24,23 +24,29 @@ A background job is a class that implements the `IBackgroundJob<TArgs>` interfac
This example is used to send emails in background. First, define a class to store arguments of the background job: This example is used to send emails in background. First, define a class to store arguments of the background job:
````csharp ````csharp
public class EmailSendingArgs namespace MyProject
{ {
public string EmailAddress { get; set; } public class EmailSendingArgs
public string Subject { get; set; } {
public string Body { get; set; } public string EmailAddress { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
} }
```` ````
Then create a background job class that uses an `EmailSendingArgs` object to send an email: Then create a background job class that uses an `EmailSendingArgs` object to send an email:
````csharp ````csharp
using System.Threading.Tasks;
using Volo.Abp.BackgroundJobs; using Volo.Abp.BackgroundJobs;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Emailing; using Volo.Abp.Emailing;
namespace MyProject namespace MyProject
{ {
public class EmailSendingJob : BackgroundJob<EmailSendingArgs>, ITransientDependency public class EmailSendingJob
: AsyncBackgroundJob<EmailSendingArgs>, ITransientDependency
{ {
private readonly IEmailSender _emailSender; private readonly IEmailSender _emailSender;
@ -49,9 +55,9 @@ namespace MyProject
_emailSender = emailSender; _emailSender = emailSender;
} }
public override void Execute(EmailSendingArgs args) public override async Task ExecuteAsync(EmailSendingArgs args)
{ {
_emailSender.Send( await _emailSender.SendAsync(
args.EmailAddress, args.EmailAddress,
args.Subject, args.Subject,
args.Body args.Body
@ -63,10 +69,35 @@ namespace MyProject
This job simply uses `IEmailSender` to send emails (see [email sending document](Emailing.md)). This job simply uses `IEmailSender` to send emails (see [email sending document](Emailing.md)).
> `AsyncBackgroundJob` is used to create a job needs to perform async calls. You can inherit from `BackgroundJob<TJob>` and override the `Execute` method if the method doesn't need to perform any async call.
#### Exception Handling #### Exception Handling
A background job should not hide exceptions. If it throws an exception, the background job is automatically re-tried after a calculated waiting time. Hide exceptions only if you don't want to re-run the background job for the current argument. A background job should not hide exceptions. If it throws an exception, the background job is automatically re-tried after a calculated waiting time. Hide exceptions only if you don't want to re-run the background job for the current argument.
#### Job Name
Each background job has a name. Job names are used in several places. For example, RabbitMQ provider uses job names to determine the RabbitMQ Queue names.
Job name is determined by the **job argument type**. For the `EmailSendingArgs` example above, the job name is `MyProject.EmailSendingArgs` (full name, including the namespace). You can use the `BackgroundJobName` attribute to set a different job name.
**Example**
```csharp
using Volo.Abp.BackgroundJobs;
namespace MyProject
{
[BackgroundJobName("emails")]
public class EmailSendingArgs
{
public string EmailAddress { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
}
```
### Queue a Job Item ### Queue a Job Item
Now, you can queue an email sending job using the `IBackgroundJobManager` service: Now, you can queue an email sending job using the `IBackgroundJobManager` service:

2
docs/en/Background-Workers-Quartz.md

@ -37,7 +37,7 @@ public class YourModule : AbpModule
```` ````
> Quartz background worker integration provided `QuartzPeriodicBackgroundWorkerAdapter` to adapt `PeriodicBackgroundWorkerBase` and `AsyncPeriodicBackgroundWorkerBase` derived class. So, you can still fllow the [background workers document](Background-Workers.md) to define the background worker. > Quartz background worker integration provided `QuartzPeriodicBackgroundWorkerAdapter` to adapt `PeriodicBackgroundWorkerBase` and `AsyncPeriodicBackgroundWorkerBase` derived class. So, you can still fllow the [background workers document](Background-Workers.md) to define the background worker.
> `BackgroundJobWorker` checks todo jobs every 5 seconds, but quartz will not block when long time jobs are executing. So,after Added Quartz background worker integration, you also need to add [Quartz Background Jobs](Background-Jobs-Quartz.md) or [Hangfire Background Jobs](Background-Jobs-Hangfire.md) to avoid duplicate execution jobs. > `BackgroundJobWorker` checks jobs every 5 seconds, but quartz will not block when long time jobs are executing. So,after Added Quartz background worker integration, you also need to add [Quartz Background Jobs](Background-Jobs-Quartz.md) or [Hangfire Background Jobs](Background-Jobs-Hangfire.md) to avoid duplicate execution jobs.
## Configuration ## Configuration

8
docs/en/Background-Workers.md

@ -45,7 +45,7 @@ Assume that we want to make a user passive, if the user has not logged in to the
public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase
{ {
public PassiveUserCheckerWorker( public PassiveUserCheckerWorker(
AbpTimer timer, AbpAsyncTimer timer,
IServiceScopeFactory serviceScopeFactory IServiceScopeFactory serviceScopeFactory
) : base( ) : base(
timer, timer,
@ -54,7 +54,7 @@ public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase
Timer.Period = 600000; //10 minutes Timer.Period = 600000; //10 minutes
} }
protected override async Task DoWorkAsync( protected async override Task DoWorkAsync(
PeriodicBackgroundWorkerContext workerContext) PeriodicBackgroundWorkerContext workerContext)
{ {
Logger.LogInformation("Starting: Setting status of inactive users..."); Logger.LogInformation("Starting: Setting status of inactive users...");
@ -80,7 +80,7 @@ public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase
## Register Background Worker ## Register Background Worker
After creating a background worker class, you should to 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 `OnApplicationInitialization` method of your module class:
````csharp ````csharp
[DependsOn(typeof(AbpBackgroundWorkersModule))] [DependsOn(typeof(AbpBackgroundWorkersModule))]
@ -137,4 +137,4 @@ ABP Framework's background worker system is good to implement periodic tasks. Ho
## See Also ## See Also
* [Quartz Integration for the background workers](Background-Workers-Quartz.md) * [Quartz Integration for the background workers](Background-Workers-Quartz.md)
* [Background Jobs](Background-Jobs.md) * [Background Jobs](Background-Jobs.md)

2
docs/en/Blob-Storing-Aliyun.md

@ -55,7 +55,7 @@ Configure<AbpBlobStoringOptions>(options =>
* **RoleSessionName** ([NotNull]string): Used to identify the temporary access credentials, it is recommended to use different application users to distinguish. * **RoleSessionName** ([NotNull]string): Used to identify the temporary access credentials, it is recommended to use different application users to distinguish.
* **Policy** (string): Additional permission restrictions. See the [document](https://help.aliyun.com/document_detail/100680.html) for details. * **Policy** (string): Additional permission restrictions. See the [document](https://help.aliyun.com/document_detail/100680.html) for details.
* **DurationSeconds** (int): Validity period(s) of a temporary access certificate,minimum is 900 and the maximum is 3600. * **DurationSeconds** (int): Validity period(s) of a temporary access certificate,minimum is 900 and the maximum is 3600.
* **ContainerName** (string): You can specify the container name in Aliyun. If this is not specified, it uses the name of the BLOB container defined with the `BlogContainerName` attribute (see the [BLOB storing document](Blob-Storing.md)). Please note that Aliyun has some **rules for naming containers**. A container name must be a valid DNS name, conforming to the [following naming rules](https://help.aliyun.com/knowledge_detail/39668.html): * **ContainerName** (string): You can specify the container name in Aliyun. If this is not specified, it uses the name of the BLOB container defined with the `BlobContainerName` attribute (see the [BLOB storing document](Blob-Storing.md)). Please note that Aliyun has some **rules for naming containers**. A container name must be a valid DNS name, conforming to the [following naming rules](https://help.aliyun.com/knowledge_detail/39668.html):
* Container names must start or end with a letter or number, and can contain only letters, numbers, and the dash (-) character. * Container names must start or end with a letter or number, and can contain only letters, numbers, and the dash (-) character.
* Container names Must start and end with lowercase letters and numbers. * Container names Must start and end with lowercase letters and numbers.
* Container names must be from **3** through **63** characters long. * Container names must be from **3** through **63** characters long.

2
docs/en/Blob-Storing-Aws.md

@ -60,7 +60,7 @@ Configure<AbpBlobStoringOptions>(options =>
* **Region** (string): The system name of the service. * **Region** (string): The system name of the service.
* **Policy** (string): An IAM policy in JSON format that you want to use as an inline session policy. * **Policy** (string): An IAM policy in JSON format that you want to use as an inline session policy.
* **DurationSeconds** (int): Validity period(s) of a temporary access certificate,minimum is 900 and the maximum is 3600. **note**: Using subaccounts operated OSS,if the value is 0. * **DurationSeconds** (int): Validity period(s) of a temporary access certificate,minimum is 900 and the maximum is 3600. **note**: Using subaccounts operated OSS,if the value is 0.
* **ContainerName** (string): You can specify the container name in Aws. If this is not specified, it uses the name of the BLOB container defined with the `BlogContainerName` attribute (see the [BLOB storing document](Blob-Storing.md)). Please note that Aws has some **rules for naming containers**. A container name must be a valid DNS name, conforming to the [following naming rules](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html): * **ContainerName** (string): You can specify the container name in Aws. If this is not specified, it uses the name of the BLOB container defined with the `BlobContainerName` attribute (see the [BLOB storing document](Blob-Storing.md)). Please note that Aws has some **rules for naming containers**. A container name must be a valid DNS name, conforming to the [following naming rules](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html):
* Bucket names must be between **3** and **63** characters long. * Bucket names must be between **3** and **63** characters long.
* Bucket names can consist only of **lowercase** letters, numbers, dots (.), and hyphens (-). * Bucket names can consist only of **lowercase** letters, numbers, dots (.), and hyphens (-).
* Bucket names must begin and end with a letter or number. * Bucket names must begin and end with a letter or number.

2
docs/en/Blob-Storing-Azure.md

@ -40,7 +40,7 @@ Configure<AbpBlobStoringOptions>(options =>
### Options ### Options
* **ConnectionString** (string): A connection string includes the authorization information required for your application to access data in an Azure Storage account at runtime using Shared Key authorization. Please refer to Azure documentation: https://docs.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string * **ConnectionString** (string): A connection string includes the authorization information required for your application to access data in an Azure Storage account at runtime using Shared Key authorization. Please refer to Azure documentation: https://docs.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string
* **ContainerName** (string): You can specify the container name in azure. If this is not specified, it uses the name of the BLOB container defined with the `BlogContainerName` attribute (see the [BLOB storing document](Blob-Storing.md)). Please note that Azure has some **rules for naming containers**. A container name must be a valid DNS name, conforming to the [following naming rules](https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#container-names): * **ContainerName** (string): You can specify the container name in azure. If this is not specified, it uses the name of the BLOB container defined with the `BlobContainerName` attribute (see the [BLOB storing document](Blob-Storing.md)). Please note that Azure has some **rules for naming containers**. A container name must be a valid DNS name, conforming to the [following naming rules](https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#container-names):
* Container names must start or end with a letter or number, and can contain only letters, numbers, and the dash (-) character. * Container names must start or end with a letter or number, and can contain only letters, numbers, and the dash (-) character.
* Every dash (-) character must be immediately preceded and followed by a letter or number; consecutive dashes are not permitted in container names. * Every dash (-) character must be immediately preceded and followed by a letter or number; consecutive dashes are not permitted in container names.
* All letters in a container name must be **lowercase**. * All letters in a container name must be **lowercase**.

2
docs/en/Blob-Storing-Minio.md

@ -43,7 +43,7 @@ Configure<AbpBlobStoringOptions>(options =>
* **EndPoint** (string): URL to object storage service. Please refer to MinIO Client SDK for .NET: https://docs.min.io/docs/dotnet-client-quickstart-guide.html * **EndPoint** (string): URL to object storage service. Please refer to MinIO Client SDK for .NET: https://docs.min.io/docs/dotnet-client-quickstart-guide.html
* **AccessKey** (string): Access key is the user ID that uniquely identifies your account. * **AccessKey** (string): Access key is the user ID that uniquely identifies your account.
* **SecretKey** (string): Secret key is the password to your account. * **SecretKey** (string): Secret key is the password to your account.
* **BucketName** (string): You can specify the bucket name in MinIO. If this is not specified, it uses the name of the BLOB container defined with the `BlogContainerName` attribute (see the [BLOB storing document](Blob-Storing.md)).MinIO is the defacto standard for S3 compatibility, So MinIO has some **rules for naming bucket**. The [following rules](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html) apply for naming MinIO buckets: * **BucketName** (string): You can specify the bucket name in MinIO. If this is not specified, it uses the name of the BLOB container defined with the `BlobContainerName` attribute (see the [BLOB storing document](Blob-Storing.md)).MinIO is the defacto standard for S3 compatibility, So MinIO has some **rules for naming bucket**. The [following rules](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html) apply for naming MinIO buckets:
* Bucket names must be between **3** and **63** characters long. * Bucket names must be between **3** and **63** characters long.
* Bucket names can consist only of **lowercase** letters, numbers, dots (.), and hyphens (-). * Bucket names can consist only of **lowercase** letters, numbers, dots (.), and hyphens (-).
* Bucket names must begin and end with a letter or number. * Bucket names must begin and end with a letter or number.

4
docs/en/Blob-Storing.md

@ -14,14 +14,14 @@ ABP BLOB Storage system is also compatible to other ABP Framework features like
## BLOB Storage Providers ## BLOB Storage Providers
The ABP Framework has already the following storage provider implementations; The ABP Framework has already the following storage provider implementations:
* [File System](Blob-Storing-File-System.md): Stores BLOBs in a folder of the local file system, as standard files. * [File System](Blob-Storing-File-System.md): Stores BLOBs in a folder of the local file system, as standard files.
* [Database](Blob-Storing-Database.md): Stores BLOBs in a database. * [Database](Blob-Storing-Database.md): Stores BLOBs in a database.
* [Azure](Blob-Storing-Azure.md): Stores BLOBs on the [Azure BLOB storage](https://azure.microsoft.com/en-us/services/storage/blobs/). * [Azure](Blob-Storing-Azure.md): Stores BLOBs on the [Azure BLOB storage](https://azure.microsoft.com/en-us/services/storage/blobs/).
* [Aliyun](Blob-Storing-Aliyun.md): Stores BLOBs on the [Aliyun Storage Service](https://help.aliyun.com/product/31815.html). * [Aliyun](Blob-Storing-Aliyun.md): Stores BLOBs on the [Aliyun Storage Service](https://help.aliyun.com/product/31815.html).
* [Minio](Blob-Storing-Minio.md): Stores BLOBs on the [MinIO Object storage](https://min.io/). * [Minio](Blob-Storing-Minio.md): Stores BLOBs on the [MinIO Object storage](https://min.io/).
* [Aws](Blob-Storing-Aws.md): Stores BLOBs on the[Amazon Simple Storage Service](https://min.io/). * [Aws](Blob-Storing-Aws.md): Stores BLOBs on the [Amazon Simple Storage Service](https://aws.amazon.com/s3/).
More providers will be implemented by the time. You can [request](https://github.com/abpframework/abp/issues/new) it for your favorite provider or [create it yourself](Blob-Storing-Custom-Provider.md) and [contribute](Contribution/Index.md) to the ABP Framework. More providers will be implemented by the time. You can [request](https://github.com/abpframework/abp/issues/new) it for your favorite provider or [create it yourself](Blob-Storing-Custom-Provider.md) and [contribute](Contribution/Index.md) to the ABP Framework.

8
docs/en/Blog-Posts/2020-05-08 v2_7_Release/Post.md

@ -16,7 +16,7 @@ ABP.IO Platform is rapidly growing and we are getting more and more contribution
### Object Extending System ### Object Extending System
In the last few releases, we've mostly focused on providing ways to extend existing modules when you use them as NuGet/NPM Packages. In the last few releases, we've mostly focused on providing ways to extend existing modules when you use them as NuGet/NPM Packages.
The Object Extending System allows module developers to create extensible modules and allows application developers to customize and extend a module easily. The Object Extending System allows module developers to create extensible modules and allows application developers to customize and extend a module easily.
@ -43,7 +43,7 @@ ObjectExtensionManager.Instance
options.Attributes.Add(new RequiredAttribute()); options.Attributes.Add(new RequiredAttribute());
options.Attributes.Add( options.Attributes.Add(
new StringLengthAttribute(32) { new StringLengthAttribute(32) {
MinimumLength = 6 MinimumLength = 6
} }
); );
}); });
@ -121,7 +121,7 @@ Just create a class derived from the `ExceptionSubscriber` class in your applica
````csharp ````csharp
public class MyExceptionSubscriber : ExceptionSubscriber public class MyExceptionSubscriber : ExceptionSubscriber
{ {
public override async Task HandleAsync(ExceptionNotificationContext context) public async override Task HandleAsync(ExceptionNotificationContext context)
{ {
//TODO... //TODO...
} }
@ -244,4 +244,4 @@ We ([Volosoft](https://volosoft.com/) - the core team behind the ABP.IO platform
[ABP Framework](https://abp.io/) provides all the infrastructure and application independent framework features to make you more productive, focus on your own business code and implement software development best practices. It provides you a well defined and comfortable development experience without repeating yourself. [ABP Framework](https://abp.io/) provides all the infrastructure and application independent framework features to make you more productive, focus on your own business code and implement software development best practices. It provides you a well defined and comfortable development experience without repeating yourself.
[ABP Commercial](https://commercial.abp.io/) provides pre-built functionalities, themes and tooling to save your time if your requirements involve these functionalities in addition to the premium support for the framework and the pre-built modules. [ABP Commercial](https://commercial.abp.io/) provides pre-built functionalities, themes and tooling to save your time if your requirements involve these functionalities in addition to the premium support for the framework and the pre-built modules.

143
docs/en/Blog-Posts/2020-11-12 v4_0_Preview/POST.md

@ -0,0 +1,143 @@
# ABP Framework 4.0 RC Has Been Published based on .NET 5.0!
Today, we have released the [ABP Framework](https://abp.io/) (and the [ABP Commercial](https://commercial.abp.io/)) 4.0.0 RC that is based on the **.NET 5.0**. This blog post introduces the new features and important changes in the new version.
> **The planned release date for the [4.0.0 final](https://github.com/abpframework/abp/milestone/45) version is November 26, 2020**.
## Get Started with the 4.0 RC
If you want to try the version `4.0.0` today, follow the steps below;
1) **Upgrade** the ABP CLI to the version `4.0.0-rc.3` using a command line terminal:
````bash
dotnet tool update Volo.Abp.Cli -g --version 4.0.0-rc.3
````
**or install** if you haven't installed before:
````bash
dotnet tool install Volo.Abp.Cli -g --version 4.0.0-rc.3
````
2) Create a **new application** with the `--preview` option:
````bash
abp new BookStore --preview
````
See the [ABP CLI documentation](https://docs.abp.io/en/abp/3.3/CLI) for all the available options.
> You can also use the *Direct Download* tab on the [Get Started](https://abp.io/get-started) page by selecting the **Preview checkbox**.
## Migrating From 3.x to 4.0
The version 4.0 comes with some major changes including the **migration from .NET Core 3.1 to .NET 5.0**.
We've prepared a **detailed [migration document](https://docs.abp.io/en/abp/4.0/Migration-Guides/Abp-4_0)** to explain all the changes and the actions you need to take while upgrading your existing solutions.
## What's new with the ABP Framework 4.0
### The Blazor UI
The Blazor UI is now stable and officially supported. The [web application development tutorial](https://docs.abp.io/en/abp/4.0/Tutorials/Part-1?UI=Blazor) has been updated based on the version 4.0.
#### abp bundle command
Introducing the `abp bundle` CLI command to manage static JavaScript & CSS file dependencies of a Blazor application. This command is currently used to add the dependencies to the `index.html` file in the dependency order by respecting to modularity. In the next version it will automatically unify & minify the files. The documentation is being prepared.
#### Removed the JQuery & Bootstrap JavaScript
Removed JQuery & Bootstrap JavaScript dependencies for the Blazor UI.
>There are some other changes in the startup template and some public APIs. Follow the [Migration Guide](https://docs.abp.io/en/abp/4.0/Migration-Guides/Abp-4_0) to apply changes for existing solutions that you're upgrading from the version 3.3. While we will continue to make improvements add new features, we no longer make breaking changes on the existing APIs until the version 5.0.
#### Others
A lot of minor and major improvements have been done for the Blazor UI. Some of them are listed below:
* Implemented `IComponentActivator` to resolve the component from the `IServiceProvider`. So, you can now inject dependencies into the constructor of your razor component.
* Introduced the `AbpComponentBase` base class that you derive your components from. It has useful base properties that you can use in your pages/components.
* Introduced `IUiNotificationService` service to show toast notifications on the UI.
* Improved the `IUiMessageService` to show message & confirmation dialogs.
### System.Text.Json
ABP Framework 4.0 uses the System.Text.Json by default as the JSON serialization library. It, actually, using a hybrid approach: Continues to use the Newtonsoft.Json when it needs to use the features not supported by the System.Text.Json.
Follow the [Migration Guide](https://docs.abp.io/en/abp/4.0/Migration-Guides/Abp-4_0) to learn how to configure to use the Newtonsoft.Json for some specific types or switch back to the Newtonsoft.Json as the default JSON serializer.
### Identity Server 4 Upgrade
ABP Framework upgrades the [IdentityServer4](https://www.nuget.org/packages/IdentityServer4) library from 3.x to 4.1.1 with the ABP Framework version 4.0. IdentityServer 4.x has a lot of changes. Some of them are **breaking changes in the data structure**.
Follow the [Migration Guide](https://docs.abp.io/en/abp/4.0/Migration-Guides/Abp-4_0) to upgrade existing solutions.
### Creating a New Module Inside the Application
ABP CLI has now a command to create a new module and add it to an existing solution. In this way, you can create modular applications easier than before.
Example: Create a *ProductManagement* module into your solution.
````bash
abp add-module ProductManagement --new --add-to-solution-file
````
Execute this command in a terminal in the root folder of your solution. If you don't specify the `--add-to-solution-file` option, then the module projects will not be added to the main solution, but the project references still be added. In this case, you need to open the module's solution to develop the module.
See the [CLI document](https://docs.abp.io/en/abp/4.0/CLI) for other options.
### WPF Startup Template
Introducing the WPF startup template for the ABP Framework. Use the ABP CLI new command to create a new WPF application:
````bash
abp new MyWpfApp -t wpf
````
This is a minimalist, empty project template that is integrated to the ABP Framework.
### New Languages
**Thanks to the contributors** from the ABP Community, the framework modules and the startup template have been localized to **German** language by [Alexander Pilhar](https://github.com/alexanderpilhar) & [Nico Lachmuth](https://github.com/tntwist).
### Other Notes
* Upgraded to Angular 11.
* Since [Mongo2Go](https://github.com/Mongo2Go/Mongo2Go) library not supports transactions, you can use transactions in unit tests for MongoDB.
## What's new with the ABP Commercial 4.0
### The Blazor UI
The Blazor UI for the ABP Commercial is also becomes stable and feature rich with the version 4.0;
* [ABP Suite](https://commercial.abp.io/tools/suite) now supports to generate CRUD pages for the Blazor UI.
* Completed the [Lepton Theme](https://commercial.abp.io/themes) for the Blazor UI.
* Implemented the [File Management](https://commercial.abp.io/modules/Volo.FileManagement) module for the Blazor UI.
### The ABP Suite
While creating create/edit modals with a navigation property, we had two options: A dropdown to select the target entity and a modal to select the entity by searching with a data table.
Dropdown option now supports **lazy load, search and auto-complete**. In this way, selecting a navigation property becomes much easier and supports large data sets on the dropdown.
**Example: Select an author while creating a new book**
![abp-suite-auto-complete-dropdown](abp-suite-auto-complete-dropdown.png)
With the new version, you can **disable backend code generation** on CRUD page generation. This is especially useful if you want to regenerate the page with a different UI framework, but don't want to regenerate the server side code.
### Identity Server Management UI Revised
Completely revised the Identity Server Management UI based on the IDS 4.x changes.
## About the Next Release
The next feature version, `4.1.0`, will mostly focus on completing the missing documents, fixing bugs, performance optimizations and improving the Blazor UI features. The planned preview release date for the version `4.1.0` is December 10 and the final (stable) version release date is December 24.
Follow the [GitHub milestones](https://github.com/abpframework/abp/milestones) for all the planned ABP Framework version release dates.
## Feedback
Please check out the ABP Framework 4.0.0 RC and [provide feedback](https://github.com/abpframework/abp/issues/new) to help us to release a more stable version. **The planned release date for the [4.0.0 final](https://github.com/abpframework/abp/milestone/45) version is November 26**.

BIN
docs/en/Blog-Posts/2020-11-12 v4_0_Preview/abp-suite-auto-complete-dropdown.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

87
docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/POST.md

@ -0,0 +1,87 @@
# ABP.IO Platform 4.0 with .NET 5.0 in the 4th Year!
Today, we are extremely happy to release ABP Framework 4.0 with **.NET 5.0 support**!
## 4 Years of Work
As a nice coincidence, today is the **4th year** since the first commit made in the [abp repository](https://github.com/abpframework/abp)! So, we can say "*Happy Birthday ABP Framework!*".
![abp-contribution-graph-4-years](abp-contribution-graph-4-years.png)
### Some Statistics
ABP.IO Platform and the ABP Community is growing. Here, a summary of these 4 years.
From GitHub, only from the main [abp repository](https://github.com/abpframework/abp);
* **15,297 commits** done.
* **3,764 issues** are closed.
* **2,133 pull requests** are merged.
* **158 contributors**.
* **88 releases** published.
* **5.2K stars** on GitHub.
From NuGet & NPM;
* **220 NuGet** packages & **52 NPM** packages.
* **1,000,000 downloads** only for the core NuGet package.
From Website;
* **200,000 visitors**.
* **1,000,000+ sessions**.
## What's New With 4.0?
Since all the new features are already explained in details with the [4.0 RC Announcement Post](https://blog.abp.io/abp/ABP.IO-Platform-v4.0-RC-Has-Been-Released-based-on-.NET-5.0), I will not repeat all the details again. Please read [the RC post](https://blog.abp.io/abp/ABP.IO-Platform-v4.0-RC-Has-Been-Released-based-on-.NET-5.0) for **new feature and changes** you may need to do for your solution while upgrading to the version 4.0.
Here, a brief list of major features and changes;
* Migrated to **.NET 5.0**.
* Stable **Blazor** UI.
* Moved to **System.Text.Json**.
* Upgraded to **IdentityServer** version 4.0.
* **WPF** startup template.
## Creating New Solutions
You can create a new solution with the ABP Framework version 4.0 by either using the `abp new` command or using the **direct download** tab on the [get started page](https://abp.io/get-started).
> See the [getting started document](https://docs.abp.io/en/abp/latest/Getting-Started) for details.
## How to Upgrade an Existing Solution
This is a **major version** and requires some **manual work**, especially related to **.NET 5.0** and **IdentityServer** 4.0 upgrades.
* See the [MIGRATION GUIDE](https://docs.abp.io/en/abp/latest/Migration-Guides/Abp-4_0) that covers all the details about the upgrade progress.
* You can also see the [upgrading document](https://docs.abp.io/en/abp/latest/Upgrading).
## New Guides / Documents
We are constantly improving the documentation. Our purpose is not only document the ABP Framework, but also write architectural and practical guides for developers.
### Implementing Domain Driven Design
[Implementing Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design-Implementation-Guide) is a practical guide for they want to implement the DDD principles in their solutions. While the implementation details rely on the ABP Framework infrastructure, core concepts, principles and patterns are applicable in any kind of solution, even if it is not a .NET solution.
![ddd-implementation-guide-sample](ddd-implementation-guide-sample.png)
### Testing
The new [Testing document](https://docs.abp.io/en/abp/latest/Testing) discusses different kind of automated tests and explains how you can write tests for your ABP based solutions.
### UI Documents
We've created a lot of documents for the [MVC](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Overall), [Blazor](https://docs.abp.io/en/abp/latest/UI/Blazor/Overall) and the [Angular](https://docs.abp.io/en/abp/latest/UI/Angular/Quick-Start) UI.
## About the Next Version
The next versions 4.1 will mostly focus on;
* Improving current features.
* Complete module features for the Blazor UI.
* Improve developer experience and productivity.
* More documentation and examples.
Planned preview date for the version **4.1 is December 17, 2020**. See the [Road Map](https://docs.abp.io/en/abp/latest/Road-Map) document and [GitHub Milestones](https://github.com/abpframework/abp/milestones) to learn what's planned for the next versions. We are trying to be clear about the coming features and the next release dates.

BIN
docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/abp-contribution-graph-4-years.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/ddd-implementation-guide-sample.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

202
docs/en/Blog-Posts/2020-12-18 v4_1_Preview/POST.md

@ -0,0 +1,202 @@
# ABP Framework 4.1 RC Has Been Published
Today, we have released the [ABP Framework](https://abp.io/) (and the [ABP Commercial](https://commercial.abp.io/)) 4.1.0 RC. This blog post introduces the new features and important changes in this new version.
> **The planned release date for the [4.1.0 final](https://github.com/abpframework/abp/milestone/47) version is January 4, 2021**.
## Get Started with the 4.1 RC
If you want to try the version `4.1.0` today, follow the steps below;
1) **Upgrade** the ABP CLI to the version `4.1.0-rc.1` using a command line terminal:
````bash
dotnet tool update Volo.Abp.Cli -g --version 4.1.0-rc.1
````
**or install** if you haven't installed before:
````bash
dotnet tool install Volo.Abp.Cli -g --version 4.1.0-rc.1
````
2) Create a **new application** with the `--preview` option:
````bash
abp new BookStore --preview
````
See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all the available options.
> You can also use the *Direct Download* tab on the [Get Started](https://abp.io/get-started) page by selecting the **Preview checkbox**.
## Breaking Changes
This version has a minor breaking change if you'd injected a repository by class. This is not a problem for 99% of the applications. However, see [#6677](https://github.com/abpframework/abp/issues/6677) for the solution if that's a breaking change for you.
## What's new with the ABP Framework 4.1
### Module Entity Extensions
Module Entity Extension system provides a simple way of adding new properties to an existing entity defined by a module that is used by your application. This feature is now available also for the open source modules (identity and tenant-management). [The documentation](https://docs.abp.io/en/abp/latest/Module-Entity-Extensions) has been moved into the ABP Framework's documentation.
**Example: Add "SocialSecurityNumber" property to the `IdentityUser` entity**
````csharp
ObjectExtensionManager.Instance.Modules()
.ConfigureIdentity(identity =>
{
identity.ConfigureUser(user =>
{
user.AddOrUpdateProperty<string>( //property type: string
"SocialSecurityNumber", //property name
property =>
{
//validation rules
property.Attributes.Add(new RequiredAttribute());
property.Attributes.Add(
new StringLengthAttribute(64) {
MinimumLength = 4
}
);
//...other configurations for this property
}
);
});
});
````
The new property becomes available on the UI, API and the database. You can even define navigation properties. This provides an easy way to extend existing modules while using them as NuGet packages. See [the document](https://docs.abp.io/en/abp/latest/Module-Entity-Extensions) for details.
### Blazor UI Improvements
Since the Blazor UI is relatively new in the ABP Framework, we continue to add features and make enhancements to fill the gap between other supported UI types.
#### Bundling & Minification
In the version 4.1, we had introduced the `abp bundle` command for the Blazor UI to add global script and style files of the depended modules into the `index.html`. It was a preparation for a real bundling & minification system. With the version 4.2, this command has been completed.
Whenever you add a new module to your Blazor application, just type the `abp bundle` command in a command line terminal;
* It finds all the global script/style files in your application and the modules your application directly or indirectly depends on, ordered by the module dependencies.
* Bundles all the scripts into a single file and minified the file (same for the styles).
* Add the single bundle file to the `index.html` file.
Added a configuration into the `appsettings.json` file in the Blazor application in the application startup template to control the bundling mode:
````js
{
"AbpCli": {
"Bundle": {
"Mode": "BundleAndMinify"
}
}
}
````
Possible values are;
* `BundleAndMinify`: Bundle all the files into a single file and minify the content.
* `Bundle`: Bundle all files into a single file, but not minify.
* `None`: Add files individually, do not bundle.
See the [Global Scripts & Styles](https://docs.abp.io/en/abp/4.1/UI/Blazor/Global-Scripts-Styles) document for details.
#### SubmitButton
`SubmitButton` is a new component that simplifies to save a form:
````html
<SubmitButton Clicked="UpdateEntityAsync" />
````
The main advantages of using this component instead of a standard `Button` with submit type is; It automatically blocks the submit button until the save operation has fully completed. This prevents multiple clicks by user. And it is shorter than doing all manually. See the [document](https://docs.abp.io/en/abp/4.1/UI/Blazor/SubmitButton).
#### Other Blazor UI highlights
* Implemented some **animations** (like opening/closing modals and dropdowns).
* Automatically **focus** to the first input when you open a modal form.
Module extensibility system (mentioned above) for the Blazor UI is under development and not available yet.
## What's new with the ABP Commercial 4.1
### Blazor UI Improvements
We continue to complete missing modules and functionalities for the Blazor UI.
#### Organization Unit Management
Organization Management UI has been implemented for the Blazor UI. Example screenshot:
![blazor-organization-units](blazor-organization-units.png)
#### IdentityServer UI
IdentityServer Management UI is also available for the Blazor UI now:
![blazor-identityserver-ui](blazor-identityserver-ui.png)
### Suite: Navigation Property Selection with Typeahead
We had introduced auto-complete select style navigation property selection. With this release, it is fully supported by all the UI options. So, when you create an CRUD page with ABP Suite for entity that has 1 to Many relation to another entity, you can simply select the target entity with a typeahead style select component. Example screenshot:
![type-ahead](type-ahead.png)
### Spanish Language Translation
We continue to add new language supports for the UI. In this version, translated the UI to **Spanish** language.
![spanish-commercial-translation](spanish-commercial-translation.png)
### Coming: Public Website with Integrated CMS Features
In the next version, the application startup template will come with a public website application option. CMS Kit module will be installed in the website by default, that means newsletter, contact form, comments and some other new features will be directly usable in your applications.
An early screenshot from the public website application home page:
![abp-commercial-public-website](abp-commercial-public-website.png)
## Other News
### ABP Community Contents
A lot of new contents have been published in the ABP Community Web Site in the last two weeks:
* [How to Integrate the Telerik Blazor Components to the ABP Blazor UI](https://community.abp.io/articles/how-to-integrate-the-telerik-blazor-components-to-the-abp-blazor-ui-q8g31abb) by [EngincanV](https://github.com/EngincanV)
* [Using DevExpress Blazor UI Components With the ABP Framework](https://community.abp.io/articles/using-devexpress-blazor-ui-components-with-the-abp-framework-wrpoa8rw) by [@berkansasmaz](https://github.com/berkansasmaz)
* [Creating a new UI theme by copying the Basic Theme (for MVC UI)](https://community.abp.io/articles/creating-a-new-ui-theme-by-copying-the-basic-theme-for-mvc-ui-yt9b18io) by [@ebubekirdinc](https://github.com/ebubekirdinc)
* [Using Angular Material Components With the ABP Framework](https://community.abp.io/members/muhammedaltug) by [@muhammedaltug](https://github.com/muhammedaltug)
* [How to export Excel files from the ABP framework](https://community.abp.io/articles/how-to-export-excel-files-from-the-abp-framework-wm7nnw3n) by [bartvanhoey](https://github.com/bartvanhoey)
* [Creating an Event Organizer Application with the ABP Framework & Blazor UI](https://community.abp.io/articles/creating-an-event-organizer-application-with-the-blazor-ui-wbe0sf2z) by [@hikalkan](https://github.com/hikalkan)
Thanks to all of the contributors. We are waiting for your contributions too. If you want to create content for the ABP Community, please visit [community.abp.io](https://community.abp.io/) website and submit your article.
#### Be a Superhero on Day 1 with ABP.IO
Thanks to [@lprichar](http://github.com/lprichar) prepared an awesome introduction video for the ABP.IO Platform: "[Be a Superhero on Day 1 with ABP.IO](https://www.youtube.com/watch?v=ea0Zx9DLcGA)".
#### New Sample Application: Event Organizer
This is a new example application developed using the ABP Framework and the Blazor UI. See [this article](https://community.abp.io/articles/creating-an-event-organizer-application-with-the-blazor-ui-wbe0sf2z) for a step by step implementation guide.
![event-list-ui](event-list-ui.png)
### Github Discussions
We enabled the [GitHub Discussions for the abp repository](https://github.com/abpframework/abp/discussions) as another place to discuss ideas or get help for the ABP Framework. The ABP core team is spending time participating in discussions and answering to questions as much as possible.
## About the Next Release(s)
Beginning from the next version (4.2.0), we are starting to spend more effort on the **CMS Kit module**. The purpose of this module is to provide CMS primitives (e.g. **comments, tags, reactions, contents**...) and features (e.g. **blog, pages, surveys**) as pre-built and reusable components. Current blog module will be a part of the CMS Kit module.
We will continue to prepare documents, guides, tutorials and examples. And surely, we will continue to make enhancements and optimizations on the current features.
> The planned preview release date for the version 4.2.0 is January 14, 2021 and the final (stable) version release date is January 28, 2021.
Follow the [GitHub milestones](https://github.com/abpframework/abp/milestones) for all the planned ABP Framework version release dates.
## Feedback
Please check out the ABP Framework 4.1.0 RC and [provide feedback](https://github.com/abpframework/abp/issues/new) to help us to release a more stable version. **The planned release date for the [4.1.0 final](https://github.com/abpframework/abp/milestone/45) version is January 4, 2021**.

BIN
docs/en/Blog-Posts/2020-12-18 v4_1_Preview/abp-commercial-public-website.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

BIN
docs/en/Blog-Posts/2020-12-18 v4_1_Preview/blazor-identityserver-ui.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

BIN
docs/en/Blog-Posts/2020-12-18 v4_1_Preview/blazor-organization-units.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
docs/en/Blog-Posts/2020-12-18 v4_1_Preview/event-list-ui.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 KiB

BIN
docs/en/Blog-Posts/2020-12-18 v4_1_Preview/spanish-commercial-translation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

BIN
docs/en/Blog-Posts/2020-12-18 v4_1_Preview/type-ahead.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

51
docs/en/Blog-Posts/2021-01-07 v4_1_Release_Stable/POST.md

@ -0,0 +1,51 @@
# ABP.IO Platform 4.1 Final Has Been Released!
[ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) 4.1 versions have been released today.
## What's New With 4.1?
Since all the new features are already explained in details with the [4.1 RC Announcement Post](https://blog.abp.io/abp/ABP.IO-Platform-v4.1-RC-Has-Been-Released), I will not repeat all the details again. See the [RC Blog Post](https://blog.abp.io/abp/ABP.IO-Platform-v4.1-RC-Has-Been-Released) for all the features and enhancements.
## Creating New Solutions
You can create a new solution with the ABP Framework version 4.1 by either using the `abp new` command or using the **direct download** tab on the [get started page](https://abp.io/get-started).
> See the [getting started document](https://docs.abp.io/en/abp/latest/Getting-Started) for details.
## How to Upgrade an Existing Solution
### Install/Update the ABP CLI
First of all, install the ABP CLI or upgrade to the latest version.
If you haven't installed yet:
```bash
dotnet tool install -g Volo.Abp.Cli
```
To update an existing installation:
```bash
dotnet tool update -g Volo.Abp.Cli
```
### ABP UPDATE Command
[ABP CLI](https://docs.abp.io/en/abp/latest/CLI) provides a handy command to update all the ABP related NuGet and NPM packages in your solution with a single command:
```bash
abp update
```
Run this command in the root folder of your solution.
## ABP Community
We started to get more contributions by the community for the [ABP Community](https://community.abp.io/) contents. Thank you all!
We will be adding **Video Content** sharing system in a short time. We are planning to create short video contents, especially to explore the new features in every release. Again, we will be waiting video contributions by the community :)
## About the Next Versions
Planned preview date for the version **4.2 is January 14, 2021**. See the [Road Map](https://docs.abp.io/en/abp/latest/Road-Map) document and [GitHub Milestones](https://github.com/abpframework/abp/milestones) to learn what's planned for the next versions. We are trying to be clear about the coming features and the next release dates.

241
docs/en/Blog-Posts/2021-01-14 v4_2_Preview/POST.md

@ -0,0 +1,241 @@
# ABP Framework 4.2 RC Has Been Published
Today, we have released the [ABP Framework](https://abp.io/) and the [ABP Commercial](https://commercial.abp.io/) 4.2.0 RC (Release Candidate). This blog post introduces the new features and important changes in this new version.
> **The planned release date for the [4.2.0 final](https://github.com/abpframework/abp/milestone/48) version is January 28, 2021**.
## Get Started with the 4.2 RC
If you want to try the version `4.2.0` today, follow the steps below;
1) **Upgrade** the ABP CLI to the version `4.2.0-rc.2` using a command line terminal:
````bash
dotnet tool update Volo.Abp.Cli -g --version 4.2.0-rc.2
````
**or install** if you haven't installed before:
````bash
dotnet tool install Volo.Abp.Cli -g --version 4.2.0-rc.2
````
2) Create a **new application** with the `--preview` option:
````bash
abp new BookStore --preview
````
See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all the available options.
> You can also use the *Direct Download* tab on the [Get Started](https://abp.io/get-started) page by selecting the **Preview checkbox**.
## What's new with the ABP Framework 4.2
## IRepository.GetQueryableAsync()
> **This version comes with an important change about using `IQueryable` features over the [repositories](https://docs.abp.io/en/abp/4.2/Repositories). It is suggested to read this section carefully and apply in your applications.**
`IRepository` interface inherits `IQueryable`, so you can directly use the standard LINQ extension methods, like `Where`, `OrderBy`, `First`, `Sum`... etc.
**Example: Using LINQ directly over the repository object**
````csharp
public class BookAppService : ApplicationService, IBookAppService
{
private readonly IRepository<Book, Guid> _bookRepository;
public BookAppService(IRepository<Book, Guid> bookRepository)
{
_bookRepository = bookRepository;
}
public async Task DoItInOldWayAsync()
{
//Apply any standard LINQ extension method
var query = _bookRepository
.Where(x => x.Price > 10)
.OrderBy(x => x.Name);
//Execute the query asynchronously
var books = await AsyncExecuter.ToListAsync(query);
}
}
````
*See [the documentation](https://docs.abp.io/en/abp/4.2/Repositories#iqueryable-async-operations) if you wonder what is the `AsyncExecuter`.*
Beginning from the version 4.2, the recommended way is using `IRepository.GetQueryableAsync()` to obtain an `IQueryable`, then use the LINQ extension methods over it.
**Example: Using the new GetQueryableAsync method**
````csharp
public async Task DoItInNewWayAsync()
{
//Use GetQueryableAsync to obtain the IQueryable<Book> first
var queryable = await _bookRepository.GetQueryableAsync();
//Then apply any standard LINQ extension method
var query = queryable
.Where(x => x.Price > 10)
.OrderBy(x => x.Name);
//Finally, execute the query asynchronously
var books = await AsyncExecuter.ToListAsync(query);
}
````
ABP may start a database transaction when you get an `IQueryable` (If current [Unit Of Work](https://docs.abp.io/en/abp/latest/Unit-Of-Work) is transactional). In this new way, it is possible to **start the database transaction in an asynchronous way**. Previously, we could not get the advantage of asynchronous while starting the transactions.
> **The new way has a significant performance and scalability gain. The old usage (directly using LINQ over the repositories) will be removed in the next major version.** You have a lot of time for the change, but we recommend to immediately take the action since the old usage has a big scalability problem.
#### About IRepository Async Extension Methods
Using IRepository Async Extension Methods has no such a problem. The examples below are pretty fine:
````csharp
var countAll = await _personRepository
.CountAsync();
var count = await _personRepository
.CountAsync(x => x.Name.StartsWith("A"));
var book1984 = await _bookRepository
.FirstOrDefaultAsync(x => x.Name == "John");
````
See the [repository documentation](https://docs.abp.io/en/abp/4.2/Repositories#iqueryable-async-operations) to understand the relation between `IQueryable` and asynchronous operations.
### Repository Bulk Operations
This version adds the following methods to the repositories:
* `InsertManyAsync`
* `UpdateManyAsync`
* `DeleteManyAsync`
The purpose of these methods to insert, update or delete many entities in one call with a better performance.
Currently, **MongoDB** provider implements these methods as a single bulk operation since MongoDB API natively supports. But current **Entity Framework Core** implementation is not a real bulk operation. Instead, it does its best with the native API of the EF Core. If you want to implement in a more performant way, you can [customize the bulk operations](https://docs.abp.io/en/abp/4.2/Entity-Framework-Core#customize-bulk-operations) with your own implementation or by using a library. We could find a good open source library for EF Core 5.0 to implement it.
### Selecting DBMS on Template Creation
[ABP CLI](https://docs.abp.io/en/abp/4.2/CLI#new) now has an option to specify the DBMS when you use EF Core as the database provider.
**Example: Select MySQL as the DBMS**
````bash
abp new BookStore -dbms mysql --preview
````
Available options: `SqlServer` (default), `MySQL`, `SQLite`, `Oracle-Devart`, `PostgreSQL`. See the [documentation](https://docs.abp.io/en/abp/latest/Entity-Framework-Core-Other-DBMS) to use any other DBMS or switch the DBMS later.
One change related to this feature is that: Now, the startup template doesn't come with an **initial migration** file. This is because the database migrations are different based on your DBMS preference and should be re-created. However, when you first run the `.DbMigrator` application, it will create the initial migration and create the database just like before.
> See The Initial Migration section in the [Getting Started](https://docs.abp.io/en/abp/4.2/Getting-Started-Running-Solution?DB=EF#database-migrations) document if you have problems on running the `.DbMigrator` application first time.
### Swagger UI Login / Authorization
Testing the swagger UI was requiring some additional work, especially your authentication server is separated from the application that hosts the Swagger UI.
With the version 4.2, the startup templates come with the authorization pre-configured for you. An Authorize button is available when you open the Swagger UI:
![swagger-authorize](swagger-authorize.png)
When you click, it opens a modal to authorize:
![swagger-authorize](swagger-authorize-modal.png)
When you click to the Authorize button here, you are redirected to the login page to login with your username and password (default username is `admin` and password is `1q2w3E*`).
> Remember to select the Scopes (typically **select all**) you want to use before clicking to the Authorize button.
### Angular Unit Testing
We've improved the modules and the startup template to setup and write unit tests easier with the Angular UI. See the [Angular Unit Testing document](https://docs.abp.io/en/abp/4.2/UI/Angular/Testing) for details.
### Other News
* Improved HTTP **request-response performance** by resolving dependencies in a deferred way in the action/page filters, interceptors and some other services.
* Removed `MultipleActiveResultSets` from connection strings for new templates for SQL Server, since the new EF Core gives a warning when using it. If you want to use it, you need to change the connection string yourself.
* Added `HardDeleteAsync` extension method that takes a predicate to delete multiple entities. This extension method is available if the entity [Soft Delete](https://docs.abp.io/en/abp/latest/Data-Filtering).
* Implemented the [Page Alerts](https://docs.abp.io/en/abp/4.2/UI/Angular/Page-Alerts) for the **Angular UI**.
* Implemented [Page Progress](https://docs.abp.io/en/abp/4.2/UI/Blazor/Page-Progress) for the **Blazor UI**. It automatically shows an undetermined progress bar on top of the page while performing an AJAX request. It also proves an API to you if you need to show/hide the progress bar in your code.
## What's new with the ABP Commercial 4.2
### Microservice Startup Template
The new [Microservice Startup Template](https://docs.abp.io/en/commercial/4.2/startup-templates/microservice/index) is a generic solution to start a new microservice solution.
While we accept that every microservice solution will be different and every system has its own design requirements and trade-offs, we believe such a startup solution is a very useful starting point for most of the solutions, and a useful example for others.
![microservice-template-diagram](microservice-template-diagram.png)
*Figure: A simplified overall diagram of the microservice solution.*
You can [follow the documentation](https://docs.abp.io/en/commercial/4.2/startup-templates/microservice/index) to get started with this startup template. **This template should be considered as an early release**. We will improve it and write a lot of guides.
If you want to use the ABP Suite to create your solution, then you need to first upgrade it:
````bash
abp suite update
````
If you want, you can directly create a new solution from the command line:
````bash
abp new Volosoft.MyMicroserviceSystem -t microservice-pro --preview
````
Company Name is optional. Solution name could be *MyMicroserviceSystem* for this example.
### Public Website in the Startup Templates
As mentioned in the previous release post, we've added a *Public Website* application to the startup templates. It is configured to authenticate through the IdentityServer with a single sign-on system.
You can use this application to create a landing page for your actual application or a corporate website for your business. An example screenshot:
![public-website](public-website.jpg)
It uses the same *Lepton Theme*, so you can apply [all the styles](https://commercial.abp.io/themes). The Public Website has a different layout and also has a different setting for the styling (that can be configured in the *Settings / Lepton Theme* page of the main web application).
> *Public Website* is optional and you need to select the "Public Website" option while creating a new solution using the ABP Suite, or use the `--with-public-website` option while using the `abp new` CLI command.
### Easy CRM Blazor UI
[Easy CRM](https://docs.abp.io/en/commercial/latest/samples/easy-crm) is an example application built with the ABP Commercial. MVC (Razor Pages) and Angular UI implementations were already provided. With the version 4.2, we are providing the Blazor UI implementation for this application.
![easy-crm](easy-crm.png)
### Other News
* Implemented Iyzico as a payment gateway provider for the [payment module](https://commercial.abp.io/modules/Volo.Payment) in addition to Paypal, Stripe, 2Checkout and Payu providers.
* ABP Suite supports the new microservice template creation, public website and DBMS selection options.
* Swagger authorization and other features mentioned in the ABP Framework section are already implemented for the ABP Commercial too.
## ABP Community News
### Sharing Video Contents
[community.abp.io](https://community.abp.io/) is a place to share ABP related contents. It started with publishing articles. Now, it supports to publish video contents. [See this example](https://community.abp.io/articles/be-a-superhero-on-day-1-with-abp.io-wvifcy9s). All you need to do is to create a video and upload to YouTube. Then you can [submit](https://community.abp.io/articles/submit) the YouTube link to the ABP Community website.
### Multi-language support
We planned ABP Community to publish English-only contents. However, we see that people want to share contents in other languages too. Now, **it is possible to submit a content in any language**. Just select the Language option while submitting your content.
**When you submit a non-English content, it is not visible to all the visitors by default**. Visitors can see a non-English content only if their browser language or the selected language matches to the content language (there is a language selection at the end of the website).
### External Contents
If you want to publish your content anywhere else, but want to post a link of your content, you can select *External Content* option while submitting the post. For example, [this article](https://community.abp.io/articles/aspnet-boilerplate-to-abp-framework-xml-to-json-localization-conversion-0mxyjrzj) is an external article and also written in Chinese language.
## About the Next Release
The next feature version will be 4.3.0. It is planned to release the 4.3 RC (Release Candidate) on March 11 and the final version on March 25, 2021.
We decided to slow down the feature development for the [next milestone](https://github.com/abpframework/abp/milestone/49). We will continue to improve the existing features and introduce new ones, sure, but wanted to have more time for the planning, documentation, creating guides and improving the development experience.
## Feedback
Please check out the ABP Framework 4.2.0 RC and [provide feedback](https://github.com/abpframework/abp/issues/new) to help us to release a more stable version. **The planned release date for the [4.2.0 final](https://github.com/abpframework/abp/milestone/48) version is January 28, 2021**.

BIN
docs/en/Blog-Posts/2021-01-14 v4_2_Preview/easy-crm.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

BIN
docs/en/Blog-Posts/2021-01-14 v4_2_Preview/microservice-template-diagram.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
docs/en/Blog-Posts/2021-01-14 v4_2_Preview/public-website.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

BIN
docs/en/Blog-Posts/2021-01-14 v4_2_Preview/swagger-authorize-modal.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

BIN
docs/en/Blog-Posts/2021-01-14 v4_2_Preview/swagger-authorize.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

51
docs/en/CLI.md

@ -41,6 +41,7 @@ Here, the list of all available commands before explaining their details:
* **`login`**: Authenticates on your computer with your [abp.io](https://abp.io/) username and password. * **`login`**: Authenticates on your computer with your [abp.io](https://abp.io/) username and password.
* **`logout`**: Logouts from your computer if you've authenticated before. * **`logout`**: Logouts from your computer if you've authenticated before.
* **`build`**: Builds a GIT repository and depending repositories or a single .NET solution. * **`build`**: Builds a GIT repository and depending repositories or a single .NET solution.
* **`bundle`**: Generates script and style references for an ABP Blazor project.
### help ### help
@ -104,8 +105,15 @@ abp new Acme.BookStore
* `--preview`: Use latest preview version. * `--preview`: Use latest preview version.
* `--template-source` or `-ts`: Specifies a custom template source to use to build the project. Local and network sources can be used(Like `D:\local-template` or `https://.../my-template-file.zip`). * `--template-source` or `-ts`: Specifies a custom template source to use to build the project. Local and network sources can be used(Like `D:\local-template` or `https://.../my-template-file.zip`).
* `--create-solution-folder` or `-csf`: Specifies if the project will be in a new folder in the output folder or directly the output folder. * `--create-solution-folder` or `-csf`: Specifies if the project will be in a new folder in the output folder or directly the output folder.
* `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True;MultipleActiveResultSets=true` for EF Core and it is configured to use the SQL Server. If you want to use the EF Core, but need to change the DBMS, you can change it as [described here](Entity-Framework-Core-Other-DBMS.md) (after creating the solution). * `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True` for EF Core and it is configured to use the SQL Server. If you want to use the EF Core, but need to change the DBMS, you can change it as [described here](Entity-Framework-Core-Other-DBMS.md) (after creating the solution).
* `--database-management-system` or `-dbms`: Sets the database management system. Default is **SQL Server**. Supported DBMS's:
* `SqlServer`
* `MySQL`
* `SQLite`
* `Oracle-Devart`
* `PostgreSQL`
* `--local-framework-ref --abp-path`: Uses local projects references to the ABP framework instead of using the NuGet packages. This can be useful if you download the ABP Framework source code and have a local reference to the framework from your application. * `--local-framework-ref --abp-path`: Uses local projects references to the ABP framework instead of using the NuGet packages. This can be useful if you download the ABP Framework source code and have a local reference to the framework from your application.
* `--no-random-port`: Uses template's default ports.
### update ### update
@ -127,6 +135,7 @@ abp update [options]
* `--solution-path` or `-sp`: Specify the solution path. Use the current directory by default * `--solution-path` or `-sp`: Specify the solution path. Use the current directory by default
* `--solution-name` or `-sn`: Specify the solution name. Search `*.sln` files in the directory by default. * `--solution-name` or `-sn`: Specify the solution name. Search `*.sln` files in the directory by default.
* `--check-all`: Check the new version of each package separately. Default is `false`. * `--check-all`: Check the new version of each package separately. Default is `false`.
* `--version` or `-v`: Specifies the version to use for update. If not specified, latest version is used.
### add-package ### add-package
@ -159,6 +168,8 @@ abp add-package Volo.Abp.MongoDB
Adds a [multi-package application module](Modules/Index) to a solution by finding all packages of the module, finding related projects in the solution and adding each package to the corresponding project in the solution. Adds a [multi-package application module](Modules/Index) to a solution by finding all packages of the module, finding related projects in the solution and adding each package to the corresponding project in the solution.
It can also create a new module for your solution and add it to your solution. See `--new` option.
> A business module generally consists of several packages (because of layering, different database provider options or other reasons). Using `add-module` command dramatically simplifies adding a module to a solution. However, each module may require some additional configurations which is generally indicated in the documentation of the related module. > A business module generally consists of several packages (because of layering, different database provider options or other reasons). Using `add-module` command dramatically simplifies adding a module to a solution. However, each module may require some additional configurations which is generally indicated in the documentation of the related module.
Usage Usage
@ -167,21 +178,29 @@ Usage
abp add-module <module-name> [options] abp add-module <module-name> [options]
```` ````
Example: Examples:
```bash ```bash
abp add-module Volo.Blogging abp add-module Volo.Blogging
``` ```
* This example add the Volo.Blogging module to the solution. * This example adds the `Volo.Blogging` module to the solution.
```bash
abp add-module ProductManagement --new --add-to-solution-file
```
* This command creates a fresh new module customized for your solution (named `ProductManagement`) and adds it to your solution.
#### Options #### Options
* `--solution` or `-s`: Specifies the solution (.sln) file path. If not specified, CLI tries to find a .sln file in the current directory. * `--solution` or `-s`: Specifies the solution (.sln) file path. If not specified, CLI tries to find a .sln file in the current directory.
* `--skip-db-migrations`: For EF Core database provider, it automatically adds a new code first migration (`Add-Migration`) and updates the database (`Update-Database`) if necessary. Specify this option to skip this operation. * `--skip-db-migrations`: For EF Core database provider, it automatically adds a new code first migration (`Add-Migration`) and updates the database (`Update-Database`) if necessary. Specify this option to skip this operation.
* `-sp` or `--startup-project`: Relative path to the project folder of the startup project. Default value is the current folder. * `-sp` or `--startup-project`: Relative path to the project folder of the startup project. Default value is the current folder.
* `--with-source-code`: Downloads the source code of the module to your solution folder and uses local project references instead of NuGet/NPM packages. * `--new`: Creates a fresh new module (customized for your solution) and adds it to your solution.
* `--add-to-solution-file`: Adds the downloaded module to your solution file, so you will also see the projects of the module when you open the solution on a IDE. (only available when `--with-source-code` is used.) * `--with-source-code`: Downloads the source code of the module to your solution folder and uses local project references instead of NuGet/NPM packages. This options is always `True` if `--new` is used.
* `--add-to-solution-file`: Adds the downloaded/created module to your solution file, so you will also see the projects of the module when you open the solution on a IDE. (only available when `--with-source-code` is `True`.)
### get-source ### get-source
@ -206,7 +225,7 @@ abp get-source Volo.Blogging --local-framework-ref --abp-path D:\GitHub\abp
* `--output-folder` or `-o`: Specifies the directory that source code will be downloaded in. If not specified, current directory is used. * `--output-folder` or `-o`: Specifies the directory that source code will be downloaded in. If not specified, current directory is used.
* `--version` or `-v`: Specifies the version of the source code that will be downloaded. If not specified, latest version is used. * `--version` or `-v`: Specifies the version of the source code that will be downloaded. If not specified, latest version is used.
* `--preview`: If no version option is specified, this option specifies if latest [preview version](Previews.md) will be used instead of latest stable version. * `--preview`: If no version option is specified, this option specifies if latest [preview version](Previews.md) will be used instead of latest stable version.
* `-- local-framework-ref --abp-path`: Path of [ABP Framework GitHub repository](https://github.com/abpframework/abp) in your computer. This will be used for converting project references to your local system. If this is not specified, project references will be converted to NuGet references. * `--local-framework-ref --abp-path`: Path of [ABP Framework GitHub repository](https://github.com/abpframework/abp) in your computer. This will be used for converting project references to your local system. If this is not specified, project references will be converted to NuGet references.
### generate-proxy ### generate-proxy
@ -383,10 +402,28 @@ abp build --build-name "prod" --dotnet-build-arguments "\"--no-dependencies\""
#### Options #### Options
* ```--working-directory``` or ```-w```: 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. * ```--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. * ```--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}\""``` . * ```--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. * ```--force``` or ```-f```: Forces to build projects even they are not changed from the last successful build.
For more details, see [build command documentation](CLI-BuildCommand.md). For more details, see [build command documentation](CLI-BuildCommand.md).
#### bundle
This command generates script and style references for an ABP Blazor project and updates the **index.html** file. It helps developers to manage dependencies required by ABP modules easily. In order ```bundle``` command to work, its **executing directory** or passed ```--working-directory``` parameter's directory must contain a Blazor project file(*.csproj).
Usage:
````bash
abp bundle [options]
````
#### Options
* ```--working-directory``` or ```-wd```: Specifies the working directory. This option is useful when executing directory doesn't contain a Blazor project file.
* ```--force``` or ```-f```: Forces to build project before generating references.
`bundle` command reads the `appsettings.json` file inside the Blazor project for bundling options. For more details about managing style and script references in Blazor apps, see [Managing Global Scripts & Styles](UI/Blazor/Global-Scripts-Styles.md)

45
docs/en/CSRF-Anti-Forgery.md

@ -25,7 +25,7 @@ ABP Framework provides `[AbpValidateAntiForgeryToken]` and `[AbpAutoValidateAnti
ABP Framework also automates the following infrastructure; ABP Framework also automates the following infrastructure;
* Server side sets a **special cookie**, named `XSRF-TOKEN` by default, that is used make the antiforgery token value available to the browser. This is **done automatically** (by the [application configuration](Application-Configuration.md) endpoint). Nothing to do in the client side. * Server side sets a **special cookie**, named `XSRF-TOKEN` by default, that is used make the antiforgery token value available to the browser. This is **done automatically** (by the [application configuration](API/Application-Configuration.md) endpoint). Nothing to do in the client side.
* In the client side, it reads the token from the cookie and sends it in the **HTTP header** (named `RequestVerificationToken` by default). This is implemented for all the supported UI types. * In the client side, it reads the token from the cookie and sends it in the **HTTP header** (named `RequestVerificationToken` by default). This is implemented for all the supported UI types.
* Server side validates the antiforgery token **only for same and cross site requests** made by the browser. It bypasses the validation for non-browser clients. * Server side validates the antiforgery token **only for same and cross site requests** made by the browser. It bypasses the validation for non-browser clients.
@ -117,3 +117,46 @@ You don't need to make anything unless you need to change the `AntiforgeryOption
}) })
export class AppModule {} export class AppModule {}
``` ```
**Note:** XSRF-TOKEN is only valid if both frontend application and APIs run on the same domain. Therefore, when you make a request, you should use a relative path.
For example, let's say your APIs is hosted at `https://testdomain.com/ws`
and your angular application is hosted at `https://testdomain.com/admin`
So if your API request should look like this `https://testdomain.com/ws/api/identity/users`
your `environment.prod.ts` has to be as follows:
```typescript
export const environment = {
production: true,
// ....
apis: {
default: {
url: '/ws', // <- just use the context root here
// ...
},
},
} as Config.Environment;
```
Let's talk about why.
First, take a look at [Angular's code](https://github.com/angular/angular/blob/master/packages/common/http/src/xsrf.ts#L81)
It does not intercept any request that starts with `http://` or `https://`. There is a good reason for that. Any cross-site request does not need this token for security. This verification is only valid if the request is made to the same domain from which the web page is served. So, simply put, if you serve everything from a single domain, you just use a relative path.
If you serve your APIs from the root, i.e. no context root (https://testdomain.com/api/identity/users), leave `url` empty as follows:
```typescript
export const environment = {
production: true,
// ....
apis: {
default: {
url: '', // <- should be empty string, not '/'
// ...
},
},
} as Config.Environment;
```

11
docs/en/Community-Articles/2020-04-19-Customize-the-SignIn-Manager/POST.md

@ -1,6 +1,6 @@
# How to Customize the SignIn Manager for ABP Applications # How to Customize the SignIn Manager for ABP Applications
After creating a new application using the [application startup template](https://docs.abp.io/en/abp/latest/Startup-Templates/Application), you may want extend or change the default behavior of the SignIn Manager for your authentication and registration flow needs. ABP [Account Module](https://docs.abp.io/en/abp/latest/Modules/Account) uses the [Identity Management Module](https://docs.abp.io/en/abp/latest/Modules/Identity) for SignIn Manager and the [Identity Management Module](https://docs.abp.io/en/abp/latest/Modules/Identity) uses default [Microsoft Identity SignIn Manager](https://github.com/dotnet/aspnetcore/blob/master/src/Identity/Core/src/SignInManager.cs) ([see here](https://github.com/abpframework/abp/blob/be32a55449e270d2d456df3dabdc91f3ffdd4fa9/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreModule.cs#L17)). After creating a new application using the [application startup template](https://docs.abp.io/en/abp/latest/Startup-Templates/Application), you may want extend or change the default behavior of the SignIn Manager for your authentication and registration flow needs. ABP [Account Module](https://docs.abp.io/en/abp/latest/Modules/Account) uses the [Identity Management Module](https://docs.abp.io/en/abp/latest/Modules/Identity) for SignIn Manager and the [Identity Management Module](https://docs.abp.io/en/abp/latest/Modules/Identity) uses default [Microsoft Identity SignIn Manager](https://github.com/dotnet/aspnetcore/blob/master/src/Identity/Core/src/SignInManager.cs) ([see here](https://github.com/abpframework/abp/blob/be32a55449e270d2d456df3dabdc91f3ffdd4fa9/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpIdentityAspNetCoreModule.cs#L17)).
To write your Custom SignIn Manager, you need to extend [Microsoft Identity SignIn Manager](https://github.com/dotnet/aspnetcore/blob/master/src/Identity/Core/src/SignInManager.cs) class and register it to the DI container. To write your Custom SignIn Manager, you need to extend [Microsoft Identity SignIn Manager](https://github.com/dotnet/aspnetcore/blob/master/src/Identity/Core/src/SignInManager.cs) class and register it to the DI container.
@ -27,7 +27,7 @@ public class CustomSignInManager : Microsoft.AspNetCore.Identity.SignInManager<V
} }
```` ````
> It is important to use **Volo.Abp.Identity.IdentityUser** type for SignInManager to inherit, not the AppUser of your application. > It is important to use **Volo.Abp.Identity.IdentityUser** type for SignInManager to inherit, not the AppUser of your application.
Afterwards you can override any of the SignIn Manager methods you need and add new methods and properties needed for your authentication or registration flow. Afterwards you can override any of the SignIn Manager methods you need and add new methods and properties needed for your authentication or registration flow.
@ -38,7 +38,7 @@ In this case we'll be overriding the `GetExternalLoginInfoAsync` method which is
A good way to override a method is copying its [source code](https://github.com/dotnet/aspnetcore/blob/c56aa320c32ee5429d60647782c91d53ac765865/src/Identity/Core/src/SignInManager.cs#L638-L674). In this case, we will be using a minorly modified version of the source code which explicitly shows the namespaces of the methods and properties to help better understanding of the concept. A good way to override a method is copying its [source code](https://github.com/dotnet/aspnetcore/blob/c56aa320c32ee5429d60647782c91d53ac765865/src/Identity/Core/src/SignInManager.cs#L638-L674). In this case, we will be using a minorly modified version of the source code which explicitly shows the namespaces of the methods and properties to help better understanding of the concept.
````csharp ````csharp
public override async Task<Microsoft.AspNetCore.Identity.ExternalLoginInfo> GetExternalLoginInfoAsync(string expectedXsrf = null) public async override Task<Microsoft.AspNetCore.Identity.ExternalLoginInfo> GetExternalLoginInfoAsync(string expectedXsrf = null)
{ {
var auth = await Context.AuthenticateAsync(Microsoft.AspNetCore.Identity.IdentityConstants.ExternalScheme); var auth = await Context.AuthenticateAsync(Microsoft.AspNetCore.Identity.IdentityConstants.ExternalScheme);
var items = auth?.Properties?.Items; var items = auth?.Properties?.Items;
@ -71,7 +71,8 @@ public override async Task<Microsoft.AspNetCore.Identity.ExternalLoginInfo> GetE
?? provider; ?? provider;
return new Microsoft.AspNetCore.Identity.ExternalLoginInfo(auth.Principal, provider, providerKey, providerDisplayName) return new Microsoft.AspNetCore.Identity.ExternalLoginInfo(auth.Principal, provider, providerKey, providerDisplayName)
{ {
AuthenticationTokens = auth.Properties.GetTokens() AuthenticationTokens = auth.Properties.GetTokens(),
AuthenticationProperties = auth.Properties
}; };
} }
```` ````
@ -93,4 +94,4 @@ PreConfigure<IdentityBuilder>(identityBuilder =>
## The Source Code ## The Source Code
You can find the source code of the completed example [here](https://github.com/abpframework/abp-samples/tree/master/Authentication-Customization). You can find the source code of the completed example [here](https://github.com/abpframework/abp-samples/tree/master/Authentication-Customization).

48
docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md

@ -6,9 +6,9 @@ Adding Azure Active Directory is pretty straightforward in ABP framework. Couple
Two different **alternative approaches** for AzureAD integration will be demonstrated for better coverage. Two different **alternative approaches** for AzureAD integration will be demonstrated for better coverage.
1. **AddAzureAD**: This approach uses Microsoft [AzureAD UI nuget package](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.AzureAD.UI/) which is very popular when users search the web about how to integrate AzureAD to their web application. 1. ~~**AddAzureAD**: This approach uses Microsoft [AzureAD UI nuget package](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.AzureAD.UI/) which is very popular when users search the web about how to integrate AzureAD to their web application.~~ Now marked **Obsolete** (see https://github.com/aspnet/Announcements/issues/439).
2. **AddOpenIdConnect**: This approach uses default [OpenIdConnect](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.OpenIdConnect/) which can be used for not only AzureAD but for all OpenId connections. 2. **AddOpenIdConnect**: This approach uses default [OpenIdConnect](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.OpenIdConnect/) which can be used for not only AzureAD but for all OpenId connections.
3. **AddMicrosoftIdentityWebAppAuthentication:** This approach uses newly introduced [Microsoft.Identity.Web nuget package](https://www.nuget.org/packages/Microsoft.Identity.Web/) to replace AddAzureAD.
> There is **no difference** in functionality between these approaches. AddAzureAD is an abstracted way of OpenIdConnection ([source](https://github.com/dotnet/aspnetcore/blob/c56aa320c32ee5429d60647782c91d53ac765865/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAuthenticationBuilderExtensions.cs#L122)) with predefined cookie settings. > There is **no difference** in functionality between these approaches. AddAzureAD is an abstracted way of OpenIdConnection ([source](https://github.com/dotnet/aspnetcore/blob/c56aa320c32ee5429d60647782c91d53ac765865/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAuthenticationBuilderExtensions.cs#L122)) with predefined cookie settings.
> >
@ -134,13 +134,50 @@ private void ConfigureAuthentication(ServiceConfigurationContext context, IConfi
And that's it, integration is completed. Keep on mind that you can connect any other external authentication providers. And that's it, integration is completed. Keep on mind that you can connect any other external authentication providers.
## 3. AddMicrosoftIdentityWebAppAuthentication
With .Net 5.0, AzureAd is marked [obsolete](https://github.com/dotnet/aspnetcore/issues/25807) and will not be supported in the near future. However its expanded functionality is available in [microsoft-identity-web](https://github.com/AzureAD/microsoft-identity-web/wiki) packages.
Add (or replace with) the new nuget package Microsoft.Identity.Web nuget package](https://www.nuget.org/packages/Microsoft.Identity.Web/).
In your **.Web** project; you update the `ConfigureAuthentication` method located in your **ApplicationWebModule** with the following while having the AzureAd appsettings section as defined before:
````csharp
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
{
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Add("sub", ClaimTypes.NameIdentifier);
context.Services.AddAuthentication()
.AddIdentityServerAuthentication(options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = false;
options.ApiName = "Acme.BookStore";
});
context.Services.AddMicrosoftIdentityWebAppAuthentication(
configuration: configuration,
configSectionName: "AzureAd",
openIdConnectScheme:"AzureAD",
cookieScheme:null);
}
````
And that's all to add new Microsoft-Identity-Web.
> **Don't forget to:**
>
> * Pass **cookieScheme** parameter as **null** or your [*GetExternalLoginInfoAsync* method will always return null](https://github.com/AzureAD/microsoft-identity-web/issues/133#).
Keep in mind that [Microsoft-Identity-Web](https://github.com/AzureAD/microsoft-identity-web) is relatively new and keeps getting new enhancements, features and documentation.
## The Source Code ## The Source Code
You can find the source code of the completed example [here](https://github.com/abpframework/abp-samples/tree/master/Authentication-Customization). You can find the source code of the completed example [here](https://github.com/abpframework/abp-samples/tree/master/Authentication-Customization).
# FAQ # FAQ
* Help! `GetExternalLoginInfoAsync` returns `null`! * Help! `GetExternalLoginInfoAsync` returns `null`! (Using obsolute **AddAzureAD**)
* There can be 2 reasons for this; * There can be 2 reasons for this;
@ -158,6 +195,11 @@ You can find the source code of the completed example [here](https://github.com/
```` ````
* Help! `GetExternalLoginInfoAsync` returns `null`! (Using **AddMicrosoftIdentityWebAppAuthentication**)
* Pass cookieScheme parameter as **null**. (See [this issue](https://github.com/AzureAD/microsoft-identity-web/issues/133)).
* Help! I am getting ***System.ArgumentNullException: Value cannot be null. (Parameter 'userName')*** error! * Help! I am getting ***System.ArgumentNullException: Value cannot be null. (Parameter 'userName')*** error!

14
docs/en/Community-Articles/2020-08-07-Passwordless-Authentication/POST.md

@ -33,7 +33,7 @@ namespace PasswordlessAuthentication.Web
} }
//We need to override this method as well. //We need to override this method as well.
public override async Task<string> GetUserModifierAsync(string purpose, UserManager<TUser> manager, TUser user) public async override Task<string> GetUserModifierAsync(string purpose, UserManager<TUser> manager, TUser user)
{ {
var userId = await manager.GetUserIdAsync(user); var userId = await manager.GetUserIdAsync(user);
@ -105,7 +105,7 @@ namespace PasswordlessAuthentication.Web.Pages
UserManager = userManager; UserManager = userManager;
_userRepository = userRepository; _userRepository = userRepository;
} }
public ActionResult OnGet() public ActionResult OnGet()
{ {
if (!CurrentUser.IsAuthenticated) if (!CurrentUser.IsAuthenticated)
@ -115,15 +115,15 @@ namespace PasswordlessAuthentication.Web.Pages
return Page(); return Page();
} }
//added for passwordless authentication //added for passwordless authentication
public async Task<IActionResult> OnPostGeneratePasswordlessTokenAsync() public async Task<IActionResult> OnPostGeneratePasswordlessTokenAsync()
{ {
var adminUser = await _userRepository.FindByNormalizedUserNameAsync("admin"); var adminUser = await _userRepository.FindByNormalizedUserNameAsync("admin");
var token = await UserManager.GenerateUserTokenAsync(adminUser, "PasswordlessLoginProvider", var token = await UserManager.GenerateUserTokenAsync(adminUser, "PasswordlessLoginProvider",
"passwordless-auth"); "passwordless-auth");
PasswordlessLoginUrl = Url.Action("Login", "Passwordless", PasswordlessLoginUrl = Url.Action("Login", "Passwordless",
new {token = token, userId = adminUser.Id.ToString()}, Request.Scheme); new {token = token, userId = adminUser.Id.ToString()}, Request.Scheme);
@ -238,7 +238,7 @@ namespace PasswordlessAuthentication.Web.Controllers
return Redirect("/"); return Redirect("/");
} }
private static IEnumerable<Claim> CreateClaims(IUser user, IEnumerable<string> roles) private static IEnumerable<Claim> CreateClaims(IUser user, IEnumerable<string> roles)
{ {
var claims = new List<Claim> var claims = new List<Claim>
@ -272,4 +272,4 @@ That's all! We created a passwordless login with 7 steps.
## Source Code ## Source Code
The completed sample is available on [GitHub repository](https://github.com/abpframework/abp-samples/tree/master/PasswordlessAuthentication). The completed sample is available on [GitHub repository](https://github.com/abpframework/abp-samples/tree/master/PasswordlessAuthentication).

140
docs/en/Community-Articles/2020-08-12-Patch-Chrome-Login-Issue-For-IdentityServer4/POST.md

@ -11,157 +11,75 @@ When you use HTTP on your Identity Server 4 enabled website, users may not login
Create the below extension in your ***.Web** project. Create the below extension in your ***.Web** project.
```csharp ```csharp
using System;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.Extensions.DependencyInjection namespace Microsoft.Extensions.DependencyInjection
{ {
public static class SameSiteCookiesServiceCollectionExtensions public static class SameSiteCookiesServiceCollectionExtensions
{ {
/// <summary> public static IServiceCollection AddSameSiteCookiePolicy(this IServiceCollection services)
/// -1 defines the unspecified value, which tells ASPNET Core to NOT
/// send the SameSite attribute. With ASPNET Core 3.1 the
/// <seealso cref="SameSiteMode" /> enum will have a definition for
/// Unspecified.
/// </summary>
private const SameSiteMode Unspecified = (SameSiteMode)(-1);
/// <summary>
/// Configures a cookie policy to properly set the SameSite attribute
/// for Browsers that handle unknown values as Strict. Ensure that you
/// add the <seealso cref="Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware" />
/// into the pipeline before sending any cookies!
/// </summary>
/// <remarks>
/// Minimum ASPNET Core Version required for this code:
/// - 2.1.14
/// - 2.2.8
/// - 3.0.1
/// - 3.1.0-preview1
/// Starting with version 80 of Chrome (to be released in February 2020)
/// cookies with NO SameSite attribute are treated as SameSite=Lax.
/// In order to always get the cookies send they need to be set to
/// SameSite=None. But since the current standard only defines Lax and
/// Strict as valid values there are some browsers that treat invalid
/// values as SameSite=Strict. We therefore need to check the browser
/// and either send SameSite=None or prevent the sending of SameSite=None.
/// Relevant links:
/// - https://tools.ietf.org/html/draft-west-first-party-cookies-07#section-4.1
/// - https://tools.ietf.org/html/draft-west-cookie-incrementalism-00
/// - https://www.chromium.org/updates/same-site
/// - https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/
/// - https://bugs.webkit.org/show_bug.cgi?id=198181
/// </remarks>
/// <param name="services">The service collection to register <see cref="CookiePolicyOptions" /> into.</param>
/// <returns>The modified <see cref="IServiceCollection" />.</returns>
public static IServiceCollection ConfigureNonBreakingSameSiteCookies(this IServiceCollection services)
{ {
services.Configure<CookiePolicyOptions>(options => services.Configure<CookiePolicyOptions>(options =>
{ {
options.MinimumSameSitePolicy = Unspecified; options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.OnAppendCookie = cookieContext => options.OnAppendCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
options.OnDeleteCookie = cookieContext => options.OnDeleteCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
}); });
return services; return services;
} }
private static void CheckSameSite(HttpContext httpContext, CookieOptions options) private static void CheckSameSite(HttpContext httpContext, CookieOptions options)
{ {
if (options.SameSite == SameSiteMode.None) if (options.SameSite == SameSiteMode.None)
{ {
var userAgent = httpContext.Request.Headers["User-Agent"].ToString(); var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
if (!httpContext.Request.IsHttps || DisallowsSameSiteNone(userAgent))
if (DisallowsSameSiteNone(userAgent))
{ {
options.SameSite = Unspecified; // For .NET Core < 3.1 set SameSite = (SameSiteMode)(-1)
options.SameSite = SameSiteMode.Unspecified;
} }
} }
} }
/// <summary>
/// Checks if the UserAgent is known to interpret an unknown value as Strict.
/// For those the <see cref="CookieOptions.SameSite" /> property should be
/// set to <see cref="Unspecified" />.
/// </summary>
/// <remarks>
/// This code is taken from Microsoft:
/// https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/
/// </remarks>
/// <param name="userAgent">The user agent string to check.</param>
/// <returns>Whether the specified user agent (browser) accepts SameSite=None or not.</returns>
private static bool DisallowsSameSiteNone(string userAgent) private static bool DisallowsSameSiteNone(string userAgent)
{ {
// Cover all iOS based browsers here. This includes: // Cover all iOS based browsers here. This includes:
// - Safari on iOS 12 for iPhone, iPod Touch, iPad // - Safari on iOS 12 for iPhone, iPod Touch, iPad
// - WkWebview on iOS 12 for iPhone, iPod Touch, iPad // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad
// - Chrome on iOS 12 for iPhone, iPod Touch, iPad // - Chrome on iOS 12 for iPhone, iPod Touch, iPad
// All of which are broken by SameSite=None, because they use the // All of which are broken by SameSite=None, because they use the iOS networking stack
// iOS networking stack. if (userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12"))
// Notes from Thinktecture:
// Regarding https://caniuse.com/#search=samesite iOS versions lower
// than 12 are not supporting SameSite at all. Starting with version 13
// unknown values are NOT treated as strict anymore. Therefore we only
// need to check version 12.
if (userAgent.Contains("CPU iPhone OS 12")
|| userAgent.Contains("iPad; CPU OS 12"))
{ {
return true; return true;
} }
// Cover Mac OS X based browsers that use the Mac OS networking stack. // Cover Mac OS X based browsers that use the Mac OS networking stack. This includes:
// This includes: // - Safari on Mac OS X.
// - Safari on Mac OS X.
// This does not include: // This does not include:
// - Chrome on Mac OS X // - Chrome on Mac OS X
// because they do not use the Mac OS networking stack. // Because they do not use the Mac OS networking stack.
// Notes from Thinktecture: if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") &&
// Regarding https://caniuse.com/#search=samesite MacOS X versions lower userAgent.Contains("Version/") && userAgent.Contains("Safari"))
// than 10.14 are not supporting SameSite at all. Starting with version
// 10.15 unknown values are NOT treated as strict anymore. Therefore we
// only need to check version 10.14.
if (userAgent.Contains("Safari")
&& userAgent.Contains("Macintosh; Intel Mac OS X 10_14")
&& userAgent.Contains("Version/"))
{ {
return true; return true;
} }
// Cover Chrome 50-69, because some versions are broken by SameSite=None // Cover Chrome 50-69, because some versions are broken by SameSite=None,
// and none in this range require it. // and none in this range require it.
// Note: this covers some pre-Chromium Edge versions, // Note: this covers some pre-Chromium Edge versions,
// but pre-Chromium Edge does not require SameSite=None. // but pre-Chromium Edge does not require SameSite=None.
// Notes from Thinktecture:
// We can not validate this assumption, but we trust Microsofts
// evaluation. And overall not sending a SameSite value equals to the same
// behavior as SameSite=None for these old versions anyways.
if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6")) if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6"))
{ {
return true; return true;
} }
if (GetChromeVersion(userAgent) >= 80)
{
return true;
}
return false; return false;
} }
private static int GetChromeVersion(string userAgent)
{
try
{
return Convert.ToInt32(userAgent.Split("Chrome/")[1].Split('.')[0]);
}
catch (Exception)
{
return 0;
}
}
} }
} }
``` ```
@ -173,7 +91,7 @@ Assume that your project name is *Acme.BookStore*. Then open `AcmeBookStoreWebMo
Add the following line to `ConfigureServices()` method. Add the following line to `ConfigureServices()` method.
```csharp ```csharp
context.Services.ConfigureNonBreakingSameSiteCookies(); context.Services.AddSameSiteCookiePolicy(); // cookie policy to deal with temporary browser incompatibilities
``` ```
### Step-3 ### Step-3
@ -195,18 +113,14 @@ public override void OnApplicationInitialization(ApplicationInitializationContex
app.UseHsts(); app.UseHsts();
} }
app.UseCookiePolicy(); //<--- added this ---> app.UseCookiePolicy(); // added this, Before UseAuthentication or anything else that writes cookies.
//.... //....
} }
``` ```
It's all! You are ready to go! It's all! You are ready to go!
--- ---
Referenced from https://www.thinktecture.com/en/identity/samesite/prepare-your-identityserver/ Referenced from https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/

2
docs/en/Community-Articles/2020-08-31-Adding-User-Navigation-In-Suite/POST.md

@ -22,6 +22,8 @@ Then add a string property called `Title`, as an example property.
### Create AppUserDto ### Create AppUserDto
_Note that, creating `AppUserDto` is not necessary after ABP v4.X_
ABP Suite needs a DTO for the target entity (user, in this case) in order to define a navigation property. ABP Suite needs a DTO for the target entity (user, in this case) in order to define a navigation property.
To do this, create a new folder called "Users" in `*.Application.Contracts` then add a new class called `AppUserDto` inherited from `IdentityUserDto`. To do this, create a new folder called "Users" in `*.Application.Contracts` then add a new class called `AppUserDto` inherited from `IdentityUserDto`.

12
docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md

@ -1,22 +1,22 @@
# How to Setup Azure Active Directory and Integrate Abp Angular Application # How to Setup Azure Active Directory and Integrate ABP Angular Application
This guide demonstrates how to register an application to Azure Active Directory and integrate AzureAD to an ABP angular application that enables users to sign in using OAuth 2.0 with credentials from **Azure Active Directory**. This guide demonstrates how to register an application to Azure Active Directory and integrate AzureAD to an ABP Angular application that enables users to sign in using OAuth 2.0 with credentials from **Azure Active Directory**.
## Authentication Flow ## Authentication Flow
Abp angular applications use **Authentication Code with PKCE** (specs [here](https://tools.ietf.org/html/rfc7636)) which is the most suitable flow for spa applications by the time this article is written since implicit flow is deprecated. ABP Angular application uses **Authentication Code with PKCE** (specs [here](https://tools.ietf.org/html/rfc7636)) which is the most suitable flow for SPA applications by the time this article is written since implicit flow is deprecated.
The most common question is; The most common question is;
> Where to put OpenId connection code in angular project? > Where to put OpenId connection code in the Angular project?
The answer is, **you don't**. Abp angular application is integrated with backend code (HttpApi.Host project) where it loads the configurations, **permissions** etc. For none-tiered angular applications, **HttpApi.Host** project also has IdentityServer4 embedded; also serving as **Authorization Server**. Angular application authentication flow is shown below. The answer is, **you don't**. ABP Angular application is integrated with the backend (HttpApi.Host project) where it loads the configurations, **permissions** etc. For none-tiered angular applications, **HttpApi.Host** project also has IdentityServer4 embedded; also serving as **Authorization Server**. Angular application authentication flow is shown below.
<img src="auth-diagram.jpeg" alt="auth-diagram" style="zoom:50%;" /> <img src="auth-diagram.jpeg" alt="auth-diagram" style="zoom:50%;" />
> What if I want Azure AD as my authorization server and not IdentityServer? > What if I want Azure AD as my authorization server and not IdentityServer?
This means your application will be using AzureAD user store for authentication. By registering both angular app and HttpApi to AzureAD, authentication might work but **authorization won't**. Users need to be registered to Abp identity system for auditing, permissions etc. So the flow should be 3rd party registration. This means your application will be using AzureAD user store for authentication. By registering both Angular app and HttpApi to AzureAD, authentication might work but **authorization won't**. Users need to be registered to ABP identity system for auditing, permissions etc. So the flow should be 3rd party registration.
## Setting up OpenId Connection ## Setting up OpenId Connection

46
docs/en/Community-Articles/2020-11-02-How-To-Add-New-Language/POST.md

@ -0,0 +1,46 @@
# How to add a new language to your ABP project?
Adding a new language to your ABP project is pretty simple. Let's add the German language to our ABP project:
1. Go to your solution's root folder and write the following CLI command. This command will generate an empty translation file from English.
```bash
abp translate -c de-DE
```
Check out for [the complete supported culture codes](https://docs.microsoft.com/en-us/bingmaps/rest-services/common-parameters-and-types/supported-culture-codes).
(For internal development `D:\Github\abp` and `D:\Github\volo\abp`)
2. Fill the `target` fields in your target language.
![Fill target fields](language-target.png)
3. Copy `abp-translation.json` your solution's root folder (Do not change the filename!)
4. Run the following command. This command will create the necessary `json` files.
```bash
abp translate --apply
```
5. Open your solution and add the new language to the language list. To do this;
* open `MyProjectNameDomainModule.cs` and in `ConfigureServices` you'll find `Configure<AbpLocalizationOptions>`. If you have `HttpApi.Host` project then you need to add this in `MyProjectNameHttpApiHostModule.cs`
```
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch", "de"));
```
![Add to languages](add-to-languages.png)
The last parameter is the flag icon. You can find the list of flag icons on https://flagicons.lipis.dev/
6. The last step is running the DbMigrator project. It will seed the database for the new language.
![The database table](database-table.png)
Close the IIS Express / Kestrel to invalidate the language cache and run the project. You will see the new language on your website.
![See the final result](website-new-language.png)

BIN
docs/en/Community-Articles/2020-11-02-How-To-Add-New-Language/add-to-languages.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
docs/en/Community-Articles/2020-11-02-How-To-Add-New-Language/database-table.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
docs/en/Community-Articles/2020-11-02-How-To-Add-New-Language/language-target.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

BIN
docs/en/Community-Articles/2020-11-02-How-To-Add-New-Language/website-new-language.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

936
docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md

@ -0,0 +1,936 @@
# Creating an Event Organizer Application with the ABP Framework & Blazor UI.
## Introduction
In this article, we will create an example application that is a simple **meeting/event organizer**: People create events and other people registers to the event.
The application has been developed with **Blazor** as the UI framework and **MongoDB** as the database provider.
> This tutorial is based on my notes that I'd created to implement this application in a workshop. It shows the necessary steps to build the application rather than detailed explanations.
### Source Code
Source code of the completed application is [available on GitHub](https://github.com/abpframework/abp-samples/tree/master/EventOrganizer).
### Screenshots
Here, the pages of the final application.
**Home Page - Event List**
![event-list-ui](images/event-list-ui.png)
**Creating a new Event**
![event-create-ui](images/event-create-ui.png)
**Event Detail Page**
![event-detail-ui](images/event-detail-ui.png)
## Requirements
The following tools are needed to be able to run the solution.
* .NET 5.0 SDK
* Visual Studio 2019 16.8.0+ or another compatible IDE
* MongoDB Server (with MongoDB Compass)
## Development
### Creating a new Application
* Use the following ABP CLI command:
````bash
abp new EventOrganizer -u blazor -d mongodb
````
### Open & Run the Application
* Open the solution in Visual Studio (or your favorite IDE).
* Run the `EventOrganizer.DbMigrator` application to seed the initial data.
* Run the `EventOrganizer.HttpApi.Host` application that starts the server side.
* Run the `EventOrganizer.Blazor` application to start the UI.
### Apply the Custom Styles
* Add styles to `wwwroot/main.css`:
````css
body.abp-application-layout {
background-color: #222 !important;
font-size: 18px;
}
nav#main-navbar.bg-dark {
background-color: #222 !important;
box-shadow: none !important;
}
.event-pic {
width: 100%;
border-radius: 12px;
box-shadow: 5px 5px 0px 0px rgba(0,0,0,.5);
margin-bottom: 10px;
}
.event-link:hover, .event-link:hover *{
text-decoration: none;
}
.event-link:hover .event-pic {
box-shadow: 5px 5px 0px 0px #ffd800;
}
.event-form {
background-color: #333 !important;
box-shadow: 5px 5px 0px 0px rgba(0,0,0,.5);
border-radius: 12px;
}
.table {
background: #fff;
border-radius: 12px;
box-shadow: 5px 5px 0px 0px rgba(0,0,0,.5);
}
.table th{
border: 0 !important;
}
.modal {
color: #333;
}
.page-item:first-child .page-link {
margin-left: 0;
border-top-left-radius: 12px;
border-bottom-left-radius: 12px;
}
.page-item:last-child .page-link {
border-top-right-radius: 12px;
border-bottom-right-radius: 12px;
}
.btn {
border-radius: 8px;
}
.att-list {
list-style: none;
padding: 0;
}
.att-list li {
padding: 4px 0 0 0;
}
````
* `wwwroot/index.html`: Remove `bg-light` class from the `body` tag and add `bg-dark text-light`.
### Domain Layer
* Add the following `Event` aggregate (with `EventAttendee`) to the solution:
**Event**
````csharp
using System;
using System.Collections.Generic;
using Volo.Abp.Domain.Entities.Auditing;
namespace EventOrganizer.Events
{
public class Event : FullAuditedAggregateRoot<Guid>
{
public string Title { get; set; }
public string Description { get; set; }
public bool IsFree { get; set; }
public DateTime StartTime { get; set; }
public ICollection<EventAttendee> Attendees { get; set; }
public Event()
{
Attendees = new List<EventAttendee>();
}
}
}
````
**EventAttendee**
```csharp
using System;
using Volo.Abp.Auditing;
namespace EventOrganizer.Events
{
public class EventAttendee : IHasCreationTime
{
public Guid UserId { get; set; }
public DateTime CreationTime { get; set; }
}
}
```
### MongoDB Mapping
* Add the following property to the `EventOrganizerMongoDbContext`:
````csharp
public IMongoCollection<Event> Events => Collection<Event>();
````
### Clean Index.razor & Add the Header & "Create Event" button
* Clean the `Index.razor` file.
* Replace the content with the following code:
````html
@page "/"
@inherits EventOrganizerComponentBase
<Row Class="mb-4">
<Column Class="text-left">
<h1>Upcoming Events</h1>
</Column>
<Column Class="text-right">
@if (CurrentUser.IsAuthenticated)
{
<a class="btn btn-primary" href="/create-event">
<i class="fa fa-plus"></i> @L["CreateEvent"]
</a>
}
</Column>
</Row>
````
* Open `Localization/EventOrganizer/en.json` in the `EventOrganizer.Domain.Shared` project and add the following entry:
````json
"CreateEvent": "Create a new event!"
````
The Result (run the `EventOrganizer.Blazor` application to see):
![index-title](images/index-title.png)
### Event Creation
* Create the Initial `IEventAppService` with the `CreateAsync` method:
````csharp
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace EventOrganizer.Events
{
public interface IEventAppService : IApplicationService
{
Task<Guid> CreateAsync(EventCreationDto input);
}
}
````
* Add `EventCreationDto` class:
````csharp
using System;
using System.ComponentModel.DataAnnotations;
namespace EventOrganizer.Events
{
public class EventCreationDto
{
[Required]
[StringLength(100)]
public string Title { get; set; }
[Required]
[StringLength(2000)]
public string Description { get; set; }
public bool IsFree { get; set; }
public DateTime StartTime { get; set; }
}
}
````
* Implement the `EventAppService`:
````csharp
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Domain.Repositories;
namespace EventOrganizer.Events
{
public class EventAppService : EventOrganizerAppService, IEventAppService
{
private readonly IRepository<Event, Guid> _eventRepository;
public EventAppService(IRepository<Event, Guid> eventRepository)
{
_eventRepository = eventRepository;
}
[Authorize]
public async Task<Guid> CreateAsync(EventCreationDto input)
{
var eventEntity = ObjectMapper.Map<EventCreationDto, Event>(input);
await _eventRepository.InsertAsync(eventEntity);
return eventEntity.Id;
}
}
}
````
* Add AutoMapper mapping to the `EventOrganizerApplicationAutoMapperProfile` class:
````csharp
using AutoMapper;
using EventOrganizer.Events;
namespace EventOrganizer
{
public class EventOrganizerApplicationAutoMapperProfile : Profile
{
public EventOrganizerApplicationAutoMapperProfile()
{
CreateMap<EventCreationDto, Event>();
}
}
}
````
This will automatically create the HTTP (REST) API for the application service (run the `EventOrganizer.HttpApi.Host` application to see it on the Swagger UI):
![swagger-event-create](images/swagger-event-create.png)
* Create the `CreateEvent.razor` file:
````csharp
@page "/create-event"
@inherits EventOrganizerComponentBase
<Heading Size="HeadingSize.Is3" Margin="Margin.Is5.FromTop.Is4.FromBottom" Class="text-center">Create Event</Heading>
<Row>
<Column ColumnSize="ColumnSize.Is6.Is3.WithOffset">
<div class="p-lg-5 p-md-3 event-form">
<EditForm Model="@Event" OnValidSubmit="Create">
<Field>
<FieldLabel>@L["Title"]</FieldLabel>
<TextEdit @bind-Text="@Event.Title" />
</Field>
<Field>
<FieldLabel>@L["Description"]</FieldLabel>
<MemoEdit @bind-Text="@Event.Description" />
</Field>
<Field>
<Check TValue="bool" @bind-Checked="@Event.IsFree">@L["Free"]</Check>
</Field>
<Field>
<FieldLabel>@L["StartTime"]</FieldLabel>
<DateEdit TValue="DateTime" @bind-Date="@Event.StartTime" />
</Field>
<Button Type="@ButtonType.Submit" Block="true" Color="@Color.Primary" Size="Size.Large">@L["Save"]</Button>
</EditForm>
</div>
</Column>
</Row>
````
* Create a partial `CreateEvent` class in the same folder, with the `CreateEvent.razor.cs` as the file name:
````csharp
using System.Threading.Tasks;
using EventOrganizer.Events;
using Microsoft.AspNetCore.Components;
namespace EventOrganizer.Blazor.Pages
{
public partial class CreateEvent
{
private EventCreationDto Event { get; set; } = new EventCreationDto();
private readonly IEventAppService _eventAppService;
private readonly NavigationManager _navigationManager;
public CreateEvent(
IEventAppService eventAppService,
NavigationManager navigationManager)
{
_eventAppService = eventAppService;
_navigationManager = navigationManager;
}
private async Task Create()
{
var eventId = await _eventAppService.CreateAsync(Event);
_navigationManager.NavigateTo("/events/" + eventId);
}
}
}
````
The final UI is (run the `EventOrganizer.Blazor` application and click to the "Create Event" button):
![event-create-ui](images/event-create-ui.png)
### Upcoming Events (Home Page)
* Open the `IEventAppService` and add a `GetUpcomingAsync` method to get the list of upcoming events:
````csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace EventOrganizer.Events
{
public interface IEventAppService : IApplicationService
{
Task<Guid> CreateAsync(EventCreationDto input);
Task<List<EventDto>> GetUpcomingAsync();
}
}
````
* Add a `EventDto` class:
````csharp
using System;
using Volo.Abp.Application.Dtos;
namespace EventOrganizer.Events
{
public class EventDto : EntityDto<Guid>
{
public string Title { get; set; }
public string Description { get; set; }
public bool IsFree { get; set; }
public DateTime StartTime { get; set; }
public int AttendeesCount { get; set; }
}
}
````
* Implement the `GetUpcomingAsync` in the `EventAppService` class:
````csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Domain.Repositories;
namespace EventOrganizer.Events
{
public class EventAppService : EventOrganizerAppService, IEventAppService
{
private readonly IRepository<Event, Guid> _eventRepository;
public EventAppService(IRepository<Event, Guid> eventRepository)
{
_eventRepository = eventRepository;
}
[Authorize]
public async Task<Guid> CreateAsync(EventCreationDto input)
{
var eventEntity = ObjectMapper.Map<EventCreationDto, Event>(input);
await _eventRepository.InsertAsync(eventEntity);
return eventEntity.Id;
}
public async Task<List<EventDto>> GetUpcomingAsync()
{
var events = await AsyncExecuter.ToListAsync(
_eventRepository
.Where(x => x.StartTime > Clock.Now)
.OrderBy(x => x.StartTime)
);
return ObjectMapper.Map<List<Event>, List<EventDto>>(events);
}
}
}
````
* Add the following line into the `EventOrganizerApplicationAutoMapperProfile` constructor:
````csharp
CreateMap<Event, EventDto>();
````
Run the `EventOrganizer.HttpApi.Host` application to see the new `upcoming` endpoint on the Swagger UI:
![swagger-event-upcoming](images/swagger-event-upcoming.png)
* Change the `Pages/Index.razor.cs` content in the `EventOrganizer.Blazor` project as shown below:
```csharp
using System.Collections.Generic;
using System.Threading.Tasks;
using EventOrganizer.Events;
namespace EventOrganizer.Blazor.Pages
{
public partial class Index
{
private List<EventDto> UpcomingEvents { get; set; } = new List<EventDto>();
private readonly IEventAppService _eventAppService;
public Index(IEventAppService eventAppService)
{
_eventAppService = eventAppService;
}
protected override async Task OnInitializedAsync()
{
UpcomingEvents = await _eventAppService.GetUpcomingAsync();
}
}
}
```
* Change the `Pages/Index.razor` content in the `EventOrganizer.Blazor` project as shown below:
````html
@page "/"
@inherits EventOrganizerComponentBase
<Row Class="mb-4">
<Column Class="text-left">
<h1>Upcoming Events</h1>
</Column>
<Column Class="text-right">
@if (CurrentUser.IsAuthenticated)
{
<a class="btn btn-primary" href="/create-event">
<i class="fa fa-plus"></i> @L["CreateEvent"]
</a>
}
</Column>
</Row>
<Row>
@foreach (var upcomingEvent in UpcomingEvents)
{
<Column Class="col-12 col-lg-4 col-md-6">
<a class="mb-5 position-relative d-block event-link" href="/events/@upcomingEvent.Id">
<div class="position-absolute text-right w-100 px-3 py-2" style="left: 0; top: 2px;">
@if (upcomingEvent.IsFree)
{
<Badge Color="Color.Success" Class="mr-1">FREE</Badge>
}
<span class="badge badge-warning font-weight-normal">
<i class="fas fa-user-friends"></i>
<span class="font-weight-bold">@upcomingEvent.AttendeesCount</span>
</span>
</div>
<img src="https://picsum.photos/seed/@upcomingEvent.Id/400/300" class="event-pic"/>
<div class="px-3 py-1">
<small class="font-weight-bold text-warning my-2 d-block text-uppercase">@upcomingEvent.StartTime.ToLongDateString()</small>
<p class="h4 text-light d-block mb-2">@upcomingEvent.Title</p>
<p class="text-light" style="opacity: .65;">@upcomingEvent.Description.TruncateWithPostfix(150)</p>
</div>
</a>
</Column>
}
</Row>
````
The new home page is shown below:
![event-list-ui](images/event-list-ui.png)
### Event Detail Page
* Add `GetAsync`, `RegisterAsync`, `UnregisterAsync` and `DeleteAsync` methods to the `IEventAppService`:
````csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace EventOrganizer.Events
{
public interface IEventAppService : IApplicationService
{
Task<Guid> CreateAsync(EventCreationDto input);
Task<List<EventDto>> GetUpcomingAsync();
Task<EventDetailDto> GetAsync(Guid id);
Task RegisterAsync(Guid id);
Task UnregisterAsync(Guid id);
Task DeleteAsync(Guid id);
}
}
````
* Add `EventDetailDto` class:
````csharp
using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos;
namespace EventOrganizer.Events
{
public class EventDetailDto : CreationAuditedEntityDto<Guid>
{
public string Title { get; set; }
public string Description { get; set; }
public bool IsFree { get; set; }
public DateTime StartTime { get; set; }
public List<EventAttendeeDto> Attendees { get; set; }
}
}
````
* Add `EventAttendeeDto` class:
````csharp
using System;
namespace EventOrganizer.Events
{
public class EventAttendeeDto
{
public Guid UserId { get; set; }
public string UserName { get; set; }
public DateTime CreationTime { get; set; }
}
}
````
* Implement the new methods in the `EventAppService`:
````csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EventOrganizer.Users;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Users;
namespace EventOrganizer.Events
{
public class EventAppService : EventOrganizerAppService, IEventAppService
{
private readonly IRepository<Event, Guid> _eventRepository;
private readonly IRepository<AppUser, Guid> _userRepository;
public EventAppService(IRepository<Event, Guid> eventRepository, IRepository<AppUser, Guid> userRepository)
{
_eventRepository = eventRepository;
_userRepository = userRepository;
}
[Authorize]
public async Task<Guid> CreateAsync(EventCreationDto input)
{
var eventEntity = ObjectMapper.Map<EventCreationDto, Event>(input);
await _eventRepository.InsertAsync(eventEntity);
return eventEntity.Id;
}
public async Task<List<EventDto>> GetUpcomingAsync()
{
var events = await AsyncExecuter.ToListAsync(
_eventRepository
.Where(x => x.StartTime > Clock.Now)
.OrderBy(x => x.StartTime)
);
return ObjectMapper.Map<List<Event>, List<EventDto>>(events);
}
public async Task<EventDetailDto> GetAsync(Guid id)
{
var @event = await _eventRepository.GetAsync(id);
var attendeeIds = @event.Attendees.Select(a => a.UserId).ToList();
var attendees = (await AsyncExecuter.ToListAsync(_userRepository.Where(u => attendeeIds.Contains(u.Id))))
.ToDictionary(x => x.Id);
var result = ObjectMapper.Map<Event, EventDetailDto>(@event);
foreach (var attendeeDto in result.Attendees)
{
attendeeDto.UserName = attendees[attendeeDto.UserId].UserName;
}
return result;
}
[Authorize]
public async Task RegisterAsync(Guid id)
{
var @event = await _eventRepository.GetAsync(id);
if (@event.Attendees.Any(a => a.UserId == CurrentUser.Id))
{
return;
}
@event.Attendees.Add(new EventAttendee {UserId = CurrentUser.GetId(), CreationTime = Clock.Now});
await _eventRepository.UpdateAsync(@event);
}
[Authorize]
public async Task UnregisterAsync(Guid id)
{
var @event = await _eventRepository.GetAsync(id);
var removedItems = @event.Attendees.RemoveAll(x => x.UserId == CurrentUser.Id);
if (removedItems.Any())
{
await _eventRepository.UpdateAsync(@event);
}
}
[Authorize]
public async Task DeleteAsync(Guid id)
{
var @event = await _eventRepository.GetAsync(id);
if (CurrentUser.Id != @event.CreatorId)
{
throw new UserFriendlyException("You don't have the necessary permission to delete this event!");
}
await _eventRepository.DeleteAsync(id);
}
}
}
````
* Add the following mappings into the `EventOrganizerApplicationAutoMapperProfile`:
````csharp
CreateMap<Event, EventDetailDto>();
CreateMap<EventAttendee, EventAttendeeDto>();
````
Run the `EventOrganizer.HttpApi.Host` application to see the complete Event HTTP API in the Swagger UI:
![swagger-event-all](images/swagger-event-all.png)
* Create `EventDetail.razor` component with the following content:
````html
@page "/events/{id}"
@inherits EventOrganizerComponentBase
@if (Event != null)
{
<Row Class="mb-4">
<Column Class="text-left">
<h1>@Event.Title</h1>
</Column>
<Column Class="text-right pt-2">
<a href="/" Class="btn btn-dark"><i class="fa fa-arrow-left"></i> Back</a>
@if (CurrentUser.IsAuthenticated && CurrentUser.Id == Event.CreatorId)
{
<Button Color="Color.Danger" Clicked="Delete" Class="ml-1">Delete</Button>
}
</Column>
</Row>
<Row>
<Column Class="col-12 col-md-8">
<div class="position-relative">
<div class="position-absolute text-right w-100 px-3 py-2" style="left: 0; top: 2px;">
@if (Event.IsFree)
{
<Badge Color="Color.Success" Class="mr-1">FREE</Badge>
}
<span class="badge badge-warning font-weight-normal">
<i class="fas fa-user-friends"></i>
<span class="font-weight-bold">@Event.Attendees.Count</span>
</span>
</div>
<img src="https://picsum.photos/seed/@Event.Id/800/600" class="event-pic" />
<small class="font-weight-bold text-warning my-2 d-block text-uppercase">Start time: @Event.StartTime.ToLongDateString()</small>
<p style="opacity: .65;">@Event.Description</p>
</div>
</Column>
<Column Class="col-12 col-md-4">
<div class="p-4 event-form">
@if (CurrentUser.IsAuthenticated)
{
<div>
@if (!IsRegistered)
{
<Button Color="Color.Primary" Clicked="Register" Class="btn-block btn-lg">Register now!</Button>
}
else
{
<p>You are registered in this event</p>
<Button Color="Color.Secondary" Clicked="UnRegister" Class="btn-block">Cancel registration!</Button>
}
</div>
}
else
{
<a class="btn btn-primary" href="/authentication/login">
<i class="fa fa-sign-in-alt"></i> Login to attend!
</a>
}
</div>
<div class="mt-4 event-form p-4">
<span class="font-weight-bold"><i class="fas fa-user-friends"></i> Attendees <span class="float-right font-weight-normal" style="opacity:.65;">(@Event.Attendees.Count)</span></span>
<ul class="mt-1 mb-0 att-list">
@foreach (var attendee in Event.Attendees)
{
<li><i class="fa fa-check"></i> @attendee.UserName</li>
}
</ul>
</div>
</Column>
</Row>
}
````
* Create `EventDetail.razor.cs` file with the following content:
````csharp
using System;
using System.Linq;
using System.Threading.Tasks;
using EventOrganizer.Events;
using Microsoft.AspNetCore.Components;
namespace EventOrganizer.Blazor.Pages
{
public partial class EventDetail
{
[Parameter]
public string Id { get; set; }
private EventDetailDto Event { get; set; }
private bool IsRegistered { get; set; }
private readonly IEventAppService _eventAppService;
private readonly NavigationManager _navigationManager;
public EventDetail(
IEventAppService eventAppService,
NavigationManager navigationManager)
{
_eventAppService = eventAppService;
_navigationManager = navigationManager;
}
protected override async Task OnInitializedAsync()
{
await GetEventAsync();
}
private async Task GetEventAsync()
{
Event = await _eventAppService.GetAsync(Guid.Parse(Id));
if (CurrentUser.IsAuthenticated)
{
IsRegistered = Event.Attendees.Any(a => a.UserId == CurrentUser.Id);
}
}
private async Task Register()
{
await _eventAppService.RegisterAsync(Guid.Parse(Id));
await GetEventAsync();
}
private async Task UnRegister()
{
await _eventAppService.UnregisterAsync(Guid.Parse(Id));
await GetEventAsync();
}
private async Task Delete()
{
if (!await Message.Confirm("This event will be deleted: " + Event.Title))
{
return;
}
await _eventAppService.DeleteAsync(Guid.Parse(Id));
_navigationManager.NavigateTo("/");
}
}
}
````
The resulting page is shown below:
![event-detail-ui](images/event-detail-ui.png)
### Integration Tests
Create an `EventAppService_Tests` class in the `EventOrganizer.Application.Tests` project:
````csharp
using System;
using System.Threading.Tasks;
using Shouldly;
using Xunit;
namespace EventOrganizer.Events
{
[Collection(EventOrganizerTestConsts.CollectionDefinitionName)]
public class EventAppService_Tests : EventOrganizerApplicationTestBase
{
private readonly IEventAppService _eventAppService;
public EventAppService_Tests()
{
_eventAppService = GetRequiredService<IEventAppService>();
}
[Fact]
public async Task Should_Create_A_Valid_Event()
{
// Create an event
var eventId = await _eventAppService.CreateAsync(
new EventCreationDto
{
Title = "My test event 1",
Description = "My test event description 1",
IsFree = true,
StartTime = DateTime.Now.AddDays(2)
}
);
eventId.ShouldNotBe(Guid.Empty);
// Get the event
var @event = await _eventAppService.GetAsync(eventId);
@event.Title.ShouldBe("My test event 1");
// Get upcoming events
var events = await _eventAppService.GetUpcomingAsync();
events.ShouldContain(x => x.Title == "My test event 1");
}
}
}
````
## Source Code
Source code of the completed application is [available on GitHub](https://github.com/abpframework/abp-samples/tree/master/EventOrganizer).

BIN
docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-create-ui.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-detail-ui.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-list-ui.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 KiB

BIN
docs/en/Community-Articles/2020-12-04-Event-Organizer/images/index-title.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-all.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-create.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-upcoming.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

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

@ -0,0 +1,110 @@
## Using DevExpress Blazor UI Components With the ABP Framework
Hi, in this step by step article, I will show you how to integrate [DevExpress](https://demos.devexpress.com/blazor/) blazor UI components into ABP Framework-based applications.
![both-example-result](both-example-result.png)
*(A screenshot from the example application developed in this article)*
## Create the Project
> ABP Framework offers startup templates to get into business faster.
In this article, I will create a new startup template with EF Core as a database provider and Blazor for UI framework. But if you already have a project with Blazor UI, you don't need to create a new startup template, you can directly implement the following steps to your existing project.
> If you already have a project with the Blazor UI, you can skip this section.
* Before starting to development, we will create a solution named `DevExpressSample` (or whatever you want). We will create a new startup template with EF Core as a database provider and Blazor for UI framework by using [ABP CLI](https://docs.abp.io/en/abp/latest/CLI):
````bash
abp new DevExpressSample -u blazor
````
![initial-project](initial-project.png)
* Our project boilerplate will be ready after the download is finished. Then, we can open the solution in the Visual Studio (or any other IDE) and run the `DevExpressSample.DbMigrator` to create the database and seed initial data (which creates the admin user, admin role, permissions etc.)
* After database and initial data created,
* Run the `DevExpressSample.HttpApi.Host` to see our server side working and
* Run the `DevExpressSample.Blazor` to see our UI working properly.
> _Default login credentials for admin: username is **admin** and password is **1q2w3E\***_
## Install DevExpress
You can follow [this documentation](https://docs.devexpress.com/Blazor/401986/getting-started/install-components-and-create-an-application/without-devexpress-installer/microsoft-templates) to install DevExpress packages into your computer.
> Don't forget to add _"DevExpress NuGet Feed"_ to your **Nuget Package Sources**.
### Adding DevExpress NuGet Packages
Add the `DevExpress.Blazor` NuGet package to the `DevExpressSample.Blazor` project.
```
Install-Package DevExpress.Blazor
```
### Register DevExpress Resources
1. Add the following line to the HEAD section of the `wwwroot/index.html` file within the `DevExpressSample.Blazor` project:
```Razor
<head>
<!--...-->
<link href="_content/DevExpress.Blazor/dx-blazor.css" rel="stylesheet" />
</head>
```
2. In the `DevExpressSampleBlazorModule` class, call the `AddDevExpressBlazor()` method from your project's `ConfigureServices()` method:
```csharp
public override void ConfigureServices(ServiceConfigurationContext context)
{
var environment = context.Services.GetSingletonInstance<IWebAssemblyHostEnvironment>();
var builder = context.Services.GetSingletonInstance<WebAssemblyHostBuilder>();
// ...
builder.Services.AddDevExpressBlazor();
}
```
3. Register the **DevExpressSample.Blazor** namespace in the `_Imports.razor` file:
```Razor
@using DevExpress.Blazor
```
### Result
The installation step was done. You can use any DevExpress Blazor UI component in your application:
Example: A Scheduler:
![sample-appointment](sample-appointment.gif)
This example has been created by following [this documentation](https://demos.devexpress.com/blazor/SchedulerViewTypes).
## The Sample Application
We have created a sample application with [Data Grid](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxDataGrid-1) example.
### The Source Code
You can download the source code from [here](https://github.com/abpframework/abp-samples/tree/master/DevExpress-Blazor).
The related files for this example are marked in the following screenshots.
![data-grid-app-contract](data-grid-app-contract.png)
![data-grid-application](data-grid-application.png)
![data-grid-web](data-grid-blazor.png)
### Additional Notes
#### Data Storage
I've used an in-memory list to store data for this example, instead of a real database. Because it is not related to DevExpress usage. There is a `SampleDataService.cs` file in `Data` folder at `DevExpressSample.Application.Contracts` project. All the data is stored here.
## Conclusion
In this article, I've explained how to use [DevExpress](https://www.devexpress.com/blazor/) components in your application. ABP Framework is designed so that it can work with any UI library/framework.

BIN
docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/both-example-result.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/cover-image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 KiB

BIN
docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-app-contract.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

BIN
docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-application.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

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

Loading…
Cancel
Save