Browse Source

Merge branch 'dev' into EngincanV/release-post-8.3

pull/20367/head
Engincan VESKE 2 years ago
parent
commit
580dfbf40c
  1. 6
      Directory.Packages.props
  2. 18
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/sv.json
  3. 640
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sv.json
  4. 256
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/sv.json
  5. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/sv.json
  6. 1215
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sv.json
  7. 269
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/sv.json
  8. 9
      abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/sv.json
  9. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/sv.json
  10. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
  11. 1828
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/sv.json
  12. 39
      docs/en/cli/index.md
  13. 5
      docs/en/docs-nav.json
  14. 506
      docs/en/guides/migrating-from-open-source.md
  15. BIN
      docs/en/images/docs-referencing.png
  16. BIN
      docs/en/images/studio-upgrade-to-pro.png
  17. 4
      docs/en/modules/account/authority-delegation.md
  18. 54
      docs/en/modules/docs.md
  19. 11
      docs/en/modules/openiddict-pro.md
  20. 11
      docs/en/modules/openiddict.md
  21. 15
      docs/en/release-info/release-notes.md
  22. 24
      docs/en/release-info/road-map.md
  23. 1
      docs/en/studio/solution-explorer.md
  24. BIN
      docs/en/tutorials/book-store/images/blazor-add-books-component-client.png
  25. 18
      docs/en/tutorials/book-store/overview.md
  26. 42
      docs/en/tutorials/book-store/part-01.md
  27. 46
      docs/en/tutorials/book-store/part-02.md
  28. 38
      docs/en/tutorials/book-store/part-03.md
  29. 38
      docs/en/tutorials/book-store/part-04.md
  30. 38
      docs/en/tutorials/book-store/part-05.md
  31. 30
      docs/en/tutorials/book-store/part-06.md
  32. 30
      docs/en/tutorials/book-store/part-07.md
  33. 30
      docs/en/tutorials/book-store/part-08.md
  34. 32
      docs/en/tutorials/book-store/part-09.md
  35. 30
      docs/en/tutorials/book-store/part-10.md
  36. 5
      framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs
  37. 13
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/ScriptTagHelper.cs
  38. 13
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/sv.json
  39. 10
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/sv.json
  40. 8
      framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor
  41. 6
      framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/sv.json
  42. 25
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Localization/sv.json
  43. 2
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
  44. 7
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs
  45. 29
      framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/ExceptionHandling/Localization/sv.json
  46. 8
      framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/sv.json
  47. 6
      framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/Localization/sv.json
  48. 19
      framework/src/Volo.Abp.Ldap.Abstractions/Volo/Abp/Ldap/Localization/sv.json
  49. 7
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/sv.json
  50. 9
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/Localization/sv.json
  51. 2
      framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/HasExtraPropertiesExtensions.cs
  52. 7
      framework/src/Volo.Abp.Timing/Volo/Abp/Timing/Localization/sv.json
  53. 6
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Localization/Resource/sv.json
  54. 64
      framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sv.json
  55. 39
      framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/sv.json
  56. 10
      framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/sv.json
  57. 6
      framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/sv.json
  58. 24
      framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs
  59. 6
      framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/Localization/sv.json
  60. BIN
      framework/test/Volo.Abp.Imaging.Abstractions.Tests/Volo/Abp/Imaging/Files/abp.webp
  61. 7
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/sv.json
  62. 12
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/sv.json
  63. 16
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/sv.json
  64. 6
      framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/sv.json
  65. 7
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/Localization/sv.json
  66. 2
      latest-versions.json
  67. 73
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/sv.json
  68. 98
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/sv.json
  69. 6
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/Localization/sv.json
  70. 92
      modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/sv.json
  71. 4
      modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml.cs
  72. 259
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sv.json
  73. 10
      modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/sv.json
  74. 62
      modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sv.json
  75. 8
      modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/ProjectDto.cs
  76. 18
      modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs
  77. 17
      modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Edit.cshtml.cs
  78. 8
      modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/ProjectDto.cs
  79. 39
      modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs
  80. 19
      modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs
  81. 7
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/FileSystem/Projects/ProjectFileSystemExtensions.cs
  82. 17
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentSource.cs
  83. 16
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs
  84. 48
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/sv.json
  85. 236
      modules/docs/src/Volo.Docs.Web/HtmlConverting/ScribanDocumentSectionRenderer.cs
  86. 2
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs
  87. 55
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs
  88. 19
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Search.cshtml.cs
  89. 17
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/sv.json
  90. 132
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sv.json
  91. 7
      modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/LocalizationExtensions/sv.json
  92. 16
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sv.json
  93. 15
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sv.json
  94. 2
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/OpenIddictAuthorization.cs
  95. 4
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Tokens/OpenIddictToken.cs
  96. 11
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sv.json
  97. 38
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json
  98. 23
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sv.json
  99. 14
      modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/sv.json
  100. 6
      npm/ng-packs/package.json

6
Directory.Packages.props

@ -6,7 +6,7 @@
<PackageVersion Include="AlibabaCloud.SDK.Dysmsapi20170525" Version="2.0.24" />
<PackageVersion Include="aliyun-net-sdk-sts" Version="3.1.2" />
<PackageVersion Include="Aliyun.OSS.SDK.NetCore" Version="2.13.0" />
<PackageVersion Include="AsyncKeyedLock" Version="6.3.4" />
<PackageVersion Include="AsyncKeyedLock" Version="7.0.0" />
<PackageVersion Include="Autofac" Version="8.0.0" />
<PackageVersion Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" />
<PackageVersion Include="Autofac.Extras.DynamicProxy" Version="7.1.0" />
@ -48,7 +48,7 @@
<PackageVersion Include="LdapForNet" Version="2.7.15" />
<PackageVersion Include="LibGit2Sharp" Version="0.28.0" />
<PackageVersion Include="Magick.NET-Q16-AnyCPU" Version="13.4.0" />
<PackageVersion Include="MailKit" Version="4.3.0" />
<PackageVersion Include="MailKit" Version="4.7.1.1" />
<PackageVersion Include="Markdig.Signed" Version="0.37.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.4" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="8.0.4" />
@ -163,7 +163,7 @@
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
<PackageVersion Include="System.Text.Encoding.CodePages" Version="8.0.0" />
<PackageVersion Include="System.Text.Encodings.Web" Version="8.0.0" />
<PackageVersion Include="System.Text.Json" Version="8.0.0" />
<PackageVersion Include="System.Text.Json" Version="8.0.4" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="7.5.1" />
<PackageVersion Include="TimeZoneConverter" Version="6.1.0" />
<PackageVersion Include="Unidecode.NET" Version="2.1.0" />

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

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

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

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

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

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

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

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

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

File diff suppressed because it is too large

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

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

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

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

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

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

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

@ -476,7 +476,7 @@
"GenderRequired": "The Gender field is required.",
"LeaveUsReview": "Leave us review",
"ABPVideoCoursesDescription": "Learn fundamental concepts and usage of ABP Framework in this video course series. Ideal for newbies!",
"ABPVideoCoursesPageDescription": "Learn the basics of the ABP Framework through video courses created by the ABP team. In this video series, you will learn the essential topics of the ABP Framework. The numbers on each video are written according to the learning flow.",
"ABPVideoCoursesPageDescription": "In this video series, you will learn the key topics of the ABP Framework through videos prepared by the ABP Team.",
"DocumentationButtonTitle": "Documentation",
"ABPVideoCoursesTitle": "Essentials Videos",
"LovedDevelopers": "Loved by thousands of <span class=\"gradient-framework\">developers</span><br> around the world",
@ -534,7 +534,7 @@
"CommercialLicenses": "Commercial Licenses",
"WhatIsDifferencePaidLicenses": "What is the difference between a personal license and other types of paid licenses?",
"DifferencePaidLicenseExplanation1": "A non-personal paid license is the standard licensing option for enterprises and commercial entities. Licenses are purchased by the company and can be used by anyone within the organization.",
"DifferencePaidLicenseExplanation2": "Personal License; on the other hand, is a type of license for private individuals/freelancers/independent developers who purchase licenses with their own funds and solely for their own use. The Personal License has some limitations. In this plan, there can only be 1 developer working on the ABP project and no additional developers are allowed to be added later to the project. Downloading the source-code of PRO modules is not allowed in the personal license plan. Also, there is no microservice template and tier (layered) architecture in this plan. Personal License holders can only use the following modules: Account, Audit Log UI, GDPR, Identity, Language Management, LeptonX PRO, OpenIddict UI and SaaS. Personal License holders cannot use the following modules: Chat, CMS-Kit PRO, Forms, Identity Server User Interface, Lepton Theme, Text Template Management and Twilio SMS. You can access the full module list at <a href=\"/modules\">abp.io/modules</a>.",
"DifferencePaidLicenseExplanation2": "Personal License; on the other hand, is a type of license for private individuals/freelancers/independent developers who purchase licenses with their own funds and solely for their own use. The Personal License has some limitations. In this plan, there can only be 1 developer working on the ABP project and no additional developers are allowed to be added later to the project. Downloading the source-code of PRO modules is not allowed in the personal license plan. Also, there is no microservice template and tier (layered) architecture in this plan. Personal License holders can only use the following modules: Account, Audit Log UI, GDPR, Identity, Language Management, LeptonX PRO, OpenIddict UI and SaaS. Personal License holders cannot use the following modules: Chat, CMS-Kit PRO, Forms, Identity Server User Interface, Lepton Theme, Text Template Management, File Management and Twilio SMS. You can access the full module list at <a href=\"/modules\">abp.io/modules</a>.",
"ReadyToStart": "Ready to start?",
"TransformYourIdeasIntoRealityWithOurProfessionalNETDevelopmentServices": "Transform your ideas into reality with our professional .NET development services.",
"ReadyToUpgrade": "Ready to upgrade?",

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

File diff suppressed because it is too large

39
docs/en/cli/index.md

@ -3,6 +3,8 @@
ABP CLI (Command Line Interface) is a command line tool to perform some common operations for ABP based solutions or ABP Studio features.
> 🛈 With **v8.2+**, the old/legacy ABP CLI has been replaced with a new CLI system to align with the new templating system and [ABP Studio](../studio/index.md). The new ABP CLI commands are explained in this documentation. However, if you want to learn more about the differences between the old and new CLIs, want to learn the reason for the change, or need guidance to use the old ABP CLI, please refer to the [Old vs New CLI](differences-between-old-and-new-cli.md) documentation.
>
> You may need to remove the Old CLI before installing the New CLI, by running the following command: `dotnet tool uninstall -g Volo.Abp.Cli`
## Installation
@ -22,8 +24,10 @@ dotnet tool update -g Volo.Abp.Studio.Cli
While each command may have a set of options, there are some global options that can be used with any command;
* `--skip-cli-version-check`: Skips to check the latest version of the ABP CLI. If you don't specify, it will check the latest version and shows a warning message if there is a newer version of the ABP CLI.
* `--skip-cli-version-check` or `-scvc`: Skips to check the latest version of the ABP CLI. If you don't specify, it will check the latest version and shows a warning message if there is a newer version of the ABP CLI.
- `--skip-extension-version-check` or `-sevc`: Skips to check the latest version of the ABP CLI extensions. If you don't specify, it will check the latest version and download the latest version if there is a newer version of the ABP CLI extensions.
* `--old`: ABP CLI has two variations: `Volo.Abp.Studio.Cli` and `Volo.Abp.Cli`. New features/templates are added to the `Volo.Abp.Studio.Cli`. But if you want to use the old version, you can use this option **at the end of your commands**. For example, `abp new Acme.BookStore --old`.
* `--help` or `-h`: Shows help for the specified command.
## Commands
@ -64,6 +68,8 @@ Here, is the list of all available commands before explaining their details:
* **`bundle`**: Generates script and style references for ABP Blazor and MAUI Blazor project.
* **`install-libs`**: Install NPM Packages for MVC / Razor Pages and Blazor Server UI types.
* **`clear-download-cache`**: Clears the templates download cache.
* **`check-extensions`**: Checks the latest version of the ABP CLI extensions.
* **`install-old-cli`**: Installs old ABP CLI.
### help
@ -127,7 +133,7 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md
* `--template` or `-t`: Specifies the template name. Default template name is `app`, which generates a application solution. Available templates:
* **`empty`**: Empty solution template.
* **`app`**: Application template. Additional options:
* `--ui` or `-u`: Specifies the UI framework. Default framework is `mvc`. Available frameworks:
* `--ui-framework` or `-u`: Specifies the UI framework. Default framework is `mvc`. Available frameworks:
* `mvc`: ASP.NET Core MVC. There are some additional options for this template:
* `--tiered`: Creates a tiered solution where Web and Http API layers are physically separated. If not specified, it creates a layered solution which is less complex and suitable for most scenarios. (*Available for* ***Team*** *or higher licenses*)
* `angular`: Angular UI. There are some additional options for this template:
@ -158,7 +164,7 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md
* `basic`: Basic Theme.
* `--use-open-source-template`or `-uost`: Uses the open-source template. (*Available for* ***Team*** *or higher licenses*)
* **`app-nolayers`**: Single-layer application template. Additional options:
* `--ui` or `-u`: Specifies the UI framework. Default framework is `mvc`. Available frameworks:
* `--ui-framework` or `-u`: Specifies the UI framework. Default framework is `mvc`. Available frameworks:
* `mvc`: ASP.NET Core MVC. There are some additional options for this template:
* `angular`: Angular UI. There are some additional options for this template:
* `blazor`: Blazor UI. There are some additional options for this template:
@ -174,7 +180,7 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md
* `basic`: Basic Theme.
* `--use-open-source-template`or `-uost`: Uses the open-source template. (*Available for* ***Team*** *or higher licenses*)
* **`microservice`**: Microservice solution template (*Available for* ***Business*** *or higher licenses*). Additional options:
* `--ui` or `-u`: Specifies the UI framework. Default framework is `mvc`. Available frameworks:
* `--ui-framework` or `-u`: Specifies the UI framework. Default framework is `mvc`. Available frameworks:
* `mvc`: ASP.NET Core MVC. There are some additional options for this template:
* `angular`: Angular UI. There are some additional options for this template:
* `blazor`: Blazor UI. There are some additional options for this template:
@ -776,6 +782,7 @@ abp switch-to-local --paths "D:\Github\abp|D:\Github\my-repo"
### upgrade
Upgrades the ABP modules to pro modules, such as upgrading [Identity](../modules/identity.md) to [Identity Pro](../modules/identity-pro.md). You can use this for [Single Layer Web Application](../solution-templates/single-layer-web-application/index.md) and [Layered Web Application](../solution-templates/layered-web-application/index.md) templates.
This command is specially designed for users who already started their development before having a license. Therefore this command requires license.
Usage:
@ -919,6 +926,30 @@ abp install-libs [options]
* ```--working-directory``` or ```-wd```: Specifies the working directory. This option is useful when executing directory doesn't contain a project file.
### check-extensions
This command checks the installed ABP CLI extensions and updates them if necessary.
Usage:
````bash
abp check-extensions
````
### install-old-cli
This command installs the old ABP CLI with a specific version if it's specified. Otherwise, it installs the old ABP CLI with the latest stable version. Then, [you can directly use the old ABP CLI by simply passing the `--old` parameter at the end of the command or using the `abp-old` as the executing command](./differences-between-old-and-new-cli.md#using-the-old-abp-cli).
Usage:
```bash
abp install-old-cli [options]
```
#### Options
* ```--version``` or ```-v```: Specifies the version for ABP CLI to be installed.
## See Also
* [Examples for the new command](./new-command-samples.md)

5
docs/en/docs-nav.json

@ -58,8 +58,11 @@
},
{
"text": "Book Store application",
"path": "tutorials/book-store/index.md",
"items": [
{
"text": "Overview",
"path": "tutorials/book-store/overview.md"
},
{
"text": "1: Creating the server side",
"path": "tutorials/book-store/part-01.md"

506
docs/en/guides/migrating-from-open-source.md

@ -1,483 +1,57 @@
# Migrating from Open Source Templates
````json
//[doc-params]
{
"DB": ["EF", "Mongo"]
}
````
ABP Studio provides a way for users, who already started the development before purchasing a license, to auto-upgrade their solutions with Pro modules. You can use this functionality through ABP Studio UI or ABP Studio CLI:
This guide provides you a step-by-step guidance to migrating your existing application (that uses the ABP) to ABP. Since ABP uses the main structure of the ABP and is built on top of that, this process is pretty straightforward, you can apply the steps mentioned in each step and easily migrate your project to ABP.
* A new button labeled `Upgrade to Pro` will be visible if you have a license but the current solution is created with open-source (free) license.
> After following this documentation, you should be able to migrate your project to ABP. However, if you have any problems or cannot migrate your project, we are providing paid consultancy, which you can find details at [https://abp.io/additional-services](https://abp.io/additional-services). On this page, you can find related pieces of information about our trainings, custom project development, and porting existing projects services, and you can fill-out the contact form, so we can reach out to you.
![upgrade-to-pro](../images/studio-upgrade-to-pro.png)
## ABP Migration Steps
* Alternatively, you can use the following ABP Studio CLI command to achieve the same functionality:
In this guide, we assume that you have a middle-complex ABP based solution and want to migrate to ABP. Throughout this documentation, `Acme.BookStore` application will be used as a reference solution (example application that is described in ABP's tutorial documents){{if DB == "EF"}}, which you can find at [https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore){{end}} but all of these steps are applicable for your own applications, only some of them can be changed according to your project choose and structure. However, the migration flow is the same.
```bash
abp upgrade [-t <template-name>]
Examples:
abp upgrade -t app
abp upgrade -t app-nolayers
```
There are 4 main steps to migrating from ABP to ABP, and each one of them is explained in the following sections, step-by-step and project-based:
## Changes in the solution
### 1. License Transition
### Module changes
The first step is to obtain the necessary license for ABP to be able to get the benefit of the pro modules and unlock the additional features. To do that, you should first get your `ApiKey` from the [organization's detail page](https://abp.io/my-organizations).
This command will remove the following modules from your solution:
You can update the **NuGet.Config** file in the root directory of your solution and add the *packageSource* as follows (don't forget to replace `<api-key>` placeholder):
- Volo.Abp.Account
- Volo.Abp.Identity
- Volo.Abp.TenantManagement
- Volo.Abp.LeptonXLiteTheme
```diff
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
+ <add key="ABP NuGet Source" value="https://nuget.abp.io/<api-key>/v3/index.json" />
</packageSources>
</configuration>
```
And install the following modules to your solution:
After that, you can obtain an `AbpLicenseCode` by creating a startup template and copying the code from the `appsettings.secrets.json` file. Then, you can open the `appsettings.secrets.json` files under the `*.DbMigrator` and `*.Domain` projects and add your `AbpLicenseCode`:
- Volo.Abp.Account.Pro
- Volo.Abp.AuditLogging.Pro
- Volo.Abp.Identity.Pro
- Volo.Abp.OpenIddict.Pro
- Volo.Saas
- Volo.Abp.LanguageManagement
- Volo.Abp.TextTemplateManagement
- Volo.FileManagement
- Volo.Chat
- Volo.Abp.Gdpr
- Volo.Abp.LeptonXTheme
```json
{
//...
"AbpLicenseCode": "<AbpLicenseCode>"
}
### Other changes
```
The command will also do the following changes in your solution:
> `ApiKey` is needed to be able to use ABP's NuGet packages and `AbpLicenseCode` is needed for license checks per module.
- It will add `nuget.abp.io` NuGet source to `NuGet.config` file.
- It will create or update `appsettings.secrets.json` files to place the license key needed for Pro module usage.
- It will update the database. (And it will create a new migration if the solution uses EntityFramework Core)
- It will run `install-libs` command at the end.
### 2. Installing the ABP Modules
## Things to pay attention before using
After, you have added the `ApiKey` and `AbpLicenseCode` to the relevant places, now you can add [ABP's modules](../modules) to your solution. ABP provides plenty of modules that extend the ABP modules, such as the `Account Pro` module over the `Account` module or the `Identity Pro` module over the `Identity` module.
To replace these modules and also add the additional modules provided by ABP, you can use the `abp add-module` command (and then remove the free modules as described in the next section). This command finds all packages of the specified module, finds the related projects in the solution, and adds each package to the corresponding project in the solution. Therefore, by using this command, you don't need to manually add the package references to the `*.csproj` files and add related `[DependsOn(typeof(<>))]` statements to the module classes, instead, this command does this on behalf of you.
You can run the following commands one after another in your solution directory and add all the related modules into your solution as you would have started with [one of the startup templates of ABP](../solution-templates):
1. `abp add-module Volo.Identity.Pro --skip-db-migrations` → [Identity Module](../modules/identity.md)
2. `abp add-module Volo.OpenIddict.Pro --skip-db-migrations` → [OpenIddict Module](../modules/openiddict.md)
3. `abp add-module Volo.Saas --skip-db-migrations` → [SaaS Module](../modules/saas.md)
4. `abp add-module Volo.AuditLogging.Ui --skip-db-migrations` → [Audit Logging UI Module](../modules/audit-logging.md)
5. `abp add-module Volo.Account.Pro --skip-db-migrations` → [Account Module](../modules/account.md)
6. `abp add-module Volo.TextTemplateManagement --skip-db-migrations` → [Text Template Management Module](../modules/text-template-management.md)
7. `abp add-module Volo.LanguageManagement --skip-db-migrations` → [Language Management Module](../modules/language-management.md)
8. `abp add-module Volo.Gdpr --skip-db-migrations` → [GDPR Module](../modules/gdpr.md)
9. `abp add-module Volo.Abp.BlobStoring.Database --skip-db-migrations` → [Blob Storing - Database Provider](../framework/infrastructure/blob-storing/database.md)
> These 9 modules are pre-installed on the [startup templates of ABP](../solution-templates). Therefore, you can install all of them if you want to align your project with the startup templates, but it's totally optional, so you can skip running the command above for a module that you don't want to add to your solution.
After running the commands above, all of the related commercial packages and their dependencies will be added to your solution. In addition to these module packages, you can add `Volo.Abp.Commercial.SuiteTemplates` package into your domain application to be able to use ABP Suite later on. By doing that you will be able to add your solution from [ABP Suite UI](../suite) and generate CRUD pages for your applications whenever you want.
So, open your `*Domain.csproj` file and add the line below (don't forget to replace the `<Version>` placeholder):
```xml
<PackageReference Include="Volo.Abp.Commercial.SuiteTemplates" Version="<Version>" />
```
Then, for the final step, you need to add the related `DependsOn` statement to the `*DomainModule.cs` file as follows:
```cs
using Volo.Abp.Commercial.SuiteTemplates;
// ...
[DependsOn(typeof(VoloAbpCommercialSuiteTemplatesModule))]
public class BookStoreDomainModule : AbpModule
{
//omited for code abbreviation...
}
```
### 3. Removing the ABP Module References & Updating Configurations
After the license transition and installing the ABP Modules, now you can remove the unnecessary free modules. For example, now you don't need the `Identity` module in your solution, because you have added the `Identity PRO` module in the previous section and it already has dependency on the free module and extends it.
You should remove various dependencies and references in different projects in your solution. All of the required changes are listed below in different sections, please apply the following steps to remove the unnecessary ABP Modules:
#### 3.1 - Domain.Shared Project
Remove the unnecessary references from the `*Domain.Shared.csproj`:
```diff
- <PackageReference Include="Volo.Abp.Identity.Domain.Shared" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.TenantManagement.Domain.Shared" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.OpenIddict.Domain.Shared" Version="8.0.4" />
```
Remove the unnecessary namespaces, and **DependsOn** statements from `*DomainSharedModule.cs`:
```diff
- using Volo.Abp.TenantManagement;
- typeof(AbpIdentityDomainSharedModule),
- typeof(AbpOpenIddictDomainSharedModule),
- typeof(AbpTenantManagementDomainSharedModule)
```
#### 3.2 - Domain Project
Remove the unnecessary references from the `*Domain.csproj`:
```diff
- <PackageReference Include="Volo.Abp.Identity.Domain" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.TenantManagement.Domain" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.OpenIddict.Domain" Version="8.0.4" />
```
Remove the unnecessary namespaces, and **DependsOn** statements from `*DomainModule.cs`:
```diff
- using Volo.Abp.TenantManagement;
- typeof(AbpIdentityDomainModule),
- typeof(AbpOpenIddictDomainModule),
- typeof(AbpTenantManagementDomainModule),
```
After removing the unnecessary references, we should update the namespaces in the `BookStoreDbMigrationService` class under the **Data** folder:
```diff
- using Volo.Abp.TenantManagement;
+ using Volo.Saas.Tenants;
```
{{ if DB == "EF" }}
#### 3.3 - EntityFrameworkCore Project
Remove the unnecessary references from the `*EntityFrameworkCore.csproj`:
```diff
- <PackageReference Include="Volo.Abp.Identity.EntityFrameworkCore" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.TenantManagement.EntityFrameworkCore" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.OpenIddict.EntityFrameworkCore" Version="8.0.4" />
```
Remove the unnecessary namespaces from `*EntityFrameworkCoreModule.cs`:
```diff
- using Volo.Abp.TenantManagement.EntityFrameworkCore;
- typeof(AbpIdentityEntityFrameworkCoreModule),
- typeof(AbpOpenIddictEntityFrameworkCoreModule),
- typeof(AbpTenantManagementEntityFrameworkCoreModule)
```
Then, update the`*DbContext.cs` and make the related configurations:
```diff
- using Volo.Abp.TenantManagement;
- using Volo.Abp.TenantManagement.EntityFrameworkCore;
+ using Volo.Saas.Editions;
+ using Volo.Saas.EntityFrameworkCore;
+ using Volo.Saas.Tenants;
+ using Volo.Abp.LanguageManagement.EntityFrameworkCore;
[ReplaceDbContext(typeof(IIdentityDbContext))]
- [ReplaceDbContext(typeof(ITenantManagementDbContext))]
+ [ReplaceDbContext(typeof(ISaasDbContext))]
[ConnectionStringName("Default")]
public class BookStoreDbContext :
AbpDbContext<BookStoreDbContext>,
IIdentityDbContext,
- ITenantManagementDbContext
+ ISaasDbContext
{
//...
- // Tenant Management
- public DbSet<Tenant> Tenants { get; set; }
- public DbSet<TenantConnectionString> TenantConnectionStrings { get; set; }
+ // SaaS
+ public DbSet<Tenant> Tenants { get; set; }
+ public DbSet<Edition> Editions { get; set; }
+ public DbSet<TenantConnectionString> TenantConnectionStrings { get; set; }
//...
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
//...
- builder.ConfigureIdentity();
+ builder.ConfigureIdentityPro();
- builder.ConfigureOpenIddict();
+ builder.ConfigureOpenIddictPro();
- builder.ConfigureTenantManagement();
+ builder.ConfigureSaas();
+ builder.ConfigureLanguageManagement();
}
}
```
{{ else }}
#### 3.3 - MongoDB Project
Remove the unnecessary references from the `*MongoDb.csproj`:
```diff
- <PackageReference Include="Volo.Abp.Identity.MongoDb" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.TenantManagement.MongoDb" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.OpenIddict.MongoDb" Version="8.0.4" />
```
Remove the unnecessary namespaces from `*MongoDbModule.cs`:
```diff
- using Volo.Abp.TenantManagement.MongoDb;
- typeof(AbpIdentityMongoDbModule),
- typeof(AbpOpenIddictMongoDbModule),
- typeof(AbpTenantManagementMongoDbModule)
```
{{ end }}
#### 3.4 - Application.Contracts Project
Remove the unnecessary references from the `*Application.Contracts.csproj`:
```diff
- <PackageReference Include="Volo.Abp.Account.Application.Contracts" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.Identity.Application.Contracts" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.TenantManagement.Application.Contracts" Version="8.0.4" />
```
Remove the unnecessary namespaces, and **DependsOn** statements from `*ApplicationContractsModule.cs`:
```diff
- using Volo.Abp.TenantManagement;
- typeof(AbpAccountApplicationContractsModule),
- typeof(AbpTenantManagementApplicationContractsModule),
```
#### 3.5 - Application Project
Remove the unnecessary references from the `*Application.csproj`:
```diff
- <PackageReference Include="Volo.Abp.Account.Application" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.Identity.Application" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.TenantManagement.Application" Version="8.0.4" />
```
Remove the unnecessary namespaces, and **DependsOn** statements from `*ApplicationModule.cs`:
```diff
- using Volo.Abp.TenantManagement;
- typeof(AbpAccountApplicationModule),
- typeof(AbpTenantManagementApplicationModule),
```
#### 3.6 - HttpApi Project
Remove the unnecessary references from the `*HttpApi.csproj`:
```diff
- <PackageReference Include="Volo.Abp.Account.HttpApi" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.Identity.HttpApi" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.TenantManagement.HttpApi" Version="8.0.4" />
```
Remove the unnecessary namespaces, and **DependsOn** statements from `*HttpApiModule.cs`:
```diff
- using Volo.Abp.TenantManagement;
- typeof(AbpAccountHttpApiModule),
- typeof(AbpTenantManagementHttpApiModule),
```
#### 3.7 - HttpApi.Client Project
Remove the unnecessary references from the `*HttpApi.Client.csproj`:
```diff
- <PackageReference Include="Volo.Abp.Account.HttpApi.Client" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.Identity.HttpApi.Client" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.TenantManagement.HttpApi.Client" Version="8.0.4" />
```
Remove the unnecessary namespaces, and **DependsOn** statements from `*HttpApiClientModule.cs`:
```diff
- using Volo.Abp.TenantManagement;
- typeof(AbpAccountHttpApiClientModule),
- typeof(AbpTenantManagementHttpApiClientModule),
```
#### 3.8 - Web Project
Remove the unnecessary references from the `*Web.csproj`:
```diff
- <PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite" Version="3.0.*-*" />
+ <PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX" Version="3.0.*-*" />
- <PackageReference Include="Volo.Abp.Identity.Web" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.TenantManagement.Web" Version="8.0.4" />
- <PackageReference Include="Volo.Abp.Account.Web.OpenIddict" Version="8.0.4" />
+ <PackageReference Include="Volo.Abp.Account.Pro.Public.Web.OpenIddict" Version="8.0.4" />
```
> Notice, that you have also changed the LeptonXLite theme reference with the [LeptonX Theme](../ui-themes/lepton-x), which is a commercial theme provided by ABP and has superior features to the LeptonX Lite theme.
Update namespaces for the `*WebModule.cs`:
```diff
- using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite;
- using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling;
+ using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX;
+ using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling;
- using Volo.Abp.TenantManagement.Web;
+ using Volo.Abp.Gdpr.Web.Extensions;
+ using Volo.Abp.LeptonX.Shared;
+ using Volo.Abp.PermissionManagement;
```
Then, we can update the configurations and add missing middlewares to the request pipeline in the same file, as follows:
```diff
- typeof(AbpAccountWebOpenIddictModule),
+ typeof(AbpAccountPublicWebOpenIddictModule),
- typeof(AbpTenantManagementWebModule),
- typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule),
+ typeof(AbpAspNetCoreMvcUiLeptonXThemeModule),
public override void ConfigureServices(ServiceConfigurationContext context)
{
//other configurations...
+ context.Services.AddAbpCookieConsent(options =>
+ {
+ options.IsEnabled = true;
+ options.CookiePolicyUrl = "/CookiePolicy";
+ options.PrivacyPolicyUrl = "/PrivacyPolicy";
+ });
+ Configure<LeptonXThemeOptions>(options =>
+ {
+ options.DefaultStyle = LeptonXStyleNames.System;
+ });
+ Configure<LeptonXThemeMvcOptions>(options =>
+ {
+ options.ApplicationLayout = LeptonXMvcLayouts.SideMenu;
+ });
+ Configure<PermissionManagementOptions>(options =>
+ {
+ options.IsDynamicPermissionStoreEnabled = true;
+ });
}
//...
Configure<AbpBundlingOptions>(options =>
{
options.StyleBundles.Configure(
- LeptonXLiteThemeBundles.Styles.Global,
+ LeptonXThemeBundles.Styles.Global,
bundle =>
{
bundle.AddFiles("/global-styles.css");
}
);
});
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
//...
+ app.UseAbpCookieConsent();
app.UseCorrelationId();
+ app.UseAbpSecurityHeaders();
app.UseStaticFiles();
//...
}
```
> **Note:** In the startup templates of ABP, besides these configurations, there are some additional configurations, such as [configuring impersonation](../modules/account/impersonation.md), [configuring external providers](https://docs.abp.io/en/abp/latest/Modules/Account#configure-the-provider), and configuring health checks. These configurations are optional, and for the sake of simplicity, in this documentation, we did not mention them. You can apply the related configurations by checking the related documentation and from the default startup templates.
Update the namespaces in the `BookStoreMenuContributor` file as follows:
```diff
- using Volo.Abp.TenantManagement.Web.Navigation;
+ using Volo.Abp.TextTemplateManagement.Web.Navigation;
+ using Volo.Abp.AuditLogging.Web.Navigation;
+ using Volo.Abp.LanguageManagement.Navigation;
+ using Volo.Abp.OpenIddict.Pro.Web.Menus;
```
Then, we can update the `ConfigureMainMenuAsync` method in this file to specify the order of the menu items:
```csharp
private Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{
//other configurations for menu items...
//Administration
var administration = context.Menu.GetAdministration();
administration.Order = 5;
//Administration->Identity
administration.SetSubItemOrder(IdentityMenuNames.GroupName, 1);
//Administration->OpenIddict
administration.SetSubItemOrder(OpenIddictProMenus.GroupName, 2);
//Administration->Language Management
administration.SetSubItemOrder(LanguageManagementMenuNames.GroupName, 3);
//Administration->Text Template Management
administration.SetSubItemOrder(TextTemplateManagementMainMenuNames.GroupName, 4);
//Administration->Audit Logs
administration.SetSubItemOrder(AbpAuditLoggingMainMenuNames.GroupName, 5);
//Administration->Settings
administration.SetSubItemOrder(SettingManagementMenuNames.GroupName, 6);
return Task.CompletedTask;
}
```
Replace LeptonX Lite npm package with LeptonX package in `package.json` file:
```diff
- "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~3.0.3",
+ "@volo/abp.aspnetcore.mvc.ui.theme.leptonx": "~3.0.3",
```
### 4. Creating Migrations & Running Application
That's it, you have applied the all related steps to migrate your application from ABP to ABP. Now, you can create a new migration, apply it to your database, and run your application!
To create a new migration, open a terminal in your {{ if DB == "EF" }}`*.EntityFrameworkCore`{{else}}`*.MongoDb`{{end}} project directory, and run the following command:
```bash
dotnet ef migrations add Migrated_To_ABP_Commercial
```
Then, to apply the database into your database and seed the initial data, you can run the `*.DbMigrator` project. After it's completed, you can run the `*.Web` project to see your application as working.
> **Note:** If you have an existing database, then creating a new migration and applying it to the database may not happen correctly. At that point, if it's possible you can drop the existing database and create a new one, or you can have a backup of your existing db, and after applying the new migration, you can synchronize the database with the backup.
## Consultancy
If you find the migration process challenging or prefer professional assistance, we offer a [paid consultancy service](https://abp.io/additional-services). Our experienced consultants can help ensure a smooth transition to ABP, addressing any specific needs or challenges your project may encounter. For detailed guidance and support, feel free to [reach out](https://abp.io/contact).
- The command covers the most common scenarios, but there is still a possibility that it can mess up something in your solution. Therefore, we strongly recommend a version control system (like [Git](https://git-scm.com)) to track what is changed in your solution and revert if needed.
- The command will not remove your custom codes that may be related with the removed modules listed above. So there may be build errors if you referenced one of those modules. You can clear them manually.

BIN
docs/en/images/docs-referencing.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
docs/en/images/studio-upgrade-to-pro.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

4
docs/en/modules/account/authority-delegation.md

@ -77,6 +77,8 @@ You can click the `Delegate New User` button to delegate a new user:
* You can specify a time range to ensure the delegation is only available within the time range.
* You can make multiple delegates to the same user and set different delegate time ranges.
> You have to enter the full username to query and delegate a user.
> The delegation has three states: `Expired`, `Active`, and `Future`. These states are set automatically by checking the specified time interval.
### My delegated users
@ -87,4 +89,4 @@ You can see a list of users who delegated you to login on their behalf of them,
You can click the `Login` button to log in to the application as a delegated user and go back to your account by clicking the `Back to my account` icon:
![account-pro-module-delegated-impersonate](../../images/account-pro-module-delegated-impersonate.jpg)
![account-pro-module-delegated-impersonate](../../images/account-pro-module-delegated-impersonate.jpg)

54
docs/en/modules/docs.md

@ -666,9 +666,61 @@ See the following examples:
```
```
---
## Referencing Next & Previous Documents
The **Docs Module** supports referencing previous and next documents. It's useful if you have a series of documents that are strictly related to each other and need to be followed one after the other.
To reference the previous and next documents from a document, you should specify the documentation titles and their paths as follows:
```
````json
//[doc-nav]
{
"Previous": {
"Name": "Overall",
"Path": "testing/overall"
},
"Next": {
"Name": "Integration tests",
"Path": "testing/integration-tests"
}
}
````
```
After you specify the next & previous documents, they will appear at the end of the current documentation like in the following figure:
![](../images/docs-referencing.png)
## Single Project Mode
The **single project mode** allows you to use a single name as a project name in your application. If you are not considering supporting multiple projects with their multiple docs and instead if you have a single project and want to have documentation only for it, it's especially useful for you.
You just need to configure the `DocsUiOptions`, set the single project mode as **enabled** and also define a constant project name:
```csharp
Configure<DocsUiOptions>(options =>
{
options.RoutePrefix = "docs";
options.SingleProjectMode.Enable = true;
options.SingleProjectMode.ProjectName = "abp";
});
```
## Multi Language Mode
The **multi language mode** allows you to show a combobox that lists and shows all documentation languages and configures the related languages in routes.
It's enabled by default and supports multiple languages, but if you are considering only supporting a single language, and don't want to show the language combobox in the sidebar of your docs system, you can configure the `DocsUiOptions` and set the multi language mode support as **false** to disable it:
```csharp
Configure<DocsUiOptions>(options =>
{
options.MultiLanguageMode = false;
});
```
## See Also

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

@ -415,6 +415,17 @@ public override void PreConfigureServices(ServiceConfigurationContext context)
}
```
### Disable Transport Security Requirement
By default, OpenIddict requires the use of HTTPS for all endpoints. You can disable it if it's needed. You just need to configure the `OpenIddictServerAspNetCoreOptions` and set `DisableTransportSecurityRequirement` as **true**:
```cs
Configure<OpenIddictServerAspNetCoreOptions>(options =>
{
options.DisableTransportSecurityRequirement = true;
});
```
https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption
### Request/Response Process

11
docs/en/modules/openiddict.md

@ -375,6 +375,17 @@ public override void PreConfigureServices(ServiceConfigurationContext context)
}
```
### Disable Transport Security Requirement
By default, OpenIddict requires the use of HTTPS for all endpoints. You can disable it if it's needed. You just need to configure the `OpenIddictServerAspNetCoreOptions` and set `DisableTransportSecurityRequirement` as **true**:
```cs
Configure<OpenIddictServerAspNetCoreOptions>(options =>
{
options.DisableTransportSecurityRequirement = true;
});
```
https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption
### Request/Response Process

15
docs/en/release-info/release-notes.md

@ -4,11 +4,20 @@ This document contains **brief release notes** for each release. Release notes o
> If you want to read detailed release posts for each version, please see the [official ABP blog](https://abp.io/blog).
## 8.2 (2024-05-25)
## 8.3.0-rc.1 (2024-07-31)
> This version is currently in preview. The final release date is planned for July, 2024.
> This version is currently in preview. The final release date is planned for August, 2024.
See the detailed **[blog post / announcement](https://abp.io/blog/announcing-abp-8-2-release-candidate)** for the v8.2 release.
See the detailed **[blog post / announcement](https://abp.io/blog/announcing-abp-8-3-release-candidate)** for the v8.3 release.
* CMS Kit: Marked Items & Approvement System for Commenting Feature
* Enhancements on the Docs Module (Google Translation support & new single project mode)
* Using DbFunction for generating more precise SQL commands for Global Query Filters
* CMS Kit (Pro): FAQ System
## 8.2 (2024-06-26)
See the detailed **[blog post / announcement](https://abp.io/blog/announcing-abp-8-2-stable-release)** for the v8.2 release.
* Blazor Full-Stack Web App UI.
* Introducing the `IBlockUiService` for Blazor UI (disables/blocks the page or a part of the page).

24
docs/en/release-info/road-map.md

@ -4,18 +4,18 @@ This document provides a road map, release schedule, and planned features for th
## Next Versions
### v8.2
### v9.0
The next version will be 8.2 and planned to release the stable 8.2 version in June 2024. We will be mostly working on the following topics:
The next version will be 9.0 and planned to release the stable 9.0 version in November 2024. We will be mostly working on the following topics:
* ABP Studio Community Edition
* Blazor Full-Stack UI ([#18289](https://github.com/abpframework/abp/issues/18289))
* Angular Universal ([#15782](https://github.com/abpframework/abp/issues/15782))
* Upgrading React Native template to the latest major release 0.72.7 ([#18191](https://github.com/abpframework/abp/issues/18191))
* Deployment Documents Improvements ([#15034](https://github.com/abpframework/abp/issues/15034))
* Upgrading to .NET 9
* Introducing `Extension Property Policy` feature
* Handling localization resources in a microservice scenario
* ABP Suite: Show default template for customized templates for better sync.
* Microservice development tutorials
* Improvements on the existing features and provide more guides.
See the [8.2 milestone](https://github.com/abpframework/abp/milestone/95) for all the issues we've planned to work on.
See the [9.0 milestone](https://github.com/abpframework/abp/milestone/104) for all the issues we've planned to work on.
## Backlog Items
@ -45,13 +45,13 @@ Here is a list of major items in the backlog we are considering working on in th
* Dynamic dashboard system.
* User guiding module.
* gRPC integration and implementation for all the pre-built modules.
* Chat Module: Deleting messages & conversations
### Tooling
* Suite: File, DateOnly and TimeOnly types
* Suite: Export child/detail entity records
* CMS Kit features, including FAQ, spam protection, social media feeds, multi-language support, and so on.
* ABP Suite: Extra Properties on CRUD Page generation
* ABP Suite: Allow to create PAGE instead of MODAL for CRUD page generation
* ABP Suite: Export child/detail entity records
* CMS Kit features, including spam protection, social media feeds, multi-language support, and so on.
You can always check the milestone planning and the prioritized backlog issues on [the GitHub repository](https://github.com/abpframework/abp/milestones) for a detailed road map. The backlog items are subject to change. We are adding new items and changing priorities based on the community feedbacks and goals of the project.

1
docs/en/studio/solution-explorer.md

@ -117,6 +117,7 @@ A [module](./concepts.md#module) is a sub-solution that can contains zero, one o
- `JetBrains Rider`: Opens the module in JetBrains Rider. This option is only available if you have JetBrains Rider installed.
- `Terminal`: Opens the terminal in the module directory.
- `Explorer`: Opens the file explorer in the module directory.
- `Upgrade to Pro`: This will be visible only when you purchased a license but still using the modules came with open-source (free) license. For more details, check out [Migrating from Open Source Templates](../guides/migrating-from-open-source.md) document. This is not shown in the screenshot above.
### Adding a New Empty Module

BIN
docs/en/tutorials/book-store/images/blazor-add-books-component-client.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

18
docs/en/tutorials/book-store/index.md → docs/en/tutorials/book-store/overview.md

@ -35,3 +35,21 @@ This tutorial is organized as the following parts:
- [Part 8: Authors: Application Layer](part-08.md)
- [Part 9: Authors: User Interface](part-09.md)
- [Part 10: Book to Author Relation](part-10.md)
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
{{if UI == "MVC" && DB == "EF"}}
### Video Tutorial
This part is also recorded as a video tutorial and **<a href="https://www.youtube.com/watch?v=cJzyIFfAlp8&list=PLsNclT2aHJcPNaCf7Io3DbMN6yAk_DgWJ&index=1" target="_blank">published on YouTube</a>**.
{{end}}

42
docs/en/tutorials/book-store/part-01.md

@ -16,46 +16,6 @@
}
````
## About This Tutorial
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
* **{{DB_Value}}** as the database provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts:
- **Part 1: Creating the server side (this part)**
- [Part 2: The book list page](part-02.md)
- [Part 3: Creating, updating and deleting books](part-03.md)
- [Part 4: Integration tests](part-04.md)
- [Part 5: Authorization](part-05.md)
- [Part 6: Authors: Domain layer](part-06.md)
- [Part 7: Authors: Database Integration](part-07.md)
- [Part 8: Authors: Application Layer](part-08.md)
- [Part 9: Authors: User Interface](part-09.md)
- [Part 10: Book to Author Relation](part-10.md)
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
> After downloading the source code, you might need to run some commands before running the application. See the _After Creating the Solution_ section below for more information.
{{if UI == "MVC" && DB == "EF"}}
### Video Tutorial
This part is also recorded as a video tutorial and **<a href="https://www.youtube.com/watch?v=cJzyIFfAlp8&list=PLsNclT2aHJcPNaCf7Io3DbMN6yAk_DgWJ&index=1" target="_blank">published on YouTube</a>**.
{{end}}
## Creating the Solution
Before starting the development, create a new solution named `Acme.BookStore` and run it by following the [getting started tutorial](../../get-started/layered-web-application.md).
@ -480,7 +440,7 @@ ABP can [**automagically**](../../framework/api-development/auto-controllers.md)
### Swagger UI
The startup template is configured to run the [Swagger UI](https://swagger.io/tools/swagger-ui/) using the [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) library. Run the application ({{if UI=="MVC"}}`Acme.BookStore.Web`{{else}}`Acme.BookStore.HttpApi.Host`{{end}}) by pressing `CTRL+F5` and navigate to `https://localhost:<port>/swagger/` on your browser. Replace `<port>` with your own port number.
The startup template is configured to run the [Swagger UI](https://swagger.io/tools/swagger-ui/) using the [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) library. Run the application ({{if UI=="MVC"}}`Acme.BookStore.Web`{{else if UI=="BlazorServer"}}`Acme.BookStore.Blazor`{{else}}`Acme.BookStore.HttpApi.Host`{{end}}) by pressing `CTRL+F5` and navigate to `https://localhost:<port>/swagger/` on your browser. Replace `<port>` with your own port number.
You will see some built-in service endpoints as well as the `Book` service and its REST-style endpoints:

46
docs/en/tutorials/book-store/part-02.md

@ -20,44 +20,6 @@
}
````
## About This Tutorial
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
* **{{DB_Value}}** as the ORM provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts:
- [Part 1: Creating the server side](part-01.md)
- **Part 2: The book list page (this part)**
- [Part 3: Creating, updating and deleting books](part-03.md)
- [Part 4: Integration tests](part-04.md)
- [Part 5: Authorization](part-05.md)
- [Part 6: Authors: Domain layer](part-06.md)
- [Part 7: Authors: Database Integration](part-07.md)
- [Part 8: Authors: Application Layer](part-08.md)
- [Part 9: Authors: User Interface](part-09.md)
- [Part 10: Book to Author Relation](part-10.md)
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
{{if UI == "MVC" && DB == "EF"}}
### Video Tutorial
This part is also recorded as a video tutorial and **<a href="https://www.youtube.com/watch?v=UDNlLiPiBiw&list=PLsNclT2aHJcPNaCf7Io3DbMN6yAk_DgWJ&index=2" target="_blank">published on YouTube</a>**.
{{end}}
{{if UI == "MVC"}}
## Dynamic JavaScript Proxies
@ -556,9 +518,13 @@ Now you can see the final result on your browser:
## Create a Books Page
It's time to create something visible and usable! Right click on the `Pages` folder under the `Acme.BookStore.Blazor.Client` project and add a new **razor component**, named `Books.razor`:
It's time to create something visible and usable! Right click on the `Pages` folder under the {{ if UI == "Blazor"}}`Acme.BookStore.Blazor.Client`{{ else }}`Acme.BookStore.Blazor`{{ end }} project and add a new **razor component**, named `Books.razor`:
{{ if UI == "Blazor"}}
![blazor-add-books-component](images/blazor-add-books-component-client.png)
{{ else }}
![blazor-add-books-component](images/blazor-add-books-component.png)
{{ end }}
Replace the contents of this component as shown below:
@ -574,7 +540,7 @@ Replace the contents of this component as shown below:
### Add the Books Page to the Main Menu
Open the `BookStoreMenuContributor` class in the `Blazor.Client` project add the following code to the end of the `ConfigureMainMenuAsync` method:
Open the `BookStoreMenuContributor` class in the {{ if UI == "Blazor"}}`Acme.BookStore.Blazor.Client`{{ else }}`Acme.BookStore.Blazor`{{ end }} project add the following code to the end of the `ConfigureMainMenuAsync` method:
````csharp
context.Menu.AddItem(

38
docs/en/tutorials/book-store/part-03.md

@ -21,44 +21,6 @@
}
````
## About This Tutorial
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
* **{{DB_Value}}** as the ORM provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts:
- [Part 1: Creating the server side](part-01.md)
- [Part 2: The book list page](part-02.md)
- **Part 3: Creating, updating and deleting books (this part)**
- [Part 4: Integration tests](part-04.md)
- [Part 5: Authorization](part-05.md)
- [Part 6: Authors: Domain layer](part-06.md)
- [Part 7: Authors: Database Integration](part-07.md)
- [Part 8: Authors: Application Layer](part-08.md)
- [Part 9: Authors: User Interface](part-09.md)
- [Part 10: Book to Author Relation](part-10.md)
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
{{if UI == "MVC" && DB == "EF"}}
### Video Tutorial
This part is also recorded as a video tutorial and **<a href="https://www.youtube.com/watch?v=TLShZO8u2VE&list=PLsNclT2aHJcPNaCf7Io3DbMN6yAk_DgWJ&index=3" target="_blank">published on YouTube</a>**.
{{end}}
{{if UI == "MVC"}}
## Creating a New Book

38
docs/en/tutorials/book-store/part-04.md

@ -21,44 +21,6 @@
}
````
## About This Tutorial
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
* **{{DB_Value}}** as the ORM provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts;
- [Part 1: Creating the server side](part-01.md)
- [Part 2: The book list page](part-02.md)
- [Part 3: Creating, updating and deleting books](part-03.md)
- **Part 4: Integration tests (this part)**
- [Part 5: Authorization](part-05.md)
- [Part 6: Authors: Domain layer](part-06.md)
- [Part 7: Authors: Database Integration](part-07.md)
- [Part 8: Authors: Application Layer](part-08.md)
- [Part 9: Authors: User Interface](part-09.md)
- [Part 10: Book to Author Relation](part-10.md)
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
{{if UI == "MVC" && DB == "EF"}}
### Video Tutorial
This part is also recorded as a video tutorial and **<a href="https://www.youtube.com/watch?v=aidRB4YFDLM&list=PLsNclT2aHJcPNaCf7Io3DbMN6yAk_DgWJ&index=4" target="_blank">published on YouTube</a>**.
{{end}}
## Test Projects in the Solution
This part covers the **server side** tests. There are several test projects in the solution:

38
docs/en/tutorials/book-store/part-05.md

@ -21,44 +21,6 @@
}
````
## About This Tutorial
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
* **{{DB_Value}}** as the ORM provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts;
- [Part 1: Creating the server side](part-01.md)
- [Part 2: The book list page](part-02.md)
- [Part 3: Creating, updating and deleting books](part-03.md)
- [Part 4: Integration tests](part-04.md)
- **Part 5: Authorization (this part)**
- [Part 6: Authors: Domain layer](part-06.md)
- [Part 7: Authors: Database Integration](part-07.md)
- [Part 8: Authors: Application Layer](part-08.md)
- [Part 9: Authors: User Interface](part-09.md)
- [Part 10: Book to Author Relation](part-10.md)
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
{{if UI == "MVC" && DB == "EF"}}
### Video Tutorial
This part is also recorded as a video tutorial and **<a href="https://www.youtube.com/watch?v=1WsfMITN_Jk&list=PLsNclT2aHJcPNaCf7Io3DbMN6yAk_DgWJ&index=5" target="_blank">published on YouTube</a>**.
{{end}}
## Permissions
ABP provides an [authorization system](../../framework/fundamentals/authorization.md) based on the ASP.NET Core's [authorization infrastructure](https://docs.microsoft.com/en-us/aspnet/core/security/authorization/introduction). One major feature added on top of the standard authorization infrastructure is the **permission system** which allows to define permissions and enable/disable per role, user or client.

30
docs/en/tutorials/book-store/part-06.md

@ -21,36 +21,6 @@
}
````
## About This Tutorial
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
* **{{DB_Value}}** as the ORM provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts;
- [Part 1: Creating the server side](part-01.md)
- [Part 2: The book list page](part-02.md)
- [Part 3: Creating, updating and deleting books](part-03.md)
- [Part 4: Integration tests](part-04.md)
- [Part 5: Authorization](part-05.md)
- **Part 6: Authors: Domain layer (this part)**
- [Part 7: Authors: Database Integration](part-07.md)
- [Part 8: Authors: Application Layer](part-08.md)
- [Part 9: Authors: User Interface](part-09.md)
- [Part 10: Book to Author Relation](part-10.md)
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
## Introduction
In the previous parts, we've used the ABP infrastructure to easily build some services;

30
docs/en/tutorials/book-store/part-07.md

@ -21,36 +21,6 @@
}
````
## About This Tutorial
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
* **{{DB_Value}}** as the ORM provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts;
- [Part 1: Creating the server side](part-01.md)
- [Part 2: The book list page](part-02.md)
- [Part 3: Creating, updating and deleting books](part-03.md)
- [Part 4: Integration tests](part-04.md)
- [Part 5: Authorization](part-05.md)
- [Part 6: Authors: Domain layer](part-06.md)
- **Part 7: Authors: Database Integration (this part)**
- [Part 8: Authors: Application Layer](part-08.md)
- [Part 9: Authors: User Interface](part-09.md)
- [Part 10: Book to Author Relation](part-10.md)
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
## Introduction
This part explains how to configure the database integration for the `Author` entity introduced in the previous part.

30
docs/en/tutorials/book-store/part-08.md

@ -21,36 +21,6 @@
}
````
## About This Tutorial
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
* **{{DB_Value}}** as the ORM provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts;
- [Part 1: Creating the server side](part-01.md)
- [Part 2: The book list page](part-02.md)
- [Part 3: Creating, updating and deleting books](part-03.md)
- [Part 4: Integration tests](part-04.md)
- [Part 5: Authorization](part-05.md)
- [Part 6: Authors: Domain layer](part-06.md)
- [Part 7: Authors: Database Integration](part-07.md)
- **Part 8: Author: Application Layer (this part)**
- [Part 9: Authors: User Interface](part-09.md)
- [Part 10: Book to Author Relation](part-10.md)
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
## Introduction
This part explains to create an application layer for the `Author` entity created before.

32
docs/en/tutorials/book-store/part-09.md

@ -21,36 +21,6 @@
}
````
## About This Tutorial
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
* **{{DB_Value}}** as the ORM provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts;
- [Part 1: Creating the server side](part-01.md)
- [Part 2: The book list page](part-02.md)
- [Part 3: Creating, updating and deleting books](part-03.md)
- [Part 4: Integration tests](part-04.md)
- [Part 5: Authorization](part-05.md)
- [Part 6: Authors: Domain layer](part-06.md)
- [Part 7: Authors: Database Integration](part-07.md)
- [Part 8: Authors: Application Layer](part-08.md)
- **Part 9: Authors: User Interface (this part)**
- [Part 10: Book to Author Relation](Part-10.md)
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
## Introduction
This part explains how to create a CRUD page for the `Author` entity introduced in the previous parts.
@ -1236,7 +1206,7 @@ Open the `BookStoreMenuContributor.cs` in the `Acme.BookStore.Blazor.Client` pro
````csharp
if (await context.IsGrantedAsync(BookStorePermissions.Authors.Default))
{
bookStoreMenu.AddItem(new ApplicationMenuItem(
context.Menu.AddItem(new ApplicationMenuItem(
"BooksStore.Authors",
l["Menu:Authors"],
url: "/authors"

30
docs/en/tutorials/book-store/part-10.md

@ -17,36 +17,6 @@
}
````
## About This Tutorial
In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies:
* **{{DB_Value}}** as the ORM provider.
* **{{UI_Value}}** as the UI Framework.
This tutorial is organized as the following parts;
- [Part 1: Creating the server side](part-01.md)
- [Part 2: The book list page](part-02.md)
- [Part 3: Creating, updating and deleting books](part-03.md)
- [Part 4: Integration tests](part-04.md)
- [Part 5: Authorization](part-05.md)
- [Part 6: Authors: Domain layer](part-06.md)
- [Part 7: Authors: Database Integration](part-07.md)
- [Part 8: Authors: Application Layer](part-08.md)
- [Part 9: Authors: User Interface](part-09.md)
- **Part 10: Book to Author Relation (this part)**
### Download the Source Code
This tutorial has multiple versions based on your **UI** and **Database** preferences. We've prepared a few combinations of the source code to be downloaded:
* [MVC (Razor Pages) UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* [Blazor UI with EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore)
* [Angular UI with MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
> If you encounter the "filename too long" or "unzip" error on Windows, please see [this guide](../../kb/windows-path-too-long-fix.md).
## Introduction
We have created `Book` and `Author` functionalities for the book store application. However, currently there is no relation between these entities.

5
framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs

@ -9,8 +9,11 @@ namespace Volo.Abp.AspNetCore.Components.Web.Extensibility.TableColumns;
public class TableColumn
{
public string Title { get; set; } = default!;
public string Data { get; set; } = default!;
public string Width { get; set; } = default!;
public string PropertyName { get; set; } = default!;
public string? DisplayFormat { get; set; }
@ -24,7 +27,7 @@ public class TableColumn
public Func<object, string>? ValueConverter { get; set; }
public bool Sortable { get; set; }
public bool Visible { get; set; } = true;
public TableColumn()

13
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/ScriptTagHelper.cs

@ -10,6 +10,9 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers;
public class ScriptTagHelper : AbpTagHelper
{
protected AbpBundlingOptions Options { get; }
[HtmlAttributeName("deferred")]
public bool? Deferred { get; set; }
public ScriptTagHelper(IOptions<AbpBundlingOptions> options)
{
@ -17,6 +20,16 @@ public class ScriptTagHelper : AbpTagHelper
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
if(Deferred == true)
{
output.Attributes.Add("defer", "");
return;
}
else if (Deferred == false)
{
return;
}
if (Options.DeferScriptsByDefault)
{
output.Attributes.Add("defer", "");

13
framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/sv.json

@ -0,0 +1,13 @@
{
"culture": "sv",
"texts": {
"GivenTenantIsNotExist": "Given hyresgäst existerar inte: {0}",
"GivenTenantIsNotAvailable": "Angiven hyresgäst är inte tillgänglig: {0}",
"Tenant": "Hyresgäst",
"Switch": "Växla",
"Name": "Namn",
"SwitchTenantHint": "Lämna namnfältet tomt för att växla till värdsidan.",
"SwitchTenant": "Byta hyresgäst",
"NotSelected": "Ej vald"
}
}

10
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/sv.json

@ -0,0 +1,10 @@
{
"culture": "sv",
"texts": {
"Volo.Authorization:010001": "Auktorisering misslyckades! Angiven policy har inte beviljats.",
"Volo.Authorization:010002": "Auktorisering misslyckades! Angiven policy har inte beviljat: {Policynamn}",
"Volo.Authorization:010003": "Auktorisering misslyckades! Given policy har inte beviljats för given resurs: {Resursnamn}",
"Volo.Authorization:010004": "Auktorisering misslyckades! Givet krav har inte beviljats för given resurs: {Resursnamn}",
"Volo.Authorization:010005": "Auktorisering misslyckades! Givet krav har inte beviljats för given resurs: {Resursnamn}"
}
}

8
framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor

@ -74,7 +74,7 @@
{
@if (column.ValueConverter == null)
{
<DataGridColumn TItem="TItem" Field="@column.Data" Caption="@column.Title" Sortable="@column.Sortable" DisplayFormat="@column.DisplayFormat" DisplayFormatProvider="@column.DisplayFormatProvider" Displayable="column.Visible" >
<DataGridColumn TItem="TItem" Field="@column.Data" Width="@column.Width" Caption="@column.Title" Sortable="@column.Sortable" DisplayFormat="@column.DisplayFormat" DisplayFormatProvider="@column.DisplayFormatProvider" Displayable="column.Visible" >
<DisplayTemplate>
@RenderCustomTableColumnComponent(column.Component, context!)
</DisplayTemplate>
@ -82,7 +82,7 @@
}
else
{
<DataGridColumn TItem="TItem" Field="@column.Data" Caption="@column.Title" Sortable="@column.Sortable" Displayable="column.Visible">
<DataGridColumn TItem="TItem" Field="@column.Data" Width="@column.Width" Caption="@column.Title" Sortable="@column.Sortable" Displayable="column.Visible">
<DisplayTemplate>
@RenderCustomTableColumnComponent(column.Component, context!)
</DisplayTemplate>
@ -97,6 +97,7 @@
{
<DataGridColumn TItem="TItem"
Field="@column.Data"
Width="@column.Width"
Caption="@column.Title"
Sortable="@column.Sortable"
DisplayFormat="@column.DisplayFormat"
@ -107,6 +108,7 @@
{
<DataGridColumn TItem="TItem"
Field="@column.Data"
Width="@column.Width"
Caption="@column.Title"
Sortable="@column.Sortable"
Displayable="column.Visible">
@ -118,7 +120,7 @@
}
else
{
<DataGridColumn TItem="TItem" Field="@nameof(IHasExtraProperties.ExtraProperties)" SortField="@column.PropertyName" Caption="@column.Title" Displayable="column.Visible">
<DataGridColumn TItem="TItem" Field="@nameof(IHasExtraProperties.ExtraProperties)" SortField="@column.PropertyName" Width="@column.Width" Caption="@column.Title" Displayable="column.Visible">
<DisplayTemplate>
@{
var entity = context as IHasExtraProperties;

6
framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/sv.json

@ -0,0 +1,6 @@
{
"culture": "sv",
"texts": {
"MaxResultCountExceededExceptionMessage": "{0} kan inte vara mer än {1}! Öka {2}.{3} på serversidan för att tillåta fler resultat."
}
}

25
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Localization/sv.json

@ -0,0 +1,25 @@
{
"culture": "sv",
"texts": {
"DisplayName:Abp.Mailing.DefaultFromAddress": "Standard från adress",
"DisplayName:Abp.Mailing.DefaultFromDisplayName": "Standard från visningsnamn",
"DisplayName:Abp.Mailing.Smtp.Host": "Värd",
"DisplayName:Abp.Mailing.Smtp.Port": "Port",
"DisplayName:Abp.Mailing.Smtp.UserName": "Användarens namn",
"DisplayName:Abp.Mailing.Smtp.Password": "Lösenord",
"DisplayName:Abp.Mailing.Smtp.Domain": "Domän",
"DisplayName:Abp.Mailing.Smtp.EnableSsl": "Aktivera SSL",
"DisplayName:Abp.Mailing.Smtp.UseDefaultCredentials": "Använda standardautentiseringsuppgifter",
"Description:Abp.Mailing.DefaultFromAddress": "Standardadressen från",
"Description:Abp.Mailing.DefaultFromDisplayName": "Standard från visningsnamn",
"Description:Abp.Mailing.Smtp.Host": "Namnet på eller IP-adressen till den värd som används för SMTP-transaktioner.",
"Description:Abp.Mailing.Smtp.Port": "Den port som används för SMTP-transaktioner.",
"Description:Abp.Mailing.Smtp.UserName": "Användarnamn som är kopplat till autentiseringsuppgifterna.",
"Description:Abp.Mailing.Smtp.Password": "Lösenordet för det användarnamn som är kopplat till autentiseringsuppgifterna.",
"Description:Abp.Mailing.Smtp.Domain": "Domän- eller datornamnet som verifierar autentiseringsuppgifterna.",
"Description:Abp.Mailing.Smtp.EnableSsl": "Om SmtpClient använder SSL (Secure Sockets Layer) för att kryptera anslutningen.",
"Description:Abp.Mailing.Smtp.UseDefaultCredentials": "Om DefaultCredentials skickas med förfrågningar.",
"TextTemplate:StandardEmailTemplates.Layout": "Standardmall för e-postlayout",
"TextTemplate:StandardEmailTemplates.Message": "Enkel meddelandemall för e-post"
}
}

2
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs

@ -282,7 +282,7 @@ public abstract class AbpDbContext<TDbContext> : DbContext, IAbpEfCoreDbContext,
finally
{
ChangeTracker.AutoDetectChangesEnabled = true;
AbpEfCoreNavigationHelper.Clear();
AbpEfCoreNavigationHelper.RemoveChangedEntityEntries();
}
}

7
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs

@ -199,7 +199,12 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
return null;
}
public void Clear()
public virtual void RemoveChangedEntityEntries()
{
EntityEntries.RemoveAll(x => x.Value.IsModified);
}
public virtual void Clear()
{
EntityEntries.Clear();
}

29
framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/ExceptionHandling/Localization/sv.json

@ -0,0 +1,29 @@
{
"culture": "sv",
"texts": {
"InternalServerErrorMessage": "Ett internt fel uppstod under din förfrågan!",
"ValidationErrorMessage": "Din begäran är inte giltig!",
"ValidationNarrativeErrorMessageTitle": "Följande fel upptäcktes under valideringen.",
"DefaultErrorMessage": "Ett fel har inträffat!",
"DefaultErrorMessageDetail": "Felinformationen skickades inte av servern.",
"DefaultErrorMessage401": "Du är inte autentiserad!",
"DefaultErrorMessage401Detail": "Du måste logga in för att utföra den här åtgärden.",
"DefaultErrorMessage403": "Du är inte behörig!",
"DefaultErrorMessage403Detail": "Du får inte utföra den här operationen!",
"DefaultErrorMessage404": "Resurs hittades inte!",
"DefaultErrorMessage404Detail": "Den begärda resursen kunde inte hittas på servern!",
"EntityNotFoundErrorMessage": "Det finns ingen entitet {0} med id = {1}!",
"AbpDbConcurrencyErrorMessage": "De uppgifter du har skickat har redan ändrats av en annan användare. Kassera dina ändringar och försök igen.",
"Error": "Fel",
"UnhandledException": "Obehandlat undantag!",
"401Message": "Obehörig",
"403Message": "Förbjudet",
"404Message": "Sidan hittades inte",
"500Message": "Internt serverfel",
"403MessageDetail": "Du är inte behörig att utföra denna operation!",
"404MessageDetail": "Tyvärr, det finns inget på den här adressen.",
"Unauthorized": "Obehörig",
"invalid_token": "Ogiltig token",
"SessionExpired": "Din session har löpt ut. Vänligen logga in igen för att fortsätta i applikationen."
}
}

8
framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/sv.json

@ -0,0 +1,8 @@
{
"culture": "sv",
"texts": {
"Volo.Feature:010001": "Funktionen är inte aktiverad: {Funktionsnamn}",
"Volo.Feature:010002": "Obligatoriska funktioner är inte aktiverade. Alla dessa funktioner måste vara aktiverade: {Funktionsnamn}",
"Volo.Feature:010003": "Nödvändiga funktioner är inte aktiverade. Åtminstone en av dessa funktioner måste vara aktiverad: {Funktionsnamn}"
}
}

6
framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/Localization/sv.json

@ -0,0 +1,6 @@
{
"culture": "sv",
"texts": {
"Volo.GlobalFeature:010001": "Tjänsten '{ServiceName}' måste aktivera funktionen '{GlobalFeatureName}'."
}
}

19
framework/src/Volo.Abp.Ldap.Abstractions/Volo/Abp/Ldap/Localization/sv.json

@ -0,0 +1,19 @@
{
"culture": "sv",
"texts": {
"DisplayName:Abp.Ldap.Ldaps": "LDAP över SSL",
"Description:Abp.Ldap.Ldaps": "LDAP över SSL",
"DisplayName:Abp.Ldap.ServerHost": "Servervärd",
"Description:Abp.Ldap.ServerHost": "Servervärd",
"DisplayName:Abp.Ldap.ServerPort": "Serverport",
"Description:Abp.Ldap.ServerPort": "Serverport",
"DisplayName:Abp.Ldap.BaseDc": "Komponent för basdomän",
"Description:Abp.Ldap.BaseDc": "Komponent för basdomän",
"DisplayName:Abp.Ldap.Domain": "Domän",
"Description:Abp.Ldap.Domain": "Domän",
"DisplayName:Abp.Ldap.UserName": "Användarnamn",
"Description:Abp.Ldap.UserName": "Användarnamn",
"DisplayName:Abp.Ldap.Password": "Lösenord",
"Description:Abp.Ldap.Password": "Lösenord"
}
}

7
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/sv.json

@ -0,0 +1,7 @@
{
"culture": "sv",
"texts": {
"DisplayName:Abp.Localization.DefaultLanguage": "Standardspråk",
"Description:Abp.Localization.DefaultLanguage": "Standardspråket för programmet."
}
}

9
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/Localization/sv.json

@ -0,0 +1,9 @@
{
"culture": "sv",
"texts": {
"TenantNotFoundMessage": "Hyresgäst inte hittad!",
"TenantNotFoundDetails": "Det finns ingen hyresgäst med hyresgäst-ID eller namn: {0}",
"TenantNotActiveMessage": "Hyresgästen är inte aktiv!",
"TenantNotActiveDetails": "Hyresgästen är inte aktiv med hyresgäst-ID eller namn: {0}"
}
}

2
framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/HasExtraPropertiesExtensions.cs

@ -47,7 +47,7 @@ public static class HasExtraPropertiesExtensions
if (conversionType.IsEnum)
{
return (TProperty)value;
return (TProperty)Enum.Parse(conversionType, value.ToString()!);
}
return (TProperty)Convert.ChangeType(value, conversionType, CultureInfo.InvariantCulture);

7
framework/src/Volo.Abp.Timing/Volo/Abp/Timing/Localization/sv.json

@ -0,0 +1,7 @@
{
"culture": "sv",
"texts": {
"DisplayName:Abp.Timing.Timezone": "Tidszon",
"Description:Abp.Timing.Timezone": "Tidszon för tillämpning"
}
}

6
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Localization/Resource/sv.json

@ -0,0 +1,6 @@
{
"culture": "sv",
"texts": {
"Menu:Administration": "Administration"
}
}

64
framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sv.json

@ -0,0 +1,64 @@
{
"culture": "sv",
"texts": {
"Languages": "Språk",
"AreYouSure": "Är du säker?",
"Cancel": "Avbryt",
"Clear": "Klart",
"Yes": "Ja",
"No": "Nej",
"Ok": "Ok",
"Close": "Nära",
"Save": "Spara",
"SavingWithThreeDot": "Sparar...",
"Actions": "Åtgärder",
"Delete": "Radera",
"CreatedSuccessfully": "Skapades framgångsrikt",
"SavedSuccessfully": "Sparades framgångsrikt",
"DeletedSuccessfully": "Raderad framgångsrikt",
"Edit": "Redigera",
"Refresh": "Uppdatera",
"Language": "Språk",
"LoadMore": "Ladda mer",
"ProcessingWithThreeDot": "Bearbetning...",
"LoadingWithThreeDot": "Laddar...",
"Welcome": "Välkommen",
"Login": "Logga in",
"Register": "Registrera",
"Logout": "Logga ut",
"Submit": "Skicka in",
"Back": "Tillbaka",
"PagerSearch": "Sök",
"PagerNext": "Nästa",
"PagerPrevious": "Föregående",
"PagerFirst": "Första",
"PagerLast": "Sista",
"PagerInfo": "Visar _START_ till _Slut_ av _TOTAL_ poster",
"PagerInfo{0}{1}{2}": "Visar {0} till {1} av {2} poster",
"PagerInfoEmpty": "Visar 0 till 0 av 0 poster",
"PagerInfoFiltered": "(filtrerat från _MAX_ totala poster)",
"NoDataAvailableInDatatable": "Inga uppgifter tillgängliga",
"Total": "totalt",
"Selected": "utvalda",
"PagerShowMenuEntries": "Visa _MENY_-poster",
"DatatableActionDropdownDefaultText": "Åtgärder",
"ChangePassword": "Ändra lösenord",
"PersonalInfo": "Min profil",
"AreYouSureYouWantToCancelEditingWarningMessage": "Du har förändringar som inte är frälsta.",
"GoHomePage": "Gå till startsidan",
"GoBack": "Gå tillbaka",
"Search": "Sök",
"ItemWillBeDeletedMessageWithFormat": "{0} kommer att raderas!",
"ItemWillBeDeletedMessage": "Denna artikel kommer att raderas!",
"ManageYourAccount": "Hantera ditt konto",
"OthersGroup": "Övriga",
"Today": "Idag",
"Apply": "Tillämpa",
"InternetConnectionInfo": "Åtgärden kunde inte utföras. Din internetanslutning är inte tillgänglig för tillfället.",
"CopiedToTheClipboard": "Kopieras till urklipp",
"AddNew": "Lägg till ny",
"ProfilePicture": "Profilbild",
"Theme": "Tema",
"NotAssigned": "Ej tilldelad"
}
}

39
framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/sv.json

@ -0,0 +1,39 @@
{
"culture": "sv",
"texts": {
"'{0}' and '{1}' do not match.": "'{0}' och '{1}' matchar inte varandra.",
"The {0} field is not a valid credit card number.": "Fältet {0} är inte ett giltigt kreditkortsnummer.",
"{0} is not valid.": "{0} är inte giltig.",
"The {0} field is not a valid e-mail address.": "Fältet {0} är inte en giltig e-postadress.",
"The {0} field only accepts files with the following extensions: {1}": "Fältet {0} accepterar endast filer med följande tillägg: {1}",
"The field {0} must be a string or array type with a maximum length of '{1}'.": "Fältet {0} måste vara en sträng eller en matris med en maximal längd av '{1}'.",
"The field {0} must be a string or array type with a minimum length of '{1}'.": "Fältet {0} måste vara en sträng eller en matris med en minsta längd av '{1}'.",
"The {0} field is not a valid phone number.": "Fältet {0} är inte ett giltigt telefonnummer.",
"The field {0} must be between {1} and {2}.": "Fältet {0} måste ligga mellan {1} och {2}.",
"The field {0} must match the regular expression '{1}'.": "Fältet {0} överensstämmer inte med det begärda formatet.",
"The {0} field is required.": "Fältet {0} är obligatoriskt.",
"The field {0} must be a string with a maximum length of {1}.": "Fältet {0} måste vara en sträng med en maximal längd av {1}.",
"The field {0} must be a string with a minimum length of {2} and a maximum length of {1}.": "Fältet {0} måste vara en sträng med en minsta längd av {2} och en största längd av {1}.",
"The {0} field is not a valid fully-qualified http, https, or ftp URL.": "Fältet {0} är inte en giltig fullständigt kvalificerad http-, https- eller ftp-URL.",
"The field {0} is invalid.": "Fältet {0} är ogiltigt.",
"The value '{0}' is invalid.": "Värdet '{0}' är ogiltigt.",
"The field {0} must be a number.": "Fältet {0} måste vara ett tal.",
"The field must be a number.": "Fältet måste vara ett nummer.",
"ThisFieldIsNotAValidCreditCardNumber.": "Detta fält är inte ett giltigt kreditkortsnummer.",
"ThisFieldIsNotValid.": "Detta fält är inte giltigt.",
"ThisFieldIsNotAValidEmailAddress.": "Detta fält är inte en giltig e-postadress.",
"ThisFieldOnlyAcceptsFilesWithTheFollowingExtensions:{0}": "Detta fält accepterar endast filer med följande tillägg: {0}",
"ThisFieldMustBeAStringOrArrayTypeWithAMaximumLengthOf{0}": "Detta fält måste vara en sträng eller en matris med en maximal längd på '{0}'.",
"ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "Detta fält måste vara en sträng eller en matris med en minsta längd av \"{0}\".",
"ThisFieldIsNotAValidPhoneNumber.": "Det här fältet är inte ett giltigt telefonnummer.",
"ThisFieldMustBeBetween{0}And{1}": "Detta fält måste vara mellan {0} och {1}.",
"ThisFieldMustBeGreaterThanOrEqual{0}": "Detta fält måste vara större än eller lika med {0}.",
"ThisFieldMustBeLessOrEqual{0}": "Detta fält måste vara mindre än eller lika med {0}.",
"ThisFieldMustMatchTheRegularExpression{0}": "Detta fält måste matcha det reguljära uttrycket \"{0}\".",
"ThisFieldIsRequired.": "Detta fält är obligatoriskt.",
"ThisFieldMustBeAStringWithAMaximumLengthOf{0}": "Detta fält måste vara en sträng med en maximal längd av {0}.",
"ThisFieldMustBeAStringWithAMinimumLengthOf{1}AndAMaximumLengthOf{0}": "Detta fält måste vara en sträng med en minsta längd av {1} och en största längd av {0}.",
"ThisFieldIsNotAValidFullyQualifiedHttpHttpsOrFtpUrl": "Det här fältet är inte en giltig fullständigt kvalificerad http-, https- eller ftp-URL.",
"ThisFieldIsInvalid.": "Detta fält är ogiltigt."
}
}

10
framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/sv.json

@ -0,0 +1,10 @@
{
"culture": "sv",
"texts": {
"DisplayName:PersonModel:BirthDate1": "Födelsedatum1",
"DisplayName:BirthDate2": "Födelsedatum2",
"PersonModel:BirthDate3": "Födelsedatum3",
"BirthDate": "Födelsedatum",
"Value1": "Värde ett"
}
}

6
framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/sv.json

@ -0,0 +1,6 @@
{
"culture": "sv",
"texts": {
"hello": "Hej"
}
}

24
framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs

@ -27,7 +27,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
protected readonly IRepository<AppEntityWithNavigations, Guid> AppEntityWithNavigationsRepository;
protected readonly ILocalEventBus LocalEventBus;
protected readonly IRepository<Person, Guid> PersonRepository;
protected bool _loadEntityWithDetails = false;
protected bool _loadEntityWithoutDetails = false;
public AbpEfCoreDomainEvents_Tests()
{
@ -42,7 +42,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
{
options.Entity<AppEntityWithNavigations>(opt =>
{
if (_loadEntityWithDetails)
if (_loadEntityWithoutDetails)
{
opt.DefaultWithDetailsFunc = q => q;
}
@ -55,7 +55,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
[Fact]
public async Task Should_Trigger_Domain_Events_For_Aggregate_Root_When_Navigation_Changes_Tests()
{
_loadEntityWithDetails = false;
_loadEntityWithoutDetails = false;
var entityId = Guid.NewGuid();
@ -77,6 +77,8 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await PersonRepository.InsertAsync(new Person(Guid.NewGuid(), Guid.NewGuid().ToString(), new Random().Next(1, 100)));
});
var unitOfWorkManager = ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
// Test with simple property
await WithUnitOfWorkAsync(async () =>
{
@ -92,6 +94,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.AppEntityWithValueObjectAddress = new AppEntityWithValueObjectAddress("Turkey");
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -102,6 +105,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.AppEntityWithValueObjectAddress.Country = "USA";
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -117,6 +121,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.AppEntityWithValueObjectAddress = null;
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -128,6 +133,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.OneToOne = new AppEntityWithNavigationChildOneToOne
{
ChildName = "ChildName",
@ -157,6 +163,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.OneToOne.ChildName = "ChildName2";
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -171,6 +178,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.OneToOne.OneToOne.ChildName = "OneToOne-ChildName2";
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -188,6 +196,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.OneToOne = null;
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -199,6 +208,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.OneToMany = new List<AppEntityWithNavigationChildOneToMany>()
{
new AppEntityWithNavigationChildOneToMany
@ -235,6 +245,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.OneToMany[0].ChildName = "ChildName2";
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -249,6 +260,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.OneToMany[0].OneToMany[0].ChildName = "OneToMany-ChildName2";
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -266,6 +278,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.OneToMany.Clear();
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -277,6 +290,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.ManyToMany = new List<AppEntityWithNavigationChildManyToMany>()
{
new AppEntityWithNavigationChildManyToMany
@ -293,6 +307,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.ManyToMany[0].ChildName = "ChildName2";
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -303,6 +318,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
await WithUnitOfWorkAsync(async () =>
{
var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId);
await unitOfWorkManager.Current.SaveChangesAsync();
entity.ManyToMany.Clear();
await AppEntityWithNavigationsRepository.UpdateAsync(entity);
});
@ -313,7 +329,7 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase
[Fact]
public async Task Should_Trigger_Domain_Events_For_Aggregate_Root_When_EnsureCollectionLoaded_Navigation_Changes_Tests()
{
_loadEntityWithDetails = true;
_loadEntityWithoutDetails = true;
var entityId = Guid.NewGuid();

6
framework/test/Volo.Abp.Http.Client.Tests/Volo/Abp/Http/Localization/sv.json

@ -0,0 +1,6 @@
{
"culture": "sv",
"texts": {
"Volo.Abp.Http.DynamicProxying:10001": "Företagsundantag med data: {0}"
}
}

BIN
framework/test/Volo.Abp.Imaging.Abstractions.Tests/Volo/Abp/Imaging/Files/abp.webp

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

7
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/sv.json

@ -0,0 +1,7 @@
{
"culture": "sv",
"texts": {
"USA": "Amerikas Förenta Stater",
"Brazil": "Brasilien"
}
}

12
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/sv.json

@ -0,0 +1,12 @@
{
"culture": "sv",
"texts": {
"ThisFieldIsRequired": "Detta fält är obligatoriskt",
"MaxLenghtErrorMessage": "Detta fält kan innehålla högst '{0}' tecken",
"Enum:BookType.Undefined": "Odefinierad från ValidationResource",
"Enum:BookType.0": "Odefinierad med värdet 0 från ValidationResource",
"BookType.Adventure": "Äventyr från ValidationResource",
"BookType.1": "Äventyr med värde 1 från ValidationResource",
"Biography": "Biografi från ValidationResource"
}
}

16
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/sv.json

@ -0,0 +1,16 @@
{
"culture": "sv",
"texts": {
"Hello <b>{0}</b>.": "Hej <b>{0}</b>.",
"Car": "Bil",
"CarPlural": "Bilar",
"MaxLenghtErrorMessage": "Längden på detta fält kan vara högst '{0}' tecken",
"Universe": "Universum",
"FortyTwo": "Fyrtiotvå",
"Enum:BookType.Undefined": "Odefinierad",
"Enum:BookType.0": "Odefinierad med värde 0",
"BookType.Adventure": "Äventyr",
"BookType.1": "Äventyr med värde 1",
"Biography": "Biografi"
}
}

6
framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/sv.json

@ -0,0 +1,6 @@
{
"culture": "sv",
"texts": {
"SeeYou": "Se dig själv"
}
}

7
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/Localization/sv.json

@ -0,0 +1,7 @@
{
"culture": "sv",
"texts": {
"HelloText": "Hej",
"HowAreYou": "Hur är det med dig?"
}
}

2
latest-versions.json

@ -1,6 +1,6 @@
[
{
"version": "8.2.0",
"version": "8.2.1",
"releaseDate": "",
"type": "stable",
"message": ""

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

@ -0,0 +1,73 @@
{
"culture": "sv",
"texts": {
"Menu:Account": "Konto",
"UserName": "Användarnamn",
"EmailAddress": "E-postadress",
"UserNameOrEmailAddress": "Användarnamn eller e-postadress",
"Password": "Lösenord",
"RememberMe": "Kom ihåg mig",
"UseAnotherServiceToLogin": "Använd en annan tjänst för att logga in",
"UserLockedOutMessage": "Användarkontot har låsts på grund av ogiltiga inloggningsförsök. Vänligen vänta ett tag och försök igen.",
"InvalidUserNameOrPassword": "Ogiltigt användarnamn eller lösenord!",
"LoginIsNotAllowed": "Du kan inte logga in! Ditt konto är inaktivt eller så behöver du bekräfta din e-postadress eller ditt telefonnummer.",
"SelfRegistrationDisabledMessage": "Självregistrering är inaktiverat för denna applikation. Vänligen kontakta applikationsadministratören för att registrera en ny användare.",
"LocalLoginDisabledMessage": "Lokal inloggning är inaktiverad för denna applikation.",
"Login": "Logga in",
"Cancel": "Avbryt",
"Register": "Registrera",
"AreYouANewUser": "Är du en ny användare?",
"AlreadyRegistered": "Är du redan registrerad?",
"InvalidLoginRequest": "Ogiltig inloggningsbegäran",
"ThereAreNoLoginSchemesConfiguredForThisClient": "Det finns inga inloggningsscheman konfigurerade för den här klienten.",
"LogInUsingYourProviderAccount": "Logga in med ditt {0}-konto",
"DisplayName:CurrentPassword": "Aktuellt lösenord",
"DisplayName:NewPassword": "Nytt lösenord",
"DisplayName:NewPasswordConfirm": "Bekräfta nytt lösenord",
"PasswordChangedMessage": "Ditt lösenord har ändrats framgångsrikt.",
"DisplayName:UserName": "Användarnamn",
"DisplayName:Email": "E-post",
"DisplayName:Name": "Namn",
"DisplayName:Surname": "Efternamn",
"DisplayName:Password": "Lösenord",
"DisplayName:EmailAddress": "E-postadress",
"DisplayName:PhoneNumber": "Telefonnummer",
"PersonalSettings": "Personliga inställningar",
"PersonalSettingsSaved": "Personliga inställningar sparade",
"PersonalSettingsChangedConfirmationModalTitle": "Personuppgifter ändrade",
"PersonalSettingsChangedConfirmationModalDescription": "Ändringarna kommer att återspeglas efter att du loggat in igen. Vill du logga ut nu?",
"PasswordChanged": "Lösenord ändrat",
"NewPasswordConfirmFailed": "Vänligen bekräfta det nya lösenordet.",
"NewPasswordSameAsOld": "Det nya lösenordet måste vara ett annat än det gamla.",
"Manage": "Hantera",
"MyAccount": "Mitt konto",
"DisplayName:Abp.Account.IsSelfRegistrationEnabled": "Är självregistrering möjlig?",
"Description:Abp.Account.IsSelfRegistrationEnabled": "Om en användare kan registrera kontot själv.",
"DisplayName:Abp.Account.EnableLocalLogin": "Autentisera med ett lokalt konto",
"Description:Abp.Account.EnableLocalLogin": "Anger om servern tillåter användare att autentisera sig med ett lokalt konto.",
"LoggedOutTitle": "Utregistrerad",
"LoggedOutText": "Du har blivit utloggad och kommer att omdirigeras inom kort.",
"ReturnToText": "Klicka här för att komma tillbaka till ansökan",
"OrLoginWith": "Eller logga in med:",
"ForgotPassword": "Har du glömt lösenordet?",
"SendPasswordResetLink_Information": "En länk för att återställa lösenordet kommer att skickas till din e-post för att återställa ditt lösenord. Om du inte får ett e-postmeddelande inom några minuter, försök igen.",
"PasswordResetMailSentMessage": "E-postmeddelande om återställning av konto skickas till din e-postadress. Om du inte ser det här e-postmeddelandet i din inkorg inom 15 minuter, leta efter det i din skräppostmapp. Om du hittar det där, markera det som -Not Junk-.",
"ResetPassword": "Återställ lösenord",
"ConfirmPassword": "Bekräfta lösenordet",
"ResetPassword_Information": "Ange ditt nya lösenord.",
"YourPasswordIsSuccessfullyReset": "Ditt lösenord har återställts.",
"GoToTheApplication": "Gå till applikationen",
"BackToLogin": "Tillbaka till inloggning",
"ProfileTab:Password": "Ändra lösenord",
"ProfileTab:PersonalInfo": "Personlig information",
"ReturnToApplication": "Återgå till ansökan",
"Volo.Account:InvalidEmailAddress": "Kan inte hitta den angivna e-postadressen: {0}",
"PasswordReset": "Återställning av lösenord",
"PasswordResetInfoInEmail": "Vi har fått en begäran om återställning av konto! Om du initierade denna begäran, klicka på följande länk för att återställa ditt lösenord.",
"ResetMyPassword": "Återställ mitt lösenord",
"AccessDenied": "Åtkomst nekad!",
"AccessDeniedMessage": "Du har inte tillgång till denna resurs.",
"OrRegisterWith": "Eller registrera dig med",
"RegisterUsingYourProviderAccount": "Registrera dig med ditt {0} konto"
}
}

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

@ -0,0 +1,98 @@
{
"culture": "sv",
"texts": {
"Permission:AuditLogging": "Granskning av loggning",
"Permission:AuditLogs": "Granskningsloggar",
"Menu:AuditLogging": "Granskningsloggar",
"AuditLogs": "Granskningsloggar",
"HttpStatus": "HTTP-status",
"HttpMethod": "HTTP-metod",
"HttpMethodFilter": "Filter för HTTP-metod",
"HttpRequest": "HTTP-förfrågan",
"User": "Användare",
"UserNameFilter": "Användarfilter",
"HasException": "Har undantag",
"IpAddress": "IP-adress",
"Time": "Tid",
"Date": "Datum",
"Duration": "Varaktighet",
"Detail": "Detalj",
"Overall": "Övergripande",
"Actions": "Åtgärder",
"ClientIpAddress": "Klientens IP-adress",
"ClientName": "Kundens namn",
"BrowserInfo": "Info om webbläsare",
"Url": "URL",
"UserName": "Användarens namn",
"TenantImpersonator": "Imitation av hyresgäst",
"UserImpersonator": "Användarimitatör",
"UrlFilter": "URL-filter",
"Exceptions": "Undantag",
"Comments": "Kommentarer",
"HttpStatusCode": "HTTP-statuskod",
"HttpStatusCodeFilter": "Filter för HTTP-statuskod",
"ServiceName": "Service",
"MethodName": "Metod",
"CorrelationId": "Korrelation Id",
"ApplicationName": "Applikationens namn",
"ExecutionDuration": "Varaktighet",
"ExtraProperties": "Extra egenskaper",
"MaxDuration": "Max. varaktighet",
"MinDuration": "Min. varaktighet",
"MinMaxDuration": "Varaktighet (min. - max.)",
"{0}Milliseconds": "{0} millisekunder",
"ExecutionTime": "Tid",
"Parameters": "Parametrar",
"EntityTypeFullName": "Entitetstyp Fullständigt namn",
"Entity": "Entitet",
"ChangeType": "Ändra typ",
"ChangeTime": "Tid",
"NewValue": "Nytt värde",
"OriginalValue": "Ursprungligt värde",
"PropertyName": "Namn på fastighet",
"PropertyTypeFullName": "Fastighetstyp Fullständigt namn",
"Yes": "Ja",
"No": "Nej",
"Changes": "Förändringar",
"AverageExecutionDurationInLogsPerDay": "Genomsnittlig exekveringstid",
"AverageExecutionDurationInMilliseconds": "Genomsnittlig exekveringstid i millisekunder",
"ErrorRateInLogs": "Felprocent i loggar",
"Success": "Framgång",
"Fault": "Fel",
"NoChanges": "Ingen förändring(ar)",
"EntityChanges": "Förändringar av enheter",
"EntityId": "Entitet Id",
"EntityChangeStartTime": "Min ändringsdatum",
"EntityChangeEndTime": "Max ändringsdatum",
"EntityHistory": "Enhetens historia",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} av {2}.",
"Created": "Skapad",
"Updated": "Uppdaterad",
"Deleted": "Borttagen",
"ChangeHistory": "Ändra historik",
"FullChangeHistory": "Fullständig ändringshistorik",
"ChangeDetails": "Ändra detaljer",
"DurationMs": "Varaktighet (ms)",
"StartDate": "Startdatum",
"EndDate": "Slutdatum",
"Feature:AuditLoggingGroup": "Granskning av loggning",
"Feature:AuditLoggingEnable": "Aktivera granskningsloggning sida",
"Feature:AuditLoggingEnableDescription": "Aktivera sidan för granskningsloggning i programmet.",
"Feature:AuditLoggingSettingManagementEnable": "Aktivera hantering av inställningar för granskningslogg",
"Feature:AuditLoggingSettingManagementEnableDescription": "Aktivera konfigurationen av inställningshanteringen för granskningsloggen i programmet.",
"InvalidAuditLogDeletionSettings": "Ogiltiga inställningar för radering av revisionslogg. Om radering är aktiverad ska perioden vara större än 0 dagar.",
"AuditLogSettingsGeneral": "Allmänt",
"AuditLogSettingsGlobal": "Globalt",
"DisplayName:IsPeriodicDeleterEnabled": "Möjliggör uppstädning av hela systemet",
"Description:IsPeriodicDeleterEnabled": "Om detta alternativ är avaktiverat fungerar inte den periodiska raderingen. Granskningsloggar kommer inte att raderas automatiskt.",
"DisplayName:GlobalIsExpiredDeleterEnabled": "Aktivera städservice för alla hyresgäster och värd",
"Description:GlobalIsExpiredDeleterEnabled": "Om det här alternativet är aktiverat raderas alla förfallna objekt för hyresgäster och värd automatiskt om det inte har en specifik inställning.",
"DisplayName:IsExpiredDeleterEnabled": "Möjliggör städning",
"Description:IsExpiredDeleterEnabled": "Om detta alternativ är aktiverat raderas de utgångna artiklarna automatiskt.",
"DisplayName:ExpiredDeleterPeriod": "Utgången raderingsperiod för objekt",
"Description:ExpiredDeleterPeriod": "Ställ in antalet dagar efter vilka utgångna objekt automatiskt ska raderas.",
"ExpiredDeleterPeriodUnit": "dag(ar)",
"AuditLogsBeforeXWillBeDeleted": "Granskningsloggar före {0} kommer att raderas."
}
}

6
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/Localization/sv.json

@ -0,0 +1,6 @@
{
"culture": "sv",
"texts": {
"MyAccount": "Mitt konto"
}
}

92
modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/sv.json

@ -0,0 +1,92 @@
{
"culture": "sv",
"texts": {
"Menu:Blogs": "Blogg",
"Menu:BlogManagement": "Bloggande",
"Permission:Management": "Förvaltning",
"Permission:Edit": "Redigera",
"Permission:Create": "Skapa",
"Permission:Delete": "Radera",
"Permission:Blogging": "Blogg",
"Permission:Blogs": "Blogg",
"Permission:Posts": "Inlägg",
"Permission:Tags": "Etiketter",
"Permission:Comments": "Kommentarer",
"Permission:ClearCache": "Rensa cache",
"Title": "Titel",
"Delete": "Radera",
"Reply": "Svar",
"ReplyTo": "Svara på {0}",
"ContinueReading": "Fortsätta läsa",
"DaysAgo": "{0} dagar sedan",
"DayAgo": "{0} dag sedan",
"YearsAgo": "{0} år sedan",
"YearAgo": "{0} år sedan",
"MonthsAgo": "{0} månader sedan",
"MonthAgo": "{0} månad sedan",
"WeeksAgo": "{0} veckor sedan",
"WeekAgo": "{0} vecka sedan",
"MinutesAgo": "{0} minuter sedan",
"MinuteAgo": "{0} minut sedan",
"SecondsAgo": "{0} sekunder sedan",
"SecondAgo": "{0} för en sekund sedan",
"HoursAgo": "för {0} timmar sedan",
"HourAgo": "{0} timme sedan",
"Now": "nu",
"Content": "Innehåll",
"SeeAll": "Se alla",
"PopularTags": "Populära taggar",
"WiewsWithCount": "{0} visningar",
"LastPosts": "Senaste inlägg",
"LeaveComment": "Lämna kommentar",
"TagsInThisArticle": "Taggar i denna artikel",
"Posts": "Inlägg",
"Edit": "Redigera",
"BLOG": "BLOGG",
"CommentDeletionWarningMessage": "Kommentaren kommer att raderas.",
"PostDeletionWarningMessage": "Inlägget kommer att raderas.",
"BlogDeletionWarningMessage": "Bloggen kommer att raderas.",
"AreYouSure": "Är du säker?",
"CommentWithCount": "{0} kommentarer",
"Comment": "Hur gör man",
"ShareOnTwitter": "Dela på Twitter",
"CoverImage": "Omslagsbild",
"CreateANewPost": "Skapa ett nytt inlägg",
"CreateANewBlog": "Skapa en ny blogg",
"WhatIsNew": "Vad är nytt?",
"Name": "Namn",
"ShortName": "Kort namn",
"CreationTime": "Skapelsetid",
"Description": "Beskrivning",
"Blogs": "Blogg",
"Tags": "Etiketter",
"ShareOn": "Dela på",
"TitleLengthWarning": "Håll din titelstorlek under 60 tecken för att vara SEO-vänlig!",
"ClearCache": "Rensa cache",
"ClearCacheConfirmationMessage": "Är du säker på att du vill rensa cacheminnet?",
"MarkdownSupported": "Markdown stöds",
"FileUploadInfo": "Dra, släpp eller klistra in en kopierad bild.",
"PostDescriptionHint": "* Kommer att återges i förhandsgranskningen av artikellänken, stöder HTML",
"ReadMore": "Fortsätta läsa",
"MemberNotPublishedPostYet": "Inga inlägg ännu!",
"UpdateUserWebSiteInfo": "Exempel: https://johndoe.com",
"UpdateUserTwitterInfo": "Exempel: johndoe",
"UpdateUserGithubInfo": "Exempel: johndoe",
"UpdateUserLinkedinInfo": "Exempel: https://www.linkedin.com/...",
"UpdateUserCompanyInfo": "Exempel: Volosoft",
"UpdateUserJobTitleInfo": "Exempel: Programvaruutvecklare",
"WebSite": "Webbplats",
"UserName": "Användarnamn",
"FullURL": "Full URL",
"JobTitle": "Befattning",
"PersonalWebsite": "PERSONLIG WEBBPLATS",
"EditProfile": "Redigera profil",
"MoreFromBlog": "Mer från bloggen",
"MoreFromUser": "Mer från {0}",
"BlogPosts": "Inlägg",
"Views": "utsikt",
"Biography": "Biografi",
"Social": "Sociala",
"NewBlogPost": "Nytt blogginlägg"
}
}

4
modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Detail.cshtml.cs

@ -98,7 +98,9 @@ namespace Volo.Blogging.Pages.Blogs.Posts
await GetData();
return Page();
// PRG pattern
// Redirect to the same page to prevent form resubmission
return RedirectToPage();
}
private async Task GetData()

259
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sv.json

@ -0,0 +1,259 @@
{
"culture": "sv",
"texts": {
"AddSubMenuItem": "Lägg till undermenyobjekt",
"AreYouSure": "Är du säker?",
"BlogDeletionConfirmationMessage": "Bloggen '{0}' kommer att raderas. Är du säker på det?",
"BlogFeatureNotAvailable": "Denna funktion är inte tillgänglig nu. Aktivera med 'GlobalFeatureManager' för att använda den.",
"BlogId": "Blogg",
"BlogPostDeletionConfirmationMessage": "Blogginlägget \"{0}\" kommer att raderas. Är du säker på det?",
"BlogPosts": "Blogginlägg",
"Blogs": "Blogg",
"ChoosePreference": "Välj preferens...",
"Cms": "CMS",
"CmsKit.Comments": "Kommentarer",
"CmsKit.Ratings": "Betyg",
"CmsKit.Reactions": "Reaktioner",
"CmsKit.Tags": "Etiketter",
"CmsKit:0002": "Innehållet finns redan!",
"CmsKit:0003": "Entiteten {0} är inte taggbar.",
"CmsKit:Blog:0001": "Den angivna sluggen ({Slug}) finns redan!",
"CmsKit:BlogPost:0001": "Den angivna sluggen finns redan!",
"CmsKit:Comments:0001": "Enheten {EntityType} är inte kommenterbar.",
"CmsKit:Media:0001": "'{Namn}' är inte ett giltigt medienamn.",
"CmsKit:Media:0002": "Enheten kan inte ha media.",
"CmsKit:Page:0001": "Den angivna webbadressen ({Slug}) finns redan. Vänligen försök med en annan webbadress.",
"CmsKit:Rating:0001": "Enheten {EntityType} kan inte betygsättas.",
"CmsKit:Reaction:0001": "Enheten {EntityType} kan inte ha reaktioner.",
"CmsKit:Tag:0002": "Enheten är inte taggbar!",
"CmsKit:MarkedItem:ToggleConfirmation": "Är du säker på att du vill växla det markerade objektet?",
"CommentAuthorizationExceptionMessage": "Dessa kommentarer är inte tillåtna för offentlig visning.",
"CmsKit:Modals:Login": "Logga in",
"CmsKit:Modals:LoginModalDefaultMessage": "Vänligen logga in för att fortsätta!",
"CmsKit:Modals:YouAreNotAuthenticated": "Denna åtgärd är inte auktoriserad för dig.",
"CommentDeletionConfirmationMessage": "Denna kommentar och alla svar kommer att raderas!",
"CmsKit:MarkedItem:0001": "Entiteten {EntityType} kan inte markeras.",
"CmsKit:MarkedItem:0002": "Ingen definition hittades för entitetstypen '{EntityType}'.",
"CmsKit:MarkedItem:0003": "Det finns redan en definition för entitetstypen '{EntityType}'. Varje entitetstyp bör endast ha en definition.",
"CmsKit:MarkedItem:LoginMessage": "Vänligen logga in för att markera denna artikel.",
"Comments": "Kommentarer",
"Content": "Innehåll",
"ContentDeletionConfirmationMessage": "Är du säker på att du vill radera detta innehåll?",
"Contents": "Innehåll",
"CoverImage": "Omslagsbild",
"CreateBlogPostPage": "Nytt blogginlägg",
"CreationTime": "Skapelsetid",
"Delete": "Radera",
"Detail": "Detalj",
"Details": "Detaljer",
"DisplayName": "Visa namn",
"DoYouPreferAdditionalEmails": "Vill du ha ytterligare e-postmeddelanden?",
"Edit": "Redigera",
"EndDate": "Slutdatum",
"EntityId": "Entitet Id",
"EntityType": "Typ av enhet",
"ExportCSV": "Exportera CSV",
"Features": "Funktioner",
"GenericDeletionConfirmationMessage": "Är du säker att du vill ta bort \"{0}\"?",
"IsActive": "Aktiv",
"LastModification": "Senaste modifiering",
"LastModificationTime": "Tidpunkt för senaste modifiering",
"LoginToAddComment": "Logga in för att lägga till en kommentar",
"LoginToRate": "Logga in för att betygsätta",
"LoginToReact": "Logga in för att reagera",
"LoginToReply": "Logga in för att svara",
"MainMenu": "Huvudmeny",
"MakeMainMenu": "Skapa huvudmeny",
"Menu:CMS": "CMS",
"Menus": "Menyer",
"MenuDeletionConfirmationMessage": "Menyn \"{0}\" kommer att raderas. Är du säker på det?",
"MenuItemDeletionConfirmationMessage": "Är du säker på att du vill ta bort det här menyalternativet?",
"MenuItemMoveConfirmMessage": "Är du säker på att du vill flytta '{0}' under '{1}'?",
"MenuItems": "Menyalternativ",
"Message": "Meddelande",
"MessageDeletionConfirmationMessage": "Denna kommentar kommer att raderas helt.",
"NewBlog": "Ny blogg",
"NewBlogPost": "Nytt blogginlägg",
"NewMenu": "Ny meny",
"NewMenuItem": "Nytt menyalternativ i rotmenyn",
"NewPage": "Ny sida",
"NewTag": "Ny etikett",
"NoMenuItems": "Det finns inget menyalternativ ännu!",
"OK": "OK",
"PageDeletionConfirmationMessage": "Är du säker på att du vill radera den här sidan?",
"PageId": "Sidan",
"Pages": "Sidor",
"PageSlugInformation": "Sluggen används på webbadressen. Din webbadress kommer att vara \"/{{slug}}\".",
"BlogSlugInformation": "Sluggen används på webbadressen. Din webbadress kommer att vara \"/{0}/{{slug}}\".",
"Permission:BlogManagement": "Hantering av bloggar",
"Permission:BlogManagement.Create": "Skapa",
"Permission:BlogManagement.Delete": "Radera",
"Permission:BlogManagement.Features": "Funktioner",
"Permission:BlogManagement.Update": "Uppdatering",
"Permission:BlogPostManagement": "Hantering av blogginlägg",
"Permission:BlogPostManagement.Create": "Skapa",
"Permission:BlogPostManagement.Delete": "Radera",
"Permission:BlogPostManagement.Update": "Uppdatering",
"Permission:BlogPostManagement.Publish": "Publicera",
"Permission:CmsKit": "CmsKit administratör",
"Permission:Comments": "Hur man hanterar",
"Permission:Comments.Delete": "Radera",
"Permission:Contents": "Hantering av innehåll",
"Permission:Contents.Create": "Skapa innehåll",
"Permission:Contents.Delete": "Ta bort innehåll",
"Permission:Contents.Update": "Uppdatera innehåll",
"Permission:MediaDescriptorManagement": "Hantering av media",
"Permission:MediaDescriptorManagement:Create": "Skapa",
"Permission:MediaDescriptorManagement:Delete": "Radera",
"Permission:MenuItemManagement": "Hantering av menyalternativ",
"Permission:MenuItemManagement.Create": "Skapa",
"Permission:MenuItemManagement.Delete": "Radera",
"Permission:MenuItemManagement.Update": "Uppdatering",
"Permission:MenuManagement": "Meny för hantering",
"Permission:MenuManagement.Create": "Skapa",
"Permission:MenuManagement.Delete": "Radera",
"Permission:MenuManagement.Update": "Uppdatering",
"Permission:Menus": "Meny för hantering",
"Permission:Menus.Create": "Skapa",
"Permission:Menus.Delete": "Radera",
"Permission:Menus.Update": "Uppdatering",
"Permission:PageManagement": "Hantering av sidor",
"Permission:PageManagement:Create": "Skapa",
"Permission:PageManagement:Delete": "Radera",
"Permission:PageManagement:Update": "Uppdatering",
"Permission:PageManagement:SetAsHomePage": "Ställ in som startsida",
"Permission:TagManagement": "Hantering av taggar",
"Permission:TagManagement.Create": "Skapa",
"Permission:TagManagement.Delete": "Radera",
"Permission:TagManagement.Update": "Uppdatering",
"Permission:GlobalResources": "Globala resurser",
"Permission:CmsKitPublic": "CmsKit allmän",
"Permission:Comments.DeleteAll": "Radera alla",
"PickYourReaction": "Välj din reaktion",
"Rating": "Betyg",
"RatingUndoMessage": "Ditt betyg kommer att ångras.",
"Reactions": "Reaktioner",
"Read": "Läs",
"RepliesToThisComment": "Svar på denna kommentar",
"Reply": "Svar",
"ReplyTo": "Svara på",
"SamplePageMessage": "En exempelsida för Pro-modulen",
"SaveChanges": "Spara ändringar",
"Script": "Skript",
"SelectAll": "Välj alla",
"Send": "Skicka",
"SendMessage": "Skicka meddelande",
"SelectedAuthor": "Författaren",
"ShortDescription": "Kort beskrivning",
"Slug": "Snigel",
"Source": "Källa",
"SourceUrl": "Källans webbadress",
"Star": "Stjärna",
"StartDate": "Startdatum",
"Style": "Stil",
"Subject": "Ämne",
"SubjectPlaceholder": "Vänligen skriv ett ämne",
"Submit": "Skicka in",
"Subscribe": "Prenumerera",
"SavedSuccessfully": "Sparad framgångsrikt!",
"TagDeletionConfirmationMessage": "Är du säker på att du vill ta bort taggen \"{0}\"?",
"Tags": "Etiketter",
"Text": "Text",
"ThankYou": "Tack så mycket",
"Title": "Titel",
"Undo": "Ångra",
"Update": "Uppdatering",
"UpdatePreferenceSuccessMessage": "Dina inställningar har sparats.",
"UpdateYourEmailPreferences": "Uppdatera dina e-postpreferenser",
"UnMakeMainMenu": "Unmake Huvudmeny",
"UploadFailedMessage": "Uppladdningen misslyckades.",
"UserId": "Användar-ID",
"Username": "Användarnamn",
"YourComment": "Din kommentar",
"YourEmailAddress": "Din e-postadress",
"YourFullName": "Ditt fullständiga namn",
"YourMessage": "Ditt meddelande",
"YourReply": "Ditt svar",
"MarkdownSupported": "Stöd för <a href=\"https://www.markdownguide.org/basic-syntax/\">Markdown</a>.",
"GlobalResources": "Globala resurser",
"CmsKit.BlogPost.Status.0": "Utkast",
"CmsKit.BlogPost.Status.1": "Publicerad",
"CmsKit.BlogPost.Status.2": "Väntar på recension",
"BlogPostPublishConfirmationMessage": "Är du säker på att du vill publicera blogginlägget \"{0}\"?",
"SuccessfullyPublished": "Framgångsrikt publicerad!",
"Draft": "Utkast",
"Publish": "Publicera",
"BlogPostDraftConfirmationMessage": "Är du säker på att du har angett blogginlägget \"{0}\" som utkast?",
"BlogPostSendToReviewConfirmationMessage": "Är du säker att du vill skicka blogginlägget \"{0}\" till administratörsgranskning för publicering?",
"SaveAsDraft": "Spara som utkast",
"SendToReview": "Skicka till recension",
"SendToReviewToPublish": "Skicka för granskning för publicering",
"BlogPostSendToReviewSuccessMessage": "Blogginlägget \"{0}\" har skickats till admin review för publicering.",
"HasBlogPostWaitingForReviewMessage": "Du har ett blogginlägg som väntar på att granskas. Klicka för att lista.",
"SelectAStatus": "Välj en status",
"Status": "Status",
"CmsKit.BlogPost.ScrollIndex": "Snabbnavigeringsfält i blogginlägg",
"CmsKit.BlogPost.PreventXssFeature": "Förhindra XSS",
"Add": "Lägg till",
"AddWidget": "Lägg till widget",
"PleaseConfigureWidgets": "Vänligen konfigurera widgets",
"SelectAnAuthor": "Välj en författare",
"InThisDocument": "I detta dokument",
"GoToTop": "Gå till toppen",
"SetAsHomePage": "Ändra status för startsidan",
"CompletedSettingAsHomePage": "Ställ in som startsida",
"IsHomePage": "Är hemsidan",
"RemovedSettingAsHomePage": "Borttagen inställning av startsidan",
"Feature:CmsKitGroup": "Cms-kit",
"Feature:BlogEnable": "Blogginlägg",
"Feature:BlogEnableDescription": "CMS Kits bloggpostsystem som gör det möjligt att skapa bloggar och inlägg dynamiskt i applikationen.",
"Feature:CommentEnable": "Kommentar",
"Feature:CommentEnableDescription": "CMS Kits kommentarsystem gör det möjligt att kommentera enheter som BlogPost.",
"Feature:GlobalResourceEnable": "Global resourcing",
"Feature:GlobalResourceEnableDescription": "CMS Kit's globala resoruces-funktion som gör det möjligt att hantera globala stilar och skript.",
"Feature:MenuEnable": "Meny",
"Feature:MenuEnableDescription": "CMS Kits dynamiska menysystem som gör det möjligt att lägga till/ta bort applikationsmenyer dynamiskt.",
"Feature:PageEnable": "Personsökning",
"Feature:PageEnableDescription": "CMS Kits sidosystem som gör det möjligt att skapa statiska sidor med en specifik URL.",
"Feature:RatingEnable": "Betyg",
"Feature:RatingEnableDescription": "CMS Kits betygssystem som gör det möjligt för användare att betygsätta enheter som BlogPost.",
"Feature:ReactionEnable": "Reaktion",
"Feature:ReactionEnableDescription": "CMS Kits reaktionssystem som gör det möjligt för användare att skicka reaktioner till enheter som BlogPost, Comments, etc.",
"Feature:TagEnable": "Taggning",
"Feature:TagEnableDescription": "CMS Kits taggsystem som gör det möjligt att tagga enheter som BlogPost.",
"Feature:MarkedItemEnable": "Markerat föremål",
"Feature:MarkedItemEnableDescription": "CMS Kits markeringssystem som gör det möjligt för användare att markera enheter som favoriter.",
"DeleteBlogPostMessage": "Bloggen kommer att raderas. Är du säker på det?",
"CaptchaCode": "Captcha-kod",
"CommentTextRequired": "Kommentar krävs",
"CaptchaCodeErrorMessage": "Det svar du angav för CAPTCHA var inte korrekt. Vänligen försök igen",
"CaptchaCodeMissingMessage": "Captcha-koden saknas!",
"UnAllowedExternalUrlMessage": "Du inkluderade en otillåten extern webbadress. Försök igen utan den externa webbadressen.",
"URL": "URL",
"PopularTags": "Populära taggar",
"RemoveCoverImageConfirmationMessage": "Är du säker på att du vill ta bort omslagsbilden?",
"RemoveCoverImage": "Ta bort omslagsbilden",
"CssClass": "CSS-klass",
"TagsHelpText": "Taggar ska vara kommaseparerade (t.ex.: tag1, tag2, tag3)",
"ThisPartOfContentCouldntBeLoaded": "Den här delen av innehållet kunde inte laddas.",
"DuplicateCommentAttemptMessage": "Duplikat försök att posta kommentar upptäckt. Din kommentar har redan skickats in.",
"NoBlogPostYet": "Inget blogginlägg ännu!",
"CmsKit:Comment": "Hur gör man",
"CmsKitCommentOptions:RequireApprovement": "Kräver godkännande för kommentarer",
"CmsKitCommentOptions:RequireApprovementDescription": "När funktionen är aktiverad måste kommentarer godkännas innan de publiceras.",
"CommentFilter:ApproveState": "Godkänna stat",
"ApproveState": "Godkänna stat",
"CommentFilter:0": "Alla",
"CommentFilter:1": "Godkänd",
"CommentFilter:2": "Avvisad",
"CommentFilter:4": "Väntar på",
"ApprovedSuccessfully": "Godkänd framgångsrikt",
"ApprovalRevokedSuccessfully": "Återkallat godkännande framgångsrikt",
"Approve": "Godkänna",
"Disapproved": "Avvisad",
"CommentAlertMessage": "Det finns {0} kommentarer som väntar på godkännande",
"Settings:Menu:CmsKit": "CMS",
"CommentsAwaitingApproval": "Kommentarer som väntar på godkännande",
"CommentSubmittedForApproval": "Din kommentar har skickats in för godkännande."
}
}

10
modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/sv.json

@ -0,0 +1,10 @@
{
"culture": "sv",
"texts": {
"DocsTitle": "VoloDocs",
"WelcomeVoloDocs": "Välkommen till VoloDocs!",
"NoProjectWarning": "Det finns inget definierat projekt ännu!",
"CreateYourFirstProject": "Klicka här för att starta ditt första projekt",
"NoProject": "Inget projekt!"
}
}

62
modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sv.json

@ -0,0 +1,62 @@
{
"culture": "sv",
"texts": {
"Permission:DocumentManagement": "Dokumenthantering",
"Permission:Projects": "Projekt",
"Permission:Edit": "Redigera",
"Permission:Delete": "Radera",
"Permission:Create": "Skapa",
"Permission:Documents": "Dokument",
"Menu:Documents": "Dokument",
"Menu:DocumentManagement": "Dokument",
"Menu:ProjectManagement": "Projekt",
"CreateANewProject": "Skapa ett nytt projekt",
"Edit": "Redigera",
"Create": "Skapa",
"Pull": "Dra från",
"Projects": "Projekt",
"Name": "Namn",
"ShortName": "Kortnamn",
"DocumentStoreType": "DokumentStoreTyp",
"Format": "Format",
"ShortNameInfoText": "Kommer att användas för unik URL.",
"DisplayName:Name": "Namn",
"DisplayName:ShortName": "Kort namn",
"DisplayName:Format": "Format",
"DisplayName:DefaultDocumentName": "Standardnamn för dokument",
"DisplayName:NavigationDocumentName": "Namn på navigeringsdokument",
"DisplayName:MinimumVersion": "Minsta version",
"DisplayName:MainWebsiteUrl": "URL för huvudwebbplats",
"DisplayName:LatestVersionBranchName": "Grennamn för senaste versionen",
"DisplayName:GitHubRootUrl": "URL för GitHub-rot",
"DisplayName:GitHubAccessToken": "Token för GitHub-åtkomst",
"DisplayName:GitHubUserAgent": "GitHub användaragent",
"DisplayName:GithubVersionProviderSource": "GitHub version leverantör källa",
"DisplayName:VersionBranchPrefix": "Prefix för versionsgren",
"DisplayName:All": "Dra alla",
"DisplayName:LanguageCode": "Språkkod",
"DisplayName:Version": "Version",
"Documents": "Dokument",
"RemoveFromCache": "Ta bort från cache och indexera på nytt",
"Reindex": "Återindexera",
"ReindexCompleted": "Omindexering slutförd",
"RemovedFromCache": "Borttagen från cache och indexerad på nytt",
"RemoveFromCacheConfirmation": "Är du säker på att du vill ta bort det här objektet från cacheminnet?",
"ReIndexDocumentConfirmation": "Är du säker att du vill indexera om \"{0}\"?",
"DeleteFromDatabase": "Ta bort från databasen",
"Deleted": "Borttagen",
"Search": "Sök",
"StartDate": "Startdatum",
"EndDate": "Slutdatum",
"CreationTime": "Skapelsetid",
"LastUpdateTime": "Senaste uppdatering",
"LastSignificantUpdateTime": "Senaste betydande uppdatering",
"Version": "Version",
"LanguageCode": "Språkkod",
"FileName": "Filens namn",
"LastCachedTime": "Cache-tid",
"Project": "Projekt",
"AdvancedFilters": "Avancerade filter",
"RemoveCacheAndReIndexConfirmation": "Dokumentet \"{0}\" kommer att tas bort från cacheminnet och indexeras på nytt. Kan du bekräfta detta?"
}
}

8
modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/ProjectDto.cs

@ -1,12 +1,12 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
namespace Volo.Docs.Admin.Projects
{
[Serializable]
public class ProjectDto : EntityDto<Guid>, IHasConcurrencyStamp
public class ProjectDto : EntityDto<Guid>, IHasConcurrencyStamp, IHasExtraProperties
{
public string Name { get; set; }
@ -28,8 +28,8 @@ namespace Volo.Docs.Admin.Projects
public string DocumentStoreType { get; set; }
public Dictionary<string, object> ExtraProperties { get; set; }
public string ConcurrencyStamp { get; set; }
public ExtraPropertyDictionary ExtraProperties { get; set; } = new();
}
}

18
modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs

@ -81,7 +81,7 @@ namespace Volo.Docs.Admin.Projects
foreach (var extraProperty in input.ExtraProperties)
{
project.ExtraProperties.Add(extraProperty.Key, extraProperty.Value);
project.SetProperty(extraProperty.Key, extraProperty.Value);
}
project = await _projectRepository.InsertAsync(project);
@ -106,7 +106,7 @@ namespace Volo.Docs.Admin.Projects
foreach (var extraProperty in input.ExtraProperties)
{
project.ExtraProperties[extraProperty.Key] = extraProperty.Value;
project.SetProperty(extraProperty.Key, extraProperty.Value);
}
project = await _projectRepository.UpdateAsync(project);
@ -134,18 +134,18 @@ namespace Volo.Docs.Admin.Projects
{
throw new Exception("Cannot find the project with the Id " + projectId);
}
await _elasticSearchService.DeleteAllByProjectIdAsync(project.Id);
var docsCount = await _documentRepository.GetUniqueDocumentCountByProjectIdAsync(projectId);
if (docsCount == 0)
{
return;
}
const int maxResultCount = 1000;
var skipCount = 0;
while(skipCount < docsCount)
{
@ -164,13 +164,13 @@ namespace Volo.Docs.Admin.Projects
{
_elasticSearchService.ValidateElasticSearchEnabled();
var projects = await _projectRepository.GetListAsync();
foreach (var project in projects)
{
await ReindexProjectAsync(project.Id);
}
}
public virtual async Task<List<ProjectWithoutDetailsDto>> GetListWithoutDetailsAsync()
{
var projects = await _projectRepository.GetListWithoutDetailsAsync();

17
modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Edit.cshtml.cs

@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc.Rendering;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Validation;
using Volo.Docs.Admin.Projects;
@ -34,7 +35,7 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects
public virtual async Task<ActionResult> OnGetAsync(Guid id)
{
var project = await _projectAppService.GetAsync(id);
if (project.DocumentStoreType == "GitHub")
{
SetGithubProjectFromDto(project);
@ -75,18 +76,18 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects
{
GithubProject = ObjectMapper.Map<ProjectDto,EditGithubProjectViewModel>(dto);
GithubProject.GitHubAccessToken = (string) dto.ExtraProperties[nameof(GithubProject.GitHubAccessToken)];
GithubProject.GitHubRootUrl = (string) dto.ExtraProperties[nameof(GithubProject.GitHubRootUrl)];
GithubProject.GitHubUserAgent = (string) dto.ExtraProperties[nameof(GithubProject.GitHubUserAgent)];
GithubProject.GitHubAccessToken = dto.GetProperty<string>(nameof(GithubProject.GitHubAccessToken));
GithubProject.GitHubRootUrl = dto.GetProperty<string>(nameof(GithubProject.GitHubRootUrl));
GithubProject.GitHubUserAgent = dto.GetProperty<string>(nameof(GithubProject.GitHubUserAgent));
if (dto.ExtraProperties.ContainsKey(nameof(GithubProject.GithubVersionProviderSource)))
if (dto.HasProperty(nameof(GithubProject.GithubVersionProviderSource)))
{
GithubProject.GithubVersionProviderSource = (GithubVersionProviderSource) (long) dto.ExtraProperties[nameof(GithubProject.GithubVersionProviderSource)];
GithubProject.GithubVersionProviderSource = dto.GetProperty<GithubVersionProviderSource>(nameof(GithubProject.GithubVersionProviderSource));
}
if (dto.ExtraProperties.ContainsKey(nameof(GithubProject.VersionBranchPrefix)))
if (dto.HasProperty(nameof(GithubProject.VersionBranchPrefix)))
{
GithubProject.VersionBranchPrefix = (string) dto.ExtraProperties[nameof(GithubProject.VersionBranchPrefix)];
GithubProject.VersionBranchPrefix = dto.GetProperty<string>(nameof(GithubProject.VersionBranchPrefix));
}
}

8
modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Projects/ProjectDto.cs

@ -1,11 +1,11 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
namespace Volo.Docs.Projects
{
[Serializable]
public class ProjectDto : EntityDto<Guid>
public class ProjectDto : EntityDto<Guid>, IHasExtraProperties
{
public string Name { get; set; }
@ -25,6 +25,6 @@ namespace Volo.Docs.Projects
public string DocumentStoreType { get; set; }
public Dictionary<string, object> ExtraProperties { get; set; }
public ExtraPropertyDictionary ExtraProperties { get; set; } = new();
}
}
}

39
modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs

@ -12,6 +12,7 @@ using Microsoft.Extensions.Options;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Caching;
using Volo.Abp.Data;
using Volo.Docs.Caching;
using Volo.Docs.Documents.FullSearch.Elastic;
using Volo.Docs.Projects;
@ -69,7 +70,7 @@ namespace Volo.Docs.Documents
var inputVersionStringBuilder = new StringBuilder();
input.Version = inputVersionStringBuilder.Append(GetProjectVersionPrefixIfExist(project)).Append(input.Version).ToString();
return await GetDocumentWithDetailsDtoAsync(
project,
input.Name,
@ -84,9 +85,9 @@ namespace Volo.Docs.Documents
var sb = new StringBuilder();
input.Version = sb.Append(GetProjectVersionPrefixIfExist(project)).Append(input.Version).ToString();
sb.Clear();
return await GetDocumentWithDetailsDtoAsync(
project,
sb.Append(project.DefaultDocumentName).Append(".").Append(project.Format).ToString(),
@ -298,7 +299,7 @@ namespace Volo.Docs.Documents
private string NormalizePath(string prefix, string path, string shortName, DocumentWithoutDetails document)
{
var pathWithoutFileExtension = RemoveFileExtensionFromPath(path, document.Format);
var normalizedPathStringBuilder = new StringBuilder();
normalizedPathStringBuilder.Append(prefix).Append(document.LanguageCode).Append("/").Append(shortName)
.Append("/").Append(document.Version).Append("/").Append(pathWithoutFileExtension);
@ -377,7 +378,7 @@ namespace Volo.Docs.Documents
{
return await GetDocumentAsync(documentName, project, languageCode, version);
}
var document = await _documentRepository.FindAsync(project.Id, GetPossibleNames(documentName, project.Format), languageCode, version);
if (document == null)
{
@ -417,7 +418,7 @@ namespace Volo.Docs.Documents
string languageCode, string version, Document oldDocument = null)
{
Logger.LogInformation($"Not found in the cache. Requesting {documentName} from the source...");
var sourceDocument = await GetSourceDocument(project, documentName, languageCode, version, oldDocument);
await _documentRepository.DeleteAsync(project.Id, sourceDocument.Name, sourceDocument.LanguageCode, sourceDocument.Version, autoSave: true);
@ -450,23 +451,23 @@ namespace Volo.Docs.Documents
{
return new List<string> {originalDocumentName};
}
var lowerCaseIndex = "index." + format;
var titleCaseIndex = "Index." + format;
var indexLength = lowerCaseIndex.Length;
var possibleNames = new List<string> {originalDocumentName};
if (originalDocumentName.EndsWith("/" + lowerCaseIndex, StringComparison.OrdinalIgnoreCase) || originalDocumentName.Equals(lowerCaseIndex, StringComparison.OrdinalIgnoreCase))
{
var indexPart = originalDocumentName.Right(indexLength);
var documentNameWithoutIndex = originalDocumentName.Left(originalDocumentName.Length - lowerCaseIndex.Length);
if(indexPart != lowerCaseIndex)
{
possibleNames.Add(documentNameWithoutIndex + lowerCaseIndex);
}
if(indexPart != titleCaseIndex)
{
possibleNames.Add(documentNameWithoutIndex + titleCaseIndex);
@ -481,14 +482,14 @@ namespace Volo.Docs.Documents
return possibleNames;
}
private async Task<Document> GetSourceDocument(Project project, string documentName,
string languageCode, string version, Document oldDocument)
{
var source = _documentStoreFactory.Create(project.DocumentStoreType);
Document sourceDocument = null;
Exception firstException = null;
foreach (var name in GetPossibleNames(documentName, project.Format))
{
@ -503,7 +504,7 @@ namespace Volo.Docs.Documents
firstException ??= ex;
}
}
if(sourceDocument == null)
{
throw firstException!;
@ -552,14 +553,14 @@ namespace Volo.Docs.Documents
return string.Empty;
}
return project.ExtraProperties["VersionBranchPrefix"].ToString();
return project.GetProperty<string>("VersionBranchPrefix");
}
private GithubVersionProviderSource GetGithubVersionProviderSource(Project project)
{
return project.ExtraProperties.ContainsKey("GithubVersionProviderSource")
? (GithubVersionProviderSource) (long) project.ExtraProperties["GithubVersionProviderSource"]
return project.HasProperty("GithubVersionProviderSource")
? project.GetProperty<GithubVersionProviderSource>("GithubVersionProviderSource")
: GithubVersionProviderSource.Releases;
}
}
}
}

19
modules/docs/src/Volo.Docs.Application/Volo/Docs/Projects/ProjectAppService.cs

@ -6,6 +6,7 @@ using Microsoft.Extensions.Caching.Distributed;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Caching;
using Volo.Abp.Data;
using Volo.Abp.Guids;
using Volo.Docs.Caching;
using Volo.Docs.Documents;
@ -41,7 +42,7 @@ namespace Volo.Docs.Projects
return new ListResultDto<ProjectDto>(
projectDtos.Select(p => HidePrivateProperties(p)).ToList()
);
);
}
public virtual async Task<ProjectDto> GetAsync(string shortName)
@ -136,30 +137,28 @@ namespace Volo.Docs.Projects
return string.Empty;
}
return project.ExtraProperties["VersionBranchPrefix"].ToString();
return project.GetProperty<string>("VersionBranchPrefix");
}
private GithubVersionProviderSource GetGithubVersionProviderSource(Project project)
{
return project.ExtraProperties.ContainsKey("GithubVersionProviderSource")
? (GithubVersionProviderSource) (long) project.ExtraProperties["GithubVersionProviderSource"]
return project.HasProperty("GithubVersionProviderSource")
? project.GetProperty<GithubVersionProviderSource>("GithubVersionProviderSource")
: GithubVersionProviderSource.Releases;
}
private ProjectDto HidePrivateProperties(ProjectDto project)
{
if (project.ExtraProperties.ContainsKey("GitHubAccessToken"))
if (project.HasProperty("GitHubAccessToken"))
{
project.ExtraProperties["GitHubAccessToken"] = null;
project.SetProperty("GitHubAccessToken", null);
}
if (project.ExtraProperties.ContainsKey("GitHubUserAgent"))
if (project.HasProperty("GitHubUserAgent"))
{
project.ExtraProperties["GitHubUserAgent"] = null;
project.SetProperty("GitHubUserAgent", null);
}
return project;
}
}

7
modules/docs/src/Volo.Docs.Domain/Volo/Docs/FileSystem/Projects/ProjectFileSystemExtensions.cs

@ -1,6 +1,7 @@
using System;
using JetBrains.Annotations;
using Volo.Abp;
using Volo.Abp.Data;
using Volo.Docs.FileSystem.Documents;
using Volo.Docs.Projects;
@ -11,13 +12,13 @@ namespace Volo.Docs.FileSystem.Projects
public static string GetFileSystemPath([NotNull] this Project project)
{
CheckFileSystemProject(project);
return project.ExtraProperties["Path"] as string;
return project.GetProperty<string>("Path");
}
public static void SetFileSystemPath([NotNull] this Project project, string value)
{
CheckFileSystemProject(project);
project.ExtraProperties["Path"] = value;
project.SetProperty("Path", value);
}
private static void CheckFileSystemProject(Project project)
@ -30,4 +31,4 @@ namespace Volo.Docs.FileSystem.Projects
}
}
}
}
}

17
modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentSource.cs

@ -11,6 +11,7 @@ using Volo.Docs.GitHub.Projects;
using Volo.Docs.Projects;
using Octokit;
using Volo.Abp;
using Volo.Abp.Data;
using Volo.Docs.GitHub.Documents.Version;
using Volo.Extensions;
using Project = Volo.Docs.Projects.Project;
@ -29,8 +30,8 @@ namespace Volo.Docs.GitHub.Documents
private readonly DocsGithubLanguageOptions _docsGithubLanguageOptions;
public GithubDocumentSource(
IGithubRepositoryManager githubRepositoryManager,
IGithubPatchAnalyzer githubPatchAnalyzer,
IGithubRepositoryManager githubRepositoryManager,
IGithubPatchAnalyzer githubPatchAnalyzer,
IDocumentRepository documentRepository,
IOptions<DocsGithubLanguageOptions> docsGithubLanguageOptions)
{
@ -275,7 +276,7 @@ namespace Volo.Docs.GitHub.Documents
if (githubVersionProviderSource == GithubVersionProviderSource.Branches && project.ExtraProperties.ContainsKey("VersionBranchPrefix"))
{
var prefix = (string) project.ExtraProperties["VersionBranchPrefix"];
var prefix = project.GetProperty<string>("VersionBranchPrefix");
if (!string.IsNullOrEmpty(prefix))
{
@ -307,8 +308,8 @@ namespace Volo.Docs.GitHub.Documents
private GithubVersionProviderSource GetGithubVersionProviderSource(Project project)
{
return project.ExtraProperties.ContainsKey("GithubVersionProviderSource")
? (GithubVersionProviderSource) (long) project.ExtraProperties["GithubVersionProviderSource"]
return project.HasProperty("GithubVersionProviderSource")
? project.GetProperty<GithubVersionProviderSource>("GithubVersionProviderSource")
: GithubVersionProviderSource.Releases;
}
@ -344,9 +345,9 @@ namespace Volo.Docs.GitHub.Documents
}
catch
{
Logger.LogWarning("Could not retrieved language list from Github. Using the default language from DocsGithubLanguageOptions.");
return new LanguageConfig
Logger.LogWarning("Could not retrieved language list from Github. Using the default language from DocsGithubLanguageOptions.");
return new LanguageConfig
{
Languages = new List<LanguageConfigElement> { _docsGithubLanguageOptions.DefaultLanguage }
};

16
modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs

@ -1,6 +1,7 @@
using System;
using JetBrains.Annotations;
using Volo.Abp;
using Volo.Abp.Data;
using Volo.Docs.GitHub.Documents;
using Volo.Docs.Projects;
@ -11,13 +12,12 @@ namespace Volo.Docs.GitHub.Projects
public static string GetGitHubUrl([NotNull] this Project project)
{
CheckGitHubProject(project);
return project.ExtraProperties["GitHubRootUrl"] as string;
return project.GetProperty<string>("GitHubRootUrl");
}
public static string GetGitHubInnerUrl([NotNull] this Project project, string languageCode, string documentName)
{
return project
.GetGitHubUrl().Split("{version}")[1].EnsureEndsWith('/').TrimStart('/') + languageCode + '/' + documentName;
return project.GetGitHubUrl().Split("{version}")[1].EnsureEndsWith('/').TrimStart('/') + languageCode + '/' + documentName;
}
public static string GetGitHubUrl([NotNull] this Project project, string version)
@ -30,25 +30,25 @@ namespace Volo.Docs.GitHub.Projects
public static void SetGitHubUrl([NotNull] this Project project, string value)
{
CheckGitHubProject(project);
project.ExtraProperties["GitHubRootUrl"] = value;
project.SetProperty("GitHubRootUrl", value);
}
public static string GetGitHubAccessTokenOrNull([NotNull] this Project project)
{
CheckGitHubProject(project);
return project.ExtraProperties["GitHubAccessToken"] as string;
return project.GetProperty<string>("GitHubAccessToken");
}
public static string GetGithubUserAgentOrNull([NotNull] this Project project)
{
CheckGitHubProject(project);
return project.ExtraProperties["GitHubUserAgent"] as string;
return project.GetProperty<string>("GitHubUserAgent");
}
public static void SetGitHubAccessToken([NotNull] this Project project, string value)
{
CheckGitHubProject(project);
project.ExtraProperties["GitHubAccessToken"] = value;
project.SetProperty("GitHubAccessToken", value);
}
private static void CheckGitHubProject(Project project)
@ -61,4 +61,4 @@ namespace Volo.Docs.GitHub.Projects
}
}
}
}
}

48
modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/sv.json

@ -0,0 +1,48 @@
{
"culture": "sv",
"texts": {
"Documents": "Dokument",
"BackToWebsite": "Tillbaka till webbplatsen",
"Contributors": "Medverkande",
"ShareOn": "Dela på",
"Version": "Version",
"Edit": "Redigera",
"LastEditTime": "Sista redigeringen",
"Delete": "Radera",
"ClearCache": "Rensa cache",
"ClearCacheConfirmationMessage": "Är du säker på att du vill rensa alla cacheminnen för projekt \"{0}\"",
"ReIndexAllProjects": "Omindexera alla projekt",
"ReIndexProject": "ReIndex-projektet",
"ReIndexProjectConfirmationMessage": "Är du säker på att omindexera för projekt \"{0}\"",
"SuccessfullyReIndexProject": "Framgångsrikt omindexerad: \"{0}\"",
"ReIndexAllProjectConfirmationMessage": "Är du säker på att omindexera alla projekt?",
"SuccessfullyReIndexAllProject": "Framgångsrik omindexering av alla projekt",
"InThisDocument": "I detta dokument",
"GoToTop": "Gå till toppen",
"Projects": "Projekt",
"NoProjectWarning": "Det finns inga projekt ännu!",
"DocumentNotFound": "Oops, det begärda dokumentet hittades inte!",
"ProjectNotFound": "Oops, det begärda projektet hittades inte!",
"NavigationDocumentNotFound": "Denna version har inte något navigationsdokument!",
"DocumentNotFoundInSelectedLanguage": "Dokumentet på det språk du ville ha hittades inte. Dokumentet visas på standardspråket.",
"FilterTopics": "Filtrera ämnen",
"FullSearch": "Sök i dokument",
"Volo.Docs.Domain:010001": "Elastisk sökning är inte aktiverad.",
"MultipleVersionDocumentInfo": "Det finns flera versioner av detta dokument. Välj de alternativ som passar dig bäst.",
"New": "Nya",
"Upd": "Uppdatering",
"NewExplanation": "Skapad under de senaste två veckorna.",
"UpdatedExplanation": "Uppdaterad under de senaste två veckorna.",
"Volo.Docs.Domain:010002": "Kortnamn {Kortnamn} finns redan.",
"Preview": "förhandsvisning",
"Search": "Sök",
"SearchResults": "Sökresultat",
"SearchInTheAllDocuments": "Sök i alla dokument",
"Next": "Nästa",
"Previous": "Föregående",
"ProjectDeletionWarningMessage": "Projektet kommer att raderas.",
"Docs_Page_Title": "ABP-dokumentation",
"Docs_Page_Description": "Få tillgång till omfattande guider och API-referenser i ABP Documentation, vilket underlättar utveckling och felsökning.",
"GoogleTranslate": "Google Översätt"
}
}

236
modules/docs/src/Volo.Docs.Web/HtmlConverting/ScribanDocumentSectionRenderer.cs

@ -13,8 +13,11 @@ namespace Volo.Docs.HtmlConverting
{
public class ScribanDocumentSectionRenderer : IDocumentSectionRenderer
{
private const string JsonOpener = "````json";
private const string JsonCloser = "````";
private readonly static List<DocsJsonSection> DocsJsonSections = new List<DocsJsonSection>
{
new DocsJsonSection("````json", "````"),
new DocsJsonSection("```json", "```")
};
private const string DocsParam = "//[doc-params]";
private const string DocsTemplates = "//[doc-template]";
private const string DocsNav = "//[doc-nav]";
@ -59,12 +62,12 @@ namespace Volo.Docs.HtmlConverting
{
try
{
if (!document.Contains(JsonOpener) || !document.Contains(sectionName))
if (!HasJsonSection(document) || !document.Contains(sectionName))
{
return new T();
}
var (jsonBeginningIndex, jsonEndingIndex, insideJsonSection) = GetJsonBeginEndIndexesAndPureJson(document, sectionName);
var (jsonBeginningIndex, jsonEndingIndex, insideJsonSection, _) = GetJsonBeginEndIndexesAndPureJson(document, sectionName);
if (jsonBeginningIndex < 0 || jsonEndingIndex <= 0 || string.IsNullOrWhiteSpace(insideJsonSection))
{
@ -96,12 +99,12 @@ namespace Volo.Docs.HtmlConverting
try
{
if (!document.Contains(JsonOpener) || !document.Contains(sectionName))
if (!HasJsonSection(document) || !document.Contains(sectionName))
{
continue;
}
var (jsonBeginningIndex, jsonEndingIndex, insideJsonSection) = GetJsonBeginEndIndexesAndPureJson(document, sectionName);
var (jsonBeginningIndex, jsonEndingIndex, insideJsonSection, jsonSection) = GetJsonBeginEndIndexesAndPureJson(document, sectionName);
if (jsonBeginningIndex < 0 || jsonEndingIndex <= 0 || string.IsNullOrWhiteSpace(insideJsonSection))
{
@ -109,8 +112,8 @@ namespace Volo.Docs.HtmlConverting
}
document = document.Remove(
jsonBeginningIndex - JsonOpener.Length,
(jsonEndingIndex + JsonCloser.Length) - (jsonBeginningIndex - JsonOpener.Length)
jsonBeginningIndex - jsonSection.Opener.Length,
(jsonEndingIndex + jsonSection.Closer.Length) - (jsonBeginningIndex - jsonSection.Opener.Length)
);
}
catch (Exception)
@ -121,122 +124,193 @@ namespace Volo.Docs.HtmlConverting
return document;
}
private static (int, int, string) GetJsonBeginEndIndexesAndPureJson(string document, string sectionName)
private static bool HasJsonSection(string document)
{
var searchedIndex = 0;
return DocsJsonSections.Any(section => document.Contains(section.Opener) && document.Contains(section.Closer));
}
while (searchedIndex < document.Length)
private static (int, int, string, DocsJsonSection) GetJsonBeginEndIndexesAndPureJson(string document, string sectionName)
{
foreach (var section in DocsJsonSections)
{
var jsonBeginningIndex = document.Substring(searchedIndex).IndexOf(JsonOpener, StringComparison.Ordinal) + JsonOpener.Length + searchedIndex;
if (jsonBeginningIndex < 0)
{
return (-1, -1, "");
}
var jsonEndingIndex = document.Substring(jsonBeginningIndex).IndexOf(JsonCloser, StringComparison.Ordinal) + jsonBeginningIndex;
var insideJsonSection = document[jsonBeginningIndex..jsonEndingIndex];
var (jsonBeginningIndex, jsonEndingIndex, insideJsonSection) = section.GetJsonBeginEndIndexesAndPureJson(document, sectionName);
if (insideJsonSection.IndexOf(sectionName, StringComparison.Ordinal) < 0)
if (jsonBeginningIndex >= 0 && jsonEndingIndex > 0 && !string.IsNullOrWhiteSpace(insideJsonSection))
{
searchedIndex = jsonEndingIndex + JsonCloser.Length;
continue;
return (jsonBeginningIndex, jsonEndingIndex, insideJsonSection, section);
}
return (jsonBeginningIndex, jsonEndingIndex, insideJsonSection);
}
return (-1, -1, "");
return (-1, -1, "", null);
}
public async Task<List<DocumentPartialTemplateWithValuesDto>> GetPartialTemplatesInDocumentAsync(string documentContent)
{
var templates = new List<DocumentPartialTemplateWithValuesDto>();
while (documentContent.Contains(JsonOpener))
foreach (var section in DocsJsonSections)
{
var afterJsonOpener = documentContent.Substring(
documentContent.IndexOf(JsonOpener, StringComparison.Ordinal) + JsonOpener.Length
);
templates.AddRange(await section.GetPartialTemplatesInDocumentAsync(documentContent));
}
var betweenJsonOpenerAndCloser = afterJsonOpener.Substring(0,
afterJsonOpener.IndexOf(JsonCloser, StringComparison.Ordinal)
);
return templates;
}
private static string SetPartialTemplates(string document, IReadOnlyCollection<DocumentPartialTemplateContent> templates)
{
foreach (var section in DocsJsonSections)
{
document = section.SetPartialTemplates(document, templates);
}
return document;
}
private class DocsJsonSection
{
public string Opener { get; }
public string Closer { get; }
public DocsJsonSection(string opener, string closer)
{
Opener = opener;
Closer = closer;
}
documentContent = afterJsonOpener.Substring(
afterJsonOpener.IndexOf(JsonCloser, StringComparison.Ordinal) + JsonCloser.Length
);
public (int, int, string) GetJsonBeginEndIndexesAndPureJson(string document, string sectionName)
{
var searchedIndex = 0;
if (!betweenJsonOpenerAndCloser.Contains(DocsTemplates))
while (searchedIndex < document.Length)
{
continue;
}
var jsonBeginningIndex = document.Substring(searchedIndex).IndexOf(Opener, StringComparison.Ordinal);
var json = betweenJsonOpenerAndCloser.Substring(betweenJsonOpenerAndCloser.IndexOf(DocsTemplates, StringComparison.Ordinal) + DocsTemplates.Length);
if (jsonBeginningIndex < 0)
{
return (-1, -1, "");
}
jsonBeginningIndex += Opener.Length + searchedIndex;
if (!DocsJsonSerializerHelper.TryDeserialize<DocumentPartialTemplateWithValuesDto>(json, out var template))
{
throw new UserFriendlyException($"ERROR-20200327: Cannot validate JSON content for `AvailableParameters`!");
}
var jsonEndingIndex = document.Substring(jsonBeginningIndex).IndexOf(Closer, StringComparison.Ordinal);
if (jsonEndingIndex < 0)
{
return (-1, -1, "");
}
jsonEndingIndex += jsonBeginningIndex;
var insideJsonSection = document[jsonBeginningIndex..jsonEndingIndex];
templates.Add(template);
}
if (insideJsonSection.IndexOf(sectionName, StringComparison.Ordinal) < 0)
{
searchedIndex = jsonEndingIndex + Closer.Length;
continue;
}
return await Task.FromResult(templates);
}
return (jsonBeginningIndex, jsonEndingIndex, insideJsonSection);
}
private static string SetPartialTemplates(string document, IReadOnlyCollection<DocumentPartialTemplateContent> templates)
{
var newDocument = new StringBuilder();
return (-1, -1, "");
}
while (document.Contains(JsonOpener))
public async Task<List<DocumentPartialTemplateWithValuesDto>> GetPartialTemplatesInDocumentAsync(
string documentContent)
{
var beforeJson = document.Substring(0,
document.IndexOf(JsonOpener, StringComparison.Ordinal) + JsonOpener.Length
);
var templates = new List<DocumentPartialTemplateWithValuesDto>();
var afterJsonOpener = document.Substring(
document.IndexOf(JsonOpener, StringComparison.Ordinal) + JsonOpener.Length
);
while (documentContent.Contains(Opener))
{
var afterJsonOpener = documentContent.Substring(
documentContent.IndexOf(Opener, StringComparison.Ordinal) + Opener.Length
);
var betweenJsonOpenerAndCloser = afterJsonOpener.Substring(0,
afterJsonOpener.IndexOf(JsonCloser, StringComparison.Ordinal)
);
var betweenJsonOpenerAndCloser = afterJsonOpener.Substring(0,
afterJsonOpener.IndexOf(Closer, StringComparison.Ordinal)
);
if (!betweenJsonOpenerAndCloser.Contains(DocsTemplates))
{
document = afterJsonOpener.Substring(
afterJsonOpener.IndexOf(JsonCloser, StringComparison.Ordinal) + JsonCloser.Length
documentContent = afterJsonOpener.Substring(
afterJsonOpener.IndexOf(Closer, StringComparison.Ordinal) + Closer.Length
);
newDocument.Append(beforeJson + betweenJsonOpenerAndCloser + JsonCloser);
continue;
if (!betweenJsonOpenerAndCloser.Contains(DocsTemplates))
{
continue;
}
var json = betweenJsonOpenerAndCloser.Substring(
betweenJsonOpenerAndCloser.IndexOf(DocsTemplates, StringComparison.Ordinal) +
DocsTemplates.Length);
if (!DocsJsonSerializerHelper.TryDeserialize<DocumentPartialTemplateWithValuesDto>(json,
out var template))
{
throw new UserFriendlyException(
$"ERROR-20200327: Cannot validate JSON content for `AvailableParameters`!");
}
templates.Add(template);
}
var json = betweenJsonOpenerAndCloser.Substring(
betweenJsonOpenerAndCloser.IndexOf(DocsTemplates, StringComparison.Ordinal) + DocsTemplates.Length
);
return await Task.FromResult(templates);
}
public string SetPartialTemplates(string document,
IReadOnlyCollection<DocumentPartialTemplateContent> templates)
{
var newDocument = new StringBuilder();
if (DocsJsonSerializerHelper.TryDeserialize<DocumentPartialTemplateWithValuesDto>(json, out var documentPartialTemplateWithValuesDto))
while (document.Contains(Opener))
{
var template = templates.FirstOrDefault(t => t.Path == documentPartialTemplateWithValuesDto.Path);
var beforeJson = document.Substring(0,
document.IndexOf(Opener, StringComparison.Ordinal) + Opener.Length
);
var beforeTemplate = document.Substring(0,
document.IndexOf(JsonOpener, StringComparison.Ordinal)
var afterJsonOpener = document.Substring(
document.IndexOf(Opener, StringComparison.Ordinal) + Opener.Length
);
newDocument.Append(beforeTemplate + template?.Content + JsonCloser);
var betweenJsonOpenerAndCloser = afterJsonOpener.Substring(0,
afterJsonOpener.IndexOf(Closer, StringComparison.Ordinal)
);
if (!betweenJsonOpenerAndCloser.Contains(DocsTemplates))
{
document = afterJsonOpener.Substring(
afterJsonOpener.IndexOf(Closer, StringComparison.Ordinal) + Closer.Length
);
newDocument.Append(beforeJson + betweenJsonOpenerAndCloser + Closer);
continue;
}
document = afterJsonOpener.Substring(
afterJsonOpener.IndexOf(JsonCloser, StringComparison.Ordinal) + JsonCloser.Length
var json = betweenJsonOpenerAndCloser.Substring(
betweenJsonOpenerAndCloser.IndexOf(DocsTemplates, StringComparison.Ordinal) +
DocsTemplates.Length
);
if (DocsJsonSerializerHelper.TryDeserialize<DocumentPartialTemplateWithValuesDto>(json,
out var documentPartialTemplateWithValuesDto))
{
var template =
templates.FirstOrDefault(t => t.Path == documentPartialTemplateWithValuesDto.Path);
var beforeTemplate = document.Substring(0,
document.IndexOf(Opener, StringComparison.Ordinal)
);
newDocument.Append(beforeTemplate + template?.Content + Closer);
document = afterJsonOpener.Substring(
afterJsonOpener.IndexOf(Closer, StringComparison.Ordinal) + Closer.Length
);
}
}
}
newDocument.Append(document);
newDocument.Append(document);
return newDocument.ToString();
return newDocument.ToString();
}
}
}
}

2
modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs

@ -29,7 +29,7 @@ namespace Volo.Docs.Pages.Documents
{
if (_uiOptions.SingleProjectMode.Enable)
{
return RedirectToPage("/Documents/Project/Index");
return RedirectToPage("/Documents/Project/Index", new {version = DocsAppConsts.Latest });
}
var listResult = await _projectAppService.GetListAsync();

55
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs

@ -14,6 +14,7 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Docs.Documents;
using Volo.Docs.HtmlConverting;
@ -68,7 +69,7 @@ namespace Volo.Docs.Pages.Documents.Project
public string DocumentsUrlPrefix { get; set; }
public bool ShowProjectsCombobox { get; set; }
public bool ShowProjectsComboboxLabel { get; set; }
public bool IsVersionPreview { get; set; }
@ -83,8 +84,8 @@ namespace Volo.Docs.Pages.Documents.Project
public bool FullSearchEnabled { get; set; }
public bool IsLatestVersion { get; private set; }
public bool IsLatestVersion { get; private set; }
public DocumentNavigationsDto DocumentNavigationsDto { get; private set; }
private const int MaxDescriptionMetaTagLength = 200;
@ -93,7 +94,7 @@ namespace Volo.Docs.Pages.Documents.Project
private readonly IProjectAppService _projectAppService;
private readonly IDocumentSectionRenderer _documentSectionRenderer;
private readonly DocsUiOptions _uiOptions;
protected IDocsLinkGenerator DocsLinkGenerator => LazyServiceProvider.LazyGetRequiredService<IDocsLinkGenerator>();
public IndexModel(
@ -123,7 +124,7 @@ namespace Volo.Docs.Pages.Documents.Project
{
return Redirect(decodedUrl);
}
return await SetPageAsync();
}
@ -143,7 +144,7 @@ namespace Volo.Docs.Pages.Documents.Project
Response.StatusCode = 404;
return Page();
}
}
catch (EntityNotFoundException e)
{
@ -168,7 +169,7 @@ namespace Volo.Docs.Pages.Documents.Project
{
return RedirectToDefaultDocument();
}
var usingSingleLanguageMode = !_uiOptions.MultiLanguageMode && LanguageCode.IsNullOrWhiteSpace();
if (!usingSingleLanguageMode && !CheckLanguage())
@ -220,14 +221,14 @@ namespace Volo.Docs.Pages.Documents.Project
Project = await _projectAppService.GetAsync(ProjectName);
return;
}
var singleProjectName = ProjectName ?? _uiOptions.SingleProjectMode.ProjectName;
if (!singleProjectName.IsNullOrWhiteSpace())
{
Project = await _projectAppService.GetAsync(singleProjectName);
return;
}
var listResult = await _projectAppService.GetListAsync();
if (listResult.Items.Count == 1)
{
@ -265,12 +266,12 @@ namespace Volo.Docs.Pages.Documents.Project
{
return Request.Scheme + Uri.SchemeDelimiter + Request.Host.Value + Request.PathBase + DocsLinkGenerator.GenerateLink(ProjectName, LanguageCode, DocsAppConsts.Latest, DocumentName);
}
public string CreateDocumentLink(string documentName)
{
return DocsLinkGenerator.GenerateLink(ProjectName, LanguageCode, LatestVersionInfo.IsSelected ? DocsAppConsts.Latest : Version, documentName);
}
public string BuildDocumentUrl(string projectName, string languageCode, string version, string documentName)
{
return DocsLinkGenerator.GenerateLink(projectName, languageCode, version, documentName);
@ -279,13 +280,13 @@ namespace Volo.Docs.Pages.Documents.Project
private IActionResult RedirectToDefaultLanguage()
{
return Redirect(DocsLinkGenerator.GenerateLink(
ProjectName,
DefaultLanguageCode,
ProjectName,
DefaultLanguageCode,
LatestVersionInfo.IsSelected ? DocsAppConsts.Latest : Version,
DocumentName
));
}
private IActionResult RedirectToDefaultVersion()
{
return Redirect(DocsLinkGenerator.GenerateLink(
@ -301,7 +302,7 @@ namespace Volo.Docs.Pages.Documents.Project
return Redirect(DocsLinkGenerator.GenerateLink (
ProjectName,
DefaultLanguageCode,
LatestVersionInfo.IsSelected ? DocsAppConsts.Latest : Version,
LatestVersionInfo.IsSelected ? DocsAppConsts.Latest : Version,
""
));
}
@ -374,7 +375,7 @@ namespace Volo.Docs.Pages.Documents.Project
$"{DocsAppConsts.Latest}",
DocsAppConsts.Latest,
true);
if(string.Equals(Version, DocsAppConsts.Latest, StringComparison.OrdinalIgnoreCase))
{
Version = RemoveVersionPrefix(Project.LatestVersionBranchName);
@ -387,16 +388,16 @@ namespace Volo.Docs.Pages.Documents.Project
Value = CreateVersionLink(LatestVersionInfo, v.Version, DocumentName),
Selected = v.IsSelected
}).ToList();
IsLatestVersion = Version == LatestVersionInfo.Version;
return true;
}
private VersionInfoViewModel GetLatestVersionInfo(List<VersionInfoViewModel> versions)
{
if (Project.ExtraProperties.ContainsKey("GithubVersionProviderSource")
&& (GithubVersionProviderSource)(long)Project.ExtraProperties["GithubVersionProviderSource"] == GithubVersionProviderSource.Branches)
if (Project.HasProperty("GithubVersionProviderSource")
&& Project.GetProperty<GithubVersionProviderSource>("GithubVersionProviderSource") == GithubVersionProviderSource.Branches)
{
var LatestVersionBranchNameWithoutPrefix = RemoveVersionPrefix(Project.LatestVersionBranchName);
@ -418,12 +419,12 @@ namespace Volo.Docs.Pages.Documents.Project
private string RemoveVersionPrefix(string version)
{
if (!Project.ExtraProperties.ContainsKey("VersionBranchPrefix"))
if (!Project.HasProperty("VersionBranchPrefix"))
{
return version;
}
var prefix = Project.ExtraProperties["VersionBranchPrefix"]?.ToString();
var prefix = Project.GetProperty<string>("VersionBranchPrefix");
if (string.IsNullOrWhiteSpace(version) || string.IsNullOrWhiteSpace(prefix) || !version.StartsWith(prefix) || version.Length <= prefix.Length)
{
@ -435,8 +436,8 @@ namespace Volo.Docs.Pages.Documents.Project
private void SetLatestVersionBranchName(List<VersionInfoViewModel> versions)
{
if (!Project.ExtraProperties.ContainsKey("GithubVersionProviderSource")
|| (GithubVersionProviderSource)(long)Project.ExtraProperties["GithubVersionProviderSource"] == GithubVersionProviderSource.Releases)
if (!Project.HasProperty("GithubVersionProviderSource")
|| Project.GetProperty<GithubVersionProviderSource>("GithubVersionProviderSource") == GithubVersionProviderSource.Releases)
{
versions.First(v => !SemanticVersionHelper.IsPreRelease(v.Version)).Version = Project.LatestVersionBranchName;
}
@ -467,7 +468,7 @@ namespace Volo.Docs.Pages.Documents.Project
{
version = DocsAppConsts.Latest;
}
return DocsLinkGenerator.GenerateLink(ProjectName, LanguageCode, version, documentName);
}
@ -536,7 +537,7 @@ namespace Volo.Docs.Pages.Documents.Project
SetUserPreferences();
var partialTemplates = await GetDocumentPartialTemplatesAsync();
DocumentNavigationsDto = await _documentSectionRenderer.GetDocumentNavigationsAsync(Document.Content);
Document.Content = await _documentSectionRenderer.RenderAsync(Document.Content, UserPreferences, partialTemplates);
@ -819,4 +820,4 @@ namespace Volo.Docs.Pages.Documents.Project
return description.Truncate(MaxDescriptionMetaTagLength);
}
}
}
}

19
modules/docs/src/Volo.Docs.Web/Pages/Documents/Search.cshtml.cs

@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Pagination;
using Volo.Abp.Data;
using Volo.Docs.Documents;
using Volo.Docs.GitHub.Documents.Version;
using Volo.Docs.HtmlConverting;
@ -26,9 +27,9 @@ namespace Volo.Docs.Pages.Documents
[BindProperty(SupportsGet = true)] public string LanguageCode { get; set; }
[BindProperty(SupportsGet = true)] public string KeyWord { get; set; }
[BindProperty(SupportsGet = true)] public int CurrentPage { get; set; } = 1;
public PagerModel PagerModel { get; set; }
public ProjectDto Project { get; set; }
@ -73,8 +74,8 @@ namespace Volo.Docs.Pages.Documents
if (versions.Any() &&
string.Equals(Version, DocsAppConsts.Latest, StringComparison.OrdinalIgnoreCase))
{
if ((!Project.ExtraProperties.ContainsKey("GithubVersionProviderSource") ||
(GithubVersionProviderSource) (long) Project.ExtraProperties["GithubVersionProviderSource"] ==GithubVersionProviderSource.Releases) &&
if ((!Project.HasProperty("GithubVersionProviderSource") ||
Project.GetProperty<GithubVersionProviderSource>("GithubVersionProviderSource") ==GithubVersionProviderSource.Releases) &&
!string.IsNullOrEmpty(Project.LatestVersionBranchName))
{
Version = Project.LatestVersionBranchName;
@ -94,9 +95,9 @@ namespace Volo.Docs.Pages.Documents
MaxResultCount = 10,
SkipCount = (CurrentPage - 1) * 10
});
SearchOutputs = pagedSearchOutputs.Items.ToList();
PagerModel = new PagerModel(pagedSearchOutputs.TotalCount, 10, CurrentPage, 10, Url.Page("Search", new
{
ProjectName,
@ -120,7 +121,7 @@ namespace Volo.Docs.Pages.Documents
return Page();
}
private async Task SetProjectAsync()
{
if (!_uiOptions.SingleProjectMode.Enable)
@ -128,14 +129,14 @@ namespace Volo.Docs.Pages.Documents
Project = await _projectAppService.GetAsync(ProjectName);
return;
}
var singleProjectName = ProjectName ?? _uiOptions.SingleProjectMode.ProjectName;
if (!singleProjectName.IsNullOrWhiteSpace())
{
Project = await _projectAppService.GetAsync(singleProjectName);
return;
}
var listResult = await _projectAppService.GetListAsync();
if (listResult.Items.Count == 1)
{

17
modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/sv.json

@ -0,0 +1,17 @@
{
"culture": "sv",
"texts": {
"Features": "Funktioner",
"NoFeatureFoundMessage": "Det finns inte någon tillgänglig funktion.",
"ManageHostFeatures": "Hantera värdfunktioner",
"ManageHostFeaturesText": "Du kan hantera funktionerna på hostsidan genom att klicka på följande knapp.",
"Permission:FeatureManagement": "Hantering av funktioner",
"Permission:FeatureManagement.ManageHostFeatures": "Hantera värdfunktioner",
"Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} Funktionsvärdet är inte giltigt!",
"Menu:FeatureManagement": "Hantering av funktioner",
"ResetToDefault": "Återställ till standard",
"ResetedToDefault": "Återställd till standard",
"AreYouSure": "Är du säker?",
"AreYouSureToResetToDefault": "Är du säker på att återställa till standard?"
}
}

132
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sv.json

@ -0,0 +1,132 @@
{
"culture": "sv",
"texts": {
"Menu:IdentityManagement": "Identitetshantering",
"Users": "Användare",
"NewUser": "Ny användare",
"UserName": "Användarens namn",
"Surname": "Efternamn",
"EmailAddress": "E-postadress",
"PhoneNumber": "Telefonnummer",
"UserInformations": "Användarinformation",
"DisplayName:IsDefault": "Standard",
"DisplayName:IsStatic": "Statisk",
"DisplayName:IsPublic": "Allmänheten",
"Roles": "Roller",
"Password": "Lösenord",
"PersonalInfo": "Min profil",
"PersonalSettings": "Personliga inställningar",
"UserDeletionConfirmationMessage": "Användaren '{0}' kommer att raderas. Kan du bekräfta det?",
"RoleDeletionConfirmationMessage": "Roll '{0}' kommer att raderas. Kan du bekräfta det?",
"DisplayName:RoleName": "Namn på roll",
"DisplayName:UserName": "Användarens namn",
"DisplayName:Name": "Namn",
"DisplayName:Surname": "Efternamn",
"DisplayName:Password": "Lösenord",
"DisplayName:Email": "E-postadress",
"DisplayName:PhoneNumber": "Telefonnummer",
"DisplayName:TwoFactorEnabled": "Verifiering med två faktorer",
"DisplayName:IsActive": "Aktiv",
"DisplayName:LockoutEnabled": "Spärrat konto",
"Description:LockoutEnabled": "Lås konto efter misslyckade inloggningsförsök",
"NewRole": "Ny roll",
"RoleName": "Namn på roll",
"CreationTime": "Skapelsetid",
"Permissions": "Behörigheter",
"DisplayName:CurrentPassword": "Aktuellt lösenord",
"DisplayName:NewPassword": "Nytt lösenord",
"DisplayName:NewPasswordConfirm": "Bekräfta nytt lösenord",
"PasswordChangedMessage": "Ditt lösenord har ändrats framgångsrikt.",
"PersonalSettingsSavedMessage": "Dina personliga inställningar har sparats framgångsrikt.",
"Volo.Abp.Identity:DefaultError": "Ett okänt fel har uppstått.",
"Volo.Abp.Identity:ConcurrencyFailure": "Optimistisk samtidighetskontroll har misslyckats. Den entitet du arbetar med har ändrats av en annan användare. Kassera dina ändringar och försök igen.",
"Volo.Abp.Identity:DuplicateEmail": "E-post '{0}' är redan upptagen.",
"Volo.Abp.Identity:DuplicateRoleName": "Rollnamnet '{0}' är redan upptaget.",
"Volo.Abp.Identity:DuplicateUserName": "Användarnamnet '{0}' är redan upptaget.",
"Volo.Abp.Identity:InvalidEmail": "E-post '{0}' är ogiltig.",
"Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "Det angivna PasswordHasherCompatibilityMode är ogiltigt.",
"Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "Antalet iterationer måste vara ett positivt heltal.",
"Volo.Abp.Identity:InvalidRoleName": "Rollnamnet '{0}' är ogiltigt.",
"Volo.Abp.Identity:InvalidToken": "Ogiltig token.",
"Volo.Abp.Identity:InvalidUserName": "Användarnamn '{0}' är ogiltigt, kan bara innehålla bokstäver eller siffror.",
"InvalidUserName": "Användarnamnet '{0}' är ogiltigt.",
"Volo.Abp.Identity:LoginAlreadyAssociated": "En användare med den här inloggningen finns redan.",
"Volo.Abp.Identity:PasswordMismatch": "Felaktigt lösenord.",
"Volo.Abp.Identity:PasswordRequiresDigit": "Lösenord måste innehålla minst en siffra ('0'-'9').",
"Volo.Abp.Identity:PasswordRequiresLower": "Lösenord måste innehålla minst en gemen bokstav ('a'-'z').",
"Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Lösenord måste innehålla minst ett icke-alfanumeriskt tecken.",
"Volo.Abp.Identity:PasswordRequiresUpper": "Lösenord måste innehålla minst en versal ('A'-'Z').",
"Volo.Abp.Identity:PasswordTooShort": "Lösenord måste innehålla minst {0} tecken.",
"Volo.Abp.Identity:PasswordRequiresUniqueChars": "Lösenord måste innehålla minst {0} olika tecken.",
"Volo.Abp.Identity:RoleNotFound": "Roll {0} finns inte.",
"Volo.Abp.Identity:UserAlreadyHasPassword": "Användaren har redan ett lösenord inställt.",
"Volo.Abp.Identity:UserAlreadyInRole": "Användaren har redan rollen '{0}'.",
"Volo.Abp.Identity:UserLockedOut": "Användaren är utelåst.",
"Volo.Abp.Identity:UserLockoutNotEnabled": "Spärren är inte aktiverad för den här användaren.",
"Volo.Abp.Identity:UserNameNotFound": "Användaren {0} finns inte.",
"Volo.Abp.Identity:UserNotInRole": "Användaren är inte i rollen '{0}'.",
"Volo.Abp.Identity:PasswordConfirmationFailed": "Lösenordet stämmer inte överens med det bekräftade lösenordet.",
"Volo.Abp.Identity:NullSecurityStamp": "Användarens säkerhetsstämpel kan inte vara null.",
"Volo.Abp.Identity:RecoveryCodeRedemptionFailed": "Inlösen av återställningskod misslyckades.",
"Volo.Abp.Identity:010001": "Du kan inte radera ditt eget konto!",
"Volo.Abp.Identity:010002": "Det går inte att ange mer än {MaxUserMembershipCount} organisationsenhet för en användare!",
"Volo.Abp.Identity:010003": "Kan inte ändra lösenord för en externt inloggad användare!",
"Volo.Abp.Identity:010004": "Det finns redan en organisationsenhet med namnet {0}. Två enheter med samma namn kan inte skapas på samma nivå.",
"Volo.Abp.Identity:010005": "Statiska roller kan inte bytas namn på.",
"Volo.Abp.Identity:010006": "Statiska roller kan inte tas bort.",
"Volo.Abp.Identity:010007": "Du kan inte ändra din tvåfaktorsinställning.",
"Volo.Abp.Identity:010008": "Det är inte tillåtet att ändra inställningen för två faktorer.",
"Volo.Abp.Identity:010009": "Du kan inte delegera dig själv.",
"Volo.Abp.Identity:010021": "Namn finns: '{0}'.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Högsta tillåtna antal medlemskap i organisationsenheter för en användare",
"ThisUserIsNotActiveMessage": "Den här användaren är inte aktiv.",
"Permission:IdentityManagement": "Identitetshantering",
"Permission:RoleManagement": "Hantering av roller",
"Permission:Create": "Skapa",
"Permission:Edit": "Redigera",
"Permission:Delete": "Radera",
"Permission:ChangePermissions": "Ändra behörigheter",
"Permission:ManageRoles": "Hantera roller",
"Permission:UserManagement": "Hantering av användare",
"Permission:UserLookup": "Användaruppslagning",
"DisplayName:Abp.Identity.Password.RequiredLength": "Erforderlig längd",
"DisplayName:Abp.Identity.Password.RequiredUniqueChars": "Obligatoriska unika tecken nummer",
"DisplayName:Abp.Identity.Password.RequireNonAlphanumeric": "Obligatoriskt icke-alfanumeriskt tecken",
"DisplayName:Abp.Identity.Password.RequireLowercase": "Obligatoriskt tecken för gemener",
"DisplayName:Abp.Identity.Password.RequireUppercase": "Obligatoriskt tecken för versaler",
"DisplayName:Abp.Identity.Password.RequireDigit": "Nödvändig siffra",
"DisplayName:Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword": "Tvinga användare att regelbundet byta lösenord",
"DisplayName:Abp.Identity.Password.PasswordChangePeriodDays": "Period för byte av lösenord (dagar)",
"DisplayName:Abp.Identity.Lockout.AllowedForNewUsers": "Aktiverad för nya användare",
"DisplayName:Abp.Identity.Lockout.LockoutDuration": "Varaktighet för låsning (sekunder)",
"DisplayName:Abp.Identity.Lockout.MaxFailedAccessAttempts": "Max misslyckade åtkomstförsök",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "Kräver bekräftad e-post",
"DisplayName:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Tillåt användare att bekräfta sitt telefonnummer",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Kräver bekräftat telefonnummer",
"DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "Tillåt användare att ändra sina användarnamn",
"DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "Tillåt användare att ändra sina e-postadresser",
"Description:Abp.Identity.Password.RequiredLength": "Den minsta längd som ett lösenord måste ha.",
"Description:Abp.Identity.Password.RequiredUniqueChars": "Det minsta antal unika tecken som ett lösenord måste innehålla.",
"Description:Abp.Identity.Password.RequireNonAlphanumeric": "Om lösenorden måste innehålla ett icke-alfanumeriskt tecken.",
"Description:Abp.Identity.Password.RequireLowercase": "Om lösenorden måste innehålla ett ASCII-tecken med gemener.",
"Description:Abp.Identity.Password.RequireUppercase": "Om lösenorden måste innehålla ett ASCII-tecken i versaler.",
"Description:Abp.Identity.Password.RequireDigit": "Om lösenorden måste innehålla en siffra.",
"Description:Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword": "Om användare tvingas byta lösenord med jämna mellanrum.",
"Description:Abp.Identity.Password.PasswordChangePeriodDays": "Antal dagar som en användares lösenord är giltigt.",
"Description:Abp.Identity.Lockout.AllowedForNewUsers": "Om en ny användare kan låsas ute.",
"Description:Abp.Identity.Lockout.LockoutDuration": "Den tid som en användare är utelåst när en utelåsning inträffar.",
"Description:Abp.Identity.Lockout.MaxFailedAccessAttempts": "Det antal misslyckade åtkomstförsök som tillåts innan en användare låses ut, förutsatt att låsning är aktiverad.",
"Description:Abp.Identity.SignIn.RequireConfirmedEmail": "Om det krävs en bekräftad e-postadress för att logga in.",
"Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Huruvida phoneNumber kan bekräftas av användaren.",
"Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Om det krävs ett bekräftat telefonnummer för att logga in.",
"Description:Abp.Identity.User.IsUserNameUpdateEnabled": "Om användarnamnet kan uppdateras av användaren.",
"Description:Abp.Identity.User.IsEmailUpdateEnabled": "Om e-postmeddelandet kan uppdateras av användaren.",
"Details": "Detaljer",
"CreatedBy": "Skapad av",
"ModifiedBy": "Ändrad av",
"ModificationTime": "Tid för modifiering",
"PasswordUpdateTime": "Uppdateringstid för lösenord",
"LockoutEndTime": "Sluttid för låsning",
"FailedAccessCount": "Antal misslyckade åtkomster"
}
}

7
modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/LocalizationExtensions/sv.json

@ -0,0 +1,7 @@
{
"culture": "sv",
"texts": {
"Volo.Abp.Identity:PasswordTooShort": "Lösenordslängden måste vara större än {0} tecken.",
"Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Lösenordet måste innehålla minst ett icke-alfanumeriskt tecken."
}
}

16
modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/sv.json

@ -0,0 +1,16 @@
{
"culture": "sv",
"texts": {
"Volo.IdentityServer:DuplicateIdentityResourceName": "Identity Resursnamnet finns redan: {Namn}",
"Volo.IdentityServer:DuplicateApiResourceName": "Api-resursnamnet finns redan: {Namn}",
"Volo.IdentityServer:DuplicateApiScopeName": "Namnet på Api-omfånget finns redan: {Namn}",
"Volo.IdentityServer:DuplicateClientId": "KlientId finns redan: {KlientId}",
"UserLockedOut": "Användarkontot har låsts på grund av ogiltiga inloggningsförsök. Vänligen vänta ett tag och försök igen.",
"InvalidUserNameOrPassword": "Ogiltigt användarnamn eller lösenord!",
"LoginIsNotAllowed": "Du får inte logga in! Ditt konto är inaktivt eller så behöver du bekräfta din e-post eller ditt telefonnummer.",
"InvalidUsername": "Ogiltigt användarnamn eller lösenord!",
"InvalidAuthenticatorCode": "Ogiltig autentiseringskod!",
"InvalidRecoveryCode": "Ogiltig återställningskod!",
"TheTargetUserIsNotLinkedToYou": "Målanvändaren är inte kopplad till dig!"
}
}

15
modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/sv.json

@ -0,0 +1,15 @@
{
"culture": "sv",
"texts": {
"TheOpenIDConnectRequestCannotBeRetrieved": "OpenID Connect-begäran kan inte hämtas.",
"TheUserDetailsCannotBbeRetrieved": "Användaruppgifterna kan inte hämtas.",
"TheApplicationDetailsCannotBeFound": "Ansökningsuppgifterna kan inte hittas.",
"DetailsConcerningTheCallingClientApplicationCannotBeFound": "Detaljer om den anropande klientapplikationen kan inte hittas.",
"TheSpecifiedGrantTypeIsNotImplemented": "Den angivna grant-typen {0} är inte implementerad.",
"Authorization": "Auktorisering",
"DoYouWantToGrantAccessToYourData": "Vill du ge {0} tillgång till dina data?",
"ScopesRequested": "Begärda omfattningar",
"Accept": "Acceptera",
"Deny": "Förneka"
}
}

2
modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/OpenIddictAuthorization.cs

@ -1,5 +1,6 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.Timing;
namespace Volo.Abp.OpenIddict.Authorizations;
@ -22,6 +23,7 @@ public class OpenIddictAuthorization : FullAuditedAggregateRoot<Guid>
/// <summary>
/// Gets or sets the UTC creation date of the current authorization.
/// </summary>
[DisableDateTimeNormalization]
public virtual DateTime? CreationDate { get; set; }
/// <summary>

4
modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Tokens/OpenIddictToken.cs

@ -1,5 +1,6 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.Timing;
namespace Volo.Abp.OpenIddict.Tokens;
@ -27,11 +28,13 @@ public class OpenIddictToken : FullAuditedAggregateRoot<Guid>
/// <summary>
/// Gets or sets the UTC creation date of the current token.
/// </summary>
[DisableDateTimeNormalization]
public virtual DateTime? CreationDate { get; set; }
/// <summary>
/// Gets or sets the UTC expiration date of the current token.
/// </summary>
[DisableDateTimeNormalization]
public virtual DateTime? ExpirationDate { get; set; }
/// <summary>
@ -50,6 +53,7 @@ public class OpenIddictToken : FullAuditedAggregateRoot<Guid>
/// <summary>
/// Gets or sets the UTC redemption date of the current token.
/// </summary>
[DisableDateTimeNormalization]
public virtual DateTime? RedemptionDate { get; set; }
/// <summary>

11
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/sv.json

@ -0,0 +1,11 @@
{
"culture": "sv",
"texts": {
"Permissions": "Behörigheter",
"OnlyProviderPermissons": "Endast denna leverantör",
"All": "Alla",
"SelectAllInAllTabs": "Ge alla behörigheter",
"SelectAllInThisTab": "Välj alla",
"SaveWithoutAnyPermissionsWarningMessage": "Är du säker på att du vill spara utan några behörigheter?"
}
}

38
modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json

@ -0,0 +1,38 @@
{
"culture": "sv",
"texts": {
"Settings": "Inställningar",
"SavedSuccessfully": "Sparades framgångsrikt",
"Permission:SettingManagement": "Hantering av inställningar",
"Permission:Emailing": "E-post",
"Permission:EmailingTest": "Test av e-post",
"Permission:TimeZone": "Tidszon",
"SendTestEmail": "Skicka testmejl",
"SenderEmailAddress": "E-postadress till avsändaren",
"TargetEmailAddress": "E-postadress för målgruppen",
"Subject": "Ämne",
"Body": "Kropp",
"TestEmailSubject": "Testa e-post {0}",
"TestEmailBody": "Testa e-postmeddelandets brödtext här",
"SuccessfullySent": "Framgångsrikt skickat",
"Send": "Skicka",
"Menu:Emailing": "E-post",
"Menu:TimeZone": "Tidszon",
"DisplayName:Timezone": "Tidszon",
"TimezoneHelpText": "Denna inställning används för applikationsomfattande eller hyresgästbaserad.",
"SmtpHost": "Värd",
"SmtpPort": "Port",
"SmtpUserName": "Användarens namn",
"SmtpPassword": "Lösenord",
"SmtpDomain": "Domän",
"SmtpEnableSsl": "Aktivera ssl",
"SmtpUseDefaultCredentials": "Använda standardautentiseringsuppgifter",
"DefaultFromAddress": "Standard från adress",
"DefaultFromDisplayName": "Standard från visningsnamn",
"Feature:SettingManagementGroup": "Hantering av inställningar",
"Feature:SettingManagementEnable": "Aktivera hantering av inställningar",
"Feature:SettingManagementEnableDescription": "Aktivera inställningshanteringssystem i applikationen.",
"Feature:AllowChangingEmailSettings": "Tillåt ändring av e-postinställningar.",
"Feature:AllowChangingEmailSettingsDescription": "Tillåt ändring av e-postinställningar."
}
}

23
modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/sv.json

@ -0,0 +1,23 @@
{
"culture": "sv",
"texts": {
"Volo.Abp.TenantManagement:DuplicateTenantName": "Hyresgästens namn finns redan: {Namn}",
"Menu:TenantManagement": "Förvaltning av hyresgäster",
"Tenants": "Hyresgäster",
"NewTenant": "Ny hyresgäst",
"TenantName": "Hyresgästens namn",
"DisplayName:TenantName": "Hyresgästens namn",
"TenantDeletionConfirmationMessage": "Hyresgäst '{0}' kommer att raderas. Kan du bekräfta det?",
"ConnectionStrings": "Anslutningssträngar",
"DisplayName:DefaultConnectionString": "Standard anslutningssträng",
"DisplayName:UseSharedDatabase": "Använd den delade databasen",
"Permission:TenantManagement": "Förvaltning av hyresgäster",
"Permission:Create": "Skapa",
"Permission:Edit": "Redigera",
"Permission:Delete": "Radera",
"Permission:ManageConnectionStrings": "Hantera anslutningssträngar",
"Permission:ManageFeatures": "Hantera funktioner",
"DisplayName:AdminEmailAddress": "Admin E-postadress",
"DisplayName:AdminPassword": "Lösenord för administratör"
}
}

14
modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/sv.json

@ -0,0 +1,14 @@
{
"culture": "sv",
"texts": {
"VirtualFileExplorer": "Virtuell filutforskare",
"VirtualFileType": "Virtuell filtyp",
"Menu:VirtualFileExplorer": "Virtuell filutforskare",
"LastUpdateTime": "Senaste uppdateringstid",
"VirtualFileName": "Virtuellt filnamn",
"FileContent": "Filens innehåll",
"Size": "Storlek",
"BackToRoot": "Tillbaka till roten",
"EmptyFileInfoList": "Det finns inga virtuella filer"
}
}

6
npm/ng-packs/package.json

@ -44,7 +44,7 @@
},
"private": true,
"devDependencies": {
"@abp/ng.theme.lepton-x": "~3.3.0-rc.1",
"@abp/ng.theme.lepton-x": "~3.2.0",
"@abp/utils": "~8.3.0-rc.1",
"@angular-devkit/build-angular": "~17.3.0",
"@angular-devkit/core": "~17.3.0",
@ -124,10 +124,10 @@
"should-quote": "^1.0.0",
"ts-jest": "29.1.0",
"ts-node": "10.9.1",
"ts-toolbelt": "6.15.4",
"ts-toolbelt": "^9.0.0",
"tslib": "^2.0.0",
"tslint": "~6.1.0",
"typescript": "~5.3.0",
"typescript": "~5.4.0",
"zone.js": "~0.14.0"
},
"lint-staged": {

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

Loading…
Cancel
Save