diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json
index 82ffbf0f4c..442384bd0a 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json
@@ -32,6 +32,7 @@
"SeeDocuments": "See Documents",
"Samples": "Samples",
"FreeDDDBook": "Free DDD E-book",
- "New": "New"
+ "New": "New",
+ "Volo.AbpIo.Domain:020005": "License extend year can not be lower than {MinExtendLicenseYear} year and greater than {MaxExtendLicenseYear} years "
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
index 646c2f9648..b9c8d23563 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
@@ -34,6 +34,7 @@
"Framework": "Framework",
"Support": "Support",
"FreeDDDBook": "Free DDD E-book",
- "New": "New"
+ "New": "New",
+ "Volo.AbpIo.Domain:020005": "License extend year can not be lower than {MinExtendLicenseYear} year and greater than {MaxExtendLicenseYear} years "
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hi.json
index cd1ec4491d..5096d3cbe7 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hi.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hi.json
@@ -11,8 +11,8 @@
"Volo.AbpIo.Domain:010011": "व्यक्तिगत लाइसेंस में 1 से अधिक डेवलपर नहीं हो सकते हैं!",
"Volo.AbpIo.Domain:010012": "लाइसेंस की अवधि समाप्त होने के एक महीने बाद तक लाइसेंस नहीं बढ़ाया जा सकता है!",
"Volo.AbpIo.Domain:020001": "इस NPM पैकेज को नहीं हटाया जा सका क्योंकि \"{NugetPackages}\" नुगेट पैकेज इस पैकेज पर निर्भर हैं।",
- "Volo.AbpIo.Domain:020002": "यह NPM पैकेज नहीं हटा सका क्योंकि \"{मॉड्यूल}\" मॉड्यूल इस पैकेज का उपयोग कर रहे हैं।",
- "Volo.AbpIo.Domain:020003": "इस NPM पैकेज को नहीं हटाया जा सका क्योंकि \"{मॉड्यूल}\" मॉड्यूल इस पैकेज का उपयोग कर रहे हैं और \"{NugetPackages}\" नुगेट पैकेज इस पैकेज पर निर्भर हैं।",
+ "Volo.AbpIo.Domain:020002": "यह NPM पैकेज नहीं हटा सका क्योंकि \"{Modules}\" मॉड्यूल इस पैकेज का उपयोग कर रहे हैं।",
+ "Volo.AbpIo.Domain:020003": "इस NPM पैकेज को नहीं हटाया जा सका क्योंकि \"{Modules}\" मॉड्यूल इस पैकेज का उपयोग कर रहे हैं और \"{NugetPackages}\" नुगेट पैकेज इस पैकेज पर निर्भर हैं।",
"Volo.AbpIo.Domain:020004": "इस Nuget पैकेज को हटाया नहीं जा सका क्योंकि \"{Modules}\" मॉड्यूल इस पैकेज का उपयोग कर रहे हैं।",
"WantToLearn?": "सीखना चाहते है?",
"ReadyToGetStarted?": "आरंभ करने के लिए तैयार हैं?",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json
index 2f932f299b..04c114a6c2 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json
@@ -28,6 +28,7 @@
"Commercial": "Ticari",
"SeeDocuments": "Dokümanlara Göz Atın",
"FreeDDDBook": "Ücretsiz DDD Kitabı",
- "New": "Yeni"
+ "New": "Yeni",
+ "Volo.AbpIo.Domain:020005": "Lisans uzatma yılı {MinExtendLicenseYear} yıldan az {MaxExtendLicenseYear} yıldan fazla olamaz."
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json
index b2da832b2a..317ace31b5 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json
@@ -151,7 +151,7 @@
"SeeAllModules": "Katso kaikki moduulit",
"ABPCLIExplanation": "ABP CLI (Command Line Interface) on komentorivityökalu joidenkin yleisten toimintojen suorittamiseen ABP-pohjaisiin ratkaisuihin.",
"ABPSuiteEasilyCURD": "ABP Suite on työkalu, jonka avulla voit helposti luoda CRUD-sivuja",
- "WeAreHereToHelp": " Apua olemme täällä",
+ "WeAreHereToHelp": "Apua olemme täällä",
"BrowseOrAskQuestion": "Voit selata ohjeaiheitamme tai etsiä usein kysyttyjä kysymyksiä tai voit esittää meille kysymyksiä yhteydenottolomakkeella .",
"SearchQuestionPlaceholder": "Hae usein kysyttyjä kysymyksiä",
"WhatIsTheABPCommercial": "Mikä on ABP-kauppa?",
@@ -177,7 +177,7 @@
"ChangingLicenseType": "Voinko muuttaa lisenssityyppiäni tulevaisuudessa?",
"ChangingLicenseTypeExplanation": "Voit aina lisätä uusia kehittäjiä samaan lisenssityyppiin. Katso myös \"Kuinka monta kehittäjää voi työskennellä ABP Commercialilla?\". Voit myös päivittää korkeampaan lisenssiin maksamalla lasketun hintaeron. Kun päivität korkeampaan lisenssisuunnitelmaan, saat uuden suunnitelman edut, mutta lisenssin päivitys ei muuta lisenssin voimassaolon päättymispäivää.",
"LicenseExtendUpgradeDiff": "Mitä eroa on lisenssin laajennuksella ja päivityksellä?",
- "LicenseExtendUpgradeDiffExplanation": " Laajentaminen: Laajentamalla / uusimalla käyttöoikeutta saat jatkossakin ensiluokkaista tukea ja saat tärkeitä päivityksiä moduuleille ja teemoille. Lisäksi voit jatkaa uusien projektien luomista. Ja voit silti käyttää ABP Suitea, joka vauhdittaa kehitystäsi.
Päivittäminen: Päivittämällä lisenssisi edistyt korkeampaan lisenssisuunnitelmaan, jonka avulla voit saada lisäetuja . Katso lisenssisuunnitelmien väliset erot lisenssien vertailutaulukosta . Toisaalta, kun päivität, lisenssin vanhentumispäivä ei muutu! Strong > Lisenssin päättymispäivän jatkamiseksi sinun on jatkettava käyttöoikeutta.",
+ "LicenseExtendUpgradeDiffExplanation": " Extension: en prolongeant/renouvelant votre licence, vous continuerez à bénéficier d'une assistance premium et à des mises à jour majeures pour les modules et les thèmes. De plus, vous pourrez continuer à créer de nouveaux projets. Et vous pourrez toujours utiliser ABP Suite, ce qui accélère votre développement.
Mise à niveau: En mettant à jour votre licence, vous passerez à un plan de licence supérieur qui vous permettra d’obtenir des avantages supplémentaires . Consultez le tableau de comparaison des licences pour vérifier les différences entre les plans de licence. En revanche, lors de la mise à niveau, la date d'expiration de votre licence ne changera pas! Pour prolonger la date de fin de votre licence, vous devez prolonger votre licence.",
"LicenseRenewalCost": "Mitkä ovat lisenssin uusimiskustannukset vuoden kuluttua?",
"LicenseRenewalCostExplanation": "Kaikkien ABP Commercial perpetual -lisenssien uusimis- (laajennus) hinta on {0} lisenssiluettelohinnasta. Tavallisen tiimilisenssin uusimishinta on $ {1}, tavallinen yrityslisenssi on $ {2} ja tavallinen yrityslisenssi on $ {3}. Jos olet jo asiakas, kirjaudu tilillesi ja tarkista käytettävissä oleva uusimishinta.",
"HowDoIRenewMyLicense": "Kuinka uusin lisenssin?",
@@ -230,7 +230,7 @@
"HowCanIRefundVatExplanation2": "Kirjaudu sisään 2Tarkista -tiliisi.",
"HowCanIRefundVatExplanation3": "Etsi sopiva tilaus ja paina \"Hyvitä myöhässä oleva alv\" (kirjoita ALV-tunnuksesi)",
"HowCanIGetMyInvoice": "Kuinka saan laskuni?",
- "HowCanIGetMyInvoiceExplanation": "Lisenssin ostamiseen on 2 maksuyhdyskäytävää: PayU ja 2Checkout. Jos ostat lisenssin 2Checkout gatewayn kautta, se lähettää PDF-laskun sähköpostiosoitteeseesi, katso 2Tarkista laskutus. Jos ostat PayU-yhdyskäytävän kautta tai pankkisiirrolla, valmistelemme ja lähetämme laskusi. Voit pyytää laskua organisaation hallintasivulta ",
+ "HowCanIGetMyInvoiceExplanation": "Lisenssin ostamiseen on 2 maksuyhdyskäytävää: PayU ja 2Checkout. Jos ostat lisenssin 2Checkout gatewayn kautta, se lähettää PDF-laskun sähköpostiosoitteeseesi, katso 2Tarkista laskutus. Jos ostat PayU-yhdyskäytävän kautta tai pankkisiirrolla, valmistelemme ja lähetämme laskusi. Voit pyytää laskua organisaation hallintasivulta ",
"Forum": "Foorumi",
"SupportExplanation": "ABP Commercial -lisenssit tarjoavat ensiluokkaisen foorumituen ABP-kehyksen asiantuntijoista koostuvalle tiimille.",
"PrivateTicket": "Yksityinen lippu",
@@ -240,7 +240,7 @@
"FastEasy": "Nopea ja helppo",
"AbpSuiteExplanation3": "ABP Suiten avulla voit luoda helposti CRUD-sivuja. Sinun tarvitsee vain määritellä entiteetti ja sen ominaisuudet, antaa loput ABP Suiten puolestasi! ABP Suite luo kaikki tarvittavat koodit CRUD-sivullesi muutamassa sekunnissa. Se tukee Angular-, MVC- ja Blazor-käyttöliittymiä.",
"RichOptions": "Monipuoliset vaihtoehdot",
- "AbpSuiteExplanation4": "ABP Suite tukee useita käyttöliittymävaihtoehtoja, kuten Razor Pages ja Kulma .Se tukee myös useita tietokantoja, kuten MongoDB ja kaikkia EntityFramework Core <: n tukemia tietokantoja. / strong> (MS SQL Server, Oracle, MySql, PostgreSQL ja lisää ).",
+ "AbpSuiteExplanation4": "ABP Suite supports multiple UI options like Razor Pages and Angular.It also supports multiple databases like MongoDB and all databases supported by EntityFramework Core (MS SQL Server, Oracle, MySql, PostgreSQL and more).",
"AbpSuiteExplanation5": "Hyvä asia on, että sinun ei tarvitse huolehtia näistä vaihtoehdoista. ABP Suite ymmärtää projektisi tyypin ja luo koodin projektillesi ja sijoittaa luodun koodin oikeaan paikkaan projektissasi.",
"SourceCode": "Lähdekoodi",
"AbpSuiteExplanation6": "ABP Suite luo lähdekoodin sinulle! Se ei luo taikuustiedostoja verkkosivun luomiseksi. ABP Suite luo lähdekoodin Entity, Repository, Application Service, Code First Migration, JavaScript / TypeScript ja CSHTML / HTML sekä tarvittavat liitännät. ABP Suite tuottaa koodin myös ohjelmistokehityksen parhaiden käytäntöjen mukaisesti, joten sinun ei tarvitse huolehtia luodun koodin laadusta.",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json
index c5f9f1db6c..90d1fcf0c9 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json
@@ -177,7 +177,7 @@
"ChangingLicenseType": "Puis-je changer mon type de licence à l'avenir?",
"ChangingLicenseTypeExplanation": "Vous pouvez toujours ajouter de nouveaux développeurs dans votre même type de licence. Voir aussi \"Combien de développeurs peuvent travailler sur l'ABP Commercial?\". Vous pouvez également passer à une licence supérieure en payant la différence de prix calculée. Lorsque vous passez à un plan de licence supérieur, vous bénéficiez des avantages du nouveau plan, mais la mise à niveau de la licence ne modifie pas la date d'expiration de la licence.",
"LicenseExtendUpgradeDiff": "Quelle est la différence entre l'extension de licence et la mise à niveau?",
- "LicenseExtendUpgradeDiffExplanation": " Extension: en prolongeant / renouvelant votre licence, vous continuerez à bénéficier d'une assistance premium et à des mises à jour majeures pour les modules et les thèmes. De plus, vous pourrez continuer à créer de nouveaux projets. Et vous pourrez toujours utiliser ABP Suite, ce qui accélère votre développement.
Mise à niveau: En mettant à jour votre licence, vous passerez à un plan de licence supérieur qui vous permettra d’obtenir des avantages supplémentaires . Consultez le tableau de comparaison des licences pour vérifier les différences entre les plans de licence. En revanche, lors de la mise à niveau, la date d'expiration de votre licence ne changera pas! Strong > Pour prolonger la date de fin de votre licence, vous devez prolonger votre licence.",
+ "LicenseExtendUpgradeDiffExplanation": " Extension: en prolongeant/renouvelant votre licence, vous continuerez à bénéficier d'une assistance premium et à des mises à jour majeures pour les modules et les thèmes. De plus, vous pourrez continuer à créer de nouveaux projets. Et vous pourrez toujours utiliser ABP Suite, ce qui accélère votre développement.
Mise à niveau: En mettant à jour votre licence, vous passerez à un plan de licence supérieur qui vous permettra d’obtenir des avantages supplémentaires . Consultez le tableau de comparaison des licences pour vérifier les différences entre les plans de licence. En revanche, lors de la mise à niveau, la date d'expiration de votre licence ne changera pas! Pour prolonger la date de fin de votre licence, vous devez prolonger votre licence.",
"LicenseRenewalCost": "Quel est le coût du renouvellement de la licence après 1 an?",
"LicenseRenewalCostExplanation": "Le taux de renouvellement (extension) de toutes les licences perpétuelles ABP Commercial correspond à {0} du prix catalogue de la licence. Le prix de renouvellement de la licence d'équipe standard est de {1} $, la licence professionnelle standard de {2} $ et la licence d'entreprise standard de {3} $. Si vous êtes déjà client, connectez-vous à votre compte pour consulter les tarifs de renouvellement disponibles.",
"HowDoIRenewMyLicense": "Comment renouveler ma licence?",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json
index 54216f7719..dd7e117541 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json
@@ -42,7 +42,7 @@
"NotOrganizationMember": "आप किसी संगठन के सदस्य नहीं हैं।",
"UnsubscribeLicenseExpirationEmailSuccessTitle": "सफलतापूर्वक सदस्यता समाप्त कर दी गई",
"UnsubscribeLicenseExpirationEmailSuccessMessage": "अब आपको लाइसेंस समाप्ति तिथि अनुस्मारक ईमेल प्राप्त नहीं होंगे।",
- "IndexPageHeroSection": " एक पूर्ण span> वेब विकास मंच span> अंतर्निहित
ढांचा span>",
+ "IndexPageHeroSection": "एक पूर्ण वेब डेवलपमेंट प्लेटफॉर्मबिल्ट-ऑन
Framework",
"AbpCommercialShortDescription": "एबीपी कमर्शियल प्री-बिल्ट एप्लिकेशन मॉड्यूल, रैपिड एप्लिकेशन डेवलपमेंट टूलिंग, पेशेवर यूआई थीम, प्रीमियम सपोर्ट आदि प्रदान करता है।",
"LiveDemo": "लाइव डेमो",
"GetLicence": "एक लाइसेंस प्राप्त करें",
@@ -135,7 +135,7 @@
"GoHome": "घर जाओ",
"CreateLiveDemo": "लाइव डेमो बनाएँ",
"RegisterToTheNewsletter": "ABP.IO के बारे में जानकारी प्राप्त करने के लिए न्यूज़लेटर के लिए रजिस्टर करें, जिसमें नई रिलीज़ आदि शामिल हैं।",
- "EnterYourEmailOrLogin": "अपने मौजूदा खाते का उपयोग करके अपना डेमो बनाने के लिए अपना ई-मेल पता दर्ज करें या अपना प्रदर्शन लॉगिन करें।",
+ "EnterYourEmailOrLogin": "अपना डेमो बनाने के लिए अपना ई-मेल पता दर्ज करें या अपने मौजूदा खाते का उपयोग करके लॉगिन करें।",
"ApplicationTemplate": "एप्लिकेशन टेम्पलेट",
"ApplicationTemplateExplanation": "एप्लिकेशन स्टार्टअप टेम्पलेट का उपयोग एक नया वेब एप्लिकेशन बनाने के लिए किया जाता है।",
"EfCoreProvider": "इकाई ढाँचा (SQL सर्वर, MySQL, PostgreSQL, Oracle और अन्य का समर्थन करता है)",
@@ -152,50 +152,50 @@
"ABPCLIExplanation": "ABP CLI (कमांड लाइन इंटरफेस) ABP आधारित समाधानों के लिए कुछ सामान्य ऑपरेशन करने के लिए एक कमांड लाइन टूल है।",
"ABPSuiteEasilyCURD": "एबीपी सूट एक उपकरण है जो आपको आसानी से CRUD पेज बनाने की अनुमति देता है",
"WeAreHereToHelp": "हम यहाँ हैं मदद span>",
- "BrowseOrAskQuestion": "आप हमारे सहायता विषयों को ब्राउज़ कर सकते हैं या अक्सर पूछे जाने वाले प्रश्नों में खोज कर सकते हैं, या आप संपर्क फ़ॉर्म का उपयोग करके हमसे एक प्रश्न पूछ सकते हैं।",
+ "BrowseOrAskQuestion": "आप हमारे सहायता विषयों को ब्राउज़ कर सकते हैं या अक्सर पूछे जाने वाले प्रश्नों में खोज कर सकते हैं, या आप संपर्क फ़ॉर्म का उपयोग करके हमसे एक प्रश्न पूछ सकते हैं।",
"SearchQuestionPlaceholder": "अक्सर पूछे जाने वाले प्रश्नों में खोजें",
"WhatIsTheABPCommercial": "ABP कमर्शियल क्या है?",
"WhatAreDifferencesThanAbpFramework": "ओपन सोर्स ABP फ्रेमवर्क और ABP कमर्शियल के बीच क्या अंतर हैं?",
- "ABPCommercialExplanation": "एबीपी कमर्शियल, खुले स्रोत के शीर्ष पर बनाए गए प्रीमियम मॉड्यूल, टूल, थीम और सेवाओं का एक सेट है जो ABP फ्रेमवर्क है। एबीपी कमर्शियल को एबीपी फ्रेमवर्क के पीछे उसी टीम द्वारा विकसित और समर्थित किया जा रहा है।",
- "WhatAreDifferencesThanABPFrameworkExplanation": " ABP फ्रेमवर्क ASP.NET Core के लिए एक मॉड्यूलर, थीमेबल, माइक्रो-सर्विस संगत एप्लिकेशन डेवलपमेंट फ्रेमवर्क है। यह आपको हर नई परियोजना के लिए खुद को दोहराने के बजाय अपने खुद के व्यवसाय कोड पर ध्यान केंद्रित करने के लिए एक पूर्ण वास्तुकला और एक मजबूत बुनियादी ढांचा प्रदान करता है। यह सॉफ्टवेयर विकास सर्वोत्तम प्रथाओं और लोकप्रिय उपकरणों पर आधारित है जिन्हें आप पहले से जानते हैं। p>
एबीपी फ्रेमवर्क पूरी तरह से मुक्त, खुला स्रोत और समुदाय-संचालित है। यह एक मुफ्त थीम और कुछ पूर्व-निर्मित मॉड्यूल (जैसे पहचान प्रबंधन और किरायेदार प्रबंधन) प्रदान करता है। p>",
- "VisitTheFrameworkVSCommercialDocument": "अधिक जानकारी के लिए, निम्न लिंक पर जाएं {1} ",
+ "ABPCommercialExplanation": "एबीपी कमर्शियल ओपन सोर्स ABP फ्रेमवर्क के शीर्ष पर निर्मित प्रीमियम मॉड्यूल, टूल, थीम और सेवाओं का एक सेट है। एबीपी कमर्शियल को एबीपी ढांचे के पीछे उसी टीम द्वारा विकसित और समर्थित किया जा रहा है।",
+ "WhatAreDifferencesThanABPFrameworkExplanation": "
ABP फ्रेमवर्क ASP.NET कोर के लिए एक मॉड्यूलर, थीम योग्य, माइक्रो-सर्विस संगत एप्लिकेशन डेवलपमेंट फ्रेमवर्क है। यह आपको हर नई परियोजना के लिए खुद को दोहराने के बजाय अपने स्वयं के व्यवसाय कोड पर ध्यान केंद्रित करने के लिए एक पूर्ण वास्तुकला और एक मजबूत बुनियादी ढांचा प्रदान करता है। यह सॉफ्टवेयर विकास सर्वोत्तम प्रथाओं और लोकप्रिय टूल पर आधारित है जिन्हें आप पहले से जानते हैं।
एबीपी ढांचा पूरी तरह से मुक्त, खुला स्रोत और समुदाय संचालित है। यह एक मुफ्त थीम और कुछ पूर्व-निर्मित मॉड्यूल (जैसे पहचान प्रबंधन और किरायेदार प्रबंधन) भी प्रदान करता है।
",
+ "VisitTheFrameworkVSCommercialDocument": "अधिक जानकारी के लिए, निम्न लिंक पर जाएँ {1} ",
"ABPCommercialFollowingBenefits": "एबीपी वाणिज्यिक एबीपी ढांचे के शीर्ष पर निम्नलिखित लाभ जोड़ता है;",
"Professional": "पेशेवर",
"UIThemes": "यूआई थीम",
- "EnterpriseModules": "एंटरप्राइज रेडी, फीचर से भरपूर, पहले से निर्मित एप्लिकेशन मॉड्यूल (जैसे पहचान सर्वर प्रबंधन, सास प्रबंधन, भाषा प्रबंधन)",
- "ToolingToSupport": "अपनी विकास उत्पादकता का समर्थन करने का टूल",
- "PremiumSupportLink": "प्रीमियम समर्थन ",
+ "EnterpriseModules": "एंटरप्राइज़ तैयार, सुविधा संपन्न, पूर्व-निर्मित एप्लिकेशन मॉड्यूल (उदा. पहचान सर्वर प्रबंधन, SaaS प्रबंधन, भाषा प्रबंधन)",
+ "ToolingToSupport": "आपकी विकास उत्पादकता का समर्थन करने के लिए टूलिंग (उदा. ABP Suite)",
+ "PremiumSupportLink": "प्रीमियम समर्थन",
"WhatDoIDownloadABPCommercial": "जब मैं एबीपी कमर्शियल खरीदता हूं तो क्या डाउनलोड करता हूं?",
- "CreateUnlimitedSolutions": "एक बार जब आप एक एबीपी कमर्शियल लाइसेंस खरीदते हैं, तो आप असीमित समाधान बना पाएंगे, जैसे कि Get Started दस्तावेज़ में वर्णित है।",
+ "CreateUnlimitedSolutions": "एक बार जब आप एबीपी वाणिज्यिक लाइसेंस खरीद लेते हैं, तो आप असीमित समाधान बनाने में सक्षम होंगे जैसा कि आरंभ करना दस्तावेज़ में वर्णित है।",
"ABPCommercialSolutionExplanation": "जब आप एक नया एप्लिकेशन बनाते हैं, तो आपको अपनी प्राथमिकताओं के आधार पर एक विज़ुअल स्टूडियो समाधान (एक स्टार्टअप टेम्प्लेट) मिलता है। डाउनलोड किए गए समाधान में आपके लिए पहले से इंस्टॉल और कॉन्फ़िगर किए गए वाणिज्यिक मॉड्यूल और थीम हैं। यदि आप चाहें तो आप पहले से स्थापित मॉड्यूल को हटा सकते हैं या किसी अन्य मॉड्यूल को जोड़ सकते हैं। सभी मॉड्यूल और थीम डिफ़ॉल्ट रूप से एक NuGet / NPM पैकेज का उपयोग किया जाता है।",
- "StartDevelopWithTutorials": "डाउनलोड किया गया समाधान अच्छी तरह से वास्तुकला और दस्तावेज है। आप अपने स्वयं के व्यवसाय कोड को इस आधार पर विकसित करना शुरू कर सकते हैं कि वह ट्यूटोरियल्स का अनुसरण कर सकता है",
- "TryTheCommercialDemo": "ABP कमर्शियल स्टार्टअप टेम्प्लेट का उपयोग करके बनाए गए एक नमूना अनुप्रयोग को देखने के लिए आप डेमो का प्रयास कर सकते हैं।",
+ "StartDevelopWithTutorials": "डाउनलोड किया गया समाधान अच्छी तरह से संरचित और प्रलेखित है। आप ट्यूटोरियल . का अनुसरण करके इसके आधार पर अपना खुद का व्यवसाय कोड विकसित करना शुरू कर सकते हैं",
+ "TryTheCommercialDemo": "ABP कमर्शियल स्टार्टअप टेम्प्लेट का उपयोग करके बनाए गए एक नमूना एप्लिकेशन को देखने के लिए आप डेमो आज़मा सकते हैं।",
"HowManyProducts": "ABP वाणिज्यिक का उपयोग करके मैं कितने विभिन्न उत्पाद / समाधान बना सकता हूं?",
"HowManyProductsExplanation": "ABP प्रोजेक्ट बनाने की कोई सीमा नहीं है। आप जितने चाहें उतने प्रोजेक्ट बना सकते हैं, उन्हें विकसित कर सकते हैं और उन्हें विभिन्न सर्वरों पर अपलोड कर सकते हैं।",
"HowManyDevelopers": "एबीपी कमर्शियल पर कितने डेवलपर काम कर सकते हैं?",
- "HowManyDevelopersExplanation": "एबीपी वाणिज्यिक लाइसेंस प्रति डेवलपर हैं। विभिन्न लाइसेंस प्रकारों में अलग-अलग डेवलपर सीमाएँ होती हैं। हालाँकि, जब भी आपको आवश्यकता हो, आप किसी भी प्रकार के लाइसेंस में अधिक डेवलपर्स जोड़ सकते हैं। लाइसेंस प्रकार, डेवलपर सीमा और अतिरिक्त डेवलपर लागतों के लिए कीमतें पृष्ठ देखें।",
+ "HowManyDevelopersExplanation": "एबीपी वाणिज्यिक लाइसेंस प्रति डेवलपर हैं। विभिन्न लाइसेंस प्रकारों की अलग-अलग डेवलपर सीमाएँ होती हैं। हालांकि, जब भी आपको आवश्यकता हो, आप किसी भी प्रकार के लाइसेंस में अधिक डेवलपर जोड़ सकते हैं। लाइसेंस प्रकारों, डेवलपर सीमाओं और अतिरिक्त डेवलपर लागतों के लिए कीमतें पृष्ठ देखें।",
"ChangingLicenseType": "क्या मैं भविष्य में अपना लाइसेंस प्रकार बदल सकता हूं?",
"ChangingLicenseTypeExplanation": "आप अपने समान लाइसेंस प्रकार में हमेशा नए डेवलपर्स को जोड़ सकते हैं। यह भी देखें \"एबीपी कमर्शियल पर कितने डेवलपर काम कर सकते हैं?\"। आप गणना मूल्य अंतर का भुगतान करके एक उच्च लाइसेंस के लिए भी अपग्रेड कर सकते हैं। जब आप उच्च लाइसेंस योजना में अपग्रेड करते हैं, तो आपको नई योजना का लाभ मिलता है, लेकिन लाइसेंस अपग्रेड लाइसेंस की समाप्ति की तारीख को नहीं बदलता है।",
"LicenseExtendUpgradeDiff": "लाइसेंस विस्तार और उन्नयन के बीच क्या अंतर है?",
"LicenseExtendUpgradeDiffExplanation": " विस्तार: strong> अपने लाइसेंस का विस्तार / नवीनीकरण करके, आप प्रीमियम समर्थन प्राप्त करना और मॉड्यूल और थीम के लिए प्रमुख अपडेट प्राप्त करना जारी रखेंगे। इसके अलावा, आप नई परियोजनाओं को जारी रखने में सक्षम होंगे। और आप अभी भी एबीपी सूट का उपयोग कर पाएंगे जो आपके विकास को गति देता है।
उन्नयन: strong> अपने लाइसेंस को अपग्रेड करके, आप एक उच्च लाइसेंस योजना को बढ़ावा देंगे जिससे आप अतिरिक्त लाभ प्राप्त कर सकेंगे। । लाइसेंस योजनाओं के बीच अंतर की जांच करने के लिए लाइसेंस तुलना तालिका देखें। दूसरी ओर, जब आप अपग्रेड करते हैं, तो आपकी लाइसेंस की समाप्ति तिथि नहीं बदलेगी! Strong> > अपनी लाइसेंस की अंतिम तिथि बढ़ाने के लिए, आपको अपने लाइसेंस का विस्तार करना होगा।",
"LicenseRenewalCost": "1 वर्ष के बाद लाइसेंस नवीनीकरण लागत क्या है?",
- "LicenseRenewalCostExplanation": "सभी एबीपी वाणिज्यिक स्थायी लाइसेंसों का नवीकरण (विस्तार) दर लाइसेंस सूची मूल्य का {0} है। मानक टीम लाइसेंस का नवीनीकरण मूल्य $ {1} है, मानक व्यवसाय लाइसेंस $ {2} है और मानक एंटरप्राइज़ लाइसेंस $ {3} है। यदि आप पहले से ही ग्राहक हैं, तो उपलब्ध नवीनीकरण मूल्य निर्धारण की समीक्षा करने के लिए अपने खाते में लॉग इन करें ।",
+ "LicenseRenewalCostExplanation": "सभी एबीपी वाणिज्यिक स्थायी लाइसेंसों की नवीनीकरण (विस्तार) दर लाइसेंस सूची मूल्य का {0} है। मानक टीम लाइसेंस का नवीनीकरण मूल्य ${1} है, मानक व्यवसाय लाइसेंस ${2} है और मानक एंटरप्राइज़ लाइसेंस ${3} है। यदि आप पहले से ही ग्राहक हैं, तो उपलब्ध नवीनीकरण मूल्य-निर्धारण की समीक्षा के लिए अपने खाते में लॉग इन करें।",
"HowDoIRenewMyLicense": "मैं अपने लाइसेंस का नवीनीकरण कैसे करूँ?",
- "HowDoIRenewMyLicenseExplanation": "आप अपने लाइसेंस को संगठन प्रबंधन पृष्ठ पर नेविगेट करके नवीनीकृत कर सकते हैं। हमारी रियायती अर्ली रिन्यूअल दरों का लाभ उठाने के लिए, सुनिश्चित करें कि आप अपने लाइसेंस की समय सीमा समाप्त होने से पहले नवीनीकरण करें। हालाँकि, जब आपका प्रारंभिक नवीनीकरण अवसर बंद हो जाता है, तो यह जानने की चिंता न करें। आपकी सदस्यता समाप्त होने से पहले आपको 2 अनुस्मारक ई-मेल प्राप्त होंगे। हम उन्हें 30 दिन, समाप्ति से 7 दिन पहले भेज देंगे।",
+ "HowDoIRenewMyLicenseExplanation": "आप संगठन प्रबंधन पृष्ठ पर नेविगेट करके अपने लाइसेंस का नवीनीकरण कर सकते हैं। हमारी रियायती प्रारंभिक नवीनीकरण दरों का लाभ उठाने के लिए, अपने लाइसेंस की समय सीमा समाप्त होने से पहले नवीनीकरण करना सुनिश्चित करें। हालाँकि, यह जानने की चिंता न करें कि आपका प्रारंभिक नवीनीकरण अवसर कब बंद होगा। आपकी सदस्यता समाप्त होने से पहले आपको 2 अनुस्मारक ई-मेल प्राप्त होंगे। हम उन्हें समाप्ति से ७ दिन पहले, ३० दिनों में भेजेंगे।",
"IsSourceCodeIncluded": "क्या मेरे लाइसेंस में वाणिज्यिक मॉड्यूल और थीम का स्रोत कोड शामिल है?",
"IsSourceCodeIncludedExplanation1": "आपके द्वारा खरीदे गए लाइसेंस प्रकार पर निर्भर करता है:",
"IsSourceCodeIncludedExplanation2": " टीम strong>: आपका समाधान मॉड्यूल और थीम को NuGet और NPM पैकेज के रूप में उपयोग करता है। इसमें उनका स्रोत कोड शामिल नहीं है। इस तरह, जब भी कोई नया संस्करण उपलब्ध हो, आप इन मॉड्यूल और थीम को आसानी से अपग्रेड कर सकते हैं। हालाँकि, आप मॉड्यूल और थीम के स्रोत कोड प्राप्त नहीं कर सकते।",
"IsSourceCodeIncludedExplanation3": " व्यवसाय / उद्यम strong>: टीम लाइसेंस के अतिरिक्त, आप किसी भी मॉड्यूल या थीम की आवश्यकता के स्रोत कोड को डाउनलोड करने में सक्षम हैं। तुम भी एक विशेष मॉड्यूल के लिए NuGet / NPM पैकेज संदर्भ निकाल सकते हैं और इसे पूरी तरह से बदलने के लिए अपने समाधान के लिए अपने स्रोत कोड को सीधे जोड़ सकते हैं।",
- "IsSourceCodeIncludedExplanation4": " एक मॉड्यूल के स्रोत कोड को आपके समाधान में शामिल करना आपको उस मॉड्यूल को अनुकूलित करने की अधिकतम स्वतंत्रता देता है। हालाँकि, तब नया संस्करण जारी होने पर मॉड्यूल को स्वचालित रूप से अपग्रेड करना संभव नहीं होगा। p>
किसी भी लाइसेंस में ABP सुइट स्रोत कोड शामिल नहीं है, जो एक बाहरी उपकरण है जो आपके लिए कोड बनाता है और सहायता करता है आपके विकास के लिए। p>
लाइसेंस प्रकारों के अन्य अंतरों के लिए मूल्य निर्धारण पृष्ठ देखें। p>",
+ "IsSourceCodeIncludedExplanation4": "
अपने समाधान में मॉड्यूल के स्रोत कोड को शामिल करने से आपको उस मॉड्यूल को अनुकूलित करने की अधिकतम स्वतंत्रता मिलती है। हालांकि, नया संस्करण जारी होने पर मॉड्यूल को स्वचालित रूप से अपग्रेड करना संभव नहीं होगा।
किसी भी लाइसेंस में एबीपी सूट स्रोत कोड शामिल नहीं है, जो एक बाहरी उपकरण है जो आपके लिए कोड उत्पन्न करता है और सहायता करता है। आपके विकास के लिए।
लाइसेंस प्रकारों के बीच अन्य अंतरों के लिए मूल्य निर्धारण पृष्ठ देखें।
",
"ChangingDevelopers": "क्या मैं भविष्य में अपने संगठन के पंजीकृत डेवलपर्स को बदल सकता हूं?",
"ChangingDevelopersExplanation": "अपने लाइसेंस में नए डेवलपर्स को जोड़ने के अलावा, आप मौजूदा डेवलपर्स को भी बदल सकते हैं (आप एक डेवलपर को हटा सकते हैं और एक ही सीट पर एक नया जोड़ सकते हैं) बिना किसी अतिरिक्त लागत के।",
"WhatHappensWhenLicenseEnds": "मेरे लाइसेंस की अवधि समाप्त होने पर क्या होता है?",
- "WhatHappensWhenLicenseEndsExplanation1": "ABP कमर्शियल लाइसेंस का प्रकार स्थायी लाइसेंस है। आपके लाइसेंस की समय सीमा समाप्त होने के बाद, आप अपना प्रोजेक्ट विकसित करना जारी रख सकते हैं। और आप अपने लाइसेंस को नवीनीकृत करने के लिए बाध्य नहीं हैं। आपका लाइसेंस एक वर्ष के अपडेट और समर्थन योजना के साथ आता है। नई सुविधाओं को प्राप्त करने के लिए, प्रदर्शन में वृद्धि, बग फिक्स, समर्थन और एबीपी सूट का उपयोग करना जारी रखें, प्रत्येक वर्ष अपनी योजना को नवीनीकृत करना सुनिश्चित करें। जब आपका लाइसेंस समाप्त हो जाता है, तो आप निम्नलिखित लाभ प्राप्त नहीं कर पाएंगे;",
+ "WhatHappensWhenLicenseEndsExplanation1": "ABP वाणिज्यिक लाइसेंस प्रकार स्थायी लाइसेंस है। आपके लाइसेंस की समय सीमा समाप्त होने के बाद, आप अपने प्रोजेक्ट को विकसित करना जारी रख सकते हैं। और आप अपने लाइसेंस को नवीनीकृत करने के लिए बाध्य नहीं हैं। आपका लाइसेंस बॉक्स से बाहर एक साल के अपडेट और समर्थन योजना के साथ आता है। नई सुविधाओं, प्रदर्शन में सुधार, बग फिक्स, समर्थन प्राप्त करना जारी रखने और एबीपी सूट का उपयोग जारी रखने के लिए, हर साल अपनी योजना को नवीनीकृत करना सुनिश्चित करें। जब आपका लाइसेंस समाप्त हो जाता है, तो आप निम्नलिखित में से अधिक लाभ प्राप्त नहीं कर पाएंगे;",
"WhatHappensWhenLicenseEndsExplanation2": "आप एबीपी कमर्शियल का उपयोग करके नए समाधान नहीं बना सकते हैं, लेकिन आप अपने मौजूदा अनुप्रयोगों को हमेशा के लिए विकसित कर सकते हैं।",
"WhatHappensWhenLicenseEndsExplanation3": "आप अपने मुख्य संस्करण के भीतर मॉड्यूल और विषयों के लिए अद्यतन प्राप्त करने में सक्षम होंगे। उदाहरण के लिए; यदि आप किसी मॉड्यूल के v3.2.0 का उपयोग कर रहे हैं, तो आप उस मॉड्यूल के v3.x.x (v3.3.0, v3.5.2 ... आदि) के लिए अपडेट प्राप्त कर सकते हैं। लेकिन आपको अगले प्रमुख संस्करण के लिए अपडेट नहीं मिल सकता है (जैसे v4.x, v5.x)",
"WhatHappensWhenLicenseEndsExplanation4": "आप अपने लाइसेंस समाप्त होने के बाद एबीपी वाणिज्यिक मंच में जोड़े गए नए मॉड्यूल और थीम स्थापित नहीं कर सकते।",
"WhatHappensWhenLicenseEndsExplanation5": "आप एबीपी सूट का उपयोग नहीं कर सकते।",
- "WhatHappensWhenLicenseEndsExplanation6": "आपको अब और प्रीमियम सहायता नहीं मिल सकती है।",
+ "WhatHappensWhenLicenseEndsExplanation6": "अब आपको प्रीमियम सहायता नहीं मिल सकती है।",
"WhatHappensWhenLicenseEndsExplanation7": "यदि आप इन लाभों को प्राप्त करना जारी रखना चाहते हैं तो आप अपनी सदस्यता को नवीनीकृत कर सकते हैं। जब आप अपनी सदस्यता को नवीनीकृत करते हैं तो 20% छूट मिलती है।",
"WhenShouldIRenewMyLicense": "मुझे अपना लाइसेंस कब नवीनीकृत करना चाहिए?",
"WhenShouldIRenewMyLicenseExplanation1": "यदि आप अपना लाइसेंस समाप्त होने के बाद अपने लाइसेंस का नवीनीकरण 1 महीने strong> के भीतर करते हैं, तो कुल लाइसेंस मूल्य पर% 20 छूट लागू होगी।",
@@ -206,21 +206,21 @@
"DoYouAcceptBankWireTransferExplanation": "हां, हम बैंक वायर ट्रांसफर स्वीकार करते हैं।
बैंक वायर ट्रांसफर के माध्यम से लाइसेंस राशि भेजने के बाद, हमें अपनी रसीद और अनुरोधित लाइसेंस प्रकार ई-मेल के माध्यम से भेजें।
हमारे अंतरराष्ट्रीय बैंक खाते की जानकारी:",
"HowToUpgrade": "नया संस्करण उपलब्ध होने पर मौजूदा एप्लिकेशन को कैसे अपग्रेड किया जाए?",
"HowToUpgradeExplanation1": "जब आप ABP कमर्शियल का उपयोग करके एक नया एप्लिकेशन बनाते हैं, तो सभी मॉड्यूल और थीम को NuGet और NPM पैकेज के रूप में उपयोग किया जाता है। इसलिए, नया संस्करण उपलब्ध होने पर आप आसानी से संकुल को अपग्रेड कर सकते हैं।",
- "HowToUpgradeExplanation2": "मानक NuGet / NPM अपग्रेड के अलावा, ABP CLI एक अपडेट कमांड प्रदान करता है जो आपके समाधान में सभी एबीपी से संबंधित पैकेजों को स्वचालित रूप से ढूंढता है और उन्हें अपग्रेड करता है।",
+ "HowToUpgradeExplanation2": "मानक NuGet/NPM अपग्रेड के अलावा, ABP CLI एक अपडेट कमांड प्रदान करता है जो आपके समाधान में सभी ABP संबंधित पैकेजों को स्वचालित रूप से ढूंढता और अपग्रेड करता है।",
"DatabaseSupport": "कौन से डेटाबेस सिस्टम समर्थित हैं?",
- "DatabaseSupportExplanation": "ABP फ्रेमवर्क स्वयं ही डेटाबेस अज्ञेयवादी है और अपनी प्रकृति के अनुसार किसी भी डेटाबेस प्रदाता के साथ काम कर सकता है। वर्तमान में कार्यान्वित प्रदाताओं की सूची के लिए डेटा एक्सेस दस्तावेज़ देखें।",
+ "DatabaseSupportExplanation": "एबीपी फ्रेमवर्क अपने आप में डेटाबेस अज्ञेयवादी है और अपनी प्रकृति से किसी भी डेटाबेस प्रदाता के साथ काम कर सकता है। वर्तमान में कार्यान्वित प्रदाताओं की सूची के लिए डेटा एक्सेस दस्तावेज़ देखें।",
"UISupport": "कौन से UI फ्रेमवर्क समर्थित हैं?",
"Supported": "समर्थित",
- "UISupportExplanation": "ABP फ्रेमवर्क स्वयं UI फ्रेमवर्क अज्ञेयवादी है और किसी भी UI फ्रेमवर्क के साथ काम कर सकता है। हालाँकि, सभी UI फ्रेमवर्क के लिए स्टार्टअप टेम्प्लेट, मॉड्यूल UI और थीम लागू नहीं किए गए थे। UI विकल्पों की अप-टू-डेट सूची के लिए आरंभ किया गया दस्तावेज़ देखें।",
+ "UISupportExplanation": "एबीपी फ्रेमवर्क अपने आप में यूआई फ्रेमवर्क अज्ञेयवादी है और किसी भी यूआई फ्रेमवर्क के साथ काम कर सकता है। हालांकि, स्टार्टअप टेम्प्लेट, मॉड्यूल UI और थीम सभी UI फ्रेमवर्क के लिए लागू नहीं किए गए थे। UI विकल्पों की अप-टू-डेट सूची के लिए आरंभ करने वाला दस्तावेज़ देखें।",
"MicroserviceSupport": "क्या यह सूक्ष्म सेवा वास्तुकला का समर्थन करता है?",
- "MicroserviceSupportExplanation1": "एबीपी ढांचे का एक प्रमुख लक्ष्य सूक्ष्म सेवा समाधान बनाने के लिए एक सुविधाजनक बुनियादी ढांचा प्रदान करना है। यह समझने के लिए कि यह माइक्रो-सर्विस सिस्टम बनाने में कैसे मदद करता है, यह समझने के लिए माइक्रो-सर्विस आर्किटेक्चर दस्तावेज़ देखें।",
- "MicroserviceSupportExplanation2": "सभी एबीपी कमर्शियल मॉड्यूल्स को मॉड्यूल डेवलपमेंट बेस्ट प्रैक्टिस दस्तावेज़ का पालन करके माइक्रो-सर्विस परिनियोजन परिदृश्य (अपने एपीआई और डेटाबेस के साथ) का समर्थन करने के लिए डिज़ाइन किया गया है।",
- "MicroserviceSupportExplanation3": "हम आपको अपना स्वयं का समाधान बनाने में मदद करने के लिए एक माइक्रो-सेवा वास्तुकला कार्यान्वयन को प्रदर्शित करने वाला एक नमूना माइक्रो-सर्विस डेमो समाधान प्रदान करते हैं।",
+ "MicroserviceSupportExplanation1": "एबीपी ढांचे के प्रमुख लक्ष्यों में से एक सूक्ष्म सेवा समाधान बनाने के लिए एक सुविधाजनक बुनियादी ढांचा प्रदान करना है। यह समझने के लिए कि यह माइक्रो-सर्विस सिस्टम बनाने में कैसे मदद करता है, माइक्रो-सर्विस आर्किटेक्चर दस्तावेज़ देखें।",
+ "MicroserviceSupportExplanation2": "सभी एबीपी वाणिज्यिक मॉड्यूल मॉड्यूल विकास सर्वोत्तम प्रथाओं दस्तावेज़ का पालन करके माइक्रो-सेवा परिनियोजन परिदृश्यों (अपने स्वयं के एपीआई और डेटाबेस के साथ) का समर्थन करने के लिए डिज़ाइन किए गए हैं।",
+ "MicroserviceSupportExplanation3": "हम एक नमूना माइक्रो-सर्विस डेमो सॉल्यूशन प्रदान करते हैं जो आपको अपना समाधान बनाने में मदद करने के लिए एक माइक्रो-सर्विस आर्किटेक्चर कार्यान्वयन दर्शाता है।",
"MicroserviceSupportExplanation4": "तो, संक्षिप्त उत्तर \" हां है, यह सूक्ष्म सेवा वास्तुकला का समर्थन करता है strong>\"।",
"MicroserviceSupportExplanation5": "हालाँकि, एक माइक्रो-सर्विस सिस्टम एक समाधान है और हर समाधान में अलग-अलग आवश्यकताएं, नेटवर्क टोपोलॉजी, संचार परिदृश्य, प्रमाणीकरण संभावनाएं, डेटाबेस पृथक्करण / साझा करने के निर्णय, रनटाइम कॉन्फ़िगरेशन, 3 पार्टी सिस्टम एकीकरण और कई और अधिक होंगे।",
"MicroserviceSupportExplanation6": "ABP फ्रेमवर्क और ABP कमर्शियल आपको अपने स्वयं के समाधान का निर्माण करने में मदद करने के लिए सूक्ष्म सेवा परिदृश्य, सूक्ष्म सेवा संगत मॉड्यूल, नमूने और प्रलेखन के लिए बुनियादी ढाँचा प्रदान करता है। लेकिन अपने सपनों के समाधान को सीधे आपके लिए पहले से डाउनलोड करने की उम्मीद न करें। आपको इसे समझने और अपनी आवश्यकताओं के आधार पर कुछ हिस्सों को एक साथ लाने की आवश्यकता होगी।",
"WhereCanIDownloadSourceCode": "मैं स्रोत-कोड कहां से डाउनलोड कर सकता हूं?",
- "WhereCanIDownloadSourceCodeExplanation": "आप एबीपी सूट या एबीपी सीएलआई के माध्यम से सभी एबीपी मॉड्यूल, कोणीय पैकेज और थीम के स्रोत कोड डाउनलोड कर सकते हैं। स्रोत-कोड डाउनलोड कैसे करें? देखें",
+ "WhereCanIDownloadSourceCodeExplanation": "आप एबीपी सूट या एबीपी सीएलआई के माध्यम से सभी एबीपी मॉड्यूल, एंगुलर पैकेज और थीम का सोर्स कोड डाउनलोड कर सकते हैं। देखें स्रोत-कोड कैसे डाउनलोड करें?",
"ComputerLimitation": "एबीपी विकसित करते समय एक डेवलपर कितने कंप्यूटरों पर लॉगिन कर सकता है?",
"ComputerLimitationExplanation": "हम विशेष रूप से प्रति व्यक्ति / लाइसेंस प्राप्त डेवलपर के लिए {0} कंप्यूटर strong> की अनुमति देते हैं। जब भी किसी तीसरे मशीन पर एबीपी कमर्शियल उत्पादों को विकसित करने के लिए डेवलपर की आवश्यकता होती है, तो स्थिति को समझाते हुए लाइसेंस@abp.io को एक ई-मेल भेजा जाना चाहिए और फिर हम अपने सिस्टम में उचित आवंटन करेंगे।",
"RefundPolicy": "क्या आपके पास धनवापसी नीति है?",
@@ -230,17 +230,17 @@
"HowCanIRefundVatExplanation2": "अपने 2 चेकआउट खाते में लॉग इन करें",
"HowCanIRefundVatExplanation3": "उपयुक्त आदेश खोजें और \"रिफंड बेल्ड वैट\" दबाएं (अपनी वैट आईडी दर्ज करें)",
"HowCanIGetMyInvoice": "मैं अपना चालान कैसे प्राप्त कर सकता हूं?",
- "HowCanIGetMyInvoiceExplanation": "लाइसेंस खरीदने के लिए 2 भुगतान गेटवे हैं: PayU और 2 चेकआउट। यदि आप 2Checkout गेटवे के माध्यम से अपना लाइसेंस खरीदते हैं, तो यह आपके ईमेल पते पर पीडीएफ चालान भेजता है, देखें 2 चेकआउट चालान। यदि आप पेयू गेटवे या बैंक वायर ट्रांसफर के माध्यम से खरीदते हैं, तो हम आपका चालान तैयार करेंगे और भेजेंगे। आप अपने चालान का अनुरोध संगठन प्रबंधन पृष्ठ से कर सकते हैं",
+ "HowCanIGetMyInvoiceExplanation": "लाइसेंस खरीदने के लिए 2 भुगतान गेटवे हैं: PayU और 2 चेकआउट। यदि आप 2Checkout गेटवे के माध्यम से अपना लाइसेंस खरीदते हैं, तो यह आपके ईमेल पते पर पीडीएफ चालान भेजता है, देखें 2 चेकआउट चालान। यदि आप पेयू गेटवे या बैंक वायर ट्रांसफर के माध्यम से खरीदते हैं, तो हम आपका चालान तैयार करेंगे और भेजेंगे। आप अपने चालान का अनुरोध संगठन प्रबंधन पृष्ठ से कर सकते हैं",
"Forum": "मंच",
"SupportExplanation": "ABP कमर्शियल लाइसेंस एक टीम द्वारा प्रीमियम फ़ोरम सपोर्ट प्रदान करता है जिसमें ABP फ्रेमवर्क विशेषज्ञ होते हैं।",
"PrivateTicket": "निजी टिकट",
"PrivateTicketExplanation": "एंटरप्राइज लाइसेंस में ई-मेल और टिकट प्रणाली के साथ एक निजी सहायता भी शामिल है।",
"AbpSuiteExplanation1": "ABP सुइट आपको कुछ ही मिनटों में वेब पेज बनाने की अनुमति देता है। यह .NET कोर ग्लोबल टूल है जिसे कमांड लाइन से इंस्टॉल किया जा सकता है।",
- "AbpSuiteExplanation2": "यह एक नया ABP समाधान बना सकता है, डेटाबेस से फ्रंट-एंड तक CRUD पेज बना सकता है। तकनीकी ओवरव्यू के लिए दस्तावेज़ देखें",
+ "AbpSuiteExplanation2": "यह एक नया ABP समाधान बना सकता है, डेटाबेस से फ्रंट-एंड तक CRUD पेज बना सकता है। तकनीकी ओवरव्यू के लिए दस्तावेज़ देखें",
"FastEasy": "तेज और आसान",
"AbpSuiteExplanation3": "ABP सुइट आपको आसानी से CRUD पेज बनाने की अनुमति देता है। आपको बस अपनी इकाई और उसके गुणों को परिभाषित करने की आवश्यकता है, बाकी को आप के लिए एबीपी सूट करने दें! एबीपी सूट कुछ ही सेकंड में आपके सीआरयूडी पृष्ठ के लिए सभी आवश्यक कोड उत्पन्न करता है। यह Angular, MVC और Blazor यूजर इंटरफेस को सपोर्ट करता है।",
"RichOptions": "अमीर विकल्प",
- "AbpSuiteExplanation4": "ABP सुइट रेजर पेज और Angular । यह MongoDB जैसे कई डेटाबेस का समर्थन करता है और सभी डेटाबेस EntityFramework Core <द्वारा समर्थित है / strong> (MS SQL सर्वर, Oracle, MySql, PostgreSQL और )।",
+ "AbpSuiteExplanation4": "ABP Suite supports multiple UI options like Razor Pages and Angular.It also supports multiple databases like MongoDB and all databases supported by EntityFramework Core (MS SQL Server, Oracle, MySql, PostgreSQL and more).",
"AbpSuiteExplanation5": "अच्छी बात यह है कि, आपको उन विकल्पों के बारे में चिंता करने की ज़रूरत नहीं है। एबीपी सूट आपके प्रोजेक्ट के प्रकार को समझता है और आपकी परियोजना के लिए कोड बनाता है और उत्पन्न कोड को आपके प्रोजेक्ट में सही जगह पर रखता है।",
"SourceCode": "सोर्स कोड",
"AbpSuiteExplanation6": "ABP स्वीट आपके लिए सोर्स कोड जेनरेट करता है! यह वेब पेज जनरेट करने के लिए मैजिक फाइल्स जेनरेट नहीं करता है। एबीपी सूट इकाई, रिपोजिटरी, एप्लीकेशन सर्विस, कोड फर्स्ट माइग्रेशन, जावास्क्रिप्ट / टाइपस्क्रिप्ट और सीएसएचटीएमएल / एचटीएमएल strong> और आवश्यक इंटरफेस के लिए भी स्रोत कोड उत्पन्न करता है। ABP Suite सॉफ्टवेयर डेवलपमेंट के बेस्ट प्रैक्टिसेस strong> के अनुसार कोड भी तैयार करता है, इसलिए आपको जनरेट किए गए कोड की गुणवत्ता के बारे में चिंता करने की आवश्यकता नहीं है।",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json
index 766702a92b..2eaef28623 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json
@@ -151,7 +151,7 @@
"SeeAllModules": "Vedi tutti i moduli",
"ABPCLIExplanation": "ABP CLI (Command Line Interface) è uno strumento a riga di comando per eseguire alcune operazioni comuni per soluzioni basate su ABP.",
"ABPSuiteEasilyCURD": "ABP Suite è uno strumento che ti permette di creare facilmente pagine CRUD",
- "WeAreHereToHelp": "Siamo qui per Aiuto ",
+ "WeAreHereToHelp": "Siamo qui per Aiuto ",
"BrowseOrAskQuestion": "Puoi sfogliare i nostri argomenti della guida o cercare nelle domande frequenti oppure puoi farci una domanda utilizzando il modulo di contatto .",
"SearchQuestionPlaceholder": "Cerca nelle domande frequenti",
"WhatIsTheABPCommercial": "Cos'è l'ABP Commercial?",
@@ -177,7 +177,7 @@
"ChangingLicenseType": "Posso cambiare il mio tipo di licenza in futuro?",
"ChangingLicenseTypeExplanation": "Puoi sempre aggiungere nuovi sviluppatori con lo stesso tipo di licenza. Vedi anche \"Quanti sviluppatori possono lavorare su ABP Commercial?\". Puoi anche passare a una licenza superiore pagando la differenza di prezzo calcolata. Quando esegui l'aggiornamento a un piano di licenza superiore, ottieni i vantaggi del nuovo piano, ma l'aggiornamento della licenza non modifica la data di scadenza della licenza.",
"LicenseExtendUpgradeDiff": "Qual è la differenza tra estensione della licenza e aggiornamento?",
- "LicenseExtendUpgradeDiffExplanation": " Estensione: estendendo / rinnovando la tua licenza, continuerai a ricevere supporto premium e a ricevere aggiornamenti importanti per moduli e temi. Inoltre, potrai continuare a creare nuovi progetti. E sarai ancora in grado di utilizzare ABP Suite che accelera il tuo sviluppo.
Upgrade: aggiornando la tua licenza, promuoverai un piano di licenza superiore che ti consentirà di ottenere ulteriori vantaggi . Consulta la tabella di confronto delle licenze per verificare le differenze tra i piani di licenza. D'altra parte, quando esegui l'upgrade, la data di scadenza della licenza non cambierà! Strong > Per estendere la data di fine della licenza, è necessario estendere la licenza.",
+ "LicenseExtendUpgradeDiffExplanation": " Estensione: estendendo/rinnovando la tua licenza, continuerai a ricevere supporto premium e a ricevere aggiornamenti importanti per moduli e temi. Inoltre, potrai continuare a creare nuovi progetti. E sarai ancora in grado di utilizzare ABP Suite che accelera il tuo sviluppo.
Upgrade: aggiornando la tua licenza, promuoverai un piano di licenza superiore che ti consentirà di ottenere ulteriori vantaggi . Consulta la tabella di confronto delle licenze per verificare le differenze tra i piani di licenza. D'altra parte, quando esegui l'upgrade, la data di scadenza della licenza non cambierà! Per estendere la data di fine della licenza, è necessario estendere la licenza.",
"LicenseRenewalCost": "Qual è il costo del rinnovo della licenza dopo 1 anno?",
"LicenseRenewalCostExplanation": "La tariffa di rinnovo (estensione) di tutte le licenze perpetue ABP Commercial è {0} del prezzo di listino della licenza. Il prezzo di rinnovo della licenza Team standard è $ {1}, la licenza Business standard è $ {2} e la licenza Enterprise standard è $ {3}. Se sei già un cliente, accedi al tuo account per esaminare i prezzi di rinnovo disponibili.",
"HowDoIRenewMyLicense": "Come rinnovo la mia licenza?",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/fi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/fi.json
index cba33bfc30..3d06abb52e 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/fi.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/fi.json
@@ -118,7 +118,7 @@
"CreatePostCoverInfo": "Lisää kansikuva, jotta voit luoda tehokkaan viestin. Lataa 16: 9-kuvasuhteen kuvat parhaan näkymän saamiseksi. Tiedoston enimmäiskoko: 1 Mt.",
"ThankYouForContribution": "Kiitos osallistumisesta ABP-yhteisöön.",
"GithubArticle": "Github-artikkeli",
- "GithubArticleSubmitStepOne": " 1. Kirjoita artikkeli mistä tahansa julkisesta GitHub-arkistosta Markdown-muodossa. esimerkki ",
+ "GithubArticleSubmitStepOne": "1. Kirjoita artikkeli mistä tahansa julkisesta GitHub-arkistosta Markdown-muodossa. esimerkki ",
"GithubArticleSubmitStepTwo": " 2. Lähetä artikkelin URL-osoite lomaketta käyttämällä.",
"GithubArticleSubmitStepThree": " 3. Artikkelisi renderöidään tällä verkkosivustolla.",
"YoutubeVideo": "Youtube-video",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hi.json
index a3f824d6ba..546531445e 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hi.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hi.json
@@ -96,7 +96,7 @@
"JoinOurArticleNewsletter": "हमारे लेख समाचार पत्र में शामिल हों",
"Community": "समुदाय",
"Marketing": "विपणन",
- "CommunityPrivacyPolicyConfirmation": "मैं नियम और शर्तों और गोपनीयता नीति से सहमत हूं।",
+ "CommunityPrivacyPolicyConfirmation": "मैं नियम और शर्तों और गोपनीयता नीति से सहमत हूं।",
"ArticleRequestMessageTitle": "GitHub पर एक लेख / ट्यूटोरियल जिसे आप इस वेब साइट पर देखना चाहते हैं, का अनुरोध करने के लिए एक समस्या खोलें ।",
"ArticleRequestMessageBody": "यहाँ, समुदाय द्वारा अनुरोधित लेखों की सूची। क्या आप एक अनुरोधित लेख लिखना चाहते हैं? कृपया अनुरोध पर क्लिक करें और चर्चा में शामिल हों।",
"Language": "भाषा: हिन्दी",
@@ -118,7 +118,7 @@
"CreatePostCoverInfo": "एक प्रभावी पोस्ट बनाने के लिए, एक कवर फ़ोटो जोड़ें। सर्वश्रेष्ठ दृश्य के लिए 16: 9 पहलू अनुपात चित्र अपलोड करें। अधिकतम फ़ाइल आकार: 1 एमबी।",
"ThankYouForContribution": "ABP समुदाय में योगदान के लिए धन्यवाद।",
"GithubArticle": "गीथब लेख",
- "GithubArticleSubmitStepOne": " 1। span> मार्कडाउन प्रारूप के साथ किसी भी सार्वजनिक GitHub रिपॉजिटरी पर एक लेख लिखें। उदाहरण ",
+ "GithubArticleSubmitStepOne": "1. मार्कडाउन प्रारूप के साथ किसी भी सार्वजनिक GitHub रिपॉजिटरी पर एक लेख लिखें। उदाहरण ",
"GithubArticleSubmitStepTwo": " 2। span> फ़ॉर्म का उपयोग करके अपना लेख URL सबमिट करें।",
"GithubArticleSubmitStepThree": " 3। span> इस वेब साइट में आपका लेख प्रस्तुत किया जाएगा।",
"YoutubeVideo": "यूट्यूब वीडियो",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/fr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/fr.json
index 878af5e830..23ae2cc444 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/fr.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/fr.json
@@ -155,7 +155,7 @@
"Code": "Code",
"Result": "Résultat",
"SeeTheDocumentForMoreInformation": "Consultez le {0} document pour plus d'informations",
- "IndexPageHeroSection": " open source Application Web
Framework pour asp.net core ",
+ "IndexPageHeroSection": "open sourceWeb Application
Framework for asp.net core",
"UiFramework": "Framework de l'interface utilisateur",
"EmailAddress": "Adresse e-mail",
"Mobile": "Mobile",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hi.json
index a7974d8658..a36dbf5aeb 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hi.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hi.json
@@ -94,7 +94,7 @@
"DynamicForms": "गतिशील रूप",
"BundlingMinification": "बंडलिंग और न्यूनतमकरण",
"BackgroundJobs": "बैकग्राउंड जॉब्स",
- "BackgroundJobsExplanation": "सरल कक्षाओं को परिभाषित करें ताकि पृष्ठभूमि में नौकरियों को निष्पादित किया जा सके। अंतर्निहित नौकरी प्रबंधक का उपयोग करें या अपने स्वयं के एकीकृत करें। Hangfire और RabbitMQ एकीकरण पहले से ही उपलब्ध हैं।",
+ "BackgroundJobsExplanation": "कतारबद्ध के रूप में पृष्ठभूमि में कार्य निष्पादित करने के लिए सरल वर्गों को परिभाषित करें। बिल्ट-इन जॉब मैनेजर का उपयोग करें या अपना खुद का एकीकृत करें। Hangfire और RabbitMQ एकीकरण पहले से ही उपलब्ध हैं।",
"DDDInfrastructure": "डीडीडी इन्फ्रास्ट्रक्चर",
"DomainDrivenDesignInfrastructure": "डोमेन संचालित डिज़ाइन इन्फ्रास्ट्रक्चर",
"AutoRESTAPIs": "ऑटो रीस्ट एपीआई",
@@ -104,7 +104,7 @@
"TestInfrastructure": "टेस्ट इन्फ्रास्ट्रक्चर",
"AuditLoggingEntityHistories": "ऑडिट लॉगिंग और इकाई इतिहास",
"ObjectToObjectMapping": "ऑब्जेक्ट टू ऑब्जेक्ट मैपिंग",
- "ObjectToObjectMappingExplanation": "AutoMapper एकीकरण के साथ अमूर्तता के लिए ऑब्जेक्ट मैपिंग पर ऑब्जेक्ट ।",
+ "ObjectToObjectMappingExplanation": "ऑटोमैपर एकीकरण के साथ ऑब्जेक्ट टू ऑब्जेक्ट मैपिंग एब्स्ट्रैक्शन।",
"EmailSMSAbstractions": "ईमेल और एसएमएस अंश",
"EmailSMSAbstractionsWithTemplatingSupport": "ईमेल और एसएमएस अंशांकन समर्थन के साथ",
"Localization": "स्थानीयकरण",
@@ -154,8 +154,8 @@
"AndMore": "और अधिक...",
"Code": "कोड",
"Result": "परिणाम",
- "SeeTheDocumentForMoreInformation": "अधिक जानकारी के लिए {0} दस्तावेज़ देखें",
- "IndexPageHeroSection": "<स्पैन क्लास = \"फर्स्ट-लाइन शाइन\"> ओपन सोर्स strong> span> <स्पैन क्लास = \"सेकंड-लाइन टेक्स्ट-अपरकेस\"> वेब एप्लिकेशन
फ्रेमवर्क span> asp.net core के लिए strong> span>",
+ "SeeTheDocumentForMoreInformation": "अधिक जानकारी के लिए {0} दस्तावेज़ देखें",
+ "IndexPageHeroSection": "open sourceWeb Application
Framework for asp.net core",
"UiFramework": "यूआई फ्रेमवर्क",
"EmailAddress": "ईमेल पता",
"Mobile": "मोबाइल",
@@ -169,13 +169,13 @@
"JoinTheABPCommunityInfo": "एक जीवंत समुदाय के साथ शामिल हों और ABP फ्रेमवर्क में योगदानकर्ता बनें!",
"AllArticles": "सभी चीज़ें",
"SubmitYourArticle": "अपना लेख प्रस्तुत करें",
- "DynamicClientProxyDocument": " JavaScript और C # के लिए डायनेमिक क्लाइंट प्रॉक्सी दस्तावेज़ देखें।",
- "EmailSMSAbstractionsDocument": "अधिक जानकारी के लिए ईमेल करना और एसएमएस भेजने के दस्तावेज़ देखें।",
+ "DynamicClientProxyDocument": "JavaScript और C# के लिए गतिशील क्लाइंट प्रॉक्सी दस्तावेज़ देखें।",
+ "EmailSMSAbstractionsDocument": "अधिक जानकारी के लिए ईमेलिंग और एसएमएस भेजना दस्तावेज़ देखें।",
"CreateProjectWizard": "यह विज़ार्ड स्टार्टअप टेम्प्लेट से एक नई परियोजना बनाता है जो आपकी परियोजना को शुरू करने के लिए ठीक से कॉन्फ़िगर किया गया है।",
"TieredOption": "एक ऐसा समाधान तैयार करता है जहाँ वेब और Http API परतें शारीरिक रूप से अलग हो जाती हैं। यदि जांच नहीं की जाती है, तो एक स्तरित समाधान बनाता है जो कम जटिल है और अधिकांश परिदृश्यों के लिए उपयुक्त है।",
"SeparateIdentityServerOption": "सर्वर एप्लिकेशन को दो अनुप्रयोगों में अलग करता है: पहला पहचान सर्वर के लिए है और दूसरा आपके सर्वर साइड HTTP एपीआई के लिए है।",
"UseslatestPreVersion": "नवीनतम पूर्व-रिलीज़ संस्करण का उपयोग करता है",
- "ReadTheDocumentation": "<स्पैन क्लास = \"टेक्स्ट-प्राइमरी\"> पढ़ें span> <स्पैन क्लास = \"टेक्स्ट-सक्सेस\"> डॉक्यूमेंटेशन span>",
+ "ReadTheDocumentation": "पढ़ेंदस्तावेज़ीकरण",
"Documentation": "प्रलेखन",
"GettingStartedTutorial": "स्टार्टिंग ट्यूटोरियल",
"ApplicationDevelopmentTutorial": "अनुप्रयोग विकास ट्यूटोरियल",
@@ -183,7 +183,7 @@
"InstallABPCLIInfo": "एबीपी सीएलआई एबीपी ढांचे के साथ एक नया समाधान शुरू करने का सबसे तेज़ तरीका है। कमांड लाइन विंडो का उपयोग करके ABP CLI स्थापित करें:",
"DifferentLevelOfNamespaces": "आप विभिन्न स्तरों के नामस्थानों का उपयोग कर सकते हैं; जैसे BookStore, Acme.BookStore या Acme.Retail.BookStore।",
"ABPCLIExamplesInfo": " नया strong> कमांड डेटाबेस प्रदाता के रूप में एंटिटी फ्रेमवर्क कोर strong> के साथ स्तरित MVC एप्लिकेशन strong> बनाता है। हालांकि, इसके पास अतिरिक्त विकल्प हैं। उदाहरण:",
- "SeeCliDocumentForMoreInformation": "अधिक विकल्पों के लिए ABP CLI दस्तावेज़ देखें या ऊपर \"डायरेक्ट डाउनलोड\" टैब चुनें।",
+ "SeeCliDocumentForMoreInformation": "अधिक विकल्पों के लिए ABP CLI दस्तावेज़ देखें या ऊपर \"डायरेक्ट डाउनलोड\" टैब चुनें।",
"Optional": "ऐच्छिक",
"LocalFrameworkRef": "फ्रेमवर्क पैकेज के लिए स्थानीय प्रोजेक्ट संदर्भ रखें।",
"BlobStoring": "ब्लॉब भंडारण",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/it.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/it.json
index e4cdc73bf2..35d86ceefb 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/it.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/it.json
@@ -155,7 +155,7 @@
"Code": "Codice",
"Result": "Risultato",
"SeeTheDocumentForMoreInformation": "Consulta il {0} documento per ulteriori informazioni",
- "IndexPageHeroSection": " open source Framework
applicazione web per asp.net core ",
+ "IndexPageHeroSection": " open source Framework
applicazione web per asp.net core ",
"UiFramework": "Framework dell'interfaccia utente",
"EmailAddress": "Indirizzo e-mail",
"Mobile": "Mobile",
@@ -175,7 +175,7 @@
"TieredOption": "Crea una soluzione a più livelli in cui i livelli API Web e Http sono fisicamente separati. Se non selezionata, crea una soluzione a più livelli meno complessa e adatta alla maggior parte degli scenari.",
"SeparateIdentityServerOption": "Separa il lato server in due applicazioni: la prima è per il server di identità e la seconda è per l'API HTTP lato server.",
"UseslatestPreVersion": "Utilizza l'ultima versione pre-rilascio",
- "ReadTheDocumentation": " Leggi La documentazione ",
+ "ReadTheDocumentation": " Leggi La documentazione ",
"Documentation": "Documentazione",
"GettingStartedTutorial": "Tutorial introduttivo",
"ApplicationDevelopmentTutorial": "Tutorial sullo sviluppo di applicazioni",
diff --git a/docs/en/Domain-Driven-Design.md b/docs/en/Domain-Driven-Design.md
index f18c1882ef..03a6232ba3 100644
--- a/docs/en/Domain-Driven-Design.md
+++ b/docs/en/Domain-Driven-Design.md
@@ -32,6 +32,6 @@ DDD mostly interest in the **Domain** and the **Application** layers, rather tha
* [Data Transfer Objects (DTOs)](Data-Transfer-Objects.md)
* [Unit of Work](Unit-Of-Work.md)
-## The Ultimate DDD Implementation Guide
+## Free E-Book: Implementing DDD
-See the [Implementing Domain Driven Design](Domain-Driven-Design-Implementation-Guide.md) guide as a **complete reference**. The Guide explains the Domain Driven Design and introduces explicit **rules and examples** to give a deep understanding of the **implementation details**.
\ No newline at end of file
+See the [Implementing Domain Driven Design book](https://abp.io/books/implementing-domain-driven-design) as a **complete reference**. This book explains the Domain Driven Design and introduces explicit **rules and examples** to give a deep understanding of the **implementation details**.
\ No newline at end of file
diff --git a/docs/en/Entity-Framework-Core.md b/docs/en/Entity-Framework-Core.md
index fcbf5d8091..f60fcfc490 100644
--- a/docs/en/Entity-Framework-Core.md
+++ b/docs/en/Entity-Framework-Core.md
@@ -604,23 +604,77 @@ ObjectExtensionManager.Instance
);
````
-If the related module has implemented this feature (by using the `ConfigureEfCoreEntity` explained below), then the new property is added to the model. Then you need to run the standard `Add-Migration` and `Update-Database` commands to update your database to add the new field.
+### MapEfCoreEntity
->`MapEfCoreProperty` method must be called before using the related `DbContext`. It is a static method. The best way is to use it in your application as earlier as possible. The application startup template has a `YourProjectNameEfCoreEntityExtensionMappings` class that is safe to use this method inside.
+`MapEfCoreEntity` is a shortcut extension method to configure the `Entity`.
-### ConfigureEfCoreEntity
+**Example**: Set the max length of `Name` to the `IdentityRole` entity:
-If you are building a reusable module and want to allow application developers to add properties to your entities, you can use the `ConfigureEfCoreEntity` extension method in your entity mapping. However, there is a shortcut extension method `ConfigureObjectExtensions` that can be used while configuring the entity mapping:
+````csharp
+ObjectExtensionManager.Instance
+ .MapEfCoreEntity(builder =>
+ {
+ builder.As>().Property(x => x.Name).HasMaxLength(200);
+ });
+````
+
+### MapEfCoreDbContext
+
+`MapEfCoreDbContext` is a shortcut extension method to configure the `DbContext`.
+
+**Example**: Set the max length of `Name` to the `IdentityRole` entity of `IdentityDbContext`:
````csharp
-builder.Entity(b =>
+ObjectExtensionManager.Instance.MapEfCoreDbContext(b =>
{
- b.ConfigureObjectExtensions();
- //...
+ b.Entity().Property(x => x.Name).HasMaxLength(200);
});
````
-> If you call `ConfigureByConvention()` extension method (like `b.ConfigureByConvention()` for this example), ABP Framework internally calls the `ConfigureObjectExtensions` method. It is a **best practice** to use the `ConfigureByConvention()` method since it also configures database mapping for base properties by convention.
+If the related module has implemented this feature(explained below), then the new property is added to the model or the DbContext/Entity configure changed. Then you need to run the standard `Add-Migration` and `Update-Database` commands to update your database to add the new field.
+
+> The `MapEfCoreProperty`, `MapEfCoreEntity` and `MapEfCoreDbContext` methods must be called before using the related `DbContext`. It is a static method. The best way is to use it in your application as earlier as possible. The application startup template has a `YourProjectNameEfCoreEntityExtensionMappings` class that is safe to use this method inside.
+
+### ConfigureEfCoreEntity, ApplyObjectExtensionMappings and TryConfigureObjectExtensions
+
+If you are building a reusable module and want to allow application developers to add properties to your entities, you can use the `ConfigureEfCoreEntity`, `ApplyObjectExtensionMappings` and `TryConfigureObjectExtensions` extension methods in your entity mapping.
+
+**Example**:
+````csharp
+public static class QADbContextModelCreatingExtensions
+{
+ public static void ConfigureQA(
+ this ModelBuilder builder,
+ Action optionsAction = null)
+ {
+ Check.NotNull(builder, nameof(builder));
+
+ var options = new QAModelBuilderConfigurationOptions(
+ QADatabaseDbProperties.DbTablePrefix,
+ QADatabaseDbProperties.DbSchema
+ );
+
+ optionsAction?.Invoke(options);
+
+ builder.Entity(b =>
+ {
+ b.ToTable(options.TablePrefix + "Questions", options.Schema);
+ b.ConfigureByConvention();
+ //...
+
+ //Call this in the end of buildAction.
+ b.ApplyObjectExtensionMappings();
+ });
+
+ //...
+
+ //Call this in the end of ConfigureQA.
+ builder.TryConfigureObjectExtensions();
+ }
+}
+````
+
+> If you call `ConfigureByConvention()` extension method (like `b.ConfigureByConvention()` for this example), ABP Framework internally calls the `ConfigureObjectExtensions` and `ConfigureEfCoreEntity` methods. It is a **best practice** to use the `ConfigureByConvention()` method since it also configures database mapping for base properties by convention.
See the "*ConfigureByConvention Method*" section above for more information.
@@ -812,4 +866,4 @@ public class MyCustomEfCoreBulkOperationProvider
## See Also
* [Entities](Entities.md)
-* [Repositories](Repositories.md)
\ No newline at end of file
+* [Repositories](Repositories.md)
diff --git a/docs/en/Index.md b/docs/en/Index.md
index de88e2f2f8..8483d61612 100644
--- a/docs/en/Index.md
+++ b/docs/en/Index.md
@@ -29,8 +29,9 @@ ABP has a **comprehensive documentation** that not only explains the ABP Framewo
ABP offers a complete, modular and layered software architecture based on [Domain Driven Design](Domain-Driven-Design.md) principles and patterns. It also provides the necessary infrastructure to implement this architecture.
* See the [Modularity](Module-Development-Basics.md) document to understand the module system.
-* [Implementing Domain Driven Design](Domain-Driven-Design-Implementation-Guide.md) document is an ultimate guide for who want to understand and implement the DDD.
+* [Implementing Domain Driven Design book](https://abp.io/books/implementing-domain-driven-design?ref=doc) is an ultimate guide for who want to understand and implement the DDD with the ABP Framework.
* [Microservice Architecture](Microservice-Architecture.md) document explains how ABP helps to create a microservice solution.
+* [Multi-Tenancy](Multi-Tenancy.md) document introduces multi-tenancy and explores the ABP multi-tenancy infrastructure.
### Infrastructure
@@ -55,6 +56,14 @@ See the [Application Modules](Modules/Index.md) document for all pre-built modul
The [Startup templates](Startup-Templates/Index.md) are pre-built Visual Studio solution templates. You can create your own solution based on these templates to **immediately start your development**.
+## Free E-Book: Implementing Domain Driven Design
+
+
+
+A **practical guide** for implementing Domain Driven Design (DDD). While the implementation details are **based on the ABP Framework** infrastructure, the basic concepts, principles and models can be applied to any solution, even if it is not a .NET solution.
+
+[Click here to get your free copy](https://abp.io/books/implementing-domain-driven-design?ref=doc).
+
## ABP Community
### The Source Code
diff --git a/docs/en/images/implementing-domain-driven-design-book.png b/docs/en/images/implementing-domain-driven-design-book.png
new file mode 100644
index 0000000000..6568b46f66
Binary files /dev/null and b/docs/en/images/implementing-domain-driven-design-book.png differ
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fi.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fi.json
index d6fb04eb4c..0547630188 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fi.json
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fi.json
@@ -10,4 +10,4 @@
"SwitchTenant": "Vaihda vuokralainen",
"NotSelected": "Ei valittu"
}
-}
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs
index ff7f4913a8..ca1ebef793 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs
@@ -4,6 +4,7 @@ using System.Linq;
using System.Reflection;
using System.Text;
using JetBrains.Annotations;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
@@ -102,6 +103,16 @@ namespace Volo.Abp.AspNetCore.Mvc
Logger.LogDebug($"ActionApiDescriptionModel.Create: {controllerModel.ControllerName}.{uniqueMethodName}");
+ bool? allowAnonymous = null;
+ if (apiDescription.ActionDescriptor.EndpointMetadata.Any(x => x is IAllowAnonymous))
+ {
+ allowAnonymous = true;
+ }
+ else if (apiDescription.ActionDescriptor.EndpointMetadata.Any(x => x is IAuthorizeData))
+ {
+ allowAnonymous = false;
+ }
+
var actionModel = controllerModel.AddAction(
uniqueMethodName,
ActionApiDescriptionModel.Create(
@@ -109,7 +120,8 @@ namespace Volo.Abp.AspNetCore.Mvc
method,
apiDescription.RelativePath,
apiDescription.HttpMethod,
- GetSupportedVersions(controllerType, method, setting)
+ GetSupportedVersions(controllerType, method, setting),
+ allowAnonymous
)
);
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpMvcAttributeValidationResultProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpMvcAttributeValidationResultProvider.cs
new file mode 100644
index 0000000000..c6a280cca3
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpMvcAttributeValidationResultProvider.cs
@@ -0,0 +1,46 @@
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using Microsoft.Extensions.Localization;
+using Microsoft.Extensions.Options;
+using Volo.Abp.AspNetCore.Mvc.Validation;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Validation;
+
+namespace Volo.Abp.AspNetCore.Mvc.Localization
+{
+ [Dependency(ReplaceServices = true)]
+ public class AbpMvcAttributeValidationResultProvider : DefaultAttributeValidationResultProvider
+ {
+ private readonly AbpMvcDataAnnotationsLocalizationOptions _abpMvcDataAnnotationsLocalizationOptions;
+ private readonly IStringLocalizerFactory _stringLocalizerFactory;
+
+ public AbpMvcAttributeValidationResultProvider(
+ IOptions abpMvcDataAnnotationsLocalizationOptions,
+ IStringLocalizerFactory stringLocalizerFactory)
+ {
+ _abpMvcDataAnnotationsLocalizationOptions = abpMvcDataAnnotationsLocalizationOptions.Value;
+ _stringLocalizerFactory = stringLocalizerFactory;
+ }
+
+ public override ValidationResult GetOrDefault(ValidationAttribute validationAttribute, object validatingObject, ValidationContext validationContext)
+ {
+ var resourceSource = _abpMvcDataAnnotationsLocalizationOptions.AssemblyResources.GetOrDefault(validationContext.ObjectType.Assembly);
+ if (resourceSource == null)
+ {
+ return base.GetOrDefault(validationAttribute, validatingObject, validationContext);
+ }
+
+ if (validationAttribute.ErrorMessage == null)
+ {
+ ValidationAttributeHelper.SetDefaultErrorMessage(validationAttribute);
+ }
+
+ if (validationAttribute.ErrorMessage != null)
+ {
+ validationAttribute.ErrorMessage = _stringLocalizerFactory.Create(resourceSource)[validationAttribute.ErrorMessage];
+ }
+
+ return base.GetOrDefault(validationAttribute, validatingObject, validationContext);
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs
index 6b559f4d3e..23fece372f 100644
--- a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs
@@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
+using Volo.Abp.AspNetCore.Auditing;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity;
@@ -30,6 +31,7 @@ namespace Volo.Abp.AspNetCore.SignalR
public override void ConfigureServices(ServiceConfigurationContext context)
{
+ var routePatterns = new List {"/signalr-hubs"};
var signalRServerBuilder = context.Services.AddSignalR();
context.Services.ExecutePreConfiguredActions(signalRServerBuilder);
@@ -45,6 +47,8 @@ namespace Volo.Abp.AspNetCore.SignalR
foreach (var hubConfig in signalROptions.Hubs)
{
+ routePatterns.AddIfNotContains(hubConfig.RoutePattern);
+
MapHubType(
hubConfig.HubType,
endpointContext.Endpoints,
@@ -60,6 +64,14 @@ namespace Volo.Abp.AspNetCore.SignalR
}
});
});
+
+ Configure(options =>
+ {
+ foreach (var routePattern in routePatterns)
+ {
+ options.IgnoredUrls.AddIfNotContains(x => routePattern.StartsWith(x), () => routePattern);
+ }
+ });
}
private void AutoAddHubTypes(IServiceCollection services)
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/FileMatchResult.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/FileMatchResult.cs
new file mode 100644
index 0000000000..cbaf9c52da
--- /dev/null
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/FileMatchResult.cs
@@ -0,0 +1,15 @@
+namespace Volo.Abp.Cli.LIbs
+{
+ public class FileMatchResult
+ {
+ public string Path { get; }
+
+ public string Stem { get; }
+
+ public FileMatchResult(string path, string stem)
+ {
+ Path = path;
+ Stem = stem;
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs
index bf84e4863c..5379c62aed 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs
@@ -110,19 +110,18 @@ namespace Volo.Abp.Cli.LIbs
foreach (var mapping in resourceMapping.Mappings)
{
var destPath = Path.Combine(fileDirectory, mapping.Value);
-
var files = FindFiles(fileDirectory, mapping.Key);
foreach (var file in files)
{
- var destFilePath = Path.Combine(destPath, Path.GetFileName(file));
+ var destFilePath = Path.Combine(destPath, file.Stem);
if (File.Exists(destFilePath))
{
continue;
}
- Directory.CreateDirectory(Path.GetFullPath(destPath));
- File.Copy(file, destFilePath);
+ Directory.CreateDirectory(Path.GetDirectoryName(destFilePath));
+ File.Copy(file.Path, destFilePath);
}
}
@@ -146,9 +145,9 @@ namespace Volo.Abp.Cli.LIbs
foreach (var file in files)
{
- if (File.Exists(file))
+ if (File.Exists(file.Path))
{
- File.Delete(file);
+ File.Delete(file.Path);
}
}
@@ -161,7 +160,7 @@ namespace Volo.Abp.Cli.LIbs
}
}
- private string[] FindFiles(string directory, params string[] patterns)
+ private List FindFiles(string directory, params string[] patterns)
{
var matcher = new Matcher();
@@ -179,7 +178,7 @@ namespace Volo.Abp.Cli.LIbs
var result = matcher.Execute(new DirectoryInfoWrapper(new DirectoryInfo(directory)));
- return result.Files.Select(x => Path.Combine(directory, x.Path)).ToArray();
+ return result.Files.Select(x => new FileMatchResult(Path.Combine(directory, x.Path), x.Stem)).ToList();
}
private string NormalizeGlob(string pattern)
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs
index ee172b3409..886d8e020c 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs
@@ -15,7 +15,7 @@ namespace Volo.Abp.DependencyInjection
public IServiceCollection Services { get; }
- public List ReplacedDbContextTypes { get; }
+ public Dictionary ReplacedDbContextTypes { get; }
public Type DefaultRepositoryDbContextType { get; protected set; }
@@ -39,7 +39,7 @@ namespace Volo.Abp.DependencyInjection
Services = services;
DefaultRepositoryDbContextType = originalDbContextType;
CustomRepositories = new Dictionary();
- ReplacedDbContextTypes = new List();
+ ReplacedDbContextTypes = new Dictionary();
SpecifiedDefaultRepositories = new List();
}
@@ -47,15 +47,20 @@ namespace Volo.Abp.DependencyInjection
{
return ReplaceDbContext(typeof(TOtherDbContext));
}
+
+ public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext()
+ {
+ return ReplaceDbContext(typeof(TOtherDbContext), typeof(TTargetDbContext));
+ }
- public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType)
+ public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType, Type targetDbContextType = null)
{
if (!otherDbContextType.IsAssignableFrom(OriginalDbContextType))
{
throw new AbpException($"{OriginalDbContextType.AssemblyQualifiedName} should inherit/implement {otherDbContextType.AssemblyQualifiedName}!");
}
- ReplacedDbContextTypes.AddIfNotContains(otherDbContextType);
+ ReplacedDbContextTypes[otherDbContextType] = targetDbContextType;
return this;
}
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs
index 34e74d90cd..248300ab62 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs
@@ -75,9 +75,17 @@ namespace Volo.Abp.DependencyInjection
IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext();
///
- /// Replaces given DbContext type with this DbContext type.
+ /// Replaces given DbContext type with the target DbContext type.
+ ///
+ /// The DbContext type to be replaced
+ /// The target DbContext type
+ IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext();
+
+ ///
+ /// Replaces given DbContext type with the given or this DbContext type.
///
/// The DbContext type to be replaced
- IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType);
+ /// The target DbContext type (optional, used this DbContext type if not provided)
+ IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType, Type targetDbContextType = null);
}
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs
index a48575ddcc..658269a376 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs
@@ -31,18 +31,21 @@ namespace Microsoft.Extensions.DependencyInjection
services.TryAddTransient(DbContextOptionsFactory.Create);
- foreach (var dbContextType in options.ReplacedDbContextTypes)
+ foreach (var entry in options.ReplacedDbContextTypes)
{
+ var originalDbContextType = entry.Key;
+ var targetDbContextType = entry.Value ?? typeof(TDbContext);
+
services.Replace(
ServiceDescriptor.Transient(
- dbContextType,
- sp => sp.GetRequiredService(typeof(TDbContext))
+ originalDbContextType,
+ sp => sp.GetRequiredService(targetDbContextType)
)
);
services.Configure(opts =>
{
- opts.DbContextReplacements[dbContextType] = typeof(TDbContext);
+ opts.DbContextReplacements[originalDbContextType] = targetDbContextType;
});
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
index 22f04542f1..9b488924e8 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
@@ -371,17 +371,20 @@ namespace Volo.Abp.EntityFrameworkCore
protected virtual void ApplyAbpConceptsForModifiedEntity(EntityEntry entry, EntityChangeReport changeReport)
{
- UpdateConcurrencyStamp(entry);
- SetModificationAuditProperties(entry);
-
- if (entry.Entity is ISoftDelete && entry.Entity.As().IsDeleted)
- {
- SetDeletionAuditProperties(entry);
- changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Deleted));
- }
- else
+ if (entry.State == EntityState.Modified && entry.Properties.Any(x => x.IsModified && x.Metadata.ValueGenerated == ValueGenerated.Never))
{
- changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Updated));
+ UpdateConcurrencyStamp(entry);
+ SetModificationAuditProperties(entry);
+
+ if (entry.Entity is ISoftDelete && entry.Entity.As().IsDeleted)
+ {
+ SetDeletionAuditProperties(entry);
+ changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Deleted));
+ }
+ else
+ {
+ changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Updated));
+ }
}
}
diff --git a/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/Domain/Entities/EntityNotFoundException.cs b/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/Domain/Entities/EntityNotFoundException.cs
index 85466ccf0e..c920e1e475 100644
--- a/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/Domain/Entities/EntityNotFoundException.cs
+++ b/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/Domain/Entities/EntityNotFoundException.cs
@@ -49,7 +49,7 @@ namespace Volo.Abp.Domain.Entities
public EntityNotFoundException(Type entityType, object id, Exception innerException)
: base(
id == null
- ? $"There is no such an entity given given id. Entity type: {entityType.FullName}"
+ ? $"There is no such an entity given id. Entity type: {entityType.FullName}"
: $"There is no such an entity. Entity type: {entityType.FullName}, id: {id}",
innerException)
{
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
index dd96ad98a2..a397f1b53e 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
@@ -156,14 +156,17 @@ namespace Volo.Abp.Http.Client.DynamicProxying
AddHeaders(invocation, action, requestMessage, apiVersion);
- await ClientAuthenticator.Authenticate(
- new RemoteServiceHttpClientAuthenticateContext(
- client,
- requestMessage,
- remoteServiceConfig,
- clientConfig.RemoteServiceName
- )
- );
+ if (action.AllowAnonymous != true)
+ {
+ await ClientAuthenticator.Authenticate(
+ new RemoteServiceHttpClientAuthenticateContext(
+ client,
+ requestMessage,
+ remoteServiceConfig,
+ clientConfig.RemoteServiceName
+ )
+ );
+ }
var response = await client.SendAsync(
requestMessage,
diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ActionApiDescriptionModel.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ActionApiDescriptionModel.cs
index 1ca0c28aa1..2901161259 100644
--- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ActionApiDescriptionModel.cs
+++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ActionApiDescriptionModel.cs
@@ -26,12 +26,14 @@ namespace Volo.Abp.Http.Modeling
public ReturnValueApiDescriptionModel ReturnValue { get; set; }
+ public bool? AllowAnonymous { get; set; }
+
public ActionApiDescriptionModel()
{
}
- public static ActionApiDescriptionModel Create([NotNull] string uniqueName, [NotNull] MethodInfo method, [NotNull] string url, [CanBeNull] string httpMethod, [NotNull] IList supportedVersions)
+ public static ActionApiDescriptionModel Create([NotNull] string uniqueName, [NotNull] MethodInfo method, [NotNull] string url, [CanBeNull] string httpMethod, [NotNull] IList supportedVersions, bool? allowAnonymous = null)
{
Check.NotNull(uniqueName, nameof(uniqueName));
Check.NotNull(method, nameof(method));
@@ -50,7 +52,8 @@ namespace Volo.Abp.Http.Modeling
.GetParameters()
.Select(MethodParameterApiDescriptionModel.Create)
.ToList(),
- SupportedVersions = supportedVersions
+ SupportedVersions = supportedVersions,
+ AllowAnonymous = allowAnonymous
};
}
diff --git a/framework/src/Volo.Abp.MemoryDb/Microsoft/Extensions/DependencyInjection/AbpMemoryDbServiceCollectionExtensions.cs b/framework/src/Volo.Abp.MemoryDb/Microsoft/Extensions/DependencyInjection/AbpMemoryDbServiceCollectionExtensions.cs
index 3cab95cb03..99ef1bd445 100644
--- a/framework/src/Volo.Abp.MemoryDb/Microsoft/Extensions/DependencyInjection/AbpMemoryDbServiceCollectionExtensions.cs
+++ b/framework/src/Volo.Abp.MemoryDb/Microsoft/Extensions/DependencyInjection/AbpMemoryDbServiceCollectionExtensions.cs
@@ -18,9 +18,17 @@ namespace Microsoft.Extensions.DependencyInjection
services.TryAddSingleton(options.DefaultRepositoryDbContextType, sp => sp.GetRequiredService());
}
- foreach (var dbContextType in options.ReplacedDbContextTypes)
+ foreach (var entry in options.ReplacedDbContextTypes)
{
- services.Replace(ServiceDescriptor.Singleton(dbContextType, sp => sp.GetRequiredService()));
+ var originalDbContextType = entry.Key;
+ var targetDbContextType = entry.Value ?? typeof(TMemoryDbContext);
+
+ services.Replace(
+ ServiceDescriptor.Singleton(
+ originalDbContextType,
+ sp => sp.GetRequiredService(targetDbContextType)
+ )
+ );
}
new MemoryDbRepositoryRegistrar(options).AddRepositories();
diff --git a/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs b/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs
index 7f9c6b8d42..c05dbe5b3a 100644
--- a/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs
+++ b/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs
@@ -25,23 +25,21 @@ namespace Microsoft.Extensions.DependencyInjection
optionsBuilder?.Invoke(options);
- foreach (var dbContextType in options.ReplacedDbContextTypes)
- {
- services.Replace(ServiceDescriptor.Transient(dbContextType, typeof(TMongoDbContext)));
- }
-
- foreach (var dbContextType in options.ReplacedDbContextTypes)
+ foreach (var entry in options.ReplacedDbContextTypes)
{
+ var originalDbContextType = entry.Key;
+ var targetDbContextType = entry.Value ?? typeof(TMongoDbContext);
+
services.Replace(
ServiceDescriptor.Transient(
- dbContextType,
- sp => sp.GetRequiredService(typeof(TMongoDbContext))
+ originalDbContextType,
+ sp => sp.GetRequiredService(targetDbContextType)
)
);
services.Configure(opts =>
{
- opts.DbContextReplacements[dbContextType] = typeof(TMongoDbContext);
+ opts.DbContextReplacements[originalDbContextType] = targetDbContextType;
});
}
diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs
index 878c03d629..7b4f8fda33 100644
--- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs
+++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs
@@ -89,6 +89,11 @@ namespace Volo.Abp.Uow
public virtual async Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
+ if (_isRolledback)
+ {
+ return;
+ }
+
foreach (var databaseApi in GetAllActiveDatabaseApis())
{
if (databaseApi is ISupportsSavingChanges)
diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DataAnnotationObjectValidationContributor.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DataAnnotationObjectValidationContributor.cs
index ae016e6954..912f68e4af 100644
--- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DataAnnotationObjectValidationContributor.cs
+++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DataAnnotationObjectValidationContributor.cs
@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Reflection;
@@ -120,9 +121,10 @@ namespace Volo.Abp.Validation
MemberName = property.Name
};
+ var attributeValidationResultProvider = ServiceProvider.GetRequiredService();
foreach (var attribute in validationAttributes)
{
- var result = attribute.GetValidationResult(property.GetValue(validatingObject), validationContext);
+ var result = attributeValidationResultProvider.GetOrDefault(attribute, property.GetValue(validatingObject), validationContext);
if (result != null)
{
errors.Add(result);
diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DefaultAttributeValidationResultProvider.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DefaultAttributeValidationResultProvider.cs
new file mode 100644
index 0000000000..f60a695b65
--- /dev/null
+++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/DefaultAttributeValidationResultProvider.cs
@@ -0,0 +1,13 @@
+using System.ComponentModel.DataAnnotations;
+using Volo.Abp.DependencyInjection;
+
+namespace Volo.Abp.Validation
+{
+ public class DefaultAttributeValidationResultProvider : IAttributeValidationResultProvider, ITransientDependency
+ {
+ public virtual ValidationResult GetOrDefault(ValidationAttribute validationAttribute, object validatingObject, ValidationContext validationContext)
+ {
+ return validationAttribute.GetValidationResult(validatingObject, validationContext);
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IAttributeValidationResultProvider.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IAttributeValidationResultProvider.cs
new file mode 100644
index 0000000000..a5fa367092
--- /dev/null
+++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IAttributeValidationResultProvider.cs
@@ -0,0 +1,9 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Volo.Abp.Validation
+{
+ public interface IAttributeValidationResultProvider
+ {
+ ValidationResult GetOrDefault(ValidationAttribute validationAttribute, object validatingObject, ValidationContext validationContext);
+ }
+}
diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs
index d1b1018e5c..ee1ca3572c 100644
--- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs
+++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs
@@ -1,9 +1,53 @@
-using Volo.Abp.TestApp.Testing;
+using System;
+using System.Threading.Tasks;
+using Shouldly;
+using Volo.Abp.TestApp;
+using Volo.Abp.TestApp.Testing;
+using Xunit;
namespace Volo.Abp.EntityFrameworkCore.Auditing
{
public class Auditing_Tests : Auditing_Tests
{
+ [Fact]
+ public async Task Should_Not_Set_Modification_If_Properties_Generated_By_Database()
+ {
+ await WithUnitOfWorkAsync((async () =>
+ {
+ var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId);
+ douglas.LastActiveTime = DateTime.Now;
+ }));
+ await WithUnitOfWorkAsync((async () =>
+ {
+ var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId);
+
+ douglas.ShouldNotBeNull();
+ douglas.LastModificationTime.ShouldBeNull();
+ douglas.LastModificationTime.ShouldBeNull();
+ douglas.LastModifierId.ShouldBeNull();
+ }));
+ }
+
+ [Fact]
+ public async Task Should_Set_Modification_If_Properties_Not_Generated_By_Database()
+ {
+ await WithUnitOfWorkAsync((async () =>
+ {
+ var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId);
+ douglas.LastActiveTime = DateTime.Now;
+ douglas.Age = 100;
+ }));
+
+ await WithUnitOfWorkAsync((async () =>
+ {
+ var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId);
+
+ douglas.ShouldNotBeNull();
+ douglas.LastModificationTime.ShouldNotBeNull();
+ douglas.LastModificationTime.Value.ShouldBeLessThanOrEqualTo(Clock.Now);
+ douglas.LastModifierId.ShouldBe(CurrentUserId);
+ }));
+ }
}
}
diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs
index 23137f0f0c..516c7d5789 100644
--- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs
+++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs
@@ -1,3 +1,4 @@
+using System;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.TestApp.SecondContext;
using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext;
@@ -16,10 +17,10 @@ namespace Volo.Abp.EntityFrameworkCore
public DbSet Books { get; set; }
public DbSet EntityWithIntPks { get; set; }
-
+
public DbSet Author { get; set; }
-
- public TestMigrationsDbContext(DbContextOptions options)
+
+ public TestMigrationsDbContext(DbContextOptions options)
: base(options)
{
@@ -36,6 +37,12 @@ namespace Volo.Abp.EntityFrameworkCore
b.HasKey(p => new { p.PersonId, p.Number });
});
+
+ modelBuilder.Entity(b =>
+ {
+ b.Property(x => x.LastActiveTime).ValueGeneratedOnAddOrUpdate().HasDefaultValue(DateTime.Now);
+ });
+
modelBuilder.Entity(b =>
{
b.OwnsMany(c => c.Districts, d =>
diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Transactions/Transaction_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Transactions/Transaction_Tests.cs
index 7d89da1a08..143aff73c0 100644
--- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Transactions/Transaction_Tests.cs
+++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Transactions/Transaction_Tests.cs
@@ -59,6 +59,9 @@ namespace Volo.Abp.EntityFrameworkCore.Transactions
await _personRepository.InsertAsync(new Person(personId, "Adam", 42));
await _unitOfWorkManager.Current.RollbackAsync();
+
+ //Will ignore this call.
+ await _unitOfWorkManager.Current.SaveChangesAsync();
});
var person = await _personRepository.FindAsync(personId);
diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs
index 6263c116b8..014c9c42db 100644
--- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs
+++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs
@@ -1,4 +1,5 @@
-using Microsoft.EntityFrameworkCore;
+using System;
+using Microsoft.EntityFrameworkCore;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Modeling;
@@ -46,6 +47,11 @@ namespace Volo.Abp.TestApp.EntityFrameworkCore
b.ApplyObjectExtensionMappings();
});
+ modelBuilder.Entity(b =>
+ {
+ b.Property(x => x.LastActiveTime).ValueGeneratedOnAddOrUpdate().HasDefaultValue(DateTime.Now);
+ });
+
modelBuilder
.Entity(p =>
{
diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs
index 9075740f11..f88e617072 100644
--- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs
+++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs
@@ -23,9 +23,10 @@ namespace Volo.Abp.TestApp.Domain
public virtual Collection Phones { get; set; }
+ public virtual DateTime LastActiveTime { get; set; }
+
private Person()
{
-
}
public Person(Guid id, string name, int age, Guid? tenantId = null, Guid? cityId = null)
@@ -65,4 +66,4 @@ namespace Volo.Abp.TestApp.Domain
);
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json
index 9162b467c0..9b4a2ff5df 100644
--- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json
+++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fi.json
@@ -43,7 +43,7 @@
"Description:Abp.Account.EnableLocalLogin": "Ilmaisee, salliko palvelin käyttäjien todentamisen paikallisella tilillä.",
"LoggedOutTitle": "Kirjautui ulos",
"LoggedOutText": "Sinut on kirjautunut ulos ja sinut ohjataan pian.",
- "ReturnToText": "Napsauta tätä palataksesi sovellukseen",
+ "ReturnToText": "Napsauta tätä ja ohjaa uudelleen osoitteeseen {0}",
"OrLoginWith": "Tai kirjaudu sisään:",
"ForgotPassword": "Unohtuiko salasana?",
"SendPasswordResetLink_Information": "Salasanan vaihtamislinkki lähetetään sähköpostiisi salasanan vaihtamiseksi. Jos et saa sähköpostia muutamassa minuutissa, yritä uudelleen.",
diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json
index 0c2ca19c63..66c31cf9fb 100644
--- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json
+++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hi.json
@@ -43,7 +43,7 @@
"Description:Abp.Account.EnableLocalLogin": "इंगित करता है कि सर्वर उपयोगकर्ताओं को स्थानीय खाते से प्रमाणित करने की अनुमति देगा।",
"LoggedOutTitle": "साइन आउट",
"LoggedOutText": "आपको साइन आउट कर दिया गया है और जल्द ही आपको पुनः निर्देशित किया जाएगा।",
- "ReturnToText": "आवेदन पर लौटने के लिए यहां क्लिक करें",
+ "ReturnToText": "{0} पर पुनर्निर्देशित करने के लिए यहां क्लिक करें",
"OrLoginWith": "या इसके साथ लॉगिन करें:",
"ForgotPassword": "पासवर्ड भूल गए?",
"SendPasswordResetLink_Information": "पासवर्ड रीसेट करने के लिए आपके ईमेल पर एक पासवर्ड रीसेट लिंक भेजा जाएगा। यदि आपको कुछ मिनटों के भीतर ईमेल नहीं मिलता है, तो कृपया पुनः प्रयास करें।",
diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json
index 5fa01af9d3..81f781192d 100644
--- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json
+++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/it.json
@@ -43,7 +43,7 @@
"Description:Abp.Account.EnableLocalLogin": "Indica se il server consentirà agli utenti di autenticarsi con un account locale.",
"LoggedOutTitle": "Disconnesso",
"LoggedOutText": "Sei stato disconnesso e verrai reindirizzato presto.",
- "ReturnToText": "Fare clic qui per tornare all'applicazione",
+ "ReturnToText": "Fai clic qui per reindirizzare a {0}",
"OrLoginWith": "Oppure accedi con:",
"ForgotPassword": "Ha dimenticato la password?",
"SendPasswordResetLink_Information": "Un link per reimpostare la password verrà inviato alla tua e-mail per reimpostare la password. Se non ricevi un'email entro pochi minuti, riprova.",
diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/ResetPasswordDto.cs b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/ResetPasswordDto.cs
index 2423e6c778..695fcfca91 100644
--- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/ResetPasswordDto.cs
+++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/ResetPasswordDto.cs
@@ -8,6 +8,8 @@ namespace Volo.Abp.Account
{
public Guid UserId { get; set; }
+ public Guid? TenantId { get; set; }
+
[Required]
public string ResetToken { get; set; }
diff --git a/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AccountAppService.cs b/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AccountAppService.cs
index 05ff98b35b..22c7e20b54 100644
--- a/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AccountAppService.cs
+++ b/modules/account/src/Volo.Abp.Account.Application/Volo/Abp/Account/AccountAppService.cs
@@ -62,16 +62,19 @@ namespace Volo.Abp.Account
public virtual async Task ResetPasswordAsync(ResetPasswordDto input)
{
- await IdentityOptions.SetAsync();
+ using (CurrentTenant.Change(input.TenantId))
+ {
+ await IdentityOptions.SetAsync();
- var user = await UserManager.GetByIdAsync(input.UserId);
- (await UserManager.ResetPasswordAsync(user, input.ResetToken, input.Password)).CheckErrors();
+ var user = await UserManager.GetByIdAsync(input.UserId);
+ (await UserManager.ResetPasswordAsync(user, input.ResetToken, input.Password)).CheckErrors();
- await IdentitySecurityLogManager.SaveAsync(new IdentitySecurityLogContext
- {
- Identity = IdentitySecurityLogIdentityConsts.Identity,
- Action = IdentitySecurityLogActionConsts.ChangePassword
- });
+ await IdentitySecurityLogManager.SaveAsync(new IdentitySecurityLogContext
+ {
+ Identity = IdentitySecurityLogIdentityConsts.Identity,
+ Action = IdentitySecurityLogActionConsts.ChangePassword
+ });
+ }
}
protected virtual async Task GetUserByEmail(string email)
diff --git a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/ResetPassword.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/ResetPassword.cshtml.cs
index c961fe7e14..6aed769f76 100644
--- a/modules/account/src/Volo.Abp.Account.Web/Pages/Account/ResetPassword.cshtml.cs
+++ b/modules/account/src/Volo.Abp.Account.Web/Pages/Account/ResetPassword.cshtml.cs
@@ -58,8 +58,6 @@ namespace Volo.Abp.Account.Web.Pages.Account
public virtual Task OnGetAsync()
{
- //TODO: It would be good to try to switch tenant if needed
- CheckCurrentTenant(TenantId);
return Task.FromResult(Page());
}
@@ -74,7 +72,8 @@ namespace Volo.Abp.Account.Web.Pages.Account
{
UserId = UserId,
ResetToken = ResetToken,
- Password = Password
+ Password = Password,
+ TenantId = TenantId
}
);
}
@@ -101,7 +100,8 @@ namespace Volo.Abp.Account.Web.Pages.Account
{
if (!Equals(Password, ConfirmPassword))
{
- ModelState.AddModelError("ConfirmPassword", L["'{0}' and '{1}' do not match.", "ConfirmPassword", "Password"]);
+ ModelState.AddModelError("ConfirmPassword",
+ L["'{0}' and '{1}' do not match.", "ConfirmPassword", "Password"]);
}
base.ValidateModel();
diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/hi.json b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/hi.json
index 11b63e96c3..1ba7d54dd5 100644
--- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/hi.json
+++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/hi.json
@@ -40,7 +40,7 @@
"PostDeletionWarningMessage": "पोस्ट हटा दी जाएगी।",
"BlogDeletionWarningMessage": "ब्लॉग डिलीट हो जाएगा।",
"AreYouSure": "क्या आपको यकीन है?",
- "CommentWithCount": "{शून्य टिप्पणियां",
+ "CommentWithCount": "{0} comments",
"Comment": "टिप्पणी",
"ShareOnTwitter": "ट्विटर पर साझा करें",
"CoverImage": "कवर छवि",
diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json
index 084cd76052..86390d433b 100644
--- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json
+++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json
@@ -15,12 +15,12 @@
"CmsKit.Tags": "टैग",
"CmsKit:0002": "सामग्री पहले से मौजूद है!",
"CmsKit:0003": "इकाई {0} टैग करने योग्य नहीं है।",
- "CmsKit:Blog:0001": "दिया गया स्लग ({स्लग}) पहले से मौजूद है!",
+ "CmsKit:Blog:0001": "दिया गया स्लग ({Slug}) पहले से मौजूद है!",
"CmsKit:BlogPost:0001": "दिया गया स्लग पहले से मौजूद है!",
"CmsKit:Comments:0001": "इकाई {EntityType} उल्लेखनीय नहीं है।",
- "CmsKit:Media:0001": "'{नाम}' एक मान्य मीडिया नाम नहीं है।",
+ "CmsKit:Media:0001": "'{Name}' एक मान्य मीडिया नाम नहीं है।",
"CmsKit:Media:0002": "इकाई में मीडिया नहीं हो सकता।",
- "CmsKit:Page:0001": "दिया गया url ({स्लग}) पहले से मौजूद है। कृपया अलग-अलग यूआरएल के साथ प्रयास करें।",
+ "CmsKit:Page:0001": "दिया गया url ({Slug}) पहले से मौजूद है। कृपया अलग-अलग यूआरएल के साथ प्रयास करें।",
"CmsKit:Rating:0001": "इकाई {EntityType} को रेट नहीं किया जा सकता।",
"CmsKit:Reaction:0001": "इकाई {EntityType} में प्रतिक्रियाएं नहीं हो सकती हैं।",
"CmsKit:Tag:0002": "इकाई टैग करने योग्य नहीं है!",
diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/fi.json b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/fi.json
index de3a96b5c9..bf2eb2b34d 100644
--- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/fi.json
+++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/fi.json
@@ -33,7 +33,7 @@
"Upd": "Päivitykset",
"NewExplanation": "Luotu kahden viime viikon aikana.",
"UpdatedExplanation": "Päivitetty kahden viime viikon aikana.",
- "Volo.Docs.Domain:010002": "Lyhytnimi {Lyhytnimi} on jo olemassa.",
+ "Volo.Docs.Domain:010002": "Lyhytnimi {ShortName} on jo olemassa.",
"Preview": "esikatselu",
"Search": "Hae",
"SearchResults": "Hakutulokset"
diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hi.json b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hi.json
index 4a6aa5909e..2daea29000 100644
--- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hi.json
+++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/hi.json
@@ -1,9 +1,9 @@
{
"culture": "hi",
"texts": {
- "Volo.IdentityServer:DuplicateIdentityResourceName": "पहचान संसाधन नाम पहले से मौजूद है: {नाम}",
- "Volo.IdentityServer:DuplicateApiResourceName": "आपी संसाधन नाम पहले से मौजूद है: {नाम}",
- "Volo.IdentityServer:DuplicateApiScopeName": "आपी स्कोप नाम पहले से मौजूद है: {नाम}",
+ "Volo.IdentityServer:DuplicateIdentityResourceName": "पहचान संसाधन नाम पहले से मौजूद है: {Name}",
+ "Volo.IdentityServer:DuplicateApiResourceName": "आपी संसाधन नाम पहले से मौजूद है: {Name}",
+ "Volo.IdentityServer:DuplicateApiScopeName": "आपी स्कोप नाम पहले से मौजूद है: {Name}",
"Volo.IdentityServer:DuplicateClientId": "ClientId पहले से मौजूद है: {ClientId}",
"UserLockedOut": "अमान्य लॉगिन प्रयासों के कारण उपयोगकर्ता खाता बंद कर दिया गया है। कृपया थोड़ी देर प्रतीक्षा करें और पुन: प्रयास करें।",
"InvalidUserNameOrPassword": "अमान्य उपयोगकर्ता नाम या पासवर्ड!",
diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts
index ea8a9dad8f..776785ed4c 100644
--- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts
+++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts
@@ -66,7 +66,7 @@ export interface ExtensionPropertyUiDto {
onTable: ExtensionPropertyUiTableDto;
onCreateForm: ExtensionPropertyUiFormDto;
onEditForm: ExtensionPropertyUiFormDto;
- lookup: ExtensionPropertyUiLookupDto;
+ lookup?: ExtensionPropertyUiLookupDto;
}
export interface ExtensionPropertyUiFormDto {
diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts b/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts
index c0581aae45..f9538a25eb 100644
--- a/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts
+++ b/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts
@@ -148,7 +148,7 @@ function createMockEntities(): Record
{
- options.AddPolicy(DefaultCorsPolicyName, builder =>
+ options.AddDefaultPolicy(builder =>
{
builder
.WithOrigins(
@@ -201,7 +199,7 @@ namespace MyCompanyName.MyProjectName
app.UseCorrelationId();
app.UseStaticFiles();
app.UseRouting();
- app.UseCors(DefaultCorsPolicyName);
+ app.UseCors();
app.UseAuthentication();
if (MultiTenancyConsts.IsEnabled)
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs
index cd696da65f..446ab2d8aa 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs
@@ -45,8 +45,6 @@ namespace MyCompanyName.MyProjectName
)]
public class MyProjectNameHttpApiHostModule : AbpModule
{
- private const string DefaultCorsPolicyName = "Default";
-
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
@@ -157,7 +155,7 @@ namespace MyCompanyName.MyProjectName
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
- options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
+ options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("it", "it", "Italian", "it"));
@@ -176,7 +174,7 @@ namespace MyCompanyName.MyProjectName
{
context.Services.AddCors(options =>
{
- options.AddPolicy(DefaultCorsPolicyName, builder =>
+ options.AddDefaultPolicy( builder =>
{
builder
.WithOrigins(
@@ -214,7 +212,7 @@ namespace MyCompanyName.MyProjectName
app.UseCorrelationId();
app.UseStaticFiles();
app.UseRouting();
- app.UseCors(DefaultCorsPolicyName);
+ app.UseCors();
app.UseAuthentication();
app.UseJwtTokenMiddleware();
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
index 843cf53e47..e1380703b5 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
@@ -45,8 +45,6 @@ namespace MyCompanyName.MyProjectName
)]
public class MyProjectNameIdentityServerModule : AbpModule
{
- private const string DefaultCorsPolicyName = "Default";
-
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
@@ -142,7 +140,7 @@ namespace MyCompanyName.MyProjectName
context.Services.AddCors(options =>
{
- options.AddPolicy(DefaultCorsPolicyName, builder =>
+ options.AddDefaultPolicy(builder =>
{
builder
.WithOrigins(
@@ -180,7 +178,7 @@ namespace MyCompanyName.MyProjectName
app.UseCorrelationId();
app.UseStaticFiles();
app.UseRouting();
- app.UseCors(DefaultCorsPolicyName);
+ app.UseCors();
app.UseAuthentication();
if (MultiTenancyConsts.IsEnabled)
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj
index ac94117417..0d21e37483 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj
@@ -28,7 +28,7 @@
-
+
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs
index 3ff7058579..148dcbcf06 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs
@@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Account;
+using MyCompanyName.MyProjectName.Blazor.WebAssembly;
using Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic;
using Volo.Abp.AspNetCore.Components.Web.Theming.Routing;
using Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme;
@@ -26,7 +27,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Host
typeof(AbpIdentityBlazorWebAssemblyModule),
typeof(AbpTenantManagementBlazorWebAssemblyModule),
typeof(AbpSettingManagementBlazorWebAssemblyModule),
- typeof(MyProjectNameBlazorModule)
+ typeof(MyProjectNameBlazorWebAssemblyModule)
)]
public class MyProjectNameBlazorHostModule : AbpModule
{
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
index 1a57ba090c..38e358507d 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
@@ -51,7 +51,6 @@ namespace MyCompanyName.MyProjectName
)]
public class MyProjectNameHttpApiHostModule : AbpModule
{
- private const string DefaultCorsPolicyName = "Default";
public override void ConfigureServices(ServiceConfigurationContext context)
{
@@ -132,7 +131,7 @@ namespace MyCompanyName.MyProjectName
context.Services.AddCors(options =>
{
- options.AddPolicy(DefaultCorsPolicyName, builder =>
+ options.AddDefaultPolicy(builder =>
{
builder
.WithOrigins(
@@ -169,7 +168,7 @@ namespace MyCompanyName.MyProjectName
app.UseCorrelationId();
app.UseStaticFiles();
app.UseRouting();
- app.UseCors(DefaultCorsPolicyName);
+ app.UseCors();
app.UseAuthentication();
if (MultiTenancyConsts.IsEnabled)
{
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
index 4b03b11412..658b93bf09 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
@@ -83,8 +83,6 @@ namespace MyCompanyName.MyProjectName
)]
public class MyProjectNameIdentityServerModule : AbpModule
{
- private const string DefaultCorsPolicyName = "Default";
-
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
@@ -159,7 +157,7 @@ namespace MyCompanyName.MyProjectName
context.Services.AddCors(options =>
{
- options.AddPolicy(DefaultCorsPolicyName, builder =>
+ options.AddDefaultPolicy(builder =>
{
builder
.WithOrigins(
@@ -196,7 +194,7 @@ namespace MyCompanyName.MyProjectName
app.UseCorrelationId();
app.UseStaticFiles();
app.UseRouting();
- app.UseCors(DefaultCorsPolicyName);
+ app.UseCors();
app.UseAuthentication();
app.UseJwtTokenMiddleware();