diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 4a993352ba..9553177c82 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -47,7 +47,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-dotnet@master with: - dotnet-version: 6.0.100 + dotnet-version: 7.0.100-rc.2.22477.23 - name: Build All run: .\build-all.ps1 -f diff --git a/Directory.Build.props b/Directory.Build.props index 03538ef037..ce8c79f366 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,13 +2,13 @@ - 6.0.5 + 7.0.0-rc.2.* - 6.0.5 + 7.0.0-rc.2.* - 6.0.0 + 7.0.0-rc.2.* 17.2.0 diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 7a064a8ce7..134d592df9 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -220,6 +220,7 @@ "SuccessfullyReIndexAllPosts": "All posts have been successfully reindexed.", "Permission:FullSearch": "Full text search", "Menu:CliAnalytics": "Cli Analytics", + "Menu:Reports": "Reports", "TemplateName": "Template name", "TemplateVersion": "Template version", "DatabaseProvider": "Database provider", @@ -231,8 +232,10 @@ "UiFramework": "Ui framework", "Options": "Options", "CliAnalytics": "Cli Analytics", + "Reports": "Reports", "Permission:CliAnalyticses": "Cli Analyticses", "Permission:CliAnalytics": "Cli Analytics", + "Permission:Reports": "Reports", "Search": "Search", "ClearFilter": "Clear filter", "LicensePrivateKey": "License private key", @@ -346,7 +349,7 @@ "AdditionalDeveloperCount": "Additional developer count", "LicensePrice": "License price", "PurchaseDate": "Purchase date", - "IsAbpBookDownloaded": "ABP book downloaded", + "IsAbpBookDownloaded": "Mastering ABP Book downloaded?", "IsMasteringAbpBookDownloadEnabled": "ABP Book download enabled", "Permission:Accounting:CustomPaymentLinkGenerator": "Custom Payment Link", "CustomPaymentLink": "Custom Payment Link", @@ -381,7 +384,7 @@ "PurchaseItems": "Purchase Items", "SuccessfullyUpdated": "Successfully updated", "SuccessfullyAdded": "Successfully added", - "PurchaseState": "Purchase State", + "PurchaseState": "Purchase status", "ShowBetweenDayCount": "Show Between Days", "PurchaseOrder": "Purchase Order", "ShowCreateInvoiceOfOrganization": "Create Invoice", @@ -399,6 +402,8 @@ "AllowFeatureUpgradeOnLicenseExpire": "Allow feature upgrade on license expire", "Deleted{0}": "[Deleted {0}]", "Tags": "Tags", - "SetTagsInfo": "Tags should be comma-separated. Eg: CSharp, Entity Framework" + "SetTagsInfo": "Tags should be comma-separated. Eg: CSharp, Entity Framework", + "RejectTrialLicenseWarningMessage": "Are you sure you want to reject this trial license request?", + "ExportToExcel": "Export to Excel" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json index b32a2f4572..8fb4eeb4e1 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json @@ -361,8 +361,8 @@ "ActivateTrialLicenseSuccessMessage": "Deneme lisansı başarıyla etkinleştirildi!", "PaymentRequestId": "Ödeme talep kimliği", "PurchaseDate": "Satın alma tarihi", - "IsAbpBookDownloaded": "Abp kitabı indirildi", - "IsMasteringAbpBookDownloadEnabled": "Abp kitabı indirme etkinleştirildi", + "IsAbpBookDownloaded": "Mastering ABP kitabı indirildi mi?", + "IsMasteringAbpBookDownloadEnabled": "Mastering ABP kitabı indirme etkinleştirildi", "Permission:Accounting:CustomPaymentLinkGenerator": "Özel Ödeme Bağlantısı", "CustomPaymentLink": "Özel Ödeme Bağlantısı", "Menu:CustomPaymentLink": "Özel Ödeme Bağlantısı", @@ -414,4 +414,4 @@ "Deleted{0}": "[{0} silindi]", "Permission:BookDiscount": "Kitap indirimleri" } -} \ No newline at end of file +} diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json index c7b91a99a0..383217f848 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json @@ -179,7 +179,7 @@ "ChangingLicenseTypeExplanation": "يمكنك الترقية إلى ترخيص أعلى عن طريق دفع الفرق خلال فترة الترخيص النشطة الخاصة بك. عند الترقية إلى خطة ترخيص أعلى ، تحصل على مزايا الخطة الجديدة ، لكن ترقية الترخيص لا تغير تاريخ انتهاء الترخيص. بالإضافة إلى ذلك ، يمكنك أيضًا إضافة مقاعد مطور جديدة إلى ترخيصك الحالي ، راجع \"كم عدد المطورين الذين يمكنهم العمل على ABP Commercial؟\"", "LicenseExtendUpgradeDiff": "ما الفرق بين تمديد الترخيص والترقية؟", "LicenseRenewalCost": "ما هي تكلفة تجديد الترخيص بعد عام واحد؟", - "LicenseRenewalCostExplanation": "معدل التجديد (التمديد) لجميع تراخيص ABP Commercial الدائمة هو {0} من قائمة أسعار التراخيص. سعر تجديد ترخيص الفريق القياسي هو $ {1} ورخصة العمل القياسية هي $ {2} وترخيص المؤسسة القياسي هو $ {3}. إذا كنت عميلاً بالفعل ، سجّل الدخول إلى حسابك لمراجعة أسعار التجديد المتاحة.", + "LicenseRenewalCostExplanation": "سعر تجديد (تمديد) رخصة الفريق الاساسية هو ${0}, رخصة العمل الاساسية هو ${1} ورخصة المؤسسة الاساسية هو${2}. ان كنت عميلا بالفعل, سجل الدخول الى حسابك لمراجعة سعر التجديد الحالي.", "HowDoIRenewMyLicense": "كيف أجدد الترخيص الخاص بي؟", "HowDoIRenewMyLicenseExplanation": "يمكنك تجديد ترخيصك بالانتقال إلى صفحة إدارة المؤسسة . للاستفادة من أسعار التجديد المبكر المخفضة الخاصة بنا ، تأكد من التجديد قبل انتهاء صلاحية ترخيصك. ومع ذلك ، لا تقلق بشأن عدم معرفة متى تنتهي فرصة التجديد المبكر الخاصة بك. ستتلقى 3 رسائل بريد إلكتروني للتذكير قبل انتهاء صلاحية اشتراكك. سنرسلها في غضون 30 يومًا و 7 أيام ويوم واحد قبل انتهاء الصلاحية.", "IsSourceCodeIncluded": "هل يتضمن ترخيصي الكود المصدري للوحدات والموضوعات التجارية؟", @@ -190,7 +190,7 @@ "ChangingDevelopers": "هل يمكنني تغيير المطورين المسجلين لمنظمتي في المستقبل؟", "ChangingDevelopersExplanation": "بالإضافة إلى إضافة مطورين جدد إلى الترخيص الخاص بك ، يمكنك أيضًا تغيير المطورين الحاليين (يمكنك إزالة مطور وإضافة مطور جديد إلى نفس المقعد) دون أي تكلفة إضافية.", "WhenShouldIRenewMyLicense": "متى يجب أن أجدد رخصتي؟", - "WhenShouldIRenewMyLicenseExplanation": "إذا جددت ترخيصك في غضون شهر واحد بعد انتهاء صلاحية الترخيص ، فسيتم تطبيق الخصومات التالية: ترخيص الفريق {0}٪ خصم ، ترخيص تجاري {1}٪ خصم ، ترخيص Enterprise {2}٪ خصم . إذا قمت بتجديد ترخيصك بعد شهر واحد من تاريخ انتهاء صلاحية الترخيص ، فسيكون سعر التجديد هو نفسه سعر شراء الترخيص ولن يكون هناك خصم على التجديد.", + "WhenShouldIRenewMyLicenseExplanation": "إذا قمت بتجديد ترخيصك في غضون شهر واحد بعد انتهاء صلاحية ترخيصك ، فسيتم تطبيق الخصومات التالية: ترخيص الفريق {0}؛ رخصة تجارية {1} ؛ ترخيص المؤسسة {2}. ومع ذلك ، إذا جددت ترخيصك بعد شهر واحد من تاريخ انتهاء صلاحية الترخيص ، فسيكون سعر التجديد هو نفسه سعر شراء الترخيص ولن يكون هناك خصم على التجديد.", "TrialPlan": "هل لديك خطة تجريبية؟", "DoYouAcceptBankWireTransfer": "هل تقبل التحويل البنكي؟", "DoYouAcceptBankWireTransferExplanation": "نعم ، نحن نقبل التحويل البنكي.
بعد إرسال رسوم الترخيص عبر التحويل المصرفي ، أرسل لنا بريدًا إلكترونيًا على accounting@abp.io إيصالك ونوع الترخيص المطلوب. معلومات حسابنا المصرفي الدولي:", @@ -360,7 +360,7 @@ "Next": "التالي", "StartTrial": "ابدأ الإصدار التجريبي المجاني", "ContactUsIssues": "اتصل بنا إذا كان لديك أي مشاكل", - "TrialActivatedWarning": "عزيزي {0} ، يحق للمستخدم الحصول على فترة تجريبية مجانية واحدة فقط. لقد استخدمت بالفعل الفترة التجريبية الخاصة بك.", + "TrialActivatedWarning": ".يحق للمستخدم الحصول على فترة تجريبية مجانية واحدة فقط. لقد استخدمت بالفعل الفترة التجريبية الخاصة بك", "SaveAndDownload": "حفظ وتنزيل", "CompanyNameValidationMessage": "اسم الشركة طويل جدا!", "AddressValidationMessage": "العنوان طويل جدا!", @@ -373,13 +373,14 @@ "TrialLicenseModelInvalidErrorMessage": "أحد الحقول التالية غير صالح: اسم البلد أو حجم الشركة أو الصناعة أو الغرض من الاستخدام.", "Trial": "محاكمة", "Purchased": "تم شراؤها", - "PurchaseLicense": "رخصة شراء", + "PurchaseLicense": "شراء {0} رخصة", "PurchaseTrialLicenseMessage": "تاريخ انتهاء الترخيص الخاص بك هو {0}.
إذا كنت ترغب في الاستمرار في استخدام المشاريع التي أنشأتها أثناء الفترة التجريبية المجانية ، فأنت بحاجة إلى تغيير مفاتيح الترخيص في ملفات appsettings.secrets.json الخاصة بك. هنا هو مفتاح الترخيص الخاص بك:", "TrialLicenseExpireMessage": "أنت تستخدم الترخيص التجريبي وستنتهي صلاحية الترخيص التجريبي في {0}.", "TryForFree": "حاول مجانا", "TrialLicenseExpiredInfo": "انتهت فترة الترخيص التجريبي الخاص بك!", "CommercialNewsletterConfirmationMessage": "أوافق على البنود والشروط و سياسة الخصوصية .", "RenewLicenseEarly": "إذا قمت بتجديد رخصتي في وقت مبكر ، هل سأحصل على السنة كاملة؟", - "RenewLicenseEarylExplanation": "عند تجديد الترخيص الخاص بك قبل تاريخ انتهاء الترخيص الخاص بك ، ستتم إضافة سنة واحدة إلى تاريخ انتهاء الترخيص الخاص بك. على سبيل المثال ، إذا انتهت صلاحية ترخيصك في {0} -06-06 وقمت بتجديده في {0} -01-01 ، فسيكون تاريخ انتهاء صلاحية الترخيص الجديد {1} -06-06." + "RenewLicenseEarylExplanation": "عند تجديد الترخيص الخاص بك قبل تاريخ انتهاء الترخيص الخاص بك ، ستتم إضافة سنة واحدة إلى تاريخ انتهاء الترخيص الخاص بك. على سبيل المثال ، إذا انتهت صلاحية ترخيصك في {0} -06-06 وقمت بتجديده في {0} -01-01 ، فسيكون تاريخ انتهاء صلاحية الترخيص الجديد {1} -06-06.", + "discountForYears": "{0}٪ خصم لمدة {1} سنة (سنوات)" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json index e6bd74a250..96c9d86622 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Mohu v budoucnu změnit registrované vývojáře své organizace?", "ChangingDevelopersExplanation": "Kromě přidání nových vývojářů do vaší licence můžete také změnit stávající vývojáře (můžete odebrat vývojáře a přidat nového na stejné místo) bez jakýchkoli dalších nákladů.", "WhenShouldIRenewMyLicense": "Kdy bych měl obnovit licenci?", - "WhenShouldIRenewMyLicenseExplanation": "Pokud si licenci obnovíte do 1 měsíce po vypršení platnosti licence, budou uplatněny následující slevy: Týmová licence {0}% sleva, Obchodní licence {1}% sleva, Enterprise License {2}% sleva . Pokud si licenci obnovíte 1 měsíc po datu vypršení platnosti vaší licence, cena za obnovení bude stejná jako cena nákupu licence a na obnovení nebude poskytnuta žádná sleva.", + "WhenShouldIRenewMyLicenseExplanation": "Pokud si licenci obnovíte do 1 měsíce po vypršení platnosti licence, budou uplatněny následující slevy: Týmová licence {0}; Obchodní licence {1}; Enterprise Licence {2}. Pokud však licenci obnovíte po 1 měsíci od data vypršení platnosti vaší licence, cena za obnovení bude stejná jako cena za zakoupení licence a na obnovení nebude poskytnuta žádná sleva.", "TrialPlan": "Máte zkušební plán?", "DoYouAcceptBankWireTransfer": "Přijímáte bankovní převod?", "DoYouAcceptBankWireTransferExplanation": "Ano, přijímáme bankovní převod.
Po zaslání licenčního poplatku bankovním převodem nám zašlete e-mail na adresu accounting@abp.io potvrzení a požadovaný typ licence. Informace o našem mezinárodním bankovním účtu:", @@ -360,7 +360,7 @@ "Next": "další", "StartTrial": "Spusťte bezplatnou zkušební verzi", "ContactUsIssues": "Pokud máte nějaké problémy, kontaktujte nás", - "TrialActivatedWarning": "Vážený uživateli {0}, uživatel má nárok pouze na 1 bezplatné zkušební období. Zkušební období jste již využili.", + "TrialActivatedWarning": "Uživatel má nárok pouze na 1 bezplatné zkušební období. Zkušební období jste již využili.", "SaveAndDownload": "Uložit a stáhnout", "CompanyNameValidationMessage": "Název společnosti je příliš dlouhý!", "AddressValidationMessage": "Adresa je příliš dlouhá!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Jedno z následujících polí je neplatné: Název země, Velikost společnosti, Odvětví nebo Účel použití.", "Trial": "zkušební", "Purchased": "Zakoupeno", - "PurchaseLicense": "Koupit licenci", + "PurchaseLicense": "Zakoupit licenci {0}", "PurchaseTrialLicenseMessage": "Datum vypršení platnosti vaší licence je {0}.
Chcete-li nadále používat projekty, které jste vytvořili během bezplatného zkušebního období, musíte změnit licenční klíče ve svých souborech appsettings.secrets.json. Zde je váš licenční klíč:", "TrialLicenseExpireMessage": "Používáte zkušební licenci a platnost vaší zkušební licence vyprší dne {0}.", "TryForFree": "Zkus zadarmo", @@ -381,6 +381,7 @@ "CommercialNewsletterConfirmationMessage": "I agree to the Terms & Conditions and Privacy Policy.", "ContinueWithNewOrganization": "Pokračujte s novou organizací", "RenewLicenseEarly": "Pokud si předčasně obnovím licenci, dostanu celý rok?", - "RenewLicenseEarylExplanation": "Když obnovíte licenci před datem vypršení platnosti licence, bude k datu vypršení platnosti licence přidán 1 rok. Pokud například platnost vaší licence vyprší dne {0}-06-06 a obnovíte ji dne {0}-01-01, bude vaše nové datum vypršení platnosti licence {1}-06-06." + "RenewLicenseEarylExplanation": "Když obnovíte licenci před datem vypršení platnosti licence, bude k datu vypršení platnosti licence přidán 1 rok. Pokud například platnost vaší licence vyprší dne {0}-06-06 a obnovíte ji dne {0}-01-01, bude vaše nové datum vypršení platnosti licence {1}-06-06.", + "discountForYears": "{0}% sleva po dobu {1} let" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de-DE.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de-DE.json index 80383fdde6..005a998c69 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de-DE.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de-DE.json @@ -360,7 +360,7 @@ "Next": "Nächste", "StartTrial": "Starten Sie meine kostenlose Testversion", "ContactUsIssues": "Kontaktieren Sie uns, wenn Sie irgendwelche Probleme haben", - "TrialActivatedWarning": "Sehr geehrte(r) {0}, ein Nutzer hat nur 1 kostenlosen Testzeitraum. Sie haben Ihren Testzeitraum bereits genutzt.", + "TrialActivatedWarning": "Ein Benutzer hat nur Anspruch auf 1 kostenlose Testphase. Sie haben Ihre Testphase bereits genutzt.", "SaveAndDownload": "Speichern und herunterladen", "CompanyNameValidationMessage": "Firmenname ist zu lang!", "AddressValidationMessage": "Adresse ist zu lang!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Eines der folgenden Felder ist ungültig: Ländername, Unternehmensgröße, Branche oder Verwendungszweck.", "Trial": "Versuch", "Purchased": "Gekauft", - "PurchaseLicense": "Lizenz kaufen", + "PurchaseLicense": "Kaufe {0} Lizenz", "PurchaseTrialLicenseMessage": "Das Ablaufdatum Ihrer Lizenz ist {0}.
Wenn Sie die Projekte, die Sie während Ihres kostenlosen Testzeitraums erstellt haben, weiterhin verwenden möchten, müssen Sie die Lizenzschlüssel in Ihren appsettings.secrets.json-Dateien ändern. Hier ist Ihr Lizenzschlüssel:", "TrialLicenseExpireMessage": "Sie verwenden die Testlizenz und Ihre Testlizenz läuft am {0} ab.", "TryForFree": "Kostenlos testen", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 39e5084e92..1c10aebd66 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -202,10 +202,11 @@ "WhatHappensWhenLicenseEndsExplanation4": "You can not install new modules and themes added to the ABP Commercial platform after your license ends.", "WhatHappensWhenLicenseEndsExplanation5": "You can not use the ABP Suite.", "WhatHappensWhenLicenseEndsExplanation6": "You can not get the premium support anymore.", - "WhatHappensWhenLicenseEndsExplanation7": "You can extend (renew) your license if you want to continue getting these benefits. If you extend your license within 1 month after your license expires, the following discounts will be applied: Team License {0}% discount, Business License {1}% discount, Enterprise License {2}% discount.", + "WhatHappensWhenLicenseEndsExplanation7": "You can extend (renew) your license if you want to continue getting these benefits. If you extend your license within 1 month after your license expires, the following discounts will be applied: Team License {0}; Business License {1}; Enterprise License {2}.", + "discountForYears": "{0}% discount for {1} year(s)", "WhatHappensWhenLicenseEndsExplanation8": "The ABP projects you generated are not stored on our servers. Therefore, it is your responsibility to keep the source code you download. When your license expires, there's no way to get your generated ABP project source code.", "WhenShouldIRenewMyLicense": "When should I renew my license?", - "WhenShouldIRenewMyLicenseExplanation": "If you renew your license within 1 month after your license expires, the following discounts will be applied: Team License {0}% discount, Business License {1}% discount, Enterprise License {2}% discount. However, if you renew your license after 1 month since the expiry date of your license, the renewal price will be the same as the license purchase price and there will be no discount on your renewal.", + "WhenShouldIRenewMyLicenseExplanation": "If you renew your license within 1 month after your license expires, the following discounts will be applied: Team License {0}; Business License {1}; Enterprise License {2}. However, if you renew your license after 1 month since the expiry date of your license, the renewal price will be the same as the license purchase price and there will be no discount on your renewal.", "TrialPlan": "Do you have a trial plan?", "TrialPlanExplanation": "It has a 14 days trial period for the ABP Commercial team license. For more information visit here. Furthermore, for the Team licenses we provide a 30 days money-back guarantee. You can just request a refund in the first 30 days. For the Business and Enterprise licenses, we provide 60% refund in 30 days. This is because Business and Enterprise licenses include the full source code of all the modules and the themes.", "DoYouAcceptBankWireTransfer": "Do you accept bank wire transfers?", @@ -268,7 +269,7 @@ "SeeABPSuiteDocument": "Check out the ABP Suite document to learn the usage of ABP Suite.", "AskQuestionsOnSupport": "You can ask questions on ABP Commercial Support.", "Documentation": "Documentation", - "SeeModulesDocument": "Check out the modules document for a list of all the commercial(pro) modules and their documents.", + "SeeModulesDocument": "See the modules page for a list of all the PRO modules.", "Pricing": "Pricing", "PricingExplanation": "Choose the features and functionality your business needs today. Easily upgrade as your business grows.", "Team": "Team", @@ -564,7 +565,7 @@ "MyOrganizations_Detail_PaymentProviderInfo": "If you have purchased your license through {0} gateway, it sends the PDF invoice to your email address, see {0} invoicing.", "MyOrganizations_Detail_PayUInfo": "If you have purchased through the PayU gateway, click the \"Request Invoice\" button and fill in the billing information.", "MyOrganizations_Detail_ConclusionInfo": "Your invoice request will be concluded within {0} business days.", - "ExtendYourLicense": "Extend your {0} license", + "ExtendYourLicense": "Extend your {0} license", "Continue": "Continue", "PurchaseLicense": "Purchase {0} license", "DownloadInvoiceModal_DownloadInvoice": "Download Invoice", @@ -745,6 +746,14 @@ "OnlineReviewersOnAbpCommercial": "Online Reviews on ABP Commercial", "SeeWhatToldAboutAbpCommercial": "See what has been told about ABP Commercial and write your thoughts if you want.", "BlazoriseLicense": "Do we need to buy Blazorise license?", - "BlazoriseLicenseExplanation": "We have an agreement between Volosoft and Megabit, with this agreement Blazorise license is bundled with ABP Commercial products therefore our customers do not need to purchase an extra Blazorise license." + "BlazoriseLicenseExplanation": "We have an agreement between Volosoft and Megabit, with this agreement Blazorise license is bundled with ABP Commercial products therefore our customers do not need to purchase an extra Blazorise license.", + "ExtendPaymentInfoSection_DeveloperPrice": "{0} x Developer(s) Price", + "ExtendPaymentInfoSection_DiscountRate": "Discount {0}%", + "TotalNetPrice": "Total Net Price", + "EFCore": "Entity Framework Core", + "All": "All", + "Mvc": "MVC", + "DataBaseProvider": "Data Provider", + "UIFramework": "UI Framework" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json index 1b0e6b6355..25cde69859 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json @@ -360,7 +360,7 @@ "Next": "próximo", "StartTrial": "Iniciar mi prueba gratuita", "ContactUsIssues": "Contáctanos si tienes algún problema", - "TrialActivatedWarning": "Estimado {0}, un usuario tiene derecho a tener solo 1 período de prueba gratuito. Ya usaste tu período de prueba.", + "TrialActivatedWarning": "Un usuario tiene derecho a tener solo 1 período de prueba gratuito. Ya utilizó su período de prueba.", "SaveAndDownload": "Guardar y descargar", "CompanyNameValidationMessage": "¡El nombre de la empresa es demasiado largo!", "AddressValidationMessage": "¡La dirección es demasiado larga!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Uno de los siguientes campos no es válido: nombre del país, tamaño de la empresa, sector o finalidad de uso.", "Trial": "Prueba", "Purchased": "Comprado", - "PurchaseLicense": "Licencia de compra", + "PurchaseLicense": "Comprar {0} licencia", "PurchaseTrialLicenseMessage": "La fecha de vencimiento de su licencia es {0}.
Si desea continuar usando los proyectos que creó durante su período de prueba gratuito, debe cambiar las claves de licencia en sus archivos appsettings.secrets.json . Aquí está su clave de licencia:", "TrialLicenseExpireMessage": "Está utilizando la licencia de prueba y su licencia de prueba caducará el {0}.", "TryForFree": "Prueba gratis", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json index a0444a4891..d5cee69946 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Voinko muuttaa organisaationi rekisteröityneitä kehittäjiä tulevaisuudessa?", "ChangingDevelopersExplanation": "Uusien kehittäjien lisäämisen lisenssiin lisäksi voit myös muuttaa olemassa olevia kehittäjiä (voit poistaa kehittäjän ja lisätä uuden samalle paikalle) ilman lisäkustannuksia.", "WhenShouldIRenewMyLicense": "Milloin minun pitäisi uusia lisenssini?", - "WhenShouldIRenewMyLicenseExplanation": "Jos uusit lisenssisi 1 kuukauden kuluessa lisenssin vanhenemisesta, seuraavat alennukset sovelletaan: Team License {0} % alennus, Business License {1} % alennus, Enterprise License {2} % alennus . Jos uusit lisenssisi 1 kuukauden lisenssin päättymispäivän jälkeen, uusimishinta on sama kuin lisenssin ostohinta, eikä uusimisesta saa alennusta.", + "WhenShouldIRenewMyLicenseExplanation": "Jos uusit lisenssisi 1 kuukauden kuluessa lisenssin vanhenemisesta, seuraavat alennukset sovelletaan: Team License {0} ; Business License {1} ; Enterprise License {2} ; . Jos uusit lisenssisi 1 kuukauden lisenssin päättymispäivän jälkeen, uusimishinta on sama kuin lisenssin ostohinta, eikä uusimisesta saa alennusta.", "TrialPlan": "Onko sinulla kokeilusuunnitelma?", "DoYouAcceptBankWireTransfer": "Hyväksytkö pankkisiirron?", "DoYouAcceptBankWireTransferExplanation": "Kyllä, hyväksymme pankkisiirron.
Kun olet lähettänyt lisenssimaksun pankkisiirrolla, lähetä meille sähköposti osoitteeseen accounting@abp.io kuittisi ja pyydetty lisenssityyppi. Kansainväliset pankkitilitietomme:", @@ -360,7 +360,7 @@ "Next": "Seuraava", "StartTrial": "Aloita ilmainen kokeilujaksoni", "ContactUsIssues": "Ota yhteyttä, jos sinulla on ongelmia", - "TrialActivatedWarning": "Hyvä {0}, käyttäjällä on oikeus vain yhteen ilmaiseen kokeilujaksoon. Olet jo käyttänyt kokeilujaksosi.", + "TrialActivatedWarning": "Käyttäjällä on oikeus vain yhteen ilmaiseen kokeilujaksoon. Olet jo käyttänyt kokeilujaksosi.", "SaveAndDownload": "Tallenna ja lataa", "CompanyNameValidationMessage": "Yrityksen nimi on liian pitkä!", "AddressValidationMessage": "Osoite on liian pitkä!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Yksi seuraavista kentistä on virheellinen: maan nimi, yrityksen koko, toimiala tai käyttötarkoitus.", "Trial": "Oikeudenkäynti", "Purchased": "Osti", - "PurchaseLicense": "Osta Lisenssi", + "PurchaseLicense": "Osta {0} lisenssi", "PurchaseTrialLicenseMessage": "Lisenssisi viimeinen voimassaolopäivä on {0}.
Jos haluat jatkaa ilmaisen kokeilujakson aikana luomiesi projektien käyttöä, sinun on vaihdettava lisenssiavaimet appsettings.secrets.json-tiedostoissasi. Tässä on lisenssiavaimesi:", "TrialLicenseExpireMessage": "Käytät kokeiluversiota, ja kokeilukäyttölupasi vanhenee {0}.", "TryForFree": "Kokeile ilmaiseksi", @@ -381,6 +381,7 @@ "CommercialNewsletterConfirmationMessage": "Hyväksyn käyttöehdot ja tietosuojakäytännön .", "ContinueWithNewOrganization": "Jatka uudessa organisaatiossa", "RenewLicenseEarly": "Jos uusin ajokorttini etuajassa, saanko koko vuoden?", - "RenewLicenseEarylExplanation": "Kun uusit lisenssisi ennen lisenssin vanhenemispäivää, lisenssin voimassaolopäivään lisätään 1 vuosi. Jos lisenssisi vanhenee esimerkiksi {0}-06-06 ja uusit sen {0}-01-01, uusi lisenssisi päättymispäivä on {1}-06-06." + "RenewLicenseEarylExplanation": "Kun uusit lisenssisi ennen lisenssin vanhenemispäivää, lisenssin voimassaolopäivään lisätään 1 vuosi. Jos lisenssisi vanhenee esimerkiksi {0}-06-06 ja uusit sen {0}-01-01, uusi lisenssisi päättymispäivä on {1}-06-06.", + "discountForYears": "{0}% de remise pendant {1} an(s)" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json index 96a00979fa..8b1be51495 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Puis-je changer les développeurs enregistrés de mon organisation à l'avenir?", "ChangingDevelopersExplanation": "En plus d'ajouter de nouveaux développeurs à votre licence, vous pouvez également modifier les développeurs existants (vous pouvez supprimer un développeur et en ajouter un nouveau sur le même siège) sans aucun coût supplémentaire.", "WhenShouldIRenewMyLicense": "Quand dois-je renouveler ma licence?", - "WhenShouldIRenewMyLicenseExplanation": "Si vous renouvelez votre licence dans un délai de 1 mois après l'expiration de votre licence, les remises suivantes seront appliquées : licence d'équipe {0} % de remise, licence d'entreprise {1} % de remise, licence d'entreprise {2} % de remise . Si vous renouvelez votre licence 1 mois après la date d'expiration de votre licence, le prix de renouvellement sera le même que le prix d'achat de la licence et il n'y aura aucune remise sur votre renouvellement.", + "WhenShouldIRenewMyLicenseExplanation": "Si vous renouvelez votre licence dans 1 mois après l'expiration de votre licence, les remises suivantes seront appliquées : licence d'équipe {0} ; licence commerciale {1} ; licence d'entreprise {2}. Toutefois, si vous renouveler votre licence après 1 mois depuis la date d'expiration de votre licence, le prix de renouvellement sera le même que le prix d'achat de la licence et il n'y aura pas de remise sur votre renouvellement.", "TrialPlan": "Avez-vous un plan d'essai?", "DoYouAcceptBankWireTransfer": "Acceptez-vous les virements bancaires?", "DoYouAcceptBankWireTransferExplanation": "Oui, nous acceptons les virements bancaires.
Après avoir envoyé les frais de licence par virement bancaire, envoyez-nous par e-mail à accounting@abp.io votre reçu et le type de licence demandé. Nos coordonnées bancaires internationales :", @@ -360,7 +360,7 @@ "Next": "Prochain", "StartTrial": "Commencer mon essai gratuit", "ContactUsIssues": "Contactez-nous si vous avez des problèmes", - "TrialActivatedWarning": "Cher {0}, un utilisateur n'a droit qu'à une seule période d'essai gratuite. Vous avez déjà utilisé votre période d'essai.", + "TrialActivatedWarning": "Un utilisateur n'a droit qu'à 1 période d'essai gratuite. Vous avez déjà utilisé votre période d'essai.", "SaveAndDownload": "Enregistrer et télécharger", "CompanyNameValidationMessage": "Le nom de l'entreprise est trop long !", "AddressValidationMessage": "L'adresse est trop longue !", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "L'un des champs suivants n'est pas valide : Nom du pays, Taille de l'entreprise, Secteur d'activité ou Objet de l'utilisation.", "Trial": "Essai", "Purchased": "Acheté", - "PurchaseLicense": "Licence d'achat", + "PurchaseLicense": "Acheter la licence {0}", "PurchaseTrialLicenseMessage": "La date d'expiration de votre licence est {0}.
Si vous souhaitez continuer à utiliser les projets que vous avez créés pendant votre période d'essai gratuite, vous devez modifier les clés de licence dans vos fichiers appsettings.secrets.json. Voici votre clé de licence :", "TrialLicenseExpireMessage": "Vous utilisez la licence d'essai et votre licence d'essai expirera le {0}.", "TryForFree": "Essayer gratuitement", @@ -381,6 +381,7 @@ "CommercialNewsletterConfirmationMessage": "J'accepte les Conditions générales et la Politique de confidentialité .", "ContinueWithNewOrganization": "Continuer avec une nouvelle organisation", "RenewLicenseEarly": "Si je renouvelle ma licence plus tôt, obtiendrai-je l'année complète ?", - "RenewLicenseEarylExplanation": "Lorsque vous renouvelez votre licence avant la date d'expiration de votre licence, 1 an sera ajouté à la date d'expiration de votre licence. Par exemple, si votre licence expire le {0}-06-06 et que vous la renouvelez le {0}-01-01, la nouvelle date d'expiration de votre licence sera le {1}-06-06." + "RenewLicenseEarylExplanation": "Lorsque vous renouvelez votre licence avant la date d'expiration de votre licence, 1 an sera ajouté à la date d'expiration de votre licence. Par exemple, si votre licence expire le {0}-06-06 et que vous la renouvelez le {0}-01-01, la nouvelle date d'expiration de votre licence sera le {1}-06-06.", + "discountForYears": "{0} % de remise pendentif {1} an(s)" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json index 6b9170eeae..09958d3c98 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "क्या मैं भविष्य में अपने संगठन के पंजीकृत डेवलपर्स को बदल सकता हूं?", "ChangingDevelopersExplanation": "अपने लाइसेंस में नए डेवलपर्स को जोड़ने के अलावा, आप मौजूदा डेवलपर्स को भी बदल सकते हैं (आप एक डेवलपर को हटा सकते हैं और एक ही सीट पर एक नया जोड़ सकते हैं) बिना किसी अतिरिक्त लागत के।", "WhenShouldIRenewMyLicense": "मुझे अपना लाइसेंस कब नवीनीकृत करना चाहिए?", - "WhenShouldIRenewMyLicenseExplanation": "यदि आप अपने लाइसेंस की समय सीमा समाप्त होने के बाद 1 महीने के भीतर अपना लाइसेंस नवीनीकृत करते हैं, तो निम्नलिखित छूटें लागू होंगी: टीम लाइसेंस {0}% छूट, व्यवसाय लाइसेंस {1}% छूट, एंटरप्राइज़ लाइसेंस {2}% छूट . यदि आप अपने लाइसेंस की समाप्ति तिथि के बाद 1 महीने अपने लाइसेंस का नवीनीकरण करते हैं, तो नवीनीकरण मूल्य लाइसेंस खरीद मूल्य के समान होगा और आपके नवीनीकरण पर कोई छूट नहीं होगी।", + "WhenShouldIRenewMyLicenseExplanation": "यदि आप अपने लाइसेंस की समय सीमा समाप्त होने के बाद 1 महीने के भीतर अपना लाइसेंस नवीनीकृत करते हैं, तो निम्नलिखित छूटें लागू होंगी: टीम लाइसेंस {0} ; व्यवसाय लाइसेंस {1} ; एंटरप्राइज़ लाइसेंस {2} . यदि आप अपने लाइसेंस की समाप्ति तिथि के बाद 1 महीने अपने लाइसेंस का नवीनीकरण करते हैं, तो नवीनीकरण मूल्य लाइसेंस खरीद मूल्य के समान होगा और आपके नवीनीकरण पर कोई छूट नहीं होगी।", "TrialPlan": "क्या आपके पास एक परीक्षण योजना है?", "DoYouAcceptBankWireTransfer": "क्या आप बैंक वायर ट्रांसफर स्वीकार करते हैं?", "DoYouAcceptBankWireTransferExplanation": "हां, हम बैंक वायर ट्रांसफर स्वीकार करते हैं।
बैंक हस्तांतरण के माध्यम से लाइसेंस शुल्क भेजने के बाद, हमें अपनी रसीद और अनुरोधित लाइसेंस के प्रकार accounting@abp.io पर ईमेल करें। हमारे अंतरराष्ट्रीय बैंक खाते की जानकारी:", @@ -360,7 +360,7 @@ "Next": "अगला", "StartTrial": "मेरा नि:शुल्क परीक्षण प्रारंभ करें", "ContactUsIssues": "अगर आपको कोई समस्या है तो हमसे संपर्क करें", - "TrialActivatedWarning": "प्रिय {0}, एक उपयोगकर्ता केवल 1 नि:शुल्क परीक्षण अवधि का हकदार है। आप पहले ही अपनी परीक्षण अवधि का उपयोग कर चुके हैं।", + "TrialActivatedWarning": "एक उपयोगकर्ता केवल 1 निःशुल्क परीक्षण अवधि का हकदार है। आपने पहले ही अपनी परीक्षण अवधि का उपयोग कर लिया है।", "SaveAndDownload": "सहेजें और डाउनलोड करें", "CompanyNameValidationMessage": "कंपनी का नाम बहुत लंबा है!", "AddressValidationMessage": "पता बहुत लंबा है!", @@ -373,11 +373,12 @@ "TrialLicenseModelInvalidErrorMessage": "निम्न में से एक फ़ील्ड अमान्य है: देश का नाम, कंपनी का आकार, उद्योग या उपयोग का उद्देश्य।", "Trial": "परीक्षण", "Purchased": "खरीदी", - "PurchaseLicense": "खरीद लाइसेंस", + "PurchaseLicense": "खरीदें {0} लाइसेंस", "PurchaseTrialLicenseMessage": "आपके लाइसेंस की समाप्ति तिथि {0} है।
यदि आप अपनी नि:शुल्क परीक्षण अवधि के दौरान बनाए गए प्रोजेक्ट का उपयोग जारी रखना चाहते हैं, तो आपको अपनी appsettings.secrets.json फ़ाइलों में लाइसेंस कुंजियों को बदलना होगा। यहां आपकी लाइसेंस कुंजी है:", "TrialLicenseExpireMessage": "आप परीक्षण लाइसेंस का उपयोग कर रहे हैं और आपका परीक्षण लाइसेंस {0} को समाप्त हो जाएगा।", "TryForFree": "मुफ्त में आजमाइये", "TrialLicenseExpiredInfo": "आपके परीक्षण लाइसेंस की अवधि समाप्त हो गई है!", - "CommercialNewsletterConfirmationMessage": "मैं नियम और शर्तों और गोपनीयता नीति से सहमत हूं ." + "CommercialNewsletterConfirmationMessage": "मैं नियम और शर्तों और गोपनीयता नीति से सहमत हूं .", + "discountForYears": "{1}वर्ष(वर्षों) के लिए {0}% छूट" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json index 0de24176ed..3642b69f33 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json @@ -202,10 +202,11 @@ "WhatHappensWhenLicenseEndsExplanation4": "A licensz lejárta után nem telepíthet új modulokat és témákat az ABP Commercial platformhoz.", "WhatHappensWhenLicenseEndsExplanation5": "Az ABP Suite nem használható.", "WhatHappensWhenLicenseEndsExplanation6": "A prémium támogatást már nem kaphatja meg.", - "WhatHappensWhenLicenseEndsExplanation7": "Meghosszabbíthatja (megújíthatja) az engedélyét, ha továbbra is igénybe kívánja venni ezeket az előnyöket. Ha a licensz lejártát követő 1 hónapon belül meghosszabbítja a licenszet, a következő kedvezmények érvényesek: Team License {0}% kedvezmény, Business License {1}% kedvezmény, Enterprise License {2}% kedvezmény.", + "WhatHappensWhenLicenseEndsExplanation7": "Meghosszabbíthatja (megújíthatja) a licencét, ha továbbra is szeretné igénybe venni ezeket az előnyöket. Ha a licenc lejártát követő 1 hónapon belül meghosszabbítja licencét, a következő kedvezmények érvényesek: Csapat Licenc {0}; Üzleti licenc {1}; Vállalati licenc {2}.", + "discountForYears": "{0}% kedvezmény {1} évre", "WhatHappensWhenLicenseEndsExplanation8": "Az Ön által generált ABP projekteket nem tároljuk a szervereinken. Ezért az Ön felelőssége a letöltött forráskód megőrzése. Amikor a licensze lejár, nincs mód a generált ABP projekt forráskódjának lekérésére.", "WhenShouldIRenewMyLicense": "Mikor kell megújítanom a jogosítványomat?", - "WhenShouldIRenewMyLicenseExplanation": "Ha a licenc lejártát követő 1 hónapon belül megújítja a licencet, a következő kedvezmények érvényesek: Csapatlicenc {0}% kedvezmény, Üzleti licenc {1}% kedvezmény, Vállalati licenc {2}% kedvezmény . Ha megújítja a licencet 1 hónappal a licenc lejárati dátuma után, a megújítási ár megegyezik a licenc vásárlási árával, és nem jár kedvezmény a megújításra.", + "WhenShouldIRenewMyLicenseExplanation": "Ha a licenc lejártát követő 1 hónapon belül megújítja a licencet, a következő kedvezmények érvényesek: Csapatlicenc {0}; Üzleti engedély {1}; Vállalati licenc {2}. Ha azonban a licenc lejárati dátuma óta 1 hónap után megújítja a licencet, a megújítási ár megegyezik a licenc vásárlási árával, és nem jár kedvezmény a megújításra.", "TrialPlan": "Van próbaterv?", "TrialPlanExplanation": "14 napos próbaidővel rendelkezik az ABP Commercial csapat licenszéhez. További információért látogasson el ide . Továbbá a Team licenszekre 30 napos pénz-visszafizetési garanciát biztosítunk. Az első 30 napban csak visszatérítést kérhet. A Business és Enterprise licenszek esetén 30 napon belül 60%-os visszatérítést biztosítunk. Ennek az az oka, hogy a Business és Enterprise licenszek tartalmazzák az összes modul és téma teljes forráskódját.", "DoYouAcceptBankWireTransfer": "Elfogadja a banki átutalást?", @@ -375,7 +376,7 @@ "Next": "Következő", "StartTrial": "Indítsa el az ingyenes próbaverziómat", "ContactUsQuestions": "Ha bármilyen kérdése van, forduljon hozzánk", - "TrialActivatedWarning": "Kedves {0}! Egy felhasználó csak 1 ingyenes próbaidőszakra jogosult. Már felhasználta a próbaidőszakot.", + "TrialActivatedWarning": "Egy felhasználó csak 1 ingyenes próbaidőszakra jogosult. Ön már használta a próbaidőszakot.", "ActivationRequirement": "Még egy lépés választja el a próbaidőszak megkezdésétől.
Az adatok ellenőrzése után aktiváljuk a licenszét. A licensz aktiválása után e-mailt küldünk a következő címre: {0} . Ne aggódjon, ez a folyamat nem tart sokáig!", "SaveAndDownload": "Mentés és letöltés", "CompanyNameValidationMessage": "A cég neve túl hosszú!", @@ -564,9 +565,9 @@ "MyOrganizations_Detail_PaymentProviderInfo": "Ha licenszét a (z) {0} átjárón keresztül vásárolta, az elküldi a PDF számlát az Ön e-mail címére, lásd: {0} számlázás.", "MyOrganizations_Detail_PayUInfo": "Ha a PayU átjárón keresztül vásárolt, kattintson a \"Számla kérése\" gombra, és töltse ki a számlázási adatokat.", "MyOrganizations_Detail_ConclusionInfo": "Számlakérését {0} munkanapon belül lezárjuk.", - "ExtendYourLicense": "Hosszabbítsa meg {0} licenszét", + "ExtendYourLicense": "Hosszabbítsa meg {0} licenszét", "Continue": "Folytatni", - "PurchaseLicense": "Vásárlási engedély", + "PurchaseLicense": "Vásároljon {0} licencet", "DownloadInvoiceModal_DownloadInvoice": "Számla letöltése", "DownloadInvoiceModal_SaveInformationOnlyOnce": "Számlázási adatait csak egyszer mentheti el.", "InvoiceModal_EnterCompanyName": "Adja meg cégének hivatalos nevét...", @@ -743,6 +744,9 @@ "Testimonial_ShortDescription_3": "A beépített funkciókból indulunk ki, és csak arra koncentrálunk, amit valóban meg kell írnunk.", "Testimonial_ShortDescription_4": "Az ABP Commercial volt a legjobban megfelelő az igényeinknek.", "OnlineReviewersOnAbpCommercial": "Online vélemények az ABP Commercial-ról", - "SeeWhatToldAboutAbpCommercial": "Tekintse meg, mit mondtak az ABP Commercialról, és írja le gondolatait, ha akarja." + "SeeWhatToldAboutAbpCommercial": "Tekintse meg, mit mondtak az ABP Commercialról, és írja le gondolatait, ha akarja.", + "ExtendPaymentInfoSection_DeveloperPrice": "{0} x Developer(s) Price", + "ExtendPaymentInfoSection_DiscountRate": "Kedvezmény: {0}%", + "TotalNetPrice": "Total Net Price" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json index e6146707fc..dfba710dae 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json @@ -360,7 +360,7 @@ "Next": "Næsta", "StartTrial": "Byrjaðu ókeypis prufuáskriftina mína", "ContactUsIssues": "Hafðu samband við okkur ef þú hefur einhver vandamál", - "TrialActivatedWarning": "Kæri {0}, notandi á rétt á aðeins 1 ókeypis prufutíma. Þú hefur þegar notað prufutíma þinn.", + "TrialActivatedWarning": "Notandi á aðeins rétt á að fá 1 ókeypis prufutímabil. Þú hefur þegar notað prufutímabilið þitt.", "SaveAndDownload": "Vista og hala niður", "CompanyNameValidationMessage": "Nafn fyrirtækis er of langt!", "AddressValidationMessage": "Heimilisfang er of langt!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Einn af eftirfarandi reitum er ógildur: heiti lands, stærð fyrirtækis, iðnaður eða tilgangur notkunar.", "Trial": "Prufu aðgangur", "Purchased": "Keypt", - "PurchaseLicense": "Keypt leyfi", + "PurchaseLicense": "Kaupa {0} leyfi", "PurchaseTrialLicenseMessage": "Gildistími leyfis þíns er {0}.
Ef þú vilt halda áfram að nota verkefnin sem þú bjóst til á ókeypis prufutímabilinu þarftu að breyta leyfislyklunum í appsettings.secrets.json skránni þinn. Hér er leyfislykillinn þinn:", "TrialLicenseExpireMessage": "Þú ert að nota prufuleyfið og prufuleyfið rennur út {0}.", "TryForFree": "Prófaðu ókeypis", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json index b10dafefa1..da30f29912 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Posso cambiare gli sviluppatori registrati della mia organizzazione in futuro?", "ChangingDevelopersExplanation": "Oltre ad aggiungere nuovi sviluppatori alla tua licenza, puoi anche Modifica gli sviluppatori esistenti (puoi rimuovere uno sviluppatore e aggiungerne uno nuovo alla stessa postazione) senza alcun costo aggiuntivo.", "WhenShouldIRenewMyLicense": "Quando devo rinnovare la mia licenza?", - "WhenShouldIRenewMyLicenseExplanation": "Se rinnovi la licenza entro 1 mese dopo la scadenza della licenza, verranno applicati i seguenti sconti: Licenza Team {0}% di sconto, Licenza Business {1}% di sconto, Licenza Enterprise {2}% di sconto . Se rinnovi la licenza 1 mese dopo la data di scadenza della licenza, il prezzo di rinnovo sarà lo stesso del prezzo di acquisto della licenza e non ci saranno sconti sul rinnovo.", + "WhenShouldIRenewMyLicenseExplanation": "Se rinnovi la licenza entro 1 mese dopo la scadenza della licenza, verranno applicati i seguenti sconti: Licenza Team {0} ; Licenza Business {1} ; Licenza Enterprise {2} . Se rinnovi la licenza 1 mese dopo la data di scadenza della licenza, il prezzo di rinnovo sarà lo stesso del prezzo di acquisto della licenza e non ci saranno sconti sul rinnovo.", "TrialPlan": "Hai un piano di prova?", "DoYouAcceptBankWireTransfer": "Accettate bonifici bancari?", "DoYouAcceptBankWireTransferExplanation": "Sì, accettiamo bonifico bancario.
Dopo aver inviato il canone tramite bonifico bancario, inviaci un'e-mail a accounting@abp.io con la ricevuta e il tipo di licenza richiesta. Le nostre informazioni sul conto bancario internazionale:", @@ -360,7 +360,7 @@ "Next": "Prossimo", "StartTrial": "Inizia la mia prova gratuita", "ContactUsIssues": "Contattaci per qualsiasi problema", - "TrialActivatedWarning": "Caro {0}, un utente ha diritto di avere 1 solo periodo di prova gratuito. Hai già utilizzato il tuo periodo di prova.", + "TrialActivatedWarning": "Un utente ha diritto a un solo periodo di prova gratuito. Hai già utilizzato il periodo di prova.", "SaveAndDownload": "Salva e Scarica", "CompanyNameValidationMessage": "Il nome dell'azienda è troppo lungo!", "AddressValidationMessage": "L'indirizzo è troppo lungo!", @@ -373,11 +373,12 @@ "TrialLicenseModelInvalidErrorMessage": "Uno dei seguenti campi non è valido: nome del paese, dimensione dell'azienda, settore o scopo di utilizzo.", "Trial": "Processo", "Purchased": "Acquistato", - "PurchaseLicense": "Acquista licenza", + "PurchaseLicense": "Acquista {0} licenza", "PurchaseTrialLicenseMessage": "La data di scadenza della tua licenza è {0}.
Se desideri continuare a utilizzare i progetti che hai creato durante il periodo di prova gratuito, devi modificare le chiavi di licenza nei file appsettings.secrets.json. Ecco la tua chiave di licenza:", "TrialLicenseExpireMessage": "Stai utilizzando la licenza di prova e la tua licenza di prova scadrà il {0}.", "TryForFree": "Prova gratis", "TrialLicenseExpiredInfo": "Il periodo della tua licenza di prova è scaduto!", - "CommercialNewsletterConfirmationMessage": "Accetto i Termini e condizioni e la Informativa sulla privacy ." + "CommercialNewsletterConfirmationMessage": "Accetto i Termini e condizioni e la Informativa sulla privacy .", + "discountForYears": "{0}% di sconto per {1} anno/i" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json index dd64468f17..de8a896c69 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json @@ -179,7 +179,7 @@ "ChangingLicenseTypeExplanation": "U kunt upgraden naar een hogere licentie door het verschil binnen uw actieve licentieperiode te betalen. Wanneer u upgradet naar een hoger licentieplan, krijgt u de voordelen van het nieuwe plan, maar de licentie-upgrade verandert de vervaldatum van de licentie niet. Daarnaast kun je ook nieuwe developers seats toevoegen aan je bestaande licentie, zie \"Hoeveel developers kunnen aan de ABP Commercial werken?\"", "LicenseExtendUpgradeDiff": "Wat is het verschil tussen licentieverlenging en upgrade?", "LicenseRenewalCost": "Wat zijn de kosten voor het verlengen van de licentie na 1 jaar?", - "LicenseRenewalCostExplanation": "Het tarief voor catalogusverlenging van alle eeuwigdurende licenties van ABP Commercial is {0} van de licentieprijs van de licentie. De verlengingsprijs van de standaard Teamlicentie is ${1}, de standaard Business-licentie is ${2} en de standaard Enterprise-licentie is ${3}. Als u al klant bent, log in op uw account om de beschikbare verlengingsprijzen te bekijken.", + "LicenseRenewalCostExplanation": "De prijs voor het verlengen (verlengen) van de standaard Teamlicentie is ${0}, de standaard Business-licentie is ${1} en de standaard Enterprise-licentie is ${2}. Als u al klant bent, log in op uw account om de huidige verlengingsprijzen te bekijken.", "HowDoIRenewMyLicense": "Hoe verleng ik mijn licentie?", "HowDoIRenewMyLicenseExplanation": "U kunt uw licentie verlengen door naar de organisatiebeheerpagina te gaan. Om te profiteren van onze gereduceerde tarieven voor vroege verlenging, moet u ervoor zorgen dat u verlengt voordat uw licentie verloopt. U hoeft zich echter geen zorgen te maken dat u niet weet wanneer uw mogelijkheid tot vervroegde verlenging afloopt. Je ontvangt 3 herinneringsmails voordat je abonnement afloopt. We sturen ze 30 dagen, 7 dagen en 1 dag voor de vervaldatum.", "IsSourceCodeIncluded": "Bevat mijn licentie de broncode van de commerciële modules en thema's?", @@ -360,7 +360,7 @@ "Next": "Volgende", "StartTrial": "Start mijn gratis proefperiode", "ContactUsIssues": "Neem contact met ons op als je problemen hebt!", - "TrialActivatedWarning": "Beste {0}, een gebruiker heeft recht op slechts één gratis proefperiode. Je hebt je proefperiode al gebruikt.", + "TrialActivatedWarning": "Een gebruiker heeft recht op slechts 1 gratis proefperiode. Je hebt je proefperiode al gebruikt.", "SaveAndDownload": "Opslaan en downloaden", "CompanyNameValidationMessage": "Bedrijfsnaam is te lang!", "AddressValidationMessage": "Adres is te lang!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Een van de volgende velden is ongeldig: Landnaam, Bedrijfsgrootte, Industrie of Gebruiksdoel.", "Trial": "Proces", "Purchased": "Gekocht", - "PurchaseLicense": "Licentie kopen", + "PurchaseLicense": "Koop {0} licentie", "PurchaseTrialLicenseMessage": "De vervaldatum van uw licentie is {0}.
Als je de projecten die je tijdens je gratis proefperiode hebt gemaakt wilt blijven gebruiken, moet je de licentiesleutels in je appsettings.secrets.json-bestanden wijzigen. Hier is uw licentiesleutel:", "TrialLicenseExpireMessage": "U gebruikt de proeflicentie en uw proeflicentie verloopt op {0}.", "TryForFree": "Probeer gratis", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json index 1e9e3229ec..63a6197619 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json @@ -360,7 +360,7 @@ "Next": "Następny", "StartTrial": "Rozpocznij mój bezpłatny okres próbny", "ContactUsIssues": "Skontaktuj się z nami, jeśli masz jakiekolwiek problemy", - "TrialActivatedWarning": "Drogi {0}, użytkownik może mieć tylko 1 bezpłatny okres próbny. Korzystałeś już z okresu próbnego.", + "TrialActivatedWarning": "Użytkownikowi przysługuje tylko 1 darmowy okres próbny. Już wykorzystałeś swój okres próbny.", "SaveAndDownload": "Zapisz i pobierz", "CompanyNameValidationMessage": "Nazwa firmy jest za długa!", "AddressValidationMessage": "Adres jest za długi!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Jedno z następujących pól jest nieprawidłowe: nazwa kraju, wielkość firmy, branża lub cel użytkowania.", "Trial": "Test", "Purchased": "Zakupione", - "PurchaseLicense": "Licencja kupna", + "PurchaseLicense": "Kup licencję {0}", "PurchaseTrialLicenseMessage": "Data wygaśnięcia Twojej licencji to {0}.
Jeśli chcesz nadal korzystać z projektów utworzonych podczas bezpłatnego okresu próbnego, musisz zmienić klucze licencyjne w plikach appsettings.secrets.json. Oto twój klucz licencyjny:", "TrialLicenseExpireMessage": "Korzystasz z licencji próbnej, a Twoja licencja próbna wygaśnie w dniu {0}.", "TryForFree": "Wypróbuj za darmo", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json index 052c9c6fa0..4bda215d78 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Posso mudar os desenvolvedores registrados da minha organização no futuro?", "ChangingDevelopersExplanation": "Além de adicionar novos desenvolvedores à sua licença, você também pode alterar os desenvolvedores existentes (você pode remover um desenvolvedor e adicionar um novo ao mesmo assento) sem nenhum custo adicional.", "WhenShouldIRenewMyLicense": "Quando devo renovar minha licença?", - "WhenShouldIRenewMyLicenseExplanation": "Se você renovar sua licença em 1 mês após a expiração da licença, os seguintes descontos serão aplicados: Licença de equipe {0}% de desconto, Licença de negócios {1}% de desconto, Licença empresarial {2}% de desconto . Se você renovar sua licença 1 mês após a data de expiração de sua licença, o preço de renovação será o mesmo que o preço de compra da licença e não haverá desconto em sua renovação.", + "WhenShouldIRenewMyLicenseExplanation": "Se você renovar sua licença em 1 mês após a expiração da licença, os seguintes descontos serão aplicados: Licença de equipe {0} ; Licença de negócios {1} ; Licença empresarial {2} . Se você renovar sua licença 1 mês após a data de expiração de sua licença, o preço de renovação será o mesmo que o preço de compra da licença e não haverá desconto em sua renovação.", "TrialPlan": "Você tem um plano experimental?", "DoYouAcceptBankWireTransfer": "Você aceita transferência bancária?", "DoYouAcceptBankWireTransferExplanation": "Sim, aceitamos transferência bancária.
Após enviar a taxa de licença por transferência bancária, envie-nos um e-mail para accounting@abp.io com seu recibo e o tipo de licença solicitada. Nossas informações de conta bancária internacional:", @@ -360,7 +360,7 @@ "Next": "Próximo", "StartTrial": "Comece meu teste grátis", "ContactUsIssues": "Contate-nos se tiver algum problema", - "TrialActivatedWarning": "Caro {0}, um usuário tem direito a apenas 1 período de teste gratuito. Você já usou seu período de teste.", + "TrialActivatedWarning": "Um usuário tem direito a apenas 1 período de teste gratuito. Você já usou seu período de teste.", "SaveAndDownload": "Salvar e baixar", "CompanyNameValidationMessage": "O nome da empresa é muito longo!", "AddressValidationMessage": "O endereço é muito longo!", @@ -373,11 +373,12 @@ "TrialLicenseModelInvalidErrorMessage": "Um dos campos a seguir é inválido: nome do país, tamanho da empresa, setor ou finalidade do uso.", "Trial": "Tentativas", "Purchased": "Comprado", - "PurchaseLicense": "Licença de Compra", + "PurchaseLicense": "Comprar {0} licença", "PurchaseTrialLicenseMessage": "A data de expiração da sua licença é {0}.
Se você deseja continuar usando os projetos que criou durante o período de teste gratuito, você precisa alterar as chaves de licença em seus arquivos appsettings.secrets.json . Aqui está sua chave de licença:", "TrialLicenseExpireMessage": "Você está usando a licença de teste e sua licença de teste irá expirar em {0}.", "TryForFree": "Experimentar gratuitamente", "TrialLicenseExpiredInfo": "Seu período de licença de teste expirou!", - "CommercialNewsletterConfirmationMessage": "Eu concordo com os Termos e Condições e a Política de Privacidade " + "CommercialNewsletterConfirmationMessage": "Eu concordo com os Termos e Condições e a Política de Privacidade ", + "discountForYears": "{0}% de desconto por {1} ano(s)" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json index be56afbb43..558f95f68e 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json @@ -360,7 +360,7 @@ "Next": "Următorul", "StartTrial": "Începeți încercarea mea gratuită", "ContactUsIssues": "Contactați-ne dacă aveți probleme", - "TrialActivatedWarning": "Stimate {0}, un utilizator are dreptul la o singură perioadă de probă gratuită. Ai folosit deja perioada de probă.", + "TrialActivatedWarning": "Un utilizator are dreptul la o singură perioadă de probă gratuită. Ai folosit deja perioada de probă.", "SaveAndDownload": "Salvați și descărcați", "CompanyNameValidationMessage": "Numele companiei este prea lung!", "AddressValidationMessage": "Adresa este prea lungă!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Unul dintre următoarele câmpuri este nevalid: Numele țării, Mărimea companiei, Industria sau Scopul utilizării.", "Trial": "Proces", "Purchased": "Cumparat", - "PurchaseLicense": "Licență de cumpărare", + "PurchaseLicense": "Achiziționați licența {0}", "PurchaseTrialLicenseMessage": "Data de expirare a licenței este {0}.
Dacă doriți să continuați să utilizați proiectele pe care le-ați creat în timpul perioadei de probă gratuită, trebuie să schimbați cheile de licență din fișierele appsettings.secrets.json. Iată cheia de licență:", "TrialLicenseExpireMessage": "Utilizați licența de probă și licența de probă va expira pe {0}.", "TryForFree": "Încearcă pe gratis", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json index a5b9bdddad..b47a0cc938 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json @@ -360,7 +360,7 @@ "Next": "Следующий", "StartTrial": "Начать бесплатную пробную версию", "ContactUsIssues": "Свяжитесь с нами, если у вас возникнут проблемы", - "TrialActivatedWarning": "Уважаемый {0}, пользователю предоставляется только 1 бесплатный пробный период. Вы уже использовали пробный период.", + "TrialActivatedWarning": "Пользователь имеет право на 1 бесплатный пробный период. Вы уже использовали пробный период.", "SaveAndDownload": "Сохранить и скачать", "CompanyNameValidationMessage": "Название компании слишком длинное!", "AddressValidationMessage": "Адрес слишком длинный!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Одно из следующих полей недействительно: название страны, размер компании, отрасль или цель использования.", "Trial": "Испытание", "Purchased": "Куплено", - "PurchaseLicense": "Купить лицензию", + "PurchaseLicense": "Купить {0} лицензию", "PurchaseTrialLicenseMessage": "Срок действия вашей лицензии: {0}.
Если вы хотите продолжить использование проектов, созданных в течение бесплатного пробного периода, вам необходимо изменить лицензионные ключи в файлах appsettings.secrets.json . Вот ваш лицензионный ключ:", "TrialLicenseExpireMessage": "Вы используете пробную лицензию, и срок ее действия истечет {0}.", "TryForFree": "Попробуй бесплатно", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json index 8636f68af0..a793e8cda1 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Môžem v budúcnosti zmeniť registrovaných vývojárov svojej organizácie?", "ChangingDevelopersExplanation": "Okrem pridávania nových vývojárov do licencie môžete tiež meniť existujúcich vývojárov (môžete odstrániť vývojára a pridať nového na to isté miesto) bez akýchkoľvek ďalších nákladov.", "WhenShouldIRenewMyLicense": "Kedy si mám obnoviť licenciu?", - "WhenShouldIRenewMyLicenseExplanation": "Ak si licenciu obnovíte do 1 mesiaca po vypršaní platnosti licencie, budú sa uplatňovať tieto zľavy: Tímová licencia {0}% zľava, Obchodná licencia {1}% zľava, Enterprise licencia {2}% zľava . Ak si licenciu obnovíte 1 mesiac po dátume skončenia platnosti licencie, cena za obnovenie bude rovnaká ako cena za nákup licencie a na obnovenie nebude poskytnutá žiadna zľava.", + "WhenShouldIRenewMyLicenseExplanation": "Ak si licenciu obnovíte do 1 mesiaca po vypršaní platnosti licencie, budú sa uplatňovať tieto zľavy: Tímová licencia {0} ; Obchodná licencia {1} ; Enterprise licencia {2} . Ak si licenciu obnovíte 1 mesiac po dátume skončenia platnosti licencie, cena za obnovenie bude rovnaká ako cena za nákup licencie a na obnovenie nebude poskytnutá žiadna zľava.", "TrialPlan": "Máte skúšobný plán?", "DoYouAcceptBankWireTransfer": "Prijímate bankový prevod?", "DoYouAcceptBankWireTransferExplanation": "Áno, akceptujeme bankový prevod.
Po odoslaní licenčného poplatku bankovým prevodom nám pošlite e-mail na adresu accounting@abp.io svoje potvrdenie a požadovaný typ licencie. Informácie o našom medzinárodnom bankovom účte:", @@ -360,7 +360,7 @@ "Next": "Ďalšie", "StartTrial": "Spustite moju bezplatnú skúšobnú verziu", "ContactUsIssues": "Ak máte nejaké problémy, kontaktujte nás", - "TrialActivatedWarning": "Vážený {0}, používateľ má nárok len na 1 bezplatné skúšobné obdobie. Skúšobné obdobie ste už využili.", + "TrialActivatedWarning": "Používateľ má nárok len na 1 bezplatné skúšobné obdobie. Skúšobné obdobie ste už využili.", "SaveAndDownload": "Uložiť a stiahnuť", "CompanyNameValidationMessage": "Názov spoločnosti je príliš dlhý!", "AddressValidationMessage": "Adresa je príliš dlhá!", @@ -373,11 +373,12 @@ "TrialLicenseModelInvalidErrorMessage": "Jedno z nasledujúcich polí je neplatné: Názov krajiny, Veľkosť spoločnosti, Odvetvie alebo Účel použitia.", "Trial": "Skúška", "Purchased": "Kúpené", - "PurchaseLicense": "Zakúpiť licenciu", + "PurchaseLicense": "Kúpiť licenciu {0}", "PurchaseTrialLicenseMessage": "Dátum vypršania platnosti vašej licencie je {0}.
Ak chcete pokračovať v používaní projektov, ktoré ste vytvorili počas bezplatného skúšobného obdobia, musíte zmeniť licenčné kľúče vo svojich súboroch appsettings.secrets.json. Tu je váš licenčný kľúč:", "TrialLicenseExpireMessage": "Používate skúšobnú licenciu a platnosť vašej skúšobnej licencie vyprší {0}.", "TryForFree": "Skúste zadarmo", "TrialLicenseExpiredInfo": "Vaše skúšobné licenčné obdobie vypršalo!", - "CommercialNewsletterConfirmationMessage": "I agree to the Terms & Conditions and Privacy Policy." + "CommercialNewsletterConfirmationMessage": "I agree to the Terms & Conditions and Privacy Policy.", + "discountForYears": "{0} % odpusteného prívesku {1} an(ov)" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json index 606be171cb..13f9e2c764 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json @@ -360,7 +360,7 @@ "Next": "Naslednji", "StartTrial": "Začnite moj brezplačni preizkus", "ContactUsIssues": "Pišite nam, če imate kakršne koli težave", - "TrialActivatedWarning": "Spoštovani {0}, uporabnik ima pravico do 1 brezplačnega preskusnega obdobja. Poskusno obdobje ste že izkoristili.", + "TrialActivatedWarning": "Uporabnik ima pravico do samo 1 brezplačnega preizkusnega obdobja. Preizkusno obdobje ste že izkoristili.", "SaveAndDownload": "Shrani in prenesi", "CompanyNameValidationMessage": "Ime podjetja je predolgo!", "AddressValidationMessage": "Naslov je predolg!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Eno od naslednjih polj je neveljavno: ime države, velikost podjetja, panoga ali namen uporabe.", "Trial": "Sojenje", "Purchased": "Kupljeno", - "PurchaseLicense": "Nakup licence", + "PurchaseLicense": "Nakup licence {0}", "PurchaseTrialLicenseMessage": "Datum poteka vaše licence je {0}.
Če želite še naprej uporabljati projekte, ki ste jih ustvarili med brezplačnim preizkusnim obdobjem, morate spremeniti licenčne ključe v datotekah appsettings.secrets.json. Tukaj je vaš licenčni ključ:", "TrialLicenseExpireMessage": "Uporabljate preizkusno licenco in vaša preizkusna licenca bo potekla {0}.", "TryForFree": "Poskusite brezplačno", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json index d03220758a..46512f11bc 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json @@ -363,7 +363,7 @@ "Next": "Sonraki", "StartTrial": "Ücretsiz Denememi Başlat", "ContactUsIssues": "Herhangi bir sorununuz varsa bizimle iletişime geçin", - "TrialActivatedWarning": "Sayın {0}, bir kullanıcının yalnızca 1 ücretsiz deneme süresi hakkı vardır. Deneme sürenizi zaten kullandınız.", + "TrialActivatedWarning": "Bir kullanıcının yalnızca 1 ücretsiz deneme süresi hakkı vardır. Deneme sürenizi zaten kullandınız.", "SaveAndDownload": "Kaydet ve İndir", "CompanyNameValidationMessage": "Şirket adı çok uzun!", "AddressValidationMessage": "Adres çok uzun!", @@ -376,7 +376,7 @@ "TrialLicenseModelInvalidErrorMessage": "Aşağıdaki alanlardan biri geçersiz: Ülke Adı, Şirket Büyüklüğü, Sektör veya Kullanım Amacı.", "Trial": "Duruşma", "Purchased": "satın alındı", - "PurchaseLicense": "Satın alma lisansı", + "PurchaseLicense": "{0} lisansı satın al", "PurchaseTrialLicenseMessage": "Lisans sona erme tarihiniz {0}.
Ücretsiz deneme süreniz boyunca oluşturduğunuz projeleri kullanmaya devam etmek istiyorsanız, appsettings.secrets.json dosyalarınızdaki lisans anahtarlarını değiştirmeniz gerekir. İşte lisans anahtarınız:", "TrialLicenseExpireMessage": "Deneme lisansını kullanıyorsunuz ve deneme lisansınızın süresi {0} tarihinde sona erecek.", "TryForFree": "Ücretsiz deneyin", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json index 8646e0b0cd..c698a4ae6d 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json @@ -360,7 +360,7 @@ "Next": "Kế tiếp", "StartTrial": "Bắt đầu bản dùng thử miễn phí của tôi", "ContactUsIssues": "Liên hệ với chúng tôi nếu bạn có bất kỳ vấn đề nào", - "TrialActivatedWarning": "Kính gửi {0}, người dùng chỉ được phép có 1 thời gian dùng thử miễn phí. Bạn đã sử dụng thời gian dùng thử của mình.", + "TrialActivatedWarning": "Người dùng chỉ có quyền có 1 thời gian dùng thử miễn phí. Bạn đã sử dụng thời gian dùng thử của mình.", "SaveAndDownload": "Lưu và tải xuống", "CompanyNameValidationMessage": "Tên công ty quá dài!", "AddressValidationMessage": "Địa chỉ quá dài!", @@ -373,7 +373,7 @@ "TrialLicenseModelInvalidErrorMessage": "Một trong các trường sau không hợp lệ: Tên quốc gia, Quy mô công ty, Ngành hoặc Mục đích sử dụng.", "Trial": "Sự thử nghiệm", "Purchased": "Đã mua", - "PurchaseLicense": "Giấy phép mua bán", + "PurchaseLicense": "Mua {0} giấy phép", "PurchaseTrialLicenseMessage": "Ngày hết hạn giấy phép của bạn là {0}.
Nếu bạn muốn tiếp tục sử dụng các dự án bạn đã tạo trong thời gian dùng thử miễn phí, bạn cần thay đổi khóa cấp phép trong các tệp appsettings.secrets.json của mình. Đây là khóa cấp phép của bạn:", "TrialLicenseExpireMessage": "Bạn đang sử dụng giấy phép dùng thử và giấy phép dùng thử của bạn sẽ hết hạn vào {0}.", "TryForFree": "Thử miễn phí", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json index 8cf695102b..40f2da5f12 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json @@ -202,10 +202,11 @@ "WhatHappensWhenLicenseEndsExplanation4": "你不能在你的许可证到期后安装ABP商业平台上添加的新模块和主题。", "WhatHappensWhenLicenseEndsExplanation5": "你不能使用ABP Suite。", "WhatHappensWhenLicenseEndsExplanation6": "你不能再获得高级支持。", - "WhatHappensWhenLicenseEndsExplanation7": "如果你想继续获得这些奖励,你可以继续续费你的许可证。如果你在许可证到期后1个月内续费,将会应用以下折扣:团队许可证{0}%折扣,商业许可证{1}%折扣,企业许可证{2}%折扣。", + "WhatHappensWhenLicenseEndsExplanation7": "如果您想继续获得这些好处,您可以延长(续订)您的许可证。 如果您在许可证到期后 1 个月内延长许可证,将应用以下折扣:团队许可证 {0}; 营业执照{1}; 企业许可证 {2}。", + "discountForYears": "{0}% 折扣 {1} 年", "WhatHappensWhenLicenseEndsExplanation8": "您生成的 ABP 项目未存储在我们的服务器上。 因此,您有责任保留下载的源代码。 当您的许可证到期时,将无法获取您生成的 ABP 项目源代码。", "WhenShouldIRenewMyLicense": "我什么时候应该续订我的许可?", - "WhenShouldIRenewMyLicenseExplanation": "如果您在许可证到期后 1 个月内续订许可证,将享受以下折扣:团队许可证 {0}% 折扣、商业许可证 {1}% 折扣、企业许可证 {2}% 折扣 . 如果您在许可证到期后 1 个月续订许可证,续订价格将与许可证购买价格相同,并且续订不会有折扣。", + "WhenShouldIRenewMyLicenseExplanation": "如果您在许可证到期后 1 个月 内续订许可证,将适用以下折扣:团队许可证 {0}; 营业执照{1}; 企业许可证 {2}。 但是,如果您在许可证到期后 1 个月 后续订许可证,则续订价格将与许可证购买价格相同,并且您的续订不会有任何折扣。", "TrialPlan": "你们有试用计划吗?", "TrialPlanExplanation": "ABP商业团队许可证有14天的试用期。若要了解更多信息,请访问这里。此外,我们为团队许可证提供30天的金额返还保证。你只需要在30天内请求退款。商业和企业许可证将提供60%的金额返还保证。这是因为商业和企业许可证包含了所有模块和主题的全部源代码。", "DoYouAcceptBankWireTransfer": "你们接受银行电汇吗?", @@ -375,7 +376,7 @@ "Next": "下一个", "StartTrial": "开始我的免费试用", "ContactUsQuestions": "如果你有任何问题,请联系我们", - "TrialActivatedWarning": "亲爱的{0},用户只能享受 1 个免费试用期。您已经使用了试用期。", + "TrialActivatedWarning": "一个用户只能有 1 个免费试用期。您已经使用了试用期。", "ActivationRequirement": "你已经距离开始你的试用还有最后一步。
检查你的信息后,我们将激活你的许可证。一旦你的许可证激活,我们将向{0}发送电子邮件。请不要担心,这个过程不会太久!", "SaveAndDownload": "保存和下载", "CompanyNameValidationMessage": "公司名称太长!", @@ -561,12 +562,12 @@ "Products": "产品", "TotalPrice": "总价格", "ThereIsNoInvoice": "没有发票", - "MyOrganizations_Detail_PaymentProviderInfo": "如果您通过 {0} 网关购买了许可证,PDF 发票会被发送到您的电子邮件地址,请参阅 { 0} 发票。", + "MyOrganizations_Detail_PaymentProviderInfo": "如果您通过 {0} 网关购买了许可证,它会将 PDF 发票发送到您的电子邮件地址,请参阅 {0} 发票。", "MyOrganizations_Detail_PayUInfo": "如果您是通过PayU网关购买的,请点击\"索取发票\"按钮并填写账单信息。", "MyOrganizations_Detail_ConclusionInfo": "您的发票申请将在 {0} 个工作日内完成。", - "ExtendYourLicense": "延长您的 {0} 许可", + "ExtendYourLicense": "延长您的 {0} 许可", "Continue": "继续", - "PurchaseLicense": "购买许可证", + "PurchaseLicense": "购买 {0} 许可证", "DownloadInvoiceModal_DownloadInvoice": "下载发票", "DownloadInvoiceModal_SaveInformationOnlyOnce": "您只能保存一次账单信息。", "InvoiceModal_EnterCompanyName": "请输入您的法定公司名称...", @@ -737,6 +738,9 @@ "GetConfirmationEmail": "点击这里获取确认邮件 如果你还没有收到。", "WhichLicenseTypeYouAreInterestedIn": "你感兴趣的许可证类型是什么?", "BlazoriseLicense": "我们是否需要购买Blazorise许可证?", - "BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。" + "BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。", + "ExtendPaymentInfoSection_DeveloperPrice": "{0} x 开发者价格", + "ExtendPaymentInfoSection_DiscountRate": "折扣 {0}%", + "TotalNetPrice": "总净价" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json index a8b0398369..08b0805dbe 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json @@ -192,7 +192,7 @@ "ChangingDevelopers": "我將來可以更改我組織的註冊開發人員嗎?", "ChangingDevelopersExplanation": "除了將新的開發人員添加到你的許可中之外,你還可以更改現有的開發人員(可以刪除一個開發人員並將新的開發人員添加到同一位置),而無需任何額外費用.", "WhenShouldIRenewMyLicense": "我什麽時候應該續訂我的許可?", - "WhenShouldIRenewMyLicenseExplanation": "如果您在許可證到期後 1 個月內續訂許可證,將享受以下折扣:團隊許可證 {0}% 折扣、商業許可證 {1}% 折扣、企業許可證 {2}% 折扣 . 如果您在許可證到期後 1 個月續訂許可證,續訂價格將與許可證購買價格相同,並且續訂不會有折扣。", + "WhenShouldIRenewMyLicenseExplanation": "如果您在許可證到期後 1 個月內續訂許可證,將享受以下折扣:團隊許可證 {0} ; 商業許可證 {1} ;企業許可證 {2}. 如果您在許可證到期後 1 個月續訂許可證,續訂價格將與許可證購買價格相同,並且續訂不會有折扣。", "TrialPlan": "你們有試用計劃嗎?", "DoYouAcceptBankWireTransfer": "你們接受銀行電匯嗎?", "DoYouAcceptBankWireTransferExplanation": "是的,我們接受銀行電匯。
在通過銀行轉賬發送許可費後,將您的收據和所需的許可類型通過電子郵件發送至accounting@abp.io。 我們的國際銀行賬戶信息:", @@ -362,7 +362,7 @@ "Next": "下一個", "StartTrial": "開始我的免費試用", "ContactUsIssues": "如果您有任何問題,請聯繫我們", - "TrialActivatedWarning": "親愛的{0},用戶只能享受 1 個免費試用期。您已經使用了試用期。", + "TrialActivatedWarning": "一個用戶只能有 1 個免費試用期。您已經使用了試用期。", "SaveAndDownload": "保存和下載", "CompanyNameValidationMessage": "公司名稱太長!", "AddressValidationMessage": "地址太長!", @@ -375,13 +375,14 @@ "TrialLicenseModelInvalidErrorMessage": "以下字段之一無效:國家名稱、公司規模、行業或使用目的。", "Trial": "審判", "Purchased": "已購買", - "PurchaseLicense": "購買許可證", + "PurchaseLicense": "購買 {0} 許可證", "PurchaseTrialLicenseMessage": "您的許可證到期日期是 {0}。
如果您想繼續使用您在免費試用期內創建的項目,您需要更改 appsettings.secrets.json 文件中的許可證密鑰。這是您的許可證密鑰:", "TrialLicenseExpireMessage": "您正在使用試用許可證,您的試用許可證將於 {0}到期。", "TryForFree": "免費試用", "TrialLicenseExpiredInfo": "您的試用許可期限已過!", "CommercialNewsletterConfirmationMessage": "我同意條款和條件隱私政策。", "BlazoriseLicense": "我们是否需要购买Blazorise许可证?", - "BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。" + "BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。", + "discountForYears": "{0}% 折扣 {1} 年" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index c73da26137..8387eb0f5d 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -43,7 +43,7 @@ "Done": "Done", "Open": "Open", "Closed": "Closed", - "RecentQuestionFrom": "Recent question from ", + "RecentQuestionFrom": "Recent question from {0}", "Stackoverflow": "Stackoverflow", "Votes": "votes", "Answer": "Answer", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json index bb401e6577..e0989162c4 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json @@ -43,7 +43,7 @@ "Done": "Kész", "Open": "Nyisd ki", "Closed": "Zárva", - "RecentQuestionFrom": "Friss kérdés tőle", + "RecentQuestionFrom": "Friss kérdés tőle {0}", "Stackoverflow": "Stackoverflow", "Votes": "szavazatokat", "Answer": "Válasz", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json index 71813eeca4..73b2ff6559 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json @@ -45,7 +45,7 @@ "Open": "Açık", "Closed": "Kapalı", "LatestQuestionOnThe": "Son Soru", - "Stackoverflow": "yığın akışı", + "Stackoverflow": "Stackoverflow", "Votes": "oy", "Answer": "Cevap", "Views": "Görüntüleme", @@ -155,7 +155,7 @@ "GetStarted": "Başlayın", "SourceCode": "Kaynak Kodu", "LeaveComment": "Yorum bırak", - "RecentQuestionFrom": "Son soru", + "RecentQuestionFrom": "{0}' dan son soru", "ReadMore": "Daha fazla oku", "ShowMore": "Daha fazla göster", "NoPublishedPostsYet": "Henüz yayınlanmış bir gönderi yok.", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json index 8196d567a1..657d85160c 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json @@ -43,7 +43,7 @@ "Done": "完成", "Open": "打开", "Closed": "关闭", - "RecentQuestionFrom": "最近的问题来自", + "RecentQuestionFrom": "最近的问题来自 {0}", "Stackoverflow": "Stackoverflow", "Votes": "票数", "Answer": "回答", diff --git a/build/build-all.ps1 b/build/build-all.ps1 index 16f8bf037c..f0b2f398db 100644 --- a/build/build-all.ps1 +++ b/build/build-all.ps1 @@ -6,6 +6,8 @@ $full = $args[0] Write-Host $solutionPaths +dotnet workload install wasm-tools + foreach ($solutionPath in $solutionPaths) { $solutionAbsPath = (Join-Path $rootFolder $solutionPath) Set-Location $solutionAbsPath diff --git a/docs/en/Audit-Logging.md b/docs/en/Audit-Logging.md index 2076764345..b3bc4335e1 100644 --- a/docs/en/Audit-Logging.md +++ b/docs/en/Audit-Logging.md @@ -41,6 +41,7 @@ Here, a list of the options you can configure: * `IsEnabledForAnonymousUsers` (default: `true`): If you want to write audit logs only for the authenticated users, set this to `false`. If you save audit logs for anonymous users, you will see `null` for `UserId` values for these users. * `AlwaysLogOnException` (default: `true`): If you set to true, it always saves the audit log on an exception/error case without checking other options (except `IsEnabled`, which completely disables the audit logging). * `IsEnabledForGetRequests` (default: `false`): HTTP GET requests should not make any change in the database normally and audit log system doesn't save audit log objects for GET request. Set this to `true` to enable it also for the GET requests. +* `DisableLogActionInfo` (default: `false`):If you set to true, Will no longer log `AuditLogActionInfo`. * `ApplicationName`: If multiple applications saving audit logs into a single database, set this property to your application name, so you can distinguish the logs of different applications. * `IgnoredTypes`: A list of `Type`s to be ignored for audit logging. If this is an entity type, changes for this type of entities will not be saved. This list is also used while serializing the action parameters. * `EntityHistorySelectors`: A list of selectors those are used to determine if an entity type is selected for saving the entity change. See the section below for details. diff --git a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md index 2b756f2958..e545681d71 100644 --- a/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md +++ b/docs/en/Blog-Posts/2022-07-26 v6_0_Preview/POST.md @@ -10,16 +10,16 @@ Try this version and provide feedback for the stable ABP v6.0! Thank you to all. Follow the steps below to try version 6.0.0 RC today: -1) **Upgrade** the ABP CLI to version `6.0.0-rc.1` using a command line terminal: +1) **Upgrade** the ABP CLI to version `6.0.0-rc.5` using a command line terminal: ````bash -dotnet tool update Volo.Abp.Cli -g --version 6.0.0-rc.1 +dotnet tool update Volo.Abp.Cli -g --version 6.0.0-rc.5 ```` **or install** it if you haven't before: ````bash -dotnet tool install Volo.Abp.Cli -g --version 6.0.0-rc.1 +dotnet tool install Volo.Abp.Cli -g --version 6.0.0-rc.5 ```` 2) Create a **new application** with the `--preview` option: @@ -199,7 +199,7 @@ The following improvements have been made on [eShopOnAbp project](https://github * Performance Improvements have been made in the **Settings Module** and tabs on the *Settings* page are lazy loading now. * Some improvements have been made in the CMS Kit Module. You can see the improvements from [here](https://github.com/abpframework/abp/issues/11965). -If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/6.0.0-rc.1), which contains a list of all the issues and pull requests closed in this version. +If you want to see more details, you can check [the release on GitHub](https://github.com/abpframework/abp/releases/tag/6.0.0-rc.5), which contains a list of all the issues and pull requests closed in this version. diff --git a/docs/en/CLI.md b/docs/en/CLI.md index 7a5e59a62a..86eecb3799 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -505,6 +505,7 @@ abp login # Allows you to enter your abp login -p # Specify the password as a parameter (password is visible) abp login --organization # If you have multiple organizations, you need set your active organization abp login -p -o # You can enter both your password and organization in the same command +abp login --device # Use device login flow ``` > When using the -p parameter, be careful as your password will be visible. It's useful for CI/CD automation pipelines. diff --git a/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md b/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md index 8e46bd6944..178a8f261e 100644 --- a/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md +++ b/docs/en/Community-Articles/2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md @@ -1,12 +1,12 @@ # How to Add Custom Properties to the User Entity -> **Note:** If your application is greater than version 4.3.3, please follow [this article](../2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md). +> **Note:** If your application is greater than version 4.3.3, please follow [this article](https://community.abp.io/posts/how-to-add-custom-properties-to-the-user-entity-rixchoha). ## Introduction In this step-by-step article, I will explain how you can customize the user entity class, which is available in every web application you create using the ABP framework, according to your needs. When you read this article, you will learn how to override the services of built-in modules, extend the entities, extend data transfer objects and customize the user interface in the applications you develop using the ABP framework. -> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](../2020-05-09-Customize-the-Login-Page-for-MVC-Razor-Page-Applications/POST.md). +> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](https://community.abp.io/posts/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd). You can see the screenshots below which we will reach at the end of the article. diff --git a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md index 7c119c6e66..df9a8cf41a 100644 --- a/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md +++ b/docs/en/Community-Articles/2022-07-19-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md @@ -1,12 +1,12 @@ # How to Add Custom Properties to the User Entity -> **Note:** If your application is less than version 4.4.x, please follow [this article](../2020-10-08-How-To-Add-Custom-Property-To-The-User-Entity/How-To-Add-Custom-Property-To-The-User-Entity.md). +> **Note:** If your application is less than version 4.4.x, please follow [this article](https://community.abp.io/posts/how-to-add-custom-property-to-the-user-entity-6ggxiddr). ## Introduction In this step-by-step article, I will explain how you can customize the user entity class, which is available in every web application you create using the ABP framework, according to your needs. When you read this article, you will learn how to override the services of built-in modules, extend the entities, extend data transfer objects and customize the user interface in the applications you develop using the ABP framework. -> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](../2020-05-09-Customize-the-Login-Page-for-MVC-Razor-Page-Applications/POST.md). +> **Note:** This article is not about customizing the `Login` page. If you have such a need, please follow [this article](https://community.abp.io/posts/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd). You can see the screenshots below which we will reach at the end of the article. diff --git a/docs/en/Community-Articles/2022-09-15-Grpc-Demo/POST.md b/docs/en/Community-Articles/2022-09-15-Grpc-Demo/POST.md index 0611aa6914..b3870ff067 100644 --- a/docs/en/Community-Articles/2022-09-15-Grpc-Demo/POST.md +++ b/docs/en/Community-Articles/2022-09-15-Grpc-Demo/POST.md @@ -8,18 +8,16 @@ In this article, I will show you how to create a gRPC service and consume it fro ## Creating the Application -> I will use ABP version 6.0 for this article. I am using the 6.0.0-rc.4 version since the stable version hasn't been published at the time I am writing this article. If it is released while you're reading this, do not specify the `--version` and `--preview` parameters in the following commands. - Install the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) if you haven't installed it yet: ````bash -dotnet tool install -g Volo.Abp.Cli --version 6.0.0-rc.4 +dotnet tool install -g Volo.Abp.Cli ```` -or update to version 6.0.0-rc.4 if you've already installed a previous version: +or update to the latest version if you've already installed an old version: ````bash -dotnet tool update Volo.Abp.Cli -g --version 6.0.0-rc.4 +dotnet tool update Volo.Abp.Cli -g ```` Create an empty folder, open a command-line terminal and type the following command in the terminal window to create a new ABP solution using the ABP CLI: diff --git a/docs/en/Deployment/Clustered-Environment.md b/docs/en/Deployment/Clustered-Environment.md index d76a199518..2dace9a7f7 100644 --- a/docs/en/Deployment/Clustered-Environment.md +++ b/docs/en/Deployment/Clustered-Environment.md @@ -84,6 +84,16 @@ ABP provides a distributed locking abstraction with an implementation made with However, the distributed lock system works in-process by default. That means it is not distributed actually, unless you configure a distributed lock provider. So, please follow the [distributed lock](../Distributed-Locking.md) document to configure a provider for your application, if it is not already configured. +## Configuring SignalR + +ABP provides [SignalR](../SignalR-Integration.md) integration packages to simplify integration and usage. SignalR can be used whenever you need to add real-time web functionality (real-time messaging, real-time notification etc.) into your application. + +SignalR requires that all HTTP requests for a specific connection be handled (needs to keep track of all its connections) by the same server process. So, when SignalR is running on a clustered environment (with multiple servers) **"sticky sessions"** must be used. + +If you are considering [scaling out](https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0#scale-out) your servers and don't want to have inconsistency with the active socket connections, you can use [Azure SignalR Service](https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0#azure-signalr-service) or [Redis backplane](https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0#redis-backplane). + +> To learn more about how to host and scale SignalR in a clustered environment, please check the [ASP.NET Core SignalR hosting and scaling](https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0). + ## Implementing Background Workers ASP.NET Core provides [hosted services](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services) and ABP provides [background workers](../Background-Workers.md) to perform tasks in background threads in your application. @@ -96,4 +106,4 @@ We suggest you to use one of the following approaches to overcome the problem: * Implement your background workers so that they work in a clustered environment without any problem. Using the [distributed lock](../Distributed-Locking.md) to ensure concurrency control is a way of doing that. A background worker in an application instance may handle a distributed lock, so the workers in other application instances will wait for the lock. In this way, only one worker does the actual work, while others wait in idle. If you implement this, your workers run safely without caring about how the application is deployed. * Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances except one of them, so only the single instance runs the workers. -* Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background tasks. This can be a good option if your background workers consume high system resources (CPU, RAM or Disk), so you can deploy that background application to a dedicated server and your background tasks don't affect your application's performance. \ No newline at end of file +* Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background tasks. This can be a good option if your background workers consume high system resources (CPU, RAM or Disk), so you can deploy that background application to a dedicated server and your background tasks don't affect your application's performance. diff --git a/docs/en/Getting-Started-React-Native.md b/docs/en/Getting-Started-React-Native.md index ac6325b5fd..7bd9495e38 100644 --- a/docs/en/Getting-Started-React-Native.md +++ b/docs/en/Getting-Started-React-Native.md @@ -15,7 +15,7 @@ ABP platform provide basic [React Native](https://reactnative.dev/) startup temp Please follow the steps below to prepare your development environment for React Native. -1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js v12 or v14 installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. +1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js v16 or v18 installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. 2. **[Optional] Install Yarn:** You may install Yarn v1 (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v6 and below. You may skip this step and work with npm, which is built-in in Node.js, instead. 3. **[Optional] Install VS Code:** [VS Code](https://code.visualstudio.com/) is a free, open-source IDE which works seamlessly with TypeScript. Although you can use any IDE including Visual Studio or Rider, VS Code will most likely deliver the best developer experience when it comes to React Native projects. 4. **Install an Emulator:** React Native applications need an Android emulator or an iOS simulator to run on your OS. See the [Android Studio Emulator](https://docs.expo.io/workflow/android-simulator/) or [iOS Simulator](https://docs.expo.io/workflow/ios-simulator/) on expo.io documentation to learn how to set up an emulator. diff --git a/docs/en/Getting-Started-Setup-Environment.md b/docs/en/Getting-Started-Setup-Environment.md index b4ebed633f..1a47c67d34 100644 --- a/docs/en/Getting-Started-Setup-Environment.md +++ b/docs/en/Getting-Started-Setup-Environment.md @@ -21,7 +21,7 @@ The following tools should be installed on your development machine: * An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 6.0+](https://dotnet.microsoft.com/download/dotnet) development. {{ if UI != "Blazor" }} -* [Node v12 or v14](https://nodejs.org/) +* [Node v16 or v18](https://nodejs.org/) * [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) [1](#f-yarn) or npm v6+ (already installed with Node) {{ end }} {{ if Tiered == "Yes" }} diff --git a/docs/en/Migration-Guides/OpenIddict-Angular.md b/docs/en/Migration-Guides/OpenIddict-Angular.md index e8d34cb5fc..c3ca6a7fbb 100644 --- a/docs/en/Migration-Guides/OpenIddict-Angular.md +++ b/docs/en/Migration-Guides/OpenIddict-Angular.md @@ -16,14 +16,14 @@ - In **MyApplication.HttpApi.Host.csproj** replace **project references**: ```csharp - - + + ``` with ```csharp - + ``` - In the **MyApplicationHttpApiHostModule.cs** replace usings and **module dependencies**: @@ -117,13 +117,13 @@ This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refacto - In **MyApplication.IdentityServer.csproj** replace **project references**: ```csharp - + ``` with ```csharp - + ``` - In the **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: diff --git a/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md b/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md index 4db4556479..65011f6124 100644 --- a/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md +++ b/docs/en/Migration-Guides/OpenIddict-Blazor-Server.md @@ -5,14 +5,14 @@ - In the **MyApplication.Blazor.csproj** replace **project references**: ```csharp - - + + ``` with ```csharp - + ``` - In the **MyApplicationBlazorModule.cs** replace usings and **module dependencies**: @@ -108,13 +108,13 @@ This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refacto - In **MyApplication.IdentityServer.csproj** replace **project references**: ```csharp - + ``` with ```csharp - + ``` - In **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: diff --git a/docs/en/Migration-Guides/OpenIddict-Blazor.md b/docs/en/Migration-Guides/OpenIddict-Blazor.md index 0dc1c0f123..4a3e166cb9 100644 --- a/docs/en/Migration-Guides/OpenIddict-Blazor.md +++ b/docs/en/Migration-Guides/OpenIddict-Blazor.md @@ -34,14 +34,14 @@ - In the **MyApplication.HttpApi.Host.csproj** replace **project references**: ```csharp - - + + ``` with ```csharp - + ``` - In the **MyApplicationHttpApiHostModule.cs** replace usings and **module dependencies**: @@ -136,13 +136,13 @@ This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refacto - In **MyApplication.IdentityServer.csproj** replace **project references**: ```csharp - + ``` with ```csharp - + ``` - In the **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: diff --git a/docs/en/Migration-Guides/OpenIddict-Mvc.md b/docs/en/Migration-Guides/OpenIddict-Mvc.md index e772de272c..7fd411155d 100644 --- a/docs/en/Migration-Guides/OpenIddict-Mvc.md +++ b/docs/en/Migration-Guides/OpenIddict-Mvc.md @@ -5,14 +5,14 @@ - In **MyApplication.Web.csproj** replace **project references**: ```csharp - - + + ``` with ```csharp - + ``` - In **MyApplicationWebModule.cs** replace usings and **module dependencies**: @@ -27,7 +27,7 @@ with ```csharp - typeof(AbpAccountWebModule), + typeof(AbpAccountWebOpenIddictModule), ``` - In **MyApplicationWebModule.cs** `ConfigureServices` method **update authentication configuration**: @@ -50,6 +50,23 @@ context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); } ``` + + - In the **MyApplicationWebModule.cs** add `PreConfigureServices` like below with your application name as the audience: + + ```csharp + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("MyApplication"); // Replace with your application name + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + ``` - In **MyApplicationWebModule.cs** `OnApplicationInitialization` method **replace IdentityServer and JwtToken midwares**: @@ -99,13 +116,13 @@ This project is renamed to **AuthServer** after v6.0.0-rc1. You can also refacto - In **MyApplication.IdentityServer.csproj** replace **project references**: ```csharp - + ``` with ```csharp - + ``` - In **MyApplicationIdentityServerModule.cs** replace usings and **module dependencies**: diff --git a/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md b/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md index 7a36b250c9..ba6b264758 100644 --- a/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md +++ b/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md @@ -20,11 +20,11 @@ Use the `abp update` command to update your existing application. See [Upgrading - In **MyApplication.Domain.Shared.csproj** replace **project reference**: ```csharp - + ``` with ```csharp - + ``` - In **MyApplicationDomainSharedModule.cs** replace usings and **module dependencies:** @@ -45,15 +45,15 @@ Use the `abp update` command to update your existing application. See [Upgrading - In **MyApplication.Domain.csproj** replace **project references**: ```csharp - - + + ``` with ```csharp - - + + ``` - In **MyApplicationDomainModule.cs** replace usings and **module dependencies**: @@ -90,13 +90,13 @@ If you are using MongoDB, skip this step and check the *MongoDB* layer section. - In **MyApplication.EntityFrameworkCore.csproj** replace **project reference**: ```csharp - + ``` with ```csharp - + ``` - In **MyApplicationEntityFrameworkCoreModule.cs** replace usings and **module dependencies**: @@ -154,13 +154,13 @@ If you are using EntityFrameworkCore, skip this step and check the *EntityFramew - In **MyApplication.MongoDB.csproj** replace **project reference**: ```csharp - + ``` with ```csharp - + ``` - In **MyApplicationMongoDbModule.cs** replace usings and **module dependencies**: diff --git a/docs/en/Modules/OpenIddict.md b/docs/en/Modules/OpenIddict.md index 22cb22bf55..3a015011e6 100644 --- a/docs/en/Modules/OpenIddict.md +++ b/docs/en/Modules/OpenIddict.md @@ -293,6 +293,8 @@ PreConfigure(options => - `UpdateAbpClaimTypes(default: true)`: Updates `AbpClaimTypes` to be compatible with the Openiddict claims. - `AddDevelopmentEncryptionAndSigningCertificate(default: true)`: Registers (and generates if necessary) a user-specific development encryption/development signing certificate. +> `AddDevelopmentEncryptionAndSigningCertificate` cannot be used in applications deployed on IIS or Azure App Service: trying to use them on IIS or Azure App Service will result in an exception being thrown at runtime (unless the application pool is configured to load a user profile). To avoid that, consider creating self-signed certificates and storing them in the X.509 certificates store of the host machine(s). Please refer to: https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-development-certificate + #### Automatically Removing Orphaned Tokens/Authorizations The background task that automatically removes orphaned tokens/authorizations. This can be configured by `TokenCleanupOptions` to manage it. diff --git a/docs/en/Previews.md b/docs/en/Previews.md index 61cf1c9226..70ddc4fe2b 100644 --- a/docs/en/Previews.md +++ b/docs/en/Previews.md @@ -11,6 +11,14 @@ More than one preview releases (like 3.1.0-rc.2 and 3.1.0-rc.3) might be publish ## Using the Preview Versions +### Update the CLI + +Before creating or updating an existing solution make sure to update the CLI to the latest preview version, for example: + +````bash +dotnet tool update --global Volo.Abp.Cli --version 6.0.0-rc.2 +```` + ### New Solutions To create a project for testing the preview version, you can select the "**preview**" option on the [download page](https://abp.io/get-started) or use the "**--preview**" parameter with the [ABP CLI](CLI.md) new command: diff --git a/docs/en/Themes/LeptonXLite/Angular.md b/docs/en/Themes/LeptonXLite/Angular.md index 506ffaf753..4079281f99 100644 --- a/docs/en/Themes/LeptonXLite/Angular.md +++ b/docs/en/Themes/LeptonXLite/Angular.md @@ -82,3 +82,170 @@ To change the logos and brand color of `LeptonX`, simply add the following CSS t ### Server Side In order to migrate to LeptonX on your server side projects (Host and/or AuthServer projects), please follow the [Server Side Migration](AspNetCore.md) document. + +## Customization + + +### Layouts + +The Angular version of LeptonX Lite provides **layout components** for your **user interface** on [ABP Framework Theming](https://docs.abp.io/en/abp/latest/UI/Angular/Theming). You can use layouts to **organize your user interface**. You can replace the **layout components** and some parts of the **layout components** with the [ABP replaceable component system](https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement). + + +The main responsibility of a theme is to **provide** the layouts. There are **three pre-defined layouts that must be implemented by all the themes:** + +* **ApplicationLayoutComponent:** The **default** layout which is used by the **main** application pages. + +* **AccountLayoutComponent:** Mostly used by the **account module** for **login**, **register**, **forgot password**... pages. + +* **EmptyLayoutComponent:** The **Minimal** layout that **has no layout components** at all. + + The **Layout components** and all the replacable components are predefined in `eThemeLeptonXComponents` as enum. + +### How to replace a component + +```js +import { ReplaceableComponentsService } from '@abp/ng.core'; // imported ReplaceableComponentsService +import { eIdentityComponents } from '@abp/ng.identity'; // imported eIdentityComponents enum +import { eThemeLeptonXComponents } from '@abp/ng.theme.lepton-x'; // imported eThemeLeptonXComponents enum + +//... + +@Component(/* component metadata */) +export class AppComponent { + constructor( + private replaceableComponents: ReplaceableComponentsService, // injected the service + ) { + this.replaceableComponents.add({ + component: YourNewApplicationLayoutComponent, + key: eThemeLeptonXComponents.ApplicationLayout, + }); + } +} +``` +See the [Component Replacement](https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement) documentation for more information on how to replace components. + + +### Brand Component + +The **brand component** is a simple component that can be used to display your brand. It contains a **logo** and a **company name**. You can change the logo via css but if you want to change logo component, the key is `eThemeLeptonXComponents.Logo` + +```js +///... + this.replaceableComponents.add({ + component: YourNewLogoComponent, + key: eThemeLeptonXComponents.Logo, + }); +///... +``` + +![Brand component](../../images/leptonxlite-brand-component.png) + + + +## Breadcrumb Component + +On websites that have a lot of pages, **breadcrumb navigation** can greatly **enhance the way users find their way** around. In terms of **usability**, breadcrumbs reduce the number of actions a website **visitor** needs to take in order to get to a **higher-level page**, and they **improve** the **findability** of **website sections** and **pages**. + +```js +///... + this.replaceableComponents.add({ + component: YourNewSidebarComponent, + key: eThemeLeptonXComponents.Breadcrumb, + }); +///... +``` + +![Breadcrumb component](../../images/leptonxlite-breadcrumb-component.png) + +## Sidebar Menu Component + +Sidebar menus have been used as a **directory for Related Pages** to a **Service** offering, **Navigation** items to a **specific service** or topic and even just as **Links** the user may be interested in. + +```js +///... + this.replaceableComponents.add({ + component: YourNewSidebarComponent, + key: eThemeLeptonXComponents.Sidebar, + }); +///... +``` +![Sidebar menu component](../../images/leptonxlite-sidebar-menu-component.png) + +## Page Alerts Component + +Provides contextual **feedback messages** for typical user actions with a handful of **available** and **flexible** **alert messages**. Alerts are available for any length of text, as well as an **optional dismiss button**. + +![Page alerts component](../../images/leptonxlite-page-alerts-component.png) +```js +///... + this.replaceableComponents.add({ + component: YourNewPageAlertContainerComponent, + key: eThemeLeptonXComponents.PageAlertContainer, + }); +///... +``` +## Toolbar Component +![Breadcrumb component](../../images/leptonxlite-toolbar-component.png) + +Toolbar items are used to add **extra functionality to the toolbar**. The toolbar is a **horizontal bar** that **contains** a group of **toolbar items**. +```js +///... + this.replaceableComponents.add({ + component: YourNewNavItemsComponent, + key: eThemeLeptonXComponents.NavItems, + }); +///... +``` + +## Toolbar Items +There are two parts to the toolbar. The first is Language-Switch. The second is the User-Profile element. You can swap out each of these parts individually. + +## Language Switch Component + +Think about a **multi-lingual** website and the first thing that could **hit your mind** is **the language switch component**. A **navigation bar** is a **great place** to **embed a language switch**. By embedding the language switch in the navigation bar of your website, you would **make it simpler** for users to **find it** and **easily** switch the **language** **without trying to locate it across the website.** + +![Language switch component](../../images/leptonxlite-language-switch-component.png) +```js +///... + this.replaceableComponents.add({ + component: YourNewLanguagesComponent, + key: eThemeLeptonXComponents.Languages, + }); +///... +``` + +## User Menu Component + +The **User Menu** is the **menu** that **drops down** when you **click your name** or **profile picture** in the **upper right corner** of your page (**in the toolbar**). It drops down options such as **Settings**, **Logout**, etc. + +![User menu component](../../images/leptonxlite-user-menu-component.png) +```js +///... + this.replaceableComponents.add({ + component: YourNewCurrentUserComponent, + key: eThemeLeptonXComponents.CurrentUser, + }); +///... +``` +Note: The language selection component in the Volo app is not replaceable. It is part of the settings menu. + +## Mobile Navbar Component +The **mobile navbar component** is used to display the **navbar menu on mobile devices**. The mobile navbar component is a **dropdown menu** that contains language selection and user menu. + +![Mobile user menu component](../../images/leptonxlite-mobile-user-menu-component.png) +```js +///... + this.replaceableComponents.add({ + component: YourNewMobileNavbarComponent, + key: eThemeLeptonXComponents.MobileNavbar, + }); +///... +``` +## Mobile Navbar Items. +There are two parts of the mobile navbar. The mobile navbar has Language-Switch and User-Profile. You can swap out each of these parts individually. + +The Mobile language-Selection component key is `eThemeLeptonXComponents.MobileLanguageSelection`. + +The Mobile User-Profile component key is `eThemeLeptonXComponents.MobileUserProfile`. + + diff --git a/docs/en/Tutorials/Part-3.md b/docs/en/Tutorials/Part-3.md index c0c7c3f7c7..18ae29ae96 100644 --- a/docs/en/Tutorials/Part-3.md +++ b/docs/en/Tutorials/Part-3.md @@ -241,13 +241,7 @@ $(function () { { title: l('PublishDate'), data: "publishDate", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(); - } + dataFormat: "datetime" }, { title: l('Price'), @@ -255,13 +249,7 @@ $(function () { }, { title: l('CreationTime'), data: "creationTime", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(luxon.DateTime.DATETIME_SHORT); - } + dataFormat: "datetime" } ] }) @@ -439,13 +427,7 @@ $(function () { { title: l('PublishDate'), data: "publishDate", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(); - } + dataFormat: "datetime" }, { title: l('Price'), @@ -453,13 +435,7 @@ $(function () { }, { title: l('CreationTime'), data: "creationTime", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(luxon.DateTime.DATETIME_SHORT); - } + dataFormat: "datetime" } ] }) @@ -587,13 +563,7 @@ $(function () { { title: l('PublishDate'), data: "publishDate", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(); - } + dataFormat: "datetime" }, { title: l('Price'), @@ -601,13 +571,7 @@ $(function () { }, { title: l('CreationTime'), data: "creationTime", - render: function (data) { - return luxon - .DateTime - .fromISO(data, { - locale: abp.localization.currentCulture.name - }).toLocaleString(luxon.DateTime.DATETIME_SHORT); - } + dataFormat: "datetime" } ] }) diff --git a/docs/en/Tutorials/Todo/Index.md b/docs/en/Tutorials/Todo/Index.md index e373871183..c036b2068b 100644 --- a/docs/en/Tutorials/Todo/Index.md +++ b/docs/en/Tutorials/Todo/Index.md @@ -17,7 +17,7 @@ You can find the source code of the completed application [here](https://github. ## Pre-Requirements * An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 6.0+](https://dotnet.microsoft.com/download/dotnet) development. -* [Node v14.x](https://nodejs.org/) +* [Node v16.x](https://nodejs.org/) {{if DB=="Mongo"}} diff --git a/docs/en/Tutorials/Todo/Single-Layer/Index.md b/docs/en/Tutorials/Todo/Single-Layer/Index.md index 883a756cc7..b257ebbe01 100644 --- a/docs/en/Tutorials/Todo/Single-Layer/Index.md +++ b/docs/en/Tutorials/Todo/Single-Layer/Index.md @@ -17,7 +17,7 @@ You can find the source code of the completed application [here](https://github. ## Pre-Requirements * An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 6.0+](https://dotnet.microsoft.com/download/dotnet) development. -* [Node v14.x](https://nodejs.org/) +* [Node v16.x](https://nodejs.org/) {{if DB=="Mongo"}} diff --git a/docs/en/UI/Angular/Account-Module.md b/docs/en/UI/Angular/Account-Module.md index 3b2363361a..d3934ab18b 100644 --- a/docs/en/UI/Angular/Account-Module.md +++ b/docs/en/UI/Angular/Account-Module.md @@ -95,6 +95,24 @@ export class AppRoutingModule {} Before v4.3, the "My account" link in the current user dropdown on the top bar redirected the user to MVC's profile management page. As of v4.3, if you added the account module to your project, the same link will land on a page in the Angular UI account module instead. +### Personal Info Page Confirm Message + +When the user changes their own data on the personal settings tab in My Account, The data can not update the CurrentUser key of Application-Configuration. The information of the user is stored in claims. The only way to apply this information to the CurrentUser of Application-Configuration is user should log out and log in. When the Refresh-Token feature is implemented, it will be fixed. So We've added a confirmation alert. + +If you want to disable these warning, You should set `isPersonalSettingsChangedConfirmationActive` false + +```js +// app-routing.module.ts +const routes: Routes = [ + //... + { + path: 'account', + loadChildren: () => import('@volo/abp.ng.account/public').then(m => m.AccountPublicModule.forLazy({ isPersonalSettingsChangedConfirmationActive:false })), + }, + //... +export class AppRoutingModule {} +``` + ### Security Logs Page [COMMERCIAL] Before v4.3, the "Security Logs" link in the current user dropdown on the top bar redirected the user to MVC's security logs page. As of v4.3, if you added the account module to your project, the same link will land on a page in the Angular UI account public module instead. diff --git a/docs/en/UI/Angular/Quick-Start.md b/docs/en/UI/Angular/Quick-Start.md index b487a1472b..e3f25ceb01 100644 --- a/docs/en/UI/Angular/Quick-Start.md +++ b/docs/en/UI/Angular/Quick-Start.md @@ -4,7 +4,7 @@ Please follow the steps below to prepare your development environment for Angular. -1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js v12 or v14 installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. +1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js v16 or v18 installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system. 2. **[Optional] Install Yarn:** You may install Yarn v1 (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v6 and below. You may skip this step and work with npm, which is built-in in Node.js, instead. 3. **[Optional] Install VS Code:** [VS Code](https://code.visualstudio.com/) is a free, open-source IDE which works seamlessly with TypeScript. Although you can use any IDE including Visual Studio or Rider, VS Code will most likely deliver the best developer experience when it comes to Angular projects. ABP project templates even contain plugin recommendations for VS Code users, which VS Code will ask you to install when you open the Angular project folder. Here is a list of recommended extensions: - [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=angular.ng-template) diff --git a/docs/en/UI/Angular/Theme-Configurations.md b/docs/en/UI/Angular/Theme-Configurations.md index 85d22040df..1ec4f56c5e 100644 --- a/docs/en/UI/Angular/Theme-Configurations.md +++ b/docs/en/UI/Angular/Theme-Configurations.md @@ -1,3 +1,220 @@ # Angular UI: Theme Configurations -> This document is in draft version. \ No newline at end of file +Theme packages no longer import styles as CSS modules as of ABP version 6.0. The following style settings need to be included to the angular.json file in order for theme packages to load styles. +## Lepton X Lite +```json +{ + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/bootstrap-dim.css", + "inject": false, + "bundleName": "bootstrap-dim" +}, +{ + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/ng-bundle.css", + "inject": false, + "bundleName": "ng-bundle" +}, +{ + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/side-menu/layout-bundle.css", + "inject": false, + "bundleName": "layout-bundle" +}, +{ + "input": "node_modules/@abp/ng.theme.lepton-x/assets/css/abp-bundle.css", + "inject": false, + "bundleName": "abp-bundle" +}, +{ + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/bootstrap-dim.rtl.css", + "inject": false, + "bundleName": "bootstrap-dim.rtl" +}, +{ + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/ng-bundle.rtl.css", + "inject": false, + "bundleName": "ng-bundle.rtl" +}, +{ + "input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/side-menu/layout-bundle.rtl.css", + "inject": false, + "bundleName": "layout-bundle.rtl" +}, +{ + "input": "node_modules/@abp/ng.theme.lepton-x/assets/css/abp-bundle.rtl.css", + "inject": false, + "bundleName": "abp-bundle.rtl" +}, +``` + +## Theme Basic +```json +{ + "input": "node_modules/bootstrap/dist/css/bootstrap.rtl.min.css", + "inject": false, + "bundleName": "bootstrap-rtl.min" +}, +{ + "input": "node_modules/bootstrap/dist/css/bootstrap.min.css", + "inject": true, + "bundleName": "bootstrap-ltr.min" +}, +``` + +## Lepton X +```json +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/dark.css", + "inject": false, + "bundleName": "dark" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/light.css", + "inject": false, + "bundleName": "light" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/dim.css", + "inject": false, + "bundleName": "dim" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-dim.css", + "inject": false, + "bundleName": "bootstrap-dim" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-dark.css", + "inject": false, + "bundleName": "bootstrap-dark" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-light.css", + "inject": false, + "bundleName": "bootstrap-light" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/ng-bundle.css", + "inject": false, + "bundleName": "ng-bundle" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/side-menu/layout-bundle.css", + "inject": false, + "bundleName": "layout-bundle" +}, +{ + "input": "node_modules/@volosoft/abp.ng.theme.lepton-x/assets/css/abp-bundle.css", + "inject": false, + "bundleName": "abp-bundle" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/dark.rtl.css", + "inject": false, + "bundleName": "dark.rtl" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/light.rtl.css", + "inject": false, + "bundleName": "light.rtl" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/dim.rtl.css", + "inject": false, + "bundleName": "dim.rtl" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-dim.rtl.css", + "inject": false, + "bundleName": "bootstrap-dim.rtl" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-dark.rtl.css", + "inject": false, + "bundleName": "bootstrap-dark.rtl" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-light.rtl.css", + "inject": false, + "bundleName": "bootstrap-light.rtl" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/ng-bundle.rtl.css", + "inject": false, + "bundleName": "ng-bundle.rtl" +}, +{ + "input": "node_modules/@volosoft/ngx-lepton-x/assets/css/side-menu/layout-bundle.rtl.css", + "inject": false, + "bundleName": "layout-bundle.rtl" +}, +{ + "input": "node_modules/@volosoft/abp.ng.theme.lepton-x/assets/css/abp-bundle.rtl.css", + "inject": false, + "bundleName": "abp-bundle.rtl" +} +``` + +## Theme Lepton +```json +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton1.min.css", + "inject": false, + "bundleName": "lepton1" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton2.min.css", + "inject": false, + "bundleName": "lepton2" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton3.min.css", + "inject": false, + "bundleName": "lepton3" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton4.min.css", + "inject": false, + "bundleName": "lepton4" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton5.min.css", + "inject": false, + "bundleName": "lepton5" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton6.min.css", + "inject": false, + "bundleName": "lepton6" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton1.rtl.min.css", + "inject": false, + "bundleName": "lepton1.rtl" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton2.rtl.min.css", + "inject": false, + "bundleName": "lepton2.rtl" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton3.rtl.min.css", + "inject": false, + "bundleName": "lepton3.rtl" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton4.rtl.min.css", + "inject": false, + "bundleName": "lepton4.rtl" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton5.rtl.min.css", + "inject": false, + "bundleName": "lepton5.rtl" +}, +{ + "input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton6.rtl.min.css", + "inject": false, + "bundleName": "lepton6.rtl" +}, +``` + + diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Auth.md b/docs/en/UI/AspNetCore/JavaScript-API/Auth.md index 45af8c4b3e..b50e077ba6 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Auth.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Auth.md @@ -20,5 +20,4 @@ if (abp.auth.isGranted('DeleteUsers')) { * ` abp.auth.isAnyGranted(...)`: Gets one or more permission/policy names and returns `true` if at least one of them has granted. * `abp.auth.areAllGranted(...)`: Gets one or more permission/policy names and returns `true` if all of them of them have granted. -* `abp.auth.policies`: This is an object where its keys are the permission/policy names. You can find all permission/policy names here. * `abp.auth.grantedPolicies`: This is an object where its keys are the permission/policy names. You can find the granted permission/policy names here. \ No newline at end of file diff --git a/docs/en/images/leptonxlite-toolbar-component.png b/docs/en/images/leptonxlite-toolbar-component.png new file mode 100644 index 0000000000..6076c20ff0 Binary files /dev/null and b/docs/en/images/leptonxlite-toolbar-component.png differ diff --git a/docs/zh-Hans/Audit-Logging.md b/docs/zh-Hans/Audit-Logging.md index a8b6e66449..5463fdb03c 100644 --- a/docs/zh-Hans/Audit-Logging.md +++ b/docs/zh-Hans/Audit-Logging.md @@ -42,6 +42,7 @@ Configure(options => * `AlwaysLogOnException`(默认值: `true`): 如果设置为 `true`,将始终在异常/错误情况下保存审计日志,不检查其他选项(`IsEnabled` 除外,它完全禁用了审计日志). * `IsEnabledForGetRequests` (默认值: `false`): HTTP GET请求通常不应该在数据库进行任何更改,审计日志系统不会为GET请求保存审计日志对象. 将此值设置为 `true` 可为GET请求启用审计日志系统. * `ApplicationName`: 如果有多个应用程序保存审计日志到单一的数据库,使用此属性设置为你的应用程序名称区分不同的应用程序日志. +* `DisableLogActionInfo` (默认值: `false`): 如果设置为 `true`, 将不再记录 `AuditLogActionInfo`. * `IgnoredTypes`: 审计日志系统忽略的 `Type` 列表. 如果它是实体类型,则不会保存此类型实体的更改. 在序列化操作参数时也使用此列表. * `EntityHistorySelectors`:选择器列表,用于确定是否选择了用于保存实体更改的实体类型. 有关详细信息请参阅下面的部分. * `Contributors`: `AuditLogContributor` 实现的列表. 贡献者是扩展审计日志系统的一种方式. 有关详细信息请参阅下面的"审计日志贡献者"部分. diff --git a/docs/zh-Hans/CLI.md b/docs/zh-Hans/CLI.md index f108bbcfec..3444b211ec 100644 --- a/docs/zh-Hans/CLI.md +++ b/docs/zh-Hans/CLI.md @@ -409,6 +409,7 @@ abp login # Allows you to enter your abp login -p # Specify the password as a parameter (password is visible) abp login --organization # If you have multiple organizations, you need set your active organization abp login -p -o # You can enter both your password and organization in the same command +abp login --device # Use device login flow ``` > 当使用-p参数,请注意,因为你的密码是可见的. 它对于CI / CD自动化管道很有用. diff --git a/docs/zh-Hans/Getting-Started-Setup-Environment.md b/docs/zh-Hans/Getting-Started-Setup-Environment.md index c0c2d5d924..8b6312d2da 100644 --- a/docs/zh-Hans/Getting-Started-Setup-Environment.md +++ b/docs/zh-Hans/Getting-Started-Setup-Environment.md @@ -21,7 +21,7 @@ * 一个集成开发环境 (比如: [Visual Studio](https://visualstudio.microsoft.com/vs/)) 它需要支持 [.NET 6.0+](https://dotnet.microsoft.com/download/dotnet) 的开发. {{ if UI != "Blazor" }} -* [Node v12 或 v14](https://nodejs.org/) +* [Node v16 或 v18](https://nodejs.org/) * [Yarn v1.20+ (不是v2)](https://classic.yarnpkg.com/en/docs/install) [1](#f-yarn) 或 npm v6+ (已跟随Node一起安装) {{ end }} {{ if Tiered == "Yes" }} diff --git a/docs/zh-Hans/SMS-Sending.md b/docs/zh-Hans/SMS-Sending.md new file mode 100644 index 0000000000..5c3c111656 --- /dev/null +++ b/docs/zh-Hans/SMS-Sending.md @@ -0,0 +1,111 @@ +# 短信发送 + +ABP 框架提供一个用于发送短信的抽象, 有如下优点: + +- 在不改变应用程序代码的情况下, 你可以**非常容易地切换**短信发送提供者(提供商). +- 如果你想创建可重用的应用程序模块, 则不需要假设短信是如何发送的. + +## 安装 + +建议你使用[ABP CLI](CLI.md)来安装这个包. + +### 使用Abp CLI + +在项目所在目录(.csproj 文件所在目录)打开命令行工具, 输入如下命令: + +```bash +abp add-package Volo.Abp.Sms +``` + +### 手动安装 + +如果你想要手动安装; + +1. 添加 [Volo.Abp.Sms](https://www.nuget.org/packages/Volo.Abp.Sms) NuGet 包到你的项目中: + +``` +Install-Package Volo.Abp.Sms +``` + +2. 在你的模块的依赖列表中添加对模块`AbpSmsModule`的依赖: + +```csharp +[DependsOn( + //...其它依赖 + typeof(AbpSmsModule) //添加新模块的依赖 + )] +public class YourModule : AbpModule +{ +} +``` + +## 发送短信 + +[注入](Dependency-Injection.md) `ISmsSender`, 并使用`SendAsync`方法来发送短信. + +**例子:** + +```csharp +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Sms; + +namespace MyProject +{ + public class MyService : ITransientDependency + { + private readonly ISmsSender _smsSender; + + public MyService(ISmsSender smsSender) + { + _smsSender = smsSender; + } + + public async Task DoItAsync() + { + await _smsSender.SendAsync( + "+012345678901", // 目标手机号 + "This is test sms..." // 消息内容 + ); + } + } +} +``` + +示例中给定的`SendAsync`方法是一个扩展方法, 用于发送带有基本参数的短信.此外, 你也可以传入一个有如下属性的`SmsMessage`对象: + +- `PhoneNumber` (`string`):目标手机号 +- `Text` (`string`):短信消息内容 +- `Properties` (`Dictionary`):用于传入自定义参数的键值对 + +## NullSmsSender + +`NullSmsSender`是`ISmsSender`的一个默认实现.它写入内容到[日志](Logging.md)中, 而不是真正地发送短信. + +开发时, 你不想真正地发送短信时, 这个类是非常有用的.**然而, 若你想真实发送短信, 你需要在你的应用程序代码中实现`ISmsSender`接口.** + +## 实现ISmsSender接口 + +通过创建一个实现`ISmsSender`接口的类, 你可以很容易创建你自己的短信发送实现, 如下所示: + +```csharp +using System.IO; +using System.Threading.Tasks; +using Volo.Abp.Sms; +using Volo.Abp.DependencyInjection; + +namespace AbpDemo +{ + public class MyCustomSmsSender : ISmsSender, ITransientDependency + { + public async Task SendAsync(SmsMessage smsMessage) + { + // 发送短信 + } + } +} +``` + +## More + +[ABP Commercial](https://commercial.abp.io/)提供Twilio的集成包, 用于使用[Twilio service](https://docs.abp.io/en/commercial/latest/modules/twilio-sms)来发送短信. diff --git a/docs/zh-Hans/Tutorials/Todo/Index.md b/docs/zh-Hans/Tutorials/Todo/Index.md index 2200bf23e6..9e98eb0a0a 100644 --- a/docs/zh-Hans/Tutorials/Todo/Index.md +++ b/docs/zh-Hans/Tutorials/Todo/Index.md @@ -26,7 +26,7 @@ {{if UI=="NG"}} -* [Node v14.x](https://nodejs.org/) +* [Node v16.x](https://nodejs.org/) {{end}} diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj index 439bdc2c65..bfe8b1d37b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Authentication.JwtBearer Volo.Abp.AspNetCore.Authentication.JwtBearer $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj index 19420e4c11..562e559273 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Authentication.OAuth Volo.Abp.AspNetCore.Authentication.OAuth $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj index e7810f6e37..4ee09824cf 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj index aad7755a37..c632120d73 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Library true diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj index 2cdbb63404..09c743bc2a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Library true diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj index 2ae2151e57..d0abc31cdc 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj index f8f4d5702c..bc975f9f92 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj index e835daf343..e310f4a2e2 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj index 8825a88626..5ddfd202a5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Components.WebAssembly Volo.Abp.AspNetCore.Components.WebAssembly $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj b/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj index acd1ff5408..79d67f8b57 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Components Volo.Abp.AspNetCore.Components $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj index 41127ef197..ac7d3eb556 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.MultiTenancy Volo.Abp.AspNetCore.MultiTenancy $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs index 8fc6a3995c..00b3f87056 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs @@ -118,6 +118,12 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency uiCulture = defaultLanguage; } - return new RequestCulture(culture, uiCulture); + if (CultureHelper.IsValidCultureCode(culture) && + CultureHelper.IsValidCultureCode(uiCulture)) + { + return new RequestCulture(culture, uiCulture); + } + + return null; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj index 5805e19376..2e5a66d740 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Mvc.Client Volo.Abp.AspNetCore.Mvc.Client $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationAuthConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationAuthConfigurationDto.cs index be5a022b01..3b94ea0b72 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationAuthConfigurationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationAuthConfigurationDto.cs @@ -6,13 +6,10 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; [Serializable] public class ApplicationAuthConfigurationDto { - public Dictionary Policies { get; set; } - public Dictionary GrantedPolicies { get; set; } public ApplicationAuthConfigurationDto() { - Policies = new Dictionary(); GrantedPolicies = new Dictionary(); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj index 78b46cad27..e1ede9fe69 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 enable enable diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj index d792a30b24..0c72d5acc5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 enable enable diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj index 0cb4998d07..75b09d631b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Bootstrap Volo.Abp.AspNetCore.Mvc.UI.Bootstrap diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.csproj index e7e3708a73..97d5b8b2a3 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj index 31842572e1..535a907335 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Bundling Volo.Abp.AspNetCore.Mvc.UI.Bundling diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj index 15ea7f6eae..ed68be0443 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en-GB.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en-GB.json index e93e7ef25e..0e526b3df6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en-GB.json +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en-GB.json @@ -1,7 +1,7 @@ { "culture": "en-GB", "texts": { - "GivenTenantIsNotExist": "Given tenant is not exist: {0}", + "GivenTenantIsNotExist": "Given tenant does not exist: {0}", "GivenTenantIsNotAvailable": "Given tenant is not available: {0}", "Tenant": "Tenant", "Switch": "switch", diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj index f797dc9cfe..26bcc85cf7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Packages Volo.Abp.AspNetCore.Mvc.UI.Packages diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj index 0fea391a07..cad3da097a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo @@ -26,7 +26,7 @@ - + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj index 04d37045f2..40f95d10c9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js index f87b7c27b1..47e89dcaae 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js @@ -36,7 +36,7 @@ var abp = abp || {}; var $a = $(''); if (fieldItem.displayNameHtml) { - $a.html(fieldItem.text); + $a.html(abp.utils.isFunction(fieldItem.text) ? fieldItem.text(record, tableInstance) : fieldItem.text); } else { if (fieldItem.icon !== undefined && fieldItem.icon) { @@ -45,7 +45,7 @@ var abp = abp || {}; $a.append($("").addClass(fieldItem.iconClass + " me-1")); } - $a.append(htmlEncode(fieldItem.text)); + $a.append(htmlEncode(abp.utils.isFunction(fieldItem.text) ? fieldItem.text(record, tableInstance) : fieldItem.text)); } if (fieldItem.action) { @@ -81,14 +81,14 @@ var abp = abp || {}; var $button = $(''); if (firstItem.displayNameHtml) { - $button.html(firstItem.text); + $button.html(abp.utils.isFunction(firstItem.text) ? firstItem.text(record, tableInstance) : firstItem.text); } else { if (firstItem.icon !== undefined && firstItem.icon) { $button.append($("").addClass("fa fa-" + firstItem.icon + " me-1")); } else if (firstItem.iconClass) { $button.append($("").addClass(firstItem.iconClass + " me-1")); } - $button.append(htmlEncode(firstItem.text)); + $button.append(htmlEncode(abp.utils.isFunction(firstItem.text) ? firstItem.text(record, tableInstance) : firstItem.text)); } if (firstItem.enabled && !firstItem.enabled({ record: record, table: tableInstance })) { @@ -132,7 +132,7 @@ var abp = abp || {}; } if (field.text) { - $dropdownButton.append(htmlEncode(field.text)); + $dropdownButton.append(htmlEncode(abp.utils.isFunction(field.text) ? field.text(record, tableInstance) : field.text)); } else { $dropdownButton.append(htmlEncode(localize("DatatableActionDropdownDefaultText"))); } @@ -272,7 +272,7 @@ var abp = abp || {}; } }); - //Delay for processing indicator + //Delay for processing indicator var defaultDelayForProcessingIndicator = 500; var _existingDefaultFnPreDrawCallback = $.fn.dataTable.defaults.fnPreDrawCallback; $.extend(true, diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js index d62dba1809..78e98071ea 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/jquery/jquery-extensions.js @@ -99,7 +99,7 @@ // add unchecked checkboxes because serializeArray ignores them $(this).find("input[type=checkbox]").each(function () { if (!$(this).is(':checked')) { - data.push({name: this.name, value: this.checked}); + data.push({ name: this.name, value: this.checked }); } }); @@ -118,26 +118,7 @@ }); //map to object - - var getVarName = function (v) { - return v.toString().replace(/\(\)\s?=\>\s?/, ''); - } - - var getNames = function (index, variable) { - var name = ''; - for (var i = 0; i <= index; i++) { - if (i == 0) { - name = variable + '[' + i + ']' - } else { - name += '][' + variable + '[' + i + ']' - } - } - return name; - } - var obj = {}; - var objName = getVarName(() => obj); - if (camelCase !== undefined ? camelCase : true) { data.forEach(function (d) { d.name = toCamelCase(d.name); @@ -146,18 +127,19 @@ data.map(function (x) { var names = x.name.split("."); - var xName = getVarName(() => x); - var namesName = getVarName(() => names); + for (var i = 0; i < names.length; i++) { + var o = obj; + for (var j = 0; j <= i; j++) { + if ($.isEmptyObject(o[names[j]])) { + o[names[j]] = {}; + } - var i = obj ? 0 : 1; - for (i = 0; i < names.length; i++) { - if (eval('!' + objName + '[' + getNames(i, '' + namesName + '') + ']')) { - eval('' + objName + '[' + getNames(i, '' + namesName + '') + '] = {}'); - } - } + if (i == names.length - 1 && j == i) { + o[names[j]] = x.value; + } - if ($.isEmptyObject(eval('' + objName + '[' + getNames(names.length - 1, '' + namesName + '') + ']'))) { - eval('' + objName + '[' + getNames(names.length - 1, '' + namesName + '') + '] = ' + xName + '.value'); + o = o[names[j]] + } } }); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj index f03f8ab250..cbb3d106a1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI.Widgets Volo.Abp.AspNetCore.Mvc.UI.Widgets diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj index 887843eb03..1975ba8a67 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc.UI Volo.Abp.AspNetCore.Mvc.UI diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj index 9113c4529e..46baa07c19 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 true Volo.Abp.AspNetCore.Mvc Volo.Abp.AspNetCore.Mvc diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs index 0deae4b5b3..4254b5479f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs @@ -185,8 +185,6 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp foreach (var policyName in otherPolicyNames) { - authConfig.Policies[policyName] = true; - if (await _authorizationService.IsGrantedAsync(policyName)) { authConfig.GrantedPolicies[policyName] = true; @@ -196,7 +194,6 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp var result = await _permissionChecker.IsGrantedAsync(abpPolicyNames.ToArray()); foreach (var (key, value) in result.Result) { - authConfig.Policies[key] = true; if (value == PermissionGrantResult.Granted) { authConfig.GrantedPolicies[key] = true; @@ -228,10 +225,10 @@ public class AbpApplicationConfigurationAppService : ApplicationService, IAbpApp foreach (var resourceName in resourceNames) { var dictionary = new Dictionary(); - + var localizer = await StringLocalizerFactory .CreateByResourceNameOrNullAsync(resourceName); - + if (localizer != null) { foreach (var localizedString in await localizer.GetAllStringsAsync()) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/AbpAuditActionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/AbpAuditActionFilter.cs index 954a0bd6c7..82105693ec 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/AbpAuditActionFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/AbpAuditActionFilter.cs @@ -41,8 +41,12 @@ public class AbpAuditActionFilter : IAsyncActionFilter, ITransientDependency finally { stopwatch.Stop(); - auditLogAction.ExecutionDuration = Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds); - auditLog.Actions.Add(auditLogAction); + + if (auditLogAction != null) + { + auditLogAction.ExecutionDuration = Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds); + auditLog.Actions.Add(auditLogAction); + } } } } @@ -78,12 +82,16 @@ public class AbpAuditActionFilter : IAsyncActionFilter, ITransientDependency } auditLog = auditLogScope.Log; - auditLogAction = auditingHelper.CreateAuditLogAction( - auditLog, - context.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType(), - context.ActionDescriptor.AsControllerActionDescriptor().MethodInfo, - context.ActionArguments - ); + + if (!options.DisableLogActionInfo) + { + auditLogAction = auditingHelper.CreateAuditLogAction( + auditLog, + context.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType(), + context.ActionDescriptor.AsControllerActionDescriptor().MethodInfo, + context.ActionArguments + ); + } return true; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/AbpAuditPageFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/AbpAuditPageFilter.cs index 1f347decf7..51137d3812 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/AbpAuditPageFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/AbpAuditPageFilter.cs @@ -46,8 +46,12 @@ public class AbpAuditPageFilter : IAsyncPageFilter, ITransientDependency finally { stopwatch.Stop(); - auditLogAction.ExecutionDuration = Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds); - auditLog.Actions.Add(auditLogAction); + + if (auditLogAction != null) + { + auditLogAction.ExecutionDuration = Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds); + auditLog.Actions.Add(auditLogAction); + } } } } @@ -81,12 +85,16 @@ public class AbpAuditPageFilter : IAsyncPageFilter, ITransientDependency } auditLog = auditLogScope.Log; - auditLogAction = auditingHelper.CreateAuditLogAction( - auditLog, - context.HandlerMethod.MethodInfo.DeclaringType, - context.HandlerMethod.MethodInfo, - context.HandlerArguments - ); + + if (!options.DisableLogActionInfo) + { + auditLogAction = auditingHelper.CreateAuditLogAction( + auditLog, + context.HandlerMethod.MethodInfo.DeclaringType, + context.HandlerMethod.MethodInfo, + context.HandlerArguments + ); + } return true; } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentOutputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentOutputFormatter.cs index 5c5e7ed6c0..e41616617d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentOutputFormatter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentOutputFormatter.cs @@ -27,7 +27,7 @@ public class RemoteStreamContentOutputFormatter : OutputFormatter context.HttpContext.Response.ContentType = remoteStream.ContentType; context.HttpContext.Response.ContentLength = remoteStream.ContentLength; - if (!remoteStream.FileName.IsNullOrWhiteSpace()) + if (!remoteStream.FileName.IsNullOrWhiteSpace() && !context.HttpContext.Response.Headers.ContainsKey(HeaderNames.ContentDisposition)) { var contentDisposition = new ContentDispositionHeaderValue("attachment"); contentDisposition.SetHttpFileName(remoteStream.FileName); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs index 9f5d6aa530..8a4f82953a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Mvc; using System; +using System.Globalization; using System.Threading.Tasks; using Microsoft.AspNetCore.RequestLocalization; using Volo.Abp.Auditing; @@ -30,6 +31,11 @@ public class AbpLanguagesController : AbpController throw new AbpException("The selected culture is not valid! Make sure you enter a valid culture code."); } + if (!CultureHelper.IsValidCultureCode(uiCulture)) + { + throw new AbpException("The selected uiCulture is not valid! Make sure you enter a valid culture code."); + } + AbpRequestCultureCookieHelper.SetCultureCookie( HttpContext, new RequestCulture(culture, uiCulture) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs index 5c955ca005..8f6cc2abf8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs @@ -98,7 +98,15 @@ public class AbpUowActionFilter : IAsyncActionFilter, ITransientDependency var currentUow = unitOfWorkManager.Current; if (currentUow != null) { - await currentUow.SaveChangesAsync(context.HttpContext.RequestAborted); + try + { + await currentUow.SaveChangesAsync(context.HttpContext.RequestAborted); + } + catch (Exception e) + { + await currentUow.RollbackAsync(context.HttpContext.RequestAborted); + throw; + } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowPageFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowPageFilter.cs index af966fedce..57e1df8558 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowPageFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowPageFilter.cs @@ -104,7 +104,15 @@ public class AbpUowPageFilter : IAsyncPageFilter, ITransientDependency var currentUow = unitOfWorkManager.Current; if (currentUow != null) { - await currentUow.SaveChangesAsync(context.HttpContext.RequestAborted); + try + { + await currentUow.SaveChangesAsync(context.HttpContext.RequestAborted); + } + catch (Exception e) + { + await currentUow.RollbackAsync(context.HttpContext.RequestAborted); + throw; + } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj index 7e9e4f01a9..07ed436526 100644 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.Serilog Volo.Abp.AspNetCore.Serilog $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.csproj b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.csproj index 3a39bdc5f8..8d427a5f21 100644 --- a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.csproj +++ b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.SignalR Volo.Abp.AspNetCore.SignalR $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj index b3a7a89ad8..07e3a08920 100644 --- a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore.TestBase Volo.Abp.AspNetCore.TestBase $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj index a87b69eb19..aa1090e204 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj +++ b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj @@ -4,7 +4,7 @@ - net6.0 + net7.0 Volo.Abp.AspNetCore Volo.Abp.AspNetCore $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs index 7eaa8b55e8..0245cf11bc 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs @@ -1,6 +1,8 @@ +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Options; using Microsoft.Extensions.Primitives; using Volo.Abp.DependencyInjection; @@ -8,6 +10,13 @@ namespace Volo.Abp.AspNetCore.Security; public class AbpSecurityHeadersMiddleware : IMiddleware, ITransientDependency { + public IOptions Options { get; set; } + + public AbpSecurityHeadersMiddleware(IOptions options) + { + Options = options; + } + public async Task InvokeAsync(HttpContext context, RequestDelegate next) { /*X-Content-Type-Options header tells the browser to not try and “guess” what a mimetype of a resource might be, and to just take what mimetype the server has returned as fact.*/ @@ -19,6 +28,17 @@ public class AbpSecurityHeadersMiddleware : IMiddleware, ITransientDependency /*The X-Frame-Options HTTP response header can be used to indicate whether or not a browser should be allowed to render a page in a ,