Az ABP Commercial az ABP-keretrendszeren alapul, amely egy nyílt forráskódú és közösségvezérelt webalkalmazás-keretrendszer az ASP.NET Core számára.
Az ABP-keretrendszer kiváló infrastruktúrát biztosít karbantartható, bővíthető íráshoz. és tesztelhető kód a bevált gyakorlatokkal.
Beépített és integrált népszerű eszközök, amelyeket már ismer. Alacsony tanulási görbe, könnyű alkalmazkodás, kényelmes fejlődés.
",
@@ -127,6 +128,8 @@
"TellUsWhatYouNeed": "Mondja el, mire van szüksége.",
"YourMessage": "Az üzeneted",
"YourFullName": "A teljes neved",
+ "FirstNameField": "Keresztnév",
+ "LastNameField": "Vezetéknév",
"EmailField": "Email cím",
"YourEmailAddress": "Az email címed",
"HowMayWeHelpYou": "Hogyan segíthetünk?",
@@ -157,6 +160,8 @@
"SearchQuestionPlaceholder": "Keressen a gyakran ismételt kérdések között",
"WhatIsTheABPCommercial": "Mi az az ABP Commercial?",
"WhatAreDifferencesThanAbpFramework": "Mi a különbség a nyílt forráskódú ABP Framework és az ABP Commercial között?",
+ "AbpCommercialMetaTitle": "ABP Commercial – Teljes webfejlesztési platform: {0} | ABP Commercial",
+ "AbpCommercialMetaDescription": "Az ABP Commercial a nyílt forráskódú ABP keretrendszerre épülő előre beépített alkalmazásmodulok, gyorsfejlesztő eszközök, UI témák és szolgáltatások készlete.",
"ABPCommercialExplanation": "Az ABP Commercial prémium modulok, eszközök, témák és szolgáltatások készlete a nyílt forráskódú ABP keretrendszerre épül fel. Az ABP Commercial-t ugyanaz a csapat fejleszti és támogatja az ABP keretrendszer mögött.",
"WhatAreDifferencesThanABPFrameworkExplanation": "
Az ABP-keretrendszer egy moduláris, tematikus, mikroszolgáltatásokkal kompatibilis alkalmazásfejlesztési keretrendszer az ASP.NET Core számára. Teljes architektúrát és erős infrastruktúrát biztosít ahhoz, hogy a saját üzleti kódjára összpontosítson, ahelyett, hogy megismételné magát minden új projektnél. A szoftverfejlesztés bevált gyakorlatain és a már ismert népszerű eszközökön alapul.
Az ABP keretrendszer teljesen ingyenes, nyílt forráskódú és közösségvezérelt. Ingyenes témát és néhány előre beépített modult is biztosít (pl. személyazonosság-kezelés és bérlőkezelés).
",
"VisitTheFrameworkVSCommercialDocument": "További információért keresse fel a következő linket: {1} ",
@@ -178,6 +183,7 @@
"ChangingLicenseType": "Frissíthetem a licenctípusomat később?",
"ChangingLicenseTypeExplanation": "Magasabb licencre frissíthet, ha az aktív licencidőszakon belül kifizeti a különbözetet. Ha magasabb licenccsomagra frissít, megkapja az új csomag előnyeit, de a licencfrissítés nem módosítja a licenc lejárati dátumát. Emellett új fejlesztői helyeket is hozzáadhat meglévő licencéhez, lásd \"Hány fejlesztő dolgozhat az ABP Commercialon?\"",
"LicenseExtendUpgradeDiff": "Mi a különbség a licenc kiterjesztése és a frissítés között?",
+ "LicenseExtendUpgradeDiffExplanation": "Meghosszabbítás: A licensz meghosszabbításával/megújításával továbbra is prémium támogatást kap, valamint kisebb-nagyobb frissítéseket kap a modulokhoz és témákhoz. Emellett folytathatja az új projektek létrehozását. És továbbra is használhatja az ABP Suite-ot, amely felgyorsítja a fejlesztést. A licensz meghosszabbításakor 1 év hozzáadódik a licensz lejárati dátumához.Frissítés: licenszének frissítésével magasabb licenszcsomagra lép fel, amely további előnyöket biztosít. Tekintse meg a licensz-összehasonlító táblázatot , hogy megtekinthesse a licensztervek közötti különbségeket. Másrészt, amikor frissít, a licensz lejárati dátuma nem változik! A licensz lejárati dátumának meghosszabbításához meg kell hosszabbítania a licenszet.",
"LicenseRenewalCost": "Mennyibe kerül a licenc megújítása 1 év után?",
"LicenseRenewalCostExplanation": "A normál csapatlicenc megújítási (meghosszabbítási) ára {0} USD, a normál üzleti licencé {1} USD, a normál vállalati licencé pedig {2} USD. Ha Ön már ügyfél, jelentkezzen be fiókjába, hogy áttekintse az elérhető megújítási árakat.",
"HowDoIRenewMyLicense": "Hogyan újíthatom meg a jogosítványomat?",
@@ -189,9 +195,19 @@
"IsSourceCodeIncludedExplanation4": "
Ha egy modul forráskódját belefoglalja a megoldásba, akkor maximális szabadságot biztosít a modul testreszabásához. Ekkor azonban nem lehet automatikusan frissíteni a modult, amikor új verzió jelenik meg.
A licencek egyike sem tartalmazza az ABP Suite forráskódját, amely egy külső eszköz, amely kódot generál Önnek és segít az Ön fejlesztéséhez.
A licenctípusok közötti egyéb különbségekért tekintse meg az árazási oldalt.
",
"ChangingDevelopers": "Módosíthatom a szervezetem regisztrált fejlesztőit a jövőben?",
"ChangingDevelopersExplanation": "Amellett, hogy új fejlesztőket ad hozzá a licenchez, további költségek nélkül módosíthatja a meglévő fejlesztőket is (eltávolíthat egy fejlesztőt, és hozzáadhat egy újat ugyanarra a helyre).",
+ "WhatHappensWhenLicenseEnds": "Mi történik, ha lejár a licenszidőm?",
+ "WhatHappensWhenLicenseEndsExplanation1": "Az ABP Kereskedelmi engedély örök érvényű licensz . A licensz lejárta után folytathatja a projekt fejlesztését. És nem köteles megújítani a jogosítványát. licenszéhez egyéves frissítés és támogatási terv tartozik. Ha továbbra is új funkciókat, teljesítménynöveléseket, hibajavításokat, támogatást szeretne kapni, és továbbra is használni szeretné az ABP Suite szolgáltatást, meg kell újítania a licenszet. Ha a licensze lejár, nem részesül a következő előnyökben:",
+ "WhatHappensWhenLicenseEndsExplanation2": "Az ABP Commercial használatával nem hozhat létre új megoldásokat, de a meglévő alkalmazásait örökre továbbfejlesztheti.",
+ "WhatHappensWhenLicenseEndsExplanation3": "Frissítéseket kaphat a MINOR verzión belüli modulokhoz és témákhoz (kivéve az RC vagy Preview verziókat). Például: ha egy modul v3.2.0-s verzióját használja, továbbra is kaphat frissítéseket a modul v3.2.x-hez (v3.2.1, v3.2.5... stb.). De nem kaphat frissítéseket a következő fő- vagy mellékverzióhoz (például v3.3.0, v3.3.3, 4.xx stb.). Például amikor a licensze lejárt, a legutóbbi kiadás a 4.4.3 volt, és később, amikor a 4.4.4-es és a 4.5.0-s verzió is megjelent, akkor hozzáférhet a v4.4.X-hez, de nem elérheti a v4.5.X.",
+ "WhatHappensWhenLicenseEndsExplanation4": "A licensz lejárta után nem telepíthet új modulokat és témákat az ABP Commercial platformhoz.",
+ "WhatHappensWhenLicenseEndsExplanation5": "Az ABP Suite nem használható.",
+ "WhatHappensWhenLicenseEndsExplanation6": "A prémium támogatást már nem kaphatja meg.",
+ "WhatHappensWhenLicenseEndsExplanation7": "Meghosszabbíthatja (megújíthatja) az engedélyét, ha továbbra is igénybe kívánja venni ezeket az előnyöket. Ha a licensz lejártát követő 1 hónapon belül meghosszabbítja a licenszet, a következő kedvezmények érvényesek: Team License {0}% kedvezmény, Business License {1}% kedvezmény, Enterprise License {2}% kedvezmény.",
+ "WhatHappensWhenLicenseEndsExplanation8": "Az Ön által generált ABP projekteket nem tároljuk a szervereinken. Ezért az Ön felelőssége a letöltött forráskód megőrzése. Amikor a licensze lejár, nincs mód a generált ABP projekt forráskódjának lekérésére.",
"WhenShouldIRenewMyLicense": "Mikor kell megújítanom a jogosítványomat?",
"WhenShouldIRenewMyLicenseExplanation": "Ha a licenc lejártát követő 1 hónapon belül megújítja a licencet, a következő kedvezmények érvényesek: Csapatlicenc {0}% kedvezmény, Üzleti licenc {1}% kedvezmény, Vállalati licenc {2}% kedvezmény . Ha megújítja a licencet 1 hónappal a licenc lejárati dátuma után, a megújítási ár megegyezik a licenc vásárlási árával, és nem jár kedvezmény a megújításra.",
"TrialPlan": "Van próbaterv?",
+ "TrialPlanExplanation": "14 napos próbaidővel rendelkezik az ABP Commercial csapat licenszéhez. További információért látogasson el ide . Továbbá a Team licenszekre 30 napos pénz-visszafizetési garanciát biztosítunk. Az első 30 napban csak visszatérítést kérhet. A Business és Enterprise licenszek esetén 30 napon belül 60%-os visszatérítést biztosítunk. Ennek az az oka, hogy a Business és Enterprise licenszek tartalmazzák az összes modul és téma teljes forráskódját.",
"DoYouAcceptBankWireTransfer": "Elfogadja a banki átutalást?",
"DoYouAcceptBankWireTransferExplanation": "Igen, elfogadunk banki átutalást. Miután banki átutalással elküldte a licencdíjat, küldje el nekünk e-mailben az accounting@abp.io címre nyugtát és a kért engedély típusát. Nemzetközi bankszámlánk információi:",
"HowToUpgrade": "Hogyan lehet frissíteni a meglévő alkalmazásokat, ha új verzió érhető el?",
@@ -348,7 +364,6 @@
"WeWillSendYouADownloadLink": "Az e-könyv letöltésére szolgáló linket elküldtük a(z) {0} címre. Ellenőrizze a beérkező leveleket/levélszemét/spam dobozokat!",
"InvalidFormInputs": "Kérjük, írja be az űrlapon megadott érvényes adatokat.",
"DDDBookEmailBody": "Köszönöm. Könyve letöltéséhez kattintson ide.",
- "FreeDDDEBook": "Ingyenes DDD e-könyv",
"StartFree": "Kezdje ingyen",
"FreeTrial": "Ingyenes próbaverzió",
"AcceptsMarketingCommunications": " Igen, szeretnék kapni az ABP Commercial marketingkommunikációit.",
@@ -359,25 +374,375 @@
"CompanySize": "Cég Méret",
"Next": "Következő",
"StartTrial": "Indítsa el az ingyenes próbaverziómat",
- "ContactUsIssues": "Ha bármilyen problémája van, lépjen kapcsolatba velünk",
+ "ContactUsQuestions": "Ha bármilyen kérdése van, forduljon hozzánk",
"TrialActivatedWarning": "Kedves {0}! Egy felhasználó csak 1 ingyenes próbaidőszakra jogosult. Már felhasználta a próbaidőszakot.",
+ "ActivationRequirement": "Még egy lépés választja el a próbaidőszak megkezdésétől. Az adatok ellenőrzése után aktiváljuk a licenszét. A licensz aktiválása után e-mailt küldünk a következő címre: {0} . Ne aggódjon, ez a folyamat nem tart sokáig!",
"SaveAndDownload": "Mentés és letöltés",
"CompanyNameValidationMessage": "A cég neve túl hosszú!",
"AddressValidationMessage": "A cím túl hosszú!",
"TaxNoValidationMessage": "Az ADÓ/ÁFA szám túl hosszú!",
"NotesValidationMessage": "A megjegyzésmező túl hosszú!",
"CheckYourBillingInfo": "Számlát csak egyszer készíthet! A számla elkészítése előtt ellenőrizze számlázási adatait.",
- "Volo.AbpIo.Commercial:030000": "Már felhasználta a próbaidőszakot.",
- "Volo.AbpIo.Commercial:030001": "Ez a szervezetnév már létezik.",
"StartYourFreeTrial": "Indítsa el az ingyenes próbaidőszakát",
"TrialLicenseModelInvalidErrorMessage": "A következő mezők egyike érvénytelen: Ország neve, vállalat mérete, iparág vagy felhasználás célja.",
"Trial": "Próba",
"Purchased": "Vásárolt",
- "PurchaseLicense": "Vásárlási engedély",
+ "PurchaseNow": "Vásároljon most",
"PurchaseTrialLicenseMessage": "A licence lejárati dátuma: {0}. Ha továbbra is használni szeretné az ingyenes próbaidőszak alatt létrehozott projekteket, módosítania kell a licenckulcsokat az appsettings.secrets.json fájlokban. Itt van a licenckulcsod:",
"TrialLicenseExpireMessage": "Ön a próbalicencet használja, és a próbalicence a következő napon lejár: {0}.",
"TryForFree": "Próbáld ki ingyen",
"TrialLicenseExpiredInfo": "A próbalicensz időszaka lejárt!",
- "CommercialNewsletterConfirmationMessage": "Elfogadom az Általános Szerződési Feltételeket és az Adatvédelmi irányelveket ."
+ "DowngradeLicensePlan": "Leválthatok alacsonyabb licenszcsomagra a jövőben?",
+ "DowngradeLicensePlanExplanation": "Nem módosíthatja a meglévő licenszcsomagot. De vásárolhat egy új alacsonyabb licenszcsomagot, és folytathatja a fejlesztést az új licenszen. Miután megvásárolta az alacsonyabb licenszet, csak be kell jelentkeznie az új licenszcsomagba az ABP CLI paranccsal: ` abp login -o `.",
+ "LicenseTransfer": "Egy licenszet át lehet adni egyik fejlesztőről a másikra?",
+ "LicenseTransferExplanation": "Igen! licensz vásárlásakor Ön lesz a licensz tulajdonosa, így hozzáférhet a szervezetkezelési oldalhoz. Egy szervezetnek tulajdonosi és fejlesztői szerepei vannak. A tulajdonosok kezelhetik a fejlesztői helyeket, és fejlesztőket rendelhetnek hozzá. Minden kijelölt fejlesztő az ABP CLI paranccsal jelentkezik be a rendszerbe, és fejlesztési és támogatási jogosultságokkal rendelkezik.",
+ "UserOwnerDescription": "A szervezet „Tulajdonosa” a fiók adminisztrátora. licenszek vásárlásával és fejlesztők kiosztásával irányítja a szervezetet. A „Tulajdonos” nem írhat kódot az ABP Commercial projektekben, nem töltheti le az ABP mintaprojekteket, és nem tehet fel kérdéseket a támogatási webhelyen. Ha mindezeket meg akarja tenni, fel kell vennie magát fejlesztőként is.",
+ "UserDeveloperDescription": "A „fejlesztők” kódot írhatnak az ABP Commercial projektekben, letölthetik az ABP mintaprojekteket, és kérdéseket tehetnek fel a támogatási webhelyen. Másrészt a „Fejlesztők” nem kezelhetik ezt a szervezetet.",
+ "RemoveCurrentUserFromOrganizationWarningMessage": "Ön eltávolítja magát saját szervezetéből. A továbbiakban nem fogja tudni kezelni ezt a szervezetet, megerősíti?",
+ "RenewExistingOrganizationOrCreateNewOneMessage": "Az alábbi \"Meghosszabbítás most\" gomb(ok)ra kattintva megújíthatja szervezete(i) licenszét, és így 1 évvel meghosszabbíthatja a licensz lejárati dátumát. Ha folytatja a fizetést, új szervezete lesz. Új szervezetnél szeretné folytatni?",
+ "PurchaseTrialOrganizationOrCreateNewOneMessage": "Van próbaengedélyed. A próbalicensz megvásárlásához kattintson a Vásárlás most gombra. Ha folytatja a fizetést, új szervezete lesz. Új szervezetnél szeretné folytatni?",
+ "ExtendNow": "Hosszabbítsa meg most",
+ "CreateNewOrganization": "Hozzon létre egy új szervezetet",
+ "RenewLicenseEarly": "Ha korán megújítom a jogosítványomat, megkapom a teljes évet?",
+ "RenewLicenseEarylExplanation": "Ha megújítja a licenszet a licensz lejárati dátuma előtt, 1 év hozzáadódik a licensz lejárati dátumához. Például, ha licensze {0}-06-06-án lejár, és {0}-01-01-én újítja meg, az új licensz lejárati dátuma {1}-06-06.",
+ "OpenSourceWebApplication": "Nyílt forráskódú webes alkalmazás",
+ "CompleteWebDevelopment": "Komplett webfejlesztés",
+ "ABPFrameworkDescription": "Az ABP Framework egy komplett infrastruktúra modern webalkalmazások létrehozásához a szoftverfejlesztés bevált gyakorlatainak és konvencióinak követésével.",
+ "CommunityDescription": "Ossza meg tapasztalatait az ABP keretrendszerrel!",
+ "GetStarted": "Fogj neki",
+ "Views": "nézetek",
+ "LatestPosts": "Legutóbbi bejegyzések",
+ "PreBuiltApplication": "Előre beépített alkalmazás",
+ "DatabaseProviders": "Adatbázis-szolgáltatók",
+ "UIFrameworks": "UI keretrendszerek",
+ "UsefulLinks": "Hasznos Linkek",
+ "Platform": "Felület",
+ "CoolestCompaniesUseABPCommercial": "A legmenőbb cégek már használják az ABP Commercial-t.",
+ "UserInterface": "Felhasználói felület",
+ "APIGateway": "API átjáró",
+ "Microservice": "Mikroszolgáltatás",
+ "Database": "Adatbázis",
+ "Architecture": "Építészet",
+ "MicroserviceArchitectureExplanation": "Ez egy teljes megoldás-architektúra, amely több alkalmazásból, API-átjáróból, mikroszolgáltatásból és adatbázisokból áll, hogy a legújabb technológiákkal skálázható mikroszolgáltatási megoldást építsenek ki.",
+ "BusinessLogic": "Üzleti logika",
+ "DataAccessLayer": "Adatelérési réteg",
+ "Monolith": "Monolit",
+ "ModularArchitectureExplanation": "Ez az indítási sablon egy réteges, moduláris és DDD-alapú megoldás-architektúrát kínál tiszta és karbantartható kódbázis létrehozásához.",
+ "SeeDetails": "Lásd a részleteket",
+ "SeeDocumentation": "Nézze meg a Dokumentációt",
+ "Bs5Compatible": "Bootstrap 5 kompatibilis professzionális téma, tökéletes az adminisztrátori webhelyhez.",
+ "LeptonXTheme": "LeptonX téma",
+ "LeptonXDark": "LeptonX sötét",
+ "LeptonXLight": "LeptonX Light",
+ "LeptonXSemiDark": "LeptonX félsötét",
+ "BuiltOnBs5Library": "Bootstrap 5 könyvtárra építve",
+ "FullyCompatibleWithBs5": "100%-ban kompatibilis a Bootstrap 5 HTML struktúrájával és CSS osztályaival",
+ "ResponsiveAndMobileCompatible": "Reszponzív, mobil kompatibilis, RTL támogatás",
+ "ProvidesStylesForDatatables": "Stílusokat biztosít az adattáblákhoz",
+ "MultipleLayoutOptions": "Többféle elrendezési lehetőség",
+ "EasilyInstallAndUpgrade": "Könnyen telepíthető és frissíthető",
+ "SupportForum": "Támogatói fórum",
+ "TrustedBy": "Megbízható",
+ "OurPricing": "Áraink",
+ "Plans": "Tervek",
+ "NameSurname": "Név vezetéknév",
+ "Unspecified": "Meg nem határozott",
+ "LicenceType": "Licensz típus",
+ "LicenseDiscountWarning": "EZ A KEDVEZMÉNYOLDAL ALAPÉRTELMEZETT KEDVEZMÉNYKÓDOT HASZNÁL ÉS A VOLOSOFT FEJLESZTŐK SZÁMÁRA VAN. AZ ALÁBBI VÁSÁRLÁSI LINKEK NEM MŰKÖDNEK.",
+ "DiscountedLicenseExplanation": "Ezek a licenszárak kis startup vállalkozásokra, egyéni fejlesztőkre, hallgatókra, nonprofit szervezetekre és projektekre vonatkoznak!",
+ "General": "Általános",
+ "License": "Licensz",
+ "Development": "Fejlődés",
+ "Payment": "Fizetés",
+ "WatchExplainerVideo": "Találkozzunk! Nézze meg a magyarázó videót",
+ "LightDarkAndSemiDarkThemes": "Világos, Sötét és Félsötét",
+ "LeptonXThemeExplanation": "A Lepton Theme módosíthatja a témát a rendszerbeállításoknak megfelelően.",
+ "PRO": "PRO",
+ "WelcomeToABPCommercial": "Üdvözöljük az ABP Commercial oldalán!",
+ "YourAccountDetails": "Fiók adatai",
+ "OrganizationName": "Szervezet neve",
+ "AddDevelopers": "Adjon hozzá fejlesztőket",
+ "StartDevelopment": "Kezdje el a fejlesztést",
+ "CreateAndRunApplicationUsingStartupTemplate": "Ismerje meg, hogyan hozhat létre és futtathat új webalkalmazást az ABP Commercial indítási sablon használatával.",
+ "CommunityDescription2": "A Community.abp.io egy olyan hely, ahol az emberek megoszthatnak ABP-vel kapcsolatos cikkeket. Keressen cikkeket, oktatóanyagokat, kódmintákat, esettanulmányokat, és találkozzon Önnel azonos sávban élő emberekkel.",
+ "UseABPSuiteExplanation": "Az ABP Suite segítségével töltse le a modulok és témák forráskódját.",
+ "ManageModulesWithSuite": "ABP-moduljait a Suite segítségével is kezelheti.",
+ "LearnHowToInstallSuite": "Ismerje meg az ABP Suite telepítését és használatát.",
+ "SeeMore": "Többet látni",
+ "SeeLess": "Lásd Kevesebb",
+ "LayeredSolutionStructure": "Réteges megoldás szerkezete",
+ "LayeredSolutionStructureExplanation": "A megoldás a tartományvezérelt tervezési elvek és minták alapján rétegzett, hogy elkülönítse az üzleti logikát az infrastruktúrától és az integrációktól, és maximalizálja a kód karbantarthatóságát és újrafelhasználhatóságát. Az ABP Framework már tartalmaz absztrakciókat, alaposztályokat és útmutatókat a DDD tényleges megvalósításához az alkalmazásban.",
+ "MultipleUIOptions": "Több felhasználói felület opció",
+ "MultipleUIOptionsExplanation": "Szeretjük a felhasználói felület létrehozásának különböző módjait. Ez az indítási megoldás három különböző felhasználói felületi keretrendszert biztosít az üzleti alkalmazás számára.",
+ "MultipleDatabaseOptions": "Több adatbázis-beállítás",
+ "MultipleDatabaseOptionsExplanation": "Két adatbázis-szolgáltató lehetősége van (amellett, hogy mindkettőt egyetlen alkalmazásban használhatja). Az Entity Framework Core segítségével bármilyen relációs adatbázissal dolgozhat, és opcionálisan használja a Dappert, ha alacsony szintű lekérdezéseket kell írnia a jobb teljesítmény érdekében. A MongoDB egy másik lehetőség, ha dokumentum alapú NoSQL adatbázist kell használnia. Noha ezek a szolgáltatók jól integráltak, absztraktáltak és előre konfiguráltak, valójában bármilyen adatbázis-rendszerrel kapcsolatba léphet, amelyet a .NET-tel használhat.",
+ "ModularArchitectureExplanation2": "A a legfőbb szempont az ABP.IO platformon. Az alkalmazás összes funkciója jól elkülönített opcionális modulokra van felosztva. Az indítási megoldás már előre telepítve tartalmazza az alapvető ABP Commercial modulokat . Saját modulokat is létrehozhat, hogy moduláris rendszert építsen fel saját alkalmazásához.",
+ "MultiTenancyForSaasBusiness": "Többérlős felépítés az Ön SaaS-üzleteihez",
+ "MultiTenancyForSaasBusinessExplanation": "Az ABP Commercial teljes körű, többbérlős rendszert biztosít SaaS (Software-as-a-Service) rendszereinek létrehozásához. Lehetővé teszi a bérlők számára, hogy megosszák vagy rendelkezzenek saját adatbázisokkal az on-the-fly adatbázis-létrehozó és migrációs rendszerrel.",
+ "MicroserviceStartupSolution": "Mikroszolgáltatás indítási megoldás",
+ "MicroserviceArchitectureExplanation2": "Beszerezheti következő mikroszolgáltatási rendszeréhez, hogy kihasználhassa az előre elkészített alapmegoldást és tiszta élményt.",
+ "PreIntegratedTools": "Előre integrálva a népszerű eszközökbe",
+ "PreIntegratedToolsExplanation": "A megoldás már integrálva van az ipari szabványos eszközökbe és technológiákba, miközben Ön bármikor módosíthatja azokat, és integrálhatja kedvenc eszközeibe.",
+ "SingleSignOnAuthenticationServer": "Egyszeri bejelentkezéses hitelesítési kiszolgáló",
+ "SingleSignOnAuthenticationServerExplanation": "A megoldás rendelkezik egy hitelesítési kiszolgálóalkalmazással, amelyet a többi alkalmazás egyszeri bejelentkezési kiszolgálóként használ API hozzáférés-kezelési szolgáltatásokkal. Az IdentityServeren alapul.",
+ "WebAppsWithGateways": "2 webalkalmazás 2 API átjáróval",
+ "WebAppsWithGatewaysExplanation": "A megoldás két webalkalmazást tartalmaz, mindegyik rendelkezik dedikált API-átjáróval (BFF - Backend For Frontend minta).",
+ "BackOfficeApplication": "Back Office alkalmazás",
+ "BackOfficeApplicationExplanation": "A rendszer tényleges webalkalmazása, több felhasználói felületi keretbeállítással. Bármilyen üzleti alkalmazást létrehozhat.",
+ "LandingWebsite": "Landing webhely",
+ "LandingWebsiteExplanation": "Általános célú/nyilvános webhely, amely többféle célra is használható, például a cég bemutatására, termékei értékesítésére stb.",
+ "ABPFrameworkEBook": "Mastering ABP Framework e-book",
+ "MasteringAbpFrameworkEBookDescription": "Tartalmazza az ABP kereskedelmi licenszét",
+ "FullName": "Teljes név",
+ "LicenseTypeNotCorrect": "A licensz típusa nem megfelelő!",
+ "Trainings": "Képzések",
+ "ChooseTrainingPlaceholder": "Válaszd ki a képzést...",
+ "DoYouNeedTrainings": "Szüksége van egy ilyen képzésre?",
+ "DoYouNeedTraining": "Szüksége van a(z) {0} képzésére?",
+ "GetInTouchUs": "Vegye fel velünk a kapcsolatot",
+ "ForMoreInformationClickHere": "További információért kattintson ide.",
+ "IsGetOnboardingTraining": "Szeretnél bevezető és webalkalmazás-fejlesztő tréningen részt venni?",
+ "OnboardingWebApplicationDevelopmentTrainingMessage": "Képzési naptárának ütemezéséhez a szervezet létrehozása után vegye fel a kapcsolatot a következővel: {0}",
+ "CustomPurchaseMessage": "A következő lépéshez kattintson a(z) {0} gombra, és lépjen kapcsolatba velünk.",
+ "Note": "jegyzet",
+ "AdditionalNote": "Kiegészítő megjegyzés",
+ "OnboardingTrainingFaqTitle": "Van ABP bevezető képzése?",
+ "OnboardingTrainingFaqExplanation": "Igen, van ABP képzési szolgáltatásunk, amely segít abban, hogy ABP-projektjét gyorsan elindítsa. Megtanulja az ABP-t az ABP törzscsoport egyik tagjától, és elsajátítja az ABP-projekt megkezdéséhez szükséges készségeket. A bevezető tréningen elmagyarázzuk, hogyan állítsa be fejlesztői környezetét, telepítse a szükséges eszközöket, készítsen egy teljesen működőképes CRUD oldalt. A tréning élőben lesz, a Zoom alkalmazást használjuk, valamint nyitottak vagyunk más online találkozóplatformok használatára is. A képzés nyelve angol lesz. A foglalkozások során felteheti kérdéseit az ABP-vel kapcsolatban is. Mindkét fél számára megfelelő időpontot és dátumot tervezünk. További információért lépjen kapcsolatba velünk az info@abp.io címen .",
+ "AddBasket": "Kosárba helyez",
+ "SendTrainingRequest": "Képzési kérelem küldése",
+ "OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* A dokumentum angol nyelvű változata a legfrissebb, és minden vitában az angol verzió az irányadó.",
+ "Pricing_Page_Title": "Tervek és árak",
+ "Pricing_Page_Description": "Válassza ki azokat a szolgáltatásokat és funkciókat, amelyekre ma vállalkozásának szüksége van. Vásároljon ABP kereskedelmi licenszet, és hozzon létre korlátlan számú projektet.",
+ "Pricing_Page_HurryUp": "Siess!",
+ "Pricing_Page_BuyLicense": "Vásároljon licenszet 2021-es árakon január 16-ig!",
+ "Pricing_Page_ValidForExistingCustomers": "Meglévő ügyfelekre és licenszmegújításokra is érvényes.",
+ "Pricing_Page_Hint1": "A licensz ára bizonyos számú fejlesztői helyet tartalmaz. Ha több fejlesztője van, bármikor vásárolhat további üléseket.",
+ "Pricing_Page_Hint2": "További fejlesztői licenszeket vásárolhat most vagy a jövőben. A licenszek szék alapúak, így áthelyezhet egy helyet egy fejlesztőtől a másikhoz.",
+ "Pricing_Page_Hint3": "licenszével korlátlan számú különböző terméket fejleszthet.",
+ "Pricing_Page_Hint4": "Az ABP Suite egy olyan eszköz, amely segíti a fejlesztést a termelékenység javítása érdekében. Támogatja a CRUD oldalak generálását és új projektek létrehozását.",
+ "Pricing_Page_Hint5": "Az összes előre beépített modult használhatja alkalmazásaiban.",
+ "Pricing_Page_Hint6": "Az összes előre elkészített témát használhatja alkalmazásaiban.",
+ "Pricing_Page_Hint7": "Az indítási sablon a Visual Studiohoz, amellyel azonnal elkezdheti a projektet. Az összes alapvető modul hozzáadásra és előre konfigurálva van az Ön számára.",
+ "Pricing_Page_Hint8": "Az ABP-keretrendszer elsajátítása című e-könyv elmagyarázza, hogyan lehet .NET-megoldásokat megvalósítani a legjobb gyakorlatokkal. A könyvet az Amazon.com oldalon árusítják, és licensze keretein belül ingyenesen letöltheti a könyvet.",
+ "Pricing_Page_Hint9": "Bármely modul forráskódja letölthető. Érdemes lehet a forráskódot hozzáadni a megoldáshoz, hogy radikális változtatásokat hajtson végre, vagy biztonsági okokból egyszerűen megtarthatja magának.",
+ "Pricing_Page_Hint10": "A licenszek életre szólnak. Ez azt jelenti, hogy örökké folytathatja az alkalmazás fejlesztését. A legfrissebb verzióhoz való hozzáférés és a támogatás megszerzése a licensz időtartamán belül biztosított (1 év, ha nem újítja meg).",
+ "Pricing_Page_Hint11": "Nincs korlátozás a telepítésre! Tetszőleges számú kiszolgálóra telepítheti, beleértve a felhőszolgáltatásokat vagy a helyszíni szolgáltatásokat.",
+ "Pricing_Page_Hint12": "A modulokat, témákat és eszközöket frissítheti a legújabb verzióra az aktív licenszidőszakon belül. A licensz lejárta után meg kell újítania, hogy továbbra is frissítéseket kaphasson a hibajavításokról, új funkciókról és fejlesztésekről.",
+ "Pricing_Page_Hint13": "A prémium támogatást egy évre kaphatja meg (a licensz megújításával meghosszabbítható).",
+ "Pricing_Page_Hint14": "A csapat- és üzleti licenszeknek van incidens/kérdésszám korlátja. Ha további fejlesztői licenszeket vásárol, az incidensek korlátja fejlesztőnként {0}-kal (a csapatlicensz esetén) vagy {1}-kal (az üzleti licensz esetében) nő.",
+ "Pricing_Page_Hint15": "Csak az Enterprise licensz tartalmaz magántámogatást. Küldhet e-mailt közvetlenül az ABP csapatának, vagy kérdéseket tehet fel a support.abp.io oldalon privát jegy opcióval. A privát jegyek nem láthatók a nyilvánosság számára.",
+ "Pricing_Page_Hint16": "Letöltheti az összes ABP téma forráskódját. Érdemes lehet a forráskódot hozzáadni a megoldáshoz, hogy radikális változtatásokat hajtson végre, vagy biztonsági okokból egyszerűen megtarthatja magának.",
+ "Pricing_Page_Testimonial_1": "Az ABP Commercial lehetővé tette az SC Ventures számára, hogy 9 hónapon belül egy banki szintű többbérlős silo-adatbázis SaaS-platformot szállítson a követelések/tartozások ellátási láncának támogatására, jelentős értékű számlák több integrált horgonyból történő finanszírozásához. Az ABP modularitása lehetővé tette a csapat számára, hogy rekordidő alatt szállítsa, átadja az összes VAPT-t, és a konténeres mikroszolgáltatások veremét teljes CI/CD-n és csővezetékeken keresztül üzembe helyezze.",
+ "Pricing_Page_Testimonial_2": "Látjuk az ABP Commercial használatának értékét az egyedi fejlesztési projektek általános költségeinek csökkentésére. És a csapat képes egységesíteni a kódmintát a különböző projektfolyamokban. Több lehetőséget látunk a keretrendszerben arra, hogy a korábbinál gyorsabban építsünk új funkciókat. Bízunk benne, hogy folyamatosan látni fogjuk az ABP Commercial kihasználásának értékét.",
+ "Pricing_Page_Testimonial_3": "Szeretjük az ABP-t. Nem kell mindent a nulláról írnunk. A beépített funkciókból indulunk ki, és csak arra koncentrálunk, amit valóban meg kell írnunk. Ezenkívül az ABP jól felépített, és a kód kiváló minőségű, kevesebb hibával. Ha magunknak kellene megírnunk mindent, amire szükségünk van, akkor lehet, hogy éveket kellene töltenünk. Még egyszer, amit szeretünk, az az, hogy az új verzió, a hibajavítás vagy a fejlesztés nagyon hamar, minden második héten megjelenik. Nem várunk túl sokáig.",
+ "Pricing_Page_Testimonial_4": "Az ABP Commercial egy fantasztikus termék, amelyet ajánlunk. Kereskedelmi termékek, amelyeket ügyfeleink számára egyetlen konfigurálható platformon értékesíthetnek. Az ugrásszerű indítás, amelyet a keret és az eszközök biztosítanak bármely csapat számára, minden centet megér. Az ABP Commercial volt a legjobban megfelelő az igényeinknek.",
+ "Pricing_Page_Testimonial_5": "Az ABP Framework nem csak keretrendszer, hanem útmutató is a projektfejlesztéshez/menedzsmenthez, mert DDD, GenericRepository, DI, Microservice és Modularity képzést biztosít. Ha magát a keretrendszert nem is használja, fejlesztheti magát a docs.abp.io-val, amely jól és professzionálisan elkészített (OpenIddict, Redis, Quartz stb.) leírás. Mivel sok minden előre be van építve, jelentősen lerövidíti a projektfejlesztési időt (például bejelentkezési oldal, kivételkezelés, adatszűrés, aéapadatok, audit naplózás, lokalizáció, automatikus API vezérlő stb.). Alkalmazásunkból példaként a Helyi Event Bus-t használtam az állomány karbantartására. Így a rendelési mozgásokat eseményekkel tudom a készlethez igazítani. Csodálatos, hogy nem veszítünk időt a CreationTime-ra, a CreatorId-re. Automatikusan feltöltődnek.",
+ "AbpBookDownloadArea_ClaimYourEBook": "Igényelje Mastering ABP Framework e-könyvét",
+ "AddMemberModal_Warning_1": "Ha a hozzáadni kívánt felhasználónév nem létezik a rendszerben, kérje meg csapattagját, hogy regisztráljon a (z) {0} webhelyen, és ossza meg fiókja felhasználónevét Önnel.",
+ "MyOrganizations_Detail_WelcomeMessage": "Üdvözöljük szervezetében, {0}",
+ "MyOrganizations_Detail_OrganizationManagement": "Szervezetmenedzsment",
+ "OrganizationDisplayName": "Szervezet megjelenített neve",
+ "MyOrganizations_Detail_EditDisplayName": "Megjelenítési név szerkesztése",
+ "MyOrganizations_Detail_UpgradeYourLicense": "Frissítse licenszét",
+ "MyOrganizations_Detail_LicenseStartAndExpiryDate": "licensz kezdő dátuma – lejárati dátum",
+ "MyOrganizations_Detail_OwnerRightInfo": "Ön {1} tulajdonosi jogának {0}-át használja.",
+ "MyOrganizations_Detail_CopyApiKey": "Másolja ki a kulcsot",
+ "MyOrganizations_Detail_ApiKeyDescription": "Az API-kulcs a(z) {1} webhelyen tárolt PRO-csomagok tokenje.",
+ "MyOrganizations_Detail_YourPrivateNugetSource": "Az Ön privát NuGet-forrása {0}",
+ "MyOrganizations_Detail_PrivateNugetSourceWarning": "Ez automatikusan hozzáadódik feedként a NuGet.Config-hoz az ABP-megoldásban. Ne ossza meg privát kulcsát illetéktelen felhasználókkal!",
+ "MyOrganizations_Detail_DeveloperSeatInfo": "Ön {1} fejlesztői helyéből {0}-ot használ.",
+ "NeedMoreSeatsForYourTeam": "Több hozzáférésre van szüksége a csapatának?",
+ "MyOrganizations_Detail_PricePerYear": "{0}/év",
+ "MyOrganizations_Detail_PurchaseDeveloperSeats": "Vásároljon fejlesztői hozzáféréseket",
+ "Invoices": "Számlák",
+ "RequestInvoice": "Kérjen számlát",
+ "OrderNumber": "Rendelésszám",
+ "Date": "Dátum",
+ "Products": "Termékek",
+ "TotalPrice": "Teljes ár",
+ "ThereIsNoInvoice": "Nincs számla",
+ "MyOrganizations_Detail_PaymentProviderInfo": "Ha licenszét a (z) {0} átjárón keresztül vásárolta, az elküldi a PDF számlát az Ön e-mail címére, lásd: {0} számlázás.",
+ "MyOrganizations_Detail_PayUInfo": "Ha a PayU átjárón keresztül vásárolt, kattintson a \"Számla kérése\" gombra, és töltse ki a számlázási adatokat.",
+ "MyOrganizations_Detail_ConclusionInfo": "Számlakérését {0} munkanapon belül lezárjuk.",
+ "ExtendYourLicense": "Hosszabbítsa meg {0} licenszét",
+ "Continue": "Folytatni",
+ "PurchaseLicense": "Vásárlási engedély",
+ "DownloadInvoiceModal_DownloadInvoice": "Számla letöltése",
+ "DownloadInvoiceModal_SaveInformationOnlyOnce": "Számlázási adatait csak egyszer mentheti el.",
+ "InvoiceModal_EnterCompanyName": "Adja meg cégének hivatalos nevét...",
+ "InvoiceModal_EnterCompanyAddress": "Adja meg cége jogi címét...",
+ "InvoiceModal_EnterTaxNumber": "Adja meg adószámát, ha van...",
+ "RequestInvoiceModal_EnterNotes": "Írja be a számlával kapcsolatos extra üzenetet...",
+ "PrePayment_PayWithIyzico": "Iyzico-val fog fizetni",
+ "ContinueToCheckout": "Tovább a Pénztárhoz",
+ "PrePayment_IyzicoRedirectionInfo": "A vásárlás biztonságos befejezéséhez átirányítjuk az Iyzico Payment Gateway oldalra.",
+ "PrePayment_IyzicoAcceptVisaAndMasterCard": "Az Iyzico Visa és MasterCard kártyákat fogad el.",
+ "Purchase": "Vásárlás",
+ "AcceptTermsAndConditions": "Elolvastam, megértettem és elfogadom az adatvédelmi szabályzatot , a feltételeket és az EULA-t.",
+ "AcceptTermsAndConditionsWarningMessage": "Kérjük, fogadja el az adatvédelmi szabályzatot és a feltételeket",
+ "SelectGatewayToContinue": "Kérjük, válasszon egy átjárót a folytatáshoz!",
+ "GatewaySelection_SelectGateway": "Válasszon fizetési átjárót",
+ "GatewaySelection_RedirectionMessage": "Ezután átirányítjuk a kiválasztott fizetési átjáró webhelyére a tranzakcióhoz.",
+ "PaymentSucceed_PaymentSuccessMessage": "Sikeres fizetés",
+ "PaymentSucceed_ThanksForPurchase": "Köszönjük a vásárlást!",
+ "PaymentSucceed_CreateYourOrganization": "Hozd létre a szervezetedet",
+ "PaymentSucceed_AddMeAsDeveloper": "Én is fejlesztő vagyok, vegyen fel fejlesztőként a szervezetembe.",
+ "PaymentSucceed_CreateOrganization": "Szervezet létrehozása",
+ "PaymentSucceed_OrganizationDescription": "Egy szervezet fejlesztőkből és tulajdonosokból áll. A fejlesztők olyan felhasználók, akik kódot írnak az ABP projektben, és részesülnek a {1} webhely előnyeiből. A tulajdonosok olyan felhasználók, akik fejlesztői helyeket osztanak ki és kezelik a licenszelést.",
+ "PaymentSucceed_ViewOrganization": "Kattintson ide a szervezet megtekintéséhez",
+ "Purchase_TotalAnnualPrice": "ÖSSZESEN (éves díj)",
+ "Purchase_TrainingPrice": "Képzési ár",
+ "Purchase_OnboardingTraining": "ABP Onboarding és webalkalmazás-fejlesztés élő képzés",
+ "TotalDeveloperPrice": "Teljes fejlesztői ár",
+ "Purchase_PricePerDeveloper": "{0} {1} fejlesztőnként",
+ "Purchase_IncludedDeveloperInfo": "{0} {1} tartalmazza.",
+ "Purchase_LicenseExtraDeveloperPurchaseMessage": "A(z) {0} licensz {1} fejlesztőt tartalmaz. Hozzáadhat további fejlesztőket most vagy később.",
+ "StartupTemplates_Page_Title": "Az indítási sablonok",
+ "StartupTemplates_Page_Description": "Az ABP Commercial lehetővé teszi, hogy bármilyen bonyolultságú megoldást készítsen. Két fő előre beépített indítási megoldást kínál. Kiválaszthatja az igényeinek megfelelőt, és ráépítheti saját egyedi megoldását.",
+ "MicroserviceStartupSolutionForDotnet": "Microservice Startup Solution for .NET",
+ "MonolithSolutionForDotnet": "Monolith (moduláris) megoldás .NET-hez",
+ "TrainingDetailsHeaderInfo_TrainingHour": "{0} óra",
+ "Trainings_Content": "A képzés tartalma",
+ "Trial_Page_StartYourFreeTrial": "Indítsa el az ingyenes próbaverziót",
+ "TrialLicenseFeatures": "Élvezheti az ABP összes kereskedelmi funkcióját",
+ "TrialPeriodDays": "{0} napos csapatengedéllyel rendelkezik",
+ "TrialForumSupportIncident": "{0} fórumtámogatási incidense lesz",
+ "Contact_Page_Title": "Lépjen kapcsolatba az ABP fejlesztési csapatával",
+ "Contact_Page_Description": "Lépjen kapcsolatba az ABP Development csapatával, ha segítségre van szüksége, vagy ossza meg gondolatait és véleményét! Az ABP támogatási csapata készen áll a segítségére.",
+ "Demo_Page_Title": "Hozzon létre egy demót",
+ "Demo_Page_Description": "Hozzon létre egy ingyenes demót az ABP Commercial indítósablon segítségével létrehozott mintaalkalmazás megtekintéséhez. Ne ismételje magát a gyakori alkalmazási követelmények miatt.",
+ "Discounted_Page_Title": "Kedvezményes ár",
+ "Discounted_Page_Description": "Válassza ki azokat a szolgáltatásokat és funkciókat, amelyekre ma vállalkozásának szüksége van. Vásároljon ABP kereskedelmi licenszet, és hozzon létre korlátlan számú projektet",
+ "Faq_Page_Title": "Gyakran Ismételt Kérdések (GYIK)",
+ "Faq_Page_Description": "Van kérdésed? Keressen gyakran ismételt kérdésekre, vagy tegyen fel nekünk kérdést a kapcsolatfelvételi űrlap segítségével.",
+ "Faq_Page_SwiftCode": "Swift kód",
+ "Faq_Page_BankName": "A bank neve",
+ "Faq_Page_AccountName": "Felhasználónév",
+ "Faq_Page_AccountNumber": "Számlaszám",
+ "Faq_Page_Currency": "Valuta",
+ "Faq_Page_VatNumber": "Adószám",
+ "Faq_Page_OtherCurrenciesInfo": "A többi pénznemhez lásd az összes fiókot",
+ "ModuleDetail_Page_Title": "Modul részletei – {0}",
+ "ProjectCreatedSuccess_Page_Title": "A projekt létrehozva",
+ "ProjectCreatedSuccess_Page_Description": "ABP projektje sikeresen létrejött!",
+ "Suite_Page_Title": "ABP Suite – CRUD oldalak létrehozása",
+ "Suite_Page_Description": "Az ABP Commercial gyors alkalmazásfejlesztési eszközöket biztosít a fejlesztők termelékenységének növelése érdekében. Az ABP Suite segítségével könnyedén hozhat létre CRUD oldalakat.",
+ "Themes_Page_Title": "Modern és funkcionális felhasználói felület témák",
+ "Themes_Page_Description": "Az ABP Commercial több professzionális, modern felhasználói felület témát kínál. Hozzon létre egy ingyenes bemutatót, hogy gyorsan áttekintse, hogyan néz ki a felhasználói felület.",
+ "Tools_Page_Title": "Gyors alkalmazásfejlesztő eszközök",
+ "Tools_Page_Description": "Az ABP Commercial gyors alkalmazásfejlesztési eszközöket biztosít a fejlesztők termelékenységének növelése érdekében. Az ABP Suite segítségével könnyedén hozhat létre CRUD oldalakat.",
+ "DeveloperPrice": "Fejlesztői ár",
+ "AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0} fejlesztő",
+ "LicenseRemainingDays": "{0} napig",
+ "ExtendPaymentInfoSection_Description": "A licensz meghosszabbításával/megújításával továbbra is prémium támogatást kap. Emellett kisebb-nagyobb frissítéseket is kaphat a modulokhoz és témákhoz. Folytathatja új projektek létrehozását. És továbbra is használhatja az ABP Suite -ot, amely felgyorsítja a fejlesztést.",
+ "LicenseRenewalPrice": "Licensz megújítási ára",
+ "LicensePrice": "Licensz ára",
+ "TrialLicensePaymentInfoSection_Description": "Licensz vásárlása: licensz megvásárlásával továbbra is prémium támogatást kap . Emellett kisebb-nagyobb frissítéseket is kaphat a modulokhoz és témákhoz. Folytathatja új projektek létrehozását. És továbbra is használhatja az ABP Suite -ot, amely felgyorsítja a fejlesztést. Tekintse meg a licensz-összehasonlító táblázatot a licensztípusok közötti különbségek ellenőrzéséhez.",
+ "SelectTargetLicense": "Válassza a Target License lehetőséget",
+ "UpgradePaymentInfoSection_ExtendMyLicenseForOneYear": "Igen, meghosszabbítom az engedélyem lejárati dátumát 1 évvel.",
+ "UpgradePaymentInfoSection_WantToExtendLicense": "Szeretné meghosszabbítani licenszét további {0} évre?",
+ "UpgradePaymentInfoSection_UpgradingWillNotExtendLicense": "A frissítés nem hosszabbítja meg a licensz lejárati dátumát!",
+ "UpgradePaymentInfoSection_LicenseUpgradeDescription": "Licenszének frissítésével magasabb licensztípusra lép, amely további előnyökhöz juttatja Önt. Tekintse meg a licensz-összehasonlító táblázatot a licensztípusok közötti különbségek ellenőrzéséhez.",
+ "Landing_Page_CustomerStories": "Ügyféltörténetek",
+ "Landing_Page_OurGreatCustomers": "Nagyszerű vásárlóink",
+ "Landing_Page_WebApplicationFramework": "Web Application Framework",
+ "Landing_Page_WebDevelopmentPlatform": "Webfejlesztési platform",
+ "Landing_Page_CompleteWebDevelopmentPlatform": "Komplett webfejlesztési platform",
+ "Landing_Page_TryFreeDemo": "Próbáld ki az ingyenes demót",
+ "Landing_Page_StartingPointForWebApplications": "Az ASP.NET Core alapú webes alkalmazások kiindulópontja! A legjobb webfejlesztés érdekében az ABP-keretrendszeren alapul.",
+ "Landing_Page_AbpProvidesSoftwareInfrastructure": "Az ABP Framework szoftver infrastruktúrát biztosít kiváló webalkalmazások fejlesztéséhez a legjobb gyakorlatokkal.",
+ "Landing_Page_MicroserviceCompatibleArchitecture": "Mikroszolgáltatással kompatibilis architektúra",
+ "Landing_Page_PreBuiltApplicationModulesAndThemes": "Előre elkészített alkalmazásmodulok és témák",
+ "Landing_Page_MultiTenantArchitecture": "Több bérlős építészet",
+ "Landing_Page_MultiTenancyDescription": "SaaS alkalmazások egyszerűen! Integrált több bérlés az adatbázistól a felhasználói felületig.",
+ "Landing_Page_DDDIntroduction": "DDD minták és elvek alapján tervezték és fejlesztették. Réteges modellt biztosít az alkalmazáshoz.",
+ "Landing_Page_CrossCuttingConcernsInfo": "Teljes infrastruktúra az engedélyezéshez, érvényesítéshez, kivételkezeléshez, gyorsítótárazáshoz, auditnaplózáshoz, tranzakciókezeléshez és még sok máshoz.",
+ "Landing_Page_PreBuiltApplicationModules": "Előre beépített alkalmazásmodulok, amelyek a leggyakoribb webalkalmazási követelményeket tartalmazzák.",
+ "Landing_Page_ChatModule": "Csevegés",
+ "Landing_Page_DocsModule": "Dokumentumok",
+ "Landing_Page_FileManagementModule": "Dokumentumok",
+ "Landing_Page_CustomerStory_1": "Az ABP Commercial lehetővé tette az SC Ventures számára, hogy 9 hónapon belül egy banki szintű többbérlős silo-adatbázis SaaS-platformot szállítson a követelések/tartozások ellátási láncának támogatására, jelentős értékű számlák több integrált horgonyból történő finanszírozásához. Az ABP modularitása lehetővé tette a csapat számára, hogy rekordidő alatt szállítson, átadja az összes VAPT-t, és a konténeres mikroszolgáltatások veremét teljes CI/CD-n és csővezetékeken keresztül üzembe helyezze.",
+ "Landing_Page_CustomerStory_2": "Látjuk az ABP Commercial használatának értékét az egyedi fejlesztési projektek általános költségeinek csökkentésére. És a csapat képes egységesíteni a kódmintát a különböző projektfolyamokban. Több lehetőséget látunk a keretrendszerben arra, hogy a korábbinál gyorsabban építsünk új funkciókat. Bízunk benne, hogy folyamatosan látni fogjuk az ABP Commercial kihasználásának értékét.",
+ "Landing_Page_CustomerStory_3": "Szeretjük az ABP-t. Nem kell mindent a nulláról írnunk. A beépített funkciókból indulunk ki, és csak arra koncentrálunk, amit valóban meg kell írnunk. Ezenkívül az ABP jól felépített, és a kód kiváló minőségű, kevesebb hibával. Ha magunknak kellene megírnunk mindent, amire szükségünk van, akkor lehet, hogy éveket kellene töltenünk. Még egyszer, amit szeretünk, az az, hogy az új verzió, a hibajavítás vagy a fejlesztés nagyon hamar, minden második héten megjelenik. Nem várunk túl sokáig.",
+ "Landing_Page_CustomerStory_4": "Az ABP Commercial egy fantasztikus termék, amelyet ajánlunk. Kereskedelmi termékek, amelyeket ügyfeleink számára egyetlen konfigurálható platformon értékesíthetnek. Az ugrásszerű indítás, amelyet a keret és az eszközök biztosítanak bármely csapat számára, minden centet megér. Az ABP Commercial volt a legjobban megfelel az igényeinknek.",
+ "Landing_Page_AdditionalServices": "Egyedi vagy mennyiségi licensz, beépítés, élő képzés és támogatás, egyedi projektfejlesztés, meglévő projektek portolása és így tovább...",
+ "Landing_Page_IncludedDeveloperLicenses": "{0} fejlesztői licenszet tartalmaz",
+ "Landing_Page_SeeOnDemo": "Lásd a demóban",
+ "Landing_Page_LeptonThemes": "Lepton Themes",
+ "Landing_Page_AccountModuleDescription_1": "Ez a modul egy alkalmazás hitelesítési rendszerét valósítja meg;",
+ "Landing_Page_AccountModuleDescription_2": "Bejelentkezési oldalt biztosít a felhasználónévvel és jelszóval",
+ "Landing_Page_AccountModuleDescription_3": "Regisztrációs oldalt biztosít új fiók létrehozásához.",
+ "Landing_Page_AccountModuleDescription_4": "Elfelejtett jelszó oldalt biztosít a jelszó-visszaállítási hivatkozás e-mailben történő elküldéséhez.",
+ "Landing_Page_AccountModuleDescription_5": "E- mail megerősítési funkciót biztosít felhasználói felülettel.",
+ "Landing_Page_AccountModuleDescription_6": "Kétfaktoros hitelesítést valósít meg (SMS és e-mail).",
+ "Landing_Page_AccountModuleDescription_7": "Megvalósítja a felhasználói zárolást (zárolja a fiókot a beállított időtartamra, ha bizonyos számú sikertelen bejelentkezés történik érvénytelen hitelesítő adatok miatt egy bizonyos időintervallumon belül).",
+ "Landing_Page_AccountModuleDescription_8": "Megvalósítja az Identity Server hitelesítési kiszolgáló felhasználói felületét és funkcióit.",
+ "Landing_Page_AccountModuleDescription_9": "Lehetővé teszi a bérlők közötti váltást több bérlős környezetben.",
+ "Landing_Page_AccountModuleDescription_10": "Lehetővé teszi az alkalmazás felhasználói felületének nyelvének módosítását.",
+ "Landing_Page_AuditLoggingModuleDescription_1": "Ez a modul biztosítja a naplózási felületet a naplózási infrastruktúra számára. Lehetővé teszi az ellenőrzési naplóbejegyzések és entitásmódosítási naplók keresését, szűrését és megjelenítését.",
+ "Landing_Page_AuditLoggingModuleDescription_2": "Az ellenőrzési naplóbejegyzés kritikus adatokat tartalmaz minden ügyfélkérelemről:",
+ "Landing_Page_AuditLoggingModuleDescription_3": "URL, böngésző, IP-cím, ügyfélnév",
+ "Landing_Page_AuditLoggingModuleDescription_4": "A felhasználó",
+ "Landing_Page_AuditLoggingModuleDescription_5": "HTTP metódus, HTTP visszatérési állapotkód",
+ "Landing_Page_AuditLoggingModuleDescription_6": "Siker/kudarc, kivétel részletei, ha rendelkezésre állnak",
+ "Landing_Page_AuditLoggingModuleDescription_7": "Kérelem végrehajtásának időtartama",
+ "Landing_Page_AuditLoggingModuleDescription_8": "Az entitások létrejöttek, törölve vagy frissítve ebben a kérésben (módosított tulajdonságokkal).",
+ "Landing_Page_BloggingModuleDescription_1": "Ez a modul egy egyszerű blogot ad hozzá az ABP-alkalmazáshoz;",
+ "Landing_Page_BloggingModuleDescription_2": "Lehetővé teszi több blog létrehozását egyetlen alkalmazásban.",
+ "Landing_Page_BloggingModuleDescription_3": "Támogatja a Markdown formátumot.",
+ "Landing_Page_BloggingModuleDescription_4": "Lehetővé teszi megjegyzés írását egy bejegyzéshez.",
+ "Landing_Page_BloggingModuleDescription_5": "Lehetővé teszi címkék hozzárendelését a blogbejegyzésekhez.",
+ "Landing_Page_BloggingModuleDescription_6": "Tekintse meg a blog.abp.io webhelyet a blogolási modul élő példájaként.",
+ "Landing_Page_ChatModuleDescription_1": "Ez a modul valós idejű üzenetküldésre szolgál az alkalmazásban lévő felhasználók között.",
+ "Landing_Page_ChatModuleDescription_2": "Valós idejű üzenetküldés a chat oldalon.",
+ "Landing_Page_ChatModuleDescription_3": "Keressen felhasználókat az alkalmazásban új beszélgetésekhez.",
+ "Landing_Page_ChatModuleDescription_4": "Névjegylista a legutóbbi beszélgetésekhez.",
+ "Landing_Page_ChatModuleDescription_5": "Új üzenet értesítések, amikor a felhasználó egy másik oldalt néz.",
+ "Landing_Page_ChatModuleDescription_6": "Teljes olvasatlan üzenetek száma jelvény a menüikonon.",
+ "Landing_Page_ChatModuleDescription_7": "Az olvasatlan üzenetek száma az egyes beszélgetéseknél.",
+ "Landing_Page_ChatModuleDescription_8": "Lusta betöltött beszélgetések.",
+ "Landing_Page_DocsModuleDescription_1": "Ez a modul műszaki dokumentációs weboldalak létrehozására szolgál;",
+ "Landing_Page_DocsModuleDescription_2": "Beépített GitHub integráció : közvetlenül írhat és kezelhet dokumentumokat a GitHubon.",
+ "Landing_Page_DocsModuleDescription_3": "Verziókezelési támogatás közvetlenül integrálva a GitHub-kiadásokba.",
+ "Landing_Page_DocsModuleDescription_4": "Támogatja a több nyelvet (az alapértelmezett nyelv tartalék támogatásával).",
+ "Landing_Page_DocsModuleDescription_5": "Támogatja a Markdown és HTML formátumokat.",
+ "Landing_Page_DocsModuleDescription_6": "Navigációt és vázlatos részt biztosít.",
+ "Landing_Page_DocsModuleDescription_7": "Lehetővé teszi több projektdokumentáció tárolását egyetlen alkalmazásban.",
+ "Landing_Page_DocsModuleDescription_8": "Hivatkozások a fájlra a GitHubon, így bárki könnyedén hozzájárulhat a Szerkesztés linkre kattintva .",
+ "Landing_Page_DocsModuleDescription_9": "A GitHub-forrás mellett lehetővé teszi egy mappa egyszerű használatát dokumentációs forrásként.",
+ "Landing_Page_FileManagementModuleDescription_1": "Fájlok feltöltése, letöltése és rendezése hierarchikus mappastruktúrában.",
+ "Landing_Page_FileManagementModuleDescription_2": "Ez a modul fájlok feltöltésére, letöltésére és hierarchikus mappastruktúrába rendezésére szolgál. Több bérléssel is kompatibilis, és meghatározhatja bérlői teljes méretkorlátját.",
+ "Landing_Page_FileManagementModuleDescription_3": "Ez a modul a BLOB Storing rendszeren alapul, így különböző tárolószolgáltatókat használhat a fájltartalom tárolására.",
+ "Landing_Page_IdentityModuleDescription_1": "Ez a modul egy alkalmazás Felhasználó és szerepkör rendszerét valósítja meg;",
+ "Landing_Page_IdentityModuleDescription_2": "A Microsoft ASP.NET Core Identity könyvtárára épül.",
+ "Landing_Page_IdentityModuleDescription_3": "Szerepkörök és felhasználók kezelése a rendszerben. Egy felhasználónak több szerepe is lehet.",
+ "Landing_Page_IdentityModuleDescription_4": "Állítsa be az engedélyeket szerep- és felhasználói szinteken.",
+ "Landing_Page_IdentityModuleDescription_5": "Felhasználónként kétfaktoros hitelesítés és felhasználói kizárás engedélyezése/letiltása.",
+ "Landing_Page_IdentityModuleDescription_6": "Az alapvető felhasználói profil és jelszó kezelése.",
+ "Landing_Page_IdentityModuleDescription_7": "Igénytípusok kezelése a rendszerben, igények beállítása szerepkörökhöz és felhasználókhoz.",
+ "Landing_Page_IdentityModuleDescription_8": "Beállítási oldal a jelszó összetettségének , a felhasználói bejelentkezés, a fiók és a kizárás kezeléséhez.",
+ "Landing_Page_IdentityModuleDescription_9": "Támogatja az LDAP hitelesítést.",
+ "Landing_Page_IdentityModuleDescription_10": "E-mail és telefonszám ellenőrzést biztosít.",
+ "Landing_Page_IdentityModuleDescription_11": "Támogatja a közösségi bejelentkezési integrációkat (Twitter, Facebook, GitHub stb.).",
+ "Landing_Page_IdentityModuleDescription_12": "Szervezeti egységek kezelése a rendszerben.",
+ "Landing_Page_PaymentModuleDescription_1": "Integrációt biztosít a különböző fizetési átjárókhoz.",
+ "Landing_Page_PaymentModuleDescription_2": "Ez a modul integrációt biztosít a fizetési átjárókhoz, így könnyen kaphat fizetést ügyfeleitől.",
+ "Landing_Page_PaymentModuleDescription_3": "Ez a modul a következő fizetési átjárókat támogatja",
+ "Welcome_Page_UseSameCredentialForCommercialWebsites": "Ugyanazokat a hitelesítési adatokat használja a commercial.abp.io és a support.abp.io fájlokhoz .",
+ "WatchCrudPagesVideo": "Nézze meg a \"CRUD oldalak létrehozása az ABP Suite segítségével\" videót!",
+ "WatchGeneratingFromDatabaseVideo": "Nézze meg az \"ABP Suite: CRUD-oldalak generálása meglévő adatbázistáblákból\" videót!",
+ "WatchTakeCloserLookVideo": "Tekintse meg a „Nézze meg közelebbről a kódgenerálást: ABP Suite” videót!",
+ "ConfirmedEmailAddressRequiredToStartTrial": "A próbalicenc elindításához rendelkeznie kell egy megerősített e-mail címmel.",
+ "EmailVerificationMailNotSent": "Nem sikerült elküldeni az ellenőrző e-mailt.",
+ "GetConfirmationEmail": "Kattintson ide, ha megerősítő e-mailt szeretne kapni, ha még nem kapta meg.",
+ "WhichLicenseTypeYouAreInterestedIn": "Melyik licenctípus érdekli?",
+ "DontTakeOurWordForIt": "Ne fogadd el a szavunkat...",
+ "ReadAbpCommercialUsersWantYouToKnow": "Olvassa el, hogy az ABP Commercial felhasználói mit szeretnének tudni",
+ "Testimonial_ShortDescription_1": "Az ABP modularitása lehetővé tette, hogy a csapat időben teljesítsen.",
+ "Testimonial_ShortDescription_2": "Építsen új funkciókat gyorsabban, mint korábban.",
+ "Testimonial_ShortDescription_3": "A beépített funkciókból indulunk ki, és csak arra koncentrálunk, amit valóban meg kell írnunk.",
+ "Testimonial_ShortDescription_4": "Az ABP Commercial volt a legjobban megfelelő az igényeinknek.",
+ "OnlineReviewersOnAbpCommercial": "Online vélemények az ABP Commercial-ról",
+ "SeeWhatToldAboutAbpCommercial": "Tekintse meg, mit mondtak az ABP Commercialról, és írja le gondolatait, ha akarja."
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json
index 44b6f66037..be56afbb43 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json
@@ -341,7 +341,7 @@
"SignIn": "Autentificare",
"Or": "Sau",
"TellUsAboutYourself": "Spuneţi-ne despre dumneavoastră",
- "Surname": "Nume",
+ "Surname": "Nume de familie",
"DoYouAgreePrivacyPolicy": "Sunt de acord cu Termenii şi condiţiile şi Politica de confidenţialitate.",
"VolosoftMarketingInformationMessage": "Sunt de acord să primesc informaţii, sfaturi şi oferte despre soluţii pentru afaceri şi organizaţii şi alte produse şi servicii Volosoft.",
"VolosoftSharingInformationMessage": "Sunt de acord ca Volosoft să partajeze informaţiile mele cu partenerii selectaţi astfel încât să primesc informaţii relevante despre produsele şi serviciile lor.",
@@ -380,4 +380,4 @@
"TrialLicenseExpiredInfo": "Perioada de licență de probă a expirat!",
"CommercialNewsletterConfirmationMessage": "Sunt de acord cu Termenii și condițiile și cu Politica de confidențialitate ."
}
-}
\ No newline at end of file
+}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
index bd1794cd36..c8d59816ce 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
@@ -548,7 +548,7 @@
"MyOrganizations_Detail_OwnerRightInfo": "您正在使用您的 {1} 所有者权利中的 {0}。",
"MyOrganizations_Detail_CopyApiKey": "复制密钥",
"MyOrganizations_Detail_ApiKeyDescription": "API 密钥是托管在 {1} 上的 PRO 包的令牌。 ",
- "MyOrganizations_Detail_YourPrivateNugetSource": "您的私有 NuGet 源是 {0}",
+ "MyOrganizations_Detail_YourPrivateNugetSource": "您的私有 NuGet 源是 {0}",
"MyOrganizations_Detail_PrivateNugetSourceWarning": "这将自动添加一个源到您的 ABP 解决方案中的 NuGet.Config。 不要与未经授权的用户共享您的私钥!",
"MyOrganizations_Detail_DeveloperSeatInfo": "您正在使用您的 {1} 个开发者席位中的 {0} 个。",
"NeedMoreSeatsForYourTeam": "您的团队需要更多席位吗?",
@@ -578,7 +578,7 @@
"PrePayment_IyzicoRedirectionInfo": "您将被重定向到 Iyzico 支付网关以安全地完成您的购买。",
"PrePayment_IyzicoAcceptVisaAndMasterCard": "Iyzico 接受 Visa 和 MasterCard。",
"Purchase": "购买",
- "AcceptTermsAndConditions": "我已阅读、理解并接受隐私政策, 条款和条件和 EULA。",
+ "AcceptTermsAndConditions": "我已阅读、理解并接受隐私政策, 条款和条件和 EULA。",
"AcceptTermsAndConditionsWarningMessage": "请接受隐私政策和条款和条件",
"SelectGatewayToContinue": "请选择一个网关以继续!",
"GatewaySelection_SelectGateway": "选择支付网关",
@@ -735,6 +735,8 @@
"ConfirmedEmailAddressRequiredToStartTrial": "你应该有一个确认的电子邮件地址,以便开始试用许可证。",
"EmailVerificationMailNotSent": "电子邮件验证邮件不能发送。",
"GetConfirmationEmail": "点击这里获取确认邮件 如果你还没有收到。",
- "WhichLicenseTypeYouAreInterestedIn": "你感兴趣的许可证类型是什么?"
+ "WhichLicenseTypeYouAreInterestedIn": "你感兴趣的许可证类型是什么?",
+ "BlazoriseLicense": "我们是否需要购买Blazorise许可证?",
+ "BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json
index c258ea0800..a8b0398369 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json
@@ -380,6 +380,8 @@
"TrialLicenseExpireMessage": "您正在使用試用許可證,您的試用許可證將於 {0}到期。",
"TryForFree": "免費試用",
"TrialLicenseExpiredInfo": "您的試用許可期限已過!",
- "CommercialNewsletterConfirmationMessage": "我同意條款和條件和隱私政策。"
+ "CommercialNewsletterConfirmationMessage": "我同意條款和條件和隱私政策。",
+ "BlazoriseLicense": "我们是否需要购买Blazorise许可证?",
+ "BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。"
}
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
index 0ed3eda832..c73da26137 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
@@ -150,7 +150,6 @@
"GetStarted": "Get Started",
"SourceCode": "Source Code",
"LeaveComment": "Leave Comment",
- "ReadMore": "Read more",
"ShowMore": "Show More",
"NoPublishedPostsYet": "No published posts yet.",
"Name": "Name",
@@ -184,6 +183,7 @@
"Post_Index_Page_MetaDescription": "ABP Community's purpose is to create a contribution environment for developers who use the ABP framework.",
"Layout_Title": "{0} | ABP Community",
"Layout_MetaDescription": "ABP Community is an environment where people can share posts about ABP framework and follows the projects.",
- "Index_Page_CommunityIntroduction": "This is a hub for ABP Framework, .NET and software development. You can read the articles, watch the video tutorials, get informed about ABP’s development progress and ABP-related events, help other developers and share your expertise with the ABP community."
+ "Index_Page_CommunityIntroduction": "This is a hub for ABP Framework, .NET and software development. You can read the articles, watch the video tutorials, get informed about ABP’s development progress and ABP-related events, help other developers and share your expertise with the ABP community.",
+ "TagsInArticle": "Tags in article"
}
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json
index 68d70f8615..bb401e6577 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json
@@ -29,14 +29,12 @@
"ContributionGuide": "Hozzájárulási útmutató",
"BugReport": "Hibajelentés",
"SeeAllPosts": "Az összes bejegyzés megtekintése",
- "WelcomeToABPCommunity!": "Üdvözöljük az ABP közösségben!",
- "MyProfile": "A profilom",
- "MyOrganizations": "Szervezeteim",
+ "WelcomeToABP": "Üdvözöljük az ABP-ben",
"EmailNotValid": "Kérjük valós e-mail címet adjon meg!",
"FeatureRequest": "Funkciókérés",
"CreatePostTitleInfo": "A bejegyzés listán megjelenítendő bejegyzés címe.",
"CreatePostSummaryInfo": "A bejegyzés rövid összefoglalása, amely megjelenik a bejegyzéslistán.",
- "CreatePostCoverInfo": "Hatékony cikk létrehozásához adjon hozzá egy borítóképet. Tölts fel 16:9-es képarányú képeket a legjobb nézet érdekében. Maximális fájlméret: 1 MB.",
+ "CreatePostCoverInfo": "Hatékony bejegyzés létrehozásához adj hozzá egy borítóképet. Tölts fel 16:9-es képarányú képeket a legjobb nézet érdekében. Maximális fájlméret: 1 MB.",
"ThisExtensionIsNotAllowed": "Ez a bővítmény nem engedélyezett.",
"TheFileIsTooLarge": "A fájl túl nagy.",
"GoToThePost": "Ugrás a cikkre",
@@ -45,7 +43,7 @@
"Done": "Kész",
"Open": "Nyisd ki",
"Closed": "Zárva",
- "LatestQuestionOnThe": "Legújabb kérdés a",
+ "RecentQuestionFrom": "Friss kérdés tőle",
"Stackoverflow": "Stackoverflow",
"Votes": "szavazatokat",
"Answer": "Válasz",
@@ -59,7 +57,7 @@
"QuestionItemErrorMessage": "Nem sikerült lekérni a Stackoverflow legújabb kérdés részleteit.",
"Oops": "Hoppá!",
"CreatePostSuccessMessage": "A cikk sikeresen beküldve. A webhely adminisztrátorának felülvizsgálata után tesszük közzé.",
- "ChooseCoverImage": "Válasszon borítóképet...",
+ "Browse": "Tallózás",
"CoverImage": "Borítókép",
"ShareYourExperiencesWithTheABPFramework": "Ossza meg tapasztalatait az ABP keretrendszerrel!",
"Optional": "Választható",
@@ -88,6 +86,8 @@
"PostRequestFromGithubIssue": "Jelenleg nincs cikkkérés.",
"LatestPosts": "Legutóbbi bejegyzések",
"ArticleRequests": "Cikkigények",
+ "ArticleRequestsDescription": "Konkrét tartalmat szeretne látni itt? Megkérheted a közösséget, hogy hozza létre!",
+ "LatestContentRequests": "Legújabb tartalomkérések",
"AllPostRequests": "Lásd: Összes cikkigénylés",
"SubscribeToTheNewsletter": "Feliratkozás a Hírlevélre",
"NewsletterEmailDefinition": "Információkat kaphat az ABP eseményeiről, például új kiadásokról, ingyenes forrásokról, cikkekről és egyebekről.",
@@ -115,7 +115,6 @@
"VideoUrl": "Videó URL-je",
"GithubPostUrl": "Github cikk URL-je",
"ExternalPostUrl": "Külső cikk URL",
- "CreatePostCoverInfo": "Hatékony bejegyzés létrehozásához adj hozzá egy borítóképet. Tölts fel 16:9-es képarányú képeket a legjobb nézet érdekében. Maximális fájlméret: 1 MB.",
"ThankYouForContribution": "Köszönjük, hogy hozzájárult az ABP közösséghez.",
"GithubPost": "Github cikk",
"GithubPostSubmitStepOne": "1. Írjon cikket bármely nyilvános GitHub-tárhelyről Markdown formátumban. példa ",
@@ -142,6 +141,49 @@
"MinimumSearchContent": "Legalább 3 karaktert kell megadnod!",
"Volo.AbpIo.Domain:060001": "A forrás URL (\"{PostUrl}\") nem Github URL",
"Volo.AbpIo.Domain:060002": "A cikk tartalma nem érhető el a Github(\"{PostUrl}\") forrásból.",
- "Volo.AbpIo.Domain:060003": "Nem található a cikk tartalma!"
+ "Volo.AbpIo.Domain:060003": "Nem található a cikk tartalma!",
+ "SeeMore": "Nézek többet",
+ "JoinTheABPCommunity": "Csatlakozz az ABP közösséghez",
+ "ABPCommunityTalks": "ABP közösségi beszélgetések",
+ "LiveDemo": "Élő Demo",
+ "GetLicense": "Szerezzen licenszet",
+ "GetStarted": "Fogj neki",
+ "SourceCode": "Forráskód",
+ "LeaveComment": "Hagyj megjegyzést",
+ "ShowMore": "Mutass többet",
+ "NoPublishedPostsYet": "Még nincsenek közzétett bejegyzések.",
+ "Name": "Név",
+ "Surname": "Vezetéknév",
+ "WebSite": "Weboldal",
+ "FullURL": "Teljes URL",
+ "JobTitle": "Munka megnevezése",
+ "Prev": "Előző",
+ "Previous": "Előző",
+ "Next": "Következő",
+ "Share": "Részvény",
+ "SortBy": "Sorrend",
+ "NoPublishedEventsYet": "Még nincsenek közzétett események.",
+ "SubscribeYoutubeChannel": "Iratkozz fel a Youtube csatornára",
+ "Enum:EventType:0": "Beszélgetések",
+ "MemberNotPublishedPostYet": "Ez a tag még nem tett közzé bejegyzéseket.",
+ "TimeAgo": "{0} ezelőtt",
+ "Discord_Page_JoinCommunityMessage": "Csatlakozz az ABP Discord közösséghez",
+ "Discord_Page_Announce": "Örömmel jelentjük be az ABP Community Discord Servert!",
+ "Discord_Page_Description_1": "Az ABP közösség az első nap óta növekszik. Egy hivatalos ABP Discord szerver létrehozásával a következő lépésre akartuk vinni, hogy az ABP közösség az azonnali üzenetküldés csodáival kommunikálhasson egymással.",
+ "Discord_Page_Description_2": "Az ABP Community Discord Server az a hely, ahol bemutathatja alkotásait az ABP Framework segítségével, megoszthatja az Ön számára bevált tippeket, értesülhet az ABP Framework-vel kapcsolatos legfrissebb hírekről és bejelentésekről, egyszerűen cseveghet a közösség tagjaival, hogy eszmét cserélhessen, és érezze jól magát!",
+ "Discord_Page_Description_3": "Ez az ABP Community Discord szerver a hivatalos, ahol az ABP Core Team jelen van a szerveren, hogy felügyelje.",
+ "Discord_Page_JoinToServer": "Csatlakozz az ABP Discord szerverhez",
+ "Events_Page_MetaTitle": "ABP közösségi események",
+ "Events_Page_MetaDescription": "Az ABP Team által rendezett élő műsorok hétköznapi előadások, tele közösségi tartalommal, demókkal, kérdésekkel és válaszokkal, valamint az ABP-ben zajló eseményekről szóló vitákkal.",
+ "Events_Page_Title": "ABP közösségi beszélgetések",
+ "Events_Page_WritingFromUser": "Olvassa el {0} írását az ABP közösségben.",
+ "Post_Create_Page_MetaTitle": "Új bejegyzés",
+ "Post_Create_Page_MetaDescription": "Hozzon létre bejegyzést, hogy megossza tapasztalatait az ABP keretrendszerrel kapcsolatban, és hozzájáruljon az ABP közösséghez.",
+ "Post_Create_Page_CreateNewPost": "Új bejegyzés létrehozása",
+ "Post_Index_Page_MetaDescription": "Az ABP Community célja egy hozzájárulási környezet létrehozása az ABP keretrendszert használó fejlesztők számára.",
+ "Layout_Title": "{0} | ABP-közösség",
+ "Layout_MetaDescription": "Az ABP Community egy olyan környezet, ahol az emberek megoszthatnak bejegyzéseket az ABP keretrendszerről, és követhetik a projekteket.",
+ "Index_Page_CommunityIntroduction": "Ez az ABP Framework, a .NET és a szoftverfejlesztés központja. Elolvashatja a cikkeket, megnézheti az oktatóvideókat, tájékozódhat az ABP fejlesztési előrehaladásáról és az ABP-vel kapcsolatos eseményekről, segíthet más fejlesztőknek, és megoszthatja szakértelmét az ABP közösséggel.",
+ "TagsInArticle": "Címkék a cikkben"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json
index 3513a37dde..8196d567a1 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json
@@ -150,7 +150,6 @@
"GetStarted": "开始使用",
"SourceCode": "源代码",
"LeaveComment": "发表评论",
- "ReadMore": "阅读更多",
"ShowMore": "展示更多",
"NoPublishedPostsYet": "还没有发布的帖子。",
"Name": "名字",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/hu.json
new file mode 100644
index 0000000000..292fb51cd2
--- /dev/null
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/hu.json
@@ -0,0 +1,6 @@
+{
+ "culture": "hu",
+ "texts": {
+ "FAQ": "GYIK"
+ }
+}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs
index 552b5949e1..f64552be30 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/AbpIoWwwResource.cs
@@ -1,5 +1,8 @@
-namespace AbpIoLocalization.Www
+using Volo.Abp.Localization;
+
+namespace AbpIoLocalization.Www
{
+ [LocalizationResourceName("AbpIoWww")]
public class AbpIoWwwResource
{
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
index 41eda60de6..faba7ab94e 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
@@ -293,7 +293,6 @@
"ExploreDocumentationAndGuides": "Explore the comprehensive documentation and guides.",
"Documentations": "Documentation",
"Views": "Views",
- "ReadMore": "Read More",
"EnterYouEmailToGetNews": "Enter your email to get the latest news about the ABP Framework",
"Tiered": "Tiered",
"SeparateIdentityServer": "Separate Identity Server",
@@ -372,6 +371,28 @@
"MasteringAbpFramework_Book_What_You_Will_Learn_8": "Write unit, integration, and UI tests using ABP Framework.",
"MasteringAbpFramework_Book_WhoIsThisBookFor": "Who's this book for",
"MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "This book is for web developers who want to learn software architectures and best practices for building\n maintainable web-based solutions using Microsoft technologies and ABP Framework. Basic knowledge of C#\n and ASP.NET Core is necessary to get started with this book.",
- "ComputersAndTechnology": "Computers & Technology"
+ "ComputersAndTechnology": "Computers & Technology",
+ "BuildingMicroserviceSolutions": "Building Microservice Solutions",
+ "MicroserviceBookPracticalGuide": "This book is a reference guide for developing and managing microservice-based applications using the ABP Framework. It references the .NET Microservice Sample Reference Application: eShopOnContainers and discusses the architectural design and implementation approaches using the ABP Framework. By the end of this book, you'll learn how ABP approaches the common microservice complexities such as authorization, distributed transactions, inter-microservice communications, deployment, etc.",
+ "IntroducingTheSolution": "Introducing the eShopOnAbp Solution",
+ "RunningTheSolution": "Running the Solution",
+ "UnderstandingTheAuthenticationSystem": "Understanding the Authentication System",
+ "ExploringTheApplications": "Exploring the Applications",
+ "UnderstandingTheAPIGateways": "Understanding the API Gateways",
+ "DevelopingTheMicroservices": "Developing the Microservices",
+ "UnderstandingTheInfrastructure": "Understanding the Infrastructure",
+ "DiggingInTheUseCases": "Digging in the Use Cases",
+ "DeployingTheSolution": "Deploying the Solution",
+ "ThisBookIsInDraftStageAndIsNotCompletedYet": "This book is in draft stage and is not completed yet.",
+ "Authors": "Authors",
+ "MicroserviceEBook": "Microservice E-Book",
+ "SelectUITheme": "Select UI Theme",
+ "LeptonXLiteTheme": "LeptonX Lite Theme",
+ "BasicTheme": "Basic Theme",
+ "LeptonXLiteThemeInfo": " A modern and stylish Bootstrap UI theme. Ideal if you want to have a production ready UI theme. This is the newest theme and is the default.",
+ "BasicThemeInfo": "Minimalist UI theme with plain Bootstrap colors and styles. Ideal if you will build your own UI theme.",
+ "SeeDocumentation": "See documentation.",
+ "SeeFullScreen": "🖼️ See the screenshot",
+ "BuildingMicroserviceSolutionsShortDescription": "This book is a reference guide for developing and managing microservice-based applications using the ABP Framework."
}
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hu.json
index cb1639fd42..2a6ebf2feb 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hu.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hu.json
@@ -174,6 +174,7 @@
"CreateProjectWizard": "Ez a varázsló új projektet hoz létre az indítási sablonból, amely megfelelően be van állítva a projekt elindításához.",
"TieredOption": "Létrehoz egy többszintű megoldást, ahol a webes és a HTTP API-rétegek fizikailag el vannak választva. Ha nincs bejelölve, réteges megoldást hoz létre, amely kevésbé bonyolult és a legtöbb forgatókönyvhöz megfelelő.",
"SeparateIdentityServerOption": "A szerveroldalt két alkalmazásra választja szét: az első az identitáskiszolgálóhoz, a második pedig a szerveroldali HTTP API-hoz való.",
+ "ProgressiveWebApplicationOption": "Progresszív webalkalmazásként határozza meg a projektet",
"UseslatestPreVersion": "A legújabb kiadás előtti verziót használja",
"ReadTheDocumentation": "Olvassa el a dokumentációt",
"Documentation": "Dokumentáció",
@@ -214,7 +215,11 @@
"SeeDocs": "Lásd: Dokumentumok",
"None": "Egyik sem",
"Application": "Alkalmazás",
+ "ApplicationExplanation": "Teljesen rétegzett megoldást hoz létre a tartományvezérelt tervezési gyakorlatok alapján. Olyan hosszú távú projektekhez ajánlott, amelyek karbantartható és bővíthető kódbázist igényelnek.",
+ "ApplicationNoLayer": "Alkalmazás (egyrétegű)",
+ "ApplicationNoLayerExplanation": "Egyrétegű webalkalmazást hoz létre. Egyszerűbb és könnyen érthető architektúrájú alkalmazás készítéséhez ajánlott.",
"Module": "Modul",
+ "ModuleExplanation": "Újrafelhasználható, teljesen rétegzett alkalmazásmodul-megoldást hoz létre. Ezzel a lehetőséggel modulokat hozhat létre a moduláris alkalmazásához.",
"PackageName": "Csomag név",
"LicenseURL": "Licenc URL",
"License": "Engedély",
@@ -273,6 +278,120 @@
"SubscribeToNewsletter": "Iratkozzon fel a hírlevélre, hogy tájékozódjon az ABP.IO Platform eseményeiről, például új kiadásokról, cikkekről, ajánlatokról stb.",
"FirstEdition": "Első kiadás",
"ThankYou": "Köszönöm!",
- "CheckboxMandatory": "Ezt ellenőriznie kell a folytatáshoz!"
+ "CheckboxMandatory": "Ezt ellenőriznie kell a folytatáshoz!",
+ "UserInterface": "Felhasználói felület",
+ "APIGateway": "API átjáró",
+ "Database": "Adatbázis",
+ "Saas": "Saas",
+ "OpenSourceWebApp": "Nyílt forráskódú webalkalmazás",
+ "Framework": "Keretrendszer",
+ "AuditLoggingExplanation": "Automatikusan nyomon követheti az összes műveletet és adatváltozást a rendszerben.",
+ "AbpNewCommandExplanation": "Új megoldásokat hoz létre az ABP indítási sablonjaival.",
+ "AbpAddModuleCommandExplanation": "Előre elkészített alkalmazásmodulokat telepít a megoldásra",
+ "AbpUpdateCommandExplanation": "Automatikusan frissíti az összes ABP-vel kapcsolatos NuGet és NPM csomagot a megoldásban.",
+ "ExploreAllCLICommands": "Fedezze fel az összes CLI-parancsot",
+ "ExploreDocumentationAndGuides": "Fedezze fel az átfogó dokumentációt és útmutatókat.",
+ "Documentations": "Dokumentáció",
+ "Views": "Nézetek",
+ "EnterYouEmailToGetNews": "Adja meg e-mail címét, hogy megkapja a legfrissebb híreket az ABP-keretrendszerrel kapcsolatban",
+ "Tiered": "Többszintű",
+ "SeparateIdentityServer": "Külön identitásszerver",
+ "ProgressiveWebApplication": "Progresszív webes alkalmazás",
+ "Preview": "Előnézet",
+ "CreateANewSolution": "Hozzon létre egy új megoldást",
+ "ABPFrameworkFeatures": "Az ABP keretrendszer jellemzői",
+ "Commercial": "Kereskedelmi",
+ "ThirdPartyTools": "Harmadik féltől származó eszközök",
+ "Back": "Vissza",
+ "Community": "Közösség",
+ "SeeMore": "Többet látni",
+ "DetailsOfTheEBook": "Az E-könyv részletei",
+ "JoinOurMarketingNewsletter": "Csatlakozzon marketing hírlevelünkhöz",
+ "FrameworkNewsletterConfirmationMessage": "Elfogadom az Általános Szerződési Feltételeket és az Adatvédelmi szabályzatot .",
+ "GetYourFreeEBook": "Szerezze meg ingyenes DDD e-könyvét",
+ "EverythingYouNeedToKnow": "Minden, amit tudnia kell.",
+ "PreOrderNow": "Előrendelés most",
+ "UITheming": "UI témák",
+ "UIThemingExplanation": "Hozzon létre újrafelhasználható felhasználói felület-témákat és elrendezéseket, vagy használja valamelyik előre elkészített felhasználói felület-témát.",
+ "DataFilteringExplanation2": "Automatikusan szűrje le az adatbázisból származó lekérdezéseket, hogy könnyen megvalósíthassa az olyan mintákat, mint a soft-delete és a multi-tenancy.",
+ "NeedHelp": "Kell segítség?",
+ "GiveYourProjectAName": "Adjon nevet a projektjének",
+ "SelectProjectType": "Válassza ki a Projekt típusát",
+ "SelectUIFramework": "Válassza a UI-keretrendszert",
+ "SelectDatabaseProvider": "Válassza az Adatbázis-szolgáltató lehetőséget",
+ "SelectDatabaseManagementSystem": "Válassza az Adatbázis-kezelő rendszer lehetőséget",
+ "InstallingTheABPCLI": "Az ABP CLI telepítése",
+ "CreateYourProjectNow": "Hozza létre projektjét most",
+ "OrderOn": "Rendelés itt: {0}",
+ "DownloadFreeDDDBook": "Ingyenes DDD könyv letöltése",
+ "WhatIsABPFramework": "Mi az az ABP-keretrendszer?",
+ "TenantDatabase": "Bérlői {0} adatbázis",
+ "SharedDatabase": "Megosztott adatbázis",
+ "ConnectionResolver": "Kapcsolatfeloldó",
+ "TenantBasedDataFilter": "Bérlő alapú adatszűrő",
+ "ApplicationCode": "Alkalmazási kód",
+ "TenantResolution": "Bérlői állásfoglalás",
+ "TenantUser": "Bérlő {0} felhasználó",
+ "CardTitle": "Kártya címe",
+ "View": "Nézet",
+ "Model": "Modell",
+ "Email": "Email",
+ "Password": "Jelszó",
+ "Address": "Cím",
+ "Gender": "Nem",
+ "Male": "Férfi",
+ "Female": "Nő",
+ "Submit": "Beküldés",
+ "Unspecified": "Meg nem határozott",
+ "StaticFileMiddleware": "Statikus fájl köztes-szoftver",
+ "RazorViewEngine": "Razor View Engine",
+ "PhysicalFiles": "Fizikai fájlok (wwwroot)",
+ "EmbeddedFiles": "Beágyazott fájlok (DLL)",
+ "DynamicFiles": "Dinamikus fájlok (memória)",
+ "BuildSolutionsWithAbp": "Építsen karbantartható .NET-megoldásokat az ABP használatával bevált szoftverfejlesztési gyakorlatok követésével.",
+ "BuyOnAmazon": "Vásároljon az Amazonon",
+ "BuyOnPackt": "Vásároljon Packt-en",
+ "Discounted": "Kedvezményes",
+ "MasteringAbpFramework_Book_KeyFeatures": "Főbb jellemzők",
+ "MasteringAbpFramework_Book_Key_Features_Description_1": "Építsen robusztus, karbantartható, moduláris és méretezhető szoftvermegoldásokat az ABP Framework segítségével.",
+ "MasteringAbpFramework_Book_Key_Features_Description_2": "Ismerje meg, hogyan valósíthatja meg a SOLID elveket és a tartományvezérelt tervezést webalkalmazásaiban.",
+ "MasteringAbpFramework_Book_Key_Features_Description_3": "Fedezze fel, hogyan gyorsítja fel az ABP Framework a fejlesztési ciklust az ismétlődő feladatok automatizálásával.",
+ "MasteringAbpFramework_Book_Description": "Könyv leírása",
+ "MasteringAbpFramework_Book_Description_Details_1": "Az ABP Framework egy komplett infrastruktúra modern webalkalmazások létrehozásához a szoftverfejlesztési bevált gyakorlatok és konvenciók követésével. Az ABP magas szintű keretrendszerével és ökoszisztémájával megvalósíthatja a Ne ismételje meg magát (DRY) elvet, és az üzleti kódjára összpontosítson.",
+ "MasteringAbpFramework_Book_Description_Details_2": "Az ABP Framework megalkotója által írt könyv segít a keretrendszer és a modern webalkalmazás-fejlesztési technikák teljes megértésében. Az alapvető fogalmak lépésről lépésre történő magyarázatával és gyakorlati példákkal megismerheti a modern webes megoldások követelményeit, és megértheti, hogy az ABP Framework hogyan teszi élvezetessé saját megoldásainak fejlesztését. Felfedezi a vállalati webalkalmazás-fejlesztés általános követelményeit, és felfedezheti az ABP által biztosított infrastruktúrát. A könyv során megismerkedhet a szoftverfejlesztés bevált gyakorlataival a karbantartható és moduláris webes megoldások létrehozásához.",
+ "MasteringAbpFramework_Book_Description_Details_3": "A könyv végére képes lesz egy komplett webes megoldás létrehozására, amely könnyen fejleszthető, karbantartható és tesztelhető.",
+ "MasteringAbpFramework_Book_WhatYouWillLearn": "Mit fog tanulni",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_1": "Állítsa be a fejlesztői környezetet, és kezdje el az ABP Framework használatát.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_2": "Az Entity Framework Core és a MongoDB segítségével fejlesztheti adathozzáférési rétegét.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_3": "Ismerje meg a több területet érintő aggályokat és azt, hogy az ABP hogyan automatizálja az ismétlődő feladatokat.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_4": "Ismerkedjen meg a tartományvezérelt tervezés megvalósításával az ABP Framework segítségével.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_5": "Hozzon létre felhasználói felület oldalakat és összetevőket az ASP.NET Core MVC (Razor Pages) és a Blazor segítségével.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_6": "Moduláris webalkalmazások létrehozásához dolgozzon több bérléssel.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_7": "Ismerje meg a modularitást, és hozzon létre újrafelhasználható alkalmazásmodulokat.",
+ "MasteringAbpFramework_Book_What_You_Will_Learn_8": "Írjon egység-, integrációs és UI-teszteket az ABP-keretrendszer használatával.",
+ "MasteringAbpFramework_Book_WhoIsThisBookFor": "Kinek szól ez a könyv",
+ "MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "Ez a könyv azoknak a webfejlesztőknek szól, akik szoftverarchitektúrákat és bevált gyakorlatokat szeretnének megtanulni karbantartható webalapú megoldások Microsoft technológiáit és ABP-keretrendszert használó felépítéséhez. A könyv használatának megkezdéséhez alapszintű C# és ASP.NET Core ismerete szükséges.",
+ "ComputersAndTechnology": "Számítógépek és technológia",
+ "BuildingMicroserviceSolutions": "Mikroszolgáltatási megoldások építése",
+ "MicroserviceBookPracticalGuide": "Ez a könyv egy referencia útmutató a mikroszolgáltatás alapú alkalmazások fejlesztéséhez és kezeléséhez az ABP Framework segítségével. Hivatkozik a .NET Microservice Sample Reference Application : eShopOnContainers alkalmazásra, és tárgyalja az ABP-keretrendszert használó tervezési és megvalósítási megközelítéseket. A könyv végére megtudhatja, hogyan közelíti meg az ABP az olyan általános mikroszolgáltatási bonyolultságokat, mint az engedélyezés, az elosztott tranzakciók, a mikroszolgáltatások közötti kommunikáció, a telepítés stb.",
+ "IntroducingTheSolution": "Az eShopOnAbp megoldás bemutatása",
+ "RunningTheSolution": "A megoldás futtatása",
+ "UnderstandingTheAuthenticationSystem": "A hitelesítési rendszer megértése",
+ "ExploringTheApplications": "Az alkalmazások felfedezése",
+ "UnderstandingTheAPIGateways": "Az API-átjárók megértése",
+ "DevelopingTheMicroservices": "Mikroszolgáltatások fejlesztése",
+ "UnderstandingTheInfrastructure": "Az infrastruktúra megértése",
+ "DiggingInTheUseCases": "feltérképezni a használati eseteket",
+ "DeployingTheSolution": "A megoldás telepítése",
+ "ThisBookIsInDraftStageAndIsNotCompletedYet": "Ez a könyv tervezet stádiumban van, és még nem készült el.",
+ "Authors": "Szerzői",
+ "MicroserviceEBook": "Mikroszolgáltatás e-könyv",
+ "SelectUITheme": "Válassza ki a felhasználói felület témáját",
+ "LeptonXLiteTheme": "LeptonX Lite téma",
+ "BasicTheme": "Alap téma",
+ "LeptonXLiteThemeInfo": "Modern és stílusos Bootstrap UI téma. Ideális, ha gyártásra kész felhasználói felület témát szeretne. Ez a legújabb téma, és az alapértelmezett.",
+ "BasicThemeInfo": "Minimalista felhasználói felület téma egyszerű Bootstrap színekkel és stílusokkal. Ideális, ha saját felhasználói felület témát készít.",
+ "SeeDocumentation": "Lásd a dokumentációt .",
+ "SeeFullScreen": "🖼️ Nézze meg a képernyőképet"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json
index bd04ba7f49..a1ff5f58ad 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json
@@ -253,18 +253,18 @@
"Or": "Sau",
"TellUsAboutYourself": "Spuneţi-ne un pic despre dumneavoastră",
"Name": "Nume",
- "Surname": "Nume",
+ "Surname": "Nume de familie",
"CompanyName": "Nume companie",
"DoYouAgreePrivacyPolicy": "Sunt de acord cu Termenii & condiţiile şi Politica de confidenţialitate.",
"Free": "Gratuit",
"DDDEBook": "E-book DDD",
"PracticalGuideForImplementingDDD": "Această carte este un ghid practic pentru implementarea Domain Driven Design în framework-ul ABP.",
"IntroducingDDD": "Introducere în Domain Driven Design",
- "DDDLayersAndCleanArchitecture": "Straturile DDD & Arhitectură curată",
+ "DDDLayersAndCleanArchitecture": "Straturile DDD şi Arhitectură curată",
"LayeringOfADotnetSolution": "Stratificarea unei soluţii .NET",
"ImplementingDDDBuildingBlocks": "Implementând DDD Building Blocks",
"DomainVsApplicationLogic": "Domain Logic vs Application Logic",
- "SamplesAndDiscussions": "Exemple & Discuţii",
+ "SamplesAndDiscussions": "Exemple şi Discuţii",
"EmailNotValid": "Vă rugăm să introduceţi o adresa de email validă.",
"WeWillSendYouADownloadLink": "Un link care conţine e-book-ul a fost trimis către {0}. Verificaţi-vă folderele de inbox, junk sau spam!",
"GoHome": "Pagina principală",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json
index 01fe9f8b7b..a4a6e142a9 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json
@@ -279,6 +279,7 @@
"SubscribeToNewsletter": "ABP.IO Platform'u ile ilgili yeni haberler, makaleler, teklifler ve daha fazlası gibi gelişmeler hakkında bilgi almak için bültene abone olun.",
"FirstEdition": "İlk Baskı",
"ThankYou": "Teşekkürler!",
- "CheckboxMandatory": "Devam etmek için bunu kontrol etmeniz gerekiyor!"
+ "CheckboxMandatory": "Devam etmek için bunu kontrol etmeniz gerekiyor!",
+ "ThisBookIsInDraftStageAndIsNotCompletedYet": "Bu kitap taslak aşamasındadır ve henüz tamamlanmamıştır."
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json
index 9a1373f76b..7826f00ca2 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json
@@ -293,7 +293,6 @@
"ExploreDocumentationAndGuides": "探索全面的文档和指南。",
"Documentations": "文档",
"Views": "意见",
- "ReadMore": "阅读更多",
"EnterYouEmailToGetNews": "输入您的电子邮件以获取有关 ABP 框架的最新消息",
"Tiered": "分层",
"SeparateIdentityServer": "独立的身份服务器",
@@ -372,6 +371,7 @@
"MasteringAbpFramework_Book_What_You_Will_Learn_8": "使用 ABP 框架编写单元、集成和 UI 测试。",
"MasteringAbpFramework_Book_WhoIsThisBookFor": "这本书是给谁看的",
"MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "本书适用于希望学习软件架构和最佳实践的 Web 开发人员,以使用 Microsoft 技术和 ABP 框架构建\n 可维护的基于 Web 的解决方案。 C#\n 和 ASP.NET Core 的基本知识是开始阅读本书所必需的。",
- "ComputersAndTechnology": "计算机与技术"
+ "ComputersAndTechnology": "计算机与技术",
+ "ThisBookIsInDraftStageAndIsNotCompletedYet": "这本书正在草案阶段,还没有完成。"
}
}
\ No newline at end of file
diff --git a/common.DotSettings b/common.DotSettings
index 5c1cda48fd..f2cc0339ae 100644
--- a/common.DotSettings
+++ b/common.DotSettings
@@ -38,5 +38,6 @@
FalseFalseFalse
+ TrueTrue
\ No newline at end of file
diff --git a/common.props b/common.props
index 2adcbdab77..f8b7c620c2 100644
--- a/common.props
+++ b/common.props
@@ -1,7 +1,7 @@
latest
- 6.0.0-rc.4
+ 7.0.0$(NoWarn);CS1591;CS0436https://abp.io/assets/abp_nupkg.pnghttps://abp.io/
diff --git a/docs/en/Background-Jobs-Hangfire.md b/docs/en/Background-Jobs-Hangfire.md
index 4ee58d84ef..869a8075af 100644
--- a/docs/en/Background-Jobs-Hangfire.md
+++ b/docs/en/Background-Jobs-Hangfire.md
@@ -80,6 +80,41 @@ After you have installed these NuGet packages, you need to configure your projec
}
````
+### Specifying Queue
+
+You can use the [`QueueAttribute`](https://docs.hangfire.io/en/latest/background-processing/configuring-queues.html) to specify the queue.
+
+````csharp
+using System.Threading.Tasks;
+using Volo.Abp.BackgroundJobs;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Emailing;
+
+namespace MyProject
+{
+ [Queue("alpha")]
+ public class EmailSendingJob
+ : AsyncBackgroundJob, ITransientDependency
+ {
+ private readonly IEmailSender _emailSender;
+
+ public EmailSendingJob(IEmailSender emailSender)
+ {
+ _emailSender = emailSender;
+ }
+
+ public override async Task ExecuteAsync(EmailSendingArgs args)
+ {
+ await _emailSender.SendAsync(
+ args.EmailAddress,
+ args.Subject,
+ args.Body
+ );
+ }
+ }
+}
+````
+
### Dashboard Authorization
Hangfire Dashboard provides information about your background jobs, including method names and serialized arguments as well as gives you an opportunity to manage them by performing different actions – retry, delete, trigger, etc. So it is important to restrict access to the Dashboard.
diff --git a/docs/en/Background-Jobs-RabbitMq.md b/docs/en/Background-Jobs-RabbitMq.md
index 16b8b0981a..8eec3733fb 100644
--- a/docs/en/Background-Jobs-RabbitMq.md
+++ b/docs/en/Background-Jobs-RabbitMq.md
@@ -126,25 +126,31 @@ By default, all the job types use the `Default` RabbitMQ connection.
Configure(options =>
{
options.DefaultQueueNamePrefix = "my_app_jobs.";
+ options.DefaultDelayedQueueNamePrefix = "my_app_jobs.delayed"
+ options.PrefetchCount = 1;
options.JobQueues[typeof(EmailSendingArgs)] =
new JobQueueConfiguration(
typeof(EmailSendingArgs),
queueName: "my_app_jobs.emails",
- connectionName: "SecondConnection"
+ connectionName: "SecondConnection",
+ delayedQueueName:"my_app_jobs.emails.delayed"
);
});
````
-* This example sets the default queue name prefix to `my_app_jobs.`. If different applications use the same RabbitMQ server, it would be important to use different prefixes for each application to not consume jobs of each other.
+* This example sets the default queue name prefix to `my_app_jobs.` and default delayed queue name prefix to `my_app_jobs.delayed`. If different applications use the same RabbitMQ server, it would be important to use different prefixes for each application to not consume jobs of each other.
+* Sets `PrefetchCount` for all queues.
* Also specifies a different connection string for the `EmailSendingArgs`.
`JobQueueConfiguration` class has some additional options in its constructor;
* `queueName`: The queue name that is used for this job. The prefix is not added, so you need to specify the full name of the queue.
+* `DelayedQueueName`: The delayed queue name that is used for delayed execution of job. The prefix is not added, so you need to specify the full name of the queue.
* `connectionName`: The RabbitMQ connection name (see the connection configuration above). This is optional and the default value is `Default`.
* `durable` (optional, default: `true`).
* `exclusive` (optional, default: `false`).
-* `autoDelete` (optional, default: `false`)
+* `autoDelete` (optional, default: `false`).
+* `PrefetchCount` (optional, default: null)
See the RabbitMQ documentation if you want to understand the `durable`, `exclusive` and `autoDelete` options better, while most of the times the default configuration is what you want.
diff --git a/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/How-to-Design-Multi-Lingual-Entity.md b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/How-to-Design-Multi-Lingual-Entity.md
new file mode 100644
index 0000000000..2c4b860c95
--- /dev/null
+++ b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/How-to-Design-Multi-Lingual-Entity.md
@@ -0,0 +1,690 @@
+# How to Design Multi-Lingual Entity
+
+## Introduction
+
+If you want to open up to the global market these days, end-to-end localization is a must. ABP provides an already established infrastructure for static texts. However, this may not be sufficient for many applications. You may need to fully customize your app for a particular language and region.
+
+Let's take a look at a few quotes from Christian Arno's article "[How Foreign-Language Internet Strategies Boost Sales](https://www.mediapost.com/publications/article/155250/how-foreign-language-internet-strategies-boost-sal.html)" to better understand the impact of this:
+
+- 82% of European consumers are less likely to buy online if the site is not in their native tongue ([Eurobarometer survey](http://europa.eu/rapid/pressReleasesAction.do?reference=IP/11/556)).
+- 72.4% of global consumers are more likely to buy a product if the information is available in their own language ([Common Sense Advisory](http://www.commonsenseadvisory.com/)).
+- The English language currently only accounts for 31% of all online use, and more than half of all searches are in languages other than English.
+- Today, 42% of all Internet users are in Asia, while almost one-quarter are in Europe and just over 10% are in Latin America.
+
+- Foreign languages have experienced exponential growth in online usage in the past decade -- with Chinese now officially the [second-most-prominent-language](http://english.peopledaily.com.cn/90001/90776/90882/7438489.html) on the Web. [Arabic](http://www.internetworldstats.com/stats7.htm) has increased by a whopping 2500%, while English has only risen by 204%
+
+If you are looking for ways to expand your market share by fully customizing your application for a particular language and region, in this article I will explain how you can do it with ABP framework.
+
+### Source Code
+
+You can find the source code of the application at [abpframework/abp-samples](https://github.com/abpframework/abp-samples/tree/master/AcmeBookStoreMultiLingual).
+
+### Demo of the Final Application
+
+At the end of this article, we will have created an application same as in the gif below.
+
+
+
+## Development
+
+In order to keep the article short and get rid of unrelated information in the article (like defining entities etc.), we'll be using the [BookStore](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) example, which is used in the "[Web Application Development Tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC&DB=EF)" documentation of ABP Framework and we will make the Book entity as multi-lingual. If you do not want to finish this tutorial, you can find the application [here](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore).
+
+### Determining the data model
+
+We need a robust, maintainable, and efficient data model to store content in multiple languages.
+
+> I read many articles to determine the data model correctly, and as a result, I decided to use one of the many approaches that suit us.
+> However, as in everything, there is a trade-off here. If you are wondering about the advantages and disadvantages of the model we will implement compared to other models, I recommend you to read [this article](https://vertabelo.com/blog/data-modeling-for-multiple-languages-how-to-design-a-localization-ready-system/).
+
+
+
+As a result of the tutorial, we already have the `Book` and `Author` entities, as an extra, we will just add the `BookTranslation`.
+
+> In the article, we will make the Name property of the Book entity multi-lingual, but the article is independent of the Book entity, you can make the entity you want multi-lingual with similar codes according to your requirements.
+
+#### Acme.BookStore.Domain.Shared
+
+Create a folder named `MultiLingualObjects` and create the following interfaces in its contents.
+
+We will use the `IObjectTranslation` interface to mark the translation of a multi-lingual entity:
+
+```csharp
+public interface IObjectTranslation
+{
+ string Language { get; set; }
+}
+```
+
+We will use the `IMultiLingualObject` interface to mark multi-lingual entities:
+
+```csharp
+public interface IMultiLingualObject
+ where TTranslation : class, IObjectTranslation
+{
+ ICollection Translations { get; set; }
+}
+```
+
+#### Acme.BookStore.Domain
+
+In the `Books` folder, create the `BookTranslation` class as follows:
+
+```csharp
+public class BookTranslation : Entity, IObjectTranslation
+{
+ public Guid BookId { get; set; }
+
+ public string Name { get; set; }
+
+ public string Language { get; set; }
+
+ public override object[] GetKeys()
+ {
+ return new object[] {BookId, Language};
+ }
+}
+```
+
+`BookTranslation` contains the `Language` property, which contains a language code for translation and a reference to the multi-lingual entity. We also have the `BookId` foreign key to help us know which book is translated.
+
+Implement `IMultiLingualObject` in the `Book` class as follows:
+
+```csharp
+public class Book : AuditedAggregateRoot, IMultiLingualObject
+{
+ public Guid AuthorId { get; set; }
+
+ public string Name { get; set; }
+
+ public BookType Type { get; set; }
+
+ public DateTime PublishDate { get; set; }
+
+ public float Price { get; set; }
+
+ public ICollection Translations { get; set; }
+}
+```
+
+Create a folder named `MultiLingualObjects` and add the following class inside of this folder:
+
+```csharp
+public class MultiLingualObjectManager : ITransientDependency
+{
+ protected const int MaxCultureFallbackDepth = 5;
+
+ public async Task FindTranslationAsync(
+ TMultiLingual multiLingual,
+ string culture = null,
+ bool fallbackToParentCultures = true)
+ where TMultiLingual : IMultiLingualObject
+ where TTranslation : class, IObjectTranslation
+ {
+ culture ??= CultureInfo.CurrentUICulture.Name;
+
+ if (multiLingual.Translations.IsNullOrEmpty())
+ {
+ return null;
+ }
+
+ var translation = multiLingual.Translations.FirstOrDefault(pt => pt.Language == culture);
+ if (translation != null)
+ {
+ return translation;
+ }
+
+ if (fallbackToParentCultures)
+ {
+ translation = GetTranslationBasedOnCulturalRecursive(
+ CultureInfo.CurrentUICulture.Parent,
+ multiLingual.Translations,
+ 0
+ );
+
+ if (translation != null)
+ {
+ return translation;
+ }
+ }
+
+ return null;
+ }
+
+ protected TTranslation GetTranslationBasedOnCulturalRecursive(
+ CultureInfo culture, ICollection translations, int currentDepth)
+ where TTranslation : class, IObjectTranslation
+ {
+ if (culture == null ||
+ culture.Name.IsNullOrWhiteSpace() ||
+ translations.IsNullOrEmpty() ||
+ currentDepth > MaxCultureFallbackDepth)
+ {
+ return null;
+ }
+
+ var translation = translations.FirstOrDefault(pt => pt.Language.Equals(culture.Name, StringComparison.OrdinalIgnoreCase));
+ return translation ?? GetTranslationBasedOnCulturalRecursive(culture.Parent, translations, currentDepth + 1);
+ }
+}
+```
+
+With `MultiLingualObjectManager`'s `FindTranslationAsync` method, we get the translated version of the book according to `CurrentUICulture`. If no translation of culture is found, we return null.
+
+> Every thread in .NET has `CurrentCulture` and `CurrentUICulture` objects.
+
+#### Acme.BookStore.EntityFrameworkCore
+
+In the `OnModelCreating` method of the `BookStoreDbContext` class, configure the `BookTranslation` as follows:
+
+```csharp
+builder.Entity(b =>
+{
+ b.ToTable(BookStoreConsts.DbTablePrefix + "BookTranslations",
+ BookStoreConsts.DbSchema);
+
+ b.ConfigureByConvention();
+
+ b.HasKey(x => new {x.BookId, x.Language});
+});
+```
+
+> I haven't explicitly set up a one-to-many relationship between `Book` and `BookTranslation` here, but the entity framework will do it for us.
+
+After that, you can just run the following command in a command-line terminal to add a new database migration (in the directory of the `EntityFrameworkCore` project):
+
+```bash
+dotnet ef migrations add Added_BookTranslation
+```
+
+This will add a new migration class to your project. You can then run the following command (or run the `.DbMigrator` application) to apply changes to the database:
+
+```bash
+dotnet ef database update
+```
+
+Add the following code to the `ConfigureServices` method of the `BookStoreEntityFrameworkCoreModule`:
+
+```csharp
+ Configure(options =>
+ {
+ options.Entity(bookOptions =>
+ {
+ bookOptions.DefaultWithDetailsFunc = query => query.Include(o => o.Translations);
+ });
+});
+```
+
+Now we can use `WithDetailsAsync` without any parameters on `BookAppService` knowing that `Translations` will be included.
+
+#### Acme.BookStore.Application.Contracts
+
+Implement `IObjectTranslation` in the `BookDto` class as follows:
+
+```csharp
+public class BookDto : AuditedEntityDto, IObjectTranslation
+{
+ public Guid AuthorId { get; set; }
+
+ public string AuthorName { get; set; }
+
+ public string Name { get; set; }
+
+ public BookType Type { get; set; }
+
+ public DateTime PublishDate { get; set; }
+
+ public float Price { get; set; }
+
+ public string Language { get; set; }
+}
+```
+
+`Language` property is required to understand which language the translated book name belongs to in the UI.
+
+Create the `AddBookTranslationDto` class in the `Books` folder as follows:
+
+```csharp
+public class AddBookTranslationDto : IObjectTranslation
+{
+ [Required]
+ public string Language { get; set; }
+
+ [Required]
+ public string Name { get; set; }
+}
+```
+
+Add the `AddTranslationsAsync` method to the `IBookAppService` as follows:
+
+```csharp
+public interface IBookAppService :
+ ICrudAppService<
+ BookDto,
+ Guid,
+ PagedAndSortedResultRequestDto,
+ CreateUpdateBookDto>
+{
+ Task> GetAuthorLookupAsync();
+
+ Task AddTranslationsAsync(Guid id, AddBookTranslationDto input); // added this line
+}
+```
+
+#### Acme.BookStore.Application
+
+Now, we need to implement the `AddTranslationsAsync` method in `BookAppService` and include `Translations` in the `Book` entity, for this you can change the `BookAppService` as follows:
+
+```csharp
+[Authorize(BookStorePermissions.Books.Default)]
+public class BookAppService :
+ CrudAppService<
+ Book, //The Book entity
+ BookDto, //Used to show books
+ Guid, //Primary key of the book entity
+ PagedAndSortedResultRequestDto, //Used for paging/sorting
+ CreateUpdateBookDto>, //Used to create/update a book
+ IBookAppService //implement the IBookAppService
+{
+ private readonly IAuthorRepository _authorRepository;
+
+ public BookAppService(
+ IRepository repository,
+ IAuthorRepository authorRepository)
+ : base(repository)
+ {
+ _authorRepository = authorRepository;
+ GetPolicyName = BookStorePermissions.Books.Default;
+ GetListPolicyName = BookStorePermissions.Books.Default;
+ CreatePolicyName = BookStorePermissions.Books.Create;
+ UpdatePolicyName = BookStorePermissions.Books.Edit;
+ DeletePolicyName = BookStorePermissions.Books.Create;
+ }
+
+ public override async Task GetAsync(Guid id)
+ {
+ //Get the IQueryable from the repository
+ var queryable = await Repository.WithDetailsAsync(); // this line changed
+
+ //Prepare a query to join books and authors
+ var query = from book in queryable
+ join author in await _authorRepository.GetQueryableAsync() on book.AuthorId equals author.Id
+ where book.Id == id
+ select new { book, author };
+
+ //Execute the query and get the book with author
+ var queryResult = await AsyncExecuter.FirstOrDefaultAsync(query);
+ if (queryResult == null)
+ {
+ throw new EntityNotFoundException(typeof(Book), id);
+ }
+
+ var bookDto = ObjectMapper.Map(queryResult.book);
+ bookDto.AuthorName = queryResult.author.Name;
+ return bookDto;
+ }
+
+ public override async Task> GetListAsync(PagedAndSortedResultRequestDto input)
+ {
+ //Get the IQueryable from the repository
+ var queryable = await Repository.WithDetailsAsync(); // this line changed
+
+ //Prepare a query to join books and authors
+ var query = from book in queryable
+ join author in await _authorRepository.GetQueryableAsync() on book.AuthorId equals author.Id
+ select new {book, author};
+
+ //Paging
+ query = query
+ .OrderBy(NormalizeSorting(input.Sorting))
+ .Skip(input.SkipCount)
+ .Take(input.MaxResultCount);
+
+ //Execute the query and get a list
+ var queryResult = await AsyncExecuter.ToListAsync(query);
+
+ //Convert the query result to a list of BookDto objects
+ var bookDtos = queryResult.Select(x =>
+ {
+ var bookDto = ObjectMapper.Map(x.book);
+ bookDto.AuthorName = x.author.Name;
+ return bookDto;
+ }).ToList();
+
+ //Get the total count with another query
+ var totalCount = await Repository.GetCountAsync();
+
+ return new PagedResultDto(
+ totalCount,
+ bookDtos
+ );
+ }
+
+ public async Task> GetAuthorLookupAsync()
+ {
+ var authors = await _authorRepository.GetListAsync();
+
+ return new ListResultDto(
+ ObjectMapper.Map, List>(authors)
+ );
+ }
+
+ public async Task AddTranslationsAsync(Guid id, AddBookTranslationDto input)
+ {
+ var queryable = await Repository.WithDetailsAsync();
+
+ var book = await AsyncExecuter.FirstOrDefaultAsync(queryable, x => x.Id == id);
+
+ if (book.Translations.Any(x => x.Language == input.Language))
+ {
+ throw new UserFriendlyException($"Translation already available for {input.Language}");
+ }
+
+ book.Translations.Add(new BookTranslation
+ {
+ BookId = book.Id,
+ Name = input.Name,
+ Language = input.Language
+ });
+
+ await Repository.UpdateAsync(book);
+ }
+
+ private static string NormalizeSorting(string sorting)
+ {
+ if (sorting.IsNullOrEmpty())
+ {
+ return $"book.{nameof(Book.Name)}";
+ }
+
+ if (sorting.Contains("authorName", StringComparison.OrdinalIgnoreCase))
+ {
+ return sorting.Replace(
+ "authorName",
+ "author.Name",
+ StringComparison.OrdinalIgnoreCase
+ );
+ }
+
+ return $"book.{sorting}";
+ }
+}
+```
+
+Create the `MultiLingualBookObjectMapper` class as follows:
+
+```csharp
+public class MultiLingualBookObjectMapper : IObjectMapper, ITransientDependency
+{
+ private readonly MultiLingualObjectManager _multiLingualObjectManager;
+
+ private readonly ISettingProvider _settingProvider;
+
+ public MultiLingualBookObjectMapper(
+ MultiLingualObjectManager multiLingualObjectManager,
+ ISettingProvider settingProvider)
+ {
+ _multiLingualObjectManager = multiLingualObjectManager;
+ _settingProvider = settingProvider;
+ }
+
+ public BookDto Map(Book source)
+ {
+ var translation = AsyncHelper.RunSync(() =>
+ _multiLingualObjectManager.FindTranslationAsync(source));
+
+ return new BookDto
+ {
+ Id = source.Id,
+ AuthorId = source.AuthorId,
+ Type = source.Type,
+ Name = translation?.Name ?? source.Name,
+ PublishDate = source.PublishDate,
+ Price = source.Price,
+ Language = translation?.Language ?? AsyncHelper.RunSync(() => _settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage)),
+ CreationTime = source.CreationTime,
+ CreatorId = source.CreatorId,
+ LastModificationTime = source.LastModificationTime,
+ LastModifierId = source.LastModifierId
+ };
+ }
+
+ public BookDto Map(Book source, BookDto destination)
+ {
+ return default;
+ }
+}
+```
+
+To map the multi-lingual `Book` entity to `BookDto`, we implement custom mapping using the `IObjectMapper` interface. If no translation is found, default values are returned.
+
+So far we have created the entire infrastructure. We don't need to change anything in the UI, if there is a translation according to the language chosen by the user, the list view will change. However, I want to create a simple modal where we can add new translations to an existing book in order to see what we have done.
+
+#### Acme.BookStore.Web
+
+Create a new razor page named `AddTranslationModal` in the `Books` folder as below.
+
+**View**
+
+```html
+@page
+@using Microsoft.AspNetCore.Mvc.TagHelpers
+@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
+@model Acme.BookStore.Web.Pages.Books.AddTranslationModal
+
+@{
+ Layout = null;
+}
+
+
+```
+
+**Model**
+
+```csharp
+public class AddTranslationModal : BookStorePageModel
+{
+ [HiddenInput]
+ [BindProperty(SupportsGet = true)]
+ public Guid Id { get; set; }
+
+ public List Languages { get; set; }
+
+ [BindProperty]
+ public BookTranslationViewModel TranslationViewModel { get; set; }
+
+ private readonly IBookAppService _bookAppService;
+ private readonly ILanguageProvider _languageProvider;
+
+ public AddTranslationModal(
+ IBookAppService bookAppService,
+ ILanguageProvider languageProvider)
+ {
+ _bookAppService = bookAppService;
+ _languageProvider = languageProvider;
+ }
+
+ public async Task OnGetAsync()
+ {
+ Languages = await GetLanguagesSelectItem();
+
+ TranslationViewModel = new BookTranslationViewModel();
+ }
+
+ public async Task OnPostAsync()
+ {
+ await _bookAppService.AddTranslationsAsync(Id, ObjectMapper.Map(TranslationViewModel));
+
+ return NoContent();
+ }
+
+ private async Task> GetLanguagesSelectItem()
+ {
+ var result = await _languageProvider.GetLanguagesAsync();
+
+ return result.Select(
+ languageInfo => new SelectListItem
+ {
+ Value = languageInfo.CultureName,
+ Text = languageInfo.DisplayName + " (" + languageInfo.CultureName + ")"
+ }
+ ).ToList();
+ }
+
+ public class BookTranslationViewModel
+ {
+ [Required]
+ [SelectItems(nameof(Languages))]
+ public string Language { get; set; }
+
+ [Required]
+ public string Name { get; set; }
+
+ }
+}
+```
+
+Then, we can open the `BookStoreWebAutoMapperProfile` class and define the required mapping as follows:
+
+```csharp
+CreateMap();
+```
+
+Finally, change the content of `index.js` in the `Books` folder as follows:
+
+```javascript
+$(function () {
+ var l = abp.localization.getResource('BookStore');
+ var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal');
+ var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal');
+ var addTranslationModal = new abp.ModalManager(abp.appPath + 'Books/AddTranslationModal'); // added this line
+
+ var dataTable = $('#BooksTable').DataTable(
+ abp.libs.datatables.normalizeConfiguration({
+ serverSide: true,
+ paging: true,
+ order: [[1, "asc"]],
+ searching: false,
+ scrollX: true,
+ ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList),
+ columnDefs: [
+ {
+ title: l('Actions'),
+ rowAction: {
+ items:
+ [
+ {
+ text: l('Edit'),
+ visible: abp.auth.isGranted('BookStore.Books.Edit'),
+ action: function (data) {
+ editModal.open({ id: data.record.id });
+ }
+ },
+ {
+ text: l('Add Translation'), // added this action
+ visible: abp.auth.isGranted('BookStore.Books.Edit'),
+ action: function (data) {
+ addTranslationModal.open({ id: data.record.id });
+ }
+ },
+ {
+ text: l('Delete'),
+ visible: abp.auth.isGranted('BookStore.Books.Delete'),
+ confirmMessage: function (data) {
+ return l(
+ 'BookDeletionConfirmationMessage',
+ data.record.name
+ );
+ },
+ action: function (data) {
+ acme.bookStore.books.book
+ .delete(data.record.id)
+ .then(function() {
+ abp.notify.info(
+ l('SuccessfullyDeleted')
+ );
+ dataTable.ajax.reload();
+ });
+ }
+ }
+ ]
+ }
+ },
+ {
+ title: l('Name'),
+ data: "name"
+ },
+ {
+ title: l('Author'),
+ data: "authorName"
+ },
+ {
+ title: l('Type'),
+ data: "type",
+ render: function (data) {
+ return l('Enum:BookType:' + data);
+ }
+ },
+ {
+ title: l('PublishDate'),
+ data: "publishDate",
+ render: function (data) {
+ return luxon
+ .DateTime
+ .fromISO(data, {
+ locale: abp.localization.currentCulture.name
+ }).toLocaleString();
+ }
+ },
+ {
+ title: l('Price'),
+ data: "price"
+ },
+ {
+ title: l('CreationTime'),
+ data: "creationTime",
+ render: function (data) {
+ return luxon
+ .DateTime
+ .fromISO(data, {
+ locale: abp.localization.currentCulture.name
+ }).toLocaleString(luxon.DateTime.DATETIME_SHORT);
+ }
+ }
+ ]
+ })
+ );
+
+ createModal.onResult(function () {
+ dataTable.ajax.reload();
+ });
+
+ editModal.onResult(function () {
+ dataTable.ajax.reload();
+ });
+
+ $('#NewBookButton').click(function (e) {
+ e.preventDefault();
+ createModal.open();
+ });
+});
+```
+
+## Conclusion
+
+With a multi-lingual application, you can expand your market share, but if not designed well, may your application will be unusable. So, I've tried to explain how to design a sustainable multi-lingual entity in this article.
+
+### Source Code
+
+You can find source code of the example solution used in this article [here](https://github.com/abpframework/abp-samples/tree/master/AcmeBookStoreMultiLingual).
diff --git a/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/data-model.png b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/data-model.png
new file mode 100644
index 0000000000..c7e02bc2cd
Binary files /dev/null and b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/data-model.png differ
diff --git a/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/result.gif b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/result.gif
new file mode 100644
index 0000000000..0bc41cb8f1
Binary files /dev/null and b/docs/en/Community-Articles/15-08-2022-How-to-Design-Multi-Lingual-Entity/result.gif differ
diff --git a/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md b/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md
index 308358bb67..8e46bd6944 100644
--- a/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md
+++ b/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md
@@ -1,9 +1,13 @@
# How to Add Custom Properties to the User Entity
+> **Note:** If your application is greater than version 4.3.3, please follow [this article](../2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md).
+
## Introduction
In this step-by-step article, I will explain how you can customize the user entity class, which is available in every web application you create using the ABP framework, according to your needs. When you read this article, you will learn how to override the services of built-in modules, extend the entities, extend data transfer objects and customize the user interface in the applications you develop using the ABP framework.
+> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](../2020-05-09-Customize-the-Login-Page-for-MVC-Razor-Page-Applications/POST.md).
+
You can see the screenshots below which we will reach at the end of the article.

diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md
new file mode 100644
index 0000000000..7c119c6e66
--- /dev/null
+++ b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md
@@ -0,0 +1,154 @@
+# How to Add Custom Properties to the User Entity
+
+> **Note:** If your application is less than version 4.4.x, please follow [this article](../2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md).
+
+## Introduction
+
+In this step-by-step article, I will explain how you can customize the user entity class, which is available in every web application you create using the ABP framework, according to your needs. When you read this article, you will learn how to override the services of built-in modules, extend the entities, extend data transfer objects and customize the user interface in the applications you develop using the ABP framework.
+
+> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](../2020-05-09-Customize-the-Login-Page-for-MVC-Razor-Page-Applications/POST.md).
+
+You can see the screenshots below which we will reach at the end of the article.
+
+
+
+
+
+## Preparing the Project
+
+### Startup template and the initial run
+
+Abp Framework offers startup templates to get into the work faster. We can create a new startup template using Abp CLI:
+
+`abp new CustomizeUserDemo`
+
+> In this article, I will go through the MVC application, but it will work also in the [Angular](https://docs.abp.io/en/abp/latest/Getting-Started?UI=NG&DB=EF&Tiered=No), [Blazor Server](https://docs.abp.io/en/abp/latest/Getting-Started?UI=BlazorServer&DB=EF&Tiered=No), and [Blazor WebAssembly](https://docs.abp.io/en/abp/latest/Getting-Started?UI=Blazor&DB=EF&Tiered=No) application.
+
+After the download is finished, we can run **CustomizeUserDemo.DbMigrator** project to create the database migrations and seed the initial data (admin user, role, etc). Then we can run `CustomizeUserDemo.Web` to see that our application is working.
+
+> Default admin username is **admin** and password is **1q2w3E\***
+
+
+
+In this article, we will go through a scenario together and find the solutions to our questions through this scenario. However, since the scenario is not a real-life scenario, it may be strange, please don't get too about this issue :)
+
+## Step-1
+
+Create the Users folder in the **CustomizeUserDemo.Domain.Shared** project, create the class `UserConsts` inside the folder and update the class you created as below:
+
+```csharp
+public static class UserConsts
+{
+ public const string TitlePropertyName = "Title";
+
+ public const string ReputationPropertyName = "Reputation";
+
+ public const int MaxTitleLength = 64;
+
+ public const double MaxReputationValue = 1_000;
+
+ public const double MinReputationValue = 1;
+}
+```
+
+## Step-2
+
+Update the `CustomizeUserDemoEfCoreEntityExtensionMappings` class in the **CustomizeUserDemo.EntityFramework** project in the EntityFrameworkCore folder as below:
+
+```csharp
+public static class CustomizeUserDemoEfCoreEntityExtensionMappings
+{
+ private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
+
+ public static void Configure()
+ {
+ CustomizeUserDemoGlobalFeatureConfigurator.Configure();
+ CustomizeUserDemoModuleExtensionConfigurator.Configure();
+
+ OneTimeRunner.Run(() =>
+ {
+ ObjectExtensionManager.Instance
+ .MapEfCoreProperty(
+ UserConsts.TitlePropertyName,
+ (_, propertyBuilder) =>
+ {
+ propertyBuilder.HasDefaultValue("");
+ propertyBuilder.HasMaxLength(UserConsts.MaxTitleLength);
+ }
+ ).MapEfCoreProperty(
+ UserConsts.ReputationPropertyName,
+ (_, propertyBuilder) =>
+ {
+ propertyBuilder.HasDefaultValue(UserConsts.MinReputationValue);
+ }
+ );
+ });
+ }
+}
+```
+
+This class can be used to map these extra properties to table fields in the database. Please read [this](https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities) article to improve your understanding of what we are doing.
+
+So far, we have added our extra features to the `User` entity and matched these features with the `ef core`.
+
+Now we need to add migration to see what has changed in our database. This for, open the Package Manager Console (PMC) under the menu Tools > NuGet Package Manager.
+
+
+
+Select the **CustomizeUserDemo.EntityFramework** as the **default project** and execute the following command:
+
+```bash
+Add-Migration "Updated-User-Entity"
+```
+
+
+
+This will create a new migration class inside the `Migrations` folder of the **CustomizeUserDemo.EntityFrameworkCore** project.
+
+> If you are using another IDE than the Visual Studio, you can use `dotnet-ef` tool as [documented here](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli#create-a-migration).
+
+Finally, run the **CustomizeUserDemo.DbMigrator** project to update the database.
+
+When we updated the database, you can see that the `Title` and `Reputation` columns are added to the `Users` table.
+
+
+
+## Step-3
+Open the `CustomizeUserDemoModuleExtensionConfigurator` in the **CustomizeUserDemo.Domain.Shared** project, and change the contents of the `ConfigureExtraProperties` method as shown below:
+```csharp
+private static void ConfigureExtraProperties()
+{
+ ObjectExtensionManager.Instance.Modules().ConfigureIdentity(identity =>
+ {
+ identity.ConfigureUser(user =>
+ {
+ user.AddOrUpdateProperty(
+ UserConsts.TitlePropertyName,
+ options =>
+ {
+ options.Attributes.Add(new RequiredAttribute());
+ options.Attributes.Add(
+ new StringLengthAttribute(UserConsts.MaxTitleLength)
+ );
+ }
+ );
+ user.AddOrUpdateProperty(
+ UserConsts.ReputationPropertyName,
+ options =>
+ {
+ options.DefaultValue = UserConsts.MinReputationValue;
+ options.Attributes.Add(
+ new RangeAttribute(UserConsts.MinReputationValue, UserConsts.MaxReputationValue)
+ );
+ }
+ );
+ });
+ });
+}
+```
+
+That's it. Now let's run the application and look at the Identity user page. You can also try to edit and recreate a record if you want, it will work even though we haven't done anything extra. Here is the magic code behind ABP framework.
+
+If there is a situation you want to add, you can click the contribute button or make a comment. Also, if you like the article, don't forget to share it :)
+
+Happy coding :)
diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/added-new-migration.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/added-new-migration.png
new file mode 100755
index 0000000000..d459fdeed2
Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/added-new-migration.png differ
diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/custom-identity-user-list.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/custom-identity-user-list.png
new file mode 100644
index 0000000000..896ed947aa
Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/custom-identity-user-list.png differ
diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/initial-project.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/initial-project.png
new file mode 100755
index 0000000000..b64e93a99f
Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/initial-project.png differ
diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/new-user.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/new-user.png
new file mode 100644
index 0000000000..d3a5c66198
Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/new-user.png differ
diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/nuget-package-manager.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/nuget-package-manager.png
new file mode 100755
index 0000000000..680bc9d2e7
Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/nuget-package-manager.png differ
diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/user-table.png b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/user-table.png
new file mode 100755
index 0000000000..5bb71b8325
Binary files /dev/null and b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/user-table.png differ
diff --git a/docs/en/Dapr/Index.md b/docs/en/Dapr/Index.md
new file mode 100644
index 0000000000..4cdf28c7f9
--- /dev/null
+++ b/docs/en/Dapr/Index.md
@@ -0,0 +1,469 @@
+# ABP Dapr Integration
+
+> This document assumes that you are already familiar with [Dapr](https://dapr.io/) and you want to use it in your ABP based applications.
+
+[Dapr](https://dapr.io/) (Distributed Application Runtime) provides APIs that simplify microservice connectivity. It is an open source project that is mainly backed by Microsoft. It is also a CNCF (Cloud Native Computing Foundation) project and trusted by community.
+
+ABP and Dapr has some intersecting features like service-to-service communication, distributed message bus and distributed locking. However their purposes are totally different. ABP's goal is to provide an end-to-end developer experience by offering an opinionated architecture and providing the necessary infrastructure libraries, reusable modules and tools to implement that architecture properly. Dapr's purpose, on the other hand, is to provide a runtime to decouple common microservice communication patterns from your application logic.
+
+ABP and Dapr can perfectly work together in the same application. ABP offers some packages to provide better integration where Dapr features intersect with ABP. You can use other Dapr features with no ABP integration packages based on [its own documentation](https://docs.dapr.io/).
+
+## ABP Dapr Integration Packages
+
+ABP provides the following NuGet packages for the Dapr integration:
+
+* [Volo.Abp.Dapr](https://www.nuget.org/packages/Volo.Abp.Dapr): The main Dapr integration package. All other packages depend on this package.
+* [Volo.Abp.Http.Client.Dapr](https://www.nuget.org/packages/Volo.Abp.Http.Client.Dapr): Integration package for ABP's [dynamic](../API/Dynamic-CSharp-API-Clients.md) and [static](../API/Static-CSharp-API-Clients.md) C# API Client Proxies systems with Dapr's [service invocation](https://docs.dapr.io/developing-applications/building-blocks/service-invocation/service-invocation-overview/) building block.
+* [Volo.Abp.EventBus.Dapr](https://www.nuget.org/packages/Volo.Abp.EventBus.Dapr): Implements ABP's distributed event bus with Dapr's [publish & subscribe](https://docs.dapr.io/developing-applications/building-blocks/pubsub/) building block. With this package, you can send events, but can not receive.
+* [Volo.Abp.AspNetCore.Mvc.Dapr.EventBus](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus): Provides the endpoints to receive events from Dapr's [publish & subscribe](https://docs.dapr.io/developing-applications/building-blocks/pubsub/) building block. Use this package to send and receive events.
+* [Volo.Abp.DistributedLocking.Dapr](https://www.nuget.org/packages/Volo.Abp.DistributedLocking.Dapr): Uses Dapr's [distributed lock](https://docs.dapr.io/developing-applications/building-blocks/distributed-lock/) building block for [distributed locking](Distributed-Locking.md) service of the ABP Framework.
+
+In the following sections, we will see how to use these packages to use Dapr in your ABP based solutions.
+
+## Basics
+
+### Installation
+
+> This section explains how to add [Volo.Abp.Dapr](https://www.nuget.org/packages/Volo.Abp.Dapr), the core Dapr integration package to your project. If you are using one of the other Dapr integration packages, you can skip this section since this package will be indirectly added.
+
+Use the ABP CLI to add [Volo.Abp.Dapr](https://www.nuget.org/packages/Volo.Abp.Dapr) NuGet package to your project:
+
+* Install the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) if you haven't installed before.
+* Open a command line (terminal) in the directory of the `.csproj` file you want to add the `Volo.Abp.Dapr` package.
+* Run `abp add-package Volo.Abp.Dapr` command.
+
+If you want to do it manually, install the [Volo.Abp.Dapr](https://www.nuget.org/packages/Volo.Abp.Dapr) NuGet package to your project and add `[DependsOn(typeof(AbpDaprModule))]` to the [ABP module](Module-Development-Basics.md) class inside your project.
+
+### AbpDaprOptions
+
+`AbpDaprOptions` is the main [options class](../Options.md) that you can configure the global Dapr settings. **All settings are optional and you mostly don't need to configure them.** If you need, you can configure it in the `ConfigureServices` method of your [module class](../Module-Development-Basics.md):
+
+````csharp
+Configure(options =>
+{
+ // ...
+});
+````
+
+Available properties of the `AbpDaprOptions` class:
+
+* `HttpEndpoint` (optional): HTTP endpoint that is used while creating a `DaprClient` object. If you don't specify, the default value is used.
+* `GrpcEndpoint` (optional): The gRPC endpoint that is used while creating a `DaprClient` object. If you don't specify, the default value is used.
+* `DaprApiToken` (optional): The [Dapr API token](https://docs.dapr.io/operations/security/api-token/) that is used while sending requests from the application to Dapr. It is filled from the `DAPR_API_TOKEN` environment variable by default (which is set by Dapr once it is configured). See the *Security* section in this document for details.
+* `AppApiToken` (optional): The [App API token](https://docs.dapr.io/operations/security/app-api-token/) that is used to validate requests coming from Dapr. It is filled from the `APP_API_TOKEN` environment variable by default (which is set by Dapr once it is configured). See the *Security* section in this document for details.
+
+Alternatively, you can configure the options in the `Dapr` section of your `appsettings.json` file. Example:
+
+````csharp
+"Dapr": {
+ "HttpEndpoint": "http://localhost:3500/"
+}
+````
+
+### Injecting DaprClient
+
+ABP registers the `DaprClient` class to the [dependency injection](../Dependency-Injection.md) system. So, you can inject and use it whenever you need:
+
+````csharp
+public class MyService : ITransientDependency
+{
+ private readonly DaprClient _daprClient;
+
+ public MyService(DaprClient daprClient)
+ {
+ _daprClient = daprClient;
+ }
+
+ public async Task DoItAsync()
+ {
+ // TODO: Use the injected _daprClient object
+ }
+}
+````
+
+Injecting `DaprClient` is the recommended way of using it in your application code. When you inject it, the `IAbpDaprClientFactory` service is used to create it, which is explained in the next section.
+
+### IAbpDaprClientFactory
+
+`IAbpDaprClientFactory` can be used to create `DaprClient` or `HttpClient` objects to perform operations on Dapr. It uses `AbpDaprOptions`, so you can configure the settings in a central place.
+
+**Example usages:**
+
+````csharp
+public class MyService : ITransientDependency
+{
+ private readonly IAbpDaprClientFactory _daprClientFactory;
+
+ public MyService(IAbpDaprClientFactory daprClientFactory)
+ {
+ _daprClientFactory = daprClientFactory;
+ }
+
+ public async Task DoItAsync()
+ {
+ // Create a DaprClient object with default options
+ DaprClient daprClient = await _daprClientFactory.CreateAsync();
+
+ /* Create a DaprClient object with configuring
+ * the DaprClientBuilder object */
+ DaprClient daprClient2 = await _daprClientFactory
+ .CreateAsync(builder =>
+ {
+ builder.UseDaprApiToken("...");
+ });
+
+ // Create an HttpClient object
+ HttpClient httpClient = await _daprClientFactory
+ .CreateHttpClientAsync("target-app-id");
+ }
+}
+````
+
+`CreateHttpClientAsync` method also gets optional `daprEndpoint` and `daprApiToken` parameters.
+
+> ABP uses `IAbpDaprClientFactory` when it needs to create a Dapr client. You can also use Dapr API to create client objects in your application. Using `IAbpDaprClientFactory` is recommended, but not required.
+
+## C# API Client Proxies Integration
+
+ABP can [dynamically](../API/Dynamic-CSharp-API-Clients.md) or [statically](../API/Static-CSharp-API-Clients.md) generate proxy classes to invoke your HTTP APIs from a Dotnet client application. It makes dead simple to consume HTTP APIs in a distributed system. [Volo.Abp.Http.Client.Dapr](https://www.nuget.org/packages/Volo.Abp.Http.Client.Dapr) package configures the client-side proxies system, so it uses Dapr's service invocation building block for the communication between your applications.
+
+### Installation
+
+Use the ABP CLI to add [Volo.Abp.Http.Client.Dapr](https://www.nuget.org/packages/Volo.Abp.Http.Client.Dapr) NuGet package to your project (to the client side):
+
+* Install the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) if you haven't installed before.
+* Open a command line (terminal) in the directory of the `.csproj` file you want to add the `Volo.Abp.Http.Client.Dapr` package.
+* Run `abp add-package Volo.Abp.Http.Client.Dapr` command.
+
+If you want to do it manually, install the [Volo.Abp.Http.Client.Dapr](https://www.nuget.org/packages/Volo.Abp.Http.Client.Dapr) NuGet package to your project and add `[DependsOn(typeof(AbpHttpClientDaprModule))]` to the [ABP module](Module-Development-Basics.md) class inside your project.
+
+### Configuration
+
+One you install the [Volo.Abp.Http.Client.Dapr](https://www.nuget.org/packages/Volo.Abp.Http.Client.Dapr) NuGet package, all you need to do it to configure ABP's remote services option either in `appsettings.json` or using the `AbpRemoteServiceOptions` [options class](../Options.md).
+
+**Example:**
+
+````csharp
+{
+ "RemoteServices": {
+ "Default": {
+ "BaseUrl": "http://dapr-httpapi/"
+ }
+ }
+}
+````
+
+`dapr-httpapi` in this example is the application id of the server application in your Dapr configuration.
+
+The remove service name (`Default` in this example) should match the remote service name specified in the `AddHttpClientProxies` call for dynamic client proxies or `AddStaticHttpClientProxies` call for static client proxies. Using `Default` is fine if your client communicates to a single server. However, if your client uses multiple servers, you typically have multiple keys in the `RemoteServices` configuration. Once you configure the remote service endpoints as Dapr application ids, it will automatically work and make the HTTP calls through Dapr when you use ABP's client proxy system.
+
+> See the [dynamic](../API/Dynamic-CSharp-API-Clients.md) and [static](../API/Static-CSharp-API-Clients.md) client proxy documents for details about the ABP's client proxy system.
+
+## Distributed Event Bus Integration
+
+[ABP's distributed event bus](../Distributed-Event-Bus.md) system provides a convenient abstraction to allow applications communicate asynchronously via events. ABP has integration packages with various distributed messaging systems, like RabbitMQ, Kafka, and Azure. Dapr also has a [publish & subscribe building block](https://docs.dapr.io/developing-applications/building-blocks/pubsub/pubsub-overview/) for the same purpose: distributed messaging / events.
+
+ABP's [Volo.Abp.EventBus.Dapr](https://www.nuget.org/packages/Volo.Abp.EventBus.Dapr) and [Volo.Abp.AspNetCore.Mvc.Dapr.EventBus](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus) packages make possible to use the Dapr infrastructure for ABP's distributed event bus.
+
+The [Volo.Abp.EventBus.Dapr](https://www.nuget.org/packages/Volo.Abp.EventBus.Dapr) package can be used by any type of application (e.g., a Console or ASP.NET Core application) to publish events through Dapr. To be able to receive messages (by subscribing events), you need to have the [Volo.Abp.AspNetCore.Mvc.Dapr.EventBus](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus) package installed, and your application should be an ASP.NET Core application.
+
+### Installation
+
+If your application is an ASP.NET Core application and you want to send and receive events, you need to install the [Volo.Abp.AspNetCore.Mvc.Dapr.EventBus](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus) package as describe below:
+
+* Install the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) if you haven't installed before.
+* Open a command line (terminal) in the directory of the `.csproj` file you want to add the `Volo.Abp.AspNetCore.Mvc.Dapr.EventBus` package.
+* Run `abp add-package Volo.Abp.AspNetCore.Mvc.Dapr.EventBus` command.
+
+If you want to do it manually, install the [Volo.Abp.AspNetCore.Mvc.Dapr.EventBus](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus) NuGet package to your project and add `[DependsOn(typeof(AbpAspNetCoreMvcDaprEventBusModule))]` to the [ABP module](Module-Development-Basics.md) class inside your project.
+
+> **If you install the [Volo.Abp.AspNetCore.Mvc.Dapr.EventBus](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus) package, you don't need to install the [Volo.Abp.EventBus.Dapr](https://www.nuget.org/packages/Volo.Abp.EventBus.Dapr) package, because the first one already has a reference to the latter one.**
+
+If your application is not an ASP.NET Core application, you can't receive events from Dapr, at least with ABP's integration packages (see [Dapr's document](https://docs.dapr.io/developing-applications/building-blocks/pubsub/howto-publish-subscribe/) if you want to receive events in a different type of application). However, you can still publish messages using the [Volo.Abp.EventBus.Dapr](https://www.nuget.org/packages/Volo.Abp.EventBus.Dapr) package. In this case, follow the steps below to install that package to your project:
+
+* Install the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) if you haven't installed before.
+* Open a command line (terminal) in the directory of the `.csproj` file you want to add the `Volo.Abp.EventBus.Dapr` package.
+* Run `abp add-package Volo.Abp.EventBus.Dapr` command.
+
+If you want to do it manually, install the [Volo.Abp.EventBus.Dapr](https://www.nuget.org/packages/Volo.Abp.EventBus.Dapr) NuGet package to your project and add `[DependsOn(typeof(AbpEventBusDaprModule))]` to the [ABP module](Module-Development-Basics.md) class inside your project.
+
+### Configuration
+
+You can configure the `AbpDaprEventBusOptions` [options class](../Options.md) for Dapr configuration:
+
+````csharp
+Configure(options =>
+{
+ options.PubSubName = "pubsub";
+});
+````
+
+Available properties of the `AbpDaprEventBusOptions` class:
+
+* `PubSubName` (optional): The `pubsubName` parameter while publishing messages through `DaprClient.PublishEventAsync` method. Default value: `pubsub`.
+
+### The ABP Subscription Endpoints
+
+ABP provides the following endpoints to receive events from Dapr:
+
+* `dapr/subscribe`: Dapr uses this endpoint to get a list of subscriptions from the application. ABP automatically returns all the subscriptions for your distributed event handler classes and custom controller actions with the `Topic` attribute.
+* `api/abp/dapr/event`: The unified endpoint to receive all the events from Dapr. ABP dispatches the events to your event handlers based on the topic name.
+
+> **Since ABP provides the standard `dapr/subscribe` endpoint, you should not manually call the `app.MapSubscribeHandler()` method of Dapr.** You can use the `app.UseCloudEvents()` middleware in your ASP.NET Core pipeline if you want to support the [CloudEvents](https://cloudevents.io/) standard.
+
+### Usage
+
+#### The ABP Way
+
+You can follow [ABP's distributed event bus documentation](../Distributed-Event-Bus.md) to learn how to publish and subscribe to events in the ABP way. No change required in your application code to use Dapr pub-sub. ABP will automatically subscribe to Dapr for your event handler classes (those implement the `IDistributedEventHandler` interface).
+
+ABP provides `api/abp/dapr/event`
+
+**Example: Publish an event using the `IDistributedEventBus` service**
+
+````csharp
+public class MyService : ITransientDependency
+{
+ private readonly IDistributedEventBus _distributedEventBus;
+
+ public MyService(IDistributedEventBus distributedEventBus)
+ {
+ _distributedEventBus = distributedEventBus;
+ }
+
+ public async Task DoItAsync()
+ {
+ await _distributedEventBus.PublishAsync(new StockCountChangedEto
+ {
+ ProductCode = "AT837234",
+ NewStockCount = 42
+ });
+ }
+}
+````
+
+**Example: Subscribe to an event by implementing the `IDistributedEventHandler` interface**
+
+````csharp
+public class MyHandler :
+ IDistributedEventHandler,
+ ITransientDependency
+{
+ public async Task HandleEventAsync(StockCountChangedEto eventData)
+ {
+ var productCode = eventData.ProductCode;
+ // ...
+ }
+}
+````
+
+See [ABP's distributed event bus documentation](../Distributed-Event-Bus.md) to learn the details.
+
+#### Using the Dapr API
+
+In addition to ABP's standard distributed event bus system, you can also use Dapr's API to publish events.
+
+> If you directly use the Dapr API to publish events, you may not benefit from ABP's standard distributed event bus features, like the outbox/inbox pattern implementation.
+
+**Example: Publish an event using `DaprClient`**
+
+````csharp
+public class MyService : ITransientDependency
+{
+ private readonly DaprClient _daprClient;
+
+ public MyService(DaprClient daprClient)
+ {
+ _daprClient = daprClient;
+ }
+
+ public async Task DoItAsync()
+ {
+ await _daprClient.PublishEventAsync(
+ "pubsub", // pubsub name
+ "StockChanged", // topic name
+ new StockCountChangedEto // event data
+ {
+ ProductCode = "AT837234",
+ NewStockCount = 42
+ }
+ );
+ }
+}
+````
+
+**Example: Subscribe to an event by creating an ASP.NET Core controller**
+
+````csharp
+public class MyController : AbpController
+{
+ [HttpPost("/stock-changed")]
+ [Topic("pubsub", "StockChanged")]
+ public async Task TestRouteAsync(
+ [FromBody] StockCountChangedEto model)
+ {
+ HttpContext.ValidateDaprAppApiToken();
+
+ // Do something with the event
+ return Ok();
+ }
+}
+````
+
+`HttpContext.ValidateDaprAppApiToken()` extension method is provided by ABP to check if the request is coming from Dapr. This is optional. You should configure Dapr to send App API token to your application if you want to enable the validation. If not configured, `ValidateDaprAppApiToken()` does nothing. See [Dapr's App API Token document](https://docs.dapr.io/operations/security/app-api-token/) for more information. Also see the *AbpDaprOptions* and *Security* sections in this document.
+
+See the [Dapr documentation](https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/publish-subscribe) to learn the details of sending & receiving events with Dapr API.
+
+## Distributed Lock
+
+> Dapr's distributed lock feature currently in Alpha stage and may not be stable yet. It is not suggested to replace ABP's distributed lock with Dapr in that point.
+
+ABP provides a [Distributed Locking](../Distributed-Locking.md) abstraction to control access to a shared resource by multiple applications. Dapr also has a [distributed lock building block](https://docs.dapr.io/developing-applications/building-blocks/distributed-lock/). [Volo.Abp.DistributedLocking.Dapr](https://www.nuget.org/packages/Volo.Abp.DistributedLocking.Dapr) package makes ABP using Dapr's distributed locking system.
+
+### Installation
+
+Use the ABP CLI to add [Volo.Abp.DistributedLocking.Dapr](https://www.nuget.org/packages/Volo.Abp.DistributedLocking.Dapr) NuGet package to your project (to the client side):
+
+* Install the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) if you haven't installed before.
+* Open a command line (terminal) in the directory of the `.csproj` file you want to add the `Volo.Abp.DistributedLocking.Dapr` package.
+* Run `abp add-package Volo.Abp.DistributedLocking.Dapr` command.
+
+If you want to do it manually, install the [Volo.Abp.DistributedLocking.Dapr](https://www.nuget.org/packages/Volo.Abp.DistributedLocking.Dapr) NuGet package to your project and add `[DependsOn(typeof(AbpDistributedLockingDaprModule))]` to the [ABP module](../Module-Development-Basics.md) class inside your project.
+
+### Configuration
+
+You can use the `AbpDistributedLockDaprOptions` options class in the `ConfigureServices` method of [your module](../Module-Development-Basics.md) to configure the Dapr distributed lock:
+
+````csharp
+Configure(options =>
+{
+ options.StoreName = "mystore";
+});
+````
+
+The following options are available:
+
+* **`StoreName`** (required): The store name used by Dapr. Lock key names are scoped in the same store. That means different applications can acquire the same lock name in different stores. Use the same store name for the same resources you want to control access.
+* `Owner` (optional): The `owner` value used by `DaprClient.Lock` method. If you don't specify, ABP uses a random value, which is fine in general.
+* `DefaultExpirationTimeout` (optional): Default value of the time after which the lock gets expired. Default value: 2 minutes.
+
+### Usage
+
+You can inject and use the `IAbpDistributedLock` service, just like explained in the [Distributed Locking document](../Distributed-Locking.md).
+
+**Example:**
+
+````csharp
+public class MyService : ITransientDependency
+{
+ private readonly IAbpDistributedLock _distributedLock;
+
+ public MyService(IAbpDistributedLock distributedLock)
+ {
+ _distributedLock = distributedLock;
+ }
+
+ public async Task MyMethodAsync()
+ {
+ await using (var handle =
+ await _distributedLock.TryAcquireAsync("MyLockName"))
+ {
+ if (handle != null)
+ {
+ // your code that access the shared resource
+ }
+ }
+ }
+}
+````
+
+There are two points we should mention about the `TryAcquireAsync` method, as different from the ABP's standard usage:
+
+* `timeout` parameter currently not used (even if you specify it), because Dapr doesn't support to wait to obtain the lock.
+* Dapr uses expiration timeout system (that means the lock is automatically released after that timeout even if you don't release the lock by disposing the handler). However, ABP's `TryAcquireAsync` method has no such a parameter. Currently, you can set `AbpDistributedLockDaprOptions.DefaultExpirationTimeout` as a global value in your application.
+
+As mentioned first, Dapr's distributed lock feature currently in Alpha stage and its API is candidate to change. You should use it as is if you want, but be ready for the changes in the future. For now, we are recommending to use the [DistributedLock](https://github.com/madelson/DistributedLock) library as explained in ABP's [Distributed Locking document](../Distributed-Locking.md).
+
+## Security
+
+If you are using Dapr, most or all the incoming and outgoing requests in your application pass through Dapr. Dapr uses two kinds of API tokens to secure the communication between your application and Dapr.
+
+### Dapr API Token
+
+> This token is automatically set by default and generally you don't care about it.
+
+The [Enable API token authentication in Dapr](https://docs.dapr.io/operations/security/api-token/) document describes what the Dapr API token is and how it is configured. Please read that document if you want to enable it for your application.
+
+If you enabled the Dapr API token, you should send that token in every request to Dapr from your application. `AbpDaprOptions` defines a `DaprApiToken` property as a central point to configure the Dapr API token in your application.
+
+The default value of the `DaprApiToken` property is set from the `DAPR_API_TOKEN` environment variable and that environment variable is set by Dapr when it runs. So, most of the times, you don't need to configure `AbpDaprOptions.DaprApiToken` in your application. However, if you need to configure (or override) it, you can do in the `ConfigureServices` method of your module class as shown in the following code block:
+
+````csharp
+Configure(options =>
+{
+ options.DaprApiToken = "...";
+});
+````
+
+Or you can set it in your `appsettings.json` file:
+
+````json
+"Dapr": {
+ "DaprApiToken": "..."
+}
+````
+
+Once you set it, it is used when you inject `DaprClient` or use `IAbpDaprClientFactory`. If you need that value in your application, you can inject `IDaprApiTokenProvider` and use its `GetDaprApiToken()` method.
+
+### App API Token
+
+> Enabling App API token validation is strongly recommended. Otherwise, for example, any client can directly call your event subscription endpoint, and your application acts like an event has occurred (if there is no other security policy in your event subscription endpoint).
+
+The [Authenticate requests from Dapr using token authentication](https://docs.dapr.io/operations/security/app-api-token/) document describes what the App API token is and how it is configured. Please read that document if you want to enable it for your application.
+
+If you enabled the App API token, you can validate it to ensure that the request is coming from Dapr. ABP provides useful shortcuts to validate it.
+
+**Example: Validate the App API token in an event handling HTTP API**
+
+````csharp
+public class MyController : AbpController
+{
+ [HttpPost("/stock-changed")]
+ [Topic("pubsub", "StockChanged")]
+ public async Task TestRouteAsync(
+ [FromBody] StockCountChangedEto model)
+ {
+ // Validate the App API token!
+ HttpContext.ValidateDaprAppApiToken();
+
+ // Do something with the event
+ return Ok();
+ }
+}
+````
+
+`HttpContext.ValidateDaprAppApiToken()` is an extension method provided by the ABP Framework. It throws an `AbpAuthorizationException` if the token was missing or wrong in the HTTP header (the header name is `dapr-api-token`). You can also inject `IDaprAppApiTokenValidator` and use its methods to validate the token in any service (not only in a controller class).
+
+You can configure `AbpDaprOptions.AppApiToken` if you want to set (or override) the App API token value. The default value is set by the `APP_API_TOKEN` environment variable. You can change it in the `ConfigureServices` method of your module class as shown in the following code block:
+
+````csharp
+Configure(options =>
+{
+ options.AppApiToken = "...";
+});
+````
+
+Or you can set it in your `appsettings.json` file:
+
+````json
+"Dapr": {
+ "AppApiToken": "..."
+}
+````
+
+If you need that value in your application, you can inject `IDaprApiTokenProvider` and use its `GetAppApiToken()` method.
+
+## See Also
+
+* [Dapr for .NET Developers](https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/)
+* [The Official Dapr Documentation](https://docs.dapr.io/)
\ No newline at end of file
diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md
index 668eac6644..a0ad342c4c 100644
--- a/docs/en/Dependency-Injection.md
+++ b/docs/en/Dependency-Injection.md
@@ -244,25 +244,35 @@ One restriction of property injection is that you cannot use the dependency in y
Property injection is also useful when you want to design a base class that has some common services injected by default. If you're going to use constructor injection, all derived classes should also inject depended services into their own constructors which makes development harder. However, be very careful using property injection for non-optional services as it makes it harder to clearly see the requirements of a class.
-### Resolve Service from IServiceProvider
+#### DisablePropertyInjectionAttribute
-You may want to resolve a service directly from ``IServiceProvider``. In that case, you can inject IServiceProvider into your class and use ``GetService`` method as shown below:
+You can use `[DisablePropertyInjection]` attribute on class or properties to disable property injection for the whole class or some specific properties.
````C#
+[DisablePropertyInjection]
public class MyService : ITransientDependency
{
- private readonly IServiceProvider _serviceProvider;
+ public ITaxCalculator TaxCalculator { get; set; }
+}
- public MyService(IServiceProvider serviceProvider)
- {
- _serviceProvider = serviceProvider;
- }
+public class MyService : ITransientDependency
+{
+ public ILogger Logger { get; set; }
- public void DoSomething()
- {
- var taxCalculator = _serviceProvider.GetService();
- //...
- }
+ [DisablePropertyInjection]
+ public ITaxCalculator TaxCalculator { get; set; }
+}
+
+````
+
+### Resolve Service from IServiceProvider
+
+You may want to resolve a service directly from ``IServiceProvider``. In that case, you can inject IServiceProvider into your class and use ``GetService`` method as shown below:
+
+````C#
+public class MyService : ITransientDependency
+{
+ public ILogger Logger { get; set; }
}
````
diff --git a/docs/en/Deploy-azure-app-service.md b/docs/en/Deploy-azure-app-service.md
new file mode 100644
index 0000000000..9e0309f3b9
--- /dev/null
+++ b/docs/en/Deploy-azure-app-service.md
@@ -0,0 +1,452 @@
+# Deploying ABP Project to Azure App Service
+
+In this document, you will learn how to create and deploy your first ABP web app to [Azure App Service](https://docs.microsoft.com/en-us/azure/app-service/overview). The App Service supports various versions of .NET apps, and provides a highly scalable, self-patching web hosting service. ABP web apps are cross-platform and can be hosted on Linux, Windows or MacOS.
+
+****Prerequisites****
+
+- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/dotnet).
+- A GitHub account [Create an account for free](http://github.com/).
+
+
+
+## Creating a new ABP application
+
+Create a repository on [GitHub.com](https://github.com/) (keep all settings as default).
+
+Open the command prompt and clone the repository into a folder on your computer
+
+```bash
+git clone https://github.com/your-username/your-repository-name.git
+```
+
+Check your dotnet version. It should be at least 3.1.x
+
+```bash
+dotnet --version
+```
+
+Install or update the [ABP CLI](https://docs.abp.io/en/abp/latest/cli) with the following command:
+
+```bash
+dotnet tool install -g Volo.Abp.Cli || dotnet tool update -g Volo.Abp.Cli
+```
+
+Open the command prompt in the *GitHub repository folder* and create a new ABP Blazor solution with the command below:
+
+```bash
+abp new YourAppName -u blazor
+```
+
+
+
+## Running the application
+
+Open the command prompt in the *[YourAppName].DbMigrator* project and enter the command below to apply the database migrations:
+
+```bash
+dotnet run
+```
+
+Open the command prompt in the *[YourAppName].HttpApi.Host* project to run the API project:
+
+```bash
+dotnet run
+```
+
+Navigate to the *applicationUrl* specified in *the launchSettings.json* file of the *[YourAppName].HttpApi.Host project*. You should get the *Swagger window*
+
+Open the command prompt in the *[YourAppName].Blazor* folder and enter the command below to run the Blazor project:
+
+```bash
+dotnet run
+```
+
+Navigate to the *applicationUrl* specified in the *launchSettings.json* file of the *[YourAppName].Blazor* project and you should see the landing page.
+
+Stop both the *API* and the *Blazor* project by pressing **CTRL+C**
+
+
+
+## Committing to GitHub
+
+Before the GitHub commit, you have to delete the line "**/wwwroot/libs/*" at *.gitignore* file.
+
+
+
+Open the command prompt in the root folder of your project and *add, commit and push* all your changes to your GitHub repository:
+
+```bash
+git add .
+git commit -m initialcommit
+git push
+```
+
+
+
+## Configuring Azure database connection string
+
+Create a SQL database on Azure and change the connection string in all the *appsettings.json* files.
+
+* Login into [Azure Portal](https://portal.azure.com/)
+
+* Click **Create a resource**
+
+* Search for *SQL Database*
+
+* Click the **Create** button in the *SQL Database window*
+
+* Create a new resource group. Name it *rg[YourAppName]*
+
+* Enter *[YourAppName]Db* as database name
+
+* Create a new Server and name it *[yourappname]server*
+
+* Enter a serveradmin login and passwords. Click the **OK** button
+
+* Select your *Location*
+
+* Check *Allow Azure services to access server*
+
+* Click **Configure database**. Go to the *Basic* version and click the **Apply** button
+
+* Click the **Review + create** button. Click **Create**
+
+* Click **Go to resource** and click **SQL server** when the SQL Database is created
+
+* Click **Networking** under Security left side menu
+
+* Select **Selected networks** and click **Add your client IP$ address** at the Firewall rules
+
+* Select **Allow Azure and resources to access this seerver** and save
+
+* Go to your **SQL database**, click **Connection strings** and copy the connection string
+
+* Copy/paste the *appsettings.json* files of the *[YourAppName].HttpApi.Host* and the *[YourAppName].DbMigrator* project
+
+* Do not forget to replace {your_password} with the correct server password you entered in Azure SQL Database
+
+
+
+## Running DB Migrations
+
+Open the command prompt in the *[YourAppName].DbMigrator* project again and enter the command below to apply the database migrations:
+
+```bash
+dotnet run
+```
+
+Open the command prompt in the *[YourAppName].HttpApi.Host* project and enter the command below to check your API is working:
+
+```bash
+dotnet run
+```
+
+Stop the *[YourAppName].HttpApi.Host* by pressing CTRL+C.
+
+
+
+## Committing to GitHub
+
+Open the command prompt in the root folder of your project and add, commit and push all your changes to your GitHub repository
+
+```bash
+git add .
+git commit -m initialcommit
+git push
+```
+
+
+
+## Setting up the Build pipeline in AzureDevops and publish the Build Artifacts
+
+* Sign in Azure DevOps
+
+* Click **New organization** and follow the steps to create a new organisation. Name it [YourAppName]org
+
+* Enter [YourAppName]Proj as project name in the ***Create a project to get started*** window
+
+* Select **Public visibility** and click the **Create project** button
+
+* Click the **Pipelines** button to continue
+
+* Click the **Create Pipeline** button
+
+ Select GitHub in the Select your repository window
+
+
+
+* Enter the Connection name. *[YourAppName]GitHubConnection* and click **Authorize using OAuth**
+
+* Select your **GitHub** [YourAppName]repo and click Continue
+
+* Search for **ASP.NET** in the ***Select a template*** window
+
+
+
+* Select the ASP.NET Core template and click the **Apply** button
+
+* Add the below commands block as a first step in the pipeline
+
+ ```
+ - task: UseDotNet@2
+ inputs:
+ packageType: 'sdk'
+ version: '6.0.106'
+ ```
+
+
+
+* Select **Settings** on the second task(Nugetcommand@2) in the pipeline
+
+* Select **Feeds in my Nuget.config** and type **Nuget.config** in the text box
+
+
+
+* Add the below commands block to the end of the pipeline
+
+ ```
+ - task: PublishBuildArtifacts@1
+ displayName: 'Publish Artifact'
+ inputs:
+ PathtoPublish: '$(build.artifactstagingdirectory)'
+ ArtifactName: '$(Parameters.ArtifactName)'
+ condition: succeededOrFailed()
+ ```
+
+ 
+
+```
+# ASP.NET
+# Build and test ASP.NET projects.
+# Add steps that publish symbols, save build artifacts, deploy, and more:
+# https://docs.microsoft.com/azure/devops/pipelines/apps/aspnet/build-aspnet-4
+
+trigger:
+- main
+
+pool:
+ vmImage: 'windows-latest'
+
+variables:
+ solution: '**/*.sln'
+ buildPlatform: 'Any CPU'
+ buildConfiguration: 'Release'
+
+steps:
+- task: UseDotNet@2
+ inputs:
+ packageType: 'sdk'
+ version: '6.0.106'
+
+- task: NuGetToolInstaller@1
+
+- task: NuGetCommand@2
+ inputs:
+ command: 'restore'
+ restoreSolution: '$(solution)'
+ feedsToUse: 'config'
+ nugetConfigPath: 'NuGet.config'
+
+- task: VSBuild@1
+ inputs:
+ solution: '$(solution)'
+ msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
+ platform: '$(buildPlatform)'
+ configuration: '$(buildConfiguration)'
+
+- task: VSTest@2
+ inputs:
+ platform: '$(buildPlatform)'
+ configuration: '$(buildConfiguration)'
+
+- task: PublishBuildArtifacts@1
+ displayName: 'Publish Artifact'
+ inputs:
+ PathtoPublish: '$(build.artifactstagingdirectory)'
+ ArtifactName: '$(Parameters.ArtifactName)'
+ publishLocation: 'Container'
+ condition: succeededOrFailed()
+```
+
+* Click **Save & queue** in the top menu. Click **Save & queue** again and click **Save and run** to run the Build pipeline
+
+* When the Build pipeline has finished. Click **1 published; 1 consumed**
+
+
+
+## Creating a Web App in the Azure Portal to deploy [YourAppName].HttpApi.Host project
+
+* Search for Web App in the *Search the Marketplace* field
+
+* Click the **Create** button in the Web App window
+
+* Select rg[YourAppName] in the *Resource Group* dropdown
+
+* Enter [YourAppName]API in the *Name input* field
+
+* Select code, .NET Core 3.1 (LTS) and windows as *Operating System*
+
+* Enter [YourAppName]API in the *Name input* field
+
+* Select .NET Core 3.1 (LTS) in the *Runtime stack* dropdown
+
+* Select Windows as *Operating System*
+
+* Select the same *Region* as in the SQL server you created in Part 3
+
+
+
+* Click **Create new** in the Windows Plan. Name it [YourAppName]ApiWinPlan
+
+* Click **Change size** in Sku and size. Go to the Dev/Test Free F1 version and click the **Apply** button
+
+
+
+* Click the **Review + create** button. Click the **Create** button
+
+* Click **Go to resource** when the Web App has been created
+
+
+
+## Creating a release pipeline in the AzureDevops and deploy [YourAppName].HttpApi.Host project
+
+* Sign in into [Azure DevOps](https://azure.microsoft.com/en-us/services/devops/)
+
+* Click [YourAppName]Proj and click **Releases** in the *Pipelines* menu
+
+* Click the **New pipeline** button in the *No release pipelines found* window
+
+* Select *Azure App Service deployment* and click the **Apply** button
+
+
+
+* Enter *[YourAppName]staging* in the *Stage name* field in the *Stage* window. And close the window
+
+* Click **+ Add an artifact** in the *Pipeline* tab
+
+* Select the **Build** icon as *Source type* in the *Add an artifact* window
+
+* Select Build pipeline in the *Source (build pipeline)* dropdown and click the **Add** button
+
+
+
+* Click the **Continuous deployment trigger (thunderbolt icon)**
+
+* Set the toggle to **Enabled** in the the *Continuous deployment trigger* window
+
+* Click **+ Add** in *No filters added*. Select **Include** in the *Type* dropdown. Select your branch in the *Build branch* dropdown and close the window
+
+
+
+* Click **the little red circle with the exclamation mark** in the *Tasks* tab menu
+
+* Select your subscription in the *Azure subscription* dropdown.
+
+
+
+* Click **Authorize** and enter your credentials in the next screens
+
+* After Authorization, select the **[YourAppName]API** in the *App service name* dropdown
+
+* Click the **Deploy Azure App Service** task
+
+* Select **[YourAppName].HttpApi.Host.zip** in the *Package or folder* input field
+
+
+
+* Click the **Save** icon in the top menu and click **OK**
+
+* Click **Create release** in the top menu. Click **Create** to create a release
+
+* Click the *Pipeline* tab and wait until the Deployment succeeds
+
+
+
+* Open a browser and navigate to the URL of your Web App
+
+```
+https://[YourAppName]api.azurewebsites.net
+```
+
+
+
+
+
+## Creating a Web App in Azure Portal to deploy [YourAppName].Blazor project
+
+* Login into [Azure Portal](https://portal.azure.com/)
+
+* Click **Create a resource**
+
+* Search for *Web App* in the *Search the Marketplace* field
+
+* Click the **Create** button in the *Web App* window
+
+* Select *rg[YourAppName]* in the *Resource Group* dropdown
+
+* Enter *[YourAppName]Blazor* in the *Name* input field
+
+* Select *.NET Core 3.1 (LTS)* in the *Runtime stack* dropdown
+
+* Select *Windows* as *Operating System*
+
+* Select the same region as the SQL server you created in Part 3
+
+* Select the [YourAppName]ApiWinPlan in the *Windows Plan* dropdown
+
+
+
+* Click the **Review + create** button. Click **Create** button
+
+* Click **Go to resource** when the Web App has been created
+
+* Copy the URL of the Blazor Web App for later use
+
+```
+https://[YourAppName]blazor.azurewebsites.net
+```
+
+
+## Changing the Web App configuration for the Azure App Service
+
+Copy the URL of the Api Host and Blazor Web App. Change appsettings.json files in the Web App as follows images.
+
+
+
+
+
+
+
+
+
+## Adding an extra Stage in the Release pipeline in the AzureDevops to deploy [YourAppName].Blazor project
+
+* Go to the *Release* pipeline in [Azure DevOps](https://azure.microsoft.com/en-us/services/devops/) and click **Edit**
+
+* Click the **+ Add** link and add a **New Stage**
+
+
+
+* Select *Azure App Service deployment* and click the **Apply** button
+
+* Enter *BlazorDeployment* in the *Stage name* input field and close the *Stage* window
+
+* Click the **little red circle with the exclamation mark** in the BlazorDeployment stage
+
+* Select your subscription in the *Azure subscription* dropdown
+
+* Select your Blazor Web App in the *App service name* dropdown
+
+* Click the **Deploy Azure App Service task**
+
+* Select *[YourAppName].Blazor.zip* in the *Package or folder* input field
+
+
+
+* Click **Save** in the top menu and click the **OK** button after
+
+* Click **Create release** in the top menu and click the **Create** button
+
+
+
+
diff --git a/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md b/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md
index 251a84510b..4823cbaae9 100644
--- a/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md
+++ b/docs/en/Distributed-Event-Bus-RabbitMQ-Integration.md
@@ -141,13 +141,14 @@ Configure(options =>
});
````
-**Example: Configure the client and exchange names**
+**Example: Configure the client, exchange names and prefetchCount**
````csharp
Configure(options =>
{
options.ClientName = "TestApp1";
options.ExchangeName = "TestMessages";
+ options.PrefetchCount = 1;
});
````
diff --git a/docs/en/Distributed-Locking.md b/docs/en/Distributed-Locking.md
index d29b60ad04..a1e653a6a6 100644
--- a/docs/en/Distributed-Locking.md
+++ b/docs/en/Distributed-Locking.md
@@ -101,6 +101,25 @@ namespace AbpDemo
* `timeout` (`TimeSpan`): A timeout value to wait to obtain the lock. Default value is `TimeSpan.Zero`, which means it doesn't wait if the lock is already owned by another application.
* `cancellationToken`: A cancellation token that can be triggered later to cancel the operation.
+### Configuration
+
+#### AbpDistributedLockOptions
+
+`AbpDistributedLockOptions` is the main options class to configure the distributed locking.
+
+**Example: Set the distributed lock key prefix for the application**
+
+Configure(options =>
+{
+ options.KeyPrefix = "MyApp1";
+});
+
+> Write that code inside the `ConfigureServices` method of your [module class](Module-Development-Basics.md).
+
+##### Available Options
+
+* KeyPrefix (string, default: null): Specify the lock name prefix.
+
### Using DistributedLock Library's API
ABP's `IAbpDistributedLock` service is very limited and mainly designed to be internally used by the ABP Framework. For your own applications, you can use the DistributedLock library's own API. See its [own documentation](https://github.com/madelson/DistributedLock) for details.
diff --git a/docs/en/Entities.md b/docs/en/Entities.md
index c57af27457..ef8f52a04f 100644
--- a/docs/en/Entities.md
+++ b/docs/en/Entities.md
@@ -112,6 +112,21 @@ For the example above, the composite key is composed of `UserId` and `RoleId`. F
> Also note that Entities with Composite Primary Keys cannot utilize the `IRepository` interface since it requires a single Id property. However, you can always use `IRepository`. See [repositories documentation](Repositories.md) for more.
+### EntityEquals
+
+`Entity.EntityEquals(...)` method is used to check if two Entity Objects are equals.
+
+Example:
+
+```csharp
+Book book1 = ...
+Book book2 = ...
+
+if (book1.EntityEquals(book2)) //Check equality
+{
+ ...
+}
+```
## AggregateRoot Class
diff --git a/docs/en/Multi-Tenancy.md b/docs/en/Multi-Tenancy.md
index 569bfeb4ca..7dac3762aa 100644
--- a/docs/en/Multi-Tenancy.md
+++ b/docs/en/Multi-Tenancy.md
@@ -222,7 +222,6 @@ The following resolvers are provided and configured by default;
* `CurrentUserTenantResolveContributor`: Gets the tenant id from claims of the current user, if the current user has logged in. **This should always be the first contributor for the security**.
* `QueryStringTenantResolveContributor`: Tries to find current tenant id from query string parameters. The parameter name is `__tenant` by default.
-* `FormTenantResolveContributor`:Tries to find current tenant id from form parameters. The parameter name is `__tenant` by default.
* `RouteTenantResolveContributor`: Tries to find current tenant id from route (URL path). The variable name is `__tenant` by default. If you defined a route with this variable, then it can determine the current tenant from the route.
* `HeaderTenantResolveContributor`: Tries to find current tenant id from HTTP headers. The header name is `__tenant` by default.
* `CookieTenantResolveContributor`: Tries to find current tenant id from cookie values. The cookie name is `__tenant` by default.
diff --git a/docs/en/Themes/LeptonXLite/Blazor.md b/docs/en/Themes/LeptonXLite/Blazor.md
index 636c33ef28..0e32aa9825 100644
--- a/docs/en/Themes/LeptonXLite/Blazor.md
+++ b/docs/en/Themes/LeptonXLite/Blazor.md
@@ -122,6 +122,37 @@ builder.RootComponents.Add("#ApplicationContainer");
## Customization
+### Layout
+
+* Create a razor page, like `MyMainLayout.razor`, in your blazor application as shown below:
+
+```html
+@using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite;
+@using Volo.Abp.DependencyInjection
+
+@inherits MainLayout
+@attribute [ExposeServices(typeof(MainLayout))]
+@attribute [Dependency(ReplaceServices = true)]
+
+@Name
+```
+
+* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMainLayout.razor.cs`, in your blazor application as shown below:
+
+```csharp
+[ExposeServices(typeof(MainLayout))]
+[Dependency(ReplaceServices = true)
+namespace LeptonXLite.DemoApp.Blazor.MyComponents
+{
+ public partial class MyMainLayout
+ {
+ public string Name = "My Main Layout";
+ }
+}
+```
+
+> Don't forget to remove the repeated attributes from the razor page!
+
### Toolbars
LeptonX Lite includes separeted toolbars for desktop & mobile. You can manage toolbars independently. Toolbar names can be accessible in the **LeptonXLiteToolbars** class.
@@ -150,3 +181,299 @@ public async Task ConfigureToolbarAsync(IToolbarConfigurationContext context)
> _You can visit the [Toolbars Documentation](https://docs.abp.io/en/abp/latest/UI/Blazor/Toolbars) for better understanding._
{{end}}
+
+## Components
+
+LeptonX Blazor is built on the basis of components. You can use the components in your application as you wish, or you can customize the components by overriding them. If you want to override a component please follow the steps.
+
+### Branding Component
+
+The **brand component** is a simple component that can be used to display your brand. It contains a **logo** and a **company name**.
+
+
+
+#### How to Override Branding Component
+
+* Create a razor page, like `MyBrandingComponent.razor`, in your blazor application as shown below:
+
+```html
+@using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite;
+@using Volo.Abp.DependencyInjection
+
+@inherits Branding
+@attribute [ExposeServices(typeof(Branding))]
+@attribute [Dependency(ReplaceServices = true)]
+
+@Name
+```
+
+* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyBrandingComponent.razor.cs`, in your blazor application as shown below:
+
+```csharp
+namespace LeptonXLite.DemoApp.Blazor.MyComponents
+{
+ public partial class MyBrandingComponent
+ {
+ public string Name = "My Branding Component";
+ }
+}
+```
+
+### Breadcrumb Component
+
+On websites that have a lot of pages, **breadcrumb navigation** can greatly **enhance the way users find their way** around. In terms of **usability**, breadcrumbs reduce the number of actions a website **visitor** needs to take in order to get to a **higher-level page**, and they **improve** the **findability** of **website sections** and **pages**.
+
+
+
+#### How to Override the BreadCrumb Component
+
+* Create a razor page, like `MyBreadcrumbsComponent.razor`, in your blazor application as shown below:
+
+```html
+@using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite;
+@using Volo.Abp.DependencyInjection
+
+@inherits Breadcrumbs
+@attribute [ExposeServices(typeof(Breadcrumbs))]
+@attribute [Dependency(ReplaceServices = true)]
+
+@Name
+```
+
+* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyBreadcrumbsComponent.razor.cs`, in your blazor application as shown below:
+```csharp
+using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite;
+using Volo.Abp.DependencyInjection;
+
+namespace LeptonXLite.DemoApp.Blazor.MyComponents
+{
+ [ExposeServices(typeof(Breadcrumbs))]
+ [Dependency(ReplaceServices = true)]
+ public partial class MyBreadcrumbsComponent
+ {
+ public string Name = "My Breadcrumbs Component";
+ }
+}
+```
+
+### Main Menu Component
+
+Sidebar menus have been used as **a directory for Related Pages** for a **Service** offering, **Navigation** items for a **specific service** or topic and even just as **Links** the user may be interested in.
+
+
+
+#### How to Override the Main Menu Component
+
+* Create a razor page, like `MyMainMenuComponent.razor`, in your blazor application as shown below:
+
+```html
+@using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite.Navigation;
+@using Volo.Abp.DependencyInjection
+
+@inherits MainMenu
+@attribute [ExposeServices(typeof(MainMenu))]
+@attribute [Dependency(ReplaceServices = true)]
+
+@Name
+```
+
+* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMainMenu.razor.cs`, in your blazor application as shown below:
+```csharp
+using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite.Navigation;
+using Volo.Abp.DependencyInjection;
+
+namespace LeptonXLite.DemoApp.Blazor.MyComponents
+{
+ [ExposeServices(typeof(MainMenu))]
+ [Dependency(ReplaceServices = true)]
+ public partial class MainMenu
+ {
+ public string Name = "My Main Menu Component";
+ }
+}
+```
+
+> The **main menu** renders the menu items **dynamically**. The **menu item** is a **razor component** named `MainMenuItem.razor.cs` in the same namespace with **main menu** and you can **override it** like the main menu.
+
+### Toolbar Items Component
+
+Toolbar items are used to add **extra functionality to the toolbar**. The toolbar is a **horizontal bar** that **contains** a group of **toolbar items**.
+
+#### How to Override the Toolbar Items Component
+
+* Create a razor page, like `MyToolbarItemsComponent.razor`, in your blazor application as shown below:
+
+```html
+@using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite;
+@using Volo.Abp.DependencyInjection
+
+@inherits ToolbarItemsComponent
+@attribute [ExposeServices(typeof(ToolbarItemsComponent))]
+@attribute [Dependency(ReplaceServices = true)]
+
+@Name
+```
+
+* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyToolbarItemsComponent.razor.cs`, in your blazor application as shown below:
+```csharp
+using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite;
+using Volo.Abp.DependencyInjection;
+
+namespace LeptonXLite.DemoApp.Blazor.MyComponents
+{
+ [ExposeServices(typeof(ToolbarItemsComponent))]
+ [Dependency(ReplaceServices = true)]
+ public partial class MyToolbarItemsComponent
+ {
+ public string Name = "My Toolbar Items Component";
+ }
+}
+```
+
+### Language Switch Component
+
+Think about a **multi-lingual** website and the first thing that could **hit your mind** is **the language switch component**. A **navigation bar** is a **great place** to **embed a language switch**. By embedding the language switch in the navigation bar of your website, you would **make it simpler** for users to **find it** and **easily** switch the **language** **without trying to locate it across the website.**
+
+
+
+#### How to Override the Language Switch Component
+
+* Create a razor page, like `MyLanguageSwitchComponent.razor`, in your blazor application as shown below:
+
+```html
+@using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
+@using Volo.Abp.DependencyInjection
+
+@inherits LanguageSwitchComponent
+@attribute [ExposeServices(typeof(LanguageSwitchComponent))]
+@attribute [Dependency(ReplaceServices = true)]
+
+@Name
+```
+
+* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyLanguageSwitchComponent.razor.cs`, in your blazor application as shown below:
+```csharp
+using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
+using Volo.Abp.DependencyInjection;
+
+namespace LeptonXLite.DemoApp.Blazor.MyComponents
+{
+ [ExposeServices(typeof(LanguageSwitchComponent))]
+ [Dependency(ReplaceServices = true)]
+ public partial class MyLanguageSwitchComponent
+ {
+ public string Name = "My Language Switch Component";
+ }
+}
+```
+
+### Mobile Language Switch Component
+
+The **mobile** **language switch component** is used to switch the language of the website **on mobile devices**. The mobile language switch component is a **dropdown menu** that **contains all the languages** of the website.
+
+
+
+#### How to Override the Mobile Language Switch Component
+
+* Create a razor page, like `MyMobilLanguageSwitchComponent.razor`, in your blazor application as shown below:
+
+```html
+@using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
+@using Volo.Abp.DependencyInjection
+
+@inherits MobilLanguageSwitchComponent
+@attribute [ExposeServices(typeof(MobilLanguageSwitchComponent))]
+@attribute [Dependency(ReplaceServices = true)]
+
+@Name
+```
+
+* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMobilLanguageSwitchComponent.razor.cs`, in your blazor application as shown below:
+```csharp
+using Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
+using Volo.Abp.DependencyInjection;
+
+namespace LeptonXLite.DemoApp.Blazor.MyComponents
+{
+ [ExposeServices(typeof(MobilLanguageSwitchComponent))]
+ [Dependency(ReplaceServices = true)]
+ public partial class MyMobilLanguageSwitchComponent
+ {
+ public string Name = "My Mobile Language Switch Component";
+ }
+}
+```
+
+### User Menu Component
+
+The **User Menu** is the **menu** that **drops down** when you **click your name** or **profile picture** in the **upper right corner** of your page (**in the toolbar**). It drops down options such as **Settings**, **Logout**, etc.
+
+
+
+#### How to Override the User Menu Component
+
+* Create a razor page, like `MyUserMenuComponent.razor`, in your blazor application as shown below:
+
+```html
+@using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
+@using Volo.Abp.DependencyInjection
+
+@inherits MobilLanguageSwitchComponent
+@attribute [ExposeServices(typeof(MobilLanguageSwitchComponent))]
+@attribute [Dependency(ReplaceServices = true)]
+
+@Name
+```
+
+* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyUserMenuComponent.razor.cs`, in your blazor application as shown below:
+```csharp
+using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
+using Volo.Abp.DependencyInjection;
+
+namespace LeptonXLite.DemoApp.Blazor.MyComponents
+{
+ [ExposeServices(typeof(UserMenuComponent))]
+ [Dependency(ReplaceServices = true)]
+ public partial class MyUserMenuComponent
+ {
+ public string Name = "My User Menu Component";
+ }
+}
+```
+
+### Mobile User Menu Component
+
+The **mobile user menu component** is used to display the **user menu on mobile devices**. The mobile user menu component is a **dropdown menu** that contains all the **options** of the **user menu**.
+
+
+
+#### How to override the Mobile User Menu Component
+
+* Create a razor page, like `MyMobileUserMenuComponent.razor`, in your blazor application as shown below:
+
+```html
+@using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
+@using Volo.Abp.DependencyInjection
+
+@inherits MobilUserMenuComponent
+@attribute [ExposeServices(typeof(MobilUserMenuComponent))]
+@attribute [Dependency(ReplaceServices = true)]
+
+@Name
+```
+
+* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMobileUserMenuComponent.razor.cs`, in your blazor application as shown below:
+```csharp
+using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Themes.LeptonXLite.Toolbar;
+using Volo.Abp.DependencyInjection;
+
+namespace LeptonXLite.DemoApp.Blazor.MyComponents
+{
+ [ExposeServices(typeof(MobileUserMenuComponent))]
+ [Dependency(ReplaceServices = true)]
+ public partial class MyMobileUserMenuComponent
+ {
+ public string Name = "My Mobile User Menu Component";
+ }
+}
+```
diff --git a/docs/en/UI/Blazor/Layout-Hooks.md b/docs/en/UI/Blazor/Layout-Hooks.md
new file mode 100644
index 0000000000..1118e02d37
--- /dev/null
+++ b/docs/en/UI/Blazor/Layout-Hooks.md
@@ -0,0 +1,125 @@
+# Blazor UI: Layout Hooks
+
+ABP Framework theming system places the page layout into the [theme](Theming.md) NuGet packages. That means the final application doesn't include a layout, so you can't directly change the layout code to customize it.
+
+> If you create a Blazor WASM project, the `index.html` file will be included within the template. You can also customize it to your needs.
+
+You can copy the theme code into your solution. In this case, you are completely free to customize it. However, then you won't be able to get automatic updates of the theme (by upgrading the theme NuGet package).
+
+The **Layout Hook System** allows you to **add code** at some specific parts of the layout. All layouts of all themes should implement these hooks. Finally, you can add a **razor component** into a hook point.
+
+## Example: Add a Simple Announcement Alert
+
+Assume that you need to add a simple banner to the layout (that will be available for all the pages) to make an announcement about your new product. First, **create a razor component** in your project:
+
+
+
+**AnnouncementComponent.razor.cs**
+
+```csharp
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Components;
+using Microsoft.JSInterop;
+
+namespace Acme.BookStore.Blazor.Components;
+
+public partial class AnnouncementComponent : ComponentBase
+{
+ private const string AnnouncementLocalStorageKey = "product-announcement-status";
+
+ [Inject]
+ public IJSRuntime JsRuntime { get; set; }
+
+ public bool ShowBanner { get; set; }
+
+ protected override async Task OnInitializedAsync()
+ {
+ ShowBanner = await ShowAnnouncementBannerAsync();
+ }
+
+ private async Task ShowAnnouncementBannerAsync()
+ {
+ var announcementLocalStorageValue = await JsRuntime.InvokeAsync("localStorage.getItem", AnnouncementLocalStorageKey);
+
+ return announcementLocalStorageValue != null &&
+ bool.TryParse(announcementLocalStorageValue, out var showAnnouncementBanner) && showAnnouncementBanner;
+ }
+
+ private async Task HideAnnouncementBannerAsync()
+ {
+ await JsRuntime.InvokeVoidAsync("localStorage.setItem", AnnouncementLocalStorageKey, true);
+ ShowBanner = false;
+ StateHasChanged();
+ }
+}
+```
+
+**AnnouncementComponent.razor**
+
+```html
+@if(ShowBanner)
+{
+