Att bygga webbapplikationer i företagsklass kan vara komplext och tidskrÀvande.
ABP erbjuder den perfekta basinfrastrukturen som krÀvs för alla moderna ASP.NET Core-baserade lösningar i företagsklass. FrÄn design till driftsÀttning, hela utvecklingscykeln förstÀrks av ABP: s inbyggda funktioner och moduler.
",
+ "StartupTemplatesShortDescription": "Startup-mallar gör att du kan starta ditt projekt pÄ nÄgra sekunder.",
+ "UIFrameworksOptions": "Alternativ för ramverk för anvÀndargrÀnssnitt;",
+ "DatabaseProviderOptions": "Alternativ för databasleverantör;",
+ "PreBuiltApplicationModules": "Förbyggda applikationsmoduler",
+ "PreBuiltApplicationModulesShortDescription": "De vanligaste applikationskraven Àr redan utvecklade Ät dig som ÄteranvÀndbara moduler.",
+ "Account": "Konto",
+ "Blogging": "Bloggande",
+ "Identity": "Identitet",
+ "IdentityServer": "Identitetsserver",
+ "Saas": "Saas",
+ "LanguageManagement": "SprÄkhantering",
+ "TextTemplateManagement": "Hantering av textmallar",
+ "See All Modules": "SeAllaModuler",
+ "ABPSuite": "ABP-svit",
+ "AbpSuiteShortDescription": "ABP Suite Àr ett kompletterande verktyg till ABP-projekt.",
+ "AbpSuiteExplanation": "Det gör att du kan bygga webbsidor pÄ bara nÄgra minuter. Det Àr ett .NET Core Global-verktyg som kan installeras frÄn kommandoraden. Det kan skapa en ny ABP-lösning och generera CRUD-sidor frÄn databasen till frontend.",
+ "Details": "Detaljer",
+ "LeptonTheme": "Lepton tema",
+ "ProfessionalModernUIThemes": "Professionella, moderna UI-teman",
+ "LeptonThemeExplanation": "Lepton tillhandahÄller en rad Bootstrap-adminteman som fungerar som en solid grund för alla projekt som krÀver en adminpanel.",
+ "DefaultTheme": "Standardtema",
+ "MaterialTheme": "Materialtema",
+ "Default2Theme": "Standard 2 Tema",
+ "DarkTheme": "Mörkt tema",
+ "DarkBlueTheme": "MörkblÄtt tema",
+ "LightTheme": "Ljus tema",
+ "ProudToWorkWith": "Stolt över att arbeta med",
+ "OurConsumers": "Tusentals företag och utvecklare i över 70 lÀnder vÀrlden över förlitar sig pÄ ABP.",
+ "JoinOurConsumers": "Anslut dig till dem och bygg fantastiska produkter snabbt.",
+ "AdditionalServicesExplanation": "Behöver du ytterligare eller anpassade tjÀnster? Vi och vÄra partners kan tillhandahÄlla;",
+ "CustomProjectDevelopment": "Anpassad projektutveckling",
+ "CustomProjectDevelopmentExplanation": "Dedikerade utvecklare för dina anpassade projekt.",
+ "PortingExistingProjects": "Portning av befintliga projekt",
+ "PortingExistingProjectsExplanation": "Migrera dina Àldre projekt till ABP-plattformen.",
+ "LiveSupport": "Support i realtid",
+ "LiveSupportExplanation": "FjÀrrsupport i realtid nÀr du behöver det.",
+ "Training": "Utbildning",
+ "TrainingExplanation": "Dedikerad utbildning för dina utvecklare.",
+ "OnBoarding": "Onboarding",
+ "OnBoardingExplanation": "HjÀlp med att konfigurera dina utvecklings-, CI- och CD-miljöer.",
+ "PrioritizedTechnicalSupport": "Prioriterad teknisk support",
+ "PremiumSupportExplanation": "Förutom det stora samhÀllsstödet i ABP-ramverket svarar vÄrt supportteam pÄ tekniska frÄgor och problem frÄn de kommersiella anvÀndarna med hög prioritet.",
+ "SeeTheSupportOptions": "Kolla in supportalternativen",
+ "Contact": "Kontakt",
+ "TellUsWhatYouNeed": "BerÀtta för oss vad du behöver.",
+ "YourMessage": "Ditt meddelande",
+ "YourFullName": "Ditt fullstÀndiga namn",
+ "FirstNameField": "Förnamn",
+ "LastNameField": "Efternamn",
+ "EmailField": "E-postadress",
+ "YourEmailAddress": "Din e-postadress",
+ "ValidEmailAddressIsRequired": "En giltig e-postadress krÀvs.",
+ "HowMayWeHelpYou": "Hur kan vi hjÀlpa dig?",
+ "SendMessage": "Skicka meddelande",
+ "Success": "FramgÄng",
+ "WeWillReplyYou": "Vi har mottagit ditt meddelande och kommer att kontakta dig inom kort.",
+ "GoHome": "GĂ„ hem",
+ "CreateLiveDemo": "Skapa live-demo",
+ "CreateLiveDemoDescription": "NÀr du har skickat in formulÀret kommer du att fÄ ett e-postmeddelande med din demolÀnk.",
+ "RegisterToTheNewsletter": "AnmÀl dig till nyhetsbrevet för att fÄ information om ABP.IO, inklusive nya releaser etc.",
+ "EnterYourEmailOrLogin": "Ange din e-postadress för att skapa din demo eller Logga in med ditt befintliga konto.",
+ "ApplicationTemplate": "Mall för ansökan",
+ "ApplicationTemplateExplanation": "Application startup template anvÀnds för att skapa en ny webbapplikation.",
+ "EfCoreProvider": "Entity Framework (Stödjer SQL Server, MySQL, PostgreSQL, Oracle och andra)",
+ "AlreadyIncludedInTemplateModules": "Följande moduler Àr redan inkluderade och konfigurerade i den hÀr mallen:",
+ "ApplicationTemplateArchitecture": "Den hÀr applikationsmallen stöder ocksÄ nivÄindelad arkitektur dÀr anvÀndargrÀnssnittslagret, API-lagret och autentiseringstjÀnsten Àr fysiskt Ätskilda.",
+ "SeeTheGuideOrGoToTheLiveDemo": "Kolla in utvecklarguiden för teknisk information om den hÀr mallen eller gÄ till live-demonstrationen.",
+ "DeveloperGuide": "Guide för utvecklare",
+ "ModuleTemplate": "Mall för modul",
+ "ModuleTemplateExplanation1": "Vill du skapa en modul och ÄteranvÀnda den i olika applikationer? Den hÀr startmallen förbereder allt för att börja skapa en ÄteranvÀndbar applikationsmodul eller en mikrotjÀnst.",
+ "ModuleTemplateExplanation2": "
Du kan stödja enstaka eller flera anvÀndargrÀnssnittsramverk, enstaka eller flera databasleverantörer för en enda modul. Startmallen Àr konfigurerad för att köra och testa din modul i en minimal applikation utöver infrastrukturen för enhets- och integrationstest.
Se utvecklarguiden för teknisk information om den hÀr mallen.
",
+ "WithAllStyleOptions": "med alla stilalternativ",
+ "Demo": "Demo",
+ "SeeAllModules": "Se alla moduler",
+ "ABPCLIExplanation": "ABP CLI (Command Line Interface) Àr ett kommandoradsverktyg för att utföra vissa vanliga ÄtgÀrder för ABP-baserade lösningar.",
+ "ABPSuiteEasilyCURD": "ABP Suite Àr ett verktyg som gör att du enkelt kan skapa CRUD-sidor",
+ "WeAreHereToHelp": "Vi Àr hÀr för att hjÀlpa",
+ "BrowseOrAskQuestion": "Du kan blÀddra i vÄra hjÀlpÀmnen eller söka i vanliga frÄgor, eller sÄ kan du stÀlla en frÄga till oss genom att anvÀnda kontaktformulÀret.",
+ "SearchQuestionPlaceholder": "Sök i vanliga frÄgor och svar",
+ "WhatIsTheABPCommercial": "Vad Àr ABP?",
+ "WhatAreDifferencesThanAbpFramework": "Vilka Àr skillnaderna mellan ABP med öppen kÀllkod och den kommersiella versionen av ABP?",
+ "AbpCommercialMetaTitle": " {0} | ABP",
+ "AbpCommercialMetaDescription": "En omfattande webbutvecklingsplattform pÄ ABP Framework med förbyggda moduler, startmallar, verktyg för snabb utveckling, proffsiga UI-teman och premiumsupport.",
+ "ABPCommercialExplanation": "ABP Platform Àr en uppsÀttning premiummoduler, verktyg, teman och tjÀnster som Àr byggda pÄ toppen av open source ABP-ramverket. ABP utvecklas och stöds av samma team som ligger bakom ABP-ramverket.",
+ "WhatAreDifferencesThanABPFrameworkExplanation": "
ABP-ramverket Àr ett modulÀrt, tematiserbart, mikrotjÀnstkompatibelt ramverk för applikationsutveckling för ASP.NET Core. Det ger en komplett arkitektur och en stark infrastruktur sÄ att du kan fokusera pÄ din egen affÀrskod istÀllet för att upprepa dig sjÀlv för varje nytt projekt. Det Àr baserat pÄ bÀsta praxis för mjukvaruutveckling och populÀra verktyg som du redan kÀnner till.
ABP-ramverket Àr helt gratis, öppen kÀllkod och community-driven. Det ger ocksÄ ett gratis tema och nÄgra förbyggda moduler (t.ex. identitetshantering och hyresgÀsthantering).
<",
+ "VisitTheFrameworkVSCommercialDocument": "Besök följande lÀnk för mer information {1} ",
+ "ABPCommercialFollowingBenefits": "ABP kommersiell version lÀgger till följande fördelar ovanpÄ ABP-ramverket:",
+ "Professional": "Professionell",
+ "UIThemes": "Teman för anvÀndargrÀnssnitt",
+ "EnterpriseModules": "Enterprise ready, funktionsrika, förbyggda applikationsmoduler (t.ex. hantering av identitetsserver, SaaS-hantering, sprÄkhantering)",
+ "ToolingToSupport": "Verktyg för att stödja din utvecklingsproduktivitet (t.ex. ABP Suite)",
+ "PremiumSupportLink": "Premium Support",
+ "WhatDoIDownloadABPCommercial": "Vad laddar jag ner nÀr jag köper den kommersiella versionen av ABP?",
+ "CreateUnlimitedSolutions": "NÀr du har köpt en ABP Commercial-licens kan du skapa obegrÀnsade lösningar som beskrivs i dokumentet GÄ igÄng.",
+ "ABPCommercialSolutionExplanation": "NÀr du skapar en ny applikation fÄr du en Visual Studio-lösning (en startmall) som baseras pÄ dina önskemÄl. Den nedladdade lösningen har kommersiella moduler och teman som redan Àr installerade och konfigurerade Ät dig. Du kan ta bort en förinstallerad modul eller lÀgga till en annan modul om du vill. Alla moduler och teman anvÀnder NuGet/NPM-paket som standard.",
+ "StartDevelopWithTutorials": "Den nedladdade lösningen Àr vÀl arkitekterad och dokumenterad. Du kan börja utveckla din egen företagskod baserad pÄ den genom att följa handledningarna.",
+ "TryTheCommercialDemo": "Du kan prova Live Demo för att se ett exempel pÄ en applikation som skapats med hjÀlp av ABP-startmallen.",
+ "HowManyProducts": "Hur mÄnga olika produkter/lösningar kan jag bygga med hjÀlp av ABP?",
+ "HowManyProductsExplanation": "Du kan skapa sÄ mÄnga projekt du vill under din aktiva licensperiod; det finns ingen grÀns! Efter att din licens har löpt ut kan du inte skapa nya projekt, men du kan fortsÀtta att utveckla de projekt du har laddat ner och distribuera dem till ett obegrÀnsat antal servrar.",
+ "HowManyDevelopers": "Hur mÄnga utvecklare kan arbeta med ABP?",
+ "HowManyDevelopersExplanation": "ABP-licenser Àr per utvecklare. Olika licenstyper har olika grÀnser för utvecklare. Du kan dock lÀgga till fler utvecklare till vilken licenstyp som helst nÀr du behöver. Kolla in sidan Planer och priser för licenstyper, utvecklargrÀnser och ytterligare utvecklingskostnader.",
+ "ChangingLicenseType": "Kan jag uppgradera min licenstyp senare?",
+ "ChangingLicenseTypeExplanation": "Du kan uppgradera till en högre licens genom att betala mellanskillnaden inom din aktiva licensperiod. NÀr du uppgraderar till en högre licensplan fÄr du fördelarna med den nya planen, men licensuppgraderingen Àndrar inte licensens utgÄngsdatum. Dessutom kan du ocksÄ lÀgga till nya utvecklarplatser till din befintliga licens, kolla in \"Hur mÄnga utvecklare kan arbeta med ABP?\" VANLIGA FRà GOR.",
+ "LicenseExtendUpgradeDiff": "Vad Àr skillnaden mellan licensförlÀngning och uppgradering?",
+ "LicenseExtendUpgradeDiffExplanation": "FörlÀngning: Genom att förlÀnga/förnya din licens kommer du att fortsÀtta att fÄ premiumsupport och fÄ större eller mindre uppdateringar för modulerna och teman. Dessutom kommer du att kunna fortsÀtta skapa nya projekt. Och du kommer fortfarande att kunna anvÀnda ABP Suite, vilket pÄskyndar din utveckling. NÀr du förlÀnger din licens lÀggs 1 Är till licensens utgÄngsdatum. Uppgradering: Genom att uppgradera din licens kommer du att befordras till en högre licensplan, vilket gör att du kan fÄ ytterligare fördelar. Kolla in jÀmförelsetabellen för licenser för att se skillnaderna mellan licensplanerna. NÀr du uppgraderar Àndras dÀremot inte licensens utgÄngsdatum! För att förlÀnga licensens slutdatum mÄste du förlÀnga din licens.",
+ "LicenseRenewalCost": "Vad Àr kostnaden för licensförnyelse efter 1 Är?",
+ "LicenseRenewalCostExplanation": "Priset för förnyelse (förlÀngning) av standard Team License Àr ${0}, standard Business License Àr ${1} och standard Enterprise License Àr ${2}. Om du redan Àr kund, logga in pÄ ditt konto för att granska den aktuella förnyelseprissÀttningen.",
+ "HowDoIRenewMyLicense": "Hur förnyar jag min licens?",
+ "HowDoIRenewMyLicenseExplanation": "Du kan förnya din licens genom att navigera till organisationshanteringssidan. För att dra nytta av vÄra rabatterade priser för tidig förnyelse, se till att du förnyar innan din licens löper ut. Oroa dig inte för att du inte vet nÀr din möjlighet till tidig förnyelse stÀngs; du kommer att fÄ 3 pÄminnelse-e-postmeddelanden innan din prenumeration löper ut. Vi skickar dem 30 dagar, 7 dagar och 1 dag före utgÄngen.",
+ "IsSourceCodeIncluded": "Omfattar min licens kÀllkoden för pro-modulerna och teman?",
+ "IsSourceCodeIncludedExplanation1": "Beror pÄ vilken licenstyp du har köpt:",
+ "IsSourceCodeIncludedExplanation2": "Team: Din lösning anvÀnder moduler och teman som NuGet- och NPM-paket. Den inkluderar inte deras kÀllkod. PÄ sÄ sÀtt kan du enkelt uppgradera dessa moduler och teman nÀr en ny version Àr tillgÀnglig. Du kan dock inte fÄ kÀllkoden för dessa moduler och teman.",
+ "IsSourceCodeIncludedExplanation3": "Business/Enterprise: Utöver Team-licensen kan du ladda ner kÀllkoden för alla moduler eller teman du behöver. Du kan till och med ta bort NuGet/NPM-paketreferenserna för en viss modul och lÀgga till dess kÀllkod direkt i din lösning för att Àndra den helt.",
+ "IsSourceCodeIncludedExplanation4": "
Att inkludera kÀllkoden för en modul i din lösning ger dig maximal frihet att anpassa den modulen. Det kommer dock inte att vara möjligt att automatiskt uppgradera modulen nÀr en ny version slÀpps.
Ingen av licenserna inkluderar kÀllkoden för ABP Suite och ABP Studio, vilket Àr externa verktyg som genererar kod Ät dig och hjÀlper din utveckling.
Kolla in sidan Planer och priser för andra skillnader mellan licenstyperna.
<",
+ "ChangingDevelopers": "Kan jag Àndra de registrerade utvecklarna för min organisation i framtiden?",
+ "ChangingDevelopersExplanation": "Förutom att lÀgga till nya utvecklare till din licens kan du ocksÄ Àndra befintliga utvecklare (du kan ta bort en utvecklare och lÀgga till en ny pÄ samma plats) utan nÄgon extra kostnad.",
+ "WhatHappensWhenLicenseEnds": "Vad hÀnder nÀr min licensperiod upphör?",
+ "WhatHappensWhenLicenseEndsExplanation1": "ABP-licensen Àr en perpetuell licens. NÀr din licens löper ut kan du fortsÀtta att utveckla ditt projekt. Och du Àr inte skyldig att förnya din licens. Din licens levereras med en ettÄrig uppdaterings- och supportplan direkt ur lÄdan. För att fortsÀtta fÄ nya funktioner, prestandaförbÀttringar, buggfixar, support och fortsÀtta anvÀnda ABP Suite mÄste du förnya din licens. NÀr din licens löper ut;",
+ "WhatHappensWhenLicenseEndsExplanation2": "Du kan inte skapa nya lösningar med hjÀlp av den kommersiella versionen av ABP, men du kan fortsÀtta att utveckla dina befintliga applikationer för alltid.",
+ "WhatHappensWhenLicenseEndsExplanation3": "Du kommer att kunna fÄ uppdateringar för modulerna och teman inom din MINOR-version (utom RC- eller Preview-versioner). Om du t.ex. anvÀnder v3.2.0 av en modul kan du fortfarande fÄ uppdateringar för v3.2.x (v3.2.1, v3.2.5... etc.) av den modulen. Men du kan inte fÄ uppdateringar för nÀsta större eller mindre version (som v3.3.0, v3.3.3, 4.x.x.. etc.). Till exempel, nÀr din licens löpte ut, den senaste versionen var v4.4.3, och senare publicerade den bÄde 4.4.4-versionen och 4.5.0-versionen, skulle du kunna komma Ät v4.4.X men du skulle inte komma Ät v4.5.X.",
+ "WhatHappensWhenLicenseEndsExplanation4": "Du kan inte installera nya moduler och teman som lÀggs till i ABP:s kommersiella plattform efter att din licens har upphört.",
+ "WhatHappensWhenLicenseEndsExplanation5": "Du kan inte anvÀnda ABP Suite.",
+ "WhatHappensWhenLicenseEndsExplanation6": "Du kan inte fÄ premium support lÀngre.",
+ "WhatHappensWhenLicenseEndsExplanation7": "Du kan förlÀnga (förnya) din licens om du vill fortsÀtta att fÄ dessa förmÄner. Om du förlÀnger din licens inom {3} dagar efter att din licens har löpt ut, kommer följande rabatter att tillÀmpas: Teamlicens {0}; Företagslicens {1}; Enterprise-licens {2}.",
+ "discountForYears": "{0}% rabatt för {1} Är",
+ "WhatHappensWhenLicenseEndsExplanation8": "De ABP-projekt som du genererar lagras inte pÄ vÄra servrar. DÀrför Àr det ditt ansvar att behÄlla kÀllkoden som du laddar ner. NÀr din licens löper ut finns det inget sÀtt att fÄ tag pÄ kÀllkoden för dina genererade ABP-projekt.",
+ "WhenShouldIRenewMyLicense": "NÀr ska jag förnya min licens?",
+ "WhenShouldIRenewMyLicenseExplanation": "Om du förnyar din licens inom {3} dagar efter att din licens har löpt ut, kommer följande rabatter att tillÀmpas: Teamlicens {0}; Företagslicens {1}; Enterprise-licens {2}. Men om du förnyar din licens efter {3} dagar efter licensens utgÄngsdatum, kommer förnyelsepriset att vara detsamma som licensens inköpspris och det kommer inte att finnas nÄgon rabatt pÄ din förnyelse.",
+ "TrialPlan": "Har du en testplan?",
+ "TrialPlanExplanation": "Ja, för att starta din kostnadsfria testversion, kontakta marketing@volosoft.com. Vi erbjuder ocksÄ en 30-dagars pengarna-tillbaka-garanti för Team-licensen, inga frÄgor stÀlls! Du kan begÀra full Äterbetalning inom de första 30 dagarna efter licensköpet. Vi ger 60% Äterbetalning inom 30 dagar för Business- och Enterprise-licenser. Detta beror pÄ att Business- och Enterprise-licenserna innehÄller den fullstÀndiga kÀllkoden för alla moduler och teman.",
+ "DoYouAcceptBankWireTransfer": "Accepterar ni banköverföringar?",
+ "DoYouAcceptBankWireTransferExplanation": "Ja, vi accepterar banköverföringar. NÀr du har skickat licensavgiften via banköverföring, skicka ditt kvitto och önskad licenstyp till accounting@volosoft.com. VÄr internationella bankkontoinformation:",
+ "HowToUpgrade": "Hur uppgraderar man befintliga applikationer nÀr en ny version finns tillgÀnglig?",
+ "HowToUpgradeExplanation1": "NÀr du skapar en ny applikation med hjÀlp av ABP anvÀnds alla moduler och teman som NuGet- och NPM-paket. PÄ sÄ sÀtt kan du enkelt uppgradera paketen nÀr en ny version finns tillgÀnglig.",
+ "HowToUpgradeExplanation2": "Förutom de vanliga NuGet/NPM-uppgraderingarna tillhandahÄller ABP CLI ett uppdateringskommando som automatiskt hittar och uppgraderar alla ABP-relaterade paket i din lösning.",
+ "DatabaseSupport": "Vilka databassystem stöds?",
+ "DatabaseSupportExplanation": "ABP Framework i sig Àr databasagnostiskt och kan fungera med alla databasleverantörer genom sin natur. Kolla in Data Access-dokumentet för en lista över för nÀrvarande implementerade leverantörer.",
+ "UISupport": "Vilka UI-ramverk stöds?",
+ "Supported": "Stödd",
+ "UISupportExplanation": "ABP Framework Àr i sig sjÀlvt agnostiskt och kan fungera med alla anvÀndargrÀnssnitt. Startmallar, modul-anvÀndargrÀnssnitt och teman implementerades dock inte för alla anvÀndargrÀnssnittsramverk. Kolla in GÄ igÄng-dokumentet för den uppdaterade listan över anvÀndargrÀnssnittsalternativ.",
+ "MicroserviceSupport": "Stödjer den microservice-arkitekturen?",
+ "MicroserviceSupportExplanation1": "Ett av de viktigaste mÄlen med ABP-ramverket Àr att tillhandahÄlla en bekvÀm infrastruktur för att skapa mikroservicelösningar. Kolla in Microservice Architecture-dokumentet för att förstÄ hur det hjÀlper till att skapa mikroservicesystem.",
+ "MicroserviceSupportExplanation2": "Alla ABP-moduler Àr utformade för att stödja distributionsscenarier för mikrotjÀnster (med eget API och egen databas) genom att följa dokumentet Module Development Best Practices.",
+ "MicroserviceSupportExplanation3": "Vi tillhandahÄller ett exempel pÄ Microservice Demo Solution som visar en implementering av en mikrotjÀnstarkitektur för att hjÀlpa dig att skapa din egen lösning.",
+ "MicroserviceSupportExplanation4": "SÄ det korta svaret Àr: \"Ja, det stöder mikroservicearkitektur\".",
+ "MicroserviceSupportExplanation5": "Ett mikrotjÀnstsystem Àr dock en lösning och varje lösning kommer att ha olika krav, nÀtverkstopologi, kommunikationsscenarier, autentiseringsmöjligheter, databasdelning/partitioneringsbeslut, runtime-konfigurationer, integrationer med tredjepartssystem och mycket mer.",
+ "MicroserviceSupportExplanation6": "ABP tillhandahÄller infrastruktur för microservice-scenarier, microservice-kompatibla moduler, exempel och dokumentation som hjÀlper dig att bygga din egen lösning. Men förvÀnta dig inte att direkt ladda ner din drömlösning som Àr förbyggd Ät dig. Du mÄste förstÄ den och sammanföra specifika delar baserat pÄ dina krav.",
+ "WhereCanIDownloadSourceCode": "Var kan jag ladda ner kÀllkoden?",
+ "WhereCanIDownloadSourceCodeExplanation": "Du kan ladda ner kÀllkoden för alla ABP-moduler, Angular-paket och teman via ABP Suite eller ABP CLI. Kolla in Hur man laddar ner kÀllkoden?",
+ "ComputerLimitation": "Hur mÄnga datorer kan en utvecklare logga in pÄ nÀr han utvecklar ABP?",
+ "ComputerLimitationExplanation": "Vi tillÄter specifikt {0} datorer per individ/licensierad utvecklare. NÀr det finns ett behov för en utvecklare att utveckla ABP-baserade produkter pÄ en tredje maskin, ska ett e-postmeddelande skickas till license@abp.io dÀr situationen förklaras, och vi kommer sedan att göra lÀmplig tilldelning i vÄrt system.",
+ "RefundPolicy": "Har ni nÄgon Äterbetalningspolicy?",
+ "RefundPolicyExplanation": "Du kan begÀra Äterbetalning inom 30 dagar efter ditt licensköp. Licenstyperna Business och Enterprise har alternativ för nedladdning av kÀllkod; dÀrför ger vi en Äterbetalning pÄ 60 % inom 30 dagar för Business- och Enterprise-licenser. Dessutom görs inga Äterbetalningar för förnyelser och andra licensköp.",
+ "HowCanIRefundVat": "Hur kan jag Äterbetala moms?",
+ "HowCanIRefundVatExplanation1": "Om du gjorde betalningen med 2Checkout kan du Äterbetala momsen via ditt 2Checkout-konto:",
+ "HowCanIRefundVatExplanation2": "Logga in pÄ ditt 2Checkout-konto",
+ "HowCanIRefundVatExplanation3": "Leta upp rÀtt order och tryck pÄ \"à terbetala försenad moms\" (ange ditt momsregistreringsnummer)",
+ "HowCanIGetMyInvoice": "Hur kan jag fÄ min faktura?",
+ "HowCanIGetMyInvoiceExplanation": "Det finns 2 betalningsgateways för att köpa en licens: Iyzico och 2Checkout. Om du köper din licens via 2Checkout-gatewayen skickar den PDF-fakturan till din e-postadress; kolla in 2Checkout-fakturering. Om du köper via Iyzico-gatewayen, med en anpassad inköpslÀnk eller via en banköverföring, kommer vi att förbereda och skicka din faktura. Du kan begÀra eller ladda ner din faktura frÄn sidan för organisationshantering. Innan du kontaktar oss för fakturan, kontrollera din organisationshanteringssida!",
+ "Forum": "Forum",
+ "SupportExplanation": "ABP-licensen ger ett premiumforumstöd av ett team som bestÄr av ABP Framework-experter.",
+ "PrivateTicket": "Privat biljett",
+ "PrivateTicketExplanation": "Enterprise License inkluderar Àven en privat support med e-post och Àrendehanteringssystem.",
+ "AbpSuiteExplanation1": "Med ABP Suite kan du skapa webbsidor pÄ bara nÄgra minuter. Det Àr ett globalt .NET Core-verktyg som kan installeras frÄn kommandoraden.",
+ "AbpSuiteExplanation2": "Den kan skapa en ny ABP-lösning och generera CRUD-sidor frÄn databasen till frontend. För teknisk översikt se dokumentet",
+ "FastEasy": "Snabbt och enkelt",
+ "AbpSuiteExplanation3": "Med ABP Suite kan du enkelt skapa CRUD-sidor. Du behöver bara definiera din entitet och dess egenskaper och lÄta resten gÄ till ABP Suite Ät dig! ABP Suite genererar all nödvÀndig kod för din CRUD-sida pÄ nÄgra sekunder. Den stöder Angular, MVC och Blazor anvÀndargrÀnssnitt.",
+ "RichOptions": "Rika alternativ",
+ "AbpSuiteExplanation4": "ABP Suite stöder flera anvÀndargrÀnssnittsalternativ som Razor Pages och Angular. Den stöder ocksÄ flera databaser som MongoDB och alla databaser som stöds av EntityFramework Core (MS SQL Server, Oracle, MySql, PostgreSQL och andra leverantörer...).",
+ "AbpSuiteExplanation5": "Det som Àr bra Àr att du inte behöver oroa dig för dessa alternativ. ABP Suite förstÄr din projekttyp och genererar koden för ditt projekt och placerar den genererade koden pÄ rÀtt plats i ditt projekt.",
+ "SourceCode": "KĂ€llkod",
+ "AbpSuiteExplanation6": "ABP Suite genererar kÀllkoden Ät dig! Den genererar inte magiska filer för att generera webbsidan. ABP Suite genererar kÀllkoden för Entity, Repository, Application Service, Code First Migration, JavaScript/TypeScript och CSHTML/HTML och Àven nödvÀndiga grÀnssnitt. ABP Suite genererar ocksÄ koden enligt Best Practices för programvaruutveckling, sÄ du behöver inte oroa dig för den genererade kodens kvalitet.",
+ "AbpSuiteExplanation7": "Eftersom du har kÀllkoden för byggstenarna i den genererade CRUD-sidan i rÀtt applikationslager kan du enkelt Àndra kÀllkoden och lÀgga till din egen anpassade affÀrslogik i den genererade koden.",
+ "CrossPlatform": "Plattformsoberoende",
+ "AbpSuiteExplanation8": "ABP Suite Àr byggt med .NET Core och Àr plattformsoberoende. Den körs som en webbapplikation pÄ din lokala dator. Du kan köra den pÄ Windows, Mac och Linux",
+ "OtherFeatures": "Andra funktioner",
+ "OtherFeatures1": "Uppdaterar enkelt NuGet- och NPM-paket pÄ din lösning.",
+ "OtherFeatures2": "à terskapar redan genererade sidor frÄn början.",
+ "OtherFeatures3": "Skapar nya lösningar",
+ "ThanksForCreatingProject": "Ditt projekt har skapats framgÄngsrikt!",
+ "HotToRunSolution": "Hur kör du din lösning?",
+ "HotToRunSolutionExplanation": "I dokumentet Kom igÄng kan du lÀsa om hur du konfigurerar och kör din lösning.",
+ "GettingStarted": "Komma igÄng",
+ "WebAppDevTutorial": "Handledning för utveckling av webbapplikationer",
+ "WebAppDevTutorialExplanation": "I handledningsdokumentet för utveckling av webbapplikationer finns ett exempel pÄ utveckling steg för steg.",
+ "Document": "Dokument",
+ "UsingABPSuiteToCURD": "AnvÀnda ABP Suite för generering av CRUD-sidor och verktyg",
+ "SeeABPSuiteDocument": "Kolla in ABP Suite-dokumentet för att lÀra dig anvÀndningen av ABP Suite.",
+ "AskQuestionsOnSupport": "Du kan stÀlla frÄgor pÄ ABP Support.",
+ "Documentation": "Dokumentation",
+ "SeeModulesDocument": "Se sidan med moduler för en lista över alla PRO-moduler.",
+ "Pricing": "PrissÀttning",
+ "PricingExplanation": "VÀlj de egenskaper och funktioner som ditt företag behöver idag. Uppgradera enkelt nÀr ditt företag vÀxer.",
+ "Team": "Team",
+ "Business": "Företag",
+ "Enterprise": "Företag",
+ "Custom": "Anpassad",
+ "IncludedDeveloperLicenses": "Inkluderade utvecklarlicenser",
+ "CustomLicenceOrAdditionalServices": "Behöver du en anpassad licens eller ytterligare tjÀnster?",
+ "CustomOrVolumeLicense": "Anpassad licens eller volymlicens",
+ "LiveTrainingSupport": "Utbildning och support i realtid",
+ "AndMore": "och mer",
+ "AdditionalDeveloperLicense": "Ytterligare licens för utvecklare",
+ "ProjectCount": "ProjektrÀkning",
+ "AllProModules": "Alla proffsmoduler",
+ "AllProThemes": "Alla proffsteman",
+ "AllProStartupTemplates": "Alla proffsmallar för nystartade företag",
+ "SourceCodeOfAllModules": "KÀllkod för alla moduler",
+ "SourceCodeOfAllThemes": "KÀllkod för alla teman",
+ "PerpetualLicense": "Evig licens",
+ "UnlimitedServerDeployment": "ObegrÀnsad serverdistribution",
+ "YearUpgrade": "1 Ärs uppgradering",
+ "YearPremiumForumSupport": "1 Ärs premiumsupport för forum",
+ "ForumSupportIncidentCountYear": "Antal incidenter för forumstöd/Är",
+ "PrivateTicketEmailSupport": "Privat support via biljett och e-post",
+ "BuyNow": "Köp nu",
+ "PayViaAmexCard": "Hur kan jag betala med mitt AMEX-kort?",
+ "PayViaAmexCardDescription": "Standardbetalningsgatewayen \"Iyzico\" kan neka vissa AMEX-kreditkort pÄ grund av sÀkerhetsÄtgÀrder. I detta fall kan du betala via den alternativa betalningsgatewayen \"2Checkout\".",
+ "ThankYou": "Tack sÄ mycket",
+ "InvalidReCaptchaErrorMessage": "Det uppstod ett fel vid verifiering av reCAPTCHA. VÀnligen försök igen.",
+ "CompanyName": "Företagets namn",
+ "YourCompanyName": "Ditt företagsnamn",
+ "FirstName": "Förnamn",
+ "LastName": "Efternamn",
+ "Optional": "Valfritt",
+ "YourFirstName": "Ditt förnamn",
+ "YourLastName": "Ditt efternamn",
+ "SpecialOffer": "Specialerbjudande",
+ "SpecialOfferMessage": "Skynda dig! Priserna gÀller under en begrÀnsad tid.",
+ "DiscountRequest": "BegÀran om rabatt",
+ "DiscountRequestDescribeCustomerQuestion": "Vilken av följande beskrivningar stÀmmer in pÄ dig?",
+ "DiscountRequestStudentEmailMessage": "E-postadressen mÄste innehÄlla \"edu\".",
+ "DiscountRequestDeveloperCount": "Hur mÄnga utvecklare Àr ni?",
+ "DiscountRequestDeveloperCountExceedMessage": "Vi erbjuder inte rabatterade licenser för företag som har fler Àn {0} utvecklare.",
+ "DiscountRequestOrganizationName": "Företagets/organisationens/skolans namn",
+ "Website": "Webbplats",
+ "GithubUsername": "AnvÀndarnamn för GitHub",
+ "PhoneNumber": "Telefonnummer",
+ "Country": "Land",
+ "DescribeABPCommercialUsage": "Beskriv det projekt som du planerar att utveckla baserat pÄ APB",
+ "DiscountRequestCertifyInformationMessage": "Jag intygar att alla uppgifter Àr sanningsenliga och korrekta.",
+ "DiscountRequestReceived": "Vi har mottagit din begÀran om rabatt.",
+ "DiscountRequestStatusMessage": "Vi kommer att svara dig efter att ha kontrollerat den information du har lÀmnat.",
+ "MVCOrRazorPages": "MVC (Razor Pages)",
+ "Angular": "Angular",
+ "Blazor": "Blazor",
+ "New": "Nya",
+ "MongoDB": "MongoDB",
+ "EBookDDD": "E-bok DomÀnstyrd design",
+ "PracticalGuideForImplementingDDD": "Den hÀr boken Àr en praktisk guide för att implementera domÀndriven design med ABP-ramverket.",
+ "IntroducingDDD": "Introduktion till domÀndriven design",
+ "DDDLayersAndCleanArchitecture": "DDD-skikt och ren arkitektur",
+ "LayeringOfADotnetSolution": "Skiktning av en .NET-lösning",
+ "ImplementingDDDBuildingBlocks": "Implementering av DDD-byggstenar",
+ "DomainVsApplicationLogic": "DomÀnlogik vs applikationslogik",
+ "SamplesAndDiscussions": "Provtagningar och diskussioner",
+ "Free": "Gratis",
+ "Download": "Nedladdningar",
+ "DDDEBook": "DDD E-bok",
+ "ImplementingDDD": "Implementering av domÀndriven design",
+ "DDDBookExplanation": "En praktisk guide för implementering av domÀndriven design med ABP-ramverket.",
+ "Overview": "Ăversikt",
+ "DDDBookPracticalGuide": "Detta Àr en praktisk guide för implementering av domÀndriven design (DDD). Implementeringsdetaljerna bygger pÄ ABP Framework-infrastrukturen, men kÀrnkoncepten, principerna och mönstren Àr tillÀmpliga pÄ alla typer av lösningar, Àven om det inte Àr en .NET-lösning.",
+ "TableOfContents": "InnehÄllsförteckning",
+ "IntroductionToImplementingDDD": "Introduktion till implementering av domÀndriven design",
+ "WhatIsDDD": "Vad Àr domÀndriven design?",
+ "Implementation": "Implementering",
+ "TheBigPicture": "Den stora bilden",
+ "TheBuildingBlock": "Byggstenen",
+ "ExampleUseCase": "Exempel AnvÀndningsfall",
+ "DomainAndApplicationLogic": "DomÀnlogik och applikationslogik",
+ "Author": "Författaren",
+ "PublishedOn": "Publicerad pÄ",
+ "Page": "Sidan",
+ "FreeEBook": "Gratis e-bok",
+ "EBookSignInForDownload": "För att ladda ner e-boken logga in",
+ "SignIn": "Logga in",
+ "Or": "Eller",
+ "TellUsAboutYourself": "BerÀtta lite om dig sjÀlv",
+ "Surname": "Efternamn",
+ "DoYouAgreePrivacyPolicy": "Jag samtycker till Terms & Conditions och Privacy Policy.",
+ "VolosoftMarketingInformationMessage": "Jag vill ha information, tips och erbjudanden om Solutions for Businesses and Organizations och andra produkter och tjÀnster frÄn Volosoft.",
+ "VolosoftSharingInformationMessage": "Jag vill att Volosoft ska dela min information med utvalda partners sÄ att jag kan fÄ relevant information om deras produkter och tjÀnster.",
+ "WeWillSendYouADownloadLink": "LÀnken för nedladdning av e-boken har skickats till {0}. Kontrollera din inkorg, skrÀppost och spamboxar!",
+ "InvalidFormInputs": "VÀnligen skriv in den giltiga information som anges pÄ formulÀret.",
+ "DDDBookEmailBody": "Tack sÄ mycket. För att ladda ner din bok, klicka hÀr.",
+ "StartFree": "Starta gratis",
+ "FreeTrial": "Gratis provperiod",
+ "AcceptsMarketingCommunications": " Ja, jag vill gÀrna fÄ ABP-relaterade marknadsföringsnyheter.",
+ "PurposeOfUsage": "Syfte med anvÀndningen",
+ "Choose": "- VĂ€lj -",
+ "CompanyOrganizationName": "Företagets/organisationens namn",
+ "CompanySize": "Företagets storlek",
+ "Next": "NĂ€sta",
+ "StartTrial": "Starta min kostnadsfria testperiod",
+ "ContactUsQuestions": "Kontakta oss om du har nÄgra frÄgor",
+ "TrialActivatedWarning": "En anvÀndare har endast rÀtt till 1 gratis provperiod. Du har redan anvÀnt din provperiod.",
+ "ActivationRequirement": "Du Àr bara ett steg frÄn att starta din provperiod. Efter att ha kontrollerat din information aktiverar vi din licens. NÀr din licens Àr aktiverad skickar vi ett e-postmeddelande till {0}. Oroa dig inte, den hÀr processen kommer inte att ta lÄng tid!",
+ "SaveAndDownload": "Spara och ladda ner",
+ "CompanyNameValidationMessage": "Företagsnamnet Àr för lÄngt!",
+ "AddressValidationMessage": "Adressen Àr för lÄng!",
+ "TaxNoValidationMessage": "TAX/VAT Nej Àr för lÄngt!",
+ "NotesValidationMessage": "AnteckningsfÀltet Àr för lÄngt!",
+ "CheckYourBillingInfo": "Du kan bara skapa din faktura en gÄng! Kontrollera din faktureringsinformation innan du skapar din faktura.",
+ "StartYourFreeTrial": "Starta din kostnadsfria testperiod",
+ "TrialLicenseModelInvalidErrorMessage": "Ett av följande fÀlt Àr ogiltigt: Landsnamn, Företagsstorlek, Bransch eller Syfte med anvÀndning.",
+ "Trial": "RÀttegÄng",
+ "Purchased": "Köpte",
+ "PurchaseNow": "Köp nu",
+ "PurchaseTrialLicenseMessage": "Din licens utgÄngsdatum Àr {0}. Om du vill fortsÀtta anvÀnda de projekt som du skapade under din kostnadsfria testperiod mÄste du Àndra licensnycklarna i dina appsettings.secrets.json-filer. HÀr Àr din licensnyckel:",
+ "TrialLicenseExpireMessage": "Du anvÀnder en testlicens och din testlicens upphör att gÀlla den {0}.",
+ "TryForFree": "Prova gratis",
+ "TrialLicenseExpiredInfo": "Din testlicensperiod har löpt ut!",
+ "DowngradeLicensePlan": "Kan jag nedgradera till en lÀgre licensplan i framtiden?",
+ "DowngradeLicensePlanExplanation": "Du kan inte nedgradera din befintliga licensplan. Men du kan köpa en ny lÀgre licensplan och fortsÀtta din utveckling pÄ den nya licensen. NÀr du har köpt en lÀgre licens behöver du bara logga in pÄ din nya licensplan via ABP CLI-kommandot: ` abp login -o `.",
+ "LicenseTransfer": "Kan en licens överföras frÄn en utvecklare till en annan?",
+ "LicenseTransferExplanation": "Ja, det gör jag! NĂ€r du köper en licens blir du licensinnehavare och fĂ„r dĂ€rmed tillgĂ„ng till sidan för organisationshantering. En organisation har rollerna Ă€gare och utvecklare. Ăgare kan hantera utvecklarplatserna och tilldela utvecklare. Varje tilldelad utvecklare loggar in via ABP CLI-kommandot i systemet och har utvecklings- och supportbehörighet.",
+ "UserOwnerDescription": "Organisationens \"Àgare\" Àr administratör för detta konto. Han/hon hanterar organisationen genom att köpa licenser och tilldela utvecklare. En \"Àgare\" kan inte skriva kod i ABP-projekten, kan inte ladda ner ABP-exempelprojekten och kan inte stÀlla frÄgor pÄ supportwebbplatsen. Om du vill göra allt detta mÄste du ocksÄ lÀgga till dig sjÀlv som utvecklare.",
+ "UserDeveloperDescription": "\"Utvecklarna\" kan skriva kod i ABP-projekten, ladda ner ABP:s exempelprojekt och stÀlla frÄgor pÄ supportwebbplatsen. à andra sidan kan \"utvecklarna\" inte hantera den hÀr organisationen.",
+ "RemoveCurrentUserFromOrganizationWarningMessage": "Du tar bort dig sjÀlv frÄn din egen organisation. Du kommer inte lÀngre att kunna hantera den hÀr organisationen, bekrÀftar du det?",
+ "RenewExistingOrganizationOrCreateNewOneMessage": "Du kan förnya licensen för din organisation (er) genom att klicka pÄ nedanstÄende \"FörlÀng nu\"-knapp (ar) och dÀrmed kan du förlÀnga licensens utgÄngsdatum med 1 Är. Om du fortsÀtter till kassan kommer du att ha en ny organisation. Vill du fortsÀtta med en ny organisation?",
+ "PurchaseTrialOrganizationOrCreateNewOneMessage": "Du har en testlicens. För att köpa din testlicens klickar du pÄ knappen Köp nu. Om du fortsÀtter till kassan kommer du att ha en ny organisation. Vill du fortsÀtta med en ny organisation?",
+ "ExtendNow": "FörlÀnga / Förnya",
+ "CreateNewOrganization": "Skapa en ny organisation",
+ "RenewLicenseEarly": "Om jag förnyar min licens tidigt, kommer jag att fÄ hela Äret?",
+ "RenewLicenseEarylExplanation": "NÀr du förnyar din licens före licensens utgÄngsdatum kommer 1 Är att lÀggas till licensens utgÄngsdatum. Om din licens t.ex. löper ut den {0}-06-06 och du förnyar den den {0}-01-01, kommer din nya licens att löpa ut den {1}-06-06.",
+ "OpenSourceWebApplication": "Webbapplikation med öppen kÀllkod",
+ "CompleteWebDevelopment": "En komplett webbutveckling",
+ "ABPFrameworkDescription": "ABP Framework Àr en komplett infrastruktur för att skapa moderna webbapplikationer genom att följa de bÀsta metoderna för mjukvaruutveckling och konventioner.",
+ "CommunityDescription": "Dela dina erfarenheter av ABP-ramverket!",
+ "GetStarted": "Kom igÄng",
+ "Views": "utsikt",
+ "LatestPosts": "Senaste inlÀgg",
+ "PreBuiltApplication": "Förbyggd applikation",
+ "DatabaseProviders": "Databasleverantörer",
+ "UIFrameworks": "Ramverk för anvÀndargrÀnssnitt",
+ "UsefulLinks": "AnvÀndbara lÀnkar",
+ "Platform": "Plattform",
+ "CoolestCompaniesUseABPCommercial": "De coolaste företagen anvÀnder redan ABP.",
+ "UserInterface": "AnvÀndargrÀnssnitt",
+ "APIGateway": "API-gateway",
+ "Microservice": "Mikroservice",
+ "Database": "Databas",
+ "Architecture": "Arkitektur",
+ "MicroserviceArchitectureExplanation": "Det hÀr Àr en komplett lösningsarkitektur som bestÄr av flera applikationer, API-gateways, mikrotjÀnster och databaser för att bygga en skalbar mikrotjÀnstlösning med den senaste tekniken.",
+ "BusinessLogic": "AffÀrslogik",
+ "DataAccessLayer": "DataÄtkomstskikt",
+ "Monolith": "Monolit",
+ "ModularArchitectureExplanation": "Denna startup-mall ger en skiktad, modulÀr och DDD-baserad lösningsarkitektur för att bygga en ren och underhÄllbar kodbas.",
+ "SeeDetails": "Se detaljer",
+ "SeeDocumentation": "Kolla in dokumentationen",
+ "Bs5Compatible": "Professionellt tema som Àr kompatibelt med Bootstrap 5, perfekt för din administratörswebbplats.",
+ "LeptonXTheme": "LeptonX tema",
+ "LeptonXDark": "LeptonX Mörk",
+ "LeptonXLight": "LeptonX Ljus",
+ "LeptonXSemiDark": "LeptonX Halvmörk",
+ "BuiltOnBs5Library": "Byggd pÄ Bootstrap 5-biblioteket",
+ "FullyCompatibleWithBs5": "100% kompatibel med Bootstrap 5 HTML-struktur och CSS-klasser",
+ "ResponsiveAndMobileCompatible": "Responsiv, mobilkompatibel, RTL-stöd",
+ "ProvidesStylesForDatatables": "TillhandahÄller stilar för datatabeller",
+ "MultipleLayoutOptions": "Flera layoutalternativ",
+ "EasilyInstallAndUpgrade": "Enkel installation och uppgradering",
+ "SupportForum": "Forum för support",
+ "TrustedBy": "Betrodda av",
+ "OurPricing": "VÄr prissÀttning",
+ "Plans": "Planer",
+ "NameSurname": "Namn Efternamn",
+ "Unspecified": "Ospecificerad",
+ "LicenceType": "Typ av licens",
+ "LicenseDiscountWarning": "DENNA RABATTSIDA ANVĂNDER STANDARD RABATTKOD OCH FĂR VOLOSOFT UTVECKLARE. INKĂPSLĂNKAR NEDAN FUNGERAR INTE.",
+ "DiscountedLicenseExplanation": "Dessa licenspriser Àr avsedda för smÄ nystartade företag, enskilda utvecklare, studenter, ideella organisationer och projekt!",
+ "General": "AllmÀnt",
+ "License": "Licens",
+ "Development": "Utveckling",
+ "Payment": "Betalning",
+ "WatchExplainerVideo": "LÄt oss trÀffas! Titta pÄ förklarande video",
+ "LightDarkAndSemiDarkThemes": "Ljus, mörk och halvmörk",
+ "LeptonXThemeExplanation": "Lepton Theme kan Àndra ditt tema enligt dina systeminstÀllningar.",
+ "PRO": "PRO",
+ "WelcomeToABPCommercial": "VĂ€lkommen till ABP Platform!",
+ "YourAccountDetails": "Dina kontouppgifter",
+ "OrganizationName": "Organisationens namn",
+ "AddDevelopers": "LĂ€gg till utvecklare",
+ "StartDevelopment": "Starta utveckling",
+ "CreateAndRunApplicationUsingStartupTemplate": "LÀr dig hur du skapar och kör en ny webbapplikation med hjÀlp av ABP:s startmallar.",
+ "CommunityDescription2": "community.abp.io Àr en plats dÀr mÀnniskor kan dela ABP-relaterade artiklar. Sök efter artiklar, handledningar, kodprover, fallstudier och trÀffa mÀnniskor som Àr i samma spÄr som du.",
+ "UseABPSuiteExplanation": "AnvÀnd ABP Suite för att ladda ner kÀllkoden för modulerna och temana.",
+ "ManageModulesWithSuite": "Du kan ocksÄ hantera dina ABP-moduler med Suite.",
+ "LearnHowToInstallSuite": "LÀr dig hur du installerar och anvÀnder ABP Suite.",
+ "SeeMore": "Se mer",
+ "SeeLess": "Se mindre",
+ "LayeredSolutionStructure": "Struktur med flera lager av lösningar",
+ "LayeredSolutionStructureExplanation": "Lösningen Àr uppbyggd i lager baserat pÄ principer och mönster för domÀndriven design för att isolera affÀrslogiken frÄn infrastruktur och integrationer och för att maximera underhÄll och ÄteranvÀndning av koden. ABP Framework tillhandahÄller redan abstraktioner, basklasser och guider för att verkligen implementera DDD för din applikation.",
+ "MultipleUIOptions": "Flera alternativ för anvÀndargrÀnssnitt",
+ "MultipleUIOptionsExplanation": "Vi Àlskar olika sÀtt att skapa anvÀndargrÀnssnitt. Den hÀr startup-lösningen ger tre olika alternativ för anvÀndargrÀnssnitt för din affÀrsapplikation.",
+ "MultipleDatabaseOptions": "Flera databasalternativ",
+ "MultipleDatabaseOptionsExplanation": "Du har tvĂ„ alternativ för databasleverantörer (förutom att du kan anvĂ€nda bĂ„da i en och samma applikation). AnvĂ€nd Entity Framework Core för att arbeta med alla relationsdatabaser och anvĂ€nd eventuellt Dapper nĂ€r du behöver skriva lĂ„gnivĂ„frĂ„gor för bĂ€ttre prestanda. MongoDB Ă€r ett annat alternativ om du behöver anvĂ€nda en dokumentbaserad NoSQL-databas. Ăven om dessa leverantörer Ă€r vĂ€lintegrerade, abstraherade och förkonfigurerade kan du faktiskt interagera med alla databassystem som du kan anvĂ€nda med .NET.",
+ "ModularArchitectureExplanation2": "Modularitet Àr en första klassens medborgare i ABP.IO-plattformen. Alla applikationsfunktionaliteter Àr uppdelade i vÀlisolerade valfria moduler. Startlösningen levereras redan med de grundlÀggande ABP-modulerna förinstallerade. Du kan ocksÄ skapa dina egna moduler för att bygga ett modulÀrt system för din egen applikation.",
+ "MultiTenancyForSaasBusiness": "Multi-Tenancy för ditt SaaS-företag",
+ "MultiTenancyForSaasBusinessExplanation": "ABP tillhandahÄller ett komplett, end-to-end multi-tenancy-system för att skapa dina SaaS-system (Software-as-a-Service). Det gör det möjligt för hyresgÀsterna att dela eller ha sina egna databaser med on-the-fly databasskapande och migrationssystem.",
+ "MicroserviceStartupSolution": "Microservice Startup-lösning",
+ "MicroserviceArchitectureExplanation2": "Du kan skaffa det till ditt nÀsta microservice-system för att dra nytta av den förbyggda baslösningen och destillerade erfarenheten.",
+ "PreIntegratedTools": "Förintegrerad i populÀra verktyg",
+ "PreIntegratedToolsExplanation": "Lösningen Àr redan integrerad i branschens standardverktyg och -tekniker, men du kan alltid Àndra dem och integrera dem med dina favoritverktyg.",
+ "SingleSignOnAuthenticationServer": "Server för autentisering med enkel inloggning",
+ "SingleSignOnAuthenticationServerExplanation": "Lösningen har en autentiseringsserverapplikation som anvÀnds av de andra applikationerna som en server för enkel inloggning med API-Ätkomsthanteringsfunktioner. Den Àr baserad pÄ IdentityServer.",
+ "WebAppsWithGateways": "2 Webbapp med 2 API-gateways",
+ "WebAppsWithGatewaysExplanation": "Lösningen innehÄller tvÄ webbapplikationer som var och en har en dedikerad API-gateway (BFF - Backend For Frontend-mönster).",
+ "BackOfficeApplication": "Back Office-applikation",
+ "BackOfficeApplicationExplanation": "Den faktiska webbapplikationen för ditt system, med flera alternativ för anvÀndargrÀnssnitt. Du kan skapa alla typer av affÀrsapplikationer.",
+ "LandingWebsite": "Landningswebbplats",
+ "LandingWebsiteExplanation": "En generisk landningsplats/publik webbplats som kan anvÀndas för flera ÀndamÄl, t.ex. för att presentera ditt företag, sÀlja dina produkter osv.",
+ "ABPFrameworkEBook": "Mastering ABP Framework e-bok",
+ "MasteringAbpFrameworkEBookDescription": "IngÄr i din ABP-licens",
+ "FullName": "Full Name",
+ "LicenseTypeNotCorrect": "Licenstypen Àr inte korrekt!",
+ "Trainings": "Utbildningar",
+ "ChooseTrainingPlaceholder": "VĂ€lj utbildning...",
+ "DoYouNeedTrainings": "Behöver du nÄgon av dessa utbildningar?",
+ "DoYouNeedTraining": "Behöver du {0} utbildning?",
+ "GetInTouchUs": "Ta kontakt med oss",
+ "ForMoreInformationClickHere": "För mer information, klicka hÀr.",
+ "ForMoreInformationClickHereByClass": "För mer information, klickahÀr.",
+ "IsGetOnboardingTraining": "Vill du fÄ utbildning i onboarding och utveckling av webbapplikationer?",
+ "OnboardingWebApplicationDevelopmentTrainingMessage": "För att schemalÀgga din utbildningskalender, vÀnligen kontakta {0} efter att du har skapat organisationen",
+ "CustomPurchaseMessage": "För nÀsta steg, klicka pÄ {0} för att kontakta oss.",
+ "Note": "Notera",
+ "AdditionalNote": "Ytterligare anmÀrkning",
+ "OnboardingTrainingFaqTitle": "Har du en ABP onboarding-utbildning?",
+ "OnboardingTrainingFaqExplanation": "Ja, vi har ABP Training Services som hjÀlper dig att snabbt komma igÄng med ditt ABP-projekt. Du kommer att lÀra dig om ABP frÄn en medlem i ABP:s kÀrnteam och du kommer att fÄ de fÀrdigheter som krÀvs för att starta ditt ABP-projekt. I onboarding-utbildningen förklarar vi hur du stÀller in din utvecklingsmiljö, installerar de nödvÀndiga verktygen och skapar en fullt fungerande CRUD-sida. Utbildningen kommer att vara live och Zoom-applikationen kommer att anvÀndas, men vi Àr öppna för att anvÀnda andra online-mötesplattformar. SprÄket för utbildningen kommer att vara engelska. Du kan ocksÄ stÀlla dina frÄgor om ABP under sessionerna. En lÀmplig tid och ett lÀmpligt datum kommer att planeras för bÄda parter. För att fÄ mer information, kontakta oss pÄ info@abp.io.",
+ "AddBasket": "LĂ€gg till i korgen",
+ "SendTrainingRequest": "Skicka förfrÄgan om utbildning",
+ "OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* Den engelska versionen av detta dokument Àr den mest aktuella och den engelska versionen ska ha företrÀde i alla tvister.",
+ "Pricing_Page_Title": "Priser och planer",
+ "Pricing_Page_Description": "VÀlj de funktioner och den funktionalitet som ditt företag behöver idag. Köp en ABP-licens och skapa obegrÀnsat med projekt.",
+ "Pricing_Page_HurryUp": "Skynda dig!",
+ "Pricing_Page_BuyLicense": "Köp en licens till 2021 Ärs priser fram till den 16 januari!",
+ "Pricing_Page_ValidForExistingCustomers": "GÀller Àven för befintliga kunder och licensförnyelser.",
+ "Pricing_Page_Hint1": "I licenspriset ingÄr ett visst antal platser för utvecklare. Om du har fler utvecklare kan du alltid köpa ytterligare platser.",
+ "Pricing_Page_Hint2": "Du kan köpa fler utvecklarlicenser nu eller i framtiden. Licenserna Àr platsbaserade, vilket innebÀr att du kan överföra en plats frÄn en utvecklare till en annan.",
+ "Pricing_Page_Hint3": "Du kan utveckla ett obegrÀnsat antal olika produkter med din licens.",
+ "Pricing_Page_Hint4": "ABP Suite Àr ett verktyg som hjÀlper dig att utveckla och förbÀttra din produktivitet. Det stöder generering av CRUD-sidor och skapande av nya projekt.",
+ "Pricing_Page_Hint5": "Du kan anvÀnda alla de förbyggda modulerna i dina applikationer.",
+ "Pricing_Page_Hint6": "Du kan anvÀnda alla de förbyggda temana i dina applikationer.",
+ "Pricing_Page_Hint7": "En startmall Àr en Visual Studio-lösning som hjÀlper dig att komma igÄng med ditt projekt. Alla grundlÀggande moduler lÀggs till och förkonfigureras Ät dig.",
+ "Pricing_Page_Hint8": "Mastering ABP Framework e-bok förklarar hur man implementerar .NET-lösningar med bÀsta praxis. Den sÀljs pÄ Amazon.com, och du kan ladda ner boken gratis med din licens.",
+ "Pricing_Page_Hint9": "Du kan ladda ner kÀllkoden för alla moduler. Du kanske vill lÀgga till kÀllkoden i din lösning för att göra radikala Àndringar eller bara behÄlla den för dig sjÀlv av sÀkerhetsskÀl.",
+ "Pricing_Page_Hint10": "Licenserna Àr livstidsbaserade. Det innebÀr att du kan fortsÀtta att utveckla din applikation för alltid. TillgÄng till den senaste versionen och support beviljas inom licensperioden (1 Är om du inte förnyar den).",
+ "Pricing_Page_Hint11": "Inga begrÀnsningar för driftsÀttning! Du kan distribuera till sÄ mÄnga servrar som du vill, inklusive molntjÀnster eller lokalt.",
+ "Pricing_Page_Hint12": "Du kan uppdatera moduler, teman och verktyg till den senaste versionen inom din aktiva licensperiod. NÀr din licens löper ut mÄste du förnya den för att fortsÀtta att fÄ uppdateringar för buggfixar, nya funktioner och förbÀttringar.",
+ "Pricing_Page_Hint13": "Du kan fÄ premiumsupport i ett Är (du kan förnya din licens för att förlÀnga den).",
+ "Pricing_Page_Hint14": "Team- och Business-licenser har en grÀns för antal incidenter/frÄgor. Om du köper ytterligare utvecklarlicenser ökar incidentgrÀnsen med {0} (för Team-licensen) eller {1} (för Business-licensen) per utvecklare.",
+ "Pricing_Page_Hint15": "Endast Enterprise License inkluderar privat support. Du kan skicka ett e-postmeddelande direkt till ABP-teamet eller stÀlla frÄgor pÄ support.abp.io med ett privat biljettalternativ. De privata Àrendena Àr inte synliga för allmÀnheten.",
+ "Pricing_Page_Hint16": "Du kan ladda ner kÀllkoden för alla ABP-teman. Du kanske vill lÀgga till kÀllkoden i din lösning för att göra radikala Àndringar eller bara behÄlla den för dig sjÀlv av sÀkerhetsskÀl.",
+ "Pricing_Page_Testimonial_1": "ABP gjorde det möjligt för SC Ventures att leverera en bankklassad SaaS-plattform med silodatabas med flera hyresgÀster pÄ 9 mÄnader för att stödja leverantörskedjans kundfordringar / leverantörsskulder för finansiering av fakturor med betydande vÀrde frÄn flera integrerade ankare. ABP:s modularitet gjorde det möjligt för teamet att leverera pÄ rekordtid, klara alla VAPT och distribuera den containeriserade mikrotjÀnststacken via fullstÀndig CI/CD och pipelines till produktion.",
+ "Pricing_Page_Testimonial_2": "Vi ser vÀrdet av att anvÀnda ABP för att minska omkostnaderna för kundanpassade utvecklingsprojekt. Teamet kan förena kodmönstret i olika projektströmmar. Vi ser mer potential i ramverket för att vi ska kunna bygga nya funktioner snabbare Àn tidigare. Vi litar pÄ att vi stÀndigt kommer att se vÀrdet av att utnyttja ABP.",
+ "Pricing_Page_Testimonial_3": "Vi Àlskar ABP. Vi behöver inte skriva allt frÄn grunden. Vi utgÄr frÄn out-of-the-box-funktioner och fokuserar bara pÄ det vi verkligen behöver skriva. Dessutom Àr ABP vÀlarkitekterat och koden Àr av hög kvalitet med fÀrre buggar. Om vi hade varit tvungna att skriva allt vi behövde pÄ egen hand hade vi kanske fÄtt lÀgga ner flera Är. Ytterligare en sak vi gillar Àr att den nya versionen, problemfixningen eller förbÀttringen kommer ut vÀldigt snart, varannan vecka. Vi vÀntar inte för lÀnge.",
+ "Pricing_Page_Testimonial_4": "ABP Àr en fantastisk produkt som jag skulle rekommendera. Kommersiella produkter till marknaden för vÄra kunder i en enda konfigurerbar plattform. Den starthjÀlp som ramverket och verktygen ger alla team Àr vÀrd varenda cent. ABP var det som passade bÀst för vÄra behov.",
+ "Pricing_Page_Testimonial_5": "ABP Framework Ă€r inte bara ett ramverk, utan det Ă€r ocksĂ„ en guide för projektutveckling/hantering, eftersom det ger utbildning i DDD, GenericRepository, DI, Microservice och Modularity. Ăven om du inte kommer att anvĂ€nda sjĂ€lva ramverket kan du utveckla dig sjĂ€lv med docs.abp.io som Ă€r vĂ€l och professionellt förberedd (OpenIddict, Redis, Quartz etc.). Eftersom mĂ„nga saker Ă€r förbyggda förkortar det projektutvecklingstiden avsevĂ€rt (t.ex. inloggningssida, undantagshantering, datafiltrering, sĂ„dd, revisionsloggning, lokalisering, automatisk API-kontroller etc.) Som ett exempel frĂ„n vĂ„r applikation har jag anvĂ€nt Local Event Bus för lagerstyrning. SĂ„ jag kan hantera orderrörelser genom att skriva lagerhanterare. Det Ă€r underbart att inte förlora tid för CreationTime, CreatorId. De fylls i automatiskt.",
+ "Pricing_Page_Testimonial_6": "ABP Framework Àr ett bra ramverk men det tar tid att förstÄ de olika lager, klasser och bibliotek som det anvÀnder (sÀrskilt ABP). Jag spenderade mycket tid pÄ att lÀsa kodbasen, men ABP sparade oss tid nÀr vi skapade projektspecialitetsenheterna (AR) och förvaret kopplat till var och en av dem. Jag gillade ocksÄ att den metod som anvÀnds i ABP Àr mycket mogen; vi vet att den Àr baserad pÄ DDD och monolit.",
+ "Pricing_Page_Testimonial_7": "Som ett nystartat företag mÄste vi iterera snabbt och spendera minimal tid pÄ standardfunktioner och icke-kÀrnfunktioner.\nVÄra ingenjörer strÀcker sig frÄn mycket erfarna till juniora ingenjörer, och vi behövde en gemensam förstÄelse och ett sÀtt att dela teknisk och domÀnkunskap, ABP gjorde det möjligt för oss att göra detta tack vare deras fantastiska guider och dokumentation.\nDet finns saker som vi inte har behövt oroa oss för eftersom de fungerar direkt med ABP.\nABP hjÀlpte oss att effektivisera snabb prototyping och utveckling, mindre Àn 4 veckor frÄn funktionsstart till produktion. Med alla premiumfunktioner som ingÄr i licensen har ABP gett oss \"Startup in a Box\" pÄ Software Engineering-sidan.",
+ "Pricing_Page_Testimonial_8": "Jag skulle rekommendera ABP till alla som vill utöka utbudet av produkter som Àr tillgÀngliga för sina kunder. Det Àr fantastiskt nÀr man behöver anvÀnda en distribuerad företagsmiljö (Angular, WPF, Win&Linux). Förutom deras produkter Àlskar vi deras support, som gör vÄrt jobb snabbare och enklare. Vi vet redan att vi har hittat en bra partner för framtiden som kommer att stödja oss i att expandera vÄr verksamhet.",
+ "Pricing_Page_Testimonial_9": "Vi Àr ett företag med 2 anstÀllda som har varit i branschen i över 20 Är.\nNÀr det gÀller vÄr erfarenhet av ABP kontaktades vi av en kund som ville att vi skulle utveckla en ny personalapplikation i en modern miljö för att ersÀtta deras 25 Är gamla Access-applikation. Vi bestÀmde oss för att gÄ över frÄn en desktoplösning till en webbaserad lösning.\n\nVid den tidpunkten hade vi mycket liten kunskap om webbapplikationer och .NET, men vi snubblade över ABP, och med hjÀlp av ABP Framework, teknisk dokumentation och ABP Suite kunde vi inte bara utveckla applikationen enligt kundens specifikationer utan ocksÄ framgÄngsrikt arbeta i en .NET-miljö inom ett Är.",
+ "AbpBookDownloadArea_ClaimYourEBook": "Gör ansprÄk pÄ din e-bok om ABP Framework",
+ "AddMemberModal_Warning_1": "Om det anvÀndarnamn som du försöker lÀgga till inte finns i systemet, be din teammedlem att registrera sig pÄ {0} och dela anvÀndarnamnet pÄ hans/hennes konto med dig.",
+ "MyOrganizations_Detail_WelcomeMessage": "VĂ€lkommen till din organisation, {0}",
+ "MyOrganizations_Detail_OrganizationManagement": "Organisation Förvaltning",
+ "OrganizationDisplayName": "Organisationens visningsnamn",
+ "MyOrganizations_Detail_EditDisplayName": "Redigera visningsnamn",
+ "MyOrganizations_Detail_UpgradeYourLicense": "Uppgradera din licens",
+ "MyOrganizations_Detail_LicenseStartAndExpiryDate": "Licensens startdatum - utgÄngsdatum",
+ "MyOrganizations_Detail_OwnerRightInfo": "Du anvÀnder {0} av din {1} Àgares rÀttigheter.",
+ "MyOrganizations_Detail_CopyApiKey": "Kopiera nyckeln",
+ "MyOrganizations_Detail_ApiKeyDescription": "API-nyckeln Àr token för PRO-paket som finns pÄ {1}.",
+ "MyOrganizations_Detail_YourPrivateNugetSource": "Din privata NuGet-kÀlla Àr {0}",
+ "MyOrganizations_Detail_PrivateNugetSourceWarning": "Detta lÀggs automatiskt till som en feed till din NuGet.Config i din ABP-lösning. Dela inte din privata nyckel med obehöriga anvÀndare!",
+ "MyOrganizations_Detail_DeveloperSeatInfo": "Du anvÀnder {0} av dina {1} platser för utvecklare.",
+ "NeedMoreSeatsForYourTeam": "Behöver du fler platser för ditt team?",
+ "MyOrganizations_Detail_PricePerYear": "{0} / per Är",
+ "MyOrganizations_Detail_PurchaseDeveloperSeats": "Köpa platser för utvecklare",
+ "Invoices": "Fakturor",
+ "RequestInvoice": "BegÀr faktura",
+ "OrderNumber": "BestÀllningsnummer",
+ "Date": "Datum",
+ "Products": "Produkter",
+ "TotalPrice": "Totalt pris",
+ "ThereIsNoInvoice": "Det finns ingen faktura",
+ "MyOrganizations_Detail_PaymentProviderInfo": "Om du har köpt din licens via {0} gateway skickas PDF-fakturan till din e-postadress, se {0} fakturering.",
+ "MyOrganizations_Detail_PayUInfo": "Om du har köpt via Iyzico-gatewayen klickar du pÄ knappen \"BegÀr faktura\" och fyller i faktureringsinformationen.",
+ "MyOrganizations_Detail_ConclusionInfo": "Din fakturabegÀran kommer att behandlas inom {0} arbetsdagar.",
+ "ExtendYourLicense": "FörlÀng din {0} licens",
+ "Continue": "FortsÀtt",
+ "PurchaseLicense": "Köp {0} licens",
+ "DownloadInvoiceModal_DownloadInvoice": "Ladda ner faktura",
+ "DownloadInvoiceModal_SaveInformationOnlyOnce": "Du kan bara spara din faktureringsinformation en gÄng.",
+ "InvoiceModal_EnterCompanyName": "Ange ditt juridiska företagsnamn...",
+ "InvoiceModal_EnterCompanyAddress": "Ange din juridiska företagsadress...",
+ "InvoiceModal_EnterTaxNumber": "Ange ditt TAX/VAT-nummer om det finns tillgÀngligt...",
+ "RequestInvoiceModal_EnterNotes": "Ytterligare information för din faktura... Denna anteckning kommer att skrivas i anteckningsavsnittet pÄ fakturan.",
+ "PrePayment_PayWithIyzico": "Du kommer att betala med Iyzico",
+ "ContinueToCheckout": "FortsÀtt till kassan",
+ "PrePayment_IyzicoRedirectionInfo": "Du kommer att omdirigeras till Iyzico Payment Gateway för att slutföra ditt köp pÄ ett sÀkert sÀtt.",
+ "PrePayment_IyzicoAcceptVisaAndMasterCard": "Iyzico tar emot Visa och MasterCard.",
+ "Purchase": "Köp",
+ "AcceptTermsAndConditions": "Jag har lÀst, förstÄtt och accepterar integritetspolicy, villkor och EULA.",
+ "AcceptTermsAndConditionsWarningMessage": "VĂ€nligen acceptera integritetspolicyn och villkoren",
+ "SelectGatewayToContinue": "VÀnligen vÀlj en Gateway för att fortsÀtta!",
+ "GatewaySelection_SelectGateway": "VĂ€lj en betalningsportal",
+ "GatewaySelection_RedirectionMessage": "DÀrefter kommer du att omdirigeras till den valda betalningsgatewayens webbplats för transaktionen.",
+ "PaymentSucceed_PaymentSuccessMessage": "Betalning framgÄngsrik",
+ "PaymentSucceed_ThanksForPurchase": "Tack för ditt köp!",
+ "PaymentSucceed_CreateYourOrganization": "Skapa din organisation",
+ "PaymentSucceed_AddMeAsDeveloper": "Jag Àr ocksÄ utvecklare, lÀgg till mig som utvecklare i min organisation.",
+ "PaymentSucceed_CreateOrganization": "Skapa organisation",
+ "PaymentSucceed_OrganizationDescription": "En organisation bestĂ„r av utvecklare och Ă€gare. Utvecklarna Ă€r anvĂ€ndare som skriver kod pĂ„ ABP-projektet och som kommer att dra nytta av webbplatsen {1}. Ăgarna Ă€r anvĂ€ndare som tilldelar utvecklarplatser och hanterar licensiering.",
+ "PaymentSucceed_ViewOrganization": "Klicka hÀr för att se organisationen",
+ "Purchase_TotalAnnualPrice": "TOTALT (Ärsavgift)",
+ "Purchase_TrainingPrice": "Pris för utbildning",
+ "Purchase_OnboardingTraining": "Live-utbildning i onboarding och utveckling av webbapplikationer",
+ "TotalDeveloperPrice": "Totalt pris för utvecklare",
+ "Purchase_PricePerDeveloper": "{0} per utvecklare",
+ "Purchase_IncludedDeveloperInfo": "{0} {1} ingÄr.",
+ "Purchase_LicenseExtraDeveloperPurchaseMessage": "I {0} licens ingÄr {1} utvecklare. Du kan lÀgga till ytterligare utvecklare.",
+ "StartupTemplates_Page_Title": "ABP Startup Mallar",
+ "StartupTemplates_Page_Description": "Med ABP kan du bygga lösningar med valfri komplexitetsnivÄ. Det ger tvÄ huvudsakliga förbyggda startlösningar. Du kan vÀlja den som ligger nÀrmast dina krav och bygga din egen anpassade lösning ovanpÄ den.",
+ "MicroserviceStartupSolutionForDotnet": "Microservice Startup-lösning för .NET",
+ "MonolithSolutionForDotnet": "Monolitisk (modulÀr) lösning för .NET",
+ "TrainingDetailsHeaderInfo_TrainingHour": "{0} timmar",
+ "Trainings_Content": "Utbildningens innehÄll",
+ "Trial_Page_StartYourFreeTrial": "Starta din gratis provperiod.",
+ "TrialLicenseFeatures": "Du kommer att kunna dra nytta av alla ABP:s kommersiella funktioner",
+ "TrialPeriodDays": "Du kommer att ha en {0} dagars teamlicens",
+ "TrialForumSupportIncident": "Du kommer att ha {0} forum support incidenter",
+ "Contact_Page_Title": "Kontakt med ABP:s utvecklingsteam",
+ "Contact_Page_Description": "Kontakta ABP:s utvecklingsteam om du behöver hjÀlp eller dela med dig av dina tankar och Äsikter! ABP Support Team Àr redo att hjÀlpa till.",
+ "Demo_Page_Title": "Skapa en demo",
+ "Demo_Page_Description": "Skapa en gratis demo för att se ett exempel pÄ en ansökan som skapats med hjÀlp av ABP:s startmallar. Upprepa inte dig sjÀlv för vanliga applikationskrav.",
+ "Discounted_Page_Title": "Rabatterad prissÀttning",
+ "Discounted_Page_Description": "VÀlj de funktioner och den funktionalitet som ditt företag behöver redan idag. Köp en ABP-licens och skapa obegrÀnsat med projekt",
+ "Faq_Page_Title": "Vanliga frÄgor och svar (FAQ)",
+ "Faq_Page_Description": "Har du nÄgra frÄgor eller funderingar? Sök bland vanliga frÄgor eller stÀll en frÄga till oss via kontaktformulÀret.",
+ "Faq_Page_SwiftCode": "SWIFT-kod",
+ "Faq_Page_BankName": "Bankens namn",
+ "Faq_Page_AccountName": "Kontots namn",
+ "Faq_Page_AccountNumber": "Kontonummer",
+ "Faq_Page_Currency": "Valuta",
+ "Faq_Page_VatNumber": "Momsregistreringsnummer",
+ "Faq_Page_OtherCurrenciesInfo": "För andra valutor, se alla konton",
+ "ProjectCreatedSuccess_Page_Title": "Ditt projekt skapat",
+ "ProjectCreatedSuccess_Page_Description": "Ditt ABP-projekt har skapats framgÄngsrikt!",
+ "Suite_Page_Title": "ABP-svit",
+ "Suite_Page_Description": "ABP tillhandahÄller verktyg för snabb applikationsutveckling för att öka utvecklarens produktivitet. Med ABP Suite kan du enkelt skapa CRUD-sidor.",
+ "Themes_Page_Title": "ABP Teman",
+ "Themes_Page_Description": "ABP tillhandahÄller flera professionella, moderna UI-teman. Skapa en gratis demo för att fÄ en snabb bild av hur anvÀndargrÀnssnittet ser ut.",
+ "Tools_Page_Title": "Verktyg för snabb applikationsutveckling",
+ "Tools_Page_Description": "ABP tillhandahÄller verktyg för snabb applikationsutveckling för att öka utvecklarens produktivitet. Med ABP Suite kan du enkelt skapa CRUD-sidor.",
+ "DeveloperPrice": "Pris för utvecklare",
+ "AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0} utvecklare",
+ "LicenseRemainingDays": "för {0} dagar",
+ "ExtendPaymentInfoSection_Description": "Genom att förlÀnga/förnya din licens kommer du att fortsÀtta att fÄ premium support. Du kommer ocksÄ att kunna fÄ större eller mindre uppdateringar för moduler och teman. Du kommer att kunna fortsÀtta skapa nya projekt. Och du kommer fortfarande att kunna anvÀnda ABP Suite som pÄskyndar din utveckling.",
+ "LicenseRenewalPrice": "Pris för förnyelse av licens",
+ "LicensePrice": "Licenspris",
+ "TrialLicensePaymentInfoSection_Description": "Köp licens: Genom att köpa en licens kommer du att fortsÀtta att fÄ premium support. Du kommer ocksÄ att kunna fÄ större eller mindre uppdateringar för moduler och teman. Du kommer att kunna fortsÀtta skapa nya projekt. Och du kommer fortfarande att kunna anvÀnda ABP Suite som pÄskyndar din utveckling. Se jÀmförelsetabellen för licenser för att kontrollera skillnaderna mellan licenstyperna.",
+ "SelectTargetLicense": "VÀlj mÄllicens",
+ "UpgradePaymentInfoSection_ExtendMyLicenseForOneYear": "Ja, förlÀnga min licens utgÄngsdatum med 1 Är.",
+ "UpgradePaymentInfoSection_WantToExtendLicense": "Vill du förlÀnga din licens med ytterligare 1 Är?",
+ "UpgradePaymentInfoSection_UpgradingWillNotExtendLicense": "Uppgradering kommer inte att förlÀnga licensens utgÄngsdatum!",
+ "UpgradePaymentInfoSection_LicenseUpgradeDescription": "Genom att uppgradera din licens kommer du att bli befordrad till en högre licenstyp, vilket gör att du kan fÄ ytterligare fördelar. Se jÀmförelsetabellen för licenser för att kontrollera skillnaderna mellan licenstyperna.",
+ "Landing_Page_CustomerStories": "Customer Stories",
+ "Landing_Page_OurGreatCustomers": "VÄra fantastiska kunder",
+ "Landing_Page_WebApplicationFramework": "Ramverk för webbapplikationer",
+ "Landing_Page_WebDevelopmentPlatform": "Plattform för webbutveckling",
+ "Landing_Page_CompleteWebDevelopmentPlatform": "Komplett plattform för webbutveckling",
+ "Landing_Page_TryFreeDemo": "Prova gratis demo",
+ "Landing_Page_StartingPointForWebApplications": "UtgÄngspunkten för ASP.NET Core-baserade webbapplikationer! Den Àr baserad pÄ ABP-ramverket för bÀsta webbutveckling.",
+ "Landing_Page_AbpProvidesSoftwareInfrastructure": "ABP Framework tillhandahÄller en mjukvaruinfrastruktur för att utveckla utmÀrkta webbapplikationer med bÀsta praxis.",
+ "Landing_Page_MicroserviceCompatibleArchitecture": "Kompatibel arkitektur för mikrotjÀnster",
+ "Landing_Page_PreBuiltApplicationModulesAndThemes": "Förbyggda applikationsmoduler och teman",
+ "Landing_Page_MultiTenantArchitecture": "Arkitektur för flera hyresgÀster",
+ "Landing_Page_MultiTenancyDescription": "SaaS-applikationer pÄ ett enkelt sÀtt! Integrerad multi-tenancy frÄn databas till anvÀndargrÀnssnitt.",
+ "Landing_Page_DDDIntroduction": "Designad och utvecklad utifrÄn DDD-mönster och principer. Ger en skiktad modell för din applikation.",
+ "Landing_Page_CrossCuttingConcernsInfo": "Komplett infrastruktur för auktorisering, validering, undantagshantering, cachelagring, revisionsloggning, transaktionshantering med mera.",
+ "Landing_Page_PreBuiltApplicationModules": "Förbyggda applikationsmoduler som omfattar de vanligaste kraven pÄ webbapplikationer.",
+ "Landing_Page_ChatModule": "Chatt",
+ "Landing_Page_DocsModule": "Dokument",
+ "Landing_Page_FileManagementModule": "Filhantering",
+ "Landing_Page_CustomerStory_1": "ABP gjorde det möjligt för SC Ventures att leverera en bankklassad SaaS-plattform med silodatabas med flera hyresgÀster pÄ 9 mÄnader för att stödja leverantörskedjans kundfordringar / leverantörsskulder för finansiering av fakturor med betydande vÀrde frÄn flera integrerade ankare. ABP:s modularitet gjorde det möjligt för teamet att leverera pÄ rekordtid, klara alla VAPT och distribuera den containeriserade mikrotjÀnststacken via fullstÀndig CI/CD och pipelines till produktion.",
+ "Landing_Page_CustomerStory_2": "Vi ser vÀrdet av att anvÀnda ABP för att minska omkostnaderna för anpassade utvecklingsprojekt. Teamet kan förenhetliga kodmönstret i olika projektflöden. Vi ser mer potential i ramverket för att vi ska kunna bygga nya funktioner snabbare Àn tidigare. Vi litar pÄ att vi stÀndigt kommer att se vÀrdet av att utnyttja ABP.",
+ "Landing_Page_CustomerStory_3": "Vi Àlskar ABP. Vi behöver inte skriva allt frÄn grunden. Vi utgÄr frÄn out-of-the-box-funktioner och fokuserar bara pÄ det vi verkligen behöver skriva. Dessutom Àr ABP vÀlarkitekterat och koden Àr av hög kvalitet med fÀrre buggar. Om vi hade varit tvungna att skriva allt vi behövde pÄ egen hand hade vi kanske fÄtt lÀgga ner flera Är. Ytterligare en sak som vi gillar Àr att den nya versionen, problemfixningen eller förbÀttringen kommer ut mycket snart\n varannan vecka. Vi vÀntar inte för lÀnge.",
+ "Landing_Page_CustomerStory_4": "ABP Àr en fantastisk produkt som jag skulle rekommendera. Kommersiella produkter till marknaden för vÄra kunder i en enda konfigurerbar plattform. Den starthjÀlp som ramverket och verktygen ger alla team Àr vÀrd varenda cent. ABP var det som passade bÀst för vÄra behov.",
+ "Landing_Page_AdditionalServices": "Anpassad eller volymlicens, onboarding, liveutbildning och support, anpassad projektutveckling, portning av befintliga projekt och mycket mer...",
+ "Landing_Page_IncludedDeveloperLicenses": "Inkluderar {0} utvecklarlicenser",
+ "Landing_Page_SeeOnDemo": "Se pÄ Demo",
+ "Landing_Page_LeptonThemes": "LeptonTema",
+ "Landing_Page_AccountModuleDescription_1": "Denna modul implementerar autentiseringssystemet för en applikation;",
+ "Landing_Page_AccountModuleDescription_2": "TillhandahÄller en inloggningssida med anvÀndarnamn och lösenord",
+ "Landing_Page_AccountModuleDescription_3": "TillhandahÄller en register-sida för att skapa ett nytt konto.",
+ "Landing_Page_AccountModuleDescription_4": "TillhandahÄller en glömt lösenord-sida för att skicka en ÄterstÀllningslÀnk för lösenord som ett e-postmeddelande.",
+ "Landing_Page_AccountModuleDescription_5": "Ger email confirmation-funktionalitet med UI.",
+ "Landing_Page_AccountModuleDescription_6": "Implementerar tvÄfaktor-autentisering (SMS och e-post).",
+ "Landing_Page_AccountModuleDescription_7": "Implementerar anvÀndarspÀrr (lÄser kontot under en viss tid nÀr ett visst antal misslyckade inloggningar intrÀffar pÄ grund av ogiltiga inloggningsuppgifter inom en viss tidsperiod).",
+ "Landing_Page_AccountModuleDescription_8": "Implementerar anvÀndargrÀnssnitt och funktionalitet för autentiseringsservern Identity Server.",
+ "Landing_Page_AccountModuleDescription_9": "Gör det möjligt att vÀxla mellan hyresgÀster i en miljö med flera hyresgÀster.",
+ "Landing_Page_AccountModuleDescription_10": "Gör det möjligt att Àndra UI-sprÄk i programmet.",
+ "Landing_Page_AuditLoggingModuleDescription_1": "Den hÀr modulen tillhandahÄller grÀnssnittet för rapportering av granskningsloggar för granskningsinfrastrukturen. Gör det möjligt att söka, filtrera och visa poster i granskningsloggen och loggar över enhetsÀndringar.",
+ "Landing_Page_AuditLoggingModuleDescription_2": "En post i granskningsloggen bestÄr av kritisk information om varje klientförfrÄgan:",
+ "Landing_Page_AuditLoggingModuleDescription_3": "URL, webblÀsare, IP-adress, klientnamn",
+ "Landing_Page_AuditLoggingModuleDescription_4": "AnvÀndaren",
+ "Landing_Page_AuditLoggingModuleDescription_5": "HTTP-metod, HTTP-returstatuskod",
+ "Landing_Page_AuditLoggingModuleDescription_6": "FramgÄng/misslyckande, detaljer om undantag om sÄdana finns",
+ "Landing_Page_AuditLoggingModuleDescription_7": "Tid för genomförande av begÀran",
+ "Landing_Page_AuditLoggingModuleDescription_8": "Enheterna har skapats, tagits bort eller uppdaterats i denna begÀran (med Àndrade egenskaper).",
+ "Landing_Page_BloggingModuleDescription_1": "Denna modul lÀgger till en enkel blogg i din ABP-applikation;",
+ "Landing_Page_BloggingModuleDescription_2": "Gör det möjligt att skapa flera bloggar i en och samma applikation.",
+ "Landing_Page_BloggingModuleDescription_3": "Stöder Markdown-formatet.",
+ "Landing_Page_BloggingModuleDescription_4": "Gör det möjligt att skriva en kommentar till ett inlÀgg.",
+ "Landing_Page_BloggingModuleDescription_5": "Gör det möjligt att tilldela taggar till blogginlÀggen.",
+ "Landing_Page_BloggingModuleDescription_6": "Se webbplatsen blog.abp.io som ett levande exempel pÄ bloggmodulen.",
+ "Landing_Page_ChatModuleDescription_1": "Denna modul anvÀnds för realtidsmeddelanden mellan anvÀndare i applikationen.",
+ "Landing_Page_ChatModuleDescription_2": "Meddelanden i realtid pÄ chatt-sidan.",
+ "Landing_Page_ChatModuleDescription_3": "Sök efter anvÀndare i applikationen för nya konversationer.",
+ "Landing_Page_ChatModuleDescription_4": "Kontaktlista för senaste konversationer.",
+ "Landing_Page_ChatModuleDescription_5": "Meddelanden om nya meddelanden nÀr anvÀndaren tittar pÄ en annan sida.",
+ "Landing_Page_ChatModuleDescription_6": "Symbol för totalt antal olÀsta meddelanden pÄ menyikonen.",
+ "Landing_Page_ChatModuleDescription_7": "Antal olÀsta meddelanden för varje konversation.",
+ "Landing_Page_ChatModuleDescription_8": "Lata laddade konversationer.",
+ "Landing_Page_DocsModuleDescription_1": "Denna modul anvÀnds för att skapa webbplatser för teknisk dokumentation;",
+ "Landing_Page_DocsModuleDescription_2": "Inbyggd GitHub-integration: Skriv och hantera dokument direkt pÄ GitHub.",
+ "Landing_Page_DocsModuleDescription_3": "Stöd för Versioning direkt integrerat i GitHub-utgÄvor.",
+ "Landing_Page_DocsModuleDescription_4": "Stöd för flersprÄkighet (med fallback-stöd till standardsprÄket).",
+ "Landing_Page_DocsModuleDescription_5": "Stöder formaten Markdown och HTML.",
+ "Landing_Page_DocsModuleDescription_6": "InnehÄller en navigation och en outline.",
+ "Landing_Page_DocsModuleDescription_7": "Gör det möjligt att hosta flera projekt dokumentation i en enda applikation.",
+ "Landing_Page_DocsModuleDescription_8": "LÀnkar till filen pÄ GitHub, sÄ att vem som helst enkelt kan bidra genom att klicka pÄ Edit-lÀnken.",
+ "Landing_Page_DocsModuleDescription_9": "Förutom GitHub-kÀllan kan du helt enkelt anvÀnda en mapp som dokumentationskÀlla.",
+ "Landing_Page_FileManagementModuleDescription_1": "Ladda upp, ladda ner och organisera filer i en hierarkisk mappstruktur.",
+ "Landing_Page_FileManagementModuleDescription_2": "Den hÀr modulen anvÀnds för att ladda upp, ladda ner och organisera filer i en hierarkisk mappstruktur. Den Àr ocksÄ kompatibel med multi-tenancy och du kan bestÀmma den totala storleksgrÀnsen för dina hyresgÀster.",
+ "Landing_Page_FileManagementModuleDescription_3": "Den hÀr modulen Àr baserad pÄ BLOB-lagring-systemet, sÄ den kan anvÀnda olika lagringsleverantörer för att lagra filinnehÄllet.",
+ "Landing_Page_IdentityModuleDescription_1": "Denna modul implementerar anvÀndar- och rollsystemet i en applikation;",
+ "Landing_Page_IdentityModuleDescription_2": "Bygger pÄ Microsofts ASP.NET Core Identity-bibliotek.",
+ "Landing_Page_IdentityModuleDescription_3": "Hantera roller och anvÀndare i systemet. En anvÀndare kan ha flera roller.",
+ "Landing_Page_IdentityModuleDescription_4": "Ange behörigheter i roll- och anvÀndarnivÄer.",
+ "Landing_Page_IdentityModuleDescription_5": "Aktivera/avaktivera tvÄfaktorautentisering och lÄsning av anvÀndare per anvÀndare.",
+ "Landing_Page_IdentityModuleDescription_6": "Hantera grundlÀggande anvÀndarprofil och lösenord.",
+ "Landing_Page_IdentityModuleDescription_7": "Hantera ansprÄkstyper i systemet, koppla ansprÄk till roller och anvÀndare.",
+ "Landing_Page_IdentityModuleDescription_8": "InstÀllningssida för att hantera lösenordskomplexitet, anvÀndarinloggning, konto och spÀrr.",
+ "Landing_Page_IdentityModuleDescription_9": "Stöd för LDAP-autentisering.",
+ "Landing_Page_IdentityModuleDescription_10": "Ger verifiering av e-postadress och telefonnummer.",
+ "Landing_Page_IdentityModuleDescription_11": "Stödjer integrering av sociala inloggningar (Twitter, Facebook, GitHub etc.).",
+ "Landing_Page_IdentityModuleDescription_12": "Hantera organisationsenheter i systemet.",
+ "Landing_Page_PaymentModuleDescription_1": "Ger integration för olika betalningsgateways.",
+ "Landing_Page_PaymentModuleDescription_2": "Denna modul ger integration för betalningsgateways, sÄ att du enkelt kan fÄ betalning frÄn dina kunder.",
+ "Landing_Page_PaymentModuleDescription_3": "Denna modul stöder följande betalningsportaler",
+ "Welcome_Page_UseSameCredentialForCommercialWebsites": "AnvÀnd samma autentiseringsuppgifter för bÄde abp.io och abp.io/support.",
+ "WatchCrudPagesVideo": "Titta pÄ videon \"Skapa CRUD-sidor med ABP Suite\"!",
+ "WatchGeneratingFromDatabaseVideo": "Titta pÄ videon \"ABP Suite: Generera CRUD-sidor frÄn befintliga databastabeller\" Video!",
+ "WatchTakeCloserLookVideo": "Titta pÄ videon \"Ta en nÀrmare titt pÄ kodgenerering: ABP Suite\" Video!",
+ "ConfirmedEmailAddressRequiredToStartTrial": "Du mÄste ha en bekrÀftad e-postadress för att kunna starta en testlicens.",
+ "EmailVerificationMailNotSent": "E-postverifiering mail kunde inte skickas.",
+ "GetConfirmationEmail": "Klicka hÀr för att fÄ ett verifieringsmejl om du inte har fÄtt det tidigare.",
+ "WhichLicenseTypeYouAreInterestedIn": "Vilken licenstyp Àr du intresserad av?",
+ "DontTakeOurWordForIt": "Ta inte vÄrt ord för det...",
+ "ReadAbpCommercialUsersWantYouToKnow": "LÀs vad ABP:s anvÀndare vill att du ska veta",
+ "Testimonial_ShortDescription_1": "ABP:s modularitet gjorde det möjligt för teamet att leverera i tid.",
+ "Testimonial_ShortDescription_2": "Bygg nya funktioner snabbare Àn tidigare.",
+ "Testimonial_ShortDescription_3": "Vi utgÄr frÄn out-of-the-box-funktioner och fokuserar bara pÄ det som vi verkligen behöver skriva.",
+ "Testimonial_ShortDescription_4": "ABP passade bÀst för vÄra behov.",
+ "OnlineReviewersOnAbpCommercial": "Online recensioner om ABP",
+ "SeeWhatToldAboutAbpCommercial": "Se vad som har sagts om ABP och skriv dina tankar om du vill.",
+ "BlazoriseLicense": "MÄste vi köpa en Blazorise-licens?",
+ "BlazoriseLicenseExplanation": "Vi har ett avtal mellan Volosoft och Megabit, med detta avtal Àr Blazorise-licensen buntad med ABP-produkter, dÀrför behöver vÄra kunder inte köpa en extra Blazorise-licens.",
+ "ExtendPaymentInfoSection_DeveloperPrice": "{0}x Ytterligare utvecklare",
+ "ExtendPaymentInfoSection_DiscountRate": "Rabatt {0}%.",
+ "TotalNetPrice": "Totalt nettopris",
+ "EFCore": "Entity Framework Core",
+ "All": "Alla",
+ "Mvc": "MVC",
+ "DataBaseProvider": "Dataleverantör",
+ "UIFramework": "Ramverk för anvÀndargrÀnssnitt",
+ "LeptonXThemeForDashboard": "LeptonX Theme för din Admin Dashboard av",
+ "AbpPlatform": "ABP-plattform",
+ "YouDeserveGoodUXUI": "Du förtjÀnar ett bra UI och ett bÀttre UX. LeptonX Theme by ABP Àr hÀr för att tjÀna det.",
+ "ViewLiveDemo": "Visa demo för live-tema",
+ "GetLeptonX": "Skaffa LeptonX nu",
+ "SeeLeptonXDocumentation": "Se LeptonX dokumentation",
+ "SeeLeptonDocumentation": "Se Lepton Dokumentation",
+ "SimplifiedMenu": "Förenklad meny",
+ "SimplifiedMenuDescription": "Du kan enkelt hitta den sida du letar efter genom att filtrera i menyn",
+ "YourFavoritePages": "Dina favoritsidor inom rÀckhÄll",
+ "YourFavoritePagesDescription": "LÀgg enkelt till eller ta bort sidan frÄn favoriter genom att klicka pÄ stjÀrnikonen i det övre högra hörnet av sidan.",
+ "BreadCrumbs": "Breadcrumb för sömlös vÀxling",
+ "BreadCrumbsDescription": "Med Breadcrumb kan du vÀxla till sidorna pÄ samma nivÄ med ett klick, Àven nÀr vÀnstermenyn Àr stÀngd, och det fungerar pÄ surfplattor och mobiler!",
+ "YourMenu": "Din meny som du vill ha den",
+ "YourMenuDescription": "Anpassa de direktklickbara ikonerna och rullgardinsmenyerna i anvÀndarmenyn som du vill. AnvÀndarmenyn Àr helt anpassningsbar efter dina behov",
+ "RtlSupport": "RTL-stöd för ditt sprÄk",
+ "RtlSupportDescription": "LeptonX Theme stöder RTL för ditt sprÄk. SprÄkalternativen finns i instÀllningsmenyn sÄ att du kan Àndra sprÄk.",
+ "YourColors": "Dina fÀrger i grÀnssnittet för din adminpanel",
+ "YourColorsDescription": "LeptonX Theme fungerar enligt dina systeminstÀllningar och har alternativ för dashboard light theme, dashboard dark theme och dashboard semi-dark theme.",
+ "ArrangeContentWidth": "Ordna enkelt bredden pÄ ditt innehÄll",
+ "ArrangeContentWidthDescription": "Ăndra enkelt bredden pĂ„ din innehĂ„llsyta.",
+ "LeptonXCompatibleWith": "LeptonX Theme Àr kompatibelt med",
+ "MobileResponsiveTemplate": "Mobil responsiv mall",
+ "MobileResponsiveTemplateDescription1": "FÄ tillgÄng till LeptonX adminpanel frÄn vilken enhet du vill.",
+ "MobileResponsiveTemplateDescription2": "Den Àr utformad för att du enkelt ska kunna anvÀnda den i alla dina enheter. Den Àr responsiv pÄ mobila enheter och surfplattor.",
+ "TopMenuLayoutOption": "Alternativ för layout av toppmeny",
+ "TopMenuLayoutOptionDescription1": "Om du vill konfigurera din webbplats med samma adminpanel Àr det möjligt att göra det med LeptonX Theme!",
+ "TopMenuLayoutOptionDescription2": "Prova bara LeptonX toppmenylayout för att fÄ det att hÀnda!",
+ "EasilyCustomizable": "LÀtt att anpassa till ditt varumÀrkes fÀrger",
+ "EasilyCustomizableDescription1": "Du kan anpassa LeptonX-temat med bara nÄgra fÄ SCSS-variabler. Ingen ÄsidosÀttning, ingen extra CSS-belastning!",
+ "EasilyCustomizableDescription2": "Med LeptonX kan du ordna din adminpanel precis som du vill.",
+ "IndependentLayout": "Oberoende layout och innehÄllsyta",
+ "IndependentLayoutDescription1": "LeptonX:s layoutinfrastruktur utformades helt separat frÄn innehÄllet.",
+ "IndependentLayoutDescription2": "Detta innebÀr att du fritt kan utforma ditt projekt med en annan innehÄllsstruktur Àn Bootstrap om du vill.",
+ "MostUsedLibraries": "De mest anvÀnda biblioteken integrerade med LeptonX",
+ "MostUsedLibrariesDescription1": "LeptonX innehÄller dina mest anvÀnda bibliotek. Det gör att du enkelt kan anvÀnda bibliotek som ApexCharts, DataTables, DropZone, FullCalender, JSTree, Select2 och Toastr.",
+ "MostUsedLibrariesDescription2": "LeptonX stöder ocksÄ MVC Angular och Blazor-specifika bibliotek.",
+ "CreateAndCustomize": "Skapa och anpassa de sidor du behöver pÄ nÄgra sekunder med LeptonX anpassade sidor",
+ "CreateAndCustomizeDescription": "Genom att anvÀnda LeptonX Theme fÄr du ocksÄ tillgÄng till mÄnga fÀrdiga HTML-sidor. Dessa inkluderar mÄnga sidor som inloggningssida, blogg, FAQ, prenumerationslista, faktura, prissÀttning och filhantering.",
+ "LeptonThemeForAdmin": "Lepton Theme för din adminpanel genom att",
+ "LeptonThemeForAdminDescription": "Lepton Theme Àr fortfarande tillgÀngligt och kommer att underhÄllas. Om du vill byta till LeptonX Theme som Lepton Theme-anvÀndare kan du se dokumentationen för att lÀra dig hur du gör.",
+ "LeptonCompatibleWith": "Lepton Theme Àr kompatibelt med",
+ "BlackFridayDiscount": "Black Friday-rabatt",
+ "UpgradePaymentInfoSection_DeveloperPrice": "{0} för {1} ytterligare utvecklare",
+ "Upgrade": "Uppgradering",
+ "Renewal": "Förnyelse",
+ "UpgradePaymentInfoSection_LicensePrice": "{0} licens",
+ "UpgradePaymentInfoSection_LicenseRenewalPrice": "Förnyelse av licens",
+ "Total": "Totalt",
+ "SupportPolicyFaqTitle": "Vilken Àr er supportpolicy?",
+ "SupportPolicyFaqExplanation": "Vi stöder endast den aktiva och den tidigare huvudversionen. Vi garanterar inte en patchrelease för den tredje och Àldre huvudversionen. Till exempel, om den aktiva versionen Àr 7.0.0, kommer vi att slÀppa patchversioner för bÄde 6.x.x och 7.x.x. Dessutom ger vi support endast för ABP Framework och ABP-relaterade problem. Det betyder att inget stöd ges för tredjepartsapplikationer, molntjÀnster och andra perifera bibliotek som anvÀnds av ABP-produkter. Vi kommer att anvÀnda kommersiellt rimliga anstrÀngningar för att ge vÄra kunder teknisk support under \"Volosoft Bilisim A.S\" officiella öppettider. à andra sidan förbinder vi oss inte till en svarstid enligt servicenivÄavtal (SLA), men vi kommer att försöka svara pÄ de tekniska frÄgorna sÄ snabbt som möjligt inom vÄra officiella arbetstider. Om inte en sÀrskild överenskommelse görs med kunden tillhandahÄller vi endast support pÄ https://support.abp.io. Vi har ocksÄ en privat e-postsupport som endast Àr tillgÀnglig för innehavare av Enterprise-licenser.",
+ "TotalDevelopers": "Totalt {0} utvecklare",
+ "CustomPurchaseExplanation": "SkrÀddarsydd för dina specifika behov",
+ "WhereDidYouHearAboutUs": "Var har du hört talas om oss?",
+ "Twitter": "Twitter",
+ "Facebook": "Facebook",
+ "Youtube": "YouTube",
+ "Google": "Google",
+ "Github": "GitHub",
+ "Friend": " FrÄn en vÀn",
+ "Other": "Ăvriga",
+ "WhereDidYouHearAboutUs_explain": "Ange ...",
+ "DeletingMemberWarningMessage": "\"{0}\" kommer att tas bort frÄn listan över utvecklare. Om du vill kan du tilldela denna tomma plats till en annan utvecklare senare.",
+ "AdditionalInfo": "Om antalet platser för utvecklare överstiger dina krav kan du minska dem. Du kan skicka e-post till info@abp.io för att ta bort nÄgra av dina utvecklarplatser. Om du rensar bort oanvÀnda utvecklarplatser minskar kostnaden för licensförnyelse. Om du vill kan du Äterköpa ytterligare utvecklarplatser inom din aktiva licensperiod. Observera att eftersom det finns {0} utvecklare i det hÀr licenspaketet kan du inte minska detta antal.",
+ "LinkExpiredErrorMessage": "LÀnken du försöker komma Ät har gÄtt ut.",
+ "ExpirationDate": "UtgÄngsdatum",
+ "SpringCampaignDiscount": "Rabatt pÄ vÄrkampanjen",
+ "WhyUseAbpIoPlatform": "Varför ska jag anvÀnda ABP.IO-plattformen i stÀllet för att skapa en ny lösning frÄn grunden?",
+ "WhyUseAbpIoPlatformFaqExplanation": "Se den sidan för en detaljerad förklaring av varför anvÀndning av ABP.IO Platform har en betydande fördel jÀmfört med att göra allt sjÀlv.",
+ "EulaPageTitle": "Licensavtal för slutanvÀndare (EULA)",
+ "PrivacyPolicyPageTitle": "Integritetspolicy - Cookiepolicy",
+ "TermsConditionsPageTitle": "Villkor och anvisningar",
+ "TrainingsPageTitle": "ABP:s utbildningspaket",
+ "ModulesPageTitle": "ABP Förbyggda applikationsmoduler",
+ "Volo.AbpIo.Commercial:040001": "API-Ätkomstnyckeln Àr felaktig.",
+ "GetLepton": "Skaffa Lepton nu",
+ "MyOrganizations_Detail_LicenseStartDate": "Startdatum",
+ "MyOrganizations_Detail_LicenseExpiryDate": "UtgÄngsdatum",
+ "BlazoriseSupport": "Hur fÄr jag Blazorise-licensnyckeln och support frÄn Blazorise-teamet?",
+ "BlazoriseSupportExplanation": "Följ stegen nedan för att fÄ support frÄn Blazorise-teamet och fÄ din Blazorise-licensnyckel:",
+ "BlazoriseSupportExplanation1": "Registrera dig för ett nytt konto pÄ blazorise.com/support/register med samma e-postadress som ditt abp.io-konto. LÀmna posten \"Licensnyckel\" tom. Det mÄste vara samma e-postadress som ditt e-postkonto pÄ abp.io.",
+ "BlazoriseSupportExplanation2": "Verifiera din e-postadress genom att kolla din e-postlÄda. Kontrollera din skrÀppostlÄda om du inte ser ett e-postmeddelande i din inkorg!",
+ "BlazoriseSupportExplanation3": "Logga in pÄ Blazorise supportwebbplats pÄ blazorise.com/support/login.",
+ "BlazoriseSupportExplanation4": "Om du har en aktiv ABP betald licens kommer du ocksÄ att ha en Blazorise PRO-licens. Du kan fÄ din Blazorise-licensnyckel pÄ blazorise.com/support/user/manage/license.",
+ "BlazoriseSupportExplanation5": "Du kan stÀlla dina frÄgor pÄ supportwebbplatsen och generera en produkttoken för din applikation.",
+ "AbpLiveTrainingPackages": "ABP Live utbildningspaket",
+ "Releases": "UtgÄvor",
+ "ReleasesDescription": "Den hÀr sidan innehÄller detaljerad information om varje release. Du kan se alla stÀngda pull requests för en specifik release. För övergripande milstolpsutvecklingar kan du kolla in sidan med kortfattade releaseanteckningar.",
+ "ReleaseDate": "Utgivningsdatum",
+ "Labels": "Etiketter",
+ "PreRelease": "Förhandsrelease",
+ "AllTypes": "Alla typer",
+ "Enhancement": "FörbÀttring",
+ "Bug": "Insekt",
+ "Feature": "Funktion",
+ "AllUIs": "Alla anvÀndargrÀnssnitt",
+ "MVC": "MVC",
+ "BlazorServer": "Blazor Server",
+ "MAUI": "MAUI",
+ "HowItWorks_Page_Title": "Hur fungerar det?",
+ "HowItWorks_Page_Description": "ABP Framework utökar .NET-plattformen. SÄ allt du kan göra med en vanlig .NET-lösning Àr redan möjligt med ABP Framework. Det gör det enkelt att komma igÄng med en lÄg inlÀrningskurva.",
+ "HowItWorks_Description1": "ABP Framework utökar .NET-plattformen. SÄ allt du kan göra med en vanlig .NET-lösning Àr redan möjligt med ABP Framework. Det gör det enkelt att komma igÄng med en lÄg inlÀrningskurva.",
+ "HowItWorks_Description2": "NÀr du vÀl har börjat lÀra dig och anvÀnda ABP Framework-funktionerna kommer det att bli mycket roligare Àn nÄgonsin att utveckla din programvara.",
+ "HowItWorks_Description3": "Den hÀr sidan förklarar i princip hur du anvÀnder ABP.IO Platform som .NET-utvecklare.",
+ "CreateANewSolution": "Skapa en ny .NET-lösning",
+ "CreateANewSolution_Description1": "Allt börjar med att skapa en ny ABP-integrerad .NET-lösning.",
+ "StartWithStartupTemplates": "Starta en av de förbyggda mallarna för startup-lösningar",
+ "SimpleMonolithApplicationTemplate": "Enkel mall för monolitisk applikation",
+ "LayeredApplicationTemplate": "Skiktad applikationsmall",
+ "MicroserviceSolutionTemplate": "Mall för mikroservicelösning",
+ "CreateEmptySolutionAndUseAbp": "Eller skapa en ny tom .NET-lösning och installera ABP NuGet & NPM paket sjÀlv.",
+ "CreatingSolutionWithMultipleOptions": "Det finns flera alternativ för anvÀndargrÀnssnitt och databas nÀr du skapar en ny lösning.",
+ "UIFrameworkOptions": "Alternativ för anvÀndargrÀnssnitt",
+ "DotnetSolutionWithoutDependency": "Nu har du en vanlig .NET-lösning i din lokala dator som inte Àr beroende av nÄgon molnplattform eller extern tjÀnst.",
+ "CheckTheDocumentForDetails": "Du kan kontrollera {1} dokumentet för detaljer.",
+ "UIAndDatabaseIndependent": "ABP kan fungera med alla anvÀndargrÀnssnitt och alla databasleverantörer som stöds av .NET.\n Dessa anvÀndargrÀnssnitt och databasleverantörer Àr dock förintegrerade och vÀldokumenterade.",
+ "InstallAbpModules": "Installera ABP-moduler",
+ "DevelopYourSolution": "Utveckla din lösning",
+ "DeployAnywhere": "Distribuera var som helst",
+ "InstallAbpModule_Description1": "ABP Àr ett modulÀrt ramverk för applikationsutveckling. Mallarna för startup-lösningar levereras redan med de viktigaste modulerna installerade.\n Men det finns fler applikationsmoduler som du kanske vill anvÀnda i din lösning.",
+ "InstallAbpModule_Description2": "Varje modul bestÄr av ett fÄtal NuGet- och NPM-paket och har ett installationsdokument. ABP Suite gör det mesta av arbetet automatiskt, sedan konfigurerar eller finjusterar du modulen manuellt baserat pÄ dess dokumentation.",
+ "DevelopYourSolution_Description1": "ABP:s infrastruktur gör att du kan fokusera pÄ din egen affÀrskod genom att automatisera det repetitiva arbetet och tillhandahÄlla förbyggd infrastruktur och applikationsfunktioner.",
+ "DevelopYourSolution_Description2": "I följande kodblock kan du se hur ABP Framework sömlöst integreras i din kod och automatiserar de repetitiva uppgifterna Ät dig.",
+ "DevelopYourSolution_Description3": "Ăven i detta kortkodsblock gör ABP en hel del saker Ă„t dig.",
+ "DevelopYourSolution_Description4": "Den tillhandahÄller basklasser för att tillÀmpa konventioner, som\n dependency injection. Generiska\n repository tjÀnster ger ett bekvÀmt sÀtt att\n sÀtt att interagera med databasen. Deklarativ\n auktorisering arbetar med ett finjusterat behörighetssystem.",
+ "DevelopYourSolution_Description5": "ABP automatiserar helt och hÄllet\n arbetsenhet (för databasanslutning och transaktionshantering),\n undantagshantering,\n validering\n och auditloggning. Det ger mÄnga fler byggstenar för att förenkla dina dagliga utvecklingsuppgifter och fokusera pÄ din egen kod medan du skapar produktionsklara\n applikationer.",
+ "DevelopYourSolution_Description6": "Du kan förestÀlla dig hur lÄngt och komplicerat det kodblocket kan bli om du skulle göra allt manuellt.",
+ "SuiteCrudGenerationInFewSeconds": "Förutom att handkoda din lösning kan du skapa fullt fungerande avancerade CRUD-sidor pÄ nÄgra minuter med hjÀlp av ABP Suite-verktyget. Det genererar koden till din lösning, sÄ att du kan finjustera den utifrÄn dina anpassade krav.",
+ "DeployAnywhere_Description1": "I slutÀndan har du en ren .NET-lösning. Du kan distribuera din lösning till din egen server, till en molnplattform, till Kubernetes eller var du vill. Du kan distribuera till sÄ mÄnga servrar som du vill. ABP Àr ett agnostiskt verktyg för driftsÀttningsmiljöer.",
+ "ExpertiseAbpFramework": "Expertis ABP-ramverket",
+ "ExpertiseAbpFramework_Description1": "Vill du gÄ lÀngre Àn till grunderna och fÄ expertis inom ABP.IO-plattformen?",
+ "FreeDownload": "Fri nedladdning",
+ "Read": "LĂ€s",
+ "HavingTrouble": "Har du problem?",
+ "HavingTrouble_Description1": "Har du problem med att utveckla din lösning? Vi finns hÀr för dig! AnvÀnd ABP:s supportplattform\n eller skicka ett e-postmeddelande för att fÄ hjÀlp direkt frÄn Core ABP Framework-teamets medlemmar.",
+ "WeAreHereToHelp_Description1": "Du kan blÀddra bland vÄra hjÀlpÀmnen eller söka i vanliga frÄgor,\n eller sÄ kan du stÀlla en frÄga till oss genom att anvÀnda kontaktformulÀret.",
+ "OtherModules": "Ăvriga moduler",
+ "OtherModules_Description1": "Konto, Audit Logging, Chatt, CMS Kit, Filhantering, FormulÀr, GDPR, Identitet, SprÄkhantering, Betalning, Saas och mer ...",
+ "HowItWorks_DatabaseProviderOptions": "Alternativ för databasleverantör",
+ "SeeFAQ": "Se vanliga frÄgor",
+ "ReleaseLogs": "Release Loggar",
+ "ReleaseLogs_Tag": "{0} Loggar för frislÀppande",
+ "ReleaseLogs_Pr": "Pull Request #{0} - {1}",
+ "NoLabels": "Inga etiketter",
+ "DoesTheSubscriptionRenewAutomatically": "Förnyas abonnemanget automatiskt?",
+ "DoesTheSubscriptionRenewAutomaticallyExplanation": "ABP.IO-plattformen har inte en faktureringsmodell för automatisk förnyelse. DÀrför kommer din prenumeration inte att förnyas automatiskt i slutet av din licensperiod. Om du vill fortsÀtta att ha fördelarna med ABP.IO-plattformen mÄste du förnya den manuellt pÄ sidan för organisationshantering. Om du har flera organisationer klickar du pÄ knappen \"Hantera\" pÄ din organisation som löper ut och klickar sedan pÄ knappen \"FörlÀng nu\" för att förnya din licens. Du kanske ocksÄ vill ta en titt pÄ avsnittet Vad hÀnder nÀr min licens gÄr ut?.",
+ "DoesTheSubscriptionRenewAutomaticallyExplanationAutoRenewal": "ABP tillÄter dig att automatiskt förnya din licens. Detta Àr en valfri tjÀnst. Du kan vÀxla den hÀr funktionen nÀr du köper en ny licens eller senare aktivera den frÄn din organisationshanteringssida. VÀxling för automatisk förnyelse finns i avsnittet \"Betalningsmetod\" pÄ organisationshanteringssidan. Om du vill stÀnga av automatisk förnyelse, besök organisationshanteringssidan, gÄ till avsnittet \"Betalningsmetod\" och avmarkera kryssrutan \"Automatisk förnyelse\". NÀr du stÀnger av funktionen för automatisk förnyelse mÄste du förnya din licens sjÀlv.",
+ "ExtraQuestionCreditsFaqTitle": "Kan jag köpa extra poÀng för supportfrÄgor?",
+ "ExtraQuestionCreditsFaqExplanation": "Ja, det kan du göra. För att köpa extra frÄgepoÀng, skicka ett e-postmeddelande till info@abp.io med din organisations namn. HÀr Àr prislistan för de extra frÄgekrediterna:
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.
Tack för att du Àr en aktiv medlem! Vi ses i de kommande lotterierna.",
+ "RafflesInfoTitle": "ABP Community Rafflar.",
+ "ToLuckyWinner": "till 1 lycklig vinnare",
+ "MarkdownSupported": "Stöd för Markdown.",
+ "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}.",
+ "OrganizationManagement": "Organisation och ledning",
+ "OrganizationList": "Organisationslista",
+ "Volo.AbpIo.Commercial:010003": "Du Àr inte Àgare till den hÀr organisationen!",
+ "OrganizationNotFoundMessage": "Ingen organisation hittades!",
+ "DeveloperCount": "Tilldelade / totala utvecklare",
+ "QuestionCount": "Kvarvarande / totala frÄgor",
+ "Unlimited": "ObegrÀnsad",
+ "Owners": "Ăgare",
+ "Owner": "Ăgare",
+ "AddMember": "LĂ€gg till medlem",
+ "AddNewOwner": "LÀgg till ny Àgare",
+ "AddNewDeveloper": "LĂ€gg till ny utvecklare",
+ "Developers": "Utvecklare",
+ "LicenseType": "Typ av licens",
+ "Manage": "Hantera",
+ "SetDefault": "StÀll in som standard",
+ "DefaultOrganization": "Standard",
+ "StartDate": "Startdatum",
+ "EndDate": "Slutdatum",
+ "Modules": "Moduler",
+ "LicenseExtendMessage": "Slutdatum för din licens förlÀngs till {0}.",
+ "LicenseUpgradeMessage": "Din licens har uppgraderats till {0}.",
+ "LicenseExtendAdnUpgradeMessage": "Din licens har förlÀngts till {0} och din licensplan har uppgraderats till {1}.",
+ "LicenseAddDeveloperMessage": "{0} utvecklare lÀggs till i din licens",
+ "Volo.AbpIo.Commercial:010004": "Kan inte hitta den angivna anvÀndaren! AnvÀndaren mÄste redan ha registrerats.",
+ "MyOrganizations": "Mina organisationer",
+ "ApiKey": "API-nyckel",
+ "UserNameNotFound": "Det finns ingen anvÀndare med anvÀndarnamnet {0}",
+ "SuccessfullyAddedToNewsletter": "Tack för att du prenumererar pÄ vÄrt nyhetsbrev!",
+ "MyProfile": "Min profil",
+ "WouldLikeToReceiveMarketingMaterials": "Jag skulle vilja fÄ marknadsföringsnyheter som produkterbjudanden och specialerbjudanden.",
+ "StartUsingYourLicenseNow": "Börja anvÀnda din licens nu!",
+ "WelcomePage": "VĂ€lkomstsida",
+ "UnsubscriptionExpireEmail": "Avregistrera dig frÄn e-postmeddelanden med pÄminnelser om licensens utgÄngsdatum",
+ "UnsubscribeLicenseExpireEmailReminderMessage": "Denna e-postprenumeration innehÄller endast pÄminnelser om utgÄngsdatum för din licens.",
+ "UnsubscribeFromLicenseExpireEmails": "Om du inte vill fÄ e-postmeddelanden om utgÄngsdatum för din licens kan du avsluta prenumerationen nÀr som helst.",
+ "Unsubscribe": "Avsluta prenumeration",
+ "NotOrganizationMember": "Du Àr inte medlem i nÄgon organisation.",
+ "UnsubscribeLicenseExpirationEmailSuccessTitle": "FramgÄngsrikt avregistrerad",
+ "UnsubscribeLicenseExpirationEmailSuccessMessage": "Du kommer inte lÀngre att fÄ e-postmeddelanden med pÄminnelser om licensens utgÄngsdatum.",
+ "LiveDemoLead": "{1} med ditt ABP-konto, {3} till abp.io eller fyll i formulÀret nedan för att skapa en live demo nu",
+ "ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Det finns redan ett konto med den angivna e-postadressen: {0} Du bör logga in med ditt konto för att fortsÀtta.",
+ "GetLicence": "Skaffa licens",
+ "Startup": "Nystartad verksamhet",
+ "Templates": "Mallar",
+ "Developer": "Utvecklare",
+ "Tools": "Verktyg",
+ "Premium": "Premium",
+ "PremiumSupport": "Premium-support",
+ "PremiumForumSupport": "Premium Forum Support",
+ "UI": "UI",
+ "Themes": "Teman",
+ "JoinOurNewsletter": "AnmÀl dig till vÄrt nyhetsbrev",
+ "Send": "Skicka",
+ "OpenSourceBaseFramework": "Basramverk med öppen kÀllkod",
+ "MicroserviceCompatible": "Kompatibel med mikrotjÀnster",
+ "DistributedMessaging": "Distribuerad meddelandehantering",
+ "DynamicProxying": "Dynamisk proxyservering",
+ "BLOBStoring": "BLOB Storing",
+ "AdvancedLocalization": "Avancerad lokalisering",
+ "ManyMore": "MÄnga fler",
+ "ExploreTheABPFramework": "Utforska ABP-ramverket",
+ "StartupTemplatesShortDescription": "Startup-mallar gör att du kan starta ditt projekt pÄ nÄgra sekunder.",
+ "UIFrameworksOptions": "Alternativ för ramverk för anvÀndargrÀnssnitt;",
+ "DatabaseProviderOptions": "Alternativ för databasleverantör;",
+ "PreBuiltApplicationModules": "Förbyggda applikationsmoduler",
+ "PreBuiltApplicationModulesShortDescription": "De vanligaste applikationskraven Àr redan utvecklade Ät dig som ÄteranvÀndbara moduler.",
+ "Account": "Konto",
+ "Blogging": "Bloggande",
+ "Identity": "Identitet",
+ "IdentityServer": "Identitetsserver",
+ "LanguageManagement": "SprÄkhantering",
+ "TextTemplateManagement": "Hantering av textmallar",
+ "See All Modules": "SeAllaModuler",
+ "ABPSuite": "ABP-svit",
+ "AbpSuiteShortDescription": "ABP Suite Àr ett komplementÀrt verktyg till ABP Platform.",
+ "AbpSuiteExplanation": "Det gör att du kan bygga webbsidor pÄ bara nÄgra minuter. Det Àr ett .NET Core Global-verktyg som kan installeras frÄn kommandoraden. Det kan skapa en ny ABP-lösning och generera CRUD-sidor frÄn databasen till frontend.",
+ "LeptonTheme": "Lepton tema",
+ "ProfessionalModernUIThemes": "Professionella, moderna UI-teman",
+ "LeptonThemeExplanation": "Lepton tillhandahÄller en rad Bootstrap-adminteman som fungerar som en solid grund för alla projekt som krÀver en adminpanel.",
+ "DefaultTheme": "Standardtema",
+ "MaterialTheme": "Materialtema",
+ "Default2Theme": "Standard 2 Tema",
+ "DarkTheme": "Mörkt tema",
+ "DarkBlueTheme": "MörkblÄtt tema",
+ "LightTheme": "Ljus tema",
+ "ProudToWorkWith": "Stolt över att arbeta med",
+ "JoinOurConsumers": "Anslut dig till dem och bygg fantastiska produkter snabbt.",
+ "AdditionalServicesExplanation": "Behöver du ytterligare eller anpassade tjÀnster? Vi och vÄra partners kan tillhandahÄlla;",
+ "CustomProjectDevelopment": "Anpassad projektutveckling",
+ "CustomProjectDevelopmentExplanation": "Dedikerade utvecklare för dina anpassade projekt.",
+ "PortingExistingProjects": "Portning av befintliga projekt",
+ "PortingExistingProjectsExplanation": "Migrera dina Àldre projekt till ABP-plattformen.",
+ "LiveSupport": "Support i realtid",
+ "LiveSupportExplanation": "FjÀrrsupport i realtid nÀr du behöver det.",
+ "Training": "Utbildning",
+ "TrainingExplanation": "Dedikerad utbildning för dina utvecklare.",
+ "OnBoarding": "Onboarding",
+ "OnBoardingExplanation": "HjÀlp med att konfigurera dina utvecklings-, CI- och CD-miljöer.",
+ "PrioritizedTechnicalSupport": "Prioriterad teknisk support",
+ "PremiumSupportExplanation": "Förutom det stora samhÀllsstödet i ABP-ramverket svarar vÄrt supportteam pÄ tekniska frÄgor och problem frÄn de kommersiella anvÀndarna med hög prioritet.",
+ "SeeTheSupportOptions": "Kolla in supportalternativen",
+ "Contact": "Kontakt",
+ "TellUsWhatYouNeed": "BerÀtta för oss vad du behöver.",
+ "YourMessage": "Ditt meddelande",
+ "YourFullName": "Ditt fullstÀndiga namn",
+ "FirstNameField": "Förnamn",
+ "LastNameField": "Efternamn",
+ "EmailField": "E-postadress",
+ "YourEmailAddress": "Din e-postadress",
+ "ValidEmailAddressIsRequired": "En giltig e-postadress krÀvs.",
+ "HowMayWeHelpYou": "Hur kan vi hjÀlpa dig?",
+ "SendMessage": "Skicka meddelande",
+ "Success": "FramgÄng",
+ "WeWillReplyYou": "Vi har mottagit ditt meddelande och kommer att kontakta dig inom kort.",
+ "CreateLiveDemo": "Skapa live-demo",
+ "CreateLiveDemoDescription": "NÀr du har skickat in formulÀret kommer du att fÄ ett e-postmeddelande med din demolÀnk.",
+ "RegisterToTheNewsletter": "AnmÀl dig till nyhetsbrevet för att fÄ information om ABP.IO, inklusive nya releaser etc.",
+ "EnterYourEmailOrLogin": "Ange din e-postadress för att skapa din demo eller Logga in med ditt befintliga konto.",
+ "ApplicationTemplate": "Mall för ansökan",
+ "ApplicationTemplateExplanation": "Application startup template anvÀnds för att skapa en ny webbapplikation.",
+ "EfCoreProvider": "Entity Framework (Stödjer SQL Server, MySQL, PostgreSQL, Oracle och andra)",
+ "AlreadyIncludedInTemplateModules": "Följande moduler Àr redan inkluderade och konfigurerade i den hÀr mallen:",
+ "ApplicationTemplateArchitecture": "Den hÀr applikationsmallen stöder ocksÄ nivÄindelad arkitektur dÀr anvÀndargrÀnssnittslagret, API-lagret och autentiseringstjÀnsten Àr fysiskt Ätskilda.",
+ "SeeTheGuideOrGoToTheLiveDemo": "Kolla in utvecklarguiden för teknisk information om den hÀr mallen eller gÄ till live-demonstrationen.",
+ "DeveloperGuide": "Guide för utvecklare",
+ "ModuleTemplate": "Mall för modul",
+ "ModuleTemplateExplanation1": "Vill du skapa en modul och ÄteranvÀnda den i olika applikationer? Den hÀr startmallen förbereder allt för att börja skapa en ÄteranvÀndbar applikationsmodul eller en mikrotjÀnst.",
+ "ModuleTemplateExplanation2": "
Du kan stödja enstaka eller flera anvÀndargrÀnssnittsramverk, enstaka eller flera databasleverantörer för en enda modul. Startmallen Àr konfigurerad för att köra och testa din modul i en minimal applikation utöver infrastrukturen för enhets- och integrationstest.
Se utvecklarguiden för teknisk information om den hÀr mallen.
",
+ "WithAllStyleOptions": "med alla stilalternativ",
+ "Demo": "Demo",
+ "SeeAllModules": "Se alla moduler",
+ "ABPCLIExplanation": "ABP CLI Àr ett kommandoradsverktyg för att utföra vanliga utvecklingsuppgifter för ABP-baserade lösningar.",
+ "ABPSuiteEasilyCURD": "ABP Suite Àr ett verktyg som gör att du enkelt kan skapa CRUD-sidor",
+ "WeAreHereToHelp": "Vi Àr hÀr för att hjÀlpa",
+ "BrowseOrAskQuestion": "Du kan blÀddra i vÄra hjÀlpÀmnen eller söka i vanliga frÄgor, eller sÄ kan du stÀlla en frÄga till oss genom att anvÀnda kontaktformulÀret.",
+ "SearchQuestionPlaceholder": "Sök i vanliga frÄgor och svar",
+ "AbpCommercialMetaDescription": "En omfattande webbutvecklingsplattform pÄ ABP Framework med förbyggda moduler, startmallar, verktyg för snabb utveckling, proffsiga UI-teman och premiumsupport.",
+ "WhatAreDifferencesThanABPFrameworkExplanation": "
ABP-ramverket Àr ett modulÀrt, tematiserbart, mikrotjÀnstkompatibelt ramverk för applikationsutveckling för ASP.NET Core. Det ger en komplett arkitektur och en stark infrastruktur sÄ att du kan fokusera pÄ din egen affÀrskod istÀllet för att upprepa dig sjÀlv för varje nytt projekt. Det Àr baserat pÄ bÀsta praxis för mjukvaruutveckling och populÀra verktyg som du redan kÀnner till.
ABP-ramverket Àr helt gratis, öppen kÀllkod och community-driven. Det ger ocksÄ ett gratis tema och nÄgra förbyggda moduler (t.ex. identitetshantering och hyresgÀsthantering).
<",
+ "VisitTheFrameworkVSCommercialDocument": "Besök följande lÀnk för mer information {1} ",
+ "Professional": "Professionell",
+ "UIThemes": "Teman för anvÀndargrÀnssnitt",
+ "EnterpriseModules": "Enterprise ready, funktionsrika, förbyggda applikationsmoduler (t.ex. hantering av identitetsserver, SaaS-hantering, sprÄkhantering)",
+ "ToolingToSupport": "Verktyg för att stödja din utvecklingsproduktivitet (t.ex. ABP Suite)",
+ "PremiumSupportLink": "Premium Support",
+ "ABPCommercialSolutionExplanation": "NÀr du skapar en ny applikation fÄr du en Visual Studio-lösning (en startmall) som baseras pÄ dina önskemÄl. Den nedladdade lösningen har kommersiella moduler och teman som redan Àr installerade och konfigurerade Ät dig. Du kan ta bort en förinstallerad modul eller lÀgga till en annan modul om du vill. Alla moduler och teman anvÀnder NuGet/NPM-paket som standard.",
+ "StartDevelopWithTutorials": "Den nedladdade lösningen Àr vÀl arkitekterad och dokumenterad. Du kan börja utveckla din egen företagskod baserad pÄ den genom att följa handledningarna.",
+ "HowManyProductsExplanation": "Du kan skapa sÄ mÄnga projekt du vill under din aktiva licensperiod; det finns ingen grÀns! Efter att din licens har löpt ut kan du inte skapa nya projekt, men du kan fortsÀtta att utveckla de projekt du har laddat ner och distribuera dem till ett obegrÀnsat antal servrar.",
+ "ChangingLicenseType": "Kan jag uppgradera min licenstyp senare?",
+ "LicenseExtendUpgradeDiffExplanation": "FörlÀngning: Genom att förlÀnga/förnya din licens kommer du att fortsÀtta att fÄ premiumsupport och fÄ större eller mindre uppdateringar för modulerna och teman. Dessutom kommer du att kunna fortsÀtta skapa nya projekt. Och du kommer fortfarande att kunna anvÀnda ABP Suite, vilket pÄskyndar din utveckling. NÀr du förlÀnger din licens lÀggs 1 Är till licensens utgÄngsdatum. Uppgradering: Genom att uppgradera din licens kommer du att befordras till en högre licensplan, vilket gör att du kan fÄ ytterligare fördelar. Kolla in jÀmförelsetabellen för licenser för att se skillnaderna mellan licensplanerna. NÀr du uppgraderar Àndras dÀremot inte licensens utgÄngsdatum! För att förlÀnga licensens slutdatum mÄste du förlÀnga din licens.",
+ "LicenseRenewalCost": "Vad Àr kostnaden för licensförnyelse efter 1 Är?",
+ "LicenseRenewalCostExplanation": "Priset för förnyelse (förlÀngning) av standard Team License Àr ${0}, standard Business License Àr ${1} och standard Enterprise License Àr ${2}. Om du redan Àr kund, logga in pÄ ditt konto för att granska den aktuella förnyelseprissÀttningen.",
+ "HowDoIRenewMyLicense": "Hur förnyar jag min licens?",
+ "HowDoIRenewMyLicenseExplanation": "Du kan förnya din licens genom att navigera till organisationshanteringssidan. För att dra nytta av vÄra rabatterade priser för tidig förnyelse, se till att du förnyar innan din licens löper ut. Oroa dig inte för att du inte vet nÀr din möjlighet till tidig förnyelse stÀngs; du kommer att fÄ 3 pÄminnelse-e-postmeddelanden innan din prenumeration löper ut. Vi skickar dem 30 dagar, 7 dagar och 1 dag före utgÄngen.",
+ "IsSourceCodeIncluded": "Omfattar min licens kÀllkoden för pro-modulerna och teman?",
+ "IsSourceCodeIncludedExplanation1": "Beror pÄ vilken licenstyp du har köpt:",
+ "IsSourceCodeIncludedExplanation2": "Team: Din lösning anvÀnder moduler och teman som NuGet- och NPM-paket. Den inkluderar inte deras kÀllkod. PÄ sÄ sÀtt kan du enkelt uppgradera dessa moduler och teman nÀr en ny version Àr tillgÀnglig. Du kan dock inte fÄ kÀllkoden för dessa moduler och teman.",
+ "IsSourceCodeIncludedExplanation3": "Business/Enterprise: Utöver Team-licensen kan du ladda ner kÀllkoden för alla moduler eller teman du behöver. Du kan till och med ta bort NuGet/NPM-paketreferenserna för en viss modul och lÀgga till dess kÀllkod direkt i din lösning för att Àndra den helt.",
+ "IsSourceCodeIncludedExplanation4": "
Att inkludera kÀllkoden för en modul i din lösning ger dig maximal frihet att anpassa den modulen. Det kommer dock inte att vara möjligt att automatiskt uppgradera modulen nÀr en ny version slÀpps.
Ingen av licenserna inkluderar kÀllkoden för ABP Suite och ABP Studio, vilket Àr externa verktyg som genererar kod Ät dig och hjÀlper din utveckling.
Kolla in sidan Planer och priser för andra skillnader mellan licenstyperna.
<",
+ "ChangingDevelopers": "Kan jag Àndra de registrerade utvecklarna för min organisation i framtiden?",
+ "ChangingDevelopersExplanation": "Förutom att lÀgga till nya utvecklare till din licens kan du ocksÄ Àndra befintliga utvecklare (du kan ta bort en utvecklare och lÀgga till en ny pÄ samma plats) utan nÄgon extra kostnad.",
+ "WhatHappensWhenLicenseEnds": "Vad hÀnder nÀr min licensperiod upphör?",
+ "discountForYears": "{0}% rabatt för {1} Är",
+ "WhenShouldIRenewMyLicense": "NÀr ska jag förnya min licens?",
+ "WhenShouldIRenewMyLicenseExplanation": "Om du förnyar din licens inom {3} dagar efter att din licens har löpt ut, kommer följande rabatter att tillÀmpas: Teamlicens {0}; Företagslicens {1}; Enterprise-licens {2}. Men om du förnyar din licens efter {3} dagar efter licensens utgÄngsdatum, kommer förnyelsepriset att vara detsamma som licensens inköpspris och det kommer inte att finnas nÄgon rabatt pÄ din förnyelse.",
+ "TrialPlan": "Har du en testplan?",
+ "DoYouAcceptBankWireTransfer": "Accepterar ni banköverföringar?",
+ "DoYouAcceptBankWireTransferExplanation": "Ja, vi accepterar banköverföringar. NÀr du har skickat licensavgiften via banköverföring, skicka ditt kvitto och önskad licenstyp till accounting@volosoft.com. VÄr internationella bankkontoinformation:",
+ "HowToUpgrade": "Hur uppgraderar man befintliga applikationer nÀr en ny version finns tillgÀnglig?",
+ "DatabaseSupport": "Vilka databassystem stöds?",
+ "UISupport": "Vilka UI-ramverk stöds?",
+ "Supported": "Stödd",
+ "UISupportExplanation": "ABP Framework Àr i sig sjÀlvt agnostiskt och kan fungera med alla anvÀndargrÀnssnitt. Startmallar, modul-anvÀndargrÀnssnitt och teman implementerades dock inte för alla anvÀndargrÀnssnittsramverk. Kolla in GÄ igÄng-dokumentet för den uppdaterade listan över anvÀndargrÀnssnittsalternativ.",
+ "MicroserviceSupport": "Stödjer den microservice-arkitekturen?",
+ "WhereCanIDownloadSourceCode": "Var kan jag ladda ner kÀllkoden?",
+ "ComputerLimitation": "Hur mÄnga datorer kan en utvecklare logga in pÄ nÀr han utvecklar ABP?",
+ "ComputerLimitationExplanation": "Vi tillÄter specifikt {0} datorer per individ/licensierad utvecklare. NÀr det finns ett behov för en utvecklare att utveckla ABP-baserade produkter pÄ en tredje maskin, ska ett e-postmeddelande skickas till license@abp.io dÀr situationen förklaras, och vi kommer sedan att göra lÀmplig tilldelning i vÄrt system.",
+ "RefundPolicy": "Har ni nÄgon Äterbetalningspolicy?",
+ "RefundPolicyExplanation": "Du kan begÀra Äterbetalning inom 30 dagar efter ditt licensköp. Licenstyperna Business och Enterprise har alternativ för nedladdning av kÀllkod; dÀrför ger vi en Äterbetalning pÄ 60 % inom 30 dagar för Business- och Enterprise-licenser. Dessutom görs inga Äterbetalningar för förnyelser och andra licensköp.",
+ "HowCanIRefundVat": "Hur kan jag Äterbetala moms?",
+ "HowCanIRefundVatExplanation1": "Om du gjorde betalningen med 2Checkout kan du Äterbetala momsen via ditt 2Checkout-konto:",
+ "HowCanIRefundVatExplanation2": "Logga in pÄ ditt 2Checkout-konto",
+ "HowCanIRefundVatExplanation3": "Leta upp rÀtt order och tryck pÄ \"à terbetala försenad moms\" (ange ditt momsregistreringsnummer)",
+ "HowCanIGetMyInvoice": "Hur kan jag fÄ min faktura?",
+ "HowCanIGetMyInvoiceExplanation": "Det finns 2 betalningsgateways för att köpa en licens: Iyzico och 2Checkout. Om du köper din licens via 2Checkout-gatewayen skickar den PDF-fakturan till din e-postadress; kolla in 2Checkout-fakturering. Om du köper via Iyzico-gatewayen, med en anpassad inköpslÀnk eller via en banköverföring, kommer vi att förbereda och skicka din faktura. Du kan begÀra eller ladda ner din faktura frÄn sidan för organisationshantering. Innan du kontaktar oss för fakturan, kontrollera din organisationshanteringssida!",
+ "Forum": "Forum",
+ "PrivateTicket": "Privat biljett",
+ "PrivateTicketExplanation": "Enterprise License inkluderar Àven en privat support med e-post och Àrendehanteringssystem.",
+ "AbpSuiteExplanation1": "Med ABP Suite kan du skapa webbsidor pÄ bara nÄgra minuter. Det Àr ett globalt .NET Core-verktyg som kan installeras frÄn kommandoraden.",
+ "AbpSuiteExplanation2": "Den kan skapa en ny ABP-lösning och generera CRUD-sidor frÄn databasen till frontend. För teknisk översikt se dokumentet",
+ "FastEasy": "Snabbt och enkelt",
+ "AbpSuiteExplanation3": "Med ABP Suite kan du enkelt skapa CRUD-sidor. Du behöver bara definiera din entitet och dess egenskaper och lÄta resten gÄ till ABP Suite Ät dig! ABP Suite genererar all nödvÀndig kod för din CRUD-sida pÄ nÄgra sekunder. Den stöder Angular, MVC och Blazor anvÀndargrÀnssnitt.",
+ "RichOptions": "Rika alternativ",
+ "AbpSuiteExplanation4": "ABP Suite stöder flera anvÀndargrÀnssnittsalternativ som Razor Pages och Angular. Det stöder ocksÄ flera databaser som MongoDB och alla databaser som stöds av EntityFramework Core (MS SQL Server, Oracle, MySql, PostgreSQL och andra leverantörer...).",
+ "AbpSuiteExplanation5": "Det som Àr bra Àr att du inte behöver oroa dig för dessa alternativ. ABP Suite förstÄr din projekttyp och genererar koden för ditt projekt och placerar den genererade koden pÄ rÀtt plats i ditt projekt.",
+ "AbpSuiteExplanation6": "ABP Suite genererar kÀllkoden för Entity, Repository, Application Service, Code First Migration, JavaScript/TypeScript och CSHTML/HTML och Àven nödvÀndiga grÀnssnitt. ABP Suite genererar ocksÄ koden enligt Best Practices för programvaruutveckling, sÄ du behöver inte oroa dig för den genererade kodens kvalitet.",
+ "AbpSuiteExplanation7": "Eftersom du har kÀllkoden för byggstenarna i den genererade CRUD-sidan i rÀtt applikationslager kan du enkelt Àndra kÀllkoden och lÀgga till din egen anpassade affÀrslogik i den genererade koden.",
+ "CrossPlatform": "Plattformsoberoende",
+ "AbpSuiteExplanation8": "ABP Suite Àr byggt med .NET Core och Àr plattformsoberoende. Den körs som en webbapplikation pÄ din lokala dator. Du kan köra den pÄ Windows, Mac och Linux",
+ "OtherFeatures": "Andra funktioner",
+ "OtherFeatures1": "Uppdaterar enkelt NuGet- och NPM-paket pÄ din lösning.",
+ "OtherFeatures2": "à terskapar redan genererade sidor frÄn början.",
+ "OtherFeatures3": "Skapar nya lösningar",
+ "ThanksForCreatingProject": "Ditt projekt har skapats framgÄngsrikt!",
+ "HotToRunSolution": "Hur kör du din lösning?",
+ "HotToRunSolutionExplanation": "I dokumentet Kom igÄng kan du lÀsa om hur du konfigurerar och kör din lösning.",
+ "GettingStarted": "Komma igÄng",
+ "WebAppDevTutorialExplanation": "I handledningsdokumentet för utveckling av webbapplikationer finns ett exempel pÄ utveckling steg för steg.",
+ "Document": "Dokument",
+ "UsingABPSuiteToCURD": "AnvÀnda ABP Suite för generering av CRUD-sidor och verktyg",
+ "SeeABPSuiteDocument": "Kolla in ABP Suite-dokumentet för att lÀra dig anvÀndningen av ABP Suite.",
+ "SeeModulesDocument": "Se sidan med moduler för en lista över alla PRO-moduler.",
+ "Pricing": "PrissÀttning",
+ "PricingExplanation": "VÀlj de egenskaper och funktioner som ditt företag behöver idag. Uppgradera enkelt nÀr ditt företag vÀxer.",
+ "Team": "Team",
+ "Business": "Företag",
+ "Enterprise": "Företag",
+ "Custom": "Anpassad",
+ "IncludedDeveloperLicenses": "Inkluderade utvecklarlicenser",
+ "CustomLicenceOrAdditionalServices": "Behöver du en anpassad licens eller ytterligare tjÀnster?",
+ "CustomOrVolumeLicense": "Anpassad licens eller volymlicens",
+ "LiveTrainingSupport": "Utbildning och support i realtid",
+ "AndMore": "och mer",
+ "AdditionalDeveloperLicense": "Ytterligare licens för utvecklare",
+ "ProjectCount": "ProjektrÀkning",
+ "AllProModules": "Alla proffsmoduler",
+ "AllProThemes": "Alla proffsteman",
+ "AllProStartupTemplates": "Alla proffsmallar för nystartade företag",
+ "SourceCodeOfAllModules": "KÀllkod för alla moduler",
+ "SourceCodeOfAllThemes": "KÀllkod för alla teman",
+ "PerpetualLicense": "Evig licens",
+ "UnlimitedServerDeployment": "ObegrÀnsad serverdistribution",
+ "YearUpgrade": "1 Ärs uppgradering",
+ "YearPremiumForumSupport": "1 Ärs premiumsupport för forum",
+ "ForumSupportIncidentCountYear": "Antal incidenter för forumstöd/Är",
+ "PrivateTicketEmailSupport": "Privat support via biljett och e-post",
+ "BuyNow": "Köp nu",
+ "PayViaAmexCard": "Hur kan jag betala med mitt AMEX-kort?",
+ "PayViaAmexCardDescription": "Standardbetalningsgatewayen \"Iyzico\" kan neka vissa AMEX-kreditkort pÄ grund av sÀkerhetsÄtgÀrder. I detta fall kan du betala via den alternativa betalningsgatewayen \"2Checkout\".",
+ "InvalidReCaptchaErrorMessage": "Det uppstod ett fel vid verifiering av reCAPTCHA. VÀnligen försök igen.",
+ "YourCompanyName": "Ditt företagsnamn",
+ "FirstName": "Förnamn",
+ "LastName": "Efternamn",
+ "YourFirstName": "Ditt förnamn",
+ "YourLastName": "Ditt efternamn",
+ "SpecialOffer": "Specialerbjudande",
+ "SpecialOfferMessage": "Skynda dig! Priserna gÀller under en begrÀnsad tid.",
+ "DiscountRequest": "BegÀran om rabatt",
+ "DiscountRequestDescribeCustomerQuestion": "Vilken av följande beskrivningar stÀmmer in pÄ dig?",
+ "DiscountRequestStudentEmailMessage": "E-postadressen mÄste innehÄlla \"edu\".",
+ "DiscountRequestDeveloperCount": "Hur mÄnga utvecklare Àr ni?",
+ "DiscountRequestDeveloperCountExceedMessage": "Vi erbjuder inte rabatterade licenser för företag som har fler Àn {0} utvecklare.",
+ "DiscountRequestOrganizationName": "Företagets/organisationens/skolans namn",
+ "Website": "Webbplats",
+ "GithubUsername": "AnvÀndarnamn för GitHub",
+ "PhoneNumber": "Telefonnummer",
+ "DescribeABPCommercialUsage": "Beskriv det projekt som du planerar att utveckla baserat pÄ APB Commercial",
+ "DiscountRequestCertifyInformationMessage": "Jag intygar att alla uppgifter Àr sanningsenliga och korrekta.",
+ "DiscountRequestReceived": "Vi har mottagit din begÀran om rabatt.",
+ "DiscountRequestStatusMessage": "Vi kommer att svara dig efter att ha kontrollerat den information du har lÀmnat.",
+ "MVCOrRazorPages": "MVC (Razor Pages)",
+ "Angular": "Angular",
+ "Blazor": "Blazor",
+ "New": "Nya",
+ "MongoDB": "MongoDB",
+ "EBookDDD": "E-bok DomÀnstyrd design",
+ "Page": "Sidan",
+ "DoYouAgreePrivacyPolicy": "Jag samtycker till Terms & Conditions och Privacy Policy.",
+ "VolosoftMarketingInformationMessage": "Jag vill ha information, tips och erbjudanden om Solutions for Businesses and Organizations och andra produkter och tjÀnster frÄn Volosoft.",
+ "VolosoftSharingInformationMessage": "Jag vill att Volosoft ska dela min information med utvalda partners sÄ att jag kan fÄ relevant information om deras produkter och tjÀnster.",
+ "StartFree": "Starta gratis",
+ "FreeTrial": "Gratis provperiod",
+ "AcceptsMarketingCommunications": " Ja, jag vill gÀrna fÄ ABP-relaterade marknadsföringsnyheter.",
+ "PurposeOfUsage": "Syfte med anvÀndningen",
+ "Choose": "- VĂ€lj -",
+ "CompanyOrganizationName": "Företagets/organisationens namn",
+ "StartTrial": "Starta min kostnadsfria testperiod",
+ "ContactUsQuestions": "Kontakta oss om du har nÄgra frÄgor",
+ "TrialActivatedWarning": "En anvÀndare har endast rÀtt till 1 gratis provperiod. Du har redan anvÀnt din provperiod.",
+ "ActivationRequirement": "Du Àr bara ett steg frÄn att starta din provperiod. Efter att ha kontrollerat din information aktiverar vi din licens. NÀr din licens Àr aktiverad skickar vi ett e-postmeddelande till {0}. Oroa dig inte, den hÀr processen kommer inte att ta lÄng tid!",
+ "SaveAndDownload": "Spara och ladda ner",
+ "CompanyNameValidationMessage": "Företagsnamnet Àr för lÄngt!",
+ "AddressValidationMessage": "Adressen Àr för lÄng!",
+ "TaxNoValidationMessage": "TAX/VAT Nej Àr för lÄngt!",
+ "NotesValidationMessage": "AnteckningsfÀltet Àr för lÄngt!",
+ "CheckYourBillingInfo": "Du kan bara skapa din faktura en gÄng! Kontrollera din faktureringsinformation innan du skapar din faktura.",
+ "StartYourFreeTrial": "Starta din kostnadsfria testperiod",
+ "TrialLicenseModelInvalidErrorMessage": "Ett av följande fÀlt Àr ogiltigt: Landsnamn, Företagsstorlek, Bransch eller Syfte med anvÀndning.",
+ "Trial": "RÀttegÄng",
+ "Purchased": "Köpte",
+ "PurchaseNow": "Köp nu",
+ "PurchaseTrialLicenseMessage": "Din licens utgÄngsdatum Àr {0}. Om du vill fortsÀtta anvÀnda de projekt som du skapade under din kostnadsfria testperiod mÄste du Àndra licensnycklarna i dina appsettings.secrets.json-filer. HÀr Àr din licensnyckel:",
+ "TrialLicenseExpireMessage": "Du anvÀnder en testlicens och din testlicens upphör att gÀlla den {0}.",
+ "TryForFree": "Prova gratis",
+ "TrialLicenseExpiredInfo": "Din testlicensperiod har löpt ut!",
+ "DowngradeLicensePlan": "Kan jag nedgradera till en lÀgre licensplan i framtiden?",
+ "LicenseTransfer": "Kan en licens överföras frÄn en utvecklare till en annan?",
+ "UserOwnerDescription": "Organisationens \"Àgare\" Àr administratör för detta konto. Han/hon hanterar organisationen genom att köpa licenser och tilldela utvecklare. En \"Àgare\" kan inte skriva kod i ABP-projekten, kan inte ladda ner ABP-exempelprojekten och kan inte stÀlla frÄgor pÄ supportwebbplatsen. Om du vill göra allt detta mÄste du ocksÄ lÀgga till dig sjÀlv som utvecklare.",
+ "UserDeveloperDescription": "\"Utvecklarna\" kan skriva kod i ABP-projekten, ladda ner ABP:s exempelprojekt och stÀlla frÄgor pÄ supportwebbplatsen. à andra sidan kan \"utvecklarna\" inte hantera den hÀr organisationen.",
+ "RemoveCurrentUserFromOrganizationWarningMessage": "Du tar bort dig sjÀlv frÄn din egen organisation. Du kommer inte lÀngre att kunna hantera den hÀr organisationen, bekrÀftar du det?",
+ "RenewExistingOrganizationOrCreateNewOneMessage": "Du kan förnya licensen för din organisation (er) genom att klicka pÄ nedanstÄende \"FörlÀng nu\"-knapp (ar) och dÀrmed kan du förlÀnga licensens utgÄngsdatum med 1 Är. Om du fortsÀtter till kassan kommer du att ha en ny organisation. Vill du fortsÀtta med en ny organisation?",
+ "PurchaseTrialOrganizationOrCreateNewOneMessage": "Du har en testlicens. För att köpa din testlicens klickar du pÄ knappen Köp nu. Om du fortsÀtter till kassan kommer du att ha en ny organisation. Vill du fortsÀtta med en ny organisation?",
+ "ExtendNow": "FörlÀnga / Förnya",
+ "CreateNewOrganization": "Skapa en ny organisation",
+ "RenewLicenseEarly": "Om jag förnyar min licens tidigt, kommer jag att fÄ hela Äret?",
+ "RenewLicenseEarylExplanation": "NÀr du förnyar din licens före licensens utgÄngsdatum kommer 1 Är att lÀggas till licensens utgÄngsdatum. Om din licens t.ex. löper ut den {0}-06-06 och du förnyar den den {0}-01-01, kommer din nya licens att löpa ut den {1}-06-06.",
+ "OpenSourceWebApplication": "Webbapplikation med öppen kÀllkod",
+ "CompleteWebDevelopment": "En komplett webbutveckling",
+ "ABPFrameworkDescription": "ABP Framework Àr en komplett infrastruktur för att skapa moderna webbapplikationer genom att följa de bÀsta metoderna för mjukvaruutveckling och konventioner.",
+ "CommunityDescription": "Dela dina erfarenheter av ABP-ramverket!",
+ "PreBuiltApplication": "Förbyggd applikation",
+ "DatabaseProviders": "Databasleverantörer",
+ "UIFrameworks": "Ramverk för anvÀndargrÀnssnitt",
+ "UsefulLinks": "AnvÀndbara lÀnkar",
+ "Platform": "Plattform",
+ "MicroserviceArchitectureExplanation": "Det hÀr Àr en komplett lösningsarkitektur som bestÄr av flera applikationer, API-gateways, mikrotjÀnster och databaser för att bygga en skalbar mikrotjÀnstlösning med den senaste tekniken.",
+ "BusinessLogic": "AffÀrslogik",
+ "DataAccessLayer": "DataÄtkomstskikt",
+ "Monolith": "Monolit",
+ "ModularArchitectureExplanation": "Denna startup-mall ger en skiktad, modulÀr och DDD-baserad lösningsarkitektur för att bygga en ren och underhÄllbar kodbas.",
+ "Bs5Compatible": "Professionellt tema som Àr kompatibelt med Bootstrap 5, perfekt för din administratörswebbplats.",
+ "LeptonXTheme": "LeptonX tema",
+ "LeptonXDark": "LeptonX Mörk",
+ "LeptonXLight": "LeptonX Ljus",
+ "LeptonXSemiDark": "LeptonX Halvmörk",
+ "BuiltOnBs5Library": "Byggd pÄ Bootstrap 5-biblioteket",
+ "FullyCompatibleWithBs5": "100% kompatibel med Bootstrap 5 HTML-struktur och CSS-klasser",
+ "ResponsiveAndMobileCompatible": "Responsiv, mobilkompatibel, RTL-stöd",
+ "ProvidesStylesForDatatables": "TillhandahÄller stilar för datatabeller",
+ "MultipleLayoutOptions": "Flera layoutalternativ",
+ "EasilyInstallAndUpgrade": "Enkel installation och uppgradering",
+ "SupportForum": "Forum för support",
+ "TrustedBy": "Betrodda av",
+ "OurPricing": "VÄr prissÀttning",
+ "Plans": "Planer",
+ "NameSurname": "Namn Efternamn",
+ "LicenceType": "Typ av licens",
+ "LicenseDiscountWarning": "DENNA RABATTSIDA ANVĂNDER STANDARD RABATTKOD OCH FĂR VOLOSOFT UTVECKLARE. INKĂPSLĂNKAR NEDAN FUNGERAR INTE.",
+ "DiscountedLicenseExplanation": "Dessa licenspriser Àr avsedda för smÄ nystartade företag, enskilda utvecklare, studenter, ideella organisationer och projekt!",
+ "General": "AllmÀnt",
+ "Development": "Utveckling",
+ "Payment": "Betalning",
+ "WatchExplainerVideo": "LÄt oss trÀffas! Titta pÄ förklarande video",
+ "LightDarkAndSemiDarkThemes": "Ljus, mörk och halvmörk",
+ "LeptonXThemeExplanation": "Lepton Theme kan Àndra ditt tema enligt dina systeminstÀllningar.",
+ "PRO": "PRO",
+ "YourAccountDetails": "Dina kontouppgifter",
+ "OrganizationName": "Organisationens namn",
+ "AddDevelopers": "LĂ€gg till utvecklare",
+ "StartDevelopment": "Starta utveckling",
+ "CreateAndRunApplicationUsingStartupTemplate": "LÀr dig hur du skapar och kör en ny webbapplikation med hjÀlp av ABP:s startmall.",
+ "CommunityDescription2": "abp.io/community Àr en plats dÀr mÀnniskor kan dela ABP-relaterade artiklar. Sök efter artiklar, handledningar, kodprover, fallstudier och trÀffa mÀnniskor som Àr i samma spÄr som du.",
+ "UseABPSuiteExplanation": "AnvÀnd ABP Suite för att ladda ner kÀllkoden för modulerna och temana.",
+ "ManageModulesWithSuite": "Du kan ocksÄ hantera dina ABP-moduler med Suite.",
+ "LearnHowToInstallSuite": "LÀr dig hur du installerar och anvÀnder ABP Suite.",
+ "SeeLess": "Se mindre",
+ "LayeredSolutionStructure": "Struktur med flera lager av lösningar",
+ "LayeredSolutionStructureExplanation": "Lösningen Àr uppbyggd i lager baserat pÄ principer och mönster för domÀndriven design för att isolera affÀrslogiken frÄn infrastruktur och integrationer och för att maximera underhÄll och ÄteranvÀndning av koden. ABP Framework tillhandahÄller redan abstraktioner, basklasser och guider för att verkligen implementera DDD för din applikation.",
+ "MultipleUIOptionsExplanation": "Vi Àlskar olika sÀtt att skapa anvÀndargrÀnssnittet. Den hÀr startup-lösningen ger tre olika alternativ för anvÀndargrÀnssnitt för din affÀrsapplikation.",
+ "MultipleDatabaseOptions": "Flera databasalternativ",
+ "MultipleDatabaseOptionsExplanation": "Du har tvĂ„ alternativ för databasleverantörer (förutom att du kan anvĂ€nda bĂ„da i en och samma applikation). AnvĂ€nd Entity Framework Core för att arbeta med alla relationsdatabaser och anvĂ€nd eventuellt Dapper nĂ€r du behöver skriva lĂ„gnivĂ„frĂ„gor för bĂ€ttre prestanda. MongoDB Ă€r ett annat alternativ om du behöver anvĂ€nda en dokumentbaserad NoSQL-databas. Ăven om dessa leverantörer Ă€r vĂ€lintegrerade, abstraherade och förkonfigurerade kan du faktiskt interagera med alla databassystem som du kan anvĂ€nda med .NET.",
+ "ModularArchitectureExplanation2": "Modularitet Àr en förstklassig medborgare i ABP-plattformen. Alla applikationsfunktionaliteter Àr uppdelade i vÀlisolerade valfria moduler. Startlösningen levereras redan med de grundlÀggande ABP-modulerna förinstallerade. Du kan ocksÄ skapa dina egna moduler för att bygga ett modulÀrt system för din egen applikation.",
+ "MultiTenancyForSaasBusiness": "Multi-tenancy för ditt SaaS-företag",
+ "MultiTenancyForSaasBusinessExplanation": "Lösningen har konfigurerats fullt ut för att stödja system med flera hyresgÀster. Det gör det möjligt för hyresgÀsterna att dela eller ha sina egna databaser med on-the-fly databasskapande och migrationssystem.",
+ "MicroserviceStartupSolution": "Microservice Startup-lösning",
+ "MicroserviceArchitectureExplanation2": "Du kan skaffa det till ditt nÀsta microservice-system för att dra nytta av den förbyggda baslösningen och destillerade erfarenheten.",
+ "PreIntegratedTools": "Förintegrerad med populÀra verktyg",
+ "PreIntegratedToolsExplanation": "Lösningen Àr redan integrerad i branschens standardverktyg och -tekniker, medan du alltid kan Àndra dem och integrera dem med dina favoritverktyg.",
+ "SingleSignOnAuthenticationServer": "Server för autentisering med enkel inloggning",
+ "SingleSignOnAuthenticationServerExplanation": "Lösningen har en autentiseringsserverapplikation som anvÀnds av de andra applikationerna som en server för enkel inloggning med API-Ätkomsthanteringsfunktioner. Den Àr baserad pÄ implementeringen Openiddict.",
+ "WebAppsWithGateways": "2 webbappar med 2 API-gateways",
+ "WebAppsWithGatewaysExplanation": "Lösningen innehÄller tvÄ webbapplikationer som var och en har en dedikerad API-gateway (BFF - Backend For Frontend-mönster).",
+ "BackOfficeApplication": "Back Office-applikation",
+ "BackOfficeApplicationExplanation": "Den faktiska webbapplikationen för ditt system, med flera alternativ för anvÀndargrÀnssnitt. Du kan skapa alla typer av affÀrsapplikationer.",
+ "LandingWebsite": "Landningswebbplats",
+ "LandingWebsiteExplanation": "En generisk landningsplats/publik webbplats som kan anvÀndas för flera ÀndamÄl, t.ex. för att presentera ditt företag, sÀlja dina produkter osv.",
+ "ABPFrameworkEBook": "Mastering ABP Framework e-bok",
+ "MasteringAbpFrameworkEBookDescription": "IngÄr i din kommersiella licens",
+ "LicenseTypeNotCorrect": "Licenstypen Àr inte korrekt!",
+ "Trainings": "Utbildningar",
+ "ChooseTrainingPlaceholder": "VĂ€lj utbildning...",
+ "DoYouNeedTrainings": "Behöver du nÄgon av dessa utbildningar?",
+ "DoYouNeedTraining": "Behöver du {0} utbildning?",
+ "GetInTouchUs": "Ta kontakt med oss",
+ "ForMoreInformationClickHere": "För mer information, klicka hÀr.",
+ "ForMoreInformationClickHereByClass": "För mer information, klickahÀr.",
+ "IsGetOnboardingTraining": "Vill du fÄ utbildning i onboarding och utveckling av webbapplikationer?",
+ "OnboardingWebApplicationDevelopmentTrainingMessage": "För att schemalÀgga din utbildningskalender, vÀnligen kontakta {0} efter att du har skapat organisationen",
+ "CustomPurchaseMessage": "För nÀsta steg, klicka pÄ {0} för att kontakta oss.",
+ "Note": "Notera",
+ "AdditionalNote": "Ytterligare anmÀrkning",
+ "OnboardingTrainingFaqTitle": "Har du en ABP onboarding-utbildning?",
+ "OnboardingTrainingFaqExplanation": "Ja, vi har ABP Training Services som hjÀlper dig att snabbt komma igÄng med ditt ABP-projekt. Du kommer att lÀra dig om ABP frÄn en medlem i ABP:s kÀrnteam och du kommer att fÄ de fÀrdigheter som krÀvs för att starta ditt ABP-projekt. I onboarding-utbildningen förklarar vi hur du stÀller in din utvecklingsmiljö, installerar de nödvÀndiga verktygen och skapar en fullt fungerande CRUD-sida. Utbildningen kommer att vara live och Zoom-applikationen kommer att anvÀndas, men vi Àr öppna för att anvÀnda andra online-mötesplattformar. SprÄket för utbildningen kommer att vara engelska. Du kan ocksÄ stÀlla dina frÄgor om ABP under sessionerna. En lÀmplig tid och ett lÀmpligt datum kommer att planeras för bÄda parter. För ytterligare information besök utbildningssidan.",
+ "AddBasket": "LĂ€gg till i korgen",
+ "SendTrainingRequest": "Skicka förfrÄgan om utbildning",
+ "OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* Den engelska versionen av detta dokument Àr den mest aktuella och den engelska versionen ska ha företrÀde i alla tvister.",
+ "Pricing_Page_Title": "PrissÀttning",
+ "Pricing_Page_Description": "Se de olika licensplanerna för ABP Platform, inklusive kostnadsfria nivÄer. Om standardplanerna inte passar, be om en offert. Glöm inte att vi har en 30-dagars pengarna-tillbaka-garanti!",
+ "Pricing_Page_HurryUp": "Skynda dig!",
+ "Pricing_Page_BuyLicense": "Köp en licens till 2021 Ärs priser fram till den 16 januari!",
+ "Pricing_Page_ValidForExistingCustomers": "GÀller Àven för befintliga kunder och licensförnyelser.",
+ "Pricing_Page_Hint1": "I licenspriset ingÄr ett visst antal platser för utvecklare. Om du har fler utvecklare kan du alltid köpa ytterligare platser.",
+ "Pricing_Page_Hint2": "Du kan köpa fler utvecklarlicenser nu eller i framtiden. Licenserna Àr platsbaserade, vilket innebÀr att du kan överföra en plats frÄn en utvecklare till en annan.",
+ "Pricing_Page_Hint3": "Du kan utveckla ett obegrÀnsat antal olika produkter med din licens.",
+ "Pricing_Page_Hint4": "ABP Suite Àr ett verktyg som hjÀlper dig att utveckla och förbÀttra din produktivitet. Det stöder generering av CRUD-sidor och skapande av nya projekt.",
+ "Pricing_Page_Hint5": "Du kan anvÀnda alla de förbyggda modulerna i dina applikationer.",
+ "Pricing_Page_Hint6": "Du kan anvÀnda alla de förbyggda temana i dina applikationer.",
+ "Pricing_Page_Hint7": "En startmall Àr en Visual Studio-lösning som hjÀlper dig att komma igÄng med ditt projekt. Alla grundlÀggande moduler lÀggs till och förkonfigureras Ät dig.",
+ "Pricing_Page_Hint8": "Mastering ABP Framework e-bok förklarar hur man implementerar .NET-lösningar med bÀsta praxis. Den sÀljs pÄ Amazon.com, och du kan ladda ner boken gratis med din licens.",
+ "Pricing_Page_Hint9": "Du kan ladda ner kÀllkoden för alla moduler. Du kanske vill lÀgga till kÀllkoden i din lösning för att göra radikala Àndringar eller bara behÄlla den för dig sjÀlv av sÀkerhetsskÀl.",
+ "Pricing_Page_Hint10": "Licenserna Àr livstidsbaserade. Det innebÀr att du kan fortsÀtta att utveckla din applikation för alltid. TillgÄng till den senaste versionen och support beviljas inom licensperioden (1 Är om du inte förnyar den).",
+ "Pricing_Page_Hint11": "Inga begrÀnsningar för driftsÀttning! Du kan distribuera till sÄ mÄnga servrar som du vill, inklusive molntjÀnster eller lokalt.",
+ "Pricing_Page_Hint12": "Du kan uppdatera moduler, teman och verktyg till den senaste versionen inom din aktiva licensperiod. NÀr din licens löper ut mÄste du förnya den för att fortsÀtta att fÄ uppdateringar för buggfixar, nya funktioner och förbÀttringar.",
+ "Pricing_Page_Hint13": "Du kan fÄ premiumsupport i ett Är (du kan förnya din licens för att förlÀnga den).",
+ "Pricing_Page_Hint14": "Team- och Business-licenser har en grÀns för antal incidenter/frÄgor. Om du köper ytterligare utvecklarlicenser ökar incidentgrÀnsen med {0} (för Team-licensen) eller {1} (för Business-licensen) per utvecklare.",
+ "Pricing_Page_Hint15": "Endast Enterprise License inkluderar privat support. Du kan skicka ett e-postmeddelande direkt till ABP-teamet eller stÀlla frÄgor pÄ abp.io/support/questions med ett privat biljettalternativ. De privata Àrendena Àr inte synliga för allmÀnheten.",
+ "Pricing_Page_Hint16": "Du kan ladda ner kÀllkoden för alla ABP-teman. Du kanske vill lÀgga till kÀllkoden i din lösning för att göra radikala Àndringar eller bara behÄlla den för dig sjÀlv av sÀkerhetsskÀl.",
+ "Pricing_Page_Testimonial_1": "ABP Commercial gjorde det möjligt för SC Ventures att leverera en bankklassad SaaS-plattform med silodatabas med flera hyresgÀster pÄ 9 mÄnader för att stödja leverantörskedjans kundfordringar / leverantörsskulder för finansiering av fakturor med betydande vÀrde frÄn flera integrerade ankare. ABP:s modularitet gjorde det möjligt för teamet att leverera pÄ rekordtid, klara alla VAPT och driftsÀtta den containeriserade mikrotjÀnststacken via fullstÀndig CI/CD och pipelines till produktion.",
+ "Pricing_Page_Testimonial_2": "Vi ser vÀrdet av att anvÀnda ABP Commercial för att minska omkostnaderna för kundanpassade utvecklingsprojekt. Teamet kan förena kodmönstret i olika projektströmmar. Vi ser mer potential i ramverket för att vi ska kunna bygga nya funktioner snabbare Àn tidigare. Vi litar pÄ att vi stÀndigt kommer att se vÀrdet av att utnyttja ABP Commercial.",
+ "Pricing_Page_Testimonial_3": "Vi Àlskar ABP. Vi behöver inte skriva allt frÄn grunden. Vi utgÄr frÄn out-of-the-box-funktioner och fokuserar bara pÄ det vi verkligen behöver skriva. Dessutom Àr ABP vÀlarkitekterat och koden Àr av hög kvalitet med fÀrre buggar. Om vi hade varit tvungna att skriva allt vi behövde pÄ egen hand hade vi kanske fÄtt lÀgga ner flera Är. Ytterligare en sak vi gillar Àr att den nya versionen, problemfixningen eller förbÀttringen kommer ut vÀldigt snart, varannan vecka. Vi vÀntar inte för lÀnge.",
+ "Pricing_Page_Testimonial_4": "ABP Commercial Àr en fantastisk produkt som jag skulle rekommendera. Kommersiella produkter till marknaden för vÄra kunder i en enda konfigurerbar plattform. Den starthjÀlp som ramverket och verktygen ger alla team Àr vÀrd varenda krona. ABP Commercial var det som passade bÀst för vÄra behov.",
+ "Pricing_Page_Testimonial_5": "ABP Framework Ă€r inte bara ett ramverk, utan ocksĂ„ en guide för projektutveckling/hantering, eftersom det ger utbildning i DDD, GenericRepository, DI, Microservice och Modularity. Ăven om du inte kommer att anvĂ€nda sjĂ€lva ramverket kan du utveckla dig sjĂ€lv med abp.io/docs som Ă€r vĂ€l och professionellt förberedda (OpenIddict, Redis, Quartz etc.). Eftersom mĂ„nga saker Ă€r förbyggda förkortar det projektutvecklingstiden avsevĂ€rt (t.ex. inloggningssida, undantagshantering, datafiltrering, seeding, revisionsloggning, lokalisering, automatisk API-kontroller etc.) Som ett exempel frĂ„n vĂ„r applikation har jag anvĂ€nt Local Event Bus för lagerstyrning. SĂ„ jag kan hantera orderrörelser genom att skriva lagerhanterare. Det Ă€r underbart att inte förlora tid för CreationTime, CreatorId. De fylls i automatiskt.",
+ "Pricing_Page_Testimonial_6": "ABP Framework Àr ett bra ramverk men det tar tid att förstÄ de olika lager, klasser och bibliotek som det anvÀnder (sÀrskilt ABP). Jag tillbringade mycket tid med att lÀsa kodbasen, men ABP Commercial sparade oss tid nÀr vi skapade projektspecialitetsenheterna (AR) och förvaret kopplat till var och en av dem. Jag gillade ocksÄ det tillvÀgagÄngssÀtt som anvÀnds i ABP Àr mycket moget; vi vet Àr baserat pÄ DDD och monolit.",
+ "Pricing_Page_Testimonial_7": "Som ett nystartat företag mÄste vi iterera snabbt och spendera minimal tid pÄ standardfunktioner och icke-kÀrnfunktioner.\nVÄra ingenjörer strÀcker sig frÄn mycket erfarna till juniora ingenjörer, och vi behövde en gemensam förstÄelse och ett sÀtt att dela teknisk och domÀnkunskap, ABP gjorde det möjligt för oss att göra detta tack vare deras fantastiska guider och dokumentation.\nDet finns saker som vi inte har behövt oroa oss för eftersom de fungerar direkt med ABP.\nABP hjÀlpte oss att effektivisera snabb prototyping och utveckling, mindre Àn 4 veckor frÄn funktionsstart till produktion. Med alla premiumfunktioner som ingÄr i licensen har ABP gett oss \"Startup in a Box\" pÄ Software Engineering-sidan.",
+ "Pricing_Page_Testimonial_8": "Jag skulle rekommendera ABP commercial till alla som vill utöka utbudet av produkter som Àr tillgÀngliga för sina kunder. Det Àr fantastiskt nÀr man behöver anvÀnda en distribuerad företagsmiljö (Angular, WPF, Win&Linux). Förutom deras produkter Àlskar vi deras support, som gör vÄrt jobb snabbare och enklare. Vi vet redan att vi har hittat en bra partner för framtiden som kommer att stödja oss i att expandera vÄr verksamhet.",
+ "Pricing_Page_Testimonial_9": "Vi Àr ett företag med 2 anstÀllda som har varit verksamma i över 20 Är.\nNÀr det gÀller vÄr erfarenhet av ABP Commercial kontaktades vi av en kund som ville att vi skulle utveckla en ny personalapplikation i en modern miljö för att ersÀtta deras 25 Är gamla Access-applikation. Vi bestÀmde oss för att gÄ över frÄn en desktoplösning till en webbaserad lösning.\n\nVid den tidpunkten hade vi mycket liten kunskap om webbapplikationer och .NET, men vi snubblade över ABP Commercial, och med hjÀlp av ABP Framework, teknisk dokumentation och ABP Suite kunde vi inte bara utveckla applikationen enligt kundens specifikationer utan ocksÄ framgÄngsrikt arbeta i en .NET-miljö inom ett Är.",
+ "AbpBookDownloadArea_ClaimYourEBook": "Gör ansprÄk pÄ din Mastering ABP Framework e-bok",
+ "AddMemberModal_Warning_1": "Om det anvÀndarnamn som du försöker lÀgga till inte finns i systemet, be din teammedlem att registrera sig pÄ {0} och dela anvÀndarnamnet pÄ hans/hennes konto med dig.",
+ "MyOrganizations_Detail_WelcomeMessage": "VĂ€lkommen till din organisation, {0}",
+ "MyOrganizations_Detail_OrganizationManagement": "Organisation Förvaltning",
+ "OrganizationDisplayName": "Organisationens visningsnamn",
+ "MyOrganizations_Detail_EditDisplayName": "Redigera visningsnamn",
+ "MyOrganizations_Detail_UpgradeYourLicense": "Uppgradera din licens",
+ "MyOrganizations_Detail_LicenseStartAndExpiryDate": "Licensens startdatum - utgÄngsdatum",
+ "MyOrganizations_Detail_OwnerRightInfo": "Du anvÀnder {0} av din {1} Àgares rÀttigheter.",
+ "MyOrganizations_Detail_CopyApiKey": "Kopiera nyckeln",
+ "MyOrganizations_Detail_ApiKeyDescription": "API-nyckeln Àr token för PRO-paket som finns pÄ {1}.",
+ "MyOrganizations_Detail_YourPrivateNugetSource": "Din privata NuGet-kÀlla Àr {0}",
+ "MyOrganizations_Detail_PrivateNugetSourceWarning": "Detta lÀggs automatiskt till som en feed till din NuGet.Config i din ABP-lösning. Dela inte din privata nyckel med obehöriga anvÀndare!",
+ "MyOrganizations_Detail_DeveloperSeatInfo": "Du anvÀnder {0} av dina {1} platser för utvecklare.",
+ "NeedMoreSeatsForYourTeam": "Behöver du fler platser för ditt team?",
+ "MyOrganizations_Detail_PricePerYear": "{0} / per Är",
+ "MyOrganizations_Detail_PurchaseDeveloperSeats": "Köpa platser för utvecklare",
+ "Invoices": "Fakturor",
+ "RequestInvoice": "BegÀr faktura",
+ "OrderNumber": "BestÀllningsnummer",
+ "Products": "Produkter",
+ "TotalPrice": "Totalt pris",
+ "ThereIsNoInvoice": "Det finns ingen faktura",
+ "MyOrganizations_Detail_PaymentProviderInfo": "Om du har köpt din licens via {0} gateway skickas PDF-fakturan till din e-postadress, se {0} fakturering.",
+ "MyOrganizations_Detail_PayUInfo": "Om du har köpt via Iyzico-gatewayen klickar du pÄ knappen \"BegÀr faktura\" och fyller i faktureringsinformationen.",
+ "MyOrganizations_Detail_ConclusionInfo": "Din fakturabegÀran kommer att behandlas inom {0} arbetsdagar.",
+ "ExtendYourLicense": "FörlÀng din {0} licens",
+ "PurchaseLicense": "Köp {0} licens",
+ "DownloadInvoiceModal_DownloadInvoice": "Ladda ner faktura",
+ "DownloadInvoiceModal_SaveInformationOnlyOnce": "Du kan bara spara din faktureringsinformation en gÄng.",
+ "InvoiceModal_EnterCompanyName": "Ange ditt juridiska företagsnamn...",
+ "InvoiceModal_EnterCompanyAddress": "Ange din juridiska företagsadress...",
+ "InvoiceModal_EnterTaxNumber": "Ange ditt TAX/VAT-nummer om det finns tillgÀngligt...",
+ "RequestInvoiceModal_EnterNotes": "Ytterligare information för din faktura... Denna anteckning kommer att skrivas i anteckningsavsnittet pÄ fakturan.",
+ "PrePayment_PayWithIyzico": "Du kommer att betala med Iyzico",
+ "ContinueToCheckout": "FortsÀtt till kassan",
+ "PrePayment_IyzicoRedirectionInfo": "Du kommer att omdirigeras till Iyzico Payment Gateway för att slutföra ditt köp pÄ ett sÀkert sÀtt.",
+ "PrePayment_IyzicoAcceptVisaAndMasterCard": "Iyzico tar emot Visa och MasterCard.",
+ "Purchase": "Köp",
+ "AcceptTermsAndConditions": "Jag har lÀst, förstÄtt och accepterar integritetspolicy, villkor och EULA.",
+ "AcceptTermsAndConditionsWarningMessage": "VĂ€nligen acceptera integritetspolicyn och villkoren",
+ "SelectGatewayToContinue": "VÀnligen vÀlj en Gateway för att fortsÀtta!",
+ "GatewaySelection_SelectGateway": "VĂ€lj en betalningsportal",
+ "GatewaySelection_RedirectionMessage": "DÀrefter kommer du att omdirigeras till den valda betalningsgatewayens webbplats för transaktionen.",
+ "PaymentSucceed_PaymentSuccessMessage": "Betalning framgÄngsrik",
+ "PaymentSucceed_ThanksForPurchase": "Tack för ditt köp!",
+ "PaymentSucceed_CreateYourOrganization": "Skapa din organisation",
+ "PaymentSucceed_AddMeAsDeveloper": "Jag Àr ocksÄ utvecklare, lÀgg till mig som utvecklare i min organisation.",
+ "PaymentSucceed_CreateOrganization": "Skapa organisation",
+ "PaymentSucceed_OrganizationDescription": "En organisation bestĂ„r av utvecklare och Ă€gare. Utvecklarna Ă€r anvĂ€ndare som skriver kod i ABP-projektet och som kommer att dra nytta av webbplatsen {1}. Ăgarna Ă€r anvĂ€ndare som tilldelar utvecklarplatser och hanterar licensiering.",
+ "PaymentSucceed_ViewOrganization": "Klicka hÀr för att se organisationen",
+ "Purchase_TotalAnnualPrice": "TOTALT (Ärsavgift)",
+ "Purchase_TrainingPrice": "Pris för utbildning",
+ "Purchase_OnboardingTraining": "Live-utbildning i onboarding och utveckling av webbapplikationer",
+ "TotalDeveloperPrice": "Totalt pris för utvecklare",
+ "Purchase_PricePerDeveloper": "{0} per utvecklare",
+ "Purchase_IncludedDeveloperInfo": "{0} {1} ingÄr.",
+ "Purchase_LicenseExtraDeveloperPurchaseMessage": "I {0} licens ingÄr {1} utvecklare. Du kan lÀgga till ytterligare utvecklare.",
+ "StartupTemplates_Page_Title": "ABP Startup Mallar",
+ "StartupTemplates_Page_Description": "Kickstarta ditt nya projekt med ABP:s appmallar! LÀmna alla infrastrukturaspekter till ABP och gör det du gör bÀst; fokusera pÄ ditt arbete...",
+ "MicroserviceStartupSolutionForDotnet": "Microservice Startup-lösning för .NET",
+ "MonolithSolutionForDotnet": "Monolitisk (modulÀr) lösning för .NET",
+ "TrainingDetailsHeaderInfo_TrainingHour": "{0} timmar",
+ "Trainings_Content": "Utbildningens innehÄll",
+ "Trial_Page_StartYourFreeTrial": "Starta din gratis provperiod.",
+ "TrialLicenseFeatures": "Du kommer att kunna dra nytta av alla ABP:s kommersiella funktioner",
+ "TrialPeriodDays": "Du kommer att ha en {0} dagars teamlicens",
+ "TrialForumSupportIncident": "Du kommer att ha {0} forum support incidenter",
+ "Contact_Page_Title": "Kontakta oss",
+ "Contact_Page_Description": "Kontakta oss om du har frÄgor om licenser, tillÀggstjÀnster, förfrÄgningar eller feedback om ABP. Vi Àr hÀr för att hjÀlpa dig!",
+ "Demo_Page_Title": "Skapa en demo",
+ "Demo_Page_Description": "Skapa en gratis demo för att se ett exempel pÄ en ansökan som skapats med hjÀlp av ABP-startmallen. Upprepa inte dig sjÀlv för vanliga applikationskrav.",
+ "Discounted_Page_Title": "Rabatterad prissÀttning",
+ "Discounted_Page_Description": "VÀlj de funktioner och den funktionalitet som ditt företag behöver redan idag. Köp en kommersiell licens och skapa obegrÀnsat med projekt",
+ "Faq_Page_Title": "Vanliga frÄgor och svar",
+ "Faq_Page_Description": "Hitta svar pÄ vanliga frÄgor om ABP Framework i vÄr FAQ-sektion, som tÀcker olika Àmnen och frÄgor.",
+ "Faq_Page_SwiftCode": "SWIFT-kod",
+ "Faq_Page_BankName": "Bankens namn",
+ "Faq_Page_AccountName": "Kontots namn",
+ "Faq_Page_AccountNumber": "Kontonummer",
+ "Faq_Page_Currency": "Valuta",
+ "Faq_Page_VatNumber": "Momsregistreringsnummer",
+ "Faq_Page_OtherCurrenciesInfo": "För andra valutor, se alla konton",
+ "ProjectCreatedSuccess_Page_Title": "Ditt projekt skapat",
+ "ProjectCreatedSuccess_Page_Description": "Ditt ABP-projekt har skapats framgÄngsrikt!",
+ "Suite_Page_Title": "ABP-svit",
+ "Suite_Page_Description": "Möt ABP Suite, ett verktyg för snabb applikationsutveckling som ökar produktiviteten och effektiviteten. Skapa CRUD-sidor pÄ nÄgra minuter!",
+ "Themes_Page_Title": "ABP Teman",
+ "Themes_Page_Description": "Utseendet Àr viktigt! Vi presenterar LeptonX Theme, ett modernt, anpassningsbart och flexibelt tema som skapar en unik anvÀndarupplevelse.",
+ "Tools_Page_Title": "ABP Verktyg",
+ "Tools_Page_Description": "Utforska de verktygslÄdor som ABP tillhandahÄller och som ökar utvecklingsproduktiviteten och effektiviserar din utveckling.",
+ "DeveloperPrice": "Pris för utvecklare",
+ "AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0} utvecklare",
+ "LicenseRemainingDays": "i {0} dagar",
+ "ExtendPaymentInfoSection_Description": "Genom att förlÀnga/förnya din licens kommer du att fortsÀtta att fÄ premium support. Du kommer ocksÄ att kunna fÄ större eller mindre uppdateringar för moduler och teman. Du kommer att kunna fortsÀtta skapa nya projekt. Och du kommer fortfarande att kunna anvÀnda ABP Suite som pÄskyndar din utveckling.",
+ "LicenseRenewalPrice": "Pris för förnyelse av licens",
+ "LicensePrice": "Licenspris",
+ "TrialLicensePaymentInfoSection_Description": "Köp licens: Genom att köpa en licens kommer du att fortsÀtta att fÄ premium support. Du kommer ocksÄ att kunna fÄ större eller mindre uppdateringar för moduler och teman. Du kommer att kunna fortsÀtta skapa nya projekt. Och du kommer fortfarande att kunna anvÀnda ABP Suite som pÄskyndar din utveckling. Se jÀmförelsetabellen för licenser för att kontrollera skillnaderna mellan licenstyperna.",
+ "SelectTargetLicense": "VÀlj mÄllicens",
+ "UpgradePaymentInfoSection_ExtendMyLicenseForOneYear": "Ja, förlÀnga min licens utgÄngsdatum med 1 Är.",
+ "UpgradePaymentInfoSection_WantToExtendLicense": "Vill du förlÀnga din licens med ytterligare 1 Är?",
+ "UpgradePaymentInfoSection_UpgradingWillNotExtendLicense": "Uppgradering kommer inte att förlÀnga licensens utgÄngsdatum!",
+ "UpgradePaymentInfoSection_LicenseUpgradeDescription": "Genom att uppgradera din licens kommer du att bli befordrad till en högre licenstyp, vilket gör att du kan fÄ ytterligare fördelar. Se jÀmförelsetabellen för licenser för att kontrollera skillnaderna mellan licenstyperna.",
+ "Welcome_Page_UseSameCredentialForCommercialWebsites": "AnvÀnd samma autentiseringsuppgifter för bÄde abp.io och abp.io/support/questions.",
+ "WatchCrudPagesVideo": "Titta pÄ videon \"Skapa CRUD-sidor med ABP Suite\"!",
+ "WatchGeneratingFromDatabaseVideo": "Titta pÄ videon \"ABP Suite: Generera CRUD-sidor frÄn befintliga databastabeller\" Video!",
+ "WatchTakeCloserLookVideo": "Titta pÄ videon \"Ta en nÀrmare titt pÄ kodgenerering: ABP Suite\" Video!",
+ "ConfirmedEmailAddressRequiredToStartTrial": "Du mÄste ha en bekrÀftad e-postadress för att kunna starta en testlicens.",
+ "EmailVerificationMailNotSent": "E-postverifiering mail kunde inte skickas.",
+ "GetConfirmationEmail": "Klicka hÀr för att fÄ ett verifieringsmejl om du inte har fÄtt det tidigare.",
+ "WhichLicenseTypeYouAreInterestedIn": "Vilken licenstyp Àr du intresserad av?",
+ "DontTakeOurWordForIt": "Ta inte vÄrt ord för det...",
+ "BlazoriseLicense": "MÄste vi köpa en Blazorise-licens?",
+ "ExtendPaymentInfoSection_DeveloperPrice": "{0}x Ytterligare utvecklare",
+ "ExtendPaymentInfoSection_DiscountRate": "Rabatt {0}%.",
+ "TotalNetPrice": "Totalt nettopris",
+ "EFCore": "Entity Framework Core",
+ "All": "Alla",
+ "Mvc": "MVC",
+ "DataBaseProvider": "Dataleverantör",
+ "UIFramework": "Ramverk för anvÀndargrÀnssnitt",
+ "LeptonXThemeForDashboard": "LeptonX Theme för din Admin Dashboard av",
+ "AbpPlatform": "ABP-plattform",
+ "YouDeserveGoodUXUI": "Du förtjÀnar ett bra UI och ett bÀttre UX. LeptonX Theme by ABP Àr hÀr för att tjÀna det.",
+ "ViewLiveDemo": "Visa demo för live-tema",
+ "GetLeptonX": "Skaffa LeptonX nu",
+ "SeeLeptonXDocumentation": "Se LeptonX dokumentation",
+ "SeeLeptonDocumentation": "Se Lepton Dokumentation",
+ "SimplifiedMenu": "Förenklad meny",
+ "SimplifiedMenuDescription": "Du kan enkelt hitta den sida du letar efter genom att filtrera i menyn",
+ "YourFavoritePages": "Dina favoritsidor inom rÀckhÄll",
+ "YourFavoritePagesDescription": "LÀgg enkelt till eller ta bort sidan frÄn favoriter genom att klicka pÄ stjÀrnikonen i det övre högra hörnet av sidan.",
+ "BreadCrumbs": "Breadcrumb för sömlös vÀxling",
+ "BreadCrumbsDescription": "Med Breadcrumb kan du vÀxla till sidorna pÄ samma nivÄ med ett klick, Àven nÀr vÀnstermenyn Àr stÀngd, och det fungerar pÄ surfplattor och mobiler!",
+ "YourMenu": "Din meny som du vill ha den",
+ "YourMenuDescription": "Anpassa de direktklickbara ikonerna och rullgardinsmenyerna i anvÀndarmenyn som du vill. AnvÀndarmenyn Àr helt anpassningsbar efter dina behov",
+ "RtlSupport": "RTL-stöd för ditt sprÄk",
+ "RtlSupportDescription": "LeptonX Theme stöder RTL för ditt sprÄk. SprÄkalternativen finns i instÀllningsmenyn sÄ att du kan Àndra sprÄk.",
+ "YourColors": "Dina fÀrger i grÀnssnittet för din adminpanel",
+ "YourColorsDescription": "LeptonX Theme fungerar enligt dina systeminstÀllningar och har alternativ för dashboard light theme, dashboard dark theme och dashboard semi-dark theme.",
+ "ArrangeContentWidth": "Ordna enkelt bredden pÄ ditt innehÄll",
+ "ArrangeContentWidthDescription": "Ăndra enkelt bredden pĂ„ din innehĂ„llsyta.",
+ "LeptonXCompatibleWith": "LeptonX Theme Àr kompatibelt med",
+ "MobileResponsiveTemplate": "Mobil responsiv mall",
+ "MobileResponsiveTemplateDescription1": "FÄ tillgÄng till LeptonX adminpanel frÄn vilken enhet du vill.",
+ "MobileResponsiveTemplateDescription2": "Den Àr utformad för att du enkelt ska kunna anvÀnda den i alla dina enheter. Den Àr responsiv pÄ mobila enheter och surfplattor.",
+ "TopMenuLayoutOption": "Alternativ för layout av toppmeny",
+ "TopMenuLayoutOptionDescription1": "Om du vill konfigurera din webbplats med samma adminpanel Àr det möjligt att göra det med LeptonX Theme!",
+ "TopMenuLayoutOptionDescription2": "Prova bara LeptonX toppmenylayout för att fÄ det att hÀnda!",
+ "EasilyCustomizable": "LÀtt att anpassa till ditt varumÀrkes fÀrger",
+ "EasilyCustomizableDescription1": "Du kan anpassa LeptonX-temat med bara nÄgra fÄ SCSS-variabler. Ingen ÄsidosÀttning, ingen extra CSS-belastning!",
+ "EasilyCustomizableDescription2": "Med LeptonX kan du ordna din adminpanel precis som du vill.",
+ "IndependentLayout": "Oberoende layout och innehÄllsyta",
+ "IndependentLayoutDescription1": "LeptonX:s layoutinfrastruktur utformades helt separat frÄn innehÄllet.",
+ "IndependentLayoutDescription2": "Detta innebÀr att du fritt kan utforma ditt projekt med en annan innehÄllsstruktur Àn Bootstrap om du vill.",
+ "MostUsedLibraries": "De mest anvÀnda biblioteken integrerade med LeptonX",
+ "MostUsedLibrariesDescription1": "LeptonX innehÄller dina mest anvÀnda bibliotek. Det gör att du enkelt kan anvÀnda bibliotek som ApexCharts, DataTables, DropZone, FullCalender, JSTree, Select2 och Toastr.",
+ "MostUsedLibrariesDescription2": "LeptonX stöder ocksÄ MVC Angular och Blazor-specifika bibliotek.",
+ "CreateAndCustomize": "Skapa och anpassa de sidor du behöver pÄ nÄgra sekunder med LeptonX anpassade sidor",
+ "CreateAndCustomizeDescription": "Genom att anvÀnda LeptonX Theme fÄr du ocksÄ tillgÄng till mÄnga fÀrdiga HTML-sidor. Dessa inkluderar mÄnga sidor som inloggningssida, blogg, FAQ, prenumerationslista, faktura, prissÀttning och filhantering.",
+ "LeptonThemeForAdmin": "Lepton Theme för din adminpanel genom att",
+ "LeptonThemeForAdminDescription": "Lepton Theme Àr fortfarande tillgÀngligt och kommer att underhÄllas. Om du vill byta till LeptonX Theme som Lepton Theme-anvÀndare kan du se dokumentationen för att lÀra dig hur du gör.",
+ "LeptonCompatibleWith": "Lepton Theme Àr kompatibelt med",
+ "BlackFridayDiscount": "Black Friday-rabatt",
+ "UpgradePaymentInfoSection_DeveloperPrice": "{0} för {1} ytterligare utvecklare",
+ "Upgrade": "Uppgradering",
+ "Renewal": "Förnyelse",
+ "UpgradePaymentInfoSection_LicensePrice": "{0} licens",
+ "UpgradePaymentInfoSection_LicenseRenewalPrice": "Förnyelse av licens",
+ "Total": "Totalt",
+ "SupportPolicyFaqTitle": "Vilken Àr er supportpolicy?",
+ "TotalDevelopers": "Totalt {0} utvecklare",
+ "CustomPurchaseExplanation": "SkrÀddarsydd för dina specifika behov",
+ "WhereDidYouHearAboutUs": "Var har du hört talas om oss?",
+ "Twitter": "Twitter",
+ "Facebook": "Facebook",
+ "Youtube": "YouTube",
+ "Google": "Google",
+ "Github": "GitHub",
+ "Friend": " FrÄn en vÀn",
+ "Other": "Ăvriga",
+ "WhereDidYouHearAboutUs_explain": "Ange ...",
+ "DeletingMemberWarningMessage": "\"{0}\" kommer att tas bort frÄn listan över utvecklare. Om du vill kan du tilldela denna tomma plats till en annan utvecklare senare.",
+ "AdditionalInfo": "Om antalet platser för utvecklare överstiger dina krav kan du minska dem. Du kan skicka e-post till info@abp.io för att ta bort nÄgra av dina utvecklarplatser. Om du rensar bort oanvÀnda utvecklarplatser minskar kostnaden för licensförnyelse. Om du vill kan du Äterköpa ytterligare utvecklarplatser inom din aktiva licensperiod. Observera att eftersom det finns {0} utvecklare i det hÀr licenspaketet kan du inte minska detta antal.",
+ "LinkExpiredErrorMessage": "LÀnken du försöker komma Ät har gÄtt ut.",
+ "ExpirationDate": "UtgÄngsdatum",
+ "SpringCampaignDiscount": "Rabatt pÄ vÄrkampanjen",
+ "WhyUseAbpIoPlatform": "Varför ska jag anvÀnda ABP Platform istÀllet för att skapa en ny lösning frÄn grunden?",
+ "WhyUseAbpIoPlatformFaqExplanation": "Se den sidan för en detaljerad förklaring av varför anvÀndning av ABP Platform har en betydande fördel jÀmfört med att göra allt sjÀlv.",
+ "EulaPageTitle": "Licensavtal för slutanvÀndare (EULA)",
+ "PrivacyPolicyPageTitle": "Integritetspolicy - Cookiepolicy",
+ "TermsConditionsPageTitle": "Villkor och anvisningar",
+ "TrainingsPageTitle": "Utbildningspaket",
+ "ModulesPageTitle": "ABP-moduler",
+ "ModulesPageDescription": "Utöka och anpassa din applikation med ABP:s modulÀra arkitektur, som ger flexibilitet och skalbarhet.",
+ "Volo.AbpIo.Commercial:040001": "API-Ätkomstnyckeln Àr felaktig.",
+ "GetLepton": "Skaffa Lepton nu",
+ "MyOrganizations_Detail_LicenseStartDate": "Startdatum",
+ "MyOrganizations_Detail_LicenseExpiryDate": "UtgÄngsdatum",
+ "BlazoriseSupport": "Hur fÄr jag Blazorise-licensnyckeln och support frÄn Blazorise-teamet?",
+ "BlazoriseSupportExplanation": "Följ stegen nedan för att fÄ support frÄn Blazorise-teamet och fÄ din Blazorise-licensnyckel:",
+ "BlazoriseSupportExplanation1": "Registrera dig för ett nytt konto pÄ blazorise.com/support/register med samma e-postadress som ditt abp.io-konto. LÀmna posten \"Licensnyckel\" tom. Det mÄste vara samma e-postadress som ditt e-postkonto pÄ abp.io.",
+ "BlazoriseSupportExplanation2": "Verifiera din e-postadress genom att kolla din e-postlÄda. Kontrollera din skrÀppostlÄda om du inte ser ett e-postmeddelande i din inkorg!",
+ "BlazoriseSupportExplanation3": "Logga in pÄ Blazorise supportwebbplats pÄ blazorise.com/support/login.",
+ "BlazoriseSupportExplanation4": "Om du har en aktiv ABP Commercial License kommer du ocksÄ att ha en Blazorise PRO-licens. Du kan fÄ din Blazorise-licensnyckel pÄ blazorise.com/support/user/manage/license.",
+ "BlazoriseSupportExplanation5": "Du kan stÀlla dina frÄgor pÄ supportwebbplatsen och generera en produkttoken för din applikation.",
+ "AbpLiveTrainingPackages": "ABP Live utbildningspaket",
+ "Releases": "UtgÄvor",
+ "ReleasesDescription": "Den hÀr sidan innehÄller detaljerad information om varje release. Du kan se alla stÀngda pull requests för en specifik release. För övergripande milstolpsutvecklingar kan du kolla in sidan med kortfattade releaseanteckningar.",
+ "ReleaseDate": "Utgivningsdatum",
+ "Labels": "Etiketter",
+ "PreRelease": "Förhandsrelease",
+ "AllTypes": "Alla typer",
+ "Enhancement": "FörbÀttring",
+ "Bug": "Insekt",
+ "Feature": "Funktion",
+ "AllUIs": "Alla anvÀndargrÀnssnitt",
+ "MVC": "MVC",
+ "BlazorServer": "Blazor Server",
+ "MAUI": "MAUI",
+ "HowItWorks_Page_Title": "Hur fungerar det?",
+ "HowItWorks_Page_Description": "FörstÄ hur ABP Framework fungerar med detaljerad dokumentation, inklusive guider och bÀsta praxis.",
+ "HowItWorks_Description1": "ABP utökar .NET-plattformen. SÄ allt du kan göra med en vanlig .NET-lösning Àr redan möjligt med ABP. Det gör det enkelt att komma igÄng med en lÄg inlÀrningskurva.",
+ "HowItWorks_Description2": "NÀr du vÀl har börjat lÀra dig och anvÀnda ABP-funktionerna kommer det att bli mycket roligare Àn nÄgonsin att utveckla din programvara.",
+ "HowItWorks_Description3": "Den hÀr sidan förklarar i princip hur du anvÀnder ABP Platform som .NET-utvecklare.",
+ "CreateANewSolution_Description1": "Allt börjar med att skapa en ny ABP-integrerad .NET-lösning.",
+ "StartWithStartupTemplates": "Starta en av de förbyggda mallarna för startup-lösningar",
+ "SimpleMonolithApplicationTemplate": "Enkel mall för monolitisk applikation",
+ "LayeredApplicationTemplate": "ModulÀr monolitisk applikationsmall",
+ "MicroserviceSolutionTemplate": "Mall för mikroservicelösning",
+ "CreateEmptySolutionAndUseAbp": "Eller skapa en ny tom .NET-lösning och installera ABP NuGet & NPM packages sjÀlv.",
+ "CreatingSolutionWithMultipleOptions": "Det finns flera alternativ för anvÀndargrÀnssnitt och databas nÀr du skapar en ny lösning.",
+ "UIFrameworkOptions": "Alternativ för anvÀndargrÀnssnitt",
+ "DotnetSolutionWithoutDependency": "Nu har du en vanlig .NET-lösning i din lokala dator som inte Àr beroende av nÄgon molnplattform eller extern tjÀnst.",
+ "CheckTheDocumentForDetails": "Du kan kontrollera {1} dokumentet för detaljer.",
+ "UIAndDatabaseIndependent": "ABP kan fungera med alla anvÀndargrÀnssnitt och alla databasleverantörer som stöds av .NET.\n Dessa anvÀndargrÀnssnitt och databasleverantörer Àr dock förintegrerade och vÀldokumenterade.",
+ "InstallAbpModules": "Installera ABP-moduler",
+ "DevelopYourSolution": "Utveckla din lösning",
+ "DeployAnywhere": "Distribuera var som helst",
+ "InstallAbpModule_Description1": "ABP Àr ett modulÀrt ramverk för applikationsutveckling. Mallarna för startup-lösningar levereras redan med de viktigaste modulerna installerade.\n Men det finns fler applikationsmoduler som du kanske vill anvÀnda i din lösning.",
+ "InstallAbpModule_Description2": "Varje modul bestÄr av ett fÄtal NuGet- och NPM-paket och har ett installationsdokument. ABP Studio gör det mesta av arbetet automatiskt, sedan konfigurerar eller finjusterar du modulen manuellt baserat pÄ dess dokumentation.",
+ "DevelopYourSolution_Description1": "ABP:s infrastruktur gör att du kan fokusera pÄ din egen affÀrskod genom att automatisera det repetitiva arbetet och tillhandahÄlla förbyggd infrastruktur och applikationsfunktioner.",
+ "DevelopYourSolution_Description2": "I följande kodblock kan du se hur ABP sömlöst integreras i din kod och automatiserar de repetitiva uppgifterna Ät dig.",
+ "DevelopYourSolution_Description3": "Ăven i detta kortkodsblock gör ABP en hel del saker Ă„t dig.",
+ "DevelopYourSolution_Description4": "Det ger basklasser för att tillÀmpa konventioner, som\n dependency injection. Generiska\n repository tjÀnster ger ett bekvÀmt sÀtt att\n sÀtt att interagera med databasen. Deklarativ\n auktorisering arbetar med ett finjusterat behörighetssystem.",
+ "DevelopYourSolution_Description5": "ABP automatiserar helt och hÄllet\n arbetsenhet (för databasanslutning och transaktionshantering),\n undantagshantering,\n validering\n och auditloggning. Det ger mÄnga fler byggstenar för att förenkla dina dagliga utvecklingsuppgifter och fokusera pÄ din egen kod medan du skapar produktionsklara\n applikationer.",
+ "DevelopYourSolution_Description6": "Du kan förestÀlla dig hur lÄngt och komplicerat det kodblocket kan bli om du skulle göra allt manuellt.",
+ "SuiteCrudGenerationInFewSeconds": "Förutom att handkoda din lösning kan du skapa fullt fungerande avancerade CRUD-sidor pÄ nÄgra minuter med hjÀlp av ABP Suite-verktyget. Det genererar koden till din lösning, sÄ att du kan finjustera den utifrÄn dina anpassade krav.",
+ "DeployAnywhere_Description1": "I slutÀndan har du en ren .NET-lösning. Du kan distribuera din lösning till din egen server, till en molnplattform, till Kubernetes eller var du vill. Du kan distribuera till sÄ mÄnga servrar som du vill. ABP Àr ett agnostiskt verktyg för driftsÀttningsmiljöer.",
+ "ExpertiseAbpFramework": "Expertis ABP",
+ "ExpertiseAbpFramework_Description1": "Vill du gÄ lÀngre Àn grunderna och fÄ expertis med ABP Platform?",
+ "FreeDownload": "Fri nedladdning",
+ "HavingTrouble": "Har du problem?",
+ "HavingTrouble_Description1": "Har du problem med att utveckla din lösning? Vi finns hÀr för dig! AnvÀnd ABP:s supportplattform\n eller skicka ett e-postmeddelande för att fÄ hjÀlp direkt frÄn Core ABP-teammedlemmarna.",
+ "WeAreHereToHelp_Description1": "Du kan blÀddra bland vÄra hjÀlpÀmnen eller söka i vanliga frÄgor,\n eller sÄ kan du stÀlla en frÄga till oss genom att anvÀnda kontaktformulÀret.",
+ "OtherModules": "Ăvriga moduler",
+ "OtherModules_Description1": "Konto, Audit Logging, Chatt, CMS Kit, Filhantering, FormulÀr, GDPR, SprÄkhantering och mer...",
+ "HowItWorks_DatabaseProviderOptions": "Alternativ för databasleverantör",
+ "SeeFAQ": "Se vanliga frÄgor",
+ "ReleaseLogs": "Release Loggar",
+ "ReleaseLogs_Tag": "{0} Loggar för frislÀppande",
+ "ReleaseLogs_Pr": "Pull Request #{0} - {1}",
+ "NoLabels": "Inga etiketter",
+ "DoesTheSubscriptionRenewAutomatically": "Förnyas abonnemanget automatiskt?",
+ "DoesTheSubscriptionRenewAutomaticallyExplanation": "ABP-plattformen har inte en faktureringsmodell för automatisk förnyelse. DÀrför kommer din prenumeration inte att förnyas automatiskt i slutet av din licensperiod. Om du vill fortsÀtta att ha fördelarna med ABP-plattformen mÄste du förnya den manuellt pÄ sidan för organisationshantering. Om du har flera organisationer klickar du pÄ knappen \"Hantera\" pÄ din organisation som löper ut och klickar sedan pÄ knappen \"FörlÀng nu\" för att förnya din licens. Du kanske ocksÄ vill ta en titt pÄ avsnittet Vad hÀnder nÀr min licens gÄr ut?.",
+ "ExtraQuestionCreditsFaqTitle": "Kan jag köpa extra poÀng för supportfrÄgor?",
+ "ExtraQuestionCreditsFaqExplanation": "Ja, det kan du göra. För att köpa extra frÄgepoÀng, skicka ett e-postmeddelande till info@abp.io med din organisations namn. HÀr Àr prislistan för de extra frÄgekrediterna:
```
@@ -82,17 +83,17 @@ After that, you are able to use localization service.
```js
this.localizationService.instant(
- 'AbpIdentity::UserDeletionConfirmation',
- 'John'
+ "AbpIdentity::UserDeletionConfirmation",
+ "John"
);
// with fallback value
this.localizationService.instant(
{
- key: 'AbpIdentity::UserDeletionConfirmation',
- defaultValue: 'Default Value',
+ key: "AbpIdentity::UserDeletionConfirmation",
+ defaultValue: "Default Value",
},
- 'John'
+ "John"
);
// Output
@@ -102,12 +103,12 @@ this.localizationService.instant(
To get a localized text as [_Observable_](https://rxjs.dev/guide/observable) use `get` method instead of `instant`:
```js
-this.localizationService.get('Resource::Key');
+this.localizationService.get("Resource::Key");
// with fallback value
this.localizationService.get({
- key: 'Resource::Key',
- defaultValue: 'Default Value',
+ key: "Resource::Key",
+ defaultValue: "Default Value",
});
```
@@ -118,41 +119,46 @@ Localizations can be determined on backend side. Angular UI gets the localizatio
See an example:
```ts
-// app.module.ts
+import { provideAbpCore, withOptions } from '@abp/ng.core';
@NgModule({
- imports: [
- //...other imports
- CoreModule.forRoot({
- localizations: [
- {
- culture: 'en',
- resources: [
- {
- resourceName: 'MyProjectName',
- texts: {
- Administration: 'Administration',
- HomePage: 'Home',
+ providers: [
+ // ...
+ provideAbpCore(
+ withOptions({
+ ...,
+ localizations: [
+ {
+ culture: 'en',
+ resources: [
+ {
+ resourceName: 'MyProjectName',
+ texts: {
+ Administration: 'Administration',
+ HomePage: 'Home',
+ },
},
- },
- ],
- },
- {
- culture: 'de',
- resources: [
- {
- resourceName: 'MyProjectName',
- texts: {
- Administration: 'Verwaltung',
- HomePage: 'Startseite',
+ ],
+ },
+ {
+ culture: 'de',
+ resources: [
+ {
+ resourceName: 'MyProjectName',
+ texts: {
+ Administration: 'Verwaltung',
+ HomePage: 'Startseite',
+ },
},
- },
- ],
- },
- ],
- }),
- ]
+ ],
+ },
+ ],
+ }),
+ ),
+ ...
+ ],
})
+export class AppModule {}
```
...or, you can determine the localizations in a feature module:
@@ -256,10 +262,10 @@ Find [styles configuration in angular.json](https://angular.io/guide/workspace-c
If you have created and injected chunks for Fontawesome as seen above, you no longer need the lazy loading in the `AppComponent` which was implemented before v2.9. Simply remove them. The `AppComponent` in the template of the new version looks like this:
```js
-import { Component } from '@angular/core';
+import { Component } from "@angular/core";
@Component({
- selector: 'app-root',
+ selector: "app-root",
template: `
@@ -274,33 +280,32 @@ Since ABP has more than one language, Angular locale files loads lazily using [W
### registerLocaleFn
-`registerLocale` function that exported from `@abp/ng.core/locale` package is a higher order function that accepts `cultureNameLocaleFileMap` object and `errorHandlerFn` function as params and returns Webpack `import` function. A `registerLocale` function must be passed to the `forRoot` of the `CoreModule` as shown below:
-
-```js
-// app.module.ts
+`registerLocale` function that exported from `@abp/ng.core/locale` package is a higher order function that accepts `cultureNameLocaleFileMap` object and `errorHandlerFn` function as params and returns Webpack `import` function. A `registerLocale` function must be passed to the `withOptions` of the `provideAbpCore` as shown below:
+```ts
+import { provideAbpCore, withOptions } from '@abp/ng.core';
import { registerLocale } from '@abp/ng.core/locale';
-// if you have commercial license and the language management module, add the below import
-// import { registerLocale } from '@volo/abp.ng.language-management/locale';
-
@NgModule({
- imports: [
- // ...
- CoreModule.forRoot({
- // ...other options,
- registerLocaleFn: registerLocale(
- // you can pass the cultureNameLocaleFileMap and errorHandlerFn as optionally
- {
- cultureNameLocaleFileMap: { 'pt-BR': 'pt' },
- errorHandlerFn: ({ resolve, reject, locale, error }) => {
- // the error can be handled here
+ providers: [
+ provideAbpCore(
+ withOptions({
+ ...,
+ registerLocaleFn: registerLocale(
+ // you can pass the cultureNameLocaleFileMap and errorHandlerFn as optionally
+ {
+ cultureNameLocaleFileMap: { 'pt-BR': 'pt' },
+ errorHandlerFn: ({ resolve, reject, locale, error }) => {
+ // the error can be handled here
+ },
},
- },
- )
- }),
- //...
- ]
+ ),
+ }),
+ ),
+ ...
+ ],
+})
+export class AppModule {}
```
### Mapping of Culture Name to Angular Locale File Name
@@ -320,20 +325,23 @@ import { registerLocale } from '@abp/ng.core/locale';
@NgModule({
- imports: [
+ providers: [
// ...
- CoreModule.forRoot({
- // ...other options,
- registerLocaleFn: registerLocale(
- {
- cultureNameLocaleFileMap: {
- "DotnetCultureName": "AngularLocaleFileName",
- "pt-BR": "pt" // example
+ provideAbpCore(
+ withOptions({
+ ...,
+ registerLocaleFn: registerLocale(
+ {
+ cultureNameLocaleFileMap: {
+ "DotnetCultureName": "AngularLocaleFileName",
+ "pt-BR": "pt" // example
+ },
},
- },
- )
- }),
- //...
+ )
+ }),
+ ),
+ ]
+})
```
See [all locale files in Angular](https://github.com/angular/angular/tree/master/packages/common/locales).
@@ -345,12 +353,12 @@ Add the below code to the `app.module.ts` by replacing `your-locale` placeholder
```js
//app.module.ts
-import { storeLocaleData } from '@abp/ng.core/locale';
+import { storeLocaleData } from "@abp/ng.core/locale";
import(
/* webpackChunkName: "_locale-your-locale-js"*/
/* webpackMode: "eager" */
- '@angular/common/locales/your-locale.js'
-).then((m) => storeLocaleData(m.default, 'your-locale'));
+ "@angular/common/locales/your-locale.js"
+).then((m) => storeLocaleData(m.default, "your-locale"));
```
...or a custom `registerLocale`Â function can be passed to the `CoreModule`:
@@ -373,14 +381,17 @@ export function registerLocale(locale: string) {
import { registerLocale } from './register-locale';
@NgModule({
- imports: [
+ providers: [
// ...
- CoreModule.forRoot({
- // ...other options,
- registerLocaleFn: registerLocale
- }),
+ provideAbpCore(
+ withOptions({
+ ...,
+ registerLocaleFn: registerLocale,
+ }),
+ ),
//...
]
+})
```
After this custom `registerLocale` function, since the en and fr added to the `webpackInclude`, only en and fr locale files will be created as chunks:
diff --git a/docs/en/framework/ui/angular/quick-start.md b/docs/en/framework/ui/angular/quick-start.md
index d6f3c2bb77..32e4522937 100644
--- a/docs/en/framework/ui/angular/quick-start.md
+++ b/docs/en/framework/ui/angular/quick-start.md
@@ -6,8 +6,8 @@
Please follow the steps below to prepare your development environment for Angular.
-1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js v16 or v18 installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system.
-2. **[Optional] Install Yarn:** You may install Yarn v1 (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v6 and below. You may skip this step and work with npm, which is built-in in Node.js, instead.
+1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js `v18.19+` installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system.
+2. **[Optional] Install Yarn:** You may install Yarn v1.22+ (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v10 and below. You may skip this step and work with npm, which is built-in in Node.js, instead.
3. **[Optional] Install VS Code:** [VS Code](https://code.visualstudio.com/) is a free, open-source IDE which works seamlessly with TypeScript. Although you can use any IDE including Visual Studio or Rider, VS Code will most likely deliver the best developer experience when it comes to Angular projects. ABP project templates even contain plugin recommendations for VS Code users, which VS Code will ask you to install when you open the Angular project folder. Here is a list of recommended extensions:
- [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=angular.ng-template)
- [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
diff --git a/docs/en/framework/ui/blazor/branding.md b/docs/en/framework/ui/blazor/branding.md
index 9fea655eb4..81b4244c25 100644
--- a/docs/en/framework/ui/blazor/branding.md
+++ b/docs/en/framework/ui/blazor/branding.md
@@ -24,8 +24,6 @@ namespace MyCompanyName.MyProjectName.Blazor
}
````
-> Currently, setting the `AppName` is only applicable to the [Basic Theme](./basic-theme.md), it does not have any effect on the other [official themes](../../../ui-themes).
-
The result will be like shown below:

diff --git a/docs/en/framework/ui/mvc-razor-pages/branding.md b/docs/en/framework/ui/mvc-razor-pages/branding.md
index 53d499031c..46c05d7d7e 100644
--- a/docs/en/framework/ui/mvc-razor-pages/branding.md
+++ b/docs/en/framework/ui/mvc-razor-pages/branding.md
@@ -26,8 +26,6 @@ namespace MyProject.Web
}
````
-> Currently, setting the `AppName` is only applicable to the [Basic Theme](./basic-theme.md), it does not have any effect on the other [official themes](../../../ui-themes).
-
The result will be like shown below:

diff --git a/docs/en/get-started/images/abp-studio-created-new-solution.png b/docs/en/get-started/images/abp-studio-created-new-solution.png
index 4a7d4f0b01..c089c276f6 100644
Binary files a/docs/en/get-started/images/abp-studio-created-new-solution.png and b/docs/en/get-started/images/abp-studio-created-new-solution.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png
index 87bd86755c..9f9df8991f 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options.png
new file mode 100644
index 0000000000..4a2d3c2dd2
Binary files /dev/null and b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-efcore.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-efcore.png
index e71cbb7036..e9a5bcee19 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-efcore.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-efcore.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-mongo.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-mongo.png
index f0b0ed136b..4b00156e3f 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-mongo.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-mongo.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-efcore.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-efcore.png
index 6f8e937b09..138d1904f5 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-efcore.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-efcore.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-mongo.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-mongo.png
index a1175b81bf..1e3f54a9d8 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-mongo.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-mongo.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png
index b7ccfb2976..7e43e784f3 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework.png
index 20b89c059d..f773d887d8 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-optional-modules.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-optional-modules.png
new file mode 100644
index 0000000000..992760e3fc
Binary files /dev/null and b/docs/en/get-started/images/abp-studio-new-solution-dialog-optional-modules.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-public-website.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-public-website.png
new file mode 100644
index 0000000000..e10d4a965c
Binary files /dev/null and b/docs/en/get-started/images/abp-studio-new-solution-dialog-public-website.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-solution-properties.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-solution-properties.png
index 93b3154e7c..7412b4b6e1 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-solution-properties.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-solution-properties.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-solution-structure.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-solution-structure.png
index 3cdd22f555..310488c1bc 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-solution-structure.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-solution-structure.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework.png
index 228c711a1a..d373a55344 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme.png
index d17d1d766d..8594f02d58 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme.png differ
diff --git a/docs/en/get-started/images/abp-studio-quick-start-application-solution-runner.png b/docs/en/get-started/images/abp-studio-quick-start-application-solution-runner.png
index 2e4a9aa583..f5ca4c97e7 100644
Binary files a/docs/en/get-started/images/abp-studio-quick-start-application-solution-runner.png and b/docs/en/get-started/images/abp-studio-quick-start-application-solution-runner.png differ
diff --git a/docs/en/get-started/images/abp-studio-quick-start-browse-command.png b/docs/en/get-started/images/abp-studio-quick-start-browse-command.png
index 186ff2d55d..c97b3c9700 100644
Binary files a/docs/en/get-started/images/abp-studio-quick-start-browse-command.png and b/docs/en/get-started/images/abp-studio-quick-start-browse-command.png differ
diff --git a/docs/en/get-started/images/abp-studio-quick-start-browse.png b/docs/en/get-started/images/abp-studio-quick-start-browse.png
index d63c20c8ac..47b4bf29cf 100644
Binary files a/docs/en/get-started/images/abp-studio-quick-start-browse.png and b/docs/en/get-started/images/abp-studio-quick-start-browse.png differ
diff --git a/docs/en/get-started/images/abp-studio-quick-start-example-applications-in-solution-runner.png b/docs/en/get-started/images/abp-studio-quick-start-example-applications-in-solution-runner.png
index 46adf8bfc0..44cef603fb 100644
Binary files a/docs/en/get-started/images/abp-studio-quick-start-example-applications-in-solution-runner.png and b/docs/en/get-started/images/abp-studio-quick-start-example-applications-in-solution-runner.png differ
diff --git a/docs/en/get-started/images/solution-runner-public-website.png b/docs/en/get-started/images/solution-runner-public-website.png
index a00368ee79..b1e76a4ce6 100644
Binary files a/docs/en/get-started/images/solution-runner-public-website.png and b/docs/en/get-started/images/solution-runner-public-website.png differ
diff --git a/docs/en/get-started/layered-web-application.md b/docs/en/get-started/layered-web-application.md
index 6757dea556..93e59f8242 100644
--- a/docs/en/get-started/layered-web-application.md
+++ b/docs/en/get-started/layered-web-application.md
@@ -22,8 +22,8 @@ The following tools should be installed on your development machine:
* [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) (v17.3+) for Windows / [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/). [1](#f-editor)
* [.NET 8.0+](https://dotnet.microsoft.com/en-us/download/dotnet)
{{ if UI != "Blazor" }}
-* [Node v16 or v18](https://nodejs.org/)
-* [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [2](#f-yarn) or npm v6+ (already installed with Node)
+* [Node v18.19+](https://nodejs.org/)
+* [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [2](#f-yarn) or npm v10+ (already installed with Node)
{{ end }}
{{ if Tiered == "Yes" }}
* [Redis](https://redis.io/) (as the [distributed cache](../framework/fundamentals/caching.md)).
@@ -77,17 +77,25 @@ LeptonX is the suggested UI theme that is proper for production usage. Select on
Here, you see all the mobile applications available in that startup solution template. These mobile applications are well-integrated into your solution and can use the same backend with your web application. They are simple (do not have pre-built features as much as the web application) but a very good starting point to build your mobile application.
-Pick the one best for you, or select the *None* if you don't want a mobile application in your solution, then click Next to navigate to the *Additional UI options* screen:
+Pick the one best for you, or select the *None* if you don't want a mobile application in your solution, then click Next to navigate to the *Public website* screen:
-
+
That startup solution template also provides an option to create a second web application inside the solution. The second application is called the Public website, an ASP.NET Core MVC / Razor Page application. It can be used to create a public landing/promotion for your product. It is well integrated into the solution (can share the same services, entities, database, and the same authentication logic, for example). If you want, you can also include the [CMS Kit module](../modules/cms-kit) to your solution to add dynamic content features to your web application.
-So, either select the *Public website* or skip it and click the Next button for the *Solution Structure* selection:
+So, either select the *Public website* or skip it and click the Next button for the *Optional Modules* selection:
+
+
+
+Each item in that list is a pre-built application module. You can click the blue icon near to the module name to get more information about the module. You can leave the list as is (so, it installs the most common and used modules for you) or customize based on your preference.
+
+Installing a module after creating the solution may require manual steps. So, it is better to decide the modules in the beginning. You can create an example solutions before your real solution to explore the solution and modules.
+
+Once you select the desired modules, click the *Next* button for the *Solution Structure* screen:

-The *Tiered* option is used to physically separate the web application (the UI part) from the backend HTTP APIs. It creates a separate host application that only serves the HTTP (REST) APIs. The web application then performs remote HTTP calls to that application for every operation. If the *Tiered* option is not selected, then the web and HTTP APIs are hosted in a single application, and the calls from the UI layer to the API layer are performed in-process.
+It creates a separate host application that only serves the HTTP (REST) APIs. The web application then performs remote HTTP calls to that application for every operation. If the *Tiered* option is not selected, then the web and HTTP APIs are hosted in a single application, and the calls from the UI layer to the API layer are performed in-process.
The tiered architecture allows you to host the web (UI) application in a server that can not access to your database server. However, it brings a slight loss of performance (because of the HTTP calls between UI and HTTP API applications) and makes your architecture, development, and deployment more complex. If you don't understand the tiered structure, just skip it.
@@ -107,9 +115,13 @@ On that screen, you can decide on your database provider by selecting one of the

{{ end }}
-Here, you can select the database management systems (DBMS){{ if DB == "EF" }} and the connection string{{ end }}. Now, we are ready to allow ABP Studio to create our solution. Just click the *Create* button and let the ABP Studio do the rest for you.
+Here, you can select the database management systems (DBMS){{ if DB == "EF" }} and the connection string{{ end }}. Click *Next* button to see the *Additional Options*.
+
+
+
+If you uncheck the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files, such as Helm charts and other Kubernetes-related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login.
-After clicking the Create button, the dialog is closed and your solution is loaded into ABP Studio:
+Now, we are ready to allow ABP Studio to create our solution. Just click the *Create* button and let the ABP Studio do the rest for you. After clicking the Create button, the dialog is closed and your solution is loaded into ABP Studio:

@@ -129,7 +141,7 @@ Open the [Solution Runner](../studio/running-applications.md) section on the lef
Once you click the *Play* icon on the left side, the section is open in the same place as the Solution Explorer section. ABP Studio also opens the *Application Monitor* view on the main content area. *Application Monitor* shows useful insights for your applications (e.g. *HTTP Request*, *Events* and *Exceptions*) in real-time. You can use it to see the happenings in your applications, so you can easily track errors and many helpful details.
-In the Solution Runner section (on the left side) you can see all the runnable applications in the current solution. For the MVC with public website example, we have three applications:
+In the Solution Runner section (on the left side) you can see all the runnable applications in the current solution. For the MVC with public website and MAUI mobile example, we have four applications:

@@ -230,4 +242,4 @@ Before starting the mobile application, ensure that you configure it for [react-
> For example in non-tiered MVC with public website application:
-
+
\ No newline at end of file
diff --git a/docs/en/get-started/microservice.md b/docs/en/get-started/microservice.md
index 9a90be00da..47f1091b14 100644
--- a/docs/en/get-started/microservice.md
+++ b/docs/en/get-started/microservice.md
@@ -71,7 +71,7 @@ Click the Next button to see *Additional Options* selection:

-If you unchecked the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files which include the Helm charts and other Kubernetes related files.
+If you unchecked the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files which include the Helm charts and other Kubernetes related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login.
Now, we are ready to allow ABP Studio to create our solution. Just click the *Create* button and let the ABP Studio do the rest for you. After clicking the Create button, the dialog is closed and your solution is loaded into ABP Studio:
@@ -125,6 +125,8 @@ In the *Solution Runner* section (on the left side) you can see all the runnable
> All the leaf items in the *Solution Runner* is called as an *Application* as they are executable applications.
+> For a faster start process, first start the *Docker-Dependencies*, then you can start all applications.
+
As shown in the figure above, the executable applications are grouped into folders like `apps`, `gateways`, `infrastructure`, and `services`. You can start/stop them all, a group (folder) of them, or one by one.
Before running the applications, it is good to be sure that all applications are built. To do that, right-click the root item in the *Solution Runner* and select *Build* -> *Build All* action.
diff --git a/docs/en/get-started/single-layer-web-application.md b/docs/en/get-started/single-layer-web-application.md
index fc86aad667..319fb19c9a 100644
--- a/docs/en/get-started/single-layer-web-application.md
+++ b/docs/en/get-started/single-layer-web-application.md
@@ -21,8 +21,8 @@ The following tools should be installed on your development machine:
* [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) (v17.3+) for Windows / [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/). [1](#f-editor)
* [.NET 8.0+](https://dotnet.microsoft.com/en-us/download/dotnet)
{{ if UI != "Blazor" }}
-* [Node v16 or v18](https://nodejs.org/)
-* [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [2](#f-yarn) or npm v6+ (already installed with Node)
+* [Node v18.19+](https://nodejs.org/)
+* [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [2](#f-yarn) or npm v10+ (already installed with Node)
{{ end }}
{{ if Tiered == "Yes" }}
* [Redis](https://redis.io/) (as the [distributed cache](../framework/fundamentals/caching.md)).
diff --git a/docs/en/images/abp-overall-diagram-1600.png b/docs/en/images/abp-overall-diagram-1600.png
new file mode 100644
index 0000000000..16d397466a
Binary files /dev/null and b/docs/en/images/abp-overall-diagram-1600.png differ
diff --git a/docs/en/images/cmskit-module-markedItems.png b/docs/en/images/cmskit-module-markedItems.png
new file mode 100644
index 0000000000..52eb61f285
Binary files /dev/null and b/docs/en/images/cmskit-module-markedItems.png differ
diff --git a/docs/en/images/cmskit-module-markedItemsFilter.gif b/docs/en/images/cmskit-module-markedItemsFilter.gif
new file mode 100644
index 0000000000..641975c892
Binary files /dev/null and b/docs/en/images/cmskit-module-markedItemsFilter.gif differ
diff --git a/docs/en/images/docs-referencing.png b/docs/en/images/docs-referencing.png
new file mode 100644
index 0000000000..2bc3f5da3c
Binary files /dev/null and b/docs/en/images/docs-referencing.png differ
diff --git a/docs/en/images/issuemanagement-module-solution.png b/docs/en/images/issuemanagement-module-solution.png
index 3e01ff1b92..b224045596 100644
Binary files a/docs/en/images/issuemanagement-module-solution.png and b/docs/en/images/issuemanagement-module-solution.png differ
diff --git a/docs/en/images/pen-test-alert-list-8.3.png b/docs/en/images/pen-test-alert-list-8.3.png
new file mode 100644
index 0000000000..d0584bde22
Binary files /dev/null and b/docs/en/images/pen-test-alert-list-8.3.png differ
diff --git a/docs/en/images/suite-add-existing-solution-8.3.png b/docs/en/images/suite-add-existing-solution-8.3.png
new file mode 100644
index 0000000000..1d0cdace0e
Binary files /dev/null and b/docs/en/images/suite-add-existing-solution-8.3.png differ
diff --git a/docs/en/index.md b/docs/en/index.md
index 1e7ec4a91a..187bd6ff83 100644
--- a/docs/en/index.md
+++ b/docs/en/index.md
@@ -3,29 +3,47 @@
ABP offers an **opinionated architecture** to build enterprise software solutions with **best practices** on top of the **.NET** and the **ASP.NET Core** platforms. It provides the fundamental infrastructure, production-ready startup templates, pre-built application modules, UI themes, tooling, guides and documentation to implement that architecture properly and **automate the details** and repetitive works as much as possible.
## Why ABP Platform?
+The following pages outline why you should use the ABP Platform and how it is used:
-Wondering why you should use the ABP Platform instead of creating a new solution from scratch? [Continue reading here](./others/why-abp-platform.md).
+* [Why choose ABP?](https://abp.io/why-choose-abp)
+* [How it works?](https://abp.io/how-it-works)
+* [Return on investment](https://abp.io/return-on-investment)
## Get Started
-The [Getting Started](get-started) guide can be used to create and run ABP based solutions with different options and details. Then you can follow the [Todo Application Tutorial](tutorials/todo) to create your first application with ABP, or build a full-featured and real-life web application by following the [Book Store Application Tutorial](tutorials/book-store/part-01.md).
+The [Getting Started](get-started) guide can be used to create and run ABP based solutions with different options and details.
+
+After getting started, you can read the following documents:
+
+* [Todo Application Tutorial](tutorials/todo) to create your first ABP application.
+* [Book Store Application Tutorial](tutorials/book-store/part-01.md) to build a full-featured and real-life web application with ABP.
### UI Framework Options
-ABP can work with any UI framework, while the following frameworks are supported out of the box:
+ABP can work with any UI framework, while the following frameworks are supported and well-integrated out of the box:
-
+
### Database Provider Options
-ABP can work with any database provider, while the following providers are supported out of the box:
+ABP can work with any database provider, while the following providers are supported and well-integrated out of the box:
+
+
+
+## The ABP Platform
-
+ABP **bridges the gap** between ASP.NET Core and **real-world business application requirements**, allowing you to focus on your business code.
+
+The following diagram contains the core components of the **ABP Platform** and shows how ABP sits between **ASP.NET Core** and **Your Application**:
+
+
## Exploring the Documentation
ABP has a **comprehensive documentation** that not only explains ABP, but also includes **guides** and **samples** to help you on creating a **maintainable solution** by introducing and discussing common **software development principle and best practices**.
+The next sections highlight important ABP components and provides links to related documents.
+
### The Framework
#### Architecture
diff --git a/docs/en/modules/account/authority-delegation.md b/docs/en/modules/account/authority-delegation.md
index 9a973d65e0..fafe297677 100644
--- a/docs/en/modules/account/authority-delegation.md
+++ b/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:
-
\ No newline at end of file
+
diff --git a/docs/en/modules/account/impersonation.md b/docs/en/modules/account/impersonation.md
index a086729054..ed008c6418 100644
--- a/docs/en/modules/account/impersonation.md
+++ b/docs/en/modules/account/impersonation.md
@@ -258,6 +258,20 @@ if (!consoleAndAngularClientId.IsNullOrWhiteSpace())
}
```
+Add `impersonation: { userImpersonation: true, tenantImpersonation: true}` object to `oAuthConfig` of `environment` if not exits.
+
+```js
+export const environment = {
+ //Other props..
+ oAuthConfig: {
+ //Other props..
+ impersonation: {
+ userImpersonation: true,
+ tenantImpersonation: true,
+ },
+ },
+```
+
### Blazor WASM
It is currently not supported.
diff --git a/docs/en/modules/cms-kit/index.md b/docs/en/modules/cms-kit/index.md
index ad86be8e04..5c30806028 100644
--- a/docs/en/modules/cms-kit/index.md
+++ b/docs/en/modules/cms-kit/index.md
@@ -17,6 +17,7 @@ The following features are currently available:
* Provides a [**menu**](./menus.md) system to manage public menus dynamically.
* Provides a [**global resources**](./global-resources.md) system to add global styles and scripts dynamically.
* Provides a [**Dynamic Widget**](./dynamic-widget.md) system to create dynamic widgets for page and blog posts.
+* Provides a [**Marked Item**](./marked-items.md) system to mark any kind of resource, like a blog post or a product, as a favorite, starred, flagged, or bookmarked.
> You can click on the any feature links above to understand and learn how to use it.
diff --git a/docs/en/modules/cms-kit/marked-items.md b/docs/en/modules/cms-kit/marked-items.md
new file mode 100644
index 0000000000..b6b0af4173
--- /dev/null
+++ b/docs/en/modules/cms-kit/marked-items.md
@@ -0,0 +1,123 @@
+# CMS Kit: Marked Item System
+
+CMS kit provides a marking system to mark any kind of resource, like a blog post or a product, as a favorite, starred, flagged, or bookmarked.
+
+Marked toggling component allows users to mark your items via pre-defined icons/emojis. Here how the marked toggling components may look like:
+
+
+
+
+you can also customize the marking icons shown in the toggling components.
+
+## Enabling the Marked Item Feature
+
+By default, CMS Kit features are disabled. Therefore, you need to enable the features you want, before starting to use it. You can use the [Global Feature](../../Global-Features.md) system to enable/disable CMS Kit features on development time. Alternatively, you can use the ABP Framework's [Feature System](https://docs.abp.io/en/abp/latest/Features) to disable a CMS Kit feature on runtime.
+
+> Check the ["How to Install" section of the CMS Kit Module documentation](Index.md#how-to-install) to see how to enable/disable CMS Kit features on development time.
+
+## Options
+
+Marking system provides a simple approach to define your entity type with mark types like favorite or starred. For example, if you want to use the marking system for products, you need to define an entity type named `product` with the icon name.
+
+`CmsKitMarkedItemOptions` can be configured in YourModule.cs, in the `ConfigureServices` method of your [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Example:
+
+```csharp
+Configure(options =>
+{
+ options.EntityTypes.Add(
+ new MarkedItemEntityTypeDefinition(
+ "product",
+ StandardMarkedItems.Favorite
+ )
+ );
+});
+```
+
+`CmsKitMarkedItemOptions` properties:
+
+- `EntityTypes`: List of defined entity types (`CmsKitMarkedItemOptions`) in the marking system.
+
+`MarkedItemEntityTypeDefinition` properties:
+
+- `EntityType`: Name of the entity type.
+- `IconName`: The name of the icon.
+
+## The Marked Item widget
+
+The marking system provides a toggle widget to allow users to add/remove the marks from an item. You can place the widget with the item as shown below:
+
+``` csharp
+@await Component.InvokeAsync(typeof (MarkedItemToggleViewComponent), new
+{
+ entityId = "...",
+ entityType = "product",
+ needsConfirmation = true // (optional)
+})
+```
+* `entityType` was explained in the previous section.
+* `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here.
+* `needsConfirmation` An optional parameter to let the user confirm when removing the mark.
+
+# Internals
+
+## Domain Layer
+
+#### Aggregates
+
+This module follows the [Entity Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Entities) guide.
+
+##### UserMarkedItem
+
+A user markedItem represents a user has marking on the item.
+
+- `UserMarkedItem` (aggregate root): Represents a marked item in the system.
+
+#### Repositories
+
+This module follows the [Repository Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories) guide.
+
+Following custom repositories are defined for this feature:
+
+- `IUserMarkedItemRepository`
+
+
+#### Domain services
+
+This module follows the [Domain Services Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services) guide.
+
+##### Marked Item Manager
+
+`MarkedItemManager` is used to perform some operations for the `UserMarkedItem` aggregate root.
+
+### Application layer
+
+#### Application services
+
+- `MarkedItemPublicAppService` (implements `IMarkedItemPublicAppService`): Implements the use cases of marking system.
+
+### Database providers
+
+#### Common
+
+##### Table / collection prefix & schema
+
+All tables/collections use the `Cms` prefix by default. Set static properties on the `CmsKitDbProperties` class if you need to change the table prefix or set a schema name (if supported by your database provider).
+
+##### Connection string
+
+This module uses `CmsKit` for the connection string name. If you don't define a connection string with this name, it fallbacks to the `Default` connection string.
+
+See the [connection strings](https://docs.abp.io/en/abp/latest/Connection-Strings) documentation for details.
+
+#### Entity Framework Core
+
+##### Tables
+
+- CmsUserMarkedItems
+
+#### MongoDB
+
+##### Collections
+
+- **CmsUserMarkedItems**
+
diff --git a/docs/en/modules/docs.md b/docs/en/modules/docs.md
index 6aaf1f2f0a..dc04339e78 100644
--- a/docs/en/modules/docs.md
+++ b/docs/en/modules/docs.md
@@ -367,7 +367,7 @@ You can use [ABP](https://github.com/abpframework/abp/) GitHub documents to conf
For `SQL` databases, you can use the below `T-SQL` command to insert the specified sample into your `DocsProjects` table:
```mssql
-INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName], [ConcurrencyStamp]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'', N'12f21123e08e4f15bedbae0b2d939659')
+INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName], [ConcurrencyStamp]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP (GitHub)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'GitHub', N'{"GitHubRootUrl":"https://github.com/abpframework/abp/tree/{version}/docs","GitHubAccessToken":"","GitHubUserAgent":""}', N'/', N'dev', N'', N'12f21123e08e4f15bedbae0b2d939659')
```
Be aware that `GitHubAccessToken` is masked. It's a private token and you must get your own token and replace the `***` string.
@@ -407,7 +407,7 @@ You can use [ABP](https://github.com/abpframework/abp/) GitHub documents to conf
For `SQL` databases, you can use the below `T-SQL` command to insert the specified sample into your `DocsProjects` table:
```mssql
-INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'')
+INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName], [ConcurrencyStamp]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'', N'12f21123e08e4f15bedbae0b2d939659')
```
Add one of the sample projects above and run the application. In the menu you will see `Documents` link, click the menu link to open the documents page.
@@ -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:
+
+
+
+## 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(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(options =>
+{
+ options.MultiLanguageMode = false;
+});
+```
## See Also
diff --git a/docs/en/modules/openiddict-pro.md b/docs/en/modules/openiddict-pro.md
index b2e1cbdb01..b70cd83ac2 100644
--- a/docs/en/modules/openiddict-pro.md
+++ b/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(options =>
+{
+ options.DisableTransportSecurityRequirement = true;
+});
+```
+
https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption
### Request/Response Process
diff --git a/docs/en/modules/openiddict.md b/docs/en/modules/openiddict.md
index feb4f3bccd..5f421d9001 100644
--- a/docs/en/modules/openiddict.md
+++ b/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(options =>
+{
+ options.DisableTransportSecurityRequirement = true;
+});
+```
+
https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption
### Request/Response Process
diff --git a/docs/en/others/penetration-test-report.md b/docs/en/others/penetration-test-report.md
index 524f3fc9a7..c092a856ea 100644
--- a/docs/en/others/penetration-test-report.md
+++ b/docs/en/others/penetration-test-report.md
@@ -1,6 +1,6 @@
# ABP Penetration Test Report
-The ABP Commercial MVC `v8.2.0` application template has been tested against security vulnerabilities by the [OWASP ZAP v2.14.0](https://www.zaproxy.org/) tool. The demo web application was started on the `https://localhost:44349` address. The below alerts have been reported by the pentest tool. These alerts are sorted by the risk level as high, medium, and low. The informational alerts are not mentioned in this document.
+The ABP Commercial MVC `v8.3.0` application template has been tested against security vulnerabilities by the [OWASP ZAP v2.14.0](https://www.zaproxy.org/) tool. The demo web application was started on the `https://localhost:44349` address. The below alerts have been reported by the pentest tool. These alerts are sorted by the risk level as high, medium, and low. The informational alerts are not mentioned in this document.
Many of these alerts are **false-positive**, meaning the vulnerability scanner detected these issues, but they are not exploitable. It's clearly explained for each false-positive alert why this alert is a false-positive.
@@ -10,14 +10,15 @@ In the next sections, you will find the affected URLs, attack parameters (reques
There are high _(red flag)_, medium _(orange flag)_, low _(yellow flag)_, and informational _(blue flag)_ alerts.
-
-w
+
+
> The informational alerts are not mentioned in this document. These alerts are not raising any risks on your application and they are optional.
### Path Traversal [Risk: High] - False Positive
- *[GET] - https://localhost:44349/api/audit-logging/audit-logs?startTime=&endTime=&url=&userName=&applicationName=&clientIpAddress=&correlationId=&httpMethod=audit-logs&httpStatusCode=&maxExecutionDuration=&minExecutionDuration=&hasException=true&sorting=executionTime+desc&skipCount=0&maxResultCount=10* (attack: **httpMethod=audit-logs**)
- *[POST] - https://localhost:44349/Account/Login* (attack: **\Login**)
+- *[POST] - https://localhost:44349/Account/Register* (attack: **\Register**)
- *[POST] - https://localhost:44349/Account/SecurityLogs* (attack: **\SecurityLogs**)
- *[POST] - https://localhost:44349/Identity/SecurityLogs* (attack: **\SecurityLogs**)
@@ -49,6 +50,18 @@ SQL injection may be possible. SQL injection is a web security vulnerability tha
ABP uses Entity Framework Core and LINQ. **It's safe against SQL Injection because it passes all data to the database via SQL parameters.** LINQ queries are not composed by using string manipulation or concatenation, that's why they are not susceptible to traditional SQL injection attacks. Therefore, this is a **false-positive** alert.
+### SQL Injection - Authentication Bypass [Risk: High] - False Positive
+
+* *[POST] â https://localhost:44349/Account/Login* (attack: **false AND 1=1 --**)
+
+**Description**:
+
+SQL injection may be possible on a login page, potentially allowing the application's authentication mechanism to be bypassed.
+
+**Solution**:
+
+This alert indicates that we must not trust client side input (even if there is client side validation in place) and check all data on the server side. ABP Framework already does that and makes server-side validations while authenticating a user. Therefore this is a **false-positive** alert.
+
### Absence of Anti-CSRF Tokens [Risk: Medium] â False Positive
* *[GET] - https://localhost:44349/Account/LinkUsers/LinkUsersModal?returnUrl=/SettingManagement*
@@ -113,8 +126,8 @@ Configure(options =>
### Format String Error [Risk: Medium] - False Positive
-- *[GET] â https://localhost:44349/Abp/Languages/Switch?culture=ZAP%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%0A&returnUrl=%2F&uiCulture=ar*
-- *[GET] â https://localhost:44349/Abp/ApplicationLocalizationScript?cultureName=ZAP%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%0A*
+- *[GET] â https://localhost:44349/Abp/Languages/Switch?culture=ZAP%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%0A&returnUrl=%2F&uiCulture=ar* (with combination of different parameters)
+- *[GET] â https://localhost:44349/Abp/ApplicationLocalizationScript?cultureName=ZAP%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%25n%25s%0A* (with combination of different parameters)
**Description:**
@@ -148,19 +161,21 @@ Injection using XSL transformations may be possible and may allow an attacker to
**Explanation**:
-This is a **false-positive** alert. v8.2.0 uses .NET 8 and the XSLT transformation is not possible on .NET5 or higher.
+This is a **false-positive** alert. v8.3.0 uses .NET 8 and the XSLT transformation is not possible on .NET5 or higher.
### Application Error Disclosure [Risk: Low] â False Positive
- *[POST] â https://localhost:44349/Account/ImpersonateUser*
+- *[POST] â https://localhost:44349/Saas/Host/Editions*
+- *[POST] â https://localhost:44349/Saas/Host/Tenants*
**Description:**
-The reported page contains an error/warning message that may disclose sensitive information like the location of the file that produced the unhandled exception. This information can be used to launch further attacks against the web application. The alert could be a false positive if the error message is found inside a documentation page.
+The reported pages contain an error/warning message that may disclose sensitive information like the location of the file that produced the unhandled exception. This information can be used to launch further attacks against the web application. The alert could be a false positive if the error message is found inside a documentation page.
**Explanation:**
-This vulnerability was reported as a **positive** alert because the application ran in `Development` mode. ABP Framework throws exceptions for developers in the `Development` environment. We set the environment to `Production` and re-run the test, then the server sent a *500-Internal Error* without the error disclosed. Therefore this alert is **false-positive**. Further information can be found in the following issue: [github.com/abpframework/abp/issues/14177](https://github.com/abpframework/abp/issues/14177#issuecomment-1268206947).
+This vulnerability was reported as a **positive** alert because the application ran in `Development` mode. ABP throws exceptions for developers in the `Development` environment. We set the environment to `Production` and re-run the test, then the server sent a *500-Internal Error* without the error disclosed. Therefore this alert is **false-positive**. Further information can be found in the following issue: [github.com/abpframework/abp/issues/14177](https://github.com/abpframework/abp/issues/14177#issuecomment-1268206947).
### Cookie No `HttpOnly` Flag [Risk: Low] â Positive (No need for a fix)
@@ -326,89 +341,10 @@ The `X-Content-Type-Options` header allows you to avoid MIME type sniffing by sa
You can add the [ABP's Security Header Middleware](../framework/ui/mvc-razor-pages/security-headers.md#security-headers-middleware) into the request pipeline to set the `X-Content-Type-Options` as *no-sniff*. Also, this middleware adds other pre-defined security headers to your application, including `X-XSS-Protection`, `X-Frame-Options` and `Content-Security-Policy` (if it's enabled). Read [Security Headers](../framework/ui/mvc-razor-pages/security-headers.md) documentation for more info.
-## Other Alerts
-
-The following alerts are reported by the community or our customers in v8.1+.
-
-### Disclosed Microsoft Client Secret [Risk: Medium] - Positive (No need for a fix)
-
-* *[GET] â https://localhost:44349/setting-management*
-
-**Description**:
-
-Secrets shall never be exposed to unauthorized parties. This exposure can result from improper storage, insecure transmission, or inadequate access controls. In this specific case the owner of the user account is authorized to read and modify the secret. In case of administrative accounts, it could lead to further damages, by performing lateral movements, by using the credentials to access other services.
-
-**Explanation**:
-
-The endpoint `/setting-management/` requires permission to be visited and can only be accessed via authorized users. It is the setting page to configure the application settings including the *default localization language*, *timezone*, *layout type*, *password settings* and more...
-
-### Incorrect Session Handling â Insufficient Session Termination [Risk: Low] - Positive
-
-* *[GET] â https://localhost:44349/Account/Logout*
-
-**Description**:
-
-Application logout functionality does not terminate the user's session. This increases the risk of unauthorized application access via successful session hijacking attacks, users leaving their computers unattended, and/or a local attacker utilizing the browser history. On logout, user sessions should be invalidated and all relevant session identifiers, authentication tokens and application state information deleted or overwritten both on server and on client side.
-
-**Explanation**:
-
-You can track the status of this case at [github.com/abpframework/abp/issues/19576](https://github.com/abpframework/abp/issues/19576).
-
-### Information Disclosure via Configuration Scripts [Risk: Low] - Positive (No need for a fix)
+## Other Alerts (Fixed)
-- *[GET] â https://localhost:44349/Abp/ApplicationConfigurationScript* or *https://localhost:44349/api/abp/application-configuration*
-- *[GET] â https://localhost:44349/Abp/ServiceProxyScript*
-
-**Description**:
-
-When users authenticate to the application, their browsers issue requests to 2 endpoints that host configuration scripts for the application framework. The first contains information about the passwords that are accepted by the application. This information can be used by the attackers to narrow down their dictionaries and only focus on the possible passwords for their
-attacks. The second, on the other hand, discloses some endpoints that are unavailable to the users with low privileges.
-
-**Explanation**:
-
-* **Application Configuration Script**:
-
- These 2 endpoints are used by ABP application templates. The first one `/Abp/ApplicationConfigurationScript` provides configuration and user based definitions with JSON format. This data is important for SPA based applications to get the current language, localization texts, policies, settings, user info, current tenant or time zone information. This is not a data leak. User specific data can only be accessed after user logon. Other data are application-wide used not dangerous for unauthenticated users. For more information check out the [Application Configuration](../framework/api-development/standard-apis/configuration.md) document.
-
-* **Service Proxy Script**:
-
- This endpoint provides auto-generated JavaScript AJAX call methods for the backend operations. This may disclosure information about the host API methods. On the other hand, it makes easy to consume the HTTP APIs from JavaScript side. ABP Application Services are automatically converted to JavaScript proxies. But it does not mean that these JavaScript methods can be executed anonymously. The attacker still needs to log in to perform operations. For more information check out the [Service Proxy Script](../framework/ui/mvc-razor-pages/dynamic-javascript-proxies.md) document. If you want to disable this functionality, check out [github.com/abpframework/abp/issues/12297](https://github.com/abpframework/abp/issues/12297)
-
-### User E-mail Address Enumeration [Risk: Low] - Positive
-
-* *[GET] â https://localhost:44349/Account/ForgotPassword*
-
-**Description**:
-
-It is possible to collect valid email addresses by interacting with the "Forgot Password" function of the
-application. This vulnerability is useful to increase the efficiency of brute force attacks.
-
-**Explanation**:
-
-If the email is known, it is easier to find the corresponding password. With the "Forgot Password" function, the attacker can enumerate valid email addresses as the function returns `Cannot find the given email` error, when there is no user registered with the provided e-mail address. This vulnerability has been fixed with v8.2, see the related issue for more info: [github.com/abpframework/abp/issues/19588](https://github.com/abpframework/abp/issues/19588).
-
-### Software Version Disclosure [Risk: Low] - Positive (No need for a fix)
-
-* *[GET] â https://localhost:44349/*
-
-**Description**:
-
-The assessed web server discloses its version number within the HTTP response headers. This information facilitates attackers in planning future attacks and can be used in the automation of the attack process. It is unnecessary to share this information with the clients of the web application. The vulnerability can be verified by issuing HTTP requests and inspecting HTTP response headers. HTTP header "Server" contains the version information.
-The following header was received in server responses: `Server: Microsoft-IIS/10.0` or `Server: Microsoft-HTTPAPI/2.0`.
-
-**Explanation**:
-
-This is not directly related to ABP. It's a header added by the IIS server. So you can disable this header with the `web.config` file:
-
-```xml
-
-
-
-
-
-
-
-
-```
+The following alerts were reported by the community or our customers in v8.2 and fixed:
-The following issue has been opened for this vulnerability, you can follow it at [github.com/abpframework/abp/issues/19589](https://github.com/abpframework/abp/issues/19589).
\ No newline at end of file
+* https://github.com/abpframework/abp/issues/19576
+* https://github.com/abpframework/abp/issues/19588
+* https://github.com/abpframework/abp/issues/19589
diff --git a/docs/en/release-info/migration-guides/abp-8-2.md b/docs/en/release-info/migration-guides/abp-8-2.md
index cd904f052e..15de922d4f 100644
--- a/docs/en/release-info/migration-guides/abp-8-2.md
+++ b/docs/en/release-info/migration-guides/abp-8-2.md
@@ -16,9 +16,6 @@ This document is a guide for upgrading ABP v8.x solutions to ABP v8.2. There are
Before this version, all of the projects above were targeting multiple frameworks (**netstandard2.0**, **netstandard2.1** and **net8.0**), with this version, we started to only target **net8.0** for these template projects. Note that, all other shared libraries still target multiple frameworks.
> This change should not affect your pre-existing solutions and you don't need to make any changes in your application. See the PR for more info: https://github.com/abpframework/abp/pull/19565
-## Upgraded AutoMapper to 13.0.1
-
-In this version, **AutoMapper** library version upgraded to 13.0.1. See [the release notes of AutoMapper v13.0.1](https://github.com/AutoMapper/AutoMapper/releases/tag/v13.0.1) for more information.
## Added default padding to `.tab-content` class for Basic Theme
@@ -60,4 +57,62 @@ In this version, the Angular UI has been updated to use the Angular version 17.3
The **Session Management** feature allows you to prevent concurrent login and manage user sessions.
-In this version, a new entity called `IdentitySession` has been added to the framework and you should create a new migration and apply it to your database.
\ No newline at end of file
+In this version, a new entity called `IdentitySession` has been added to the framework and you should create a new migration and apply it to your database.
+
+## Upgraded NuGet Dependencies
+
+You can see the following list of NuGet libraries that have been upgraded with this release, if you are using one of these packages explicitly, you may consider upgrading them in your solution:
+
+| Package | Old Version | New Version |
+| ---------------------------------------------------------- | ----------- | ----------- |
+| AutoMapper | 12.0.1 | 13.0.1 |
+| Blazorise | 1.4.1 | 1.5.2 |
+| Blazorise.Bootstrap5 | 1.4.1 | 1.5.2 |
+| Blazorise.Icons.FontAwesome | 1.4.1 | 1.5.2 |
+| Blazorise.Components | 1.4.1 | 1.5.2 |
+| Blazorise.DataGrid | 1.4.1 | 1.5.2 |
+| Blazorise.Snackbar | 1.4.1 | 1.5.2 |
+| Hangfire.AspNetCore | 1.8.6 | 1.8.14 |
+| Hangfire.SqlServer | 1.8.6 | 1.8.14 |
+| Microsoft.AspNetCore.Authentication.JwtBearer | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Authentication.OpenIdConnect | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Authorization | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Components | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Components.Authorization | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Components.Web | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Components.WebAssembly | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Components.WebAssembly.Server | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Components.WebAssembly.Authentication | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Components.WebAssembly.DevServer | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.DataProtection.StackExchangeRedis | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Mvc.NewtonsoftJson | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.Mvc.Testing | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.TestHost | 8.0.0 | 8.0.4 |
+| Microsoft.AspNetCore.WebUtilities | 8.0.0 | 8.0.4 |
+| Microsoft.Data.SqlClient | 8.0.0 | 8.0.4 |
+| Microsoft.EntityFrameworkCore | 8.0.0 | 8.0.4 |
+| Microsoft.EntityFrameworkCore.Design | 8.0.0 | 8.0.4 |
+| Microsoft.EntityFrameworkCore.InMemory | 8.0.0 | 8.0.4 |
+| Microsoft.EntityFrameworkCore.Proxies | 8.0.0 | 8.0.4 |
+| Microsoft.EntityFrameworkCore.Relational | 8.0.0 | 8.0.4 |
+| Microsoft.EntityFrameworkCore.Sqlite | 8.0.0 | 8.0.4 |
+| Microsoft.EntityFrameworkCore.SqlServer | 8.0.0 | 8.0.4 |
+| Microsoft.EntityFrameworkCore.Tools | 8.0.0 | 8.0.4 |
+| Microsoft.Extensions.DependencyInjection.Abstractions | 8.0.0 | 8.0.1 |
+| Microsoft.Extensions.FileProviders.Embedded | 8.0.0 | 8.0.4 |
+| Microsoft.Extensions.Logging.Abstractions | 8.0.0 | 8.0.1 |
+| Microsoft.Extensions.Options | 8.0.0 | 8.0.2 |
+| Microsoft.IdentityModel.Protocols.OpenIdConnect | - | 7.5.1 |
+| Microsoft.IdentityModel.Tokens | - | 7.5.1 |
+| Microsoft.IdentityModel.JsonWebTokens | - | 7.5.1 |
+| System.IdentityModel.Tokens.Jwt | - | 7.5.1 |
+| OpenIddict.Abstractions | 5.1.0 | 5.5.0 |
+| OpenIddict.Core | 5.1.0 | 5.5.0 |
+| OpenIddict.Server.AspNetCore | 5.1.0 | 5.5.0 |
+| OpenIddict.Validation.AspNetCore | 5.1.0 | 5.5.0 |
+| OpenIddict.Validation.ServerIntegration | 5.1.0 | 5.5.0 |
+| Oracle.EntityFrameworkCore | 8.21.121 | 8.23.40 |
+| Pomelo.EntityFrameworkCore.MySql | 8.0.0 | 8.0.2 |
+| SixLabors.ImageSharp | 3.0.2 | 3.1.4 |
+
diff --git a/docs/en/release-info/migration-guides/abp-8-3.md b/docs/en/release-info/migration-guides/abp-8-3.md
new file mode 100644
index 0000000000..50a7f274a4
--- /dev/null
+++ b/docs/en/release-info/migration-guides/abp-8-3.md
@@ -0,0 +1,68 @@
+# ABP Version 8.3 Migration Guide
+
+This document is a guide for upgrading ABP v8.x solutions to ABP v8.3. There are some changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application.
+
+## Open-Source (Framework)
+
+### Added `AdminUserName` parameter to `IIdentityDataSeeder.SeedAsync` method
+
+Prior to this version, `IIdentityDataSeeder.SeedAsync` was used to seed the initial user data with the `admin` as the username, to be able to easily test all applications with all permissions granted.
+
+In this version on, we allow you to set the default **adminUserName**. So, you can set the default user name to any name you want or leave it as it is and let the username be `admin` as before.
+
+For example, in the `MyProjectNameDbMigrationService.SeedDataAsync` method (under the domain project's **Data** folder), you can pass the username as below:
+
+```diff
+ private async Task SeedDataAsync(Tenant? tenant = null)
+ {
+ Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed...");
+
+ await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id)
+ .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue)
+ .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue)
++ .WithProperty(IdentityDataSeedContributor.AdminUserNamePropertyName, "your-admin-user-name")
+ );
+ }
+```
+
+Normally, you don't need to make any changes in your code related to this change. However, if you used the `IIdentityDataSeeder.SeedAsync` method in your application, now also gets additional (and optional) `adminUserName` parameter that you can pass the value on.
+
+See the PR for more info: https://github.com/abpframework/abp/pull/20131/
+
+### Docs Module: Improvements & Single Project Mode Support
+
+In this version, we made some improvements in the [Docs Module](../../modules/docs.md) and introduced single project mode, which allows you to use a single project name for all of your documents.
+
+While implementing this new feature, we made some small changes to the existing classes. For example, the constructor methods of the following classes have been changed, and need to be updated in your code, if you use them:
+
+* `TreeTagHelper.cs`: https://github.com/abpframework/abp/pull/19419/files#diff-e0fb91c1b564d61dedf9dfc60d08e7e0af57b433797fcb3bd664f3fd4768ea0d
+
+* `MarkdownDocumentToHtmlConverter.cs`: https://github.com/abpframework/abp/pull/19419/files#diff-948e25b2d8851576888f8053b5f2c9416e23576aff95a88ef8ec8ca2841b3622
+
+See the PR for more info: https://github.com/abpframework/abp/pull/19419
+
+### Updated `datatables.net` to 2.0.2
+
+In this version, the `datatables.net` library version was updated from v1.11.4 to v2.0.2. We made all related changes at the framework level and updated the dependency and its resource mapping configurations. Also, we made it backward compatible so it should not directly affect your application.
+
+However, notice this package is used by the `@abp/aspnetcore.mvc.ui.theme.shared` package, which is used by the official themes. Therefore, if you used any methods from the **datatables.net** library it might be already deprecated or removed.
+
+See the PR for more info: https://github.com/abpframework/abp/pull/19340
+
+### Angular UI
+
+We wish to formally inform you that ABP version 8.3 has been upgraded to incorporate Angular version 18. Consequently, we recommend migrating your application to [Angular v18](https://angular.dev/update-guide) to ensure compatibility.
+
+## PRO
+
+> Please check the **Open-Source (Framework)** section before reading this section. The listed topics might affect your application and you might need to take care of them.
+
+If you are a paid-license owner and using the ABP's paid version, then please follow the following sections to get informed about the breaking changes and apply the necessary ones:
+
+### Added RegEx Support to CMS Kit's (PRO) URL Forwarding System
+
+ABP provides a [URL Forwarding System](../../modules/cms-kit-pro/url-forwarding.md), which allows you to create URLs that redirect to other pages or external websites. Prior to this version, the URL Forwarding System was only working for static URLs and didn't support RegEx. In this version, we introduced the RegEx support for the URL Forwarding System and now you can pass regular expressions for not static URLs.
+
+Since a new property has been added to the `CmsShortenedUrl` entity, you should create a new migration and apply it to your database.
+
+> After creating a new migration and applying it to your database, typically you don't need to make any changes, however, if you have overridden a page/method or class related to the URL Forwarding System, you might need to update it accordingly. For this purpose, you can get the source code of the [CMS Kit Module's](../../modules/cms-kit-pro/index.md) and update the related parts in your application.
\ No newline at end of file
diff --git a/docs/en/release-info/migration-guides/index.md b/docs/en/release-info/migration-guides/index.md
index 6670e9ba3a..804b17b376 100644
--- a/docs/en/release-info/migration-guides/index.md
+++ b/docs/en/release-info/migration-guides/index.md
@@ -2,6 +2,7 @@
The following documents explain how to migrate your existing ABP applications. We write migration documents only if you need to take an action while upgrading your solution. Otherwise, you can easily upgrade your solution using the [abp update command](../upgrading.md).
+- [8.x to 8.3](abp-8-3.md)
- [8.1 to 8.2](abp-8-2.md)
- [8.0 to 8.1](abp-8-1.md)
- [7.x to 8.0](abp-8-0.md)
diff --git a/docs/en/release-info/release-notes.md b/docs/en/release-info/release-notes.md
index d091a5840b..b10282bba7 100644
--- a/docs/en/release-info/release-notes.md
+++ b/docs/en/release-info/release-notes.md
@@ -2,13 +2,20 @@
This document contains **brief release notes** for each release. Release notes only include **major features** and **visible enhancements**. They don't include all the development done in the related version. To see raw and detailed change logs for every release, please check the related milestone and [the change logs page](https://abp.io/pro-releases) (only for paid license holders).
-> If you want to read detailed release posts for each version, please see the [official ABP blog](https://abp.io/blog).
+> If you want to read the release notes for each ABP Studio release, check it out from [here](../studio/release-notes.md).
-## 8.2 (2024-05-25)
+## 8.3 (2024-09-05)
-> This version is currently in preview. The final release date is planned for July, 2024.
+See the detailed **[blog post / announcement](https://abp.io/blog/announcing-abp-8-3-stable-release)** for the v8.3 release.
-See the detailed **[blog post / announcement](https://abp.io/blog/announcing-abp-8-2-release-candidate)** for the v8.2 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).
diff --git a/docs/en/release-info/road-map.md b/docs/en/release-info/road-map.md
index 6c14efefda..82da0a0b8e 100644
--- a/docs/en/release-info/road-map.md
+++ b/docs/en/release-info/road-map.md
@@ -4,55 +4,119 @@ This document provides a road map, release schedule, and planned features for th
## Next Versions
-### v8.3
-
-The next version will be 8.3 and we will be mostly working on the following topics:
-
-* CMS Kit: Marked Items/Favorites & Approvement System for Comments
-* Docs Module: Added Google Translation Support & Introducing the Single Project Mode
-* Using DBFunction for Global Query Filters
-* Upgrade Angular Version to v18.1.x
-* Improvements on the existing features and provide more guides...
-
-See the [8.3 milestone](https://github.com/abpframework/abp/milestone/106) for all the issues we've planned to work on.
+### v9.0
+
+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:
+
+* Framework
+ * Upgrading to .NET 9.0
+ * Google Cloud Storage BLOB Provider
+ * Better handling localization resources in a microservice scenario
+ * SSR support for the Angular UI
+ * Upgrading 3rd-party dependencies
+
+* ABP Suite
+ * Multiple navigation properties to the same target entity
+ * Define navigation properties without target string property dependency
+ * Improvements one-to-many scenarios
+ * Access to default code generation templates for customized templates
+
+* ABP Studio
+ * Blazor WebApp UI option for the new startup templates
+ * Execution order (dependency management) for Solution Runner
+ * Automate more details on new service creation for a microservice solution
+ * Support multiple concurrent Kubernetes deployment/integration scenarios
+ * Show the README file when you create a new solution or open an existing solution
+ * Improve ABP Suite code-generation possibilities for microservice solutions
+ * Improve the module installation experience
+ * Auto-install 3rd-party dependencies
+ * Better handle long log files
+ * Allow to directly create new solutions with ABP's RC (Release Candidate) versions
+ * Support Intel processors for Mac computers, support ARM chipset for Windows and support Linux OS
+ * Improve client proxy generation experience
+
+* Application modules
+ * Account module: Support mixed social/local login scenarios
+ * UI/UX improvements on existing application modules
+
+* New tutorials
+ * Modular monolith development
+ * Microservice development
## Backlog Items
-The *Next Versions* section above shows the main focus of the planned versions. However, in each release, we add new features to the core framework and the [application modules](../modules).
-
-Here is a list of major items in the backlog we are considering working on in the next versions.
+The *Next Versions* section above shows the main focus of the planned versions. However, in each release, we add new features to the ABP platform.
### Framework
-* [#86](https://github.com/abpframework/abp/issues/86) / GrapQL Integration
+The ABP framework is [open source](https://github.com/abpframework/abp) and free for everyone. You can see its [public backlog](https://github.com/abpframework/abp/milestone/2). Here, are some of the important features you can expect from next versions:
+
* [#236](https://github.com/abpframework/abp/issues/236) / Resource based authorization system
-* [#2882](https://github.com/abpframework/abp/issues/2882) / Providing a gRPC integration infrastructure (while it is [already possible](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) to create or consume gRPC endpoints for your application, we plan to create endpoints for the [standard application modules](../modules))
+* [#2882](https://github.com/abpframework/abp/issues/2882) / Providing a gRPC integration infrastructure (while it is [already possible](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) to create or consume gRPC endpoints for your application, we plan to create endpoints for the [standard application modules](../modules/index.md))
* [#57](https://github.com/abpframework/abp/issues/57) / Built-in CQRS infrastructure
+* [#58](https://github.com/abpframework/abp/issues/58) / Content localization system (multilingual entities)
* [#4223](https://github.com/abpframework/abp/issues/4223) / WebHook system
* [#162](https://github.com/abpframework/abp/issues/162) / Azure ElasticDB Integration for multitenancy
* [#2296](https://github.com/abpframework/abp/issues/2296) / Feature toggling infrastructure
-* [#16342](https://github.com/abpframework/abp/issues/16342) / CMS Kit: Meta information for SEO
-* [#16260](https://github.com/abpframework/abp/issues/16260) / GCP Blob Storage Provider
* [#15932](https://github.com/abpframework/abp/issues/15932) / Introduce ABP Diagnostics Module
-* [#16756](https://github.com/abpframework/abp/issues/16756) / Blob Storing - Provider configuration UI
* [#16744](https://github.com/abpframework/abp/issues/16744) / State Management API
-
-### Modules / Themes
-
-* New styles, components and features for the LeptonX theme.
-* Payment module: Invoice system.
-* 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.
-
-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.
+* [#17815](https://github.com/abpframework/abp/issues/17815) / Operation Rate Limiting
+
+### Application Modules / UI Themes
+
+ABP Platform provides many (free and commercial) [pre-built application modules](../modules/index.md) and modern [UI themes](../ui-themes/index.md). In every release, many enhancements and bugfixes are already done on the existing modules. In addition, here some of the planned features for next versions:
+
+* LeptonX theme: New layouts, styles and components
+* CMS Kit module: Meta information for SEO, media gallery, RSS feed, content versioning, social media streams
+* Identity module: Idle session warning
+* Payment module: Invoice system
+* New module: User notification
+* New module: Dynamic dashboard
+* New module: User guiding
+* New module: Keycloak integration
+
+### ABP Studio
+
+[ABP Studio](../studio/index.md) is a cross-platform desktop application for ABP and .NET developers to simplify and automate daily tasks of developers. It has a community (free) edition as well as commercial editions. It is released and versioned independently from the ABP platform and frequently released.
+
+Here, are some of the important planned features for next ABP Studio versions:
+
+* Theme builder for the LeptonX theme
+* Analyze user solutions to explore entities, domain services, application services, pages and other fundamental objects.
+* Add status bar to the built-in browser to easily see errors
+* Swagger authentication support for the built-in browser
+* Show related requests/events (traces) together in the solution runner panel
+* Integrate common tool dashboards into ABP Studio (such a Garana, Redis, RabbitMQ, Kibana, etc)
+* Built-in command terminal
+* Automate all steps of new service creation for microservice solutions
+* Container application type support for Solution Runner (to individually control docker dependencies)
+* More options while creating new solutions
+* Downloading samples in ABP studio
+* Built-in ABP documentation experience
+* Auto-execute terminal commands in markdown files
+* Compare changed on the startup templates when a new ABP version is published
+* Remove unused projects while downloading source code of an existing module
+* Testing/hosting applications for module templates
+* Easily explore all module and package dependencies of a large solution
+* Built-in deployment options
+* Rapid application development features
+* ABP support integration
+
+### ABP Suite
+
+[ABP Suite](../suite/index.md) is a GUI application that is mainly used to generate CRUD style pages in your application. You define your entity and it can generate all the code from the database layer to the UI layer. The generated code is clean and a perfect starting point to implement your custom requirements on top of it.
+
+Here, are some of the important planned features for next ABP Suite versions:
+
+* Handle image properties for entities
+* Allow to define extra properties for DTOs those are not a part of the entity
+* Allow to create pages instead of modals for CRUD page generation
+* View-only (detail view) modal/page for an entity
+* Export child/detail entity records as a part of export operation for a main (master) entity
+* Allow to accept attachments (files) for an entity
+* Allow to add custom entity actions for an entity
+* Allow to inherit from an existing entity class
+* Custom form layouts on CRUD page generation
## Feature Requests
diff --git a/docs/en/samples/index.md b/docs/en/samples/index.md
index 619eb81484..793a777ad1 100644
--- a/docs/en/samples/index.md
+++ b/docs/en/samples/index.md
@@ -1,22 +1,34 @@
-# Sample Applications
+# ABP Samples
Here, a list of official samples built with ABP.
+## Event Hub
+
+A reference application built with ABP. It implements the Domain Driven Design with multiple application layers.
+
+* [Live demo](https://www.openeventhub.com/)
+* [Source code](https://github.com/abpframework/eventhub)
+
## eShopOnAbp
Reference microservice solution built with ABP and .NET.
+* [Live demo](https://www.eshoponabp.com/)
* [Source code](https://github.com/abpframework/eShopOnAbp)
-## Event Hub
+## CMS Kit Demo
-A reference application built with ABP. It implements the Domain Driven Design with multiple application layers.
+A minimal example website built with the [CMS Kit module](../modules/cms-kit/index.md).
-* [Source code](https://github.com/abpframework/eventhub)
+* [Live demo](https://cms-kit-demo.abpdemo.com/)
+* [Source code](https://github.com/abpframework/cms-kit-demo)
## Easy CRM
-A middle-size CRM application built with ABP. [Click here](easy-crm.md) to see the details.
+A middle-size CRM application built with ABP.
+
+* [Live demo](http://easycrm.abp.io/)
+* [Click here](easy-crm.md) to see the details and download the source code.
## Book Store
diff --git a/docs/en/solution-templates/application-module/index.md b/docs/en/solution-templates/application-module/index.md
index a54747dc15..857b4ed936 100644
--- a/docs/en/solution-templates/application-module/index.md
+++ b/docs/en/solution-templates/application-module/index.md
@@ -15,17 +15,25 @@ dotnet tool install -g Volo.Abp.Studio.Cli
Then use the `abp new` command in an empty folder to create a new solution:
```bash
-abp new Acme.IssueManagement -t module
+abp new-module Acme.BookStore
```
- `Acme.IssueManagement` is the solution name, like *YourCompany.YourProduct*. You can use single level, two-levels or three-levels naming.
-### Without User Interface
+### Specifying the User Interface
-The template comes with MVC, Blazor & Angular user interfaces by default. You can use `--no-ui` option to not include any of these UI layers.
+The template comes without a user interface by default. You can use the `mvc`, `blazor`, `blazor-server`, or `angular` options to include any of these UI layers. You can also combine them. For example, you can use `mvc,angular` to include both MVC and Angular UI. To create a module without a user interface, don't specify any value.
````bash
-abp new Acme.IssueManagement -t module --no-ui
+abp new-module Acme.IssueManagement -u mvc,angular
+````
+
+#### Specifying the Database Provider
+
+The template comes with the *EntityFrameworkCore* database provider by default. You can use the `ef` or `mongodb` options to include either of these providers. You can also combine them. For example, you can use `ef,mongodb` to include both EntityFrameworkCore and MongoDB.
+
+````bash
+abp new-module Acme.IssueManagement -d ef,mongodb
````
## Solution Structure
@@ -34,11 +42,10 @@ Based on the options you've specified, you will get a slightly different solutio

-Projects are organized as `src`, `test` and `host` folders:
+Projects are organized as `src` and`test` folders:
* `src` folder contains the actual module which is layered based on [DDD](../../framework/architecture/domain-driven-design) principles.
* `test` folder contains unit & integration tests.
-* `host` folder contains applications with different configurations to demonstrate how to host the module in an application. These are not a part of the module, but useful on development.
The diagram below shows the layers & project dependencies of the module:
@@ -105,8 +112,6 @@ The solution has multiple test projects, one for each layer:
- `.MongoDB.Tests` is used to test MongoDB configuration and custom repositories.
- `.TestBase` is a base (shared) project for all tests.
-In addition, `.HttpApi.Client.ConsoleTestApp` is a console application (not an automated test project) which demonstrate the usage of HTTP APIs from a Dotnet application.
-
Test projects are prepared for integration testing;
- It is fully integrated to ABP and all services in your application.
@@ -117,49 +122,9 @@ You can still create unit tests for your classes which will be harder to write (
> Domain & Application tests are using EF Core. If you remove EF Core integration or you want to use MongoDB for testing these layers, you should manually change project references & module dependencies.
-### Host Projects
-
-The solution has a few host applications to run your module. Host applications are used to run your module in a fully configured application. It is useful on development. Host applications includes some other modules in addition to the module being developed:
-
-Host applications support two types of scenarios.
-
-#### Single (Unified) Application Scenario
-
-If your module has a UI, then `.Web.Unified` application is used to host the UI and API on a single point. It has its own `appsettings.json` file (that includes the database connection string) and EF Core database migrations.
-
-For the `.Web.Unified` application, there is a single database, named `YourProjectName_Unified` (like *IssueManagement_Unified* for this sample).
-
-> If you've selected the `--no-ui` option, this project will not be in your solution.
-
-##### How to Run?
-
-Set `host/YourProjectName.Web.Unified` as the startup project, run `Update-Database` command for the EF Core from Package Manager Console and run your application. Default username is `admin` and password is `1q2w3E*`.
-
-#### Separated Deployment & Databases Scenario
-
-In this scenario, there are three applications;
-
-* `.AuthServer` application is an authentication server used by other applications. It has its own `appsettings.json` that contains database connection and other configurations.
-* `.HttpApi.Host` hosts the HTTP API of the module. It has its own `appsettings.json` that contains database connections and other configurations.
-* `.Web.Host` host the UI of the module. This project contains an `appsettings.json` file, but it does not have a connection string because it never connects to the database. Instead, it mainly contains endpoint of the remote API server and the authentication server.
-
-The diagram below shows the relation of the applications:
-
-
-
-`.Web.Host` project uses OpenId Connect Authentication to get identity and access tokens for the current user from the `.AuthServer`. Then uses the access token to call the `.HttpApi.Host`. HTTP API server uses bearer token authentication to obtain claims from the access token to authorize the current user.
-
-##### Pre-requirements
-
-* [Redis](https://redis.io/): The applications use Redis as as distributed cache. So, you need to have Redis installed & running.
-
-##### How to Run?
-
-You should run the application with the given order:
+### Host Project
-- First, run the `.AuthServer` since other applications depends on it.
-- Then run the `.HttpApi.Host` since it is used by the `.Web.Host` application.
-- Finally, you can run the `.Web.Host` project and login to the application using `admin` as the username and `1q2w3E*` as the password.
+The solution doesn't have a host application to run your module. However, you can create a [single-layer](../../get-started/single-layer-web-application.md) or [layered](../../get-started/layered-web-application.md) application and [import](../../studio/solution-explorer.md#imports) the created module into the host application.
## UI
@@ -172,7 +137,7 @@ The solution will have a folder called `angular` in it. This is where the Angula
* _angular/projects/issue-management_ folder contains the Angular module project.
* _angular/projects/dev-app_ folder contains a development application that runs your module.
-The server-side is similar to the solution described above. `*.HttpApi.Host` project serves the API and the `Angular` demo application consumes it. You will not need to run the `.Web.Host` project though.
+The server-side is similar to the solution described above. After you create a *Host* application, the API and the `Angular` demo application consume it.
#### How to Run the Angular Development App
@@ -195,9 +160,10 @@ The module you will develop depends on two of these ABP packages: _@abp/ng.core_
Once all dependencies are installed, follow the steps below to serve your development app:
-1. Make sure `.AuthServer` and `*.HttpApi.Host` projects are up and running.
-2. Open your terminal at the root folder, i.e. `angular`.
-3. Run `yarn start` or `npm start`.
+1. Make sure *Host* application project is up and running.
+2. Change the `environment.ts` file in the `angular/projects/dev-app/src/environments` folder to match your *Host* application URL.
+3. Open your terminal at the root folder, i.e. `angular`.
+4. Run `yarn start` or `npm start`.

diff --git a/docs/en/solution-templates/microservice/adding-new-api-gateways.md b/docs/en/solution-templates/microservice/adding-new-api-gateways.md
index a026f6e884..415452a3bd 100644
--- a/docs/en/solution-templates/microservice/adding-new-api-gateways.md
+++ b/docs/en/solution-templates/microservice/adding-new-api-gateways.md
@@ -155,12 +155,6 @@ We should configure the AuthServer for **CORS** and **RedirectAllowedUrls**.
}
```
-### Add the New Gateway to the Solution Runner
-
-We should add the new gateway to the solution runner [profile](../../studio/running-applications.md#profile) for running applications in the ABP Studio. You can follow the steps explained in the [Solution Runner](../../studio/running-applications.md#c-application) document to add the new gateway to the solution runner profile. Afterwards, you can start the new gateway by selecting it in the solution runner.
-
-
-
## Creating Helm Chart for the New Gateway
If you want to deploy the new gateway to Kubernetes, you should create a Helm chart for the new application.
diff --git a/docs/en/solution-templates/microservice/adding-new-applications.md b/docs/en/solution-templates/microservice/adding-new-applications.md
index 7e3a53cbae..352b18f763 100644
--- a/docs/en/solution-templates/microservice/adding-new-applications.md
+++ b/docs/en/solution-templates/microservice/adding-new-applications.md
@@ -120,12 +120,6 @@ Add the new application URL to the `appsettings.json` file in the `Identity` ser
}
```
-### Add the New Application to the Solution Runner
-
-We should add the new application to the solution runner [profile](../../studio/running-applications.md#profile) for running applications in the ABP Studio. You can follow the steps explained in the [Solution Runner](../../studio/running-applications.md#c-application) document to add the new application to the solution runner profile. Afterwards, you can start the new application by selecting it in the solution runner.
-
-
-
## Docker Configuration for Prometheus
If you want to monitor the new application with Prometheus when you debug the solution, you should add the new application to the `prometheus.yml` file in the `etc/docker/prometheus` folder. You can copy the configurations from the existing applications and modify them according to the new application. Below is an example of the `prometheus.yml` file for the `WebPublic` application.
diff --git a/docs/en/solution-templates/microservice/adding-new-microservices.md b/docs/en/solution-templates/microservice/adding-new-microservices.md
index 2ff864cd0d..9cb482c552 100644
--- a/docs/en/solution-templates/microservice/adding-new-microservices.md
+++ b/docs/en/solution-templates/microservice/adding-new-microservices.md
@@ -16,6 +16,8 @@ This document explains how to add new microservices to the microservice solution
Additionally, there is a folder named `_templates` in the root directory. This folder contains templates you can use to create new microservices, API gateways, and applications. These templates can be customized according to your needs.
+
+
## Adding a New Microservice
To add a new microservice to the solution, you can use the `service_nolayers` template. This template creates a new ASP.NET Core application with the necessary configurations and dependencies. Follow the steps below to add a new microservice:
@@ -32,6 +34,11 @@ Select the database provider and click the `Create` button.

+When you create a new microservice, you can choose to enable integration with the current solution. If you check *Enable integration*, the new microservice is added to the solution, and the necessary configurations are made automatically, so no manual configuration is needed. If you uncheck the *Enable integration* option, you will need to manually configure the new microservice. You can follow the steps in this documentation, starting from the [Configuring the appsettings.json](#configuring-the-appsettingsjson) section.
+
+
+
+
The new microservice is created and added to the solution. You can see the new microservice in the `services` folder.

@@ -39,14 +46,12 @@ The new microservice is created and added to the solution. You can see the new m
### Configuring the appsettings.json
The new microservice is created with the necessary configurations and dependencies. We should configure several sections by modifying the `appsettings.json` file:
- * Set the `Administration` & `AbpBlobStoring` connection strings.
- * Set the correct `StringEncryption` key.
* Set the `CorsOrigins` to allow the web gateway to access the microservice.
* Set the `AuthServer` configurations to enable the microservice to authenticate and authorize users.
You can copy the configurations from the existing microservices and modify them according to the new microservice. Below is an example of the `appsettings.json` file for the `ProductService` microservice.
-```json
+```diff
{
"ConnectionStrings": {
"Administration": "Server=localhost,1434; User Id=sa; Password=myPassw@rd; Database=Bookstore_Administration; TrustServerCertificate=true",
@@ -54,15 +59,18 @@ You can copy the configurations from the existing microservices and modify them
"ProductService": "Server=localhost,1434; User Id=sa; Password=myPassw@rd; Database=Bookstore_ProductService; TrustServerCertificate=true"
},
"App": {
- "CorsOrigins": "http://localhost:44333",
+- "CorsOrigins": "http://localhost:webgateway_port",
++ "CorsOrigins": "http://localhost:44333",
"EnablePII": false
},
"Swagger": {
"IsEnabled": true
},
"AuthServer": {
- "Authority": "http://localhost:44387",
- "MetaAddress": "http://localhost:44387",
+- "Authority": "http://localhost:authserver_port",
+- "MetaAddress": "http://localhost:authserver_port",
++ "Authority": "http://localhost:44387",
++ "MetaAddress": "http://localhost:44387",
"RequireHttpsMetadata": "false",
"SwaggerClientId": "SwaggerTestUI",
"Audience": "ProductService"
@@ -93,24 +101,24 @@ You can copy the configurations from the existing microservices and modify them
"Url": "http://localhost:9200"
},
"StringEncryption": {
- "DefaultPassPhrase": "PDAWjbshpwlOwNB6"
+ "DefaultPassPhrase": "PDAWjbshpwlOwNB6"
}
}
```
### Configuring the OpenId Options
-We should configure the OpenId options by modifying the `OpenIddictDataSeeder` in the `Identity` service. Below is an example of the `OpenIddictDataSeeder` options for the `ProductService` microservice.
+We should configure the OpenId options by modifying the `OpenIddictDataSeeder` in the `Identity` service. Below is an example of the `OpenIddictDataSeeder` options for the `Product` microservice.
Create API scopes and add the required API scope for Swagger clients in the `CreateApiScopesAsync` and `CreateSwaggerClientsAsync` methods in the `OpenIddictDataSeeder` class.
-```csharp
+```diff
private async Task CreateApiScopesAsync()
{
await CreateScopesAsync("AuthServer");
await CreateScopesAsync("IdentityService");
await CreateScopesAsync("AdministrationService");
- await CreateScopesAsync("ProductService"); // new service
++ await CreateScopesAsync("ProductService");
}
private async Task CreateSwaggerClientsAsync()
@@ -120,21 +128,21 @@ private async Task CreateSwaggerClientsAsync()
"AuthServer",
"IdentityService",
"AdministrationService",
- "ProductService" // new service
++ "ProductService"
});
}
```
Add the redirect URL for the new service in the `CreateSwaggerClientAsync` method.
-```csharp
+```diff
private async Task CreateSwaggerClientAsync(string clientId, string[] scopes)
{
...
...
...
var administrationServiceRootUrl = _configuration["OpenIddict:Resources:AdministrationService:RootUrl"]!.TrimEnd('/');
- var productServiceServiceRootUrl = _configuration["OpenIddict:Resources:ProductService:RootUrl"]!.TrimEnd('/'); // new service
++ var productServiceRootUrl = _configuration["OpenIddict:Resources:ProductService:RootUrl"]!.TrimEnd('/');
await CreateOrUpdateApplicationAsync(
name: clientId,
@@ -152,15 +160,15 @@ private async Task CreateSwaggerClientAsync(string clientId, string[] scopes)
$"{authServerRootUrl}/swagger/oauth2-redirect.html",
$"{identityServiceRootUrl}/swagger/oauth2-redirect.html",
$"{administrationServiceRootUrl}/swagger/oauth2-redirect.html",
- $"{productServiceServiceRootUrl}/swagger/oauth2-redirect.html", // new service
++ $"{productServiceRootUrl}/swagger/oauth2-redirect.html"
}
);
}
```
-Add the allowed scope for the web (front-end) application(s) in the `CreateClientsAsync` method. You might have different clients for different UI applications such as web, Angular, React, etc. Ensure you add the new service to the allowed scopes of these clients.
+Add the allowed scope for the web (front-end) application(s) in the `CreateClientsAsync` method. You might have different clients for different UI applications such as web, Angular, React, etc. Ensure you add the new microservice to the allowed scopes of these clients.
-```csharp
+```diff
private async Task CreateClientsAsync()
{
var commonScopes = new List
@@ -192,7 +200,7 @@ private async Task CreateClientsAsync()
"SaasService",
"AuditLoggingService",
"AdministrationService",
- "ProductService" // new service
++ "ProductService"
}).ToList(),
redirectUris: new List { $"{webClientRootUrl}signin-oidc" },
postLogoutRedirectUris: new List() { $"{webClientRootUrl}signout-callback-oidc" },
@@ -202,110 +210,130 @@ private async Task CreateClientsAsync()
}
```
-Add the new service URL to the `appsettings.json` file in the `Identity` service.
+Add the new service URL to the `appsettings.json` file in the `Identity` microservice. In this example we're gonna edit the *Acme.Bookstore.IdentityService* project `appsettings.json` file.
-```json
+```diff
"OpenIddict": {
"Applications": {
...
},
"Resources": {
...
- "ProductService": {
- "RootUrl": "http://localhost:44350"
- }
++ "ProductService": {
++ "RootUrl": "http://localhost:44350"
++ }
}
}
```
### Configuring the AuthServer
-We should configure the AuthServer for **CORS** and **RedirectAllowedUrls**.
+We should configure the *AuthServer* application `appsettings.json` file for the **CorsOrigins** and **RedirectAllowedUrls** sections.
-```json
+```diff
+...
"App": {
"SelfUrl": "http://localhost:***",
- "CorsOrigins": "...... ,http://localhost:44350",
+- "CorsOrigins": "http://localhost:44358,..",
++ "CorsOrigins": "http://localhost:44358,..,http://localhost:44350",
"EnablePII": false,
- "RedirectAllowedUrls": "...... ,http://localhost:44350"
-}
+- "RedirectAllowedUrls": "http://localhost:44358,..",
++ "RedirectAllowedUrls": "http://localhost:44358,..,http://localhost:44350"
+},
+...
```
### Configuring the API Gateway
-We should configure the API Gateway to allow the web gateway to access the new microservice. First, we should add the **ProductService** sections to the `appsettings.json` file in the `WebGateway` project.
+We should configure the API Gateway to access the new microservice. First, add the **Product** sections to the `appsettings.json` file in the `WebGateway` project. In this example we're gonna edit the *Acme.Bookstore.WebGateway* project `appsettings.json` file.
-```json
+```diff
"ReverseProxy": {
"Routes": {
...
- "ProductService": {
- "ClusterId": "ProductService",
- "Match": {
- "Path": "/api/productservice/{**catch-all}"
- }
- },
- "ProductServiceSwagger": {
- "ClusterId": "ProductService",
- "Match": {
- "Path": "/swagger-json/ProductService/swagger/v1/swagger.json"
- },
- "Transforms": [
- { "PathRemovePrefix": "/swagger-json/ProductService" }
- ]
- }
++ "Product": {
++ "ClusterId": "Product",
++ "Match": {
++ "Path": "/api/product/{**catch-all}"
++ }
++ },
++ "ProductSwagger": {
++ "ClusterId": "Product",
++ "Match": {
++ "Path": "/swagger-json/Product/swagger/v1/swagger.json"
++ },
++ "Transforms": [
++ { "PathRemovePrefix": "/swagger-json/Product" }
++ ]
++ }
},
"Clusters": {
...
- "ProductService": {
- "Destinations": {
- "ProductService": {
- "Address": "http://localhost:44350/"
- }
- }
- }
++ "Product": {
++ "Destinations": {
++ "Product": {
++ "Address": "http://localhost:44350/"
++ }
++ }
++ }
}
}
```
-Afterwards, open the `ProjectNameWebGatewayModule` class in the `WebGateway` and add the `ProductService` to the `ConfigureSwaggerUI` method.
+Afterwards, open the `ProjectNameWebGatewayModule` class in the `WebGateway` project and add the `ProductService` to the `ConfigureSwaggerUI` method. In this example we're gonna edit the `BookstoreWebGatewayModule` file.
+
+```diff
+private static void ConfigureSwaggerUI(
+ IProxyConfig proxyConfig,
+ SwaggerUIOptions options,
+ IConfiguration configuration)
+{
+ foreach (var cluster in proxyConfig.Clusters)
+ {
+ options.SwaggerEndpoint($"/swagger-json/{cluster.ClusterId}/swagger/v1/swagger.json", $"{cluster.ClusterId} API");
+ }
-```csharp
-options.OAuthScopes(
- "AdministrationService",
- "AuthServer",
- "IdentityService",
- "ProductService" // new service
-);
+ options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
+ options.OAuthScopes(
+ "AdministrationService",
+ "AuthServer",
+ ...,
++ "ProductService"
+ );
+}
```
### Configuring the UI Services
-We should configure the UI application(s) to allow the new microservice to access through the web gateway. To do this, we should add the new service scope to the `ConfigureAuthentication` method in the `ProjectName...Module` class in the `Web` or `Blazor` application.
+We should configure the UI application(s) to allow the new microservice to access through the web gateway. To do this, we should add the new microservice scope to the `ConfigureAuthentication` method in the `ProjectName...Module` class in the `Web` or `Blazor` application. In this example we're gonna edit the `BookstoreWebModule` file.
-```csharp
-context.Services.AddAuthentication(options =>
-{
- options.DefaultScheme = "Cookies";
- options.DefaultChallengeScheme = "oidc";
-})
-.AddCookie("Cookies", options =>
+```diff
+private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
{
- options.ExpireTimeSpan = TimeSpan.FromDays(365);
-})
-.AddAbpOpenIdConnect("oidc", options =>
-{
- ...
- options.Scope.Add("AuthServer");
- options.Scope.Add("IdentityService");
- options.Scope.Add("AdministrationService");
- options.Scope.Add("ProductService"); // new servie
-});
+ context.Services.AddAuthentication(options =>
+ {
+ options.DefaultScheme = "Cookies";
+ options.DefaultChallengeScheme = "oidc";
+ })
+ .AddCookie("Cookies", options =>
+ {
+ options.ExpireTimeSpan = TimeSpan.FromDays(365);
+ })
+ .AddAbpOpenIdConnect("oidc", options =>
+ {
+ ...
+ options.Scope.Add("AuthServer");
+ options.Scope.Add("IdentityService");
+ options.Scope.Add("AdministrationService");
++ options.Scope.Add("ProductService");
+ });
+ ...
+}
```
Similarly, if you have an Angular application, you should add the new service scope to the `oAuthConfig` in `environment.ts`:
-```typescript
+```diff
const baseUrl = 'http://localhost:4200';
const oAuthConfig = {
@@ -313,69 +341,83 @@ const oAuthConfig = {
redirectUri: baseUrl,
clientId: 'Angular',
responseType: 'code',
- scope: 'openid profile email roles AuthServer IdentityService AdministrationService ProductService', // new service
+- scope: 'openid profile email roles AuthServer IdentityService AdministrationService',
++ scope: 'openid profile email roles AuthServer IdentityService AdministrationService ProductService',
requireHttps: false
};
```
-### Add the New Microservice to the Solution Runner
-
-We should add the new microservice to the solution runner [profile](../../studio/running-applications.md#profile) for running applications in the ABP Studio. You can follow the steps explained in the [Solution Runner](../../studio/running-applications.md#c-application) document to add the new microservice to the solution runner profile. Afterwards, you can start the new microservice by selecting it in the solution runner.
-
-
-
## Docker Configuration for Prometheus
-If you want to monitor the new microservice with Prometheus when you debug the solution, you should add the new microservice to the `prometheus.yml` file in the `etc/docker/prometheus` folder. You can copy the configurations from the existing microservices and modify them according to the new microservice. Below is an example of the `prometheus.yml` file for the `ProductService` microservice.
+If you want to monitor the new microservice with Prometheus when you debug the solution, you should add the new microservice to the `prometheus.yml` file in the `etc/docker/prometheus` folder. You can copy the configurations from the existing microservices and modify them according to the new microservice. Below is an example of the `prometheus.yml` file for the `Product` microservice.
-```yml
- - job_name: 'product'
+```diff
+ - job_name: 'authserver'
scheme: http
metrics_path: 'metrics'
static_configs:
- - targets: ['host.docker.internal:44350']
+ - targets: ['host.docker.internal:44398']
+ ...
++ - job_name: 'product'
++ scheme: http
++ metrics_path: 'metrics'
++ static_configs:
++ - targets: ['host.docker.internal:44350']
```
## Creating Helm Chart for the New Microservice
If you want to deploy the new microservice to Kubernetes, you should create a Helm chart for the new microservice.
-First, we need to add the new microservice to the `build-all-images.ps1` script in the `etc/helm` folder. You can copy the configurations from the existing microservices and modify them according to the new microservice. Below is an example of the `build-all-images.ps1` script for the `ProductService` microservice.
+First, we need to add the new microservice to the `build-all-images.ps1` script in the `etc/helm` folder. You can copy the configurations from the existing microservices and modify them according to the new microservice. Below is an example of the `build-all-images.ps1` script for the `Product` microservice.
-```powershell
-./build-image.ps1 -ProjectPath "../../services/product/Acme.Bookstore.ProductService/Acme.Bookstore.ProductService.csproj" -ImageName bookstore/productservice
+```diff
+...
+ ./build-image.ps1 -ProjectPath "../../apps/auth-server/Acme.Bookstore.AuthServer/Acme.Bookstore.AuthServer.csproj" -ImageName bookstore/authserver
++ ./build-image.ps1 -ProjectPath "../../services/product/Acme.Bookstore.ProductService/Acme.Bookstore.ProductService.csproj" -ImageName bookstore/product
```
-Then, we need to add the connection string to the `values.projectname-local.yaml` file in the `etc/helm/projectname` folder. Below is an example of the `values.bookstore-local.yaml` file for the `ProductService` microservice.
+Then, we need to add the connection string to the `values.projectname-local.yaml` file in the `etc/helm/projectname` folder. Below is an example of the `values.bookstore-local.yaml` file for the `Product` microservice.
-```yaml
+```diff
global:
...
connectionStrings:
...
- productService: "Server=[RELEASE_NAME]-sqlserver,1433; Database=Bookstore_ProductService; User Id=sa; Password=myPassw@rd; TrustServerCertificate=True"
++ product: "Server=[RELEASE_NAME]-sqlserver,1433; Database=Bookstore_ProductService; User Id=sa; Password=myPassw@rd; TrustServerCertificate=True"
```
-Afterwards, we need to create a new Helm chart for the new microservice. You can copy the configurations from the existing microservices and modify them according to the new microservice. Below is an example of the `productservice` Helm chart for the `ProductService` microservice.
+Afterwards, we need to create a new Helm chart for the new microservice. You can copy the configurations from the existing microservices and modify them according to the new microservice. Below is an example of the `product` Helm chart for the `Product` microservice.
+
+Product microservice `values.yaml` file.
{%{
```yaml
-# values.yaml
image:
- repository: "bookstore/productservice"
+ repository: "bookstore/product"
tag: "latest"
pullPolicy: IfNotPresent
swagger:
isEnabled: "true"
+```
+}%}
+
+Product microservice `Chart.yaml` file.
-# Chart.yaml
+{%{
+```yaml
apiVersion: v2
-name: productservice
+name: product
version: 1.0.0
appVersion: "1.0"
description: Bookstore Product Service
+```
+}%}
-# product.yaml
+Product microservice `product.yaml` file.
+
+{%{
+```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
@@ -404,10 +446,15 @@ spec:
- name: "ConnectionStrings__AbpBlobStoring"
value: "{{ .Values.global.connectionStrings.blobStoring | replace "[RELEASE_NAME]" .Release.Name }}"
- name: "ConnectionStrings__ProductService"
- value: "{{ .Values.global.connectionStrings.productService | replace "[RELEASE_NAME]" .Release.Name }}"
+ value: "{{ .Values.global.connectionStrings.product | replace "[RELEASE_NAME]" .Release.Name }}"
...
+```
+}%}
+
+Product microservice `product-service.yaml` file.
-# product-service.yaml
+{%{
+```yaml
apiVersion: v1
kind: Service
metadata:
@@ -427,32 +474,113 @@ After creating the Helm chart, you can *Refresh Sub Charts* in the ABP Studio.

-Then, update *Metadata* information right-click the *microservicename* [sub-chart](../../studio/kubernetes.md#subchart), select *Properties* it open *Chart Properties* window. You can edit in the *Metadata* tab.
+Then, update *Metadata* information right-click the *microservicename* [sub-chart](../../studio/kubernetes.md#subchart), select *Properties* it open *Chart Properties* window. You should add the following keys in the *Metadata* tab.

+- `projectPath`: The path to the microservice host application project. In the bookstore example, this value is `../../services/product/Acme.Bookstore.ProductService/Acme.Bookstore.ProductService.csproj`.
+- `imageName`: When we build the Docker image, it uses this value as the Docker image name. We're going to use it in the Helm chart values.
+- `projectType`: You can add a Helm chart for Angular and .NET projects, which is why we should explicitly specify the project type.
+
Add the *Kubernetes Services* in the *Chart Properties* -> *Kubernetes Services* tab.

+> This value should be the same as the [solution runner application](./../../studio/running-applications.md#properties) *Kubernetes service* value. It's necessary for browsing because when we connect to the Kubernetes cluster, we should browse the Kubernetes services instead of using the Launch URL.
+
Last but not least, we need to configure the helm chart environments for identity, auth-server, and gateway applications.
+Below is an example of the *Identity* microservice `identity.yaml` file.
+
{%{
-```yaml
-# identity.yaml
-# Add this line to the "env:" section
-- name: "OpenIddict__Resources__ProductService__RootUrl"
- value: "http://{{ .Release.Name }}-productservice"
-
-# authserver.yaml
-# Concat the following lines for "App__CorsOrigins" section
-- name: "App__CorsOrigins"
- value: "...,http://{{ .Release.Name }}-administration,http://{{ .Release.Name }}-productservice"
-
-# webapigateway.yaml
-# Add this line to the "env:" section
-- name: "ReverseProxy__Clusters__ProductService__Destinations__ProductService__Address"
- value: "http://{{ .Release.Name }}-productservice"
+```diff
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: "{{ .Release.Name }}-{{ .Chart.Name }}"
+spec:
+ selector:
+ matchLabels:
+ app: "{{ .Release.Name }}-{{ .Chart.Name }}"
+ template:
+ metadata:
+ labels:
+ app: "{{ .Release.Name }}-{{ .Chart.Name }}"
+ spec:
+ containers:
+ - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ imagePullPolicy: "{{ .Values.image.pullPolicy }}"
+ name: "{{ .Release.Name }}-{{ .Chart.Name }}"
+ ports:
+ - name: "http"
+ containerPort: 80
+ env:
+ ...
++ - name: "OpenIddict__Resources__ProductService__RootUrl"
++ value: "http://{{ .Release.Name }}-product"
+```
+}%}
+
+Below is an example of the *AuthServer* application `authserver.yaml` file.
+
+{%{
+```diff
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: "{{ .Release.Name }}-{{ .Chart.Name }}"
+spec:
+ selector:
+ matchLabels:
+ app: "{{ .Release.Name }}-{{ .Chart.Name }}"
+ template:
+ metadata:
+ labels:
+ app: "{{ .Release.Name }}-{{ .Chart.Name }}"
+ spec:
+ containers:
+ - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ imagePullPolicy: "{{ .Values.image.pullPolicy }}"
+ name: "{{ .Release.Name }}-{{ .Chart.Name }}"
+ ports:
+ - name: "http"
+ containerPort: 80
+ env:
+ ...
+ - name: "App__CorsOrigins"
+- value: "...,http://{{ .Release.Name }}-administration"
++ value: "...,http://{{ .Release.Name }}-administration,http://{{ .Release.Name }}-product"
+```
+}%}
+
+Below is an example of the *WebApiGateway* application `webapigateway.yaml` file.
+
+{%{
+```diff
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: "{{ .Release.Name }}-{{ .Chart.Name }}"
+spec:
+ selector:
+ matchLabels:
+ app: "{{ .Release.Name }}-{{ .Chart.Name }}"
+ template:
+ metadata:
+ labels:
+ app: "{{ .Release.Name }}-{{ .Chart.Name }}"
+ spec:
+ containers:
+ - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ imagePullPolicy: "{{ .Values.image.pullPolicy }}"
+ name: "{{ .Release.Name }}-{{ .Chart.Name }}"
+ ports:
+ - name: "http"
+ containerPort: 80
+ env:
+ ...
++ - name: "ReverseProxy__Clusters__Product__Destinations__Product__Address"
++ value: "http://{{ .Release.Name }}-product"
```
}%}
@@ -465,11 +593,11 @@ You can customize the microservice template if needed. Add new configurations, d
After adding the new microservice to the solution, you can develop the UI for the new microservice. For .NET applications, you can add the microservice *Contracts* package to the UI application(s) to access the services provided by the new microservice. Afterwards, you can use the [generate-proxy](../../cli/index.md#generate-proxy) command to generate the proxy classes for the new microservice.
```bash
-abp generate-proxy -t csharp -url http://localhost:44333/ -m productService --without-contracts
+abp generate-proxy -t csharp -url http://localhost:44333/ -m product --without-contracts
```
Next, start creating *Pages* and *Components* for the new microservice in the UI application(s). Similarly, if you have an Angular application, you can use the [generate-proxy](../../cli/index.md#generate-proxy) command to generate the proxy classes for the new microservice and start developing the UI.
```bash
-abp generate-proxy -t ng -url http://localhost:44333/ -m productService
+abp generate-proxy -t ng -url http://localhost:44333/ -m product
```
\ No newline at end of file
diff --git a/docs/en/solution-templates/microservice/images/create-new-microservice-nolayers-enable-integration.png b/docs/en/solution-templates/microservice/images/create-new-microservice-nolayers-enable-integration.png
new file mode 100644
index 0000000000..a1aa31887f
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/create-new-microservice-nolayers-enable-integration.png differ
diff --git a/docs/en/solution-templates/microservice/images/folder-structure.png b/docs/en/solution-templates/microservice/images/folder-structure.png
new file mode 100644
index 0000000000..926bfaa3d5
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/folder-structure.png differ
diff --git a/docs/en/studio/images/solution-explorer/abp-solution.png b/docs/en/studio/images/solution-explorer/abp-solution.png
index 8348e71778..b15e7f46f0 100644
Binary files a/docs/en/studio/images/solution-explorer/abp-solution.png and b/docs/en/studio/images/solution-explorer/abp-solution.png differ
diff --git a/docs/en/studio/images/solution-explorer/create-new-microservice-nolayers-enable-integration.png b/docs/en/studio/images/solution-explorer/create-new-microservice-nolayers-enable-integration.png
new file mode 100644
index 0000000000..a1aa31887f
Binary files /dev/null and b/docs/en/studio/images/solution-explorer/create-new-microservice-nolayers-enable-integration.png differ
diff --git a/docs/en/studio/installation.md b/docs/en/studio/installation.md
index 11f390f9f3..4dc158e464 100644
--- a/docs/en/studio/installation.md
+++ b/docs/en/studio/installation.md
@@ -8,7 +8,7 @@
Before you begin the installation process for ABP Studio, ensure that your system meets the following pre-requirements:
### Node
-Make sure [Node.js](https://nodejs.org/en) is installed on your system. If you have not installed Node.js, you can download the `v16` or `v18` version from the official [Node.js website](https://nodejs.org/en/download/prebuilt-installer).
+Make sure [Node.js](https://nodejs.org/en) is installed on your system. If you have not installed Node.js, you can download the `v18.19+` version from the official [Node.js website](https://nodejs.org/en/download/prebuilt-installer).
### WireGuard (Optional)
ABP Studio needs [WireGuard](https://www.wireguard.com/) for Kubernetes operations. You can find the installation instructions for your specific operating system below:
diff --git a/docs/en/studio/kubernetes.md b/docs/en/studio/kubernetes.md
index 666fdf0a99..f05a30ee04 100644
--- a/docs/en/studio/kubernetes.md
+++ b/docs/en/studio/kubernetes.md
@@ -150,9 +150,9 @@ Upon disconnection from the cluster, we clean up the hosts file, excluding ingre

-> When you list the services in the Kubernetes cluster with the `kubectl get svc` command, you should see the *abp-wg-easy* and *abp-wg-easy-vpn* services. After a while, if the *EXTERNAL-IP* is still *pending*, then it can't connect to the cluster. This could be caused by if you try to install the WireGuard VPN to a Docker Desktop Kubernetes cluster more than once. You can delete the previous WireGuard VPN by running the `helm uninstall abp-wg-easy` command in the previous namespace.
+> When you list the services in the Kubernetes cluster with the `kubectl get svc` command, you should see the *abp-wg-easy* and *abp-wg-easy-vpn* services. Each WireGuard installation has a unique port number for the related services. If you have multiple WireGuard installations for different Kubernetes profiles or solutions, you can see the port numbers in the *PORT(S)* field when you list them with the `kubectl get svc` command.
-> Connecting to the Kubernetes cluster is limited to one instance of ABP Studio at a time. Trying to connect with another instance simultaneously won't work as expected.
+> Connecting to the Kubernetes cluster is limited to one instance of ABP Studio at the same time. Trying to connect with another instance simultaneously won't work as expected.
### Intercept a Service
diff --git a/docs/en/studio/release-notes.md b/docs/en/studio/release-notes.md
index f30d4855af..5140de9647 100644
--- a/docs/en/studio/release-notes.md
+++ b/docs/en/studio/release-notes.md
@@ -2,6 +2,42 @@
This document contains **brief release notes** for each ABP Studio release. Release notes only include **major features** and **visible enhancements**. Therefore, they don't include all the development done in the related version.
+## 0.9.1 (2024-10-10)
+
+* Fixed the ABP Studio CLI's Bundle Command
+* Fixed the Public Web project for the Microservice Template
+* Removed the React Native for the Community Edition (open-source)
+* Added multiple gateway and UI selection option during microservice creation
+* Added External Logins item to user menu for the Blazor templates
+
+## 0.8.4 (2024-10-07)
+
+* Fixed the ABP Suite does not open problem for macOS
+* Made improvements on the new microservice creation
+* Allowed using browser shortcuts (copy, paste, new tab etc.) for macOS
+* Prevented application being crashed on solution runner exceptions
+* Included `WebApp.Client` project styles in the main application to enable CSS in Isolation
+
+## 0.8.3 (2024-09-24)
+
+* Allowed to set Execution Order (or dependency) from Solution Runner
+* Added Icons for the Solution Runner's Context Menu
+* Fixed MongoDB database issues for the Microservice Template
+* Allowed parallel running for background tasks
+
+## 0.8.2 (2024-09-19)
+
+* Fixed WireGuard connection random port bug
+* Automated steps after microservice solution creation
+* Fixed unusable options/features for Trial License
+* Fixed blazor-server single-layer template
+
+## 0.8.1 (2024-09-12)
+
+* Fixed MySQL connection problem for nolayers template
+* Ignored failed solution runner profiles while loading
+* Added required ModalBuilder extensions for the imported/installed modules for EF Core
+
## 0.8.0 (2024-09-11)
* Added `Blazor WebApp UI` to **app-nolayers** and **microservice** templates
diff --git a/docs/en/studio/solution-explorer.md b/docs/en/studio/solution-explorer.md
index 76e3543269..8aa0ea4404 100644
--- a/docs/en/studio/solution-explorer.md
+++ b/docs/en/studio/solution-explorer.md
@@ -47,6 +47,8 @@ It is the main solution that you can open with ABP Studio, an ABP solution can c
- `Open With`
- `Terminal`: Opens the terminal in the solution directory.
- `Explorer`: Opens the file explorer in the solution directory.
+- `Solution Configuration`: You can see the project creation options in this menu. It opens the *Solution Configuration* window.
+- `Open Readme`: Opens the README file in the solution if available. If there is no README file, this option will not be visible.
## Folder
@@ -143,6 +145,10 @@ You can choose the database provider for your microservice module. Select one of

+When you create a microservice, you must edit some [configurations](../solution-templates/microservice/adding-new-microservices.md#configuring-the-appsettingsjson). If you select the *Enable integration* option, it automatically configures the required settings for the microservice to work with the gateway, web, and other modules.
+
+
+
After creating the *Microservice (service-nolayers)* module, it will be added to the solution, and you should see the following structure in the solution explorer.

@@ -157,7 +163,7 @@ ABP modules have their own file extension `.abpmdl`, and they are located in the
### Difference Between ABP Module Template and ABP Studio Module Approach
-In ABP, creating a module solution using the [CLI](../cli/index.md) results in a solution with numerous projects, some of which may not be necessary for a specific use case. The ABP Studio module approach differs from the ABP module template, offering greater flexibility. With ABP Studio, we can create a module containing only the required projects; for example, an empty module with only the `Domain` and `Application` projects. In this approach, the term [Package](./concepts.md#package) is used for module projects.
+In ABP, creating a module solution using the [old CLI](../cli/differences-between-old-and-new-cli.md) results in a solution with numerous projects, some of which may not be necessary for a specific use case. The ABP Studio new module approach differs from the ABP old module template, offering greater flexibility. With ABP Studio, we can create a module containing only the required projects; for example, an empty module with only the `Domain` and `Application` projects. In this approach, the term [Package](./concepts.md#package) is used for module projects.
Furthermore, it's important to mention that we can create not just DDD-principled modules. The [Modularity](../framework/architecture/modularity/basics.md) document clarifies the difference between *Framework* and *Application* modules. Basically, every C# project refers to the `Volo.Abp.Core` package and defines the *Module* class as an ABP Class Library. We have the option to develop an infrastructure module using only the *ABP Class Library* packages and provide a module reference to other modules.
diff --git a/docs/en/studio/version-compatibility.md b/docs/en/studio/version-compatibility.md
index 812db493b9..cd6850fcab 100644
--- a/docs/en/studio/version-compatibility.md
+++ b/docs/en/studio/version-compatibility.md
@@ -4,6 +4,8 @@ This document provides an overview of the compatibility between various versions
| **ABP Studio Version** | **ABP Version** |
|------------------------|---------------------------|
+| 0.8.4 - 0.9.1 | 8.3.1 |
+| 0.8.1 to 0.8.3 | 8.3.0 |
| 0.8.0 | 8.2.3 |
| 0.7.8 - 0.7.9 | 8.2.2 |
| 0.7.4 to 0.7.7 | 8.2.1 |
diff --git a/docs/en/suite/add-solution.md b/docs/en/suite/add-solution.md
index 0bdd166ef9..e318a45f98 100644
--- a/docs/en/suite/add-solution.md
+++ b/docs/en/suite/add-solution.md
@@ -14,10 +14,10 @@
}
````
-ABP Suite requires an ABP solution to work on, that's why when you start it, you will see two actions: `Add an existing solution` and `Create a new solution`
+ABP Suite requires an ABP solution to work on, that's why when you start it, you need an ABP Solution and it should be added in ABP Suite UI.
## Add an existing solution
Add your existing solution which was created from the [ABP Studio](../studio/index.md) or [ABP CLI](../cli/index.md). You have to enter your `YourProject.sln` file path. Also, it works if you enter the directory of the `YourProject.sln` when there's single solution inside.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/en/suite/create-solution.md b/docs/en/suite/create-solution.md
index c140848c7c..a87e73b480 100644
--- a/docs/en/suite/create-solution.md
+++ b/docs/en/suite/create-solution.md
@@ -16,56 +16,6 @@
## Create a new solution
-Creates a new ABP solution. It's an alternative way of creating an ABP project rather than [ABP CLI](../cli/index.md#new). To create a new ABP Solution, click the **Create a new solution** button. It will open a new dialog for the options.
+From ABP Suite v8.3, **create a new solution** option has been removed. Instead, it's suggessted to use [ABP Studio](../studio/index.md) or [ABP CLI](../cli/index.md) to create a new solution. After, creating an ABP Solution, then you can generate CRUD pages via ABP Suite as always.
-
-
-You need to provide your *template type*, *project name*, *output folder* where the project will be created in, *UI Framework* as your front-end, *mobile* option (**React Native** or **none**), *database provider*, *database management system* (if the database provider is **Entity Framework Core**) and *connection string*.
-
-Also, you can add a *public web site* project to your solution, separate tenant schema by choosing the `Separated tenant schema` option and create the solution as tiered with the *Tiered* option which separates `Web` and `HTTP API` projects.
-
-
-
-- **Template type:** This is the startup template type of your solution. You can check the all available templates from [here](../solution-templates).
-
-- **Project name:** This is the solution name and also the prefix for the namespace of your solution. In this example `Acme.BookStore` is the project name. The solution file will be named as `Acme.BookStore.sln`. And the namespaces of `c#` files will start with `Acme.BookStore.*`
-
-- **Output folder:** This is the directory where the new project will be created. Suite automatically creates the output directory if not exists and places the project folder inside the output directory. See the below folder view for `Acme.BookStore` project.
-
- 
-
-- **Theme:** You can generate your project with one of the 3 themes: `LeptonX`, `Lepton`, and `Basic theme`.
-
- - `LeptonX` is a new modern and stylish Bootstrap UI theme with different color options. It's is the newest theme and is the default.
-
- - `Lepton` is a modern, mature, responsive UI theme with different style and color options.
-
- - `Basic theme` is a minimalist UI theme with plain Bootstrap colors and styles. Ideal if you will build your own UI theme.
-
-> If you choose **LeptonX**, another option named **Theme style** will show up, you can choose one out of 4 options: `System`, `Dim`, `Dark` or `Light`.
-
-
-
-- **UI framework:** There are 4 types of UI Frameworks: `MVC`, `Angular`, `Blazor WebAssembly`, `Blazor Server`. Suite works with all of these frameworks.
-
- - If you choose `Angular` or `Blazor WebAssembly`, two checkbox options will appear at the bottom:
-
- - `Separate Auth Server`: Separates the Auth Server application from the API host application. If not checked, the server-side will have a single endpoint.
-
- - `Progressive web application`: Optional Progressive Web Application checkbox.
-
-- **Mobile:** You can create the template with React Native and MAUI as a mobile framework or without any mobile application support.
-
-- **Database Provider:** ABP supports 2 database providers: `Entity Framework Core` and `MongoDB`. `Entity Framework Core` supports a variety of database management systems like `MS SQL Server`, `Oracle`, `MySQL` or `PostgreSQL`. See the full list https://docs.microsoft.com/ef/core/providers/?tabs=dotnet-core-cli. On the other hand [MongoDB](https://www.mongodb.com/) is a document-oriented NoSQL database used for high volume data storage. If you have a requirement to work with relational database systems, choose `Entity Framework Core` otherwise choose `MongoDB`.
-
-- **Database management system:** You can choose your **Database Management System (DBMS)** while creating a new solution. There are 6 types of database management system: `SqlServer` (default), `MySQL`, `SQLite`, `Oracle`, `Oracle-Devart` and `PostgreSQL`.
-
-- **Connection string:** You can define the connection string for connecting to the database by filling this area.
-
-- **Public web site:** Creates the solution with an additional public web site project.
-
-- **Separated tenant schema:** Creates the solution with the separated tenant schema support. Also, it creates a separate DbContext & migration path for tenants to not include host-related tables in tenant databases.
-
-- **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. You can leave it unchecked, if you are not sure.
-
-- **Preview:** Creates the solution in the latest preview version.
+> ABP Studio has a shortcut for running [ABP Suite](./index.md) to allow using it without starting it externally and using it on a browser, which means you can create, manage, deploy your applications in a single desktop application and also generate CRUD pages via Suite as a pre-integrated application to ABP Studio.
\ No newline at end of file
diff --git a/docs/en/tutorials/book-store/part-09.md b/docs/en/tutorials/book-store/part-09.md
index e8e0bd328f..c42dd22d8a 100644
--- a/docs/en/tutorials/book-store/part-09.md
+++ b/docs/en/tutorials/book-store/part-09.md
@@ -558,6 +558,7 @@ Open the `/src/app/route.provider.ts` and add `'BookStore.Books || BookStore.Aut
layout: eLayoutType.application,
requiredPolicy: 'BookStore.Books || BookStore.Authors',
},
+````
The final `configureRoutes` function declaration should be following:
@@ -1240,4 +1241,4 @@ That's all! This is a fully working CRUD page, you can create, edit and delete t
> **Tip**: If you run the `.DbMigrator` console application after defining a new permission, it automatically grants these new permissions to the admin role and you don't need to manually grant the permissions yourself.
-{{end}}
\ No newline at end of file
+{{end}}
diff --git a/docs/en/tutorials/index.md b/docs/en/tutorials/index.md
index eeb24824f2..1f03c87d8e 100644
--- a/docs/en/tutorials/index.md
+++ b/docs/en/tutorials/index.md
@@ -1,7 +1,7 @@
# ABP Tutorials
-The following guides explains how to build ABP based applications:
+The following introductory tutorials explain how to build applications based on the ABP platform:
* [TODO Application](todo/index.md): This is a single-part, quick-start tutorial to build a simple application with ABP. Start with this tutorial if you want to quickly understand how ABP works.
* [Book Store Application](book-store/index.md): This is a multi-part, complete tutorial to build a bookstore application with ABP. Start with this tutorial if you want to create a layered solution with ABP and apply DDD best practices.
-* [Modular Monolith Application](modular-crm/index.md): This is a multi-part tutorial that demonstrates how to create application modules, compose and communicate them to build a monolith modular web application.
\ No newline at end of file
+* [Modular Monolith Application](modular-crm/index.md): This is a multi-part tutorial that demonstrates how to create application modules, compose and communicate them to build a monolith modular web application.
diff --git a/docs/en/tutorials/microservice/index.md b/docs/en/tutorials/microservice/index.md
new file mode 100644
index 0000000000..ee425f8afe
--- /dev/null
+++ b/docs/en/tutorials/microservice/index.md
@@ -0,0 +1,3 @@
+# Microservice Development Tutorial
+
+This tutorial is work in progress. Please check later. You can check here to [see the draft tutorial](https://github.com/abpframework/abp/blob/microservice-tutorial/docs/en/tutorials/microservice/index.md).
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-entity-framework-core-migration-dialog.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-entity-framework-core-migration-dialog.png
index c96217ac47..7edec8f3d9 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-entity-framework-core-migration-dialog.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-entity-framework-core-migration-dialog.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-entity-framework-core-migration.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-entity-framework-core-migration.png
index 1629f541d8..857df5f25d 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-entity-framework-core-migration.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-entity-framework-core-migration.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-dd-module.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-dd-module.png
deleted file mode 100644
index f8a701770e..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-dd-module.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-ddd-module.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-ddd-module.png
new file mode 100644
index 0000000000..ed11a95f57
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-ddd-module.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-empty-module.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-empty-module.png
index 8815d15c44..53d453cd37 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-empty-module.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-empty-module.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-folder-command.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-folder-command.png
index 6557599a4e..56c861d4fd 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-folder-command.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-folder-command.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package.png
index de9e1aa8c5..7e28d708bf 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-2.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-2.png
index 47a5671f7f..308d32c6ad 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-2.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-2.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-3.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-3.png
index e79b72747f..dc51826734 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-3.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-3.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4.png
index fa3b5c4e23..b29850cce6 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-5.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-5.png
index 4a8ef0ba58..42d7c96cb2 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-5.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-5.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-6.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-6.png
new file mode 100644
index 0000000000..954ea41060
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-6.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-7.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-7.png
new file mode 100644
index 0000000000..3dea701062
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-7.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-5.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-5.png
new file mode 100644
index 0000000000..ad78c4eee7
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-5.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-6.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-6.png
new file mode 100644
index 0000000000..bd1c968b03
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-6.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference.png
index 2cbd244a4b..a6870e4c0e 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-added-ddd-contracts-package.png b/docs/en/tutorials/modular-crm/images/abp-studio-added-ddd-contracts-package.png
new file mode 100644
index 0000000000..f451a550d8
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-added-ddd-contracts-package.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-build-and-restart-application.png b/docs/en/tutorials/modular-crm/images/abp-studio-build-and-restart-application.png
index 010851ee05..889a4251cd 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-build-and-restart-application.png and b/docs/en/tutorials/modular-crm/images/abp-studio-build-and-restart-application.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-add-migration-order.png b/docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-add-migration-order.png
index 1e247f069b..b739e59373 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-add-migration-order.png and b/docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-add-migration-order.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-update-database.png b/docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-update-database.png
index bece8dfc12..b28b4e48a0 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-update-database.png and b/docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-update-database.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-graph-build.png b/docs/en/tutorials/modular-crm/images/abp-studio-graph-build.png
index 11855d792e..8930bdd062 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-graph-build.png and b/docs/en/tutorials/modular-crm/images/abp-studio-graph-build.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-import-module-for-ordering.png b/docs/en/tutorials/modular-crm/images/abp-studio-import-module-for-ordering.png
index 94ab70d255..13aab5d477 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-import-module-for-ordering.png and b/docs/en/tutorials/modular-crm/images/abp-studio-import-module-for-ordering.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-import-module-ordering.png b/docs/en/tutorials/modular-crm/images/abp-studio-import-module-ordering.png
index e62c0dc315..8956033762 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-import-module-ordering.png and b/docs/en/tutorials/modular-crm/images/abp-studio-import-module-ordering.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-import-module.png b/docs/en/tutorials/modular-crm/images/abp-studio-import-module.png
index 673d303307..7a63894709 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-import-module.png and b/docs/en/tutorials/modular-crm/images/abp-studio-import-module.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-new-folder-dialog.png b/docs/en/tutorials/modular-crm/images/abp-studio-new-folder-dialog.png
index f726332a37..e1e3065b9c 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-new-folder-dialog.png and b/docs/en/tutorials/modular-crm/images/abp-studio-new-folder-dialog.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-open-in-explorer.png b/docs/en/tutorials/modular-crm/images/abp-studio-open-in-explorer.png
index ce052d2b17..99c6d26b20 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-open-in-explorer.png and b/docs/en/tutorials/modular-crm/images/abp-studio-open-in-explorer.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio-main-app.png b/docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio-main-app.png
index 1f879ed795..f4131cfb69 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio-main-app.png and b/docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio-main-app.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio.png b/docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio.png
index ba96d6f488..2b1bac2db6 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio.png and b/docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-ordering-swagger-ui-in-browser.png b/docs/en/tutorials/modular-crm/images/abp-studio-ordering-swagger-ui-in-browser.png
new file mode 100644
index 0000000000..304027af9e
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-ordering-swagger-ui-in-browser.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-graph-build.png b/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-graph-build.png
index ececabbf01..10d210a0be 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-graph-build.png and b/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-graph-build.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-initial-product-page.png b/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-initial-product-page.png
index 480da27d7e..269c55f8b4 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-initial-product-page.png and b/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-initial-product-page.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-orders-page.png b/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-orders-page.png
index f3e9896e8f..fbd419d145 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-orders-page.png and b/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-orders-page.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-swagger-ui-create-order-execute.png b/docs/en/tutorials/modular-crm/images/abp-studio-swagger-ui-create-order-execute.png
new file mode 100644
index 0000000000..b0f384f15d
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-swagger-ui-create-order-execute.png differ
diff --git a/docs/en/tutorials/modular-crm/images/sql-server-orders-database-table-filled.png b/docs/en/tutorials/modular-crm/images/sql-server-orders-database-table-filled.png
new file mode 100644
index 0000000000..75c812593c
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/sql-server-orders-database-table-filled.png differ
diff --git a/docs/en/tutorials/modular-crm/images/sql-server-orders-table-content.png b/docs/en/tutorials/modular-crm/images/sql-server-orders-table-content.png
deleted file mode 100644
index 1bc432c650..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/sql-server-orders-table-content.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/visual-studio-ordering-contracts.png b/docs/en/tutorials/modular-crm/images/visual-studio-ordering-contracts.png
new file mode 100644
index 0000000000..d9206f6630
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/visual-studio-ordering-contracts.png differ
diff --git a/docs/en/tutorials/modular-crm/images/visual-studio-ordering-controller.png b/docs/en/tutorials/modular-crm/images/visual-studio-ordering-controller.png
deleted file mode 100644
index 56a1dad5b1..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/visual-studio-ordering-controller.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/part-02.md b/docs/en/tutorials/modular-crm/part-02.md
index 14560b3766..de8fd69f92 100644
--- a/docs/en/tutorials/modular-crm/part-02.md
+++ b/docs/en/tutorials/modular-crm/part-02.md
@@ -41,7 +41,7 @@ We will use the *DDD Module* template for the Product module and the *Empty Modu
Right-click the `modules` folder on the *Solution Explorer* panel, and select the *Add* -> *New Module* -> *DDD Module* command:
-
+
This command opens a new dialog to define the properties of the new module. You can use the following values to create a new module named `ModularCrm.Products`:
diff --git a/docs/en/tutorials/modular-crm/part-05.md b/docs/en/tutorials/modular-crm/part-05.md
index f7d624bcbf..69a9223882 100644
--- a/docs/en/tutorials/modular-crm/part-05.md
+++ b/docs/en/tutorials/modular-crm/part-05.md
@@ -232,9 +232,215 @@ After the operation completes, you can check your database to see the new `Order

-## Creating the User Interface
+## Creating the Application Service
+
+We will create an application service to manage the `Order` entities.
+
+### Defining the Application Service Contract
+
+We're gonna create the `IOrderAppService` interface under the `ModularCrm.Ordering.Contracts` project but first, we need to add `Volo.Abp.Ddd.Application.Contracts` package reference.
+
+Right-click the `ModularCrm.Ordering.Contracts` project in the *Solution Explorer* panel and select the *Add Package Reference* command:
+
+
+
+This command opens a dialog to add a new package reference:
+
+
+
+Select the *NuGet* tab, type `Volo.Abp.Ddd.Application.Contracts` as the *Package name* and write the version of the package you want to install. Please be sure that you are installing the same version as the other ABP packages you are already using.
+
+Click the *Ok* button. Now you can check the *Packages* under the `ModularCrm.Ordering.Contracts` project *Dependencies* to see the `Volo.Abp.Ddd.Application.Contracts` package is installed:
+
+
+
+Return to your IDE, open the `ModularCrm.Ordering` module's .NET solution and create an `IOrderAppService` interface under the `Services` folder for `ModularCrm.Ordering.Contracts` project:
+
+````csharp
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Services;
+
+namespace ModularCrm.Ordering.Contracts.Services;
+
+public interface IOrderAppService : IApplicationService
+{
+ Task> GetListAsync();
+ Task CreateAsync(OrderCreationDto input);
+}
+````
+
+### Defining Data Transfer Objects
+
+The `GetListAsync` and `CreateAsync` methods will use data transfer objects (DTOs) to communicate with the client. We will create two DTO classes for that purpose.
+
+Create a `OrderCreationDto` class under the `ModularCrm.Ordering.Contracts` project:
+
+````csharp
+using System;
+using System.ComponentModel.DataAnnotations;
+
+namespace ModularCrm.Ordering.Contracts.Services;
+
+public class OrderCreationDto
+{
+ [Required]
+ [StringLength(150)]
+ public string CustomerName { get; set; }
+
+ [Required]
+ public Guid ProductId { get; set; }
+}
+````
+
+Create a `OrderDto` class under the `ModularCrm.Ordering.Contracts` project:
+
+````csharp
+using System;
+using ModularCrm.Ordering.Contracts.Enums;
+
+namespace ModularCrm.Ordering.Contracts.Services;
+
+public class OrderDto
+{
+ public Guid Id { get; set; }
+ public string CustomerName { get; set; }
+ public Guid ProductId { get; set; }
+ public OrderState State { get; set; }
+}
+````
+
+The new files under the `ModularCrm.Ordering.Contracts` project should be like the following figure:
+
+
+
+### Implementing the Application Service
+
+Before creating the `OrderAppService` class, we need to add the `Volo.Abp.Ddd.Application` and `Volo.Abp.AutoMapper` packages to the Ordering module.
+
+Right-click the `ModularCrm.Ordering` package in the *Solution Explorer* panel and select the *Add Package Reference* command:
+
+
+
+This command opens a dialog to add a new package reference:
+
+
+
+Select the *NuGet* tab, enter `Volo.Abp.Ddd.Application` as the *Package name*, and specify the version of the package you wish to install. Afterward, you can add the `Volo.Abp.AutoMapper` package in the same dialog. Ensure that you install the same version as the other ABP packages you are already using.
+
+Click the *OK* button. Now we should configure the *AutoMapper* object to map the `Order` entity to the `OrderDto` object. We will create a class named `OrderingApplicationAutoMapperProfile` under the `ModularCrm.Ordering` project:
+
+````csharp
+using AutoMapper;
+using ModularCrm.Ordering.Contracts.Services;
+using ModularCrm.Ordering.Entities;
+
+namespace ModularCrm.Ordering;
+
+public class OrderingApplicationAutoMapperProfile : Profile
+{
+ public OrderingApplicationAutoMapperProfile()
+ {
+ CreateMap();
+ }
+}
+````
-Since this is a non-layered module, we can use entities and repositories directly on the user interface. If you think that is not a good practice, then use the layered module template as we've already done for the *Products* module. But for the Ordering module, we will keep it very simple for this tutorial to show it is also possible.
+And configure the `OrderingWebModule` class to use the `OrderingApplicationAutoMapperProfile`:
+
+````csharp
+public override void ConfigureServices(ServiceConfigurationContext context)
+{
+ //Add these lines
+ context.Services.AddAutoMapperObjectMapper();
+ Configure(options =>
+ {
+ options.AddMaps(validate: true);
+ });
+}
+````
+
+Now, we can implement the `IOrderAppService` interface. Create an `OrderAppService` class under the `Services` folder of the `ModularCrm.Ordering` project:
+
+````csharp
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using ModularCrm.Ordering.Contracts.Enums;
+using ModularCrm.Ordering.Contracts.Services;
+using ModularCrm.Ordering.Entities;
+using Volo.Abp.Application.Services;
+using Volo.Abp.Domain.Repositories;
+
+namespace ModularCrm.Ordering.Services;
+
+public class OrderAppService : ApplicationService, IOrderAppService
+{
+ private readonly IRepository _orderRepository;
+
+ public OrderAppService(IRepository orderRepository)
+ {
+ _orderRepository = orderRepository;
+ ObjectMapperContext = typeof(OrderingWebModule);
+ }
+
+ public async Task> GetListAsync()
+ {
+ var orders = await _orderRepository.GetListAsync();
+ return ObjectMapper.Map, List>(orders);
+ }
+
+ public async Task CreateAsync(OrderCreationDto input)
+ {
+ var order = new Order
+ {
+ CustomerName = input.CustomerName,
+ ProductId = input.ProductId,
+ State = OrderState.Placed
+ };
+
+ await _orderRepository.InsertAsync(order);
+ }
+}
+````
+
+Open the `ModularCrmWebModule` class in the main application's solution (the `ModularCrm` solution), find the `ConfigureAutoApiControllers` method and add the following lines inside that method:
+
+````csharp
+private void ConfigureAutoApiControllers()
+{
+ Configure(options =>
+ {
+ options.ConventionalControllers.Create(typeof(ModularCrmApplicationModule).Assembly);
+ options.ConventionalControllers.Create(typeof(ProductsApplicationModule).Assembly);
+
+ //ADD THE FOLLOWING LINE:
+ options.ConventionalControllers.Create(typeof(OrderingWebModule).Assembly);
+ });
+}
+````
+
+### Creating Example Orders
+
+This section will create a few example orders using the [Swagger UI](../../framework/api-development/swagger.md). Thus, we will have some sample orders to show on the UI.
+
+Now, right-click the `ModularCrm` under the `main` folder in the Solution Explorer panel and select the *Dotnet CLI* -> *Graph Build* command. This will ensure that the order module and the main application are built and ready to run.
+
+After the build process completes, open the Solution Runner panel and click the *Play* button near the solution root. Once the `ModularCrm.Web` application runs, we can right-click it and select the *Browse* command to open the user interface.
+
+Once you see the user interface of the web application, type `/swagger` at the end of the URL to open the Swagger UI. If you scroll down, you should see the `Orders` API:
+
+
+
+Expand the `/api/app/order` API and click the *Try it out* button. Then, create a few orders by filling in the request body and clicking the *Execute* button:
+
+
+
+If you check the database, you should see the entities created in the *Orders* table:
+
+
+
+## Creating the User Interface
### Creating a `_ViewImports.cshtml` File
@@ -257,28 +463,26 @@ Create an `Orders` folder under the `Pages` folder and add an `Index.cshtml` Raz
````csharp
using Microsoft.AspNetCore.Mvc.RazorPages;
-using ModularCrm.Ordering.Entities;
-using System;
using System.Collections.Generic;
using System.Threading.Tasks;
-using Volo.Abp.Domain.Repositories;
+using ModularCrm.Ordering.Contracts.Services;
namespace ModularCrm.Ordering.Pages.Orders
{
public class IndexModel : PageModel
{
- public List Orders { get; set; }
+ public List Orders { get; set; }
- private readonly IRepository _orderRepository;
+ private readonly IOrderAppService _orderAppService;
- public IndexModel(IRepository orderRepository)
+ public IndexModel(IOrderAppService orderAppService)
{
- _orderRepository = orderRepository;
+ _orderAppService = orderAppService;
}
public async Task OnGetAsync()
{
- Orders = await _orderRepository.GetListAsync();
+ Orders = await _orderAppService.GetListAsync();
}
}
}
@@ -310,14 +514,6 @@ Here, we are injecting a repository to query `Order` entities from the database
This page shows a list of orders on the UI. We haven't created a UI to create new orders, and we will not do it to keep this tutorial simple. If you want to learn how to create advanced UIs with ABP, please follow the [Book Store tutorial](../book-store/index.md).
-### Creating Some Sample Data
-
-You can open the database and manually create a few order records to show on the UI:
-
-
-
-You can get `ProductId` values from the `Products` table and [generate](https://www.guidgenerator.com/) some random GUIDs for other GUID fields.
-
### Building the Application
Now, we will run the application to see the result. Please stop the application if it is already running. Then open the *Solution Runner* panel, right-click the `ModularCrm.Web` application, and select the *Build* -> *Graph Build* command:
@@ -375,11 +571,13 @@ namespace ModularCrm.Ordering
`OrderingMenuContributor` implements the `IMenuContributor` interface, which forces us to implement the `ConfigureMenuAsync` method. In that method, we can manipulate the menu items (add new menu items, remove existing menu items or change the properties of existing menu items). The `ConfigureMenuAsync` method is executed whenever the menu is rendered on the UI, so you can dynamically decide how to manipulate the menu items.
-After creating such a class, we should configure the `AbpNavigationOptions` to add that contributor. Open the `OrderingWebModule` class in the `ModularCrm.Ordering` project and add the following configuration code into the `ConfigureServices` method (if there is no `ConfigureServices` method, first create it as shown below):
+After creating such a class, we should configure the `AbpNavigationOptions` to add that contributor. Open the `OrderingWebModule` class in the `ModularCrm.Ordering` project and add the following configuration code into the `ConfigureServices` method:
````csharp
public override void ConfigureServices(ServiceConfigurationContext context)
{
+ //... other configurations
+
Configure(options =>
{
options.MenuContributors.Add(new OrderingMenuContributor());
diff --git a/docs/en/tutorials/modular-crm/part-06.md b/docs/en/tutorials/modular-crm/part-06.md
index 2fd5d82f34..55e04259bb 100644
--- a/docs/en/tutorials/modular-crm/part-06.md
+++ b/docs/en/tutorials/modular-crm/part-06.md
@@ -145,68 +145,120 @@ ABP Studio adds the package reference and arranges the [module](../../framework/
Now, we can inject and use `IProductIntegrationService` in the Ordering module codebase.
-Open the `IndexModel` class (the `IndexModel.cshtml.cs` file under the `Pages/Orders` folder of the `ModularCrm.Ordering` project of the `ModularCrm.Ordering` .NET solution) and change its content as like the following code block:
+Open the `OrderAppService` class (the `OrderAppService.cs` file under the `Services` folder of the `ModularCrm.Ordering` project of the `ModularCrm.Ordering` .NET solution) and change its content as like the following code block:
````csharp
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using ModularCrm.Ordering.Entities;
-using ModularCrm.Products.Integration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using ModularCrm.Ordering.Contracts.Enums;
+using ModularCrm.Ordering.Contracts.Services;
+using ModularCrm.Ordering.Entities;
+using ModularCrm.Products.Integration;
+using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
-namespace ModularCrm.Ordering.Pages.Orders
+namespace ModularCrm.Ordering.Services;
+
+public class OrderAppService : ApplicationService, IOrderAppService
{
- public class IndexModel : PageModel
+ private readonly IRepository _orderRepository;
+ private readonly IProductIntegrationService _productIntegrationService;
+
+ public OrderAppService(
+ IRepository orderRepository,
+ IProductIntegrationService productIntegrationService)
+ {
+ _orderRepository = orderRepository;
+ _productIntegrationService = productIntegrationService;
+ ObjectMapperContext = typeof(OrderingWebModule);
+ }
+
+ public async Task> GetListAsync()
{
- public List Orders { get; set; }
-
- // Define a dictionary for Id -> Name conversion
- public Dictionary ProductNames { get; set; }
+ var orders = await _orderRepository.GetListAsync();
+
+ // Prepare a list of products we need
+ var productIds = orders.Select(o => o.ProductId).Distinct().ToList();
+ var products = (await _productIntegrationService
+ .GetProductsByIdsAsync(productIds))
+ .ToDictionary(p => p.Id, p => p.Name);
- private readonly IRepository _orderRepository;
- private readonly IProductIntegrationService _productIntegrationService;
+ var orderDtos = ObjectMapper.Map, List>(orders);
- public IndexModel(
- IRepository orderRepository,
- IProductIntegrationService productIntegrationService)
+ orderDtos.ForEach(orderDto =>
{
- _orderRepository = orderRepository;
- _productIntegrationService = productIntegrationService;
- }
+ orderDto.ProductName = products[orderDto.ProductId];
+ });
+
+ return orderDtos;
+ }
- public async Task OnGetAsync()
+ public async Task CreateAsync(OrderCreationDto input)
+ {
+ var order = new Order
{
- // Getting the orders from this module's database
- Orders = await _orderRepository.GetListAsync();
+ CustomerName = input.CustomerName,
+ ProductId = input.ProductId,
+ State = OrderState.Placed
+ };
- // Prepare a list of products we need
- var productIds = Orders.Select(o => o.ProductId).Distinct().ToList();
+ await _orderRepository.InsertAsync(order);
+ }
+}
+````
- // Request the related products from the product integration service
- var products = await _productIntegrationService
- .GetProductsByIdsAsync(productIds);
+And also, open the `OrderDto` class (the `OrderDto.cs` file under the `Services` folder of the `ModularCrm.Ordering.Contracts` project of the `ModularCrm.Ordering` .NET solution) and add a `ProductName` property to it:
- // Create a dictionary to get a product name easily by its id
- ProductNames = products.ToDictionary(p => p.Id, p => p.Name);
- }
+````csharp
+using System;
+using ModularCrm.Ordering.Contracts.Enums;
+
+namespace ModularCrm.Ordering.Contracts.Services;
+
+public class OrderDto
+{
+ public Guid Id { get; set; }
+ public string CustomerName { get; set; }
+ public Guid ProductId { get; set; }
+ public string ProductName { get; set; } // New property
+ public OrderState State { get; set; }
+}
+````
+
+Lastly, open the `OrderingApplicationAutoMapperProfile` class (the `OrderingApplicationAutoMapperProfile.cs` file under the `Services` folder of the `ModularCrm.Ordering` project of the `ModularCrm.Ordering` .NET solution) and ignore the `ProductName` property in the mapping configuration:
+
+````csharp
+using AutoMapper;
+using ModularCrm.Ordering.Contracts.Services;
+using ModularCrm.Ordering.Entities;
+using Volo.Abp.AutoMapper;
+
+namespace ModularCrm.Ordering;
+
+public class OrderingApplicationAutoMapperProfile : Profile
+{
+ public OrderingApplicationAutoMapperProfile()
+ {
+ CreateMap()
+ .Ignore(x => x.ProductName); // New line
}
}
````
Let's see what we've changed:
-* We have defined a `ProductNames` dictionary. We will use it on the UI to convert product IDs to product names. We are filling that dictionary with products from the product integration service.
+* We've added a `ProductName` property to the `OrderDto` class to store the product name.
* Injecting the `IProductIntegrationService` interface so we can use it to request products.
-* In the `OnGetAsync` method;
+* In the `GetListAsync` method;
* First getting the orders from the ordering module's database just like done before.
* Next, we are preparing a unique list of product IDs since the `GetProductsByIdsAsync` method requests it.
* Then we are calling the `IProductIntegrationService.GetProductsByIdsAsync` method to get a `List` object.
* In the last line, we are converting the product list to a dictionary, where the key is `Guid Id` and the value is `string Name`. That way, we can easily find a product's name with its ID.
+ * Finally, we are mapping the orders to `OrderDto` objects and setting the product name by looking up the product ID in the dictionary.
-Open the `Index.cshtml` file, and change the `@order.ProductId` part by `@Model.ProductNames[order.ProductId]` to write the product name instead of the product ID. The final `Index.cshtml` content should be the following:
+Open the `Index.cshtml` file, and change the `@order.ProductId` part by `@Model.ProductName` to write the product name instead of the product ID. The final `Index.cshtml` content should be the following:
````html
@page
@@ -219,11 +271,11 @@ Open the `Index.cshtml` file, and change the `@order.ProductId` part by `@Model.
@foreach (var order in Model.Orders)
{
-
- Customer: @order.CustomerName
- Product: @Model.ProductNames[order.ProductId]
- State: @order.State
-
+
+ Customer: @order.CustomerName
+ Product: @order.ProductName
+ State: @order.State
+
}
@@ -241,4 +293,3 @@ In the way explained in this section, you can easily create integration services
> **Design Tip**
>
> It is suggested that you keep that type of communication to a minimum and not couple your modules with each other. It can make your solution complicated and may also decrease your system performance. When you need to do it, think about performance and try to make some optimizations. For example, if the Ordering module frequently needs product data, you can use a kind of [cache layer](../../framework/fundamentals/caching.md), so it doesn't make frequent requests to the Products module. Especially if you consider converting your system to a microservice solution in the future, too many direct integration API calls can be a performance bottleneck.
-
diff --git a/docs/en/tutorials/modular-crm/part-07.md b/docs/en/tutorials/modular-crm/part-07.md
index 9dc18648bd..5ddba71421 100644
--- a/docs/en/tutorials/modular-crm/part-07.md
+++ b/docs/en/tutorials/modular-crm/part-07.md
@@ -56,83 +56,86 @@ namespace ModularCrm.Ordering.Contracts.Events
### Using the `IDistributedEventBus` Service
-The `IDistributedEventBus` service publishes events to the event bus. Until this point, the Ordering module has no functionality to create new orders.
-
-In Part 3, we used ABP's Auto HTTP API Controller feature to expose HTTP APIs from application services automatically. In this section, we will create an ASP.NET Core API controller class to create a new order. In that way, you will also see that it is not different from creating a regular ASP.NET Core controller.
-
-Open the `ModularCrm.Ordering` module's .NET solution, create a `Controllers` folder in the `ModularCrm.Ordering` project and place a controller class named `OrdersController` in that new folder. The final folder structure should be like that:
-
-
-
-Here is the full `OrdersController` class:
+The `IDistributedEventBus` service publishes events to the event bus. Until this point, the Ordering module has no functionality to create new orders. Let's change that and place an order, for that purpose open the `ModularCrm.Ordering` module's .NET solution, and update the `OrderAppService` as follows:
````csharp
-using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
using ModularCrm.Ordering.Contracts.Enums;
using ModularCrm.Ordering.Contracts.Events;
+using ModularCrm.Ordering.Contracts.Services;
using ModularCrm.Ordering.Entities;
-using System;
-using System.ComponentModel.DataAnnotations;
-using System.Threading.Tasks;
-using Volo.Abp.AspNetCore.Mvc;
+using ModularCrm.Products.Integration;
+using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.EventBus.Distributed;
-namespace ModularCrm.Ordering.Controllers
+namespace ModularCrm.Ordering.Services;
+
+public class OrderAppService : ApplicationService, IOrderAppService
{
- [Route("api/orders")]
- [ApiController]
- public class OrdersController : AbpControllerBase
+ private readonly IRepository _orderRepository;
+ private readonly IProductIntegrationService _productIntegrationService;
+ private readonly IDistributedEventBus _distributedEventBus;
+
+ public OrderAppService(
+ IRepository orderRepository,
+ IProductIntegrationService productIntegrationService,
+ IDistributedEventBus distributedEventBus)
{
- private readonly IRepository _orderRepository;
- private readonly IDistributedEventBus _distributedEventBus;
+ _orderRepository = orderRepository;
+ _productIntegrationService = productIntegrationService;
+ _distributedEventBus = distributedEventBus;
+ ObjectMapperContext = typeof(OrderingWebModule);
+ }
- public OrdersController(
- IRepository orderRepository,
- IDistributedEventBus distributedEventBus)
- {
- _orderRepository = orderRepository;
- _distributedEventBus = distributedEventBus;
- }
+ public async Task> GetListAsync()
+ {
+ var orders = await _orderRepository.GetListAsync();
+
+ // Prepare a list of products we need
+ var productIds = orders.Select(o => o.ProductId).Distinct().ToList();
+ var products = (await _productIntegrationService
+ .GetProductsByIdsAsync(productIds))
+ .ToDictionary(p => p.Id, p => p.Name);
+
+ var orderDtos = ObjectMapper.Map, List>(orders);
- [HttpPost]
- public async Task CreateAsync(OrderCreationModel input)
+ orderDtos.ForEach(orderDto =>
{
- // Create a new Order entity
- var order = new Order
- {
- CustomerName = input.CustomerName,
- ProductId = input.ProductId,
- State = OrderState.Placed
- };
-
- // Save it to the database
- await _orderRepository.InsertAsync(order);
-
- // Publish an event so other modules can be informed
- await _distributedEventBus.PublishAsync(
- new OrderPlacedEto
- {
- ProductId = order.ProductId,
- CustomerName = order.CustomerName
- });
-
- return Created();
- }
+ orderDto.ProductName = products[orderDto.ProductId];
+ });
- public class OrderCreationModel
+ return orderDtos;
+ }
+
+ public async Task CreateAsync(OrderCreationDto input)
+ {
+ // Create a new Order entity
+ var order = new Order
{
- public Guid ProductId { get; set; }
+ CustomerName = input.CustomerName,
+ ProductId = input.ProductId,
+ State = OrderState.Placed
+ };
- [Required]
- [StringLength(120)]
- public string CustomerName { get; set; }
- }
+ // Save it to the database
+ await _orderRepository.InsertAsync(order);
+
+ // Publish an event so other modules can be informed
+ await _distributedEventBus.PublishAsync(
+ new OrderPlacedEto
+ {
+ ProductId = order.ProductId,
+ CustomerName = order.CustomerName
+ });
}
}
````
-The `OrdersController.CreateAsync` method creates a new `Order` entity, saves it to the database and finally publishes an `OrderPlacedEto` event.
+The `OrderAppService.CreateAsync` method creates a new `Order` entity, saves it to the database and finally publishes an `OrderPlacedEto` event.
## Subscribing to an Event
diff --git a/docs/en/tutorials/todo/layered/index.md b/docs/en/tutorials/todo/layered/index.md
index 78f49df9dd..2eef34bbd2 100644
--- a/docs/en/tutorials/todo/layered/index.md
+++ b/docs/en/tutorials/todo/layered/index.md
@@ -53,7 +53,7 @@ This documentation has a video tutorial on **YouTube**!! You can watch it here:
## Pre-Requirements
* An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 8.0+](https://dotnet.microsoft.com/download/dotnet) development.
-* [Node v16.x](https://nodejs.org/)
+* [Node v18.19+](https://nodejs.org/)
{{if DB=="Mongo"}}
@@ -65,17 +65,17 @@ This documentation has a video tutorial on **YouTube**!! You can watch it here:
We will use the [ABP CLI](../../../cli/index.md) to create new ABP solutions. You can run the following command on a terminal window to install this dotnet tool:
-```
+````bash
dotnet tool install -g Volo.Abp.Studio.Cli
-```
+````
## Create Your ABP Solution
Create an empty folder, open a command-line terminal and execute the following command in the terminal:
-```
+````bash
abp new TodoApp{{if UI=="Blazor"}} -u blazor{{else if UI=="BlazorServer"}} -u blazor-server{{else if UI=="NG"}} -u angular{{end}}{{if DB=="Mongo"}} -d mongodb{{end}}
-```
+````
{{if UI=="NG"}}
@@ -107,9 +107,9 @@ However, sometimes this command might need to be manually run. For example, you
For such cases, run the `abp install-libs` command on the root directory of your solution to install all required NPM packages:
-```
+````bash
abp install-libs
-```
+````
> We suggest you install [Yarn](https://classic.yarnpkg.com/) to prevent possible package inconsistencies, if you haven't installed it yet.
@@ -121,9 +121,9 @@ abp install-libs
However, sometimes you might need to run this command manually. To update script & style references without worrying about dependencies, ordering, etc. in a project, you can run this command in the directory of your blazor application:
-```
+````bash
abp bundle
-```
+````
> For more details about managing style and script references in Blazor or MAUI Blazor apps, see [Managing Global Scripts & Styles](../../../framework/ui/blazor/global-scripts-styles.md).
@@ -167,9 +167,9 @@ You can explore and test your HTTP API with this UI. If it works, we can run the
You can run the application using the following command:
-```
+````bash
npm start
-```
+````
This command takes time, but eventually runs and opens the application in your default browser:
@@ -185,7 +185,7 @@ All ready. We can start coding!
This application has a single [entity](../../../framework/architecture/domain-driven-design/entities.md) and we'll start by creating it. Create a new `TodoItem` class inside the *TodoApp.Domain* project:
-```csharp
+````csharp
using System;
using Volo.Abp.Domain.Entities;
@@ -196,7 +196,7 @@ namespace TodoApp
public string Text { get; set; } = string.Empty;
}
}
-```
+````
`BasicAggregateRoot` is the simplest base class to create root entities, and `Guid` is the primary key (`Id`) of the entity here.
@@ -242,9 +242,9 @@ The startup solution is configured to use Entity Framework Core [Code First Migr
Open a command-line terminal in the directory of the *TodoApp.EntityFrameworkCore* project and type the following command:
-```
+````bash
dotnet ef migrations add Added_TodoItem
-```
+````
This will add a new migration class to the project:
@@ -252,9 +252,9 @@ This will add a new migration class to the project:
You can apply changes to the database using the following command, in the same command-line terminal:
-```
+````bash
dotnet ef database update
-```
+````
> If you are using Visual Studio, you may want to use the `Add-Migration Added_TodoItem` and `Update-Database` commands in the *Package Manager Console (PMC)*. In this case, ensure that {{if UI=="MVC"}}`TodoApp.Web`{{else if UI=="BlazorServer" || UI=="Blazor" || UI=="BlazorWebApp"}}`TodoApp.Blazor`{{else if UI=="Blazor" || UI=="NG"}}`TodoApp.HttpApi.Host`{{end}} is the startup project and `TodoApp.EntityFrameworkCore` is the *Default Project* in PMC.
@@ -264,18 +264,18 @@ Next step is to setup the [MongoDB](../../../framework/data/mongodb/index.md) co
1. Add a new property to the class:
-```csharp
+````csharp
public IMongoCollection TodoItems => Collection();
-```
+````
2. Add the following code inside the `CreateModel` method:
-```csharp
+````csharp
modelBuilder.Entity(b =>
{
b.CollectionName = "TodoItems";
});
-```
+````
{{end}}
@@ -293,7 +293,7 @@ An [Application Service](../../../framework/architecture/domain-driven-design/ap
We can start by defining an interface for the application service. Create a new `ITodoAppService` interface in the *TodoApp.Application.Contracts* project, as shown below:
-```csharp
+````csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
@@ -308,13 +308,13 @@ namespace TodoApp
Task DeleteAsync(Guid id);
}
}
-```
+````
### Data Transfer Object
`GetListAsync` and `CreateAsync` methods return `TodoItemDto`. `ApplicationService` typically gets and returns DTOs ([Data Transfer Objects](../../../framework/architecture/domain-driven-design/data-transfer-objects.md)) instead of entities. So, we should define the DTO class here. Create a new `TodoItemDto` class inside the *TodoApp.Application.Contracts* project:
-```csharp
+````csharp
using System;
namespace TodoApp
@@ -325,7 +325,7 @@ namespace TodoApp
public string Text { get; set; } = string.Empty;
}
}
-```
+````
This is a very simple DTO class that matches our `TodoItem` entity. We are ready to implement the `ITodoAppService`.
@@ -333,7 +333,7 @@ This is a very simple DTO class that matches our `TodoItem` entity. We are ready
Create a `TodoAppService` class inside the *TodoApp.Application* project, as shown below:
-```csharp
+````csharp
using System;
using System.Collections.Generic;
using System.Linq;
@@ -355,7 +355,7 @@ namespace TodoApp
// TODO: Implement the methods here...
}
}
-```
+````
This class inherits from the `ApplicationService` class of the ABP and implements the `ITodoAppService` that was defined before. ABP provides default generic [repositories](../../../framework/architecture/domain-driven-design/entities.md) for the entities. We can use them to perform the fundamental database operations. This class [injects](../../../framework/fundamentals/dependency-injection.md) `IRepository`, which is the default repository for the `TodoItem` entity. We will use it to implement the use cases described before.
@@ -363,7 +363,7 @@ This class inherits from the `ApplicationService` class of the ABP and implement
Let's start by implementing the `GetListAsync` method:
-```csharp
+````csharp
public async Task> GetListAsync()
{
var items = await _todoItemRepository.GetListAsync();
@@ -374,7 +374,7 @@ public async Task> GetListAsync()
Text = item.Text
}).ToList();
}
-```
+````
We are simply getting the complete `TodoItem` list from the database, mapping them to `TodoItemDto` objects and returning as the result.
@@ -382,7 +382,7 @@ We are simply getting the complete `TodoItem` list from the database, mapping th
Next method is `CreateAsync` and we can implement it as shown below:
-```csharp
+````csharp
public async Task CreateAsync(string text)
{
var todoItem = await _todoItemRepository.InsertAsync(
@@ -395,7 +395,7 @@ public async Task CreateAsync(string text)
Text = todoItem.Text
};
}
-```
+````
The repository's `InsertAsync` method inserts the given `TodoItem` to the database and returns the same `TodoItem` object. It also sets the `Id`, so we can use it on the returning object. We are simply returning a `TodoItemDto` by creating from the new `TodoItem` entity.
@@ -403,12 +403,12 @@ The repository's `InsertAsync` method inserts the given `TodoItem` to the databa
Finally, we can implement the `DeleteAsync` as the following code block:
-```csharp
+````csharp
public async Task DeleteAsync(Guid id)
{
await _todoItemRepository.DeleteAsync(id);
}
-```
+````
The application service is ready to be used from the UI layer.
@@ -426,7 +426,7 @@ It is time to show the todo items on the UI! Before starting to write the code,
Open the `Index.cshtml.cs` file in the `Pages` folder of the *TodoApp.Web* project and replace the content with the following code block:
-```csharp
+````csharp
using System.Collections.Generic;
using System.Threading.Tasks;
@@ -449,7 +449,7 @@ namespace TodoApp.Web.Pages
}
}
}
-```
+````
This class uses the `ITodoAppService` to get the list of todo items and assign the `TodoItems` property. We will use it to render the todo items on the razor page.
@@ -743,13 +743,13 @@ You first need to run the `TodoApp.HttpApi.Host` project since the proxy generat
Once you run the `TodoApp.HttpApi.Host` project, open a command-line terminal in the `angular` folder and type the following command:
-```
+````bash
abp generate-proxy -t ng
-```
+````
If everything goes well, it should generate an output as shown below:
-```
+```bash
CREATE src/app/proxy/generate-proxy.json (170978 bytes)
CREATE src/app/proxy/README.md (1000 bytes)
CREATE src/app/proxy/todo.service.ts (794 bytes)
diff --git a/docs/en/tutorials/todo/single-layer/index.md b/docs/en/tutorials/todo/single-layer/index.md
index 9afbbd8833..3b4f755c70 100644
--- a/docs/en/tutorials/todo/single-layer/index.md
+++ b/docs/en/tutorials/todo/single-layer/index.md
@@ -49,7 +49,7 @@ This documentation has a video tutorial on **YouTube**!! You can watch it here:
## Pre-Requirements
* An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 8.0+](https://dotnet.microsoft.com/download/dotnet) development.
-* [Node v16.x](https://nodejs.org/)
+* [Node v18.19+](https://nodejs.org/)
{{if DB=="Mongo"}}
diff --git a/docs/en/ui-themes/lepton/index.md b/docs/en/ui-themes/lepton/index.md
index 8861595d45..ed5c222c39 100644
--- a/docs/en/ui-themes/lepton/index.md
+++ b/docs/en/ui-themes/lepton/index.md
@@ -7,7 +7,7 @@ The Lepton Theme is a professional theme for the ABP.
* Built on the [Bootstrap 5](https://getbootstrap.com) library.
* 100% compatible with [Bootstrap 5](https://getbootstrap.com) HTML structure and CSS classes
* Responsive & mobile-compatible.
-* Provides different style like Material, Dark, Light.
+* Provides different styles like Material, Dark, Light.
* Provides styles for [Datatables](https://datatables.net).
A screenshot from the light style of the theme:
@@ -18,7 +18,7 @@ A screenshot from the light style of the theme:
## How to Install
-Lepton Theme module is pre-installed in [the startup templates](../../get-started). So, no need to manually install it.
+Lepton Theme module can be pre-installed to [the startup templates](../../get-started), if you specify the theme as **LeptonTheme** (see the [CLI documentation](../../cli/index.md)). So, no need to manually install it.
## Packages
@@ -73,10 +73,16 @@ See the `LeptonThemeManagementPermissions` class members for all permissions def
### Source code
-To download the source-code of the Lepton Theme use the following CLI command
+To download the source-code of the Lepton Theme use the following CLI command:
+```bash
+abp get-source Volo.Abp.LeptonTheme # for new ABP CLI
```
-abp get-source Volo.LeptonTheme
+
+If you are using the old ABP CLI, you can use the following command:
+
+```bash
+abp get-source Volo.LeptonTheme
```
## Lepton Theme Customization
@@ -86,4 +92,4 @@ Checkout how to customize the Lepton Theme to change your websiteâs overall lo
* [Customizing Lepton Theme for Angular](customizing-lepton-theme.md?UI=NG)
* [Customizing Lepton Theme for MVC](customizing-lepton-theme.md?UI=MVC)
* [Customizing Lepton Theme for Blazor](customizing-lepton-theme.md?UI=Blazor)
-* [Customizing Lepton Theme for Blazor Server](customizing-lepton-theme.md?UI=BlazorServer)
\ No newline at end of file
+* [Customizing Lepton Theme for Blazor Server](customizing-lepton-theme.md?UI=BlazorServer)
diff --git a/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/Authentication/AbpAspNetCoreTokenUnauthorizedErrorInfo.cs b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/Authentication/AbpAspNetCoreTokenUnauthorizedErrorInfo.cs
new file mode 100644
index 0000000000..2702f4f19f
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Abstractions/Volo/Abp/AspNetCore/Authentication/AbpAspNetCoreTokenUnauthorizedErrorInfo.cs
@@ -0,0 +1,12 @@
+using Volo.Abp.DependencyInjection;
+
+namespace Volo.Abp.AspNetCore.Authentication;
+
+public class AbpAspNetCoreTokenUnauthorizedErrorInfo : IScopedDependency
+{
+ public string? Error { get; set; }
+
+ public string? ErrorDescription { get; set; }
+
+ public string? ErrorUri { get; set; }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Microsoft/Extensions/DependencyInjection/AbpJwtBearerExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Microsoft/Extensions/DependencyInjection/AbpJwtBearerExtensions.cs
index 5f48cc92d5..8973b68a1f 100644
--- a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Microsoft/Extensions/DependencyInjection/AbpJwtBearerExtensions.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Microsoft/Extensions/DependencyInjection/AbpJwtBearerExtensions.cs
@@ -1,6 +1,7 @@
ï»żusing System;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Volo.Abp.AspNetCore.Authentication;
using Volo.Abp.Security.Claims;
namespace Microsoft.Extensions.DependencyInjection;
@@ -31,6 +32,33 @@ public static class AbpJwtBearerExtensions
return builder.AddJwtBearer(authenticationScheme, displayName, options =>
{
configureOptions?.Invoke(options);
+
+ options.Events ??= new JwtBearerEvents();
+ var previousOnChallenge = options.Events.OnChallenge;
+ options.Events.OnChallenge = async eventContext =>
+ {
+ await previousOnChallenge(eventContext);
+
+ if (eventContext.Handled ||
+ !string.IsNullOrEmpty(eventContext.Error) ||
+ !string.IsNullOrEmpty(eventContext.ErrorDescription) ||
+ !string.IsNullOrEmpty(eventContext.ErrorUri))
+ {
+ return;
+ }
+
+ var tokenUnauthorizedErrorInfo = eventContext.HttpContext.RequestServices.GetRequiredService();
+ if (string.IsNullOrEmpty(tokenUnauthorizedErrorInfo.Error) &&
+ string.IsNullOrEmpty(tokenUnauthorizedErrorInfo.ErrorDescription) &&
+ string.IsNullOrEmpty(tokenUnauthorizedErrorInfo.ErrorUri))
+ {
+ return;
+ }
+
+ eventContext.Error = tokenUnauthorizedErrorInfo.Error;
+ eventContext.ErrorDescription = tokenUnauthorizedErrorInfo.ErrorDescription;
+ eventContext.ErrorUri = tokenUnauthorizedErrorInfo.ErrorUri;
+ };
});
}
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj
index 4d7b852b9c..839053bc90 100644
--- a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj
+++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj
@@ -19,6 +19,7 @@
+
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs
index 89d957fe57..c0b9122b7d 100644
--- a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs
@@ -7,7 +7,7 @@ using Volo.Abp.Security.Claims;
namespace Volo.Abp.AspNetCore.Authentication.JwtBearer;
-[DependsOn(typeof(AbpSecurityModule), typeof(AbpCachingModule))]
+[DependsOn(typeof(AbpSecurityModule), typeof(AbpCachingModule), typeof(AbpAspNetCoreAbstractionsModule))]
public class AbpAspNetCoreAuthenticationJwtBearerModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
@@ -21,5 +21,6 @@ public class AbpAspNetCoreAuthenticationJwtBearerModule : AbpModule
context.Services.AddTransient();
context.Services.AddTransient();
}
+
}
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardBodyTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardBodyTagHelperService.cs
index e50d0a791a..b8462f4b5b 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardBodyTagHelperService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Card/AbpCardBodyTagHelperService.cs
@@ -32,7 +32,7 @@ public class AbpCardBodyTagHelperService : AbpTagHelperService
var small = new TagBuilder("small");
small.Attributes.Add("id", idAttr?.Value?.ToString() + "InfoText");
- small.AddCssClass("form-text text-muted");
+ small.AddCssClass("form-text");
small.InnerHtml.Append(localizedText);
return small.ToHtmlString();
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs
index bdd4cb2a27..f0f7f94439 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs
@@ -1,4 +1,6 @@
-ï»żusing Volo.Abp.AspNetCore.Mvc.UI.Bootstrap;
+ï»żusing Volo.Abp.AspNetCore.Mvc.Libs;
+using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap;
+using Volo.Abp.Data;
using Volo.Abp.Minify;
using Volo.Abp.Modularity;
@@ -11,5 +13,14 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling;
)]
public class AbpAspNetCoreMvcUiBundlingModule : AbpModule
{
-
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ if (!context.Services.IsDataMigrationEnvironment())
+ {
+ Configure(options =>
+ {
+ options.CheckLibs = true;
+ });
+ }
+ }
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/sv.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/sv.json
new file mode 100644
index 0000000000..66737dc8e1
--- /dev/null
+++ b/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"
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/DatatablesNet/DatatablesNetScriptContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/DatatablesNet/DatatablesNetScriptContributor.cs
index daea15328f..2ad3bb2bdb 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/DatatablesNet/DatatablesNetScriptContributor.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/DatatablesNet/DatatablesNetScriptContributor.cs
@@ -10,6 +10,14 @@ public class DatatablesNetScriptContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
- context.Files.AddIfNotContains("/libs/datatables.net/js/jquery.dataTables.js");
+ if (context.FileProvider.GetFileInfo("/libs/datatables.net/js/dataTables.min.js").Exists)
+ {
+ context.Files.AddIfNotContains("/libs/datatables.net/js/dataTables.min.js");
+ }
+ else
+ {
+ //TODO: Compatible code, Remove it after 8.3 rc1.
+ context.Files.AddIfNotContains("/libs/datatables.net/js/jquery.dataTables.js");
+ }
}
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js
index b4000d6cbc..e43c7caad9 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js
@@ -90,7 +90,7 @@ var abp = abp || {};
return "";
}
- var $button = $('');
+ var $button = $('');
if (firstItem.displayNameHtml) {
$button.html(abp.utils.isFunction(firstItem.text) ? firstItem.text(record, tableInstance) : firstItem.text);
@@ -240,10 +240,17 @@ var abp = abp || {};
if (tableInstance.aoColumns) {
columns = tableInstance.aoColumns;
- } else {
+ } else if (abp.utils.isFunction(tableInstance.fnSettings)) {
columns = tableInstance.fnSettings().aoColumns;
}
+ if (!columns && abp.utils.isFunction(tableInstance.api)) {
+ var settings = tableInstance.api().settings();
+ if (settings.length === 1 && settings[0].aoColumns) {
+ columns = settings[0].aoColumns;
+ }
+ }
+
if (!columns) {
return;
}
@@ -271,8 +278,9 @@ var abp = abp || {};
}
};
- var _existingApiRenderRowActionsFunction = $.fn.dataTableExt.oApi.renderRowActions;
- $.fn.dataTableExt.oApi.renderRowActions =
+ if ($.fn.dataTableExt.oApi) {
+ var _existingApiRenderRowActionsFunction = $.fn.dataTableExt.oApi.renderRowActions;
+ $.fn.dataTableExt.oApi.renderRowActions =
function (tableInstance, nRow, aData, iDisplayIndex, iDisplayIndexFull) {
if (_existingApiRenderRowActionsFunction) {
_existingApiRenderRowActionsFunction(tableInstance, nRow, aData, iDisplayIndex, iDisplayIndexFull);
@@ -280,7 +288,8 @@ var abp = abp || {};
renderRowActions(tableInstance, nRow, aData, iDisplayIndex, iDisplayIndexFull);
};
-
+ }
+
if (!$.fn.dataTable) {
return;
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
index 7b68fca32d..379523b659 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
@@ -32,6 +32,7 @@ using Volo.Abp.AspNetCore.Mvc.DataAnnotations;
using Volo.Abp.AspNetCore.Mvc.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.Infrastructure;
using Volo.Abp.AspNetCore.Mvc.Json;
+using Volo.Abp.AspNetCore.Mvc.Libs;
using Volo.Abp.AspNetCore.Mvc.Localization;
using Volo.Abp.AspNetCore.VirtualFileSystem;
using Volo.Abp.DependencyInjection;
@@ -231,6 +232,7 @@ public class AbpAspNetCoreMvcModule : AbpModule
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
AddApplicationParts(context);
+ CheckLibs(context);
}
private static void AddApplicationParts(ApplicationInitializationContext context)
@@ -277,4 +279,9 @@ public class AbpAspNetCoreMvcModule : AbpModule
partManager.ApplicationParts.AddIfNotContains(moduleAssembly);
}
}
+
+ private static void CheckLibs(ApplicationInitializationContext context)
+ {
+ context.ServiceProvider.GetRequiredService().CheckLibs(context);
+ }
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs
index d2abae0902..3b60e74d78 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs
@@ -75,10 +75,18 @@ public class AbpExceptionFilter : IAsyncExceptionFilter, IAbpFilter, ITransientD
}
else
{
- context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true");
- context.HttpContext.Response.StatusCode = (int)context
- .GetRequiredService()
- .GetStatusCode(context.HttpContext, context.Exception);
+ if (!context.HttpContext.Response.HasStarted)
+ {
+ context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true");
+ context.HttpContext.Response.StatusCode = (int)context
+ .GetRequiredService()
+ .GetStatusCode(context.HttpContext, context.Exception);
+ }
+ else
+ {
+ var logger = context.GetService>(NullLogger.Instance)!;
+ logger.LogWarning("HTTP response has already started, cannot set headers and status code!");
+ }
context.Result = new ObjectResult(new RemoteServiceErrorResponse(remoteServiceErrorInfo));
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs
index f404f52e5d..56814718b6 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs
@@ -103,10 +103,17 @@ public class AbpExceptionPageFilter : IAsyncPageFilter, IAbpFilter, ITransientDe
}
else
{
- context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true");
- context.HttpContext.Response.StatusCode = (int)context
- .GetRequiredService()
- .GetStatusCode(context.HttpContext, context.Exception!);
+ if (!context.HttpContext.Response.HasStarted)
+ {
+ context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true");
+ context.HttpContext.Response.StatusCode = (int)context
+ .GetRequiredService()
+ .GetStatusCode(context.HttpContext, context.Exception!);
+ }
+ else
+ {
+ logger.LogWarning("HTTP response has already started, cannot set headers and status code!");
+ }
context.Result = new ObjectResult(new RemoteServiceErrorResponse(remoteServiceErrorInfo));
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs
new file mode 100644
index 0000000000..d166528a05
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs
@@ -0,0 +1,6 @@
+namespace Volo.Abp.AspNetCore.Mvc.Libs;
+
+public class AbpMvcLibsOptions
+{
+ public bool CheckLibs { get; set; }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs
new file mode 100644
index 0000000000..b59cbefa45
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs
@@ -0,0 +1,100 @@
+using System;
+using System.Linq;
+using System.Net;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using Microsoft.Extensions.FileProviders;
+using Volo.Abp.DependencyInjection;
+
+namespace Volo.Abp.AspNetCore.Mvc.Libs;
+
+public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency
+{
+ private Task? _checkLibsTask;
+
+ public virtual void CheckLibs(ApplicationInitializationContext context)
+ {
+ var options = context.ServiceProvider.GetRequiredService>().Value;
+ if (options.CheckLibs)
+ {
+ var app = context.GetApplicationBuilderOrNull();
+ if (app == null)
+ {
+ var logger = context.ServiceProvider.GetRequiredService>();
+ logger.LogWarning($"The {nameof(IApplicationBuilder)} is not available. The 'CheckLibs' feature is disabled!");
+ return;
+ }
+
+ app.Use(async (httpContext, next) =>
+ {
+ if (!await CheckLibsAsyncOnceAsync(httpContext))
+ {
+ httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
+ httpContext.Response.ContentType = "text/html";
+ await httpContext.Response.WriteAsync(
+ "" +
+ " " +
+ " Error - The Libs folder is missing!" +
+ " " +
+ " " +
+ "
⚠️ The Libs folder under the wwwroot/libs directory is empty!
" +
+ "
The Libs folder contains mandatory NPM Packages for running the project.
" +
+ "
Make sure you run the abp install-libs CLI tool command.