Browse Source

Merge branch 'dev' into BackgroundJob-ApplicationName

pull/22169/head
Halil İbrahim Kalkan 1 year ago
committed by GitHub
parent
commit
6c4ba82642
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 136
      Directory.Packages.props
  2. 7
      README.md
  3. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json
  4. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
  5. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
  6. BIN
      docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/1.png
  7. BIN
      docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/2.png
  8. BIN
      docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/3.png
  9. 183
      docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md
  10. BIN
      docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman1.png
  11. BIN
      docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman2.png
  12. 177
      docs/en/Community-Articles/2023-10-03-basta-mainz-2023-what-a-blast-in-germany/post.md
  13. 134
      docs/en/Community-Articles/2024-03-05-URL-Based-Localization/Post.md
  14. BIN
      docs/en/Community-Articles/2024-03-05-URL-Based-Localization/UrlLocalizationSampleProject.zip
  15. BIN
      docs/en/Community-Articles/2024-03-05-URL-Based-Localization/cover.png
  16. BIN
      docs/en/Community-Articles/2024-03-05-URL-Based-Localization/scrshot1.jpg
  17. BIN
      docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca3de1eb496455c4c3341721ab3.jpg
  18. BIN
      docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca5122043881595c75c6ea661de.jpg
  19. BIN
      docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca776481fe9cb89b439988e99e1.jpg
  20. 179
      docs/en/Community-Articles/2025-02-16-Using-Pushed-Authorization-Requests-In-ABP-Framework/POST.md
  21. BIN
      docs/en/Community-Articles/2025-02-16-Using-Pushed-Authorization-Requests-In-ABP-Framework/cover.png
  22. BIN
      docs/en/Community-Articles/2025-02-16-Using-Pushed-Authorization-Requests-In-ABP-Framework/par.png
  23. BIN
      docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183abfe065ba8bacdd56ef05d9a4cd.jpg
  24. BIN
      docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183ac7b768a9a7523278ab07847b3c.jpg
  25. BIN
      docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183ac7c4767cabf12d657ac90f4c17.jpg
  26. 28
      docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/post.md
  27. 16
      docs/en/framework/ui/blazor/toolbars.md
  28. 16
      docs/en/framework/ui/mvc-razor-pages/toolbars.md
  29. 18
      docs/en/guides/microservice-mongodb.md
  30. BIN
      docs/en/images/leptonx-toolbar-main-example.png
  31. BIN
      docs/en/images/leptonx-toolbar-mainmobile-example.png
  32. 39
      docs/en/kb/can-not-login-with-admin-user.md
  33. 2
      docs/en/release-info/migration-guides/abp-9-0.md
  34. 2
      docs/en/tutorials/modular-crm/part-08.md
  35. 30
      docs/en/ui-themes/lepton-x/blazor.md
  36. 26
      docs/en/ui-themes/lepton-x/mvc.md
  37. 17
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/ComponentsComponentsBundleContributor.cs
  38. 5
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs
  39. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs
  40. 7
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs
  41. 18
      latest-versions.json
  42. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json
  43. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/cs.json
  44. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/da.json
  45. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de.json
  46. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/el.json
  47. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en-GB.json
  48. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json
  49. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es-mx.json
  50. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json
  51. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fa.json
  52. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json
  53. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json
  54. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json
  55. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hr.json
  56. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hu.json
  57. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/is.json
  58. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json
  59. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/nl.json
  60. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pl-PL.json
  61. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pt-BR.json
  62. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json
  63. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ru.json
  64. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sk.json
  65. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sl.json
  66. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sv.json
  67. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json
  68. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/vi.json
  69. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json
  70. 4
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hant.json
  71. 6
      modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLoginModel.cs
  72. 6
      modules/account/src/Volo.Abp.Account.Web.OpenIddict/Pages/Account/OpenIddictSupportedLoginModel.cs
  73. 8
      modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml
  74. 19
      modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs
  75. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ar.json
  76. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/cs.json
  77. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json
  78. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json
  79. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/en.json
  80. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/es.json
  81. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fi.json
  82. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fr.json
  83. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hi.json
  84. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hr.json
  85. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hu.json
  86. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/is.json
  87. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/it.json
  88. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/nl.json
  89. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pl-PL.json
  90. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pt-BR.json
  91. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ro-RO.json
  92. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ru.json
  93. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sk.json
  94. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sl.json
  95. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json
  96. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/tr.json
  97. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/vi.json
  98. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json
  99. 3
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hant.json
  100. 6
      modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json

136
Directory.Packages.props

@ -56,86 +56,86 @@
<PackageVersion Include="Magick.NET-Q16-AnyCPU" Version="13.4.0" />
<PackageVersion Include="MailKit" Version="4.8.0" />
<PackageVersion Include="Markdig.Signed" Version="0.37.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.Authorization" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.33" />
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.WebUtilities" Version="9.0.0" />
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Components" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Components.Authorization" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.36" />
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="9.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.WebUtilities" Version="9.0.2" />
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.2" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.5.0" />
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="9.0.0" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="9.0.2" />
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.0.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="9.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Caching.Hybrid" Version="9.0.0-preview.7.24406.2" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.CommandLine" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Composite" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Physical" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.FileSystemGlobbing" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Identity.Core" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Localization" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Configuration.CommandLine" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Composite" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Physical" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.FileSystemGlobbing" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Identity.Core" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Localization" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
<PackageVersion Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="9.0.0" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.5.0" />
<PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.5.0" />
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.5.0" />
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.5.0" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.6.0" />
<PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.6.0" />
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.6.0" />
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.6.0" />
<PackageVersion Include="Minio" Version="6.0.3" />
<PackageVersion Include="MongoDB.Driver" Version="3.1.0" />
<PackageVersion Include="NEST" Version="7.17.5" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="Nito.AsyncEx.Context" Version="5.1.2" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.3" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
<PackageVersion Include="NSubstitute" Version="5.1.0" />
<PackageVersion Include="NuGet.Versioning" Version="6.11.1" />
<PackageVersion Include="NUglify" Version="1.21.9" />
<PackageVersion Include="Nullable" Version="1.3.1" />
<PackageVersion Include="Octokit" Version="13.0.1" />
<PackageVersion Include="OpenIddict.Abstractions" Version="6.1.0" />
<PackageVersion Include="OpenIddict.Core" Version="6.1.0" />
<PackageVersion Include="OpenIddict.Server.AspNetCore" Version="6.1.0" />
<PackageVersion Include="OpenIddict.Validation.AspNetCore" Version="6.1.0" />
<PackageVersion Include="OpenIddict.Validation.ServerIntegration" Version="6.1.0" />
<PackageVersion Include="OpenIddict.Abstractions" Version="6.1.1" />
<PackageVersion Include="OpenIddict.Core" Version="6.1.1" />
<PackageVersion Include="OpenIddict.Server.AspNetCore" Version="6.1.1" />
<PackageVersion Include="OpenIddict.Validation.AspNetCore" Version="6.1.1" />
<PackageVersion Include="OpenIddict.Validation.ServerIntegration" Version="6.1.1" />
<PackageVersion Include="Oracle.EntityFrameworkCore" Version="9.23.60" />
<PackageVersion Include="Polly" Version="8.4.2" />
<PackageVersion Include="Polly.Extensions.Http" Version="3.0.0" />
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0-preview.2.efcore.9.0.0" />
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0-preview.3.efcore.9.0.0" />
<PackageVersion Include="Quartz" Version="3.13.0" />
<PackageVersion Include="Quartz.Extensions.DependencyInjection" Version="3.13.0" />
<PackageVersion Include="Quartz.Plugins.TimeZoneConverter" Version="3.13.0" />
@ -162,18 +162,18 @@
<PackageVersion Include="Spectre.Console" Version="0.49.1" />
<PackageVersion Include="StackExchange.Redis" Version="2.8.16" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.8.1" />
<PackageVersion Include="System.Collections.Immutable" Version="9.0.0" />
<PackageVersion Include="System.Collections.Immutable" Version="9.0.2" />
<PackageVersion Include="System.ComponentModel.Annotations" Version="5.0.0" />
<PackageVersion Include="System.Linq.Async" Version="6.0.1" />
<PackageVersion Include="System.Linq.Dynamic.Core" Version="1.6.0.1" />
<PackageVersion Include="System.Linq.Dynamic.Core" Version="1.6.1" />
<PackageVersion Include="System.Linq.Queryable" Version="4.3.0" />
<PackageVersion Include="System.Runtime.Loader" Version="4.3.0" />
<PackageVersion Include="System.Security.Permissions" Version="9.0.0" />
<PackageVersion Include="System.Security.Permissions" Version="9.0.2" />
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
<PackageVersion Include="System.Text.Encoding.CodePages" Version="9.0.0" />
<PackageVersion Include="System.Text.Encodings.Web" Version="9.0.0" />
<PackageVersion Include="System.Text.Json" Version="9.0.0" />
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
<PackageVersion Include="System.Text.Encoding.CodePages" Version="9.0.2" />
<PackageVersion Include="System.Text.Encodings.Web" Version="9.0.2" />
<PackageVersion Include="System.Text.Json" Version="9.0.2" />
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.6.0" />
<PackageVersion Include="TencentCloudSDK.Sms" Version="3.0.1142" />
<PackageVersion Include="TimeZoneConverter" Version="6.1.0" />
<PackageVersion Include="Unidecode.NET" Version="2.1.0" />

7
README.md

@ -1,11 +1,12 @@
# ABP Framework
![build and test](https://img.shields.io/github/actions/workflow/status/abpframework/abp/build-and-test.yml?branch=dev&style=flat-square) 🔹 [![codecov](https://codecov.io/gh/abpframework/abp/branch/dev/graph/badge.svg?token=jUKLCxa6HF)](https://codecov.io/gh/abpframework/abp) 🔹 [![NuGet](https://img.shields.io/nuget/v/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core) 🔹 [![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://abp.io/docs/latest/release-info/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) 🔹 [![Code of Conduct](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg)](https://github.com/abpframework/abp/blob/dev/CODE_OF_CONDUCT.md) 🔹 [![CLA Signed](https://cla-assistant.io/readme/badge/abpframework/abp)](https://cla-assistant.io/abpframework/abp) 🔹 [![Discord Shield](https://discord.com/api/guilds/951497912645476422/widget.png?style=shield)](https://abp.io/join-discord)
[ABP](https://abp.io/) offers an **opinionated architecture** to build enterprise software solutions with **best practices** on top of the **.NET** and the **ASP.NET Core** platforms. It provides the fundamental infrastructure, production-ready startup templates, pre-built application modules, UI themes, tooling, guides and documentation to implement that architecture properly and **automate the details** and repetitive works as much as possible.
[![ABP Platform](https://github.com/user-attachments/assets/200653c0-0e69-4b47-b76a-3a83460aaab6)](https://abp.io)
[![ABP Platform](https://github.com/user-attachments/assets/c4356ec7-4d0f-4e00-a1d2-fc74ad985fb8)](https://abp.io)
## Getting Started

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

@ -17,6 +17,6 @@
"SelectYourOrganization": "Select your organization",
"PleaseSelectOrganization": "Please select an organization to continue",
"Continue": "Continue",
"CaptchaExplanation": "Calculate the given mathematical expression and enter the correct answer."
"CaptchaExplanation": "Calculate the below mathematical expression and enter the answer."
}
}

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

@ -689,7 +689,7 @@
"AllowPrivateQuestion": "Allow Private Question",
"Permission:Campaigns": "Campaigns",
"Permission:Licenses": "License Settings",
"BlockUserPolicy": "Block User Policy",
"Permission:BlockUserPolicy": "Block User Policy"
"BlockUserPolicy": "User Block Policies",
"Permission:BlockUserPolicy": "User Block Policy"
}
}

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

@ -1874,7 +1874,9 @@
"RcStableDifferenceExplanation2": "The Stable version is tested and officially supported for production use. It ensures reliability and compatibility.",
"RcStableDifferenceExplanation3": "Use the RC version for testing and early adoption but use the Stable version for production deployment.",
"AddToCalendar": "Add To Calendar",
"AddToGoogleCalendar": "Add To Google Calender",
"DownloadICSFile": "Download ICS File"
"AddToGoogleCalendar": "Add To Google Calendar",
"DownloadICSFile": "Download ICS File",
"AddToAppleCalendar": "Add To Apple Calendar",
"AddToOutlookCalendar": "Add To Outlook Calendar"
}
}

BIN
docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

BIN
docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 KiB

BIN
docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 KiB

183
docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md

@ -2,17 +2,72 @@
## ITokenExtensionGrant
Create a class that inherits `ITokenExtensionGrant`, and then register it with the framework.
Create a `MyTokenExtensionGrant` class that inherits `ITokenExtensionGrant`, and then register it with the framework.
In the `MyTokenExtensionGrant` class below we try to get the token details, The `ForbidResult` handles the failure case and `SignInResult` returns a new token response, You can pass more parameters to implement business checks.
```cs
public override void PreConfigureServices(ServiceConfigurationContext context)
{
//...
PreConfigure<OpenIddictServerBuilder>(builder =>
{
builder.Configure(openIddictServerOptions =>
{
openIddictServerOptions.GrantTypes.Add(MyTokenExtensionGrant.ExtensionGrantName);
});
});
//...
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
//...
Configure<AbpOpenIddictExtensionGrantsOptions>(options =>
{
options.Grants.Add(MyTokenExtensionGrant.ExtensionGrantName, new MyTokenExtensionGrant());
});
//...
}
```
## Generate a new token response
In the `MyTokenExtensionGrant` class below we have two methods to get a new token using a user token or user API key. You can choose one of them based on your business.
These methods are just examples. Please add more logic to validate input data.
```cs
using System.Collections.Immutable;
using System.Security.Principal;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using OpenIddict.Abstractions;
using OpenIddict.Server;
using OpenIddict.Server.AspNetCore;
using Volo.Abp.Identity;
using Volo.Abp.OpenIddict;
using Volo.Abp.OpenIddict.ExtensionGrantTypes;
using IdentityUser = Volo.Abp.Identity.IdentityUser;
using SignInResult = Microsoft.AspNetCore.Mvc.SignInResult;
namespace OpenIddict.Demo.Server.ExtensionGrants;
public class MyTokenExtensionGrant : ITokenExtensionGrant
{
public const string ExtensionGrantName = "MyTokenExtensionGrant";
public string Name => ExtensionGrantName;
public async Task<IActionResult> HandleAsync(ExtensionGrantContext context)
{
// You can get a new token using any of the following methods based on your business.
// They are just examples. You can implement your own logic here.
return await HandleUserAccessTokenAsync(context);
return await HandleUserApiKeyAsync(context);
}
public async Task<IActionResult> HandleUserAccessTokenAsync(ExtensionGrantContext context)
{
var userToken = context.Request.GetParameter("token").ToString();
@ -26,6 +81,9 @@ public class MyTokenExtensionGrant : ITokenExtensionGrant
}!));
}
// We will validate the user token
// The Token is issued by the OpenIddict server, So we can validate it using the introspection endpoint
var transaction = await context.HttpContext.RequestServices.GetRequiredService<IOpenIddictServerFactory>().CreateTransactionAsync();
transaction.EndpointType = OpenIddictServerEndpointType.Introspection;
transaction.Request = new OpenIddictRequest
@ -64,23 +122,92 @@ public class MyTokenExtensionGrant : ITokenExtensionGrant
}));
}
// We have validated the user token and got the user id
var userId = principal.FindUserId();
var userManager = context.HttpContext.RequestServices.GetRequiredService<IdentityUserManager>();
var user = await userManager.GetByIdAsync(userId.Value);
var userClaimsPrincipalFactory = context.HttpContext.RequestServices.GetRequiredService<IUserClaimsPrincipalFactory<IdentityUser>>();
var claimsPrincipal = await userClaimsPrincipalFactory.CreateAsync(user);
claimsPrincipal.SetScopes(principal.GetScopes());
claimsPrincipal.SetResources(await GetResourcesAsync(context, principal.GetScopes()));
//abp version < 7.3
await context.HttpContext.RequestServices.GetRequiredService<AbpOpenIddictClaimDestinationsManager>().SetAsync(claimsPrincipal);
// Prepare the scopes
var scopes = GetScopes(context);
claimsPrincipal.SetScopes(scopes);
claimsPrincipal.SetResources(await GetResourcesAsync(context, scopes));
await context.HttpContext.RequestServices.GetRequiredService<AbpOpenIddictClaimsPrincipalManager>().HandleAsync(context.Request, principal);
return new SignInResult(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, claimsPrincipal);
}
//For abp version >= 7.3
await context.HttpContext.RequestServices.GetRequiredService<AbpOpenIddictClaimsPrincipalManager>().HandleAsync(context.Request, claimsPrincipal);
protected async Task<IActionResult> HandleUserApiKeyAsync(ExtensionGrantContext context)
{
var userApiKey = context.Request.GetParameter("user_api_key").ToString();
if (string.IsNullOrEmpty(userApiKey))
{
return new ForbidResult(
new[] {OpenIddictServerAspNetCoreDefaults.AuthenticationScheme},
properties: new AuthenticationProperties(new Dictionary<string, string>
{
[OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidRequest
}!));
}
// Here we can validate the user API key and get the user id
if (false) // Add your own logic here
{
// If the user API key is invalid
return new ForbidResult(
new[] {OpenIddictServerAspNetCoreDefaults.AuthenticationScheme},
properties: new AuthenticationProperties(new Dictionary<string, string>
{
[OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidRequest
}!));
}
// Add your own logic to get the user by API key
var userManager = context.HttpContext.RequestServices.GetRequiredService<IdentityUserManager>();
var user = await userManager.FindByNameAsync("admin");
if (user == null)
{
return new ForbidResult(
new[] {OpenIddictServerAspNetCoreDefaults.AuthenticationScheme},
properties: new AuthenticationProperties(new Dictionary<string, string>
{
[OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidRequest
}!));
}
// Create a principal for the user
var userClaimsPrincipalFactory = context.HttpContext.RequestServices.GetRequiredService<IUserClaimsPrincipalFactory<IdentityUser>>();
var claimsPrincipal = await userClaimsPrincipalFactory.CreateAsync(user);
// Prepare the scopes
var scopes = GetScopes(context);
claimsPrincipal.SetScopes(scopes);
claimsPrincipal.SetResources(await GetResourcesAsync(context, scopes));
await context.HttpContext.RequestServices.GetRequiredService<AbpOpenIddictClaimsPrincipalManager>().HandleAsync(context.Request, claimsPrincipal);
return new SignInResult(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, claimsPrincipal);
}
private ImmutableArray<string> GetScopes(ExtensionGrantContext context)
{
// Prepare the scopes
// The scopes must be defined in the OpenIddict server
// If you want to get the scopes from the request, you have to add `scope` parameter in the request
// scope: AbpAPI profile roles email phone offline_access
//var scopes = context.Request.GetScopes();
// If you want to set the scopes here, you can use the following code
var scopes = new[] { "AbpAPI", "profile", "roles", "email", "phone", "offline_access" }.ToImmutableArray();
return scopes;
}
private async Task<IEnumerable<string>> GetResourcesAsync(ExtensionGrantContext context, ImmutableArray<string> scopes)
{
var resources = new List<string>();
@ -98,38 +225,24 @@ public class MyTokenExtensionGrant : ITokenExtensionGrant
}
```
```cs
public override void PreConfigureServices(ServiceConfigurationContext context)
{
//...
PreConfigure<OpenIddictServerBuilder>(builder =>
{
builder.Configure(openIddictServerOptions =>
{
openIddictServerOptions.GrantTypes.Add(MyTokenExtensionGrant.ExtensionGrantName);
});
});
//...
}
### Get a new token using user access token
public override void ConfigureServices(ServiceConfigurationContext context)
{
//...
Configure<AbpOpenIddictExtensionGrantsOptions>(options =>
{
options.Grants.Add(MyTokenExtensionGrant.ExtensionGrantName, new MyTokenExtensionGrant());
});
//...
}
```
* Get a user token using the `password` grant type.
![Http request 1](1.png)
![Http request 1](postman1.png)
* Use the user token to get a new token using the `HandleUserAccessTokenAsync` method.
![Http request 2](postman2.png)
![Http request 2](2.png)
## Source code
### Get a new token using user API key
* Directly get a new token using the `HandleUserApiKeyAsync` method.
https://github.com/abpframework/abp/commit/3210f138454697647689b4868c8d4b7b3da02d44
![Http request 3](3.png)
## Source code
https://github.com/abpframework/abp/blob/dev/modules/openiddict/app/OpenIddict.Demo.Server/ExtensionGrants/MyTokenExtensionGrant.cs

BIN
docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 297 KiB

BIN
docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

177
docs/en/Community-Articles/2023-10-03-basta-mainz-2023-what-a-blast-in-germany/post.md

@ -1,59 +1,118 @@
BASTA! Mainz 2023 has wrapped up, and what an extraordinary journey it has been! We can’t wait to share our impressions, highlights, and the incredible impact it had on the tech community in Germany and beyond.
### A Glance Back at BASTA! Mainz 2023
We just came back from the[ BASTA! Conference 2023](https://basta.net/), which is an incredible .NET event with over 600 in-person attendees and an additional 200+ tuning in virtually from across the globe. The buzz of excitement and anticipation in the air was undeniable, setting the stage for an unforgettable event for [ABP.IO](https://abp.io/).
![53227564247\_b7acafea68\_c.jpg](3a0e074506bcc60cad473655b6fd5da6.jpg)
![53227631612\_eb38958391\_c.jpg](3a0e074555e8d6f62bc3d47c00f86762.jpg)
![53227631792\_a6d87b4abf\_k.jpg](3a0e0745b6418472a66d905053d492e6.jpg)
As one of the proud sponsors, we set up our booth, engaged with attendees, and delved into a wide range of sessions, workshops, and keynotes to absorb the latest software development trends.
### Engaging with Enthusiastic Minds
As the lead developers of ABP Core Team, *[Alper](https://twitter.com/alperebicoglu)* and *[Ismail](https://twitter.com/ismcagdas)* presented the ABP.IO platform modules and features were quite busy enjoying their presenting work with latest version of demos. Alper also gave a great speech on “Building Multi-tenant ASP.NET Core Application & the ABP Framework” at the BASTA! Mainz conference.
![53229004005\_3312b6bfa2\_k.jpg](3a0e074625fddc3097efdc1bef3058d8.jpg)
![20230926\_170335.jpg](3a0e074675731c4a59167a878d4cd04e.jpg)
We introduced **[ABP Framework](https://abp.io/)**, community-driven open-source web application framework, and **[ABP Commercial](https://commercial.abp.io/)**, our enterprise-ready web development platform that is built on top of the open-source ABP Framework to the crowds.
![53227632222\_0a5af1fcc1\_k.jpg](3a0e074703a63129e5713ff51653aaac.jpg)
![53228506206\_24e22498fa\_o.jpg](3a0e07477e980a4c2104300557e8f7fb.jpg)
![53228505931\_b2aea761f9\_k.jpg](3a0e0747c283919bbc5edfdc289db1d8.jpg)
Apart from that, we were thrilled to give away the **[ABP Commercial Licenses](https://commercial.abp.io/pricing)** to the eager attendees on the venue, including the Raffle prize, **Meta Quest 2**, on our last day in BASTA! Conference.
![截屏2023-10-03 11.06.01.png](3a0e0748c8752dfdc2bcb5b9b2ce5908.png)
We are profoundly satisfied with the huge interest and engagement shown by the attendees. The sense of community, collaboration, and shared passion for .NET solutions was palpable throughout the event.
![20230927\_171046.jpg](3a0e07495efa58bb9f1e523d982dbc65.jpg)
![20230928\_150135.jpg](3a0e0749c23a9e3b06d66ed54bed0c7a.jpg)
![20230928\_150533 20.57.50.jpg](3a0e074a268272e630d8422ace32b4c8.jpg)
### A Great Partnership with LIS GmbH
![20230928\_161843.jpg](3a0e074aa3857a696cb941edc46dcb52.jpg)
At BASTA! Mainz 2023, we were particularly thrilled to celebrate our collaboration with ***LIS GmbH***, a leading software solutions provider. This partnership added a unique dimension to the conference, brought us a fresh perspective to the conference, fostering innovation and opening up new avenues for attendees.
### A Big Thank-You from ABP Team
![53228503821\_27860119d9\_k.jpg](3a0e074b0a46662cf39a6796d0f23086.jpg)
Now, a shout-out to BASTA! Mainz 2023. We want to thank to everyone who contributed to the success of this event – attendees, speakers, sponsors, and partners.The conference may have ended, but the knowledge gained, connections formed, and inspiration ignited will continue to shape the tech landscape for years to come.
Until next time!
BASTA! Mainz 2023 has wrapped up, and what an extraordinary journey it has been! We can’t wait to share our impressions, highlights, and the incredible impact it had on the tech community in Germany and beyond.
### A Glance Back at BASTA! Mainz 2023
We just came back from the[ BASTA! Conference 2023](https://basta.net/), which is an incredible .NET event with over 600 in-person attendees and an additional 200+ tuning in virtually from across the globe. The buzz of excitement and anticipation in the air was undeniable, setting the stage for an unforgettable event for [ABP.IO](https://abp.io/).
![53227564247\_b7acafea68\_c.jpg](3a0e074506bcc60cad473655b6fd5da6.jpg)
![53227631612\_eb38958391\_c.jpg](3a0e074555e8d6f62bc3d47c00f86762.jpg)
![53227631792\_a6d87b4abf\_k.jpg](3a0e0745b6418472a66d905053d492e6.jpg)
As one of the proud sponsors, we set up our booth, engaged with attendees, and delved into a wide range of sessions, workshops, and keynotes to absorb the latest software development trends.
### Engaging with Enthusiastic Minds
As the lead developers of ABP Core Team, *[Alper](https://twitter.com/alperebicoglu)* and *[Ismail](https://twitter.com/ismcagdas)* presented the ABP.IO platform modules and features were quite busy enjoying their presenting work with latest version of demos. Alper also gave a great speech on “Building Multi-tenant ASP.NET Core Application & the ABP Framework” at the BASTA! Mainz conference.
![53229004005\_3312b6bfa2\_k.jpg](3a0e074625fddc3097efdc1bef3058d8.jpg)
![20230926\_170335.jpg](3a0e074675731c4a59167a878d4cd04e.jpg)
We introduced **[ABP Framework](https://abp.io/)**, community-driven open-source web application framework, and **[ABP Commercial](https://commercial.abp.io/)**, our enterprise-ready web development platform that is built on top of the open-source ABP Framework to the crowds.
![53227632222\_0a5af1fcc1\_k.jpg](3a0e074703a63129e5713ff51653aaac.jpg)
![53228506206\_24e22498fa\_o.jpg](3a0e07477e980a4c2104300557e8f7fb.jpg)
![53228505931\_b2aea761f9\_k.jpg](3a0e0747c283919bbc5edfdc289db1d8.jpg)
Apart from that, we were thrilled to give away the **[ABP Commercial Licenses](https://commercial.abp.io/pricing)** to the eager attendees on the venue, including the Raffle prize, **Meta Quest 2**, on our last day in BASTA! Conference.
![截屏2023-10-03 11.06.01.png](3a0e0748c8752dfdc2bcb5b9b2ce5908.png)
We are profoundly satisfied with the huge interest and engagement shown by the attendees. The sense of community, collaboration, and shared passion for .NET solutions was palpable throughout the event.
![20230927\_171046.jpg](3a0e07495efa58bb9f1e523d982dbc65.jpg)
![20230928\_150135.jpg](3a0e0749c23a9e3b06d66ed54bed0c7a.jpg)
![20230928\_150533 20.57.50.jpg](3a0e074a268272e630d8422ace32b4c8.jpg)
### A Great Partnership with LIS GmbH
![3a0e074aa3857a696cb941edc46dcb52](https://github.com/user-attachments/assets/ea0f6d32-e49b-4573-997f-9751ef16b303)
At BASTA! Mainz 2023, we were particularly thrilled to celebrate our collaboration with ***LIS GmbH***, a leading software solutions provider. This partnership added a unique dimension to the conference, brought us a fresh perspective to the conference, fostering innovation and opening up new avenues for attendees.
### A Big Thank-You from ABP Team
![53228503821\_27860119d9\_k.jpg](3a0e074b0a46662cf39a6796d0f23086.jpg)
Now, a shout-out to BASTA! Mainz 2023. We want to thank to everyone who contributed to the success of this event – attendees, speakers, sponsors, and partners.The conference may have ended, but the knowledge gained, connections formed, and inspiration ignited will continue to shape the tech landscape for years to come.
Until next time!

134
docs/en/Community-Articles/2024-03-05-URL-Based-Localization/Post.md

@ -0,0 +1,134 @@
# URL-Based Localization
In this article I'll show you how to optimize your ABP website localization with a URL parameter. URL Paths are commonly being used to change the current UI culture. This method makes our website SEO-Friendly as you structuring the URLs for multiple languages. And you can also share the link of your website with a specific language. Let's see implementing multi-language support with URL parameters in an ABP project.
![Turkish and English Localization within URL](scrshot1.jpg)
## Mastering Website Localization: Language Codes in URLs Explained
Enhancing UX with URL-Based website localization is mainly done with ASP.NET Core's routing system. Also we need to automatically redirect the links without language code parameter. Our URL structures for the localization will be as following:
- https://mywebsite.com/en/dashboard (English)
- https://mywebsite.com/tr/dashboard (Turkish)
## Routing
Before starting to explain how to do this, you can see [this commit](https://github.com/salihozkara/MultiLangRoute/commit/09e40cfd751562dec0dab890e54e0c5ca9ee256c) which implements this functionality. The routing module consists of these fundamental classes:
### 1. **MultiLanguageSupportMetaData.cs**
This class is used to add a language parameter to route templates. For example, it changes the `/about` route to `/language/about`.
### 2. **MultiLanguageRedirectRequiredMetaData.cs**
This class is used to redirect users to the correct language version. If a user visits the `/about` page and the current culture is `"tr-TR"`, this class will redirect them to `/tr-TR/about`.
### 3. **UrlNormalizer.cs**
This static class is used to normalize URLs by adding language information and improving performance using caching.
```csharp
public static string NormalizeUrl(EndpointDataSource endpointDataSource, HttpContext httpContext, string url)
{
// Normalize the URL and cache it
return Cache.GetOrAdd(url, (key) =>
{
var absoluteUrl = GetAbsoluteUrl(key);
var multiLanguageRedirectRequiredMetaData =
GetMultiLanguageRedirectRequiredMetaData(endpointDataSource, absoluteUrl);
return multiLanguageRedirectRequiredMetaData?.ReBuildUrl(httpContext, key) ?? key;
});
}
```
### 4. **MyLinkGenerator.cs**
This class extends ASP.NET Core’s `LinkGenerator` class to automatically add language information to all generated links.
### 5. **MyRouteDataRequestCultureProvider.cs**
This class determines the current culture using the language parameter in the URL. For example, it extracts the `"tr-TR"` culture from the `/tr-TR/about` URL.
### 6. **RoutingMiddleware.cs**
This middleware processes HTTP requests and redirects users to the correct language version when necessary.
```csharp
public override Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var endpoint = context.GetEndpoint();
if(endpoint is not RouteEndpoint)
{
return next(context);
}
// Redirect if necessary
var redirectMetaData = endpoint.Metadata.GetMetadata<IRedirectMetaData>();
if (redirectMetaData is not null)
{
redirectMetaData.Redirect(context);
return Task.CompletedTask;
}
// ...
}
```
## CultureAnchorTagHelper.cs
This **Tag Helper** processes `<a>` tags in a Razor page and automatically adds language information to URLs if it's missing.
```csharp
[HtmlTargetElement("a", Attributes = "href", TagStructure = TagStructure.NormalOrSelfClosing)]
public class CultureAnchorTagHelper(EndpointDataSource endpointDataSource, IHttpContextAccessor contextAccessor)
: TagHelper, ITransientDependency
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var href = output.Attributes["href"].Value.ToString();
if (href != null)
{
output.Attributes.SetAttribute("href",
UrlNormalizer.NormalizeUrl(endpointDataSource, contextAccessor.HttpContext!, href));
}
}
}
```
**How This Tag Helper Works:**
- Finds all `<a href="...">` tags within your Razor pages.
- Retrieves the `href` attribute of each link.
- Uses the `UrlNormalizer.NormalizeUrl()` method to normalize the URL with the current culture information.
- Replaces the original URL with the normalized one.
For example, if the current culture is `"tr"` and a page contains `<a href="/about">`, this Tag Helper will transform it into `<a href="/tr-TR/about">`.
## Sample Project
Salih Özkara from ABP team created a sample working project which implements URL localization. He used ABP free tier MVC template and MongoDB. You can check out the related commit which implements URL localization:
https://github.com/salihozkara/MultiLangRoute/commit/09e40cfd751562dec0dab890e54e0c5ca9ee256c
And full working demo is available at:
https://github.com/salihozkara/MultiLangRoute
You can download the demo project at:
[UrlLocalizationSampleProject.zip](https://github.com/abpframework/abp/blob/634ff52fb07d0b1281640695dbeffccdc943ca53/docs/en/Community-Articles/2024-03-05-URL-Based-Localization/UrlLocalizationSampleProject.zip)
## Summary
This implementation extends ASP.NET Core’s routing mechanism and utilizes caching for improved performance. It ensures multilingual support by normalizing URLs, redirecting users to the appropriate language version, and automatically handling language-specific links.

BIN
docs/en/Community-Articles/2024-03-05-URL-Based-Localization/UrlLocalizationSampleProject.zip

Binary file not shown.

BIN
docs/en/Community-Articles/2024-03-05-URL-Based-Localization/cover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 KiB

BIN
docs/en/Community-Articles/2024-03-05-URL-Based-Localization/scrshot1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca3de1eb496455c4c3341721ab3.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca5122043881595c75c6ea661de.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

BIN
docs/en/Community-Articles/2025-02-07-event-recap-ndc-london-2025/3a180ca776481fe9cb89b439988e99e1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

179
docs/en/Community-Articles/2025-02-16-Using-Pushed-Authorization-Requests-In-ABP-Framework/POST.md

@ -0,0 +1,179 @@
![par](cover.png)
# Using Pushed Authorization Requests In ABP Framework
`Pushed Authorization Requests (PAR)` is a new `OAuth 2.0` feature that allows clients to push the payload of an `OAuth 2.0` authorization request to the authorization server via a direct request and provides them with a request URI that is used as reference to the data in a subsequent call to the authorization endpoint. This feature is defined in [RFC 9156](https://tools.ietf.org/html/rfc9156).
## Authorization Code Flow
Let's examine the current `Code Flow` in the ABP Framework project.
A typical ABP layered architecture usually includes the following projects:
- `Acme.AuthServer`: OAuth 2.0 authorization server integrated with `OpenIddict`.
- `Acme.HttpApi.Host`: API project that uses the `JWT Bearer` authentication scheme and authenticates through the `Acme.AuthServer` project.
- `Acme.Web`: An UI project configured with an `OpenID Connect` authentication scheme to authenticate through the `Acme.AuthServer` project.
When we attempt to use `OpenID Connect` authentication in the `Acme.Web` project, it constructs an authorization request and redirects the browser to the `Acme.AuthServer` project.
```csharp
GET https//auth-server.acme.com/connect/authorize
Query String Parameters:
client_id: AbpApp
redirect_uri: https://web.acme.com/signin-oidc
response_type: code
scope: openid profile email roles phone AbpAPI
response_mode: form_post
nonce: YzVkMj...
state: CfDJ8N...
```
> If you have enabled `Pkce`, the `code_challenge` and `code_challenge_method` parameters will also appear in the request.
```csharp
code_challenge: mJxMdU...
code_challenge_method: S256
```
After the user successfully authenticates on the `Acme.AuthServer` project (via username/password or social login providers) and approves the requested permissions on the consent screen/page, it returns a `code` to the `Acme.Web` project.
The `Acme.AuthServer` project will construct either a `POST` or `GET` request to the `Acme.Web` project.
```csharp
POST https://web.acme.com/signin-oidc
Form Data Parameters(application/x-www-form-urlencoded):
code: LPjZ6C...
state: state: CfDJ8N...
iss: https://auth-server.acme.com/
```
When the `Acme.Web` project receives the `code`, it sends an HTTP request from the application (**not the browser**) to `Acme.AuthServer` to request an `access token` using the received `code`.
```csharp
POST https://auth-server.acme.com/connect/token
Form Data Parameters(application/x-www-form-urlencoded):
client_id: AbpApp
client_secret: secret
code: LPjZ6C...
grant_type: authorization_code
```
At this point, the `Code Flow` authentication process is complete, and we can use the `access token` to access APIs on the `Acme.HttpApi.Host` project.
> The `Hybrid Flow` and `Implicit Flow` are similar to `Code Flow`. We'll focus on `Code Flow` in this discussion.
However, `Code Flow` may have the following issues:
* The authorization request can be altered. Usually, the client application redirects the user's browser to the authorization server with the authorization URL. Nothing prevents a malicious actor from changing one or more parameters of this request before sending it to the authorization server.
* No guarantee of the request's provenance. The authorization request is normally built by the client application, and the user's browser is in charge of sending it to the authorization server. However, there is no guarantee that the request has been built by the client application. Anyone can build an authorization request once they know a few data, such as the client ID and the redirect URI.
* No guarantee of confidentiality. Although the browser sends the authorization request via HTTPS, the request parameters can be intercepted by third-party applications, such as a proxy, a load balancer, or even a browser plugin. A malicious network component of this type can inject or change the request parameters, not to mention that the request itself can be logged.
* Browser limitations. Finally, a very complex query string in the authorization request may incur possible browser limitations on URL length.
OAuth 2.0 defined `Pushed Authorization Requests (PAR)` to address these issues.
## Pushed Authorization Requests (PAR)
[OpenIdDict 6.1.0](https://documentation.openiddict.com/configuration/pushed-authorization-requests) started supporting `Pushed Authorization Requests (PAR)`. The ABP Framework(`>=9.2.0`) promptly upgraded its `OpenIddict` version and added PAR configuration in the [Volo.OpenIddict.Pro module](https://abp.io/modules/Volo.OpenIddict.Pro).
You can configure `Pushed Authorization Requests (PAR)` when `creating/updating` an `Application`.
![par](par.png)
Let's examine the authentication flow using `Pushed Authorization Requests (PAR)`.
When we attempt to use OpenID Connect authentication in the `Acme.Web` project, it sends an HTTP request from the application (**not the browser**) to the authorization server's `par` endpoint.
```csharp
POST https://auth-server.acme.com/connect/par
Form Data Parameters:
client_id: AbpApp
client_secret: secret
redirect_uri: https://web.acme.com/signin-oidc
response_type: code
scope: openid profile email roles phone AbpAPI
response_mode: form_post
nonce: YzVkMjZmN...
state: CfDJ8NwA4...
```
> If you have enabled `Pkce`, the code_challenge and code_challenge_method parameters will also appear in the `POST` request.
```csharp
code_challenge: mJxMdULFXnvdWfaDUfyDIb77IFlMpGyKkHN1_UWYKDk
code_challenge_method: S256
```
After successful verification and validation, the authorization server returns a `request_uri` to the `Acme.Web` application.
```json
{
"request_uri": "urn:ietf:params:oauth:request_uri:1FPVWnrwFAesetV-r-66_b7BAF_vCQm7UmPWfBqRENg",
"expires_in": 3599
}
```
Upon receiving a successful response, the `Acme.Web` project constructs an authorization request and redirects the browser to the authorization server.
```csharp
GET https//auth-server.acme.com/connect/authorize
Query String Parameters:
client_id: AbpApp
request_uri: urn:ietf:params:oauth:request_uri:1FPVWnrwFAesetV-r-66_b7BAF_vCQm7UmPWfBqRENg
```
Similarly, after the user authorizes on the `Acme.AuthServer` project, it returns a `code` to the `Acme.Web` project, which can then be used to request an `access token`, just like in the standard `Code Flow` described above.
## Configuring and Enabling PAR in ABP Application
The ABP [OpenIddict module](https://abp.io/modules/Volo.OpenIddict) enables the `PAR` feature by default.
In ASP.NET Core 9.0, the [OpenIdConnect authentication handler](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.OpenIdConnect)'s [OpenIdConnectOptions](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.openidconnect.openidconnectoptions) includes a new [PushedAuthorizationBehavior](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.openidconnect.openidconnectoptions.pushedauthorizationbehavior) parameter that you can configure in your application.
| Name | Description|
|-|-|
| UseIfAvailable | Use Pushed Authorization (PAR) if the PAR endpoint is available in the identity provider's discovery document or the explicit OpenIdConnectConfiguration. **This is the default value.** |
| Disable| Never use Pushed Authorization (PAR), even if the PAR endpoint is available in the identity provider's discovery document or the explicit OpenIdConnectConfiguration. If the identity provider's discovery document indicates that it requires Pushed Authorization (PAR), the handler will fail. |
| Require | Always use Pushed Authorization (PAR), and emit errors if the PAR endpoint is not available in the identity provider's discovery document or the explicit OpenIdConnectConfiguration. |
```csharp
AddAbpOpenIdConnect("oidc", options =>
{
//...
options.PushedAuthorizationBehavior = PushedAuthorizationBehavior.Require;
//...
});
```
The `UseIfAvailable` value is the default behavior, and ABP has enabled the `PAR` endpoint globally. Make sure all your web applications have been granted the `OpenIddictConstants.Permissions.Endpoints.PushedAuthorization` permission to use the PAR endpoint. If not, you should disable the `PushedAuthorizationBehavior` in the `OpenIdConnectOptions`.
```csharp
AddAbpOpenIdConnect("oidc", options =>
{
//...
options.PushedAuthorizationBehavior = PushedAuthorizationBehavior.Disable;
//...
});
```
> Not all authentication clients support PAR. For example, Blazor WASM does not yet support it.
## Summary
`Pushed Authorization Requests (PAR)` is a security enhancement for `OAuth 2.0` that significantly improves the security and reliability of the `authorization code flow`. Given its security benefits, we strongly recommend implementing `PAR` in your production applications.
## References
- [Volo.OpenIddict.Pro module](https://abp.io/modules/Volo.OpenIddict.Pro)
- [What Are OAuth Pushed Authorization Requests (PAR)?](https://auth0.com/blog/what-are-oauth-push-authorization-requests-par/)
- [OpenIddict Pushed Authorization Requests (PAR)](https://documentation.openiddict.com/configuration/pushed-authorization-requests)
- [Support for Pushed Authorization (PAR) in OIDC Handler](https://github.com/dotnet/aspnetcore/pull/55069)
- [RFC 9156](https://tools.ietf.org/html/rfc9156)

BIN
docs/en/Community-Articles/2025-02-16-Using-Pushed-Authorization-Requests-In-ABP-Framework/cover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 KiB

BIN
docs/en/Community-Articles/2025-02-16-Using-Pushed-Authorization-Requests-In-ABP-Framework/par.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 KiB

BIN
docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183abfe065ba8bacdd56ef05d9a4cd.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

BIN
docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183ac7b768a9a7523278ab07847b3c.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

BIN
docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/3a183ac7c4767cabf12d657ac90f4c17.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

28
docs/en/Community-Articles/2025-02-21-catch-us-at-basta-frankfurt-2025/post.md

@ -0,0 +1,28 @@
We are excited to share some fantastic news with our community! We are proud to announce that ABP.IO is going to be at the BASTA! Conference on March 03-07, 2025 in Frankfurt and İsmail Çağdaş from our dev team is going to be a speaker on March 04!
#### **About BASTA!**
For those who don’t know, BASTA! is the leading independent conference for Microsoft technologies in the German-speaking world. For over 20 years, it has been setting standards in the areas of C#, .NET and cloud and web technologies and is considered a must-attend event for Microsoft, cloud, web developers and key players in the software industry. BASTA! is a conference for developers and IT professionals who want to stay up to date with the latest technologies.
#### **ABP at [BASTA! Mainz 2023](https://abp.io/blog/BASTA-Mainz-2023-What-a-Blast-in-Germany)**
![basta 2023.jpg](3a183abfe065ba8bacdd56ef05d9a4cd.jpg)
![2222.jpg](3a183ac7b768a9a7523278ab07847b3c.jpg)
![3333.jpg](3a183ac7c4767cabf12d657ac90f4c17.jpg)
#####
#### **What to Expect at [BASTA! 2025](https://basta.net/frankfurt-en/)**
The most exciting part is İsmail Çağdaş from the ABP developer team will be speaking at the conference on March 04 about the concepts of monoliths and microservices will be briefly explored, along with how modular monoliths bring together the advantages of these two architectures. Using the ABP Framework as an example, the session will highlight its modularity features and demonstrate how it can assist in creating and developing a modular monolith application. Finally, best practices for developing modular monoliths will be discussed, showing how these practices can pave the way for transitioning to a microservice-based architecture when necessary.
If you want to find out more information about İsmail Çağdaş's session, [check here](https://basta.net/microservices-apis/modular-monoliths-architecture-abp/?loc=ffm):
#### **Connect with Us**
We have exciting raffles and surprises planned at our booth and look forward to sharing more information about our solutions with you there.
#### **Join Us Online**
Don't worry if you can't join us in person, our online booth is going to be there for you! The Expo of the online version of BASTA! is open for the main conference days.
Tuesday, March 4, 2025: 9:00 am – approx. 6:00 pm
Wednesday, March 5, 2025: 9:00 am – approx. 6:00 pm
Thursday, March 6, 2025: 9:00 am – approx. 5:45 pm

16
docs/en/framework/ui/blazor/toolbars.md

@ -8,12 +8,26 @@ There is only one **standard toolbar** named "Main" (defined as a constant: `Sta
In the screenshot above, there are two items added to the main toolbar: Language switch component & user menu. You can add your own items here.
Also, [LeptonX Lite Theme](../../../ui-themes/lepton-x-lite/blazor.md) has 2 different toolbars for desktop and mobile views which defined as constants: `LeptonXLiteToolbars.Main`, `LeptonXLiteToolbars.MainMobile`.
Also, [LeptonX Lite Theme](../../../ui-themes/lepton-x-lite/blazor.md) and [LeptonX Theme](../../../ui-themes/lepton-x/blazor.md) has 2 different toolbars for desktop and mobile views which defined as constants.
**LeptonX Lite Theme**
- `LeptonXLiteToolbars.Main`
- `LeptonXLiteToolbars.MainMobile`
| LeptonXLiteToolbars.Main | LeptonXLiteToolbars.MainMobile |
| :---: | :---: |
| ![leptonx](../../../images/leptonxlite-toolbar-main-example.png) | ![leptonx](../../../images/leptonxlite-toolbar-mainmobile-example.png) |
**LeptonX Theme**
- `LeptonXToolbars.Main`
- `LeptonXToolbars.MainMobile`
| LeptonXToolbars.Main | LeptonXToolbars.MainMobile |
| :---: | :---: |
| ![leptonx](../../../images/leptonx-toolbar-main-example.png) | ![leptonx](../../../images/leptonx-toolbar-mainmobile-example.png) |
## Example: Add a Notification Icon
In this example, we will add a **notification (bell) icon** to the left of the language switch item. A item in the toolbar should be a **Razor Component**. So, first, create a new razor component in your project (the location of the component doesn't matter):

16
docs/en/framework/ui/mvc-razor-pages/toolbars.md

@ -8,12 +8,26 @@ There is only one **standard toolbar** named "Main" (defined as a constant: `Sta
In the screenshot above, there are two items added to the main toolbar: Language switch component & user menu. You can add your own items here.
Also, [LeptonX Lite Theme](../../../ui-themes/lepton-x-lite/asp-net-core.md) has 2 different toolbars for desktop and mobile views which defined as constants: `LeptonXLiteToolbars.Main`, `LeptonXLiteToolbars.MainMobile`.
Also, [LeptonX Lite Theme](../../../ui-themes/lepton-x-lite/asp-net-core.md) and [LeptonX Theme](../../../ui-themes/lepton-x/mvc.md) has 2 different toolbars for desktop and mobile views which defined as constants.
**LeptonX Lite Theme**
- `LeptonXLiteToolbars.Main`
- `LeptonXLiteToolbars.MainMobile`
| LeptonXLiteToolbars.Main | LeptonXLiteToolbars.MainMobile |
| :---: | :---: |
| ![leptonx](../../../images/leptonxlite-toolbar-main-example.png) | ![leptonx](../../../images/leptonxlite-toolbar-mainmobile-example.png) |
**LeptonX Theme**
- `LeptonXToolbars.Main`
- `LeptonXToolbars.MainMobile`
| LeptonXToolbars.Main | LeptonXToolbars.MainMobile |
| :---: | :---: |
| ![leptonx](../../../images/leptonx-toolbar-main-example.png) | ![leptonx](../../../images/leptonx-toolbar-mainmobile-example.png) |
## Example: Add a Notification Icon
In this example, we will add a **notification (bell) icon** to the left of the language switch item. A item in the toolbar should be a **view component**. So, first, create a new view component in your project:

18
docs/en/guides/microservice-mongodb.md

@ -1,12 +1,12 @@
# Change Microservice project to use MongoDB Provider
This guide explains how to change Microservice project to use MongoDB as the database provider.
This guide explains how to change the Microservice project to use MongoDB as the database provider.
## Create a new Microservice project
Use the ABP Suite to create a new Microservice project, in this guide we use `BookStore` as project name.
> You can use [ABP Studio](../studio/index.md) to create a new Microservice project. In this guide, we assume that you have already created a microservice solution and used `BookStore` as your project name.
You will get the solution as shown below:
Currently, your microservice solution should be similar to that in the figure below:
![microservce-mongodb-project](../images/microservice-mongodb.png)
@ -16,9 +16,9 @@ You need to replace all EF Core references with MongoDB and update module depend
Example:
* Remove `Volo.Abp.EntityFrameworkCore.SqlServer` Nuget package reference.
* Remove `Microsoft.EntityFrameworkCore.Tools` Nuget package reference
* Remove `AbpEntityFrameworkCoreSqlServerModule` depend.
* Remove `Volo.Abp.EntityFrameworkCore.SqlServer` NuGet package reference. (instead use `Volo.Abp.MongoDB` NuGet package and also add the relevant depends on statement)
* Remove `Microsoft.EntityFrameworkCore.Tools` NuGet package reference.
* Remove `AbpEntityFrameworkCoreSqlServerModule` dependency.
* Replace `Volo.Abp.PermissionManagement.EntityFrameworkCore` with `Volo.Abp.PermissionManagement.MongoDB`.
* Update `AbpPermissionManagementEntityFrameworkCoreModule` to `AbpPermissionManagementMongoDbModule`.
@ -43,9 +43,9 @@ Here we use `BookStore.ProductService` project as an example:
protected override void CreateModel(IMongoModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>(b =>
{
b.CollectionName = ProductServiceDbProperties.DbTablePrefix + "Products";
});
{
b.CollectionName = ProductServiceDbProperties.DbTablePrefix + "Products";
});
}
}
```

BIN
docs/en/images/leptonx-toolbar-main-example.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
docs/en/images/leptonx-toolbar-mainmobile-example.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

39
docs/en/kb/can-not-login-with-admin-user.md

@ -1,5 +1,36 @@
# KB#0003: Can not login with the admin user
# KB#0003: Cannot login with the admin user
* Try username `admin` and Password `1q2w3E*`.
* Try to migrate database. If you have a `DbMigrator` application in your solution, use it. It will seed initial data and create the admin user for you.
* If not works, read the README.MD file in your solution, or check the [Getting Started](https://abp.io/docs/latest/get-started) document.
## Use the Correct Username and Password
You may have entered the wrong password. The username is `admin`, and the password is `1q2w3E*`. Note that the password is case-sensitive.
## Forgot to Seed Initial Data
You may need to add migrations and update the database using the EF Core CLI. If your solution includes a `DbMigrator` application, you must run the `DbMigrator` application to seed the initial data.
If your project does not include a `DbMigrator` application, there might be a `migrate-database.ps1` script available. You can use it to migrate and seed the initial data.
> The no-layer application typically support a `--migrate-database` option for migrating and seeding initial data.
> Example:
> ```bash
> dotnet run --migrate-database
> ```
## Tenant Admin User
If you cannot log in as a tenant admin user, ensure the tenant database is created and seeded, Use the password that was set during tenant creation.
> The tenant seeding process is handled by the template project. If it is not completed, please check the `Logs` file for any error logs.
## Check the `AbpUsers` Table
If you have performed migration and seeded the initial data, check the `AbpUsers` table in the database. Ensure that the user record exists. If your tenant has a separate database, check the tenant database as well.
Passwords are stored in hashed format, not plain text. If you suspect the password is incorrect, you can delete the user record and re-seed the initial data using the `DbMigrator` application or the `migrate-database.ps1` script.
## Other Issues
If the issue persists, refer to the `README.MD` file in your solution or consult the [Getting Started](https://abp.io/docs/latest/get-started) documentation.
Feel free to create an issue in the [ABP GitHub repository](https://github.com/abpframework/abp/issues/new/choose) or contact [ABP Commercial Support](https://abp.io/support/questions/New) for assistance.

2
docs/en/release-info/migration-guides/abp-9-0.md

@ -2,7 +2,7 @@
This document is a guide for upgrading ABP v8.x solutions to ABP v9.0. There are some changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application.
> ABP has upgraded to .NET 9.0, so if you plan to use ABP 9.0, you’ll need to migrate your solutions to .NET 9.0. You can refer to the [Migrate from ASP.NET Core 8.0 to 9.0](https://learn.microsoft.com/en-us/aspnet/core/migration/80-90) documentation for guidance. However, ABP’s NuGet packages are compatible with both .NET 8 and .NET 9, allowing developers to continue using .NET 8 while still enjoying the latest features and improvements of the ABP Framework without upgrading their SDK.
> ABP has upgraded to .NET 9.0, so if you plan to use ABP 9.0, you’ll need to migrate your solutions to .NET 9.0. You can refer to the [Migrate from ASP.NET Core 8.0 to 9.0](https://learn.microsoft.com/en-us/aspnet/core/migration/80-90) documentation for guidance.
## Open-Source (Framework)

2
docs/en/tutorials/modular-crm/part-08.md

@ -37,7 +37,7 @@ In this section, we will create an application service in the main application's
### Defining the Reporting Service Interface
We will define the `IOrderReportingAppService` interface in the `ModularCrm.Application.Contracts` project of the main application's .NET solution.
We will define the `IOrderReportingAppService` interface in the main application's .NET solution.
#### Adding `ModularCrm.Ordering.Contracts` Package Reference

30
docs/en/ui-themes/lepton-x/blazor.md

@ -167,7 +167,6 @@ Layout options of Blazor UI can be manageable via using **LeptonXThemeMvcOptions
});
```
{{if UI == "Blazor"}}
#### Updating Bundles on Layout Changes
@ -195,6 +194,35 @@ abp bundle
{{end}}
### Toolbars
LeptonX includes separeted toolbars for desktop & mobile. You can manage toolbars independently. Toolbar names can be accessible in the **LeptonXToolbars** class.
- `LeptonXToolbars.Main`
- `LeptonXToolbars.MainMobile`
```csharp
public async Task ConfigureToolbarAsync(IToolbarConfigurationContext context)
{
if (context.Toolbar.Name == LeptonXToolbars.Main)
{
context.Toolbar.Items.Add(new ToolbarItem(typeof(MyDesktopComponent)));
}
if (context.Toolbar.Name == LeptonXToolbars.MainMobile)
{
context.Toolbar.Items.Add(new ToolbarItem(typeof(MyMobileComponent)));
}
return Task.CompletedTask;
}
```
{{if UI == "BlazorServer"}}
> _You can visit the [Toolbars Documentation](../../framework/ui/blazor/toolbars.md) for better understanding._
{{end}}
## Layouts

26
docs/en/ui-themes/lepton-x/mvc.md

@ -81,8 +81,32 @@ Configure<LeptonXThemeOptions>(options =>
>
> If your layout is **TopMenu**, then you have to add them under the **wwwroot/Themes/LeptonX/Global/top-menu/css/** folder.
### Toolbars
LeptonX includes separeted toolbars for desktop & mobile. You can manage toolbars independently. Toolbar names can be accessible in the **LeptonXToolbars** class.
- `LeptonXToolbars.Main`
- `LeptonXToolbars.MainMobile`
```csharp
public async Task ConfigureToolbarAsync(IToolbarConfigurationContext context)
{
if (context.Toolbar.Name == LeptonXToolbars.Main)
{
context.Toolbar.Items.Add(new ToolbarItem(typeof(MyDesktopComponent)));
}
if (context.Toolbar.Name == LeptonXToolbars.MainMobile)
{
context.Toolbar.Items.Add(new ToolbarItem(typeof(MyMobileComponent)));
}
return Task.CompletedTask;
}
```
> _You can visit the [Toolbars Documentation](../../framework/ui/mvc-razor-pages/toolbars.md) for better understanding._
#### Handling Style Changes
You can add extra logic by using javascript API when style is changed with the following event.
```js

17
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/ComponentsComponentsBundleContributor.cs

@ -17,17 +17,14 @@ public class ComponentsComponentsBundleContributor : IBundleContributor
public void AddStyles(BundleContext context)
{
if (!context.InteractiveAuto)
context.BundleDefinitions.Insert(0, new BundleDefinition
{
context.BundleDefinitions.Insert(0, new BundleDefinition
{
Source = "_content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/bootstrap/css/bootstrap.min.css"
});
context.BundleDefinitions.Insert(1, new BundleDefinition
{
Source = "_content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/fontawesome/css/all.css"
});
}
Source = "_content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/bootstrap/css/bootstrap.min.css"
});
context.BundleDefinitions.Insert(1, new BundleDefinition
{
Source = "_content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/fontawesome/css/all.css"
});
context.Add("_content/Volo.Abp.AspNetCore.Components.Web/libs/abp/css/abp.css");
context.Add("_content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/flag-icon/css/flag-icon.css");

5
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Options;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker;
@ -45,9 +46,9 @@ public abstract class
public bool AddMarginBottomClass { get; set; } = true;
protected AbpDatePickerBaseTagHelper(AbpDatePickerBaseTagHelperService<TTagHelper> service) : base(service)
protected AbpDatePickerBaseTagHelper(AbpDatePickerBaseTagHelperService<TTagHelper> service, IOptionsFactory<AbpDatePickerOptions> optionsFactory) : base(service)
{
_abpDatePickerOptionsImplementation = new AbpDatePickerOptions();
_abpDatePickerOptionsImplementation = optionsFactory.Create(string.Empty);
}
public void SetDatePickerOptions(IAbpDatePickerOptions options)

6
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs

@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Options;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker;
@ -8,7 +9,10 @@ public class AbpDatePickerTagHelper : AbpDatePickerBaseTagHelper<AbpDatePickerTa
{
public ModelExpression? AspFor { get; set; }
public AbpDatePickerTagHelper(AbpDatePickerTagHelperService service) : base(service)
public AbpDatePickerTagHelper(
AbpDatePickerTagHelperService service,
IOptionsFactory<AbpDatePickerOptions> optionsFactory)
: base(service, optionsFactory)
{
}
}

7
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs

@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Options;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker;
@ -10,8 +11,10 @@ public class AbpDateRangePickerTagHelper : AbpDatePickerBaseTagHelper<AbpDateRan
public ModelExpression? AspForEnd { get; set; }
public AbpDateRangePickerTagHelper(AbpDateRangePickerTagHelperService tagHelperService) :
base(tagHelperService)
public AbpDateRangePickerTagHelper(
AbpDateRangePickerTagHelperService service,
IOptionsFactory<AbpDatePickerOptions> optionsFactory)
: base(service, optionsFactory)
{
}
}

18
latest-versions.json

@ -1,4 +1,22 @@
[
{
"version": "9.1.0",
"releaseDate": "",
"type": "stable",
"message": "",
"leptonx": {
"version": "4.1.0"
}
},
{
"version": "9.0.6",
"releaseDate": "",
"type": "stable",
"message": "",
"leptonx": {
"version": "4.0.8"
}
},
{
"version": "9.0.5",
"releaseDate": "",

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json

@ -68,6 +68,8 @@
"AccessDenied": "تم الرفض!",
"AccessDeniedMessage": "ليس لديك حق الوصول إلى هذا المورد.",
"OrRegisterWith": "أو التسجيل بـ:",
"RegisterUsingYourProviderAccount": "قم بالتسجيل باستخدام حسابك في {0}"
"RegisterUsingYourProviderAccount": "قم بالتسجيل باستخدام حسابك في {0}",
"RequireMigrateSeedTitle": "تعذر العثور على المستخدم المسؤول",
"RequireMigrateSeedMessage": "يرجى التأكد من تنفيذ seed قاعدة البيانات. راجع <a target=\"_blank\" href=\"https://abp.io/kb/0003\">الوثائق</a> للحلول الممكنة."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/cs.json

@ -68,6 +68,8 @@
"AccessDenied": "Přístup odepřen!",
"AccessDeniedMessage": "K tomuto zdroji nemáte přístup.",
"OrRegisterWith": "Nebo se registrujte pomocí:",
"RegisterUsingYourProviderAccount": "Registrovat pomocí vašeho účtu {0}"
"RegisterUsingYourProviderAccount": "Registrovat pomocí vašeho účtu {0}",
"RequireMigrateSeedTitle": "Nelze najít uživatele správce",
"RequireMigrateSeedMessage": "Ujistěte se, že je spuštěn seed databáze. Podívejte se na <a target=\"_blank\" href=\"https://abp.io/kb/0003\">dokumentaci</a> pro možná řešení."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/da.json

@ -65,6 +65,8 @@
"AccessDenied": "Adgang nægtet!",
"AccessDeniedMessage": "Du har ikke adgang til denne ressource.",
"OrRegisterWith": "Eller registrér med:",
"RegisterUsingYourProviderAccount": "Registrér med din {0} konto"
"RegisterUsingYourProviderAccount": "Registrér med din {0} konto",
"RequireMigrateSeedTitle": "Kunne ikke finde administratorbrugeren",
"RequireMigrateSeedMessage": "Sørg for, at databasens seed bliver udført. Se <a target=\"_blank\" href=\"https://abp.io/kb/0003\">dokumentationen</a> for mulige løsninger."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de.json

@ -68,6 +68,8 @@
"AccessDenied": "Zugriff abgelehnt!",
"AccessDeniedMessage": "Sie haben keinen Zugriff auf diese Ressource.",
"OrRegisterWith": "Oder registrieren Sie sich mit:",
"RegisterUsingYourProviderAccount": "Registrieren Sie sich mit Ihrem {0} Benutzerkonto"
"RegisterUsingYourProviderAccount": "Registrieren Sie sich mit Ihrem {0} Benutzerkonto",
"RequireMigrateSeedTitle": "Der Administrator-Benutzer konnte nicht gefunden werden",
"RequireMigrateSeedMessage": "Bitte stellen Sie sicher, dass die Datenbank-Seed ausgeführt wird. Siehe <a target=\"_blank\" href=\"https://abp.io/kb/0003\">Dokumentation</a> für mögliche Lösungen."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/el.json

@ -66,6 +66,8 @@
"AccessDenied": "Δεν επιτρέπεται η πρόσβαση!",
"AccessDeniedMessage": "Δεν έχετε πρόσβαση σε αυτόν τον πόρο.",
"OrRegisterWith": "Ή εγγραφείτε με:",
"RegisterUsingYourProviderAccount": "Εγγραφείτε χρησιμοποιώντας τον λογαριασμό σας {0}"
"RegisterUsingYourProviderAccount": "Εγγραφείτε χρησιμοποιώντας τον λογαριασμό σας {0}",
"RequireMigrateSeedTitle": "Δεν βρέθηκε ο χρήστης διαχειριστή",
"RequireMigrateSeedMessage": "Βεβαιωθείτε ότι εκτελείται το seed της βάσης δεδομένων. Δείτε την <a target=\"_blank\" href=\"https://abp.io/kb/0003\">τεκμηρίωση</a> για πιθανές λύσεις."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en-GB.json

@ -63,6 +63,8 @@
"PasswordResetInfoInEmail": "We received an account recovery request! If you initiated this request, click the following link to reset your password.",
"ResetMyPassword": "Reset my password",
"OrRegisterWith": "Or register with",
"RegisterUsingYourProviderAccount": "Register using your {0} account"
"RegisterUsingYourProviderAccount": "Register using your {0} account",
"RequireMigrateSeedTitle": "Could not find the admin user",
"RequireMigrateSeedMessage": "Please ensure that the database seed is executed. See <a target=\"_blank\" href=\"https://abp.io/kb/0003\">documentation</a> for possible solutions."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json

@ -68,6 +68,8 @@
"AccessDenied": "Access denied!",
"AccessDeniedMessage": "You do not have access to this resource.",
"OrRegisterWith": "Or register with",
"RegisterUsingYourProviderAccount": "Register using your {0} account"
"RegisterUsingYourProviderAccount": "Register using your {0} account",
"RequireMigrateSeedTitle": "Could not find the admin user",
"RequireMigrateSeedMessage": "Please ensure that the database seed is executed. See <a target=\"_blank\" href=\"https://abp.io/kb/0003\">documentation</a> for possible solutions."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es-mx.json

@ -36,6 +36,8 @@
"Manage": "Administrar",
"MyAccount": "Mi cuenta",
"OrRegisterWith": "O registrarse con",
"RegisterUsingYourProviderAccount": "Registrarse con su cuenta de {0} "
"RegisterUsingYourProviderAccount": "Registrarse con su cuenta de {0} ",
"RequireMigrateSeedTitle": "No se pudo encontrar el usuario administrador",
"RequireMigrateSeedMessage": "Asegúrese de que se ejecute la semilla de la base de datos. Consulte la <a target=\"_blank\" href=\"https://abp.io/kb/0003\">documentación</a> para posibles soluciones."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json

@ -68,6 +68,8 @@
"AccessDenied": "¡Acceso denegado!",
"AccessDeniedMessage": "No tienes acceso a este recurso.",
"OrRegisterWith": "O registrarse con:",
"RegisterUsingYourProviderAccount": "Registrarse con su cuenta de {0} "
"RegisterUsingYourProviderAccount": "Registrarse con su cuenta de {0} ",
"RequireMigrateSeedTitle": "No se pudo encontrar el usuario administrador",
"RequireMigrateSeedMessage": "Asegúrese de que se ejecute la semilla de la base de datos. Consulte la <a target=\"_blank\" href=\"https://abp.io/kb/0003\">documentación</a> para posibles soluciones."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fa.json

@ -66,6 +66,8 @@
"AccessDenied": "دسترسی ممنوع!",
"AccessDeniedMessage": "شما به این منبع دسترسی ندارید.",
"OrRegisterWith": "یا ثبت نام کنید با:",
"RegisterUsingYourProviderAccount": "با استفاده از حساب {0} خود ثبت نام کنید"
"RegisterUsingYourProviderAccount": "با استفاده از حساب {0} خود ثبت نام کنید",
"RequireMigrateSeedTitle": "کاربر مدیر پیدا نشد",
"RequireMigrateSeedMessage": "لطفاً اطمینان حاصل کنید که seed پایگاه داده اجرا شده است. برای راه‌حل‌های ممکن <a target=\"_blank\" href=\"https://abp.io/kb/0003\">مستندات</a> را ببینید."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json

@ -68,6 +68,8 @@
"AccessDenied": "Pääsy evätty!",
"AccessDeniedMessage": "Sinulla ei ole pääsyä tähän resurssiin.",
"OrRegisterWith": "Tai rekisteröidy:",
"RegisterUsingYourProviderAccount": "Rekisteröidy {0} -tililläsi"
"RegisterUsingYourProviderAccount": "Rekisteröidy {0} -tililläsi",
"RequireMigrateSeedTitle": "Järjestelmänvalvojaa ei löydy",
"RequireMigrateSeedMessage": "Varmista, että tietokannan siemennys on suoritettu. Katso <a target=\"_blank\" href=\"https://abp.io/kb/0003\">dokumentaatio</a> mahdollisia ratkaisuja varten."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json

@ -68,6 +68,8 @@
"AccessDenied": "Accès refusé!",
"AccessDeniedMessage": "Vous n'avez pas accès à cette ressource.",
"OrRegisterWith": "Or register with",
"RegisterUsingYourProviderAccount": "Register using your {0} account"
"RegisterUsingYourProviderAccount": "Register using your {0} account",
"RequireMigrateSeedTitle": "Impossible de trouver l'utilisateur administrateur",
"RequireMigrateSeedMessage": "Veuillez vous assurer que l'initialisation de la base de données est exécutée. Consultez la <a target=\"_blank\" href=\"https://abp.io/kb/0003\">documentation</a> pour les solutions possibles."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json

@ -68,6 +68,8 @@
"AccessDenied": "पहुंच अस्वीकृत!",
"AccessDeniedMessage": "आपके पास इस संसाधन तक पहुँच नहीं है।",
"OrRegisterWith": "या इसके साथ पंजीकरण करें:",
"RegisterUsingYourProviderAccount": "अपने {0} खाते का उपयोग करके पंजीकरण करें"
"RegisterUsingYourProviderAccount": "अपने {0} खाते का उपयोग करके पंजीकरण करें",
"RequireMigrateSeedTitle": "व्यवस्थापक उपयोगकर्ता नहीं मिला",
"RequireMigrateSeedMessage": "कृपया सुनिश्चित करें कि डेटाबेस सीड निष्पादित किया गया है। संभावित समाधानों के लिए <a target=\"_blank\" href=\"https://abp.io/kb/0003\">दस्तावेज़ीकरण</a> देखें।"
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hr.json

@ -68,6 +68,8 @@
"AccessDenied": "Pristup odbijen!",
"AccessDeniedMessage": "Nemate pristup ovom resursu.",
"OrRegisterWith": "Ili se registrirajte sa:",
"RegisterUsingYourProviderAccount": "Registrirajte se koristeći svoj {0} račun"
"RegisterUsingYourProviderAccount": "Registrirajte se koristeći svoj {0} račun",
"RequireMigrateSeedTitle": "Nije moguće pronaći administratorskog korisnika",
"RequireMigrateSeedMessage": "Molimo provjerite je li izvršeno početno punjenje baze podataka. Pogledajte <a target=\"_blank\" href=\"https://abp.io/kb/0003\">dokumentaciju</a> za moguća rješenja."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hu.json

@ -68,6 +68,8 @@
"AccessDenied": "Hozzáférés megtagadva!",
"AccessDeniedMessage": "Nincs hozzáférése ehhez az erőforráshoz.",
"OrRegisterWith": "Vagy regisztráljon:",
"RegisterUsingYourProviderAccount": "Regisztráljon a(z) {0} fiókjával"
"RegisterUsingYourProviderAccount": "Regisztráljon a(z) {0} fiókjával",
"RequireMigrateSeedTitle": "Nem található az adminisztrátor felhasználó",
"RequireMigrateSeedMessage": "Kérjük, győződjön meg arról, hogy az adatbázis seed végrehajtásra került. Tekintse meg a <a target=\"_blank\" href=\"https://abp.io/kb/0003\">dokumentációt</a> a lehetséges megoldásokért."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/is.json

@ -68,6 +68,8 @@
"AccessDenied": "Aðgangi hafnað!",
"AccessDeniedMessage": "Þú hefur ekki aðgang að þessari auðlind.",
"OrRegisterWith": "Eða skráðu þig með:",
"RegisterUsingYourProviderAccount": "Skráðu þig með {0} aðganginum þínum"
"RegisterUsingYourProviderAccount": "Skráðu þig með {0} aðganginum þínum",
"RequireMigrateSeedTitle": "Ekki tókst að finna stjórnandann",
"RequireMigrateSeedMessage": "Vinsamlegast gakktu úr skugga um að gagnagrunnsfræið sé keyrt. Sjá <a target=\"_blank\" href=\"https://abp.io/kb/0003\">fylgiskjöl</a> fyrir mögulegar lausnir."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json

@ -68,6 +68,8 @@
"AccessDenied": "Accesso negato!",
"AccessDeniedMessage": "Non hai accesso a questa risorsa.",
"OrRegisterWith": "Oppure registrati con:",
"RegisterUsingYourProviderAccount": "Registrati utilizzando il tuo account {0}"
"RegisterUsingYourProviderAccount": "Registrati utilizzando il tuo account {0}",
"RequireMigrateSeedTitle": "Impossibile trovare l'utente amministratore",
"RequireMigrateSeedMessage": "Assicurati che il seed del database sia eseguito. Consulta la <a target=\"_blank\" href=\"https://abp.io/kb/0003\">documentazione</a> per possibili soluzioni."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/nl.json

@ -68,6 +68,8 @@
"AccessDenied": "Toegang geweigerd!",
"AccessDeniedMessage": "U heeft geen toegang tot deze bron.",
"OrRegisterWith": "Of registreer met:",
"RegisterUsingYourProviderAccount": "Registreer met uw {0} -account"
"RegisterUsingYourProviderAccount": "Registreer met uw {0} -account",
"RequireMigrateSeedTitle": "Kan de beheerder niet vinden",
"RequireMigrateSeedMessage": "Zorg ervoor dat het database seed wordt uitgevoerd. Zie <a target=\"_blank\" href=\"https://abp.io/kb/0003\">documentatie</a> voor mogelijke oplossingen."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pl-PL.json

@ -68,6 +68,8 @@
"AccessDenied": "Brak dostępu!",
"AccessDeniedMessage": "Nie masz dostępu do tego zasobu.",
"OrRegisterWith": "Lub zarejestruj się za pomocą:",
"RegisterUsingYourProviderAccount": "Zarejestruj się za pomocą konta {0}"
"RegisterUsingYourProviderAccount": "Zarejestruj się za pomocą konta {0}",
"RequireMigrateSeedTitle": "Nie można znaleźć użytkownika administratora",
"RequireMigrateSeedMessage": "Upewnij się, że wykonano seed bazy danych. Zobacz <a target=\"_blank\" href=\"https://abp.io/kb/0003\">dokumentację</a>, aby poznać możliwe rozwiązania."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/pt-BR.json

@ -68,6 +68,8 @@
"AccessDenied": "Acesso negado!",
"AccessDeniedMessage": "Você não tem acesso a este recurso.",
"OrRegisterWith": "Ou registre-se com:",
"RegisterUsingYourProviderAccount": "Registre-se utilizando sua conta {0}"
"RegisterUsingYourProviderAccount": "Registre-se utilizando sua conta {0}",
"RequireMigrateSeedTitle": "Não foi possível encontrar o usuário administrador",
"RequireMigrateSeedMessage": "Certifique-se de que a semeadura do banco de dados seja executada. Consulte a <a target=\"_blank\" href=\"https://abp.io/kb/0003\">documentação</a> para possíveis soluções."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ro-RO.json

@ -68,6 +68,8 @@
"AccessDenied": "Acces interzis!",
"AccessDeniedMessage": "Nu aveţi acces la această resursă.",
"OrRegisterWith": "Sau înregistraţi-vă cu:",
"RegisterUsingYourProviderAccount": "Înregistraţi-vă folosindu-vă contul {0}"
"RegisterUsingYourProviderAccount": "Înregistraţi-vă folosindu-vă contul {0}",
"RequireMigrateSeedTitle": "Nu s-a putut găsi utilizatorul admin",
"RequireMigrateSeedMessage": "Vă rugăm să vă asiguraţi că seed-ul bazei de date este executat. Consultaţi <a target=\"_blank\" href=\"https://abp.io/kb/0003\">documentaţia</a> pentru soluţii posibile."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ru.json

@ -68,6 +68,8 @@
"AccessDenied": "В доступе отказано!",
"AccessDeniedMessage": "У вас нет доступа к этому ресурсу.",
"OrRegisterWith": "Или зарегистрируйтесь с помощью:",
"RegisterUsingYourProviderAccount": "Зарегистрируйтесь, используя свой {0} аккаунт"
"RegisterUsingYourProviderAccount": "Зарегистрируйтесь, используя свой {0} аккаунт",
"RequireMigrateSeedTitle": "Не удалось найти пользователя-администратора",
"RequireMigrateSeedMessage": "Пожалуйста, убедитесь, что выполнено начальное заполнение базы данных. Смотрите <a target=\"_blank\" href=\"https://abp.io/kb/0003\">документацию</a> для возможных решений."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sk.json

@ -68,6 +68,8 @@
"AccessDenied": "Prístup zamietnutý!",
"AccessDeniedMessage": "K tomuto zdroju nemáte prístup.",
"OrRegisterWith": "Alebo sa zaregistrujte pomocou:",
"RegisterUsingYourProviderAccount": "Zaregistrujte sa pomocou svojho {0} účtu"
"RegisterUsingYourProviderAccount": "Zaregistrujte sa pomocou svojho {0} účtu",
"RequireMigrateSeedTitle": "Nepodarilo sa nájsť používateľa správcu",
"RequireMigrateSeedMessage": "Uistite sa, že je spustené seed databázy. Pozrite si <a target=\"_blank\" href=\"https://abp.io/kb/0003\">dokumentáciu</a> pre možné riešenia."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sl.json

@ -68,6 +68,8 @@
"AccessDenied": "Dostop zavrnjen!",
"AccessDeniedMessage": "Nimate dostopa do tega vira.",
"OrRegisterWith": "Ali pa se registrirajte z:",
"RegisterUsingYourProviderAccount": "Registrirajte se z uporabo vašega {0} računa"
"RegisterUsingYourProviderAccount": "Registrirajte se z uporabo vašega {0} računa",
"RequireMigrateSeedTitle": "Skrbniškega uporabnika ni mogoče najti",
"RequireMigrateSeedMessage": "Prepričajte se, da je seed baze podatkov izveden. Za možne rešitve glejte <a target=\"_blank\" href=\"https://abp.io/kb/0003\">dokumentacijo</a>."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sv.json

@ -68,6 +68,8 @@
"AccessDenied": "Åtkomst nekad!",
"AccessDeniedMessage": "Du har inte tillgång till denna resurs.",
"OrRegisterWith": "Eller registrera dig med",
"RegisterUsingYourProviderAccount": "Registrera dig med ditt {0} konto"
"RegisterUsingYourProviderAccount": "Registrera dig med ditt {0} konto",
"RequireMigrateSeedTitle": "Kunde inte hitta administratörsanvändaren",
"RequireMigrateSeedMessage": "Se till att databasens seed körs. Se <a target=\"_blank\" href=\"https://abp.io/kb/0003\">dokumentationen</a> för möjliga lösningar."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json

@ -68,6 +68,8 @@
"AccessDenied": "Erişim reddedildi!",
"AccessDeniedMessage": "Bu kaynağa erişiminiz yok.",
"OrRegisterWith": "Veya bunlarla kayıt ol:",
"RegisterUsingYourProviderAccount": "{0} hesabınızla kayıt olun."
"RegisterUsingYourProviderAccount": "{0} hesabınızla kayıt olun.",
"RequireMigrateSeedTitle": "Yönetici kullanıcısı bulunamadı",
"RequireMigrateSeedMessage": "Lütfen veritabanı tohumunun yürütüldüğünden emin olun. Olası çözümler için <a target=\"_blank\" href=\"https://abp.io/kb/0003\">belgelere</a> bakın."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/vi.json

@ -68,6 +68,8 @@
"AccessDenied": "Quyền truy cập bị từ chối!",
"AccessDeniedMessage": "Bạn không có quyền truy cập vào tài nguyên này.",
"OrRegisterWith": "Hoặc đăng ký bằng:",
"RegisterUsingYourProviderAccount": "Đăng ký bằng tài khoản {0} của bạn"
"RegisterUsingYourProviderAccount": "Đăng ký bằng tài khoản {0} của bạn",
"RequireMigrateSeedTitle": "Không thể tìm thấy người dùng quản trị",
"RequireMigrateSeedMessage": "Vui lòng đảm bảo rằng seed cơ sở dữ liệu được thực thi. Xem <a target=\"_blank\" href=\"https://abp.io/kb/0003\">tài liệu</a> để biết các giải pháp có thể."
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json

@ -68,6 +68,8 @@
"AccessDenied": "拒绝访问!",
"AccessDeniedMessage": "您无法访问此资源。",
"OrRegisterWith": "或注册",
"RegisterUsingYourProviderAccount": "使用您的 {0} 账户注册"
"RegisterUsingYourProviderAccount": "使用您的 {0} 账户注册",
"RequireMigrateSeedTitle": "找不到管理员用户",
"RequireMigrateSeedMessage": "请确保已执行数据库种子数据。查看<a target=\"_blank\" href=\"https://abp.io/kb/0003\">文档</a>了解可能的解决方案。"
}
}

4
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hant.json

@ -68,6 +68,8 @@
"AccessDenied": "拒絕訪問!",
"AccessDeniedMessage": "您無權訪問此資源.",
"OrRegisterWith": "或是註冊用:",
"RegisterUsingYourProviderAccount": "使用你的{0}帳號註冊"
"RegisterUsingYourProviderAccount": "使用你的{0}帳號註冊",
"RequireMigrateSeedTitle": "找不到管理員用戶",
"RequireMigrateSeedMessage": "請確保已執行資料庫種子資料。查看<a target=\"_blank\" href=\"https://abp.io/kb/0003\">文檔</a>了解可能的解決方案。"
}
}

6
modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/IdentityServerSupportedLoginModel.cs

@ -11,6 +11,7 @@ using System.Diagnostics;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Volo.Abp.Account.Settings;
using Volo.Abp.DependencyInjection;
@ -35,8 +36,9 @@ public class IdentityServerSupportedLoginModel : LoginModel
IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache,
IIdentityServerInteractionService interaction,
IClientStore clientStore,
IEventService identityServerEvents)
: base(schemeProvider, accountOptions, identityOptions, identityDynamicClaimsPrincipalContributorCache)
IEventService identityServerEvents,
IWebHostEnvironment webHostEnvironment)
: base(schemeProvider, accountOptions, identityOptions, identityDynamicClaimsPrincipalContributorCache, webHostEnvironment)
{
Interaction = interaction;
ClientStore = clientStore;

6
modules/account/src/Volo.Abp.Account.Web.OpenIddict/Pages/Account/OpenIddictSupportedLoginModel.cs

@ -2,6 +2,7 @@ using System;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Options;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
@ -24,8 +25,9 @@ public class OpenIddictSupportedLoginModel : LoginModel
IOptions<AbpAccountOptions> accountOptions,
IOptions<IdentityOptions> identityOptions,
IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache,
AbpOpenIddictRequestHelper openIddictRequestHelper)
: base(schemeProvider, accountOptions, identityOptions, identityDynamicClaimsPrincipalContributorCache)
AbpOpenIddictRequestHelper openIddictRequestHelper,
IWebHostEnvironment webHostEnvironment)
: base(schemeProvider, accountOptions, identityOptions, identityDynamicClaimsPrincipalContributorCache, webHostEnvironment)
{
OpenIddictRequestHelper = openIddictRequestHelper;
}

8
modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml

@ -22,6 +22,14 @@
</abp-script-bundle>
}
@if (Model.ShowRequireMigrateSeedMessage)
{
<div class="alert alert-danger">
<h4 class="alert-heading">@L["RequireMigrateSeedTitle"]</h4>
<p>@L["RequireMigrateSeedMessage"]</p>
</div>
}
<div class="card mt-3 shadow-sm rounded">
<div class="card-body p-5">
<h4>@L["Login"]</h4>

19
modules/account/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs

@ -10,6 +10,8 @@ using System.Diagnostics;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Volo.Abp.Account.Settings;
using Volo.Abp.Auditing;
using Volo.Abp.Identity;
@ -53,18 +55,22 @@ public class LoginModel : AccountPageModel
protected AbpAccountOptions AccountOptions { get; }
protected IOptions<IdentityOptions> IdentityOptions { get; }
protected IdentityDynamicClaimsPrincipalContributorCache IdentityDynamicClaimsPrincipalContributorCache { get; }
protected IWebHostEnvironment WebHostEnvironment { get; }
public bool ShowCancelButton { get; set; }
public bool ShowRequireMigrateSeedMessage { get; set; }
public LoginModel(
IAuthenticationSchemeProvider schemeProvider,
IOptions<AbpAccountOptions> accountOptions,
IOptions<IdentityOptions> identityOptions,
IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache)
IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache,
IWebHostEnvironment webHostEnvironment)
{
SchemeProvider = schemeProvider;
IdentityOptions = identityOptions;
AccountOptions = accountOptions.Value;
IdentityDynamicClaimsPrincipalContributorCache = identityDynamicClaimsPrincipalContributorCache;
WebHostEnvironment = webHostEnvironment;
}
public virtual async Task<IActionResult> OnGetAsync()
@ -130,6 +136,17 @@ public class LoginModel : AccountPageModel
if (!result.Succeeded)
{
if (LoginInput.UserNameOrEmailAddress == IdentityDataSeedContributor.AdminUserNameDefaultValue &&
WebHostEnvironment.IsDevelopment())
{
var adminUser = await UserManager.FindByNameAsync(IdentityDataSeedContributor.AdminUserNameDefaultValue);
if (adminUser == null)
{
ShowRequireMigrateSeedMessage = true;
return Page();
}
}
Alerts.Danger(L["InvalidUserNameOrPassword"]);
return Page();
}

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ar.json

@ -67,6 +67,9 @@
"EntityHistory": "تاريخ الكيان",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} بواسطة {2}.",
"MinutesAgo": "منذ {0} دقيقة",
"HoursAgo": "منذ {0} ساعة",
"DaysAgo": "منذ {0} يوم",
"Created": "خلقت",
"Updated": "محدث",
"Deleted": "تم الحذف",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/cs.json

@ -67,6 +67,9 @@
"EntityHistory": "Historie entity",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} od {2}.",
"MinutesAgo": "před {0} minutami",
"HoursAgo": "před {0} hodinami",
"DaysAgo": "před {0} dny",
"Created": "Vytvořeno",
"Updated": "Aktualizováno",
"Deleted": "Smazáno",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de-DE.json

@ -66,6 +66,9 @@
"EntityHistory": "Entitätsverlauf",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} durch {2}.",
"MinutesAgo": "Vor {0} Minuten",
"HoursAgo": "Vor {0} Stunden",
"DaysAgo": "Vor {0} Tagen",
"Created": "Erstellt",
"Updated": "Aktualisiert",
"Deleted": "Gelöscht",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/de.json

@ -67,6 +67,9 @@
"EntityHistory": "Entitätsgeschichte",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} von {2}.",
"MinutesAgo": "Vor {0} Minuten",
"HoursAgo": "Vor {0} Stunden",
"DaysAgo": "Vor {0} Tagen",
"Created": "Erstellt",
"Updated": "Aktualisiert",
"Deleted": "Gelöscht",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/en.json

@ -67,6 +67,9 @@
"EntityHistory": "Entity history",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} by {2}.",
"MinutesAgo": "{0} minutes ago",
"HoursAgo": "{0} hours ago",
"DaysAgo": "{0} days ago",
"Created": "Created",
"Updated": "Updated",
"Deleted": "Deleted",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/es.json

@ -67,6 +67,9 @@
"EntityHistory": "Historial de entidad",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} por {2}.",
"MinutesAgo": "Hace {0} minutos",
"HoursAgo": "Hace {0} horas",
"DaysAgo": "Hace {0} días",
"Created": "Creado",
"Updated": "Actualizado",
"Deleted": "Eliminado",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fi.json

@ -67,6 +67,9 @@
"EntityHistory": "Entiteettihistoria",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} kirjoittanut {2}.",
"MinutesAgo": "{0} minuuttia sitten",
"HoursAgo": "{0} tuntia sitten",
"DaysAgo": "{0} päivää sitten",
"Created": "Luotu",
"Updated": "Päivitetty",
"Deleted": "Poistettu",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/fr.json

@ -67,6 +67,9 @@
"EntityHistory": "Historique de l'entité",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} par {2}.",
"MinutesAgo": "Il y a {0} minutes",
"HoursAgo": "Il y a {0} heures",
"DaysAgo": "Il y a {0} jours",
"Created": "Créé",
"Updated": "Mise à jour",
"Deleted": "Supprimé",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hi.json

@ -67,6 +67,9 @@
"EntityHistory": "इकाई इतिहास",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} से {2}।",
"MinutesAgo": "{0} मिनट पहले",
"HoursAgo": "{0} घंटे पहले",
"DaysAgo": "{0} दिन पहले",
"Created": "बनाया था",
"Updated": "अद्यतन",
"Deleted": "हटाए गए",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hr.json

@ -67,6 +67,9 @@
"EntityHistory": "Povijest entiteta",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} od {2}.",
"MinutesAgo": "prije {0} minuta",
"HoursAgo": "prije {0} sati",
"DaysAgo": "prije {0} dana",
"Created": "Stvoreno",
"Updated": "Ažurirano",
"Deleted": "Izbrisano",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/hu.json

@ -67,6 +67,9 @@
"EntityHistory": "Entitástörténet",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1}, szerző: {2}.",
"MinutesAgo": "{0} perce",
"HoursAgo": "{0} órája",
"DaysAgo": "{0} napja",
"Created": "Létrehozva",
"Updated": "Frissítve",
"Deleted": "Törölve",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/is.json

@ -67,6 +67,9 @@
"EntityHistory": "Saga eininga",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} eftir {2}.",
"MinutesAgo": "fyrir {0} mínútum",
"HoursAgo": "fyrir {0} klukkustundum",
"DaysAgo": "fyrir {0} dögum",
"Created": "Búið til",
"Updated": "Uppfært",
"Deleted": "Eytt",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/it.json

@ -67,6 +67,9 @@
"EntityHistory": "Storia dell'entità",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} di {2}.",
"MinutesAgo": "{0} minuti fa",
"HoursAgo": "{0} ore fa",
"DaysAgo": "{0} giorni fa",
"Created": "Creato",
"Updated": "Aggiornato",
"Deleted": "Eliminato",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/nl.json

@ -67,6 +67,9 @@
"EntityHistory": "Entiteitsgeschiedenis",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} door {2}.",
"MinutesAgo": "{0} minuten geleden",
"HoursAgo": "{0} uur geleden",
"DaysAgo": "{0} dagen geleden",
"Created": "Gemaakt",
"Updated": "Bijgewerkt",
"Deleted": "Verwijderd",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pl-PL.json

@ -67,6 +67,9 @@
"EntityHistory": "Historia jednostki",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} autorstwa {2}.",
"MinutesAgo": "{0} minut temu",
"HoursAgo": "{0} godzin temu",
"DaysAgo": "{0} dni temu",
"Created": "Utworzony",
"Updated": "Zaktualizowano",
"Deleted": "Usunięto",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/pt-BR.json

@ -67,6 +67,9 @@
"EntityHistory": "História da Entidade",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} por {2}.",
"MinutesAgo": "{0} minutos atrás",
"HoursAgo": "{0} horas atrás",
"DaysAgo": "{0} dias atrás",
"Created": "Criado",
"Updated": "Atualizado",
"Deleted": "Excluído",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ro-RO.json

@ -67,6 +67,9 @@
"EntityHistory": "Istoricul entității",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} de la {2}.",
"MinutesAgo": "acum {0} minute",
"HoursAgo": "acum {0} ore",
"DaysAgo": "acum {0} zile",
"Created": "Creată",
"Updated": "Actualizat",
"Deleted": "Șters",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/ru.json

@ -67,6 +67,9 @@
"EntityHistory": "История объекта",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} от {2}.",
"MinutesAgo": "{0} минут назад",
"HoursAgo": "{0} часов назад",
"DaysAgo": "{0} дней назад",
"Created": "Созданный",
"Updated": "Обновлено",
"Deleted": "Удалено",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sk.json

@ -67,6 +67,9 @@
"EntityHistory": "História entity",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} vykonal {2}.",
"MinutesAgo": "pred {0} minútami",
"HoursAgo": "pred {0} hodinami",
"DaysAgo": "pred {0} dňami",
"Created": "Vytvorená",
"Updated": "Aktualizovaná",
"Deleted": "Zmazaná",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sl.json

@ -67,6 +67,9 @@
"EntityHistory": "Zgodovina entitete",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} avtorja {2}.",
"MinutesAgo": "pred {0} minutami",
"HoursAgo": "pred {0} urami",
"DaysAgo": "pred {0} dnevi",
"Created": "Ustvarjeno",
"Updated": "Posodobljeno",
"Deleted": "Izbrisano",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json

@ -67,6 +67,9 @@
"EntityHistory": "Enhetens historia",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} av {2}.",
"MinutesAgo": "{0} minuter sedan",
"HoursAgo": "{0} timmar sedan",
"DaysAgo": "{0} dagar sedan",
"Created": "Skapad",
"Updated": "Uppdaterad",
"Deleted": "Borttagen",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/tr.json

@ -66,6 +66,9 @@
"EntityHistory": "Entity Geçmişi",
"DaysAgoTitle": "{1} {0}.",
"DaysAgoWithUserTitle": "{1} {2} tarafından {0}.",
"MinutesAgo": "{0} dakika önce",
"HoursAgo": "{0} saat önce",
"DaysAgo": "{0} gün önce",
"Created": "Oluşturuldu",
"Updated": "Güncellendi",
"Deleted": "Silindi",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/vi.json

@ -67,6 +67,9 @@
"EntityHistory": "Lịch sử thực thể",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} của {2}.",
"MinutesAgo": "{0} phút trước",
"HoursAgo": "{0} giờ trước",
"DaysAgo": "{0} ngày trước",
"Created": "Tạo",
"Updated": "Đã cập nhật",
"Deleted": "Đã xóa",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json

@ -67,6 +67,9 @@
"EntityHistory": "实体历史",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} by {2}。",
"MinutesAgo": "{0}分钟前",
"HoursAgo": "{0}小时前",
"DaysAgo": "{0}天前",
"Created": "创建",
"Updated": "已更新",
"Deleted": "已删除",

3
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hant.json

@ -67,6 +67,9 @@
"EntityHistory": "實體歷史",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} 通過 {2}.",
"MinutesAgo": "{0}分鐘前",
"HoursAgo": "{0}小時前",
"DaysAgo": "{0}天前",
"Created": "建立",
"Updated": "更新",
"Deleted": "已刪除",

6
modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json

@ -3,8 +3,8 @@
"name": "asp.net",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "~9.1.0-rc.2",
"@abp/prismjs": "~9.1.0-rc.2",
"@abp/highlight.js": "~9.1.0-rc.2"
"@abp/aspnetcore.mvc.ui.theme.shared": "~9.1.0",
"@abp/prismjs": "~9.1.0",
"@abp/highlight.js": "~9.1.0"
}
}

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

Loading…
Cancel
Save