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/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml new file mode 100644 index 0000000000..f897615f4b --- /dev/null +++ b/.github/workflows/spellcheck.yml @@ -0,0 +1,29 @@ +name: Documentation Checks + +on: + push: + branches: + - dev + paths: + # This ensures the check will only be run when something changes in the docs content + - "docs/en/**/*" + pull_request: + branches: + - dev + paths: + - "docs/en/**/*" +jobs: + spellcheck: + name: "Docs: Spellcheck (En)" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + name: Check out the code + - uses: actions/setup-node@v1 + name: Setup node + with: + node-version: "16" + - run: npm install -g cspell + name: Install cSpell + - run: cspell --config ./cSpell.json "docs/en/**/*.md" --no-progress # Update for path to the markdown files + name: Run cSpell 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/Account/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json index eebaf72246..f34bbd49c2 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json @@ -11,6 +11,7 @@ "CommercialSupportWebSite": "Commercial support web site", "CommunityWebSite": "ABP community web site", "ManageAccount": "My Account | ABP.IO", - "ManageYourProfile": "Manage your profile" + "ManageYourProfile": "Manage your profile", + "ReturnToApplication": "Return to application" } -} \ No newline at end of file +} diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 3251f8224f..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", @@ -400,6 +403,7 @@ "Deleted{0}": "[Deleted {0}]", "Tags": "Tags", "SetTagsInfo": "Tags should be comma-separated. Eg: CSharp, Entity Framework", - "RejectTrialLicenseWarningMessage": "Are you sure you want to reject this trial license request?" + "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..453d0cde2d 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,55 @@ "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", + "LeptonXThemeForDashboard": "LeptonX Theme for Your Admin Dashboard by", + "AbpPlatform": "ABP Platform", + "YouDeserveGoodUXUI": "You deserve a good UI and a better UX. LeptonX Theme by ABP is here to serve it.", + "ViewLiveDemo": "View Live Theme Demo", + "GetLeptonX": "Get LeptonX Now", + "SeeLeptonXDocumentation": "See LeptonX Documentation", + "SimplifiedMenu": "Simplified menu", + "SimplifiedMenuDescription": "You can easily find the page you are looking for by filtering the menu", + "YourFavoritePages": "Your favorite pages at your reach", + "YourFavoritePagesDescription": "Easily add or remove the page from favorites by clicking the star icon in the upper right corner of the page.", + "BreadCrumbs": "Breadcrumb for seamless switching", + "BreadCrumbsDescription": "Using Breadcrumb, you can switch to the pages at the same level with one-click, even when the left menu is closed, and it works on tablet and mobile responsive!", + "YourMenu": "Your menu as you wish", + "YourMenuDescription": "Customize the directly clickable icons and dropdown boxes on the user menu as you wish. User menu is completely customizable for your needs", + "RtlSupport": "RTL support for your language", + "RtlSupportDescription": "LeptonX Theme supports RTL for your language. The language options are in the settings menu for you to change the language.", + "YourColors": "Your colors on your admin dashboard UI", + "YourColorsDescription": "LeptonX Theme works according to your system preferences and has dashboard light theme, dashboard dark theme, and dashboard semi-dark theme options.", + "ArrangeContentWidth": "Easily arrange your content width", + "ArrangeContentWidthDescription": "Easily change the width of your content area.", + "LeptonXCompatibleWith": "LeptonX Theme is compatible with", + "MobileResponsiveTemplate": "Mobile Responsive Template", + "MobileResponsiveTemplateDescription1": "Access your LeptonX admin dashboard from any device you like.", + "MobileResponsiveTemplateDescription2": "It is designed for you to easily use in every device of yours. It is responsive on mobile devices and tablet sizes.", + "TopMenuLayoutOption": "Top Menu Layout Option", + "TopMenuLayoutOptionDescription1": "If you would like to set up your website with the same admin dashboard, it is possible to do it with LeptonX Theme!", + "TopMenuLayoutOptionDescription2": "Just try the LeptonX top menu layout to make it happen!", + "EasilyCustomizable": "Easily customizable for your brand colors", + "EasilyCustomizableDescription1": "You can customize the LeptonX theme using just a few SCSS variables. No overriding, no extra CSS load!", + "EasilyCustomizableDescription2": "With LeptonX, you can arrange your admin dashboard however you like.", + "IndependentLayout": "Independent layout and content area", + "IndependentLayoutDescription1": "LeptonX's layout infrastructure was designed completely separate from the content.", + "IndependentLayoutDescription2": "This means that you can freely design your project with a content structure other than Bootstrap if you want.", + "MostUsedLibraries": "Most used libraries integrated with LeptonX", + "MostUsedLibrariesDescription1": "LeptonX contains your most used libraries. It allows you to use libraries such as ApexCharts, DataTables, DropZone, FullCalender, JSTree, Select2, Toastr effortlessly.", + "MostUsedLibrariesDescription2": "LeptonX also supports MVC Angular and Blazor specific libraries.", + "CreateAndCustomize": "Create and customize the pages you need in seconds with LeptonX custom pages", + "CreateAndCustomizeDescription": "By using LeptonX Theme you also have access to many pre-made html pages. These include many pages such as login page, blog, FAQ, subscription list, invoice, pricing, file management.", + "LeptonThemeForAdmin": "Lepton Theme for your admin dashboard by", + "LeptonThemeForAdminDescription": "Lepton Theme is still available and will be maintained. If you want to switch to LeptonX Theme as a Lepton Theme user, you can see the documentation to learn how-to.", + "LeptonCompatibleWith": "Lepton Theme is compatible with" } } 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 8387eb0f5d..6aa6cfb42b 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -176,7 +176,7 @@ "Events_Page_MetaTitle": "ABP Community Events", "Events_Page_MetaDescription": "The live shows, hosted by the ABP Team, are casual sessions full of community content, demos, Q&A, and discussions around what's happening in ABP.", "Events_Page_Title": "ABP Community Talks", - "Events_Page_WritingFromUser": "Read writing from {0} on ABP Community.", + "Members_Page_WritingFromUser": "Read writing from {0} on ABP Community.", "Post_Create_Page_MetaTitle": "New Post", "Post_Create_Page_MetaDescription": "Create your post for sharing your experiences about ABP framework and contributing the ABP Community.", "Post_Create_Page_CreateNewPost": "Create New Post", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json index e0989162c4..01cc09a4dd 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json @@ -176,7 +176,7 @@ "Events_Page_MetaTitle": "ABP közösségi események", "Events_Page_MetaDescription": "Az ABP Team által rendezett élő műsorok hétköznapi előadások, tele közösségi tartalommal, demókkal, kérdésekkel és válaszokkal, valamint az ABP-ben zajló eseményekről szóló vitákkal.", "Events_Page_Title": "ABP közösségi beszélgetések", - "Events_Page_WritingFromUser": "Olvassa el {0} írását az ABP közösségben.", + "Members_Page_WritingFromUser": "Olvassa el {0} írását az ABP közösségben.", "Post_Create_Page_MetaTitle": "Új bejegyzés", "Post_Create_Page_MetaDescription": "Hozzon létre bejegyzést, hogy megossza tapasztalatait az ABP keretrendszerrel kapcsolatban, és hozzájáruljon az ABP közösséghez.", "Post_Create_Page_CreateNewPost": "Új bejegyzés létrehozása", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json index 73b2ff6559..ec5106293b 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json @@ -182,7 +182,7 @@ "Events_Page_MetaTitle": "ABP Topluluk Etkinlikleri", "Events_Page_MetaDescription": "ABP Ekibi tarafından düzenlenen canlı programlar, topluluk içeriği, demolar, Soru-Cevap ve ABP'de neler olup bittiğine dair tartışmalarla dolu rahat oturumlardır.", "Events_Page_Title": "ABP Topluluk Konuşmaları", - "Events_Page_WritingFromUser": "ABP Topluluğunda {0} adlı kişiden gelen yazıları okuyun.", + "Members_Page_WritingFromUser": "ABP Topluluğunda {0} adlı kişiden gelen yazıları okuyun.", "Post_Create_Page_MetaTitle": "Yeni Gönderi", "Post_Create_Page_MetaDescription": "ABP çerçevesi hakkındaki deneyimlerinizi paylaşmak ve ABP Topluluğuna katkıda bulunmak için gönderinizi oluşturun.", "Post_Create_Page_CreateNewPost": "Yeni Gönderi Oluştur", 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 657d85160c..23a98b5e4f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json @@ -176,7 +176,7 @@ "Events_Page_MetaTitle": "ABP 社区活动", "Events_Page_MetaDescription": "现场活动由 ABP 团队主持,是充满社区内容、演示、问答和围绕 ABP 正在发生的事情的讨论的休闲会议。", "Events_Page_Title": "ABP社区会谈", - "Events_Page_WritingFromUser": "阅读来自 ABP 社区的 {0} 的文章。", + "Members_Page_WritingFromUser": "阅读来自 ABP 社区的 {0} 的文章。", "Post_Create_Page_MetaTitle": "最新帖子", "Post_Create_Page_MetaDescription": "创建您的帖子以分享您对 ABP 框架的经验并为 ABP 社区做出贡献。", "Post_Create_Page_CreateNewPost": "创建新帖子", 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/cSpell.json b/cSpell.json new file mode 100644 index 0000000000..dd74bfb264 --- /dev/null +++ b/cSpell.json @@ -0,0 +1,151 @@ +{ + "version": "0.2", + "language": "en", + "words": [ + "ABP's", + "abpframework", + "Antiforgery", + "appsettings", + "aspnet", + "aspnetcore", + "Autofac", + "automagically", + "Blazor", + "CQRS", + "crossfade", + "Dapr", + "Datagrid's", + "Datatable", + "datepicker", + "dismissable", + "dockerized", + "entrypoints", + "findability", + "hoverable", + "Iddict", + "IntelliCode", + "Keysize", + "Linq", + "Microservices", + "middlewares", + "Minifier", + "multitenancy", + "multitenant", + "Navs", + "Newtonsoft", + "Npgsql", + "oidc", + "overridable", + "Parameterless", + "Passwordless", + "PKCE", + "preconfigured", + "proxying", + "redirections", + "scrollbars", + "signin", + "Templating", + "textboxes", + "toolset", + "unsubscription", + "Xunit" + ], + "ignoreWords": [ + "Aliyun", + "Allibone", + "Blazorise", + "Boutwell", + "Cmskit", + "connectionstrings", + "Devart", + "Formik", + "Halil", + "Hanselman", + "hikalkan", + "Ibrahim", + "İbrahim", + "Kalkan", + "Kirti", + "Kommunity", + "Kulkarni", + "Luxon", + "malihu", + "Malik", + "Masis", + "Minio", + "NGXS", + "NSWAG", + "Scriban", + "Serilog", + "Shoudly", + "Shouldly", + "Sweetalert", + "Syncfusion", + "Telerik", + "Timeago", + "Toastr", + "Volo", + "Volosoft", + "Xeevis" + ], + "patterns": [ + { + "name": "Markdown links", + "pattern": "\\((.*)\\)", + "description": "" + }, + { + "name": "Markdown code blocks", + "pattern": "/^(\\s*`{3,}).*[\\s\\S]*?^\\1/gmx", + "description": "Taken from the cSpell example at https://cspell.org/configuration/patterns/#verbose-regular-expressions" + }, + { + "name": "Inline code blocks", + "pattern": "\\`([^\\`\\r\\n]+?)\\`", + "description": "https://stackoverflow.com/questions/41274241/how-to-capture-inline-markdown-code-but-not-a-markdown-code-fence-with-regex" + }, + { + "name": "Link contents", + "pattern": "\\", + "description": "" + }, + { + "name": "Snippet references", + "pattern": "-- snippet:(.*)", + "description": "" + }, + { + "name": "Snippet references 2", + "pattern": "\\<\\[sample:(.*)", + "description": "another kind of snippet reference" + }, + { + "name": "Multi-line code blocks", + "pattern": "/^\\s*```[\\s\\S]*?^\\s*```/gm" + }, + { + "name": "HTML Tags", + "pattern": "<[^>]*>", + "description": "Reference: https://stackoverflow.com/questions/11229831/regular-expression-to-remove-html-tags-from-a-string" + }, + { + "name": "Markdown Image", + "pattern": "!\\[(.*)\\]\\((.*)\\)" + } + ], + "ignoreRegExpList": [ + "Markdown links", + "Markdown code blocks", + "Inline code blocks", + "Link contents", + "Snippet references", + "Snippet references 2", + "Multi-line code blocks", + "HTML Tags", + "Markdown Image" + ], + "ignorePaths": [ + "**/*Release/Post.md", + "**/*Preview/POST.md" + ] +} diff --git a/docs/en/Blob-Storing-Aws.md b/docs/en/Blob-Storing-Aws.md index 5b77431e84..c69024db28 100644 --- a/docs/en/Blob-Storing-Aws.md +++ b/docs/en/Blob-Storing-Aws.md @@ -59,7 +59,7 @@ Configure(options => * **ProfilesLocation** (string): The path to the aws credentials file to look at. * **Region** (string): The system name of the service. * **Policy** (string): An IAM policy in JSON format that you want to use as an inline session policy. -* **DurationSeconds** (int): Validity period(s) of a temporary access certificate,minimum is 900 and the maximum is 3600. **note**: Using subaccounts operated OSS,if the value is 0. +* **DurationSeconds** (int): Validity period(s) of a temporary access certificate,minimum is 900 and the maximum is 3600. **note**: Using sub-accounts operated OSS,if the value is 0. * **ContainerName** (string): You can specify the container name in Aws. If this is not specified, it uses the name of the BLOB container defined with the `BlobContainerName` attribute (see the [BLOB storing document](Blob-Storing.md)). Please note that Aws has some **rules for naming containers**. A container name must be a valid DNS name, conforming to the [following naming rules](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html): * Bucket names must be between **3** and **63** characters long. * Bucket names can consist only of **lowercase** letters, numbers, dots (.), and hyphens (-). diff --git a/docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/POST.md b/docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/POST.md index 4fe7bd39b9..8620b4f7d2 100644 --- a/docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/POST.md +++ b/docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/POST.md @@ -107,7 +107,7 @@ Here are some other notable changes that come with this release: * Developers should control `EnableLegacyTimestampBehavior` when using PostgreSQL. [#11371](https://github.com/abpframework/abp/pull/11371) [#65](https://github.com/abpframework/eShopOnAbp/pull/65) -All issues & PRs in [5.1 milesone](https://github.com/abpframework/abp/milestone/60?closed=1). +All issues & PRs in [5.1 milestone](https://github.com/abpframework/abp/milestone/60?closed=1). ### About ABP Commercial 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..f9e592a788 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -129,8 +129,8 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * `ef`: Entity Framework Core. * `mongodb`: MongoDB. * `--theme`: Specifes the theme. Default theme is `leptonx-lite`. Available themes: - * `leptonx-lite`: [LeptonX Lite Theme](/Themes/LeptonXLite/mvc.md). - * `basic`: [Basic Theme](/UI/AspNetCore/Basic-Theme.md). + * `leptonx-lite`: [LeptonX Lite Theme](Themes/LeptonXLite/AspNetCore.md). + * `basic`: [Basic Theme](UI/AspNetCore/Basic-Theme.md). * **`module`**: [Module template](Startup-Templates/Module.md). Additional options: * `--no-ui`: Specifies to not include the UI. This makes possible to create service-only modules (a.k.a. microservices - without UI). * **`console`**: [Console template](Startup-Templates/Console.md). @@ -144,8 +144,8 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * `ef`: Entity Framework Core. * `mongodb`: MongoDB. * `--theme`: Specifes the theme. Default theme is `leptonx-lite`. Available themes: - * `leptonx-lite`: [LeptonX Lite Theme](/Themes/LeptonXLite/mvc.md). - * `basic`: [Basic Theme](/UI/AspNetCore/Basic-Theme.md). + * `leptonx-lite`: [LeptonX Lite Theme](Themes/LeptonXLite/AspNetCore.md). + * `basic`: [Basic Theme](UI/AspNetCore/Basic-Theme.md). * **`maui`**: .NET MAUI. A minimalist .NET MAUI application will be created if you specify this option. * `--output-folder` or `-o`: Specifies the output folder. Default value is the current directory. * `--version` or `-v`: Specifies the ABP & template version. It can be a [release tag](https://github.com/abpframework/abp/releases) or a [branch name](https://github.com/abpframework/abp/branches). Uses the latest release if not specified. Most of the times, you will want to use the latest version. @@ -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-04-19-Customize-the-SignIn-Manager/POST.md b/docs/en/Community-Articles/2020-04-19-Customize-the-SignIn-Manager/POST.md index 9ae426624f..1694232f29 100644 --- a/docs/en/Community-Articles/2020-04-19-Customize-the-SignIn-Manager/POST.md +++ b/docs/en/Community-Articles/2020-04-19-Customize-the-SignIn-Manager/POST.md @@ -8,7 +8,7 @@ This document explains how to customize the SignIn Manager for your own applicat ## Create a CustomSignInManager -Create a new class inheriting the [SignInMager](https://github.com/dotnet/aspnetcore/blob/master/src/Identity/Core/src/SignInManager.cs) of Microsoft Identity package. +Create a new class inheriting the [SignInManager](https://github.com/dotnet/aspnetcore/blob/master/src/Identity/Core/src/SignInManager.cs) of Microsoft Identity package. ````csharp public class CustomSignInManager : Microsoft.AspNetCore.Identity.SignInManager diff --git a/docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md b/docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md index b2c307bcb3..e6c6774341 100644 --- a/docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md +++ b/docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md @@ -12,7 +12,7 @@ Two different **alternative approaches** for AzureAD integration will be demonst > There is **no difference** in functionality between these approaches. AddAzureAD is an abstracted way of OpenIdConnection ([source](https://github.com/dotnet/aspnetcore/blob/c56aa320c32ee5429d60647782c91d53ac765865/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAuthenticationBuilderExtensions.cs#L122)) with predefined cookie settings. > -> However there are key differences in integration to ABP applications because of default configurated signin schemes which will be explained below. +> However there are key differences in integration to ABP applications because of default configured signin schemes which will be explained below. ## 1. AddOpenIdConnect @@ -211,7 +211,7 @@ You can find the source code of the completed example [here](https://github.com/ to your openid configuration. -* Help! I keep getting ***AADSTS50011: The reply URL specified in the request does not match the reply URLs configured for the application*** error! +* Help! I keep getting `AADSTS50011: The reply URL specified in the request does not match the reply URLs configured for the application` error! * If you set your **CallbackPath** in appsettings as: diff --git a/docs/en/Community-Articles/2020-05-29-Real-Time-Messaging-In-A-Distributed-Architecture-Using-Abp-Framework-SingalR-RabbitMQ/POST.md b/docs/en/Community-Articles/2020-05-29-Real-Time-Messaging-In-A-Distributed-Architecture-Using-Abp-Framework-SingalR-RabbitMQ/POST.md index eea0eaae46..0d09112681 100644 --- a/docs/en/Community-Articles/2020-05-29-Real-Time-Messaging-In-A-Distributed-Architecture-Using-Abp-Framework-SingalR-RabbitMQ/POST.md +++ b/docs/en/Community-Articles/2020-05-29-Real-Time-Messaging-In-A-Distributed-Architecture-Using-Abp-Framework-SingalR-RabbitMQ/POST.md @@ -1,4 +1,4 @@ -# Real Time Messaging In A Distributed Architecture Using Abp Framework, SingalR & RabbitMQ +# Real Time Messaging In A Distributed Architecture Using Abp Framework, SignalR & RabbitMQ In this article, we will build a basic real time messaging application in a distributed architecture. We will use [Abp Framework](https://abp.io) for infrastructure and tiered startup template, [SignalR](https://dotnet.microsoft.com/apps/aspnet/signalr) for real time server-client communication and [RabbitMQ](https://www.rabbitmq.com/) as the distributed event bus. diff --git a/docs/en/Community-Articles/2020-07-21-File-Upload-Download-With-BLOB-Storage-System-in-ASPNET-Core-ABP-Framework/POST.md b/docs/en/Community-Articles/2020-07-21-File-Upload-Download-With-BLOB-Storage-System-in-ASPNET-Core-ABP-Framework/POST.md index 560e15e288..a6fb03d6c4 100644 --- a/docs/en/Community-Articles/2020-07-21-File-Upload-Download-With-BLOB-Storage-System-in-ASPNET-Core-ABP-Framework/POST.md +++ b/docs/en/Community-Articles/2020-07-21-File-Upload-Download-With-BLOB-Storage-System-in-ASPNET-Core-ABP-Framework/POST.md @@ -46,11 +46,11 @@ Open a command prompt (terminal) in the folder containing your solution (.sln) f `abp add-module Volo.Abp.BlobStoring.Database` -This action will add the module depencies and also module migration. After this action, run `FileActionsDemo.DbMigrator` to update the database. +This action will add the module dependencies and also module migration. After this action, run `FileActionsDemo.DbMigrator` to update the database. -### Setting up Blob Storaging +### Setting up Blob Storage -BLOB Strorage system works with `Containers`. Before the using blob storage, we need to create our blob container. +BLOB Storage system works with `Containers`. Before the using blob storage, we need to create our blob container. Create a class that name `MyFileContainer` at the `FileActionsDemo.Domain` project. diff --git a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md index c82365efee..1b56d1f2b7 100644 --- a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md +++ b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md @@ -107,7 +107,7 @@ Next time you hit login, you should be seeing login screen enabled Azure AD like * But I don't want my users to see default login screen. I want my users to login **only** from AzureAD. - * You can **mimic** this behaviour by customizing the login page and instantly trigger Azure AD provider click. For more info, you can check [this article](https://community.abp.io/articles/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd). + * You can **mimic** this behavior by customizing the login page and instantly trigger Azure AD provider click. For more info, you can check [this article](https://community.abp.io/articles/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd). # May 2021 Update 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/2021-03-12-Simple-SignalR-Notification/POST.md b/docs/en/Community-Articles/2021-03-12-Simple-SignalR-Notification/POST.md index a53fec2e48..12154dc538 100644 --- a/docs/en/Community-Articles/2021-03-12-Simple-SignalR-Notification/POST.md +++ b/docs/en/Community-Articles/2021-03-12-Simple-SignalR-Notification/POST.md @@ -85,7 +85,7 @@ Add [Microsoft.SignalR](https://www.npmjs.com/package/@microsoft/signalr) JavaSc You can install the latest version (3.1.13 will be old) ``` "@microsoft/signalr": "^3.1.13" -```` +``` ![Add SignalR package](signalr-package.jpg) @@ -93,7 +93,7 @@ You can install the latest version (3.1.13 will be old) We added SignalR to the `package.json` but it comes into your `node_modules` folder. We need to copy the related files to `wwwroot/libs` folder. To do this copy the content of the following file to your `abp.resourcemappings.js` file. It's in your root directory of Web folder. After you do this, go to your web directory and run `abp install-libs` command. By doing this, it'll copy the related files into your `wwwroot/libs` folder. -[abp.resourcemappings.js](https://gist.github.com/ebicoglu/f7dc22cca2d353f8bf7f68a03e3395b8#file-abp-resourcemapping-js) +[`abp.resourcemappings.js`](https://gist.github.com/ebicoglu/f7dc22cca2d353f8bf7f68a03e3395b8#file-abp-resourcemapping-js) ![Resource mappings](resource-mappings.jpg) diff --git a/docs/en/Community-Articles/2022-02-22-Integrating-MAUI-Client-via-using-OpenID-Connect/README.md b/docs/en/Community-Articles/2022-02-22-Integrating-MAUI-Client-via-using-OpenID-Connect/README.md index 0d86c98a1d..fa6ecdcc96 100644 --- a/docs/en/Community-Articles/2022-02-22-Integrating-MAUI-Client-via-using-OpenID-Connect/README.md +++ b/docs/en/Community-Articles/2022-02-22-Integrating-MAUI-Client-via-using-OpenID-Connect/README.md @@ -595,7 +595,7 @@ In this step we have to store access token & refresh token for future requests. ## Recap -The purpose of this arcitle is connecting to ABP backend with access token and it's working properly. +The purpose of this article is connecting to ABP backend with access token and it's working properly. -I'm planning to integrate HttpApi.Client library of backend project instead of making requests manually as a second part of this article. I'll get inspired by [hikalkan/maui-abp-playing](https://github.com/hikalkan/maui-abp-playing) repo to achive that. +I'm planning to integrate HttpApi.Client library of backend project instead of making requests manually as a second part of this article. I'll get inspired by [hikalkan/maui-abp-playing](https://github.com/hikalkan/maui-abp-playing) repo to achieve that. 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/Community-Articles/2022-10-27-Dotnet7-Upgrade/Upgrade-Your-Existing-Projects-to-Dotnet7.md b/docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/Upgrade-Your-Existing-Projects-to-Dotnet7.md new file mode 100644 index 0000000000..1fcdd78cd5 --- /dev/null +++ b/docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/Upgrade-Your-Existing-Projects-to-Dotnet7.md @@ -0,0 +1,265 @@ +# Upgrade Your Existing Projects to .NET7 + +A new .NET version has come. As open-source contributors, we are tracking the latest libraries and adopting them to our existing projects. In this sense, we completed our .NET 7 upgrade in our repositories for ABP Framework and ABP Commercial. In this article, I'll share the experiences we faced while upgrading to the new .NET version 👉 .NET 7. + +When I wrote this article, the latest .NET version was `7.0.0-rc.2`. So some of the version statements I wrote below must be changed due to the stable version release. + + + +**To see the latest and greatest stuff, let's see how to upgrade our existing projects to .NET 7!** + + + +## Install .NET7 SDK + +If you are on your development computer, then you need to install the .NET7 SDK `7.x.x`. For the production servers, you need to install the .NET 7 runtimes. Download link for the .NET7 SDK and runtimes is: + +* https://dotnet.microsoft.com/en-us/download/dotnet/7.0 + + + +## Update Your *.csproj Files + +First, you need to update all your `*.csproj` files to support .NET7. Find and replace all your `*` in the `*.csproj` files to support .NET 7: + +```xml +net7.0 +``` + +We already did this in ABP Framework, see this commit as an example [github.com/abpframework/abp/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.csproj](https://github.com/abpframework/abp/blob/dev/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj#L4). + + + +### Microsoft Package Updates + +You must be using Microsoft packages as well; then you need to update them to the latest .NET 7 version. +At the time, I wrote this article, the latest version was `7.0.0-rc.2.22476.2`, so I'll update them to this version including minor version changes. + +Here's the list of all package reference updates I did: + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + + + +--- + + + +## Entity Framework Core Updates + +If you use EF Core as your data access library, you should update your `dotnet-ef` CLI tool. Here's the terminal command to update it: + +```bash +dotnet tool update dotnet-ef --global --prerelease +``` + +We already did the the EF Core package reference update in the *Microsoft Package Updates* section. + + + +### Breaking Change: OrderBy + +This release makes a breaking change in an EF Core query running behavior. We faced this issue in some of our queries that were missing `OrderBy` statement. It throws an exception and does not run the query. Here's the explanation of a EF Core team member for this issue: [github.com/dotnet/efcore/issues/21202#issuecomment-913206415](https://github.com/dotnet/efcore/issues/21202#issuecomment-913206415). + +The following exception is being thrown: + +> InvalidOperationException: The query uses 'Skip' without specifying ordering and uses split query mode. This generates incorrect results. Either provide ordering or run query in single query mode using AsSingleQuery(). See https://go.microsoft.com/fwlink/?linkid=2196526 for more information + +If you don't want to add `OrderBy` statement to solve the issue, you can also use `AsSingleQuery()`. + +![AsSingleQuery](https://raw.githubusercontent.com/abpframework/abp/dev/docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/./as-single-query.jpg) + + + +### EF Core - SQL Client Connection String Update + +With this version, the behavior of the SQL connection has been changed. There is a keyword in the SQL connection string called `TrustServerCertificate`. This keyword indicates whether the channel will be encrypted while bypassing walking the certificate chain to validate trust. + +> When `TrustServerCertificate` is set to `True`, the transport layer will use SSL to encrypt the channel and bypass walking the certificate chain to validate trust. If `TrustServerCertificate` is set to `true` and encryption is turned on, the encryption level specified on the server will be used even if `Encrypt` is set to `false`. The connection will fail otherwise. + + + +After the .NET7 update, it just started to throw the following exception: + +> A connection was successfully established with the server, but then an error occurred during the login process. + + + +We fixed this problem by adding the `TrustServerCertificate=true` to your connection string. Here's an example connection string that supports, + +````sql +Server=localhost; Database=MyProjectName; Trusted_Connection=True; TrustServerCertificate=True +```` + +See our commit for this fix: + +* [github.com/abpframework/abp/commit/96f17e67918eb87edd2baf876d4a7598281fe608](https://github.com/abpframework/abp/commit/96f17e67918eb87edd2baf876d4a7598281fe608) + +Related docs: + +* [learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/breaking-changes#encrypt-true](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/breaking-changes#encrypt-true) +* [stackoverflow.com/questions/34430550/a-connection-was-successfully-established-with-the-server-but-then-an-error-occ](https://stackoverflow.com/questions/34430550/a-connection-was-successfully-established-with-the-server-but-then-an-error-occ) + + + +--- + + + +## Blazor Update + +Ensure that you have updated your Blazor project's csproj to support .NET7: + +```xml +net7.0 +``` + +### Install Blazor Workloads + +#### .NET Web Assembly build tools + +If you have a Blazor-WASM project, install the workloads by running the following in a command shell: + +```bash +dotnet workload install wasm-tools +``` + + **OR** you can update your workloads by running the following command in your Blazor project directory: + +```bash +dotnet workload restore +``` + + + +--- + + + +## .NET MAUI Update + +Ensure that you have updated your Blazor project's csproj to support .NET7: + +```xml +net7.0-android;net7.0-ios;net7.0-maccatalyst +$(TargetFrameworks);net7.0-windows10.0.19041.0 +``` + + + +### Install MAUI Workloads + +If you have .NET MAUI project, then you also need to update your `TargetFramework` as below: + +If you have a .NET MAUI project, after installing the .NET 7 SDK, install the latest workloads with the following command: + +```bash +dotnet workload install maui +``` + + **OR** run the following command in your existing .NET MAUI project directory + +```bash +dotnet workload restore +``` + + + +Further information, check out https://github.com/dotnet/maui/wiki/.NET-7-and-.NET-MAUI + +--- + + + +#### Dotnet Maui Check Tool + +Alternatively, there's a 3rd party tool for .NET MAUI to install the required workloads. This tool installs the missing SDK packs. You can reach the tool's repository at [github.com/Redth/dotnet-maui-check](https://github.com/Redth/dotnet-maui-check). + +Installation: + +```bash +dotnet tool install -g Redth.Net.Maui.Check +``` + +Run: + +```bash +maui-check +``` + + + +--- + + + +## Docker Image Update + +If you are using Docker to automate the deployment of applications, you also need to update your images. We were using `aspnet:6.0.0-bullseye-slim` base and after the .NET 7 update, we started using `aspnet:7.0-bullseye-slim` in our Docker files. + +``` +FROM mcr.microsoft.com/dotnet/aspnet:7.0-bullseye-slim AS base +``` + +For this update, you can check out the following commit as an example: + +* [github.com/abpframework/abp/commit/2d07b9bd00152bef4658c48ff9b2cbee5788d308](https://github.com/abpframework/abp/commit/2d07b9bd00152bef4658c48ff9b2cbee5788d308) + + + +## ABP Framework .NET 7 Update + +In [ABP Framework repository](https://github.com/abpframework/abp), we pdated all our dependencies from .NET 6 to .NET 7. +Not all the changes are here, but you can check out the following PR of the .NET 7 update: + +* [github.com/abpframework/abp/pull/13626/files](https://github.com/abpframework/abp/pull/13626/files) + + +... + +Happy coding with .NET 7 🤗 + +... diff --git a/docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/as-single-query.jpg b/docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/as-single-query.jpg new file mode 100644 index 0000000000..38e3bde39e Binary files /dev/null and b/docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/as-single-query.jpg differ diff --git a/docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/cover-image.jpg b/docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/cover-image.jpg new file mode 100644 index 0000000000..3218fe8f0d Binary files /dev/null and b/docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/cover-image.jpg differ diff --git a/docs/en/Contribution/How-to-Contribute-abp.io-as-a-frontend-developer.md b/docs/en/Contribution/How-to-Contribute-abp.io-as-a-frontend-developer.md index 637a87624b..9b3225a989 100644 --- a/docs/en/Contribution/How-to-Contribute-abp.io-as-a-frontend-developer.md +++ b/docs/en/Contribution/How-to-Contribute-abp.io-as-a-frontend-developer.md @@ -11,7 +11,7 @@ - Abp CLI https://docs.abp.io/en/abp/latest/cli - A code editor -Note: This arcticle prepare Windows OS. You may change the path type of your OS. an Example +Note: This article prepare Windows OS. You may change the path type of your OS. an Example Windows: `templates\app\aspnet-core\src\MyCompanyName.MyProjectName.DbMigrator\appsettings.json` @@ -22,11 +22,15 @@ Unix: `templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/apps You need to install SQL Server and Redis. You can install these programs without docker, but my example uses docker containers. Your computer should have Docker Engine. Then open the terminal en execute the commands one by one. For the Sql Server +```cmd docker run -v sqlvolume:/var/opt/mssql -e 'ACCEPT_EULA=Y' -e "SA_PASSWORD=yourpassword" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-CU3-ubuntu-18.04 +``` For the Redis +```cmd docker run -p 6379:6379 -d redis +``` Then we are ready to download and execute the code. diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index a0ad342c4c..bfce8a71bf 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -6,7 +6,7 @@ ABP's Dependency Injection system is developed based on Microsoft's [dependency ## Modularity -Since ABP is a modular framework, every module defines it's own services and registers via dependency injection in it's own seperate [module class](Module-Development-Basics.md). Example: +Since ABP is a modular framework, every module defines it's own services and registers via dependency injection in it's own separate [module class](Module-Development-Basics.md). Example: ````C# public class BlogModule : AbpModule 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/Distributed-Event-Bus-Rebus-Integration.md b/docs/en/Distributed-Event-Bus-Rebus-Integration.md index 7499c1d837..39fb35ede9 100644 --- a/docs/en/Distributed-Event-Bus-Rebus-Integration.md +++ b/docs/en/Distributed-Event-Bus-Rebus-Integration.md @@ -18,7 +18,7 @@ You can configure using the standard [configuration system](Configuration.md), l ### The Options Classes -`AbpRebusEventBusOptions` classe can be used to configure the event bus options for the Rebus. +`AbpRebusEventBusOptions` class can be used to configure the event bus options for the Rebus. You can configure this options inside the `PreConfigureServices` of your [module](Module-Development-Basics.md). diff --git a/docs/en/Entity-Framework-Core-Oracle.md b/docs/en/Entity-Framework-Core-Oracle.md index 6e7686c6b0..161f1abf45 100644 --- a/docs/en/Entity-Framework-Core-Oracle.md +++ b/docs/en/Entity-Framework-Core-Oracle.md @@ -6,7 +6,7 @@ This document explains how to switch to the **Oracle** database provider for **[ ABP Framework provides integrations for two different Oracle packages. See one of the following documents based on your provider decision: -* **[Volo.Abp.EntityFrameworkCore.Oracle](Entity-Framework-Core-Oracle-Official.md)** package uses the official & free oracle driver. -* **[Volo.Abp.EntityFrameworkCore.Oracle.Devart](Entity-Framework-Core-Oracle-Devart.md)** package uses the commercial (paid) driver of [Devart](https://www.devart.com/) company. +* **[`Volo.Abp.EntityFrameworkCore.Oracle`](Entity-Framework-Core-Oracle-Official.md)** package uses the official & free oracle driver. +* **[`Volo.Abp.EntityFrameworkCore.Oracle.Devart`](Entity-Framework-Core-Oracle-Devart.md)** package uses the commercial (paid) driver of [Devart](https://www.devart.com/) company. > You can choose one of the package you want. If you don't know the differences of the packages, please search for it. ABP Framework only provides integrations it doesn't provide support for such 3rd-party libraries. 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/JSON.md b/docs/en/JSON.md index 29e93007af..283690c2e1 100644 --- a/docs/en/JSON.md +++ b/docs/en/JSON.md @@ -4,7 +4,7 @@ The ABP Framework provides an abstraction to work with JSON. Having such an abst * You can write library independent code. Therefore, you can change the underlying library with the minimum effort and code change. * You can use the predefined converters defined in the ABP without worrying about the underlying library's internal details. -> The JSON serialization system is implemented with the [Volo.Abp.Json](https://www.nuget.org/packages/Volo.Abp.Json) NuGet package. Most of the time, you don't need to manually [install it](https://abp.io/package-detail/Volo.Abp.Json) since it comes pre-installed with the [application startup template](Startup-Templates/Application.md). +> The JSON serialization system is implemented with the [Volo.Abp.Json](https://www.nuget.org/packages/Volo.Abp.Json) NuGet package([Volo.Abp.Json.SystemTextJson](https://www.nuget.org/packages/Volo.Abp.Json.SystemTextJson) is the default implementation). Most of the time, you don't need to manually [install it](https://abp.io/package-detail/Volo.Abp.Json) since it comes pre-installed with the [application startup template](Startup-Templates/Application.md). ## IJsonSerializer @@ -45,16 +45,24 @@ public class ProductManager `AbpJsonOptions` type provides options for the JSON operations in the ABP Framework. Properties: -* **DefaultDateTimeFormat(`string`)**: Default `DateTime` format. -* **UseHybridSerializer(`bool`)**: True by default. Boolean field indicating whether the ABP Framework uses the hybrid approach or not. If the field is true, it will try to use `System.Json.Text` to handle JSON if it can otherwise use the `Newtonsoft.Json.` -* **Providers(`ITypeList`)**: List of JSON serializer providers implementing the `IJsonSerializerProvider` interface. You can create and add custom serializers to the list, and the ABP Framework uses them automatically. When the `Serialize` or `Deserialize` method is called on the `IJsonSerializer` interface, the ABP Framework calls the `CanHandle` methods of the given providers in reverse order and uses the first provider that returns `true` to do the JSON operation. +* **InputDateTimeFormats(`List`)**: Formats of input JSON date, Empty string means default format. You can provide multiple formats to parse the date. +* **OutputDateTimeFormat(`string`)**: Format of output json date, Null or empty string means default format. + +## System Text Json ### AbpSystemTextJsonSerializerOptions -`AbpSystemTextJsonSerializerOptions` provides options for `System.Text.Json` usage. +- **JsonSerializerOptions(`System.Text.Json.JsonSerializerOptions`)**: Global options for System.Text.Json library operations. See [here](https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions) for reference. -Properties: +### AbpSystemTextJsonSerializerModifiersOptions -- **JsonSerializerOptions(`System.Text.Json.JsonSerializerOptions`)**: Global options for System.Text.Json library operations. See [here](https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions) for reference. -- **UnsupportedTypes(`ITypeList`)**: List of the unsupported types. You can add types of the unsupported types to the list and, the hybrid JSON serializer automatically uses the `Newtonsoft.Json` library instead of `System.Text.Json`. +- **Modifiers(`List>`)**: Configure `Modifiers` of `DefaultJsonTypeInfoResolver`. See [here](https://devblogs.microsoft.com/dotnet/announcing-dotnet-7-preview-6/#json-contract-customization) for reference. + + +## Newtonsoft + +Add [Volo.Abp.Json.Newtonsoft](https://www.nuget.org/packages/Volo.Abp.Json.Newtonsoft) packge and depends on `AbpJsonNewtonsoftModule` to replace the `System Text Json`. + +#### AbpNewtonsoftJsonSerializerOptions +- **JsonSerializerSettings(`Newtonsoft.Json.JsonSerializerSettings`)**: Global options for Newtonsoft library operations. See [here](https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonSerializerSettings.htm) for reference. diff --git a/docs/en/Migration-Guides/Abp-4_0-Blazor.md b/docs/en/Migration-Guides/Abp-4_0-Blazor.md index 90a9bc2e53..7f00d6de75 100644 --- a/docs/en/Migration-Guides/Abp-4_0-Blazor.md +++ b/docs/en/Migration-Guides/Abp-4_0-Blazor.md @@ -9,7 +9,7 @@ These changes are required to manually applied in your own solution. It would be * Add `true` to the `PropertyGroup` section of your project (`.csproj`) file. * Update the `Blazorise.*` packages to the latest version (to the latest RC for the ABP 4.0 preview). -### wwwroot/index.html +### `wwwroot/index.html` There are some changes made in the index.html file; diff --git a/docs/en/Migration-Guides/Abp-5_2.md b/docs/en/Migration-Guides/Abp-5_2.md index d0cbf80aad..aeb79e22a6 100644 --- a/docs/en/Migration-Guides/Abp-5_2.md +++ b/docs/en/Migration-Guides/Abp-5_2.md @@ -15,7 +15,7 @@ We've upgraded to Blazorise 1.0 stable version. So there is some breaking change Also You can review that pull request [#11649 - Blazorise 1.0 Migration](https://github.com/abpframework/abp/pull/11649) -- `NumericEdit` is now made around the native `input type="number"` so a lot of its formating features are moved to the new `NumericPicker` component. Replace NumericEdit with NumericPicker. +- `NumericEdit` is now made around the native `input type="number"` so a lot of its formatting features are moved to the new `NumericPicker` component. Replace NumericEdit with NumericPicker. - Rename `DecimalsSeparator` to `DecimalSeparator` on the `DataGridColumn` and `NumericPicker`. - Rename `MaxMessageSize` to `MaxChunkSize`. - Remove `Fullscreen` parameter on `` and replace it with `Size="ModalSize.Fullscreen"` parameter. diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md new file mode 100644 index 0000000000..b4c4d14b02 --- /dev/null +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -0,0 +1,36 @@ +# ABP Version 7.0 Migration Guide + +This document is a guide for upgrading ABP v6.0 solutions to ABP v7.0. There is a change in this version that may affect your applications, please read it carefully and apply the necessary changes to your application. + +## Hybrid JSON was removed. + +Since [System.Text.Json](https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/overview) library supports more custom features in NET 7, ABP no longer need the hybrid Json feature. + +### Previous Behavior + +There is a `Volo.Abp.Json` package which contains the `AbpJsonModule` module. +`Serialization/deserialization` features of [System.Text.Json](https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/overview) and [Nettonsoft](https://www.newtonsoft.com/json/help/html/SerializingJSON.htm) are implemented in this module. + +We use [System.Text.Json](https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/overview) first, More custom cases can be handled with [Nettonsoft](https://www.newtonsoft.com/json/help/html/SerializingJSON.htm) by configuring `UnsupportedTypes` of `AbpSystemTextJsonSerializerOptions`. + +### New Behavior + +We created `Volo.Abp.Json.SystemTextJson` and `Volo.Abp.Json.Newtonsoft` as separate packages, which means you can only use one of them in your project. The default is to use `SystemTextJson`. If you want `Newtonsoft`, please also use `Volo.Abp.AspNetCore.Mvc.NewtonsoftJson` in your web project. + +* Volo.Abp.Json.Abstractions +* Volo.Abp.Json.Newtonsoft +* Volo.Abp.Json.SystemTextJson +* Volo.Abp.Json (Depends on `Volo.Abp.Json.SystemTextJson` by default to prevent breaking) +* Volo.Abp.AspNetCore.Mvc.NewtonsoftJson + +The `AbpJsonOptions` now has only two properties, which are + +* `InputDateTimeFormats(List)`: Formats of input JSON date, Empty string means default format. You can provide multiple formats to parse the date. +* `OutputDateTimeFormat(string)`: Format of output json date, Null or empty string means default format. + +Please remove all `UnsupportedTypes` add custom `Modifiers` to control serialization/deserialization behavior. + +Check the docs to see the more info: https://github.com/abpframework/abp/blob/dev/docs/en/JSON.md#configuration + +Check the docs to see how to customize a JSON contract: https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/custom-contracts + diff --git a/docs/en/Migration-Guides/IdentityServer_To_OpenIddict.md b/docs/en/Migration-Guides/IdentityServer_To_OpenIddict.md index a4baa79d9f..d60493be7a 100644 --- a/docs/en/Migration-Guides/IdentityServer_To_OpenIddict.md +++ b/docs/en/Migration-Guides/IdentityServer_To_OpenIddict.md @@ -72,7 +72,7 @@ private void ConfigureAuthentication(ServiceConfigurationContext context) ## Source code of samples and module -* [Open source tiered & separate auth server application migrate Identity Server to OpenIddct](https://github.com/abpframework/abp-samples/tree/master/Ids2OpenId) -* [Commercial tiered & separate auth server application migrate Identity Server to OpenIddct](https://abp.io/Account/Login?returnUrl=/api/download/samples/Ids2OpenId) +* [Open source tiered & separate auth server application migrate Identity Server to OpenIddict](https://github.com/abpframework/abp-samples/tree/master/Ids2OpenId) +* [Commercial tiered & separate auth server application migrate Identity Server to OpenIddict](https://abp.io/Account/Login?returnUrl=/api/download/samples/Ids2OpenId) * [OpenIddict module document](https://docs.abp.io/en/abp/6.0/Modules/OpenIddict) * [OpenIddict module source code](https://github.com/abpframework/abp/tree/rel-6.0/modules/openiddict) 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..2638895843 100644 --- a/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md +++ b/docs/en/Migration-Guides/OpenIddict-Step-by-Step.md @@ -19,62 +19,68 @@ Use the `abp update` command to update your existing application. See [Upgrading ### Domain.Shared Layer - In **MyApplication.Domain.Shared.csproj** replace **project reference**: - ```csharp - - ``` + +```csharp + +``` + with - ```csharp - - ``` + +```csharp + +``` - In **MyApplicationDomainSharedModule.cs** replace usings and **module dependencies:** - ```csharp - using Volo.Abp.IdentityServer; - ... - typeof(AbpIdentityServerDomainSharedModule) - ``` +```csharp +using Volo.Abp.IdentityServer; +... +typeof(AbpIdentityServerDomainSharedModule) +``` + with - ```csharp - using Volo.Abp.OpenIddict; - ... - typeof(AbpOpenIddictDomainSharedModule) + +```csharp +using Volo.Abp.OpenIddict; +... +typeof(AbpOpenIddictDomainSharedModule) +``` ### Domain Layer - In **MyApplication.Domain.csproj** replace **project references**: - ```csharp - - - ``` +```csharp + + +``` with - ```csharp - - - ``` +```csharp + + +``` - In **MyApplicationDomainModule.cs** replace usings and **module dependencies**: - ```csharp - using Volo.Abp.IdentityServer; - using Volo.Abp.PermissionManagement.IdentityServer; - ... - typeof(AbpIdentityServerDomainModule), - typeof(AbpPermissionManagementDomainIdentityServerModule), - ``` +```csharp +using Volo.Abp.IdentityServer; +using Volo.Abp.PermissionManagement.IdentityServer; +... +typeof(AbpIdentityServerDomainModule), +typeof(AbpPermissionManagementDomainIdentityServerModule), +``` with - ```csharp - using Volo.Abp.OpenIddict; - using Volo.Abp.PermissionManagement.OpenIddict; - ... - typeof(AbpOpenIddictDomainModule), - typeof(AbpPermissionManagementDomainOpenIddictModule), - ``` +```csharp +using Volo.Abp.OpenIddict; +using Volo.Abp.PermissionManagement.OpenIddict; +... +typeof(AbpOpenIddictDomainModule), +typeof(AbpPermissionManagementDomainOpenIddictModule), +``` #### OpenIddictDataSeedContributor @@ -90,30 +96,30 @@ 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**: - ```csharp - using Volo.Abp.IdentityServer.EntityFrameworkCore; - ... - typeof(AbpIdentityServerEntityFrameworkCoreModule), - ``` +```csharp +using Volo.Abp.IdentityServer.EntityFrameworkCore; +... +typeof(AbpIdentityServerEntityFrameworkCoreModule), +``` with - ```csharp - using Volo.Abp.OpenIddict.EntityFrameworkCore; - ... - typeof(AbpOpenIddictEntityFrameworkCoreModule), - ``` +```csharp +using Volo.Abp.OpenIddict.EntityFrameworkCore; +... +typeof(AbpOpenIddictEntityFrameworkCoreModule), +``` - In **MyApplicationDbContext.cs** replace usings and **fluent api configurations**: @@ -154,30 +160,30 @@ 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**: - ```csharp - using Volo.Abp.IdentityServer.MongoDB; - ... - typeof(AbpIdentityServerMongoDbModule), - ``` +```csharp +using Volo.Abp.IdentityServer.MongoDB; +... +typeof(AbpIdentityServerMongoDbModule), +``` with - ```csharp - using Volo.Abp.OpenIddict.MongoDB; - ... - typeof(AbpOpenIddictMongoDbModule), - ``` +```csharp +using Volo.Abp.OpenIddict.MongoDB; +... +typeof(AbpOpenIddictMongoDbModule), +``` ### DbMigrator Project @@ -251,7 +257,7 @@ for creating the host builder. ## Source code of samples and module -* [Open source tiered & separate auth server application migrate Identity Server to OpenIddct](https://github.com/abpframework/abp-samples/tree/master/Ids2OpenId) +* [Open source tiered & separate auth server application migrate Identity Server to OpenIddict](https://github.com/abpframework/abp-samples/tree/master/Ids2OpenId) * [OpenIddict module document](https://docs.abp.io/en/abp/6.0/Modules/OpenIddict) * [OpenIddict module source code](https://github.com/abpframework/abp/tree/rel-6.0/modules/openiddict) diff --git a/docs/en/Module-Entity-Extensions.md b/docs/en/Module-Entity-Extensions.md index 7ee1d8840e..1a3c318c6b 100644 --- a/docs/en/Module-Entity-Extensions.md +++ b/docs/en/Module-Entity-Extensions.md @@ -6,7 +6,7 @@ Module entity extension system is a **high level** extension system that allows ## Quick Example -Open the *YourProjectNameModuleExtensionConfigurator* class inside the `Domain.Shared` project of your solution and change the `ConfigureExtraProperties`method as shown below to add a `SocialSecurityNumber` property to the `IdentityUser` entity of the [Identity Module](Modules/Identity.md). +Open the `YourProjectNameModuleExtensionConfigurator` class inside the `Domain.Shared` project of your solution and change the `ConfigureExtraProperties`method as shown below to add a `SocialSecurityNumber` property to the `IdentityUser` entity of the [Identity Module](Modules/Identity.md). ````csharp public static void ConfigureExtraProperties() diff --git a/docs/en/Modules/Cms-Kit/Dynamic-Widget.md b/docs/en/Modules/Cms-Kit/Dynamic-Widget.md index 88c0be6750..4ca764b7ea 100644 --- a/docs/en/Modules/Cms-Kit/Dynamic-Widget.md +++ b/docs/en/Modules/Cms-Kit/Dynamic-Widget.md @@ -3,7 +3,7 @@ CMS kit provides a dynamic [widget](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Widgets) used to render the components previously developed by the software in the content of the pages and blog posts. Its means, that in static content you can use dynamic content. We will mention how you can do it. You have two choices to define the widget in the system: Writing and UI. ### Adding the widget -Firstly we will show how to use the widget system via writing manually in the page and blogpost contents. +Firstly we will show how to use the widget system via writing manually in the page and blog post contents. Let's define the view component diff --git a/docs/en/Modules/Cms-Kit/Index.md b/docs/en/Modules/Cms-Kit/Index.md index b8cbe89d20..5b7f3b5366 100644 --- a/docs/en/Modules/Cms-Kit/Index.md +++ b/docs/en/Modules/Cms-Kit/Index.md @@ -22,7 +22,7 @@ All features are individually usable. If you disable a feature, it completely di ## Pre Requirements - This module depends on [BlobStoring](../../Blob-Storing.md) module for keeping media content. -> Make sure `BlobStoring` module is installed and at leats one provider is configured properly. For more information, check the [documentation](../../Blob-Storing.md). +> Make sure `BlobStoring` module is installed and at least one provider is configured properly. For more information, check the [documentation](../../Blob-Storing.md). - CMS Kit uses [distributed cache](../../Caching.md) for responding faster. > Using a distributed cache, such as [Redis](../../Redis-Cache.md), is highly recommended for data consistency in distributed/clustered deployments. 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/Redis-Cache.md b/docs/en/Redis-Cache.md index 9fe8efdb27..aa756e1a2e 100644 --- a/docs/en/Redis-Cache.md +++ b/docs/en/Redis-Cache.md @@ -4,7 +4,7 @@ ABP Framework [Caching System](Caching.md) extends the [ASP.NET Core distributed However, ABP provides an **integration package** for Redis Cache: [Volo.Abp.Caching.StackExchangeRedis](https://www.nuget.org/packages/Volo.Abp.Caching.StackExchangeRedis). There are two reasons for using this package, instead of the standard [Microsoft.Extensions.Caching.StackExchangeRedis](https://www.nuget.org/packages/Microsoft.Extensions.Caching.StackExchangeRedis/) package. -1. It implements `SetManyAsync` and `GetManyAsync` methods. These are not standard methods of the Microsoft Caching library, but added by the ABP Framework [Caching](Caching.md) system. They **significiantly increases the performance** when you need to set/get multiple cache items with a single method call. +1. It implements `SetManyAsync` and `GetManyAsync` methods. These are not standard methods of the Microsoft Caching library, but added by the ABP Framework [Caching](Caching.md) system. They **significantly increases the performance** when you need to set/get multiple cache items with a single method call. 2. It **simplifies** the Redis cache **configuration** (will be explained below). > Volo.Abp.Caching.StackExchangeRedis is already uses the Microsoft.Extensions.Caching.StackExchangeRedis package, but extends and improves it. diff --git a/docs/en/SignalR-Integration.md b/docs/en/SignalR-Integration.md index 35f109b8e6..d532067911 100644 --- a/docs/en/SignalR-Integration.md +++ b/docs/en/SignalR-Integration.md @@ -235,4 +235,4 @@ Refer to the Microsoft's documentation to [host and scale](https://docs.microsof ## See Also - [Microsoft SignalR documentation](https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction) -- [Real-Time Messaging In A Distributed Architecture Using ABP, SingalR & RabbitMQ](https://volosoft.com/blog/RealTime-Messaging-Distributed-Architecture-Abp-SingalR-RabbitMQ) +- [Real-Time Messaging In A Distributed Architecture Using ABP, SignalR & RabbitMQ](https://volosoft.com/blog/RealTime-Messaging-Distributed-Architecture-Abp-SingalR-RabbitMQ) diff --git a/docs/en/Specifications.md b/docs/en/Specifications.md index a9aeb2b050..2ef9c4496e 100644 --- a/docs/en/Specifications.md +++ b/docs/en/Specifications.md @@ -246,7 +246,7 @@ So, what's the point of a specification? Why and when should we consider to use Some benefits of using specifications: -- **Reusabe**: Imagine that you need the Premium Customer filter in many places in your code base. If you go with expressions and do not create a specification, what happens if you later change the "Premium Customer" definition? Say you want to change the minimum balance from $100,000 to $250,000 and add another condition to be a customer older than 3 years. If you'd used a specification, you just change a single class. If you repeated (copy/pasted) the same expression everywhere, you need to change all of them. +- **Reusable**: Imagine that you need the Premium Customer filter in many places in your code base. If you go with expressions and do not create a specification, what happens if you later change the "Premium Customer" definition? Say you want to change the minimum balance from $100,000 to $250,000 and add another condition to be a customer older than 3 years. If you'd used a specification, you just change a single class. If you repeated (copy/pasted) the same expression everywhere, you need to change all of them. - **Composable**: You can combine multiple specifications to create new specifications. This is another type of reusability. - **Named**: `PremiumCustomerSpecification` better explains the intent rather than a complex expression. So, if you have an expression that is meaningful in your business, consider using specifications. - **Testable**: A specification is a separately (and easily) testable object. diff --git a/docs/en/Startup-Templates/Index.md b/docs/en/Startup-Templates/Index.md index 76c0488031..e30f2729e2 100644 --- a/docs/en/Startup-Templates/Index.md +++ b/docs/en/Startup-Templates/Index.md @@ -2,9 +2,9 @@ While you can start with an empty project and add needed packages manually, startup templates make easy and comfortable to start a new solution with the ABP framework. Click the name from the list below to see the documentation of the related startup template: -* [**app**](Application.md): Application template. -* [**app-nolayers**](Application-Single-Layer.md): Application (single layer) template. -* [**module**](Module.md): Module/service template. -* [**console**](Console.md): Console template. -* [**WPF**](WPF.md): WPF template. -* [**MAUI**](MAUI.md): MAUI template. +* [**`app`**](Application.md): Application template. +* [**`app-nolayers`**](Application-Single-Layer.md): Application (single layer) template. +* [**`module`**](Module.md): Module/service template. +* [**`console`**](Console.md): Console template. +* [**`WPF`**](WPF.md): WPF template. +* [**`MAUI`**](MAUI.md): MAUI template. diff --git a/docs/en/Themes/LeptonXLite/Angular.md b/docs/en/Themes/LeptonXLite/Angular.md index 506ffaf753..950cd20c8b 100644 --- a/docs/en/Themes/LeptonXLite/Angular.md +++ b/docs/en/Themes/LeptonXLite/Angular.md @@ -1,7 +1,8 @@ # LeptonX Lite Angular UI + LeptonX Lite has implementation for the ABP Framework Angular Client. It's a simplified variation of the [LeptonX Theme](https://x.leptontheme.com/). -> If you are looking for a professional, enterprise ready theme, you can check the [LeptonX Theme](https://x.leptontheme.com/), which is a part of [ABP Commercial](https://commercial.abp.io/). +> If you are looking for a professional, enterprise ready theme, you can check the [LeptonX Theme](https://x.leptontheme.com/), which is a part of [ABP Commercial](https://commercial.abp.io/). > See the [Theming document](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Theming) to learn about themes. @@ -11,28 +12,27 @@ This theme is **already installed** when you create a new solution using the sta To add `LeptonX-lite` into your project, -* Install `@abp/ng.theme.lepton-x` +- Install `@abp/ng.theme.lepton-x` `yarn add @abp/ng.theme.lepton-x@preview` -* Install `bootstrap-icons` +- Install `bootstrap-icons` `yarn add bootstrap-icons` +- Then, we need to edit the styles array in `angular.json` to replace the existing style with the new one. -* Then, we need to edit the styles array in `angular.json` to replace the existing style with the new one. - -Add the following style +Add the following style ```json "node_modules/bootstrap-icons/font/bootstrap-icons.css", ``` -* Finally, remove `ThemeBasicModule` from `app.module.ts`, and import the related modules in `app.module.ts` +- Finally, remove `ThemeBasicModule` from `app.module.ts`, and import the related modules in `app.module.ts` ```js -import { ThemeLeptonXModule } from '@abp/ng.theme.lepton-x'; -import { SideMenuLayoutModule } from '@abp/ng.theme.lepton-x/layouts'; +import { ThemeLeptonXModule } from "@abp/ng.theme.lepton-x"; +import { SideMenuLayoutModule } from "@abp/ng.theme.lepton-x/layouts"; @NgModule({ imports: [ @@ -51,7 +51,7 @@ export class AppModule {} Note: If you employ [Resource Owner Password Flow](https://docs.abp.io/en/abp/latest/UI/Angular/Authorization#resource-owner-password-flow) for authorization, you should import the following module as well: ```js -import { AccountLayoutModule } from '@abp/ng.theme.lepton-x/account'; +import { AccountLayoutModule } from "@abp/ng.theme.lepton-x/account"; @NgModule({ // ... @@ -69,16 +69,235 @@ To change the logos and brand color of `LeptonX`, simply add the following CSS t ```css :root { - --lpx-logo: url('/assets/images/logo.png'); - --lpx-logo-icon: url('/assets/images/logo-icon.png'); + --lpx-logo: url("/assets/images/logo.png"); + --lpx-logo-icon: url("/assets/images/logo-icon.png"); --lpx-brand: #edae53; } ``` - `--lpx-logo` is used to place the logo in the menu. -- `--lpx-logo-icon` is a square icon used when the menu is collapsed. -- `--lpx-brand` is a color used throughout the application, especially on active elements. +- `--lpx-logo-icon` is a square icon used when the menu is collapsed. +- `--lpx-brand` is a color used throughout the application, especially on active elements. ### 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 the 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`. + +## Footer Component + +![Angular Footer Component](../../images/angular-footer.png) + +The Footer is the section of content at the very bottom of the site. This section of the content can be modified. +Inject **FooterLinksService** and use the **setFooterInfo** method of **FooterLinksService** +to assign path or link and description. +**descUrl** and **footerLinks** are nullable. Constant **footerLinks** are on the right side of footer. + + +```js +///... + +const footerLinks = [ + { + link: "/components/bootstrap/badge", + text: "Manage Your Profile", + }, + { + link: "/components/bootstrap/border", + text: "My Security Logs", + }, +]; + +const footerInfo: FooterNav = { + desc: "Home", + descUrl: "/components/home", + footerLinks: footerLinks, +}; + +this.footerLinksService.setFooterInfo(footerInfo); + +///... +``` +If you want to change the footer component, the key is `eThemeLeptonXComponents.Footer` + +```js +///... +this.replaceableComponents.add({ + component: YourNewFooterComponent, + key: eThemeLeptonXComponents.Footer, +}); +///... +``` + + 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/Chart-Component.md b/docs/en/UI/Angular/Chart-Component.md index a1cea80b52..d165261e18 100644 --- a/docs/en/UI/Angular/Chart-Component.md +++ b/docs/en/UI/Angular/Chart-Component.md @@ -231,8 +231,8 @@ See the [`chart.js` samples](https://www.chartjs.org/docs/latest/samples) for mo | `[type]` | Type of the chart. | `string` | null | | `[data]` | Chart data to display | `any` | null | | `[options]` | Chart options to customize | `any` | null | -| `[plugins]` | Chart plugins to customize behaviour | `any` | null | -| `[width]` | Witdh of the chart | `string` | null | +| `[plugins]` | Chart plugins to customize behavior | `any` | null | +| `[width]` | Width of the chart | `string` | null | | `[height]` | Height of the chart | `string` | null | | `[responsive]` | Whether the chart is responsive | `boolean` | true | | `(dataSelect)` | A callback that executes when an element on the chart is clicked | `EventEmitter` | - | diff --git a/docs/en/UI/Angular/DateTime-Format-Pipe.md b/docs/en/UI/Angular/DateTime-Format-Pipe.md index 4841ffe665..662bed1c9c 100644 --- a/docs/en/UI/Angular/DateTime-Format-Pipe.md +++ b/docs/en/UI/Angular/DateTime-Format-Pipe.md @@ -1,3 +1,4 @@ +{%{ # DateTime Format Pipes You can format date by Date pipe of angular. @@ -5,7 +6,7 @@ You can format date by Date pipe of angular. Example ```html - {{today | date 'dd/mm/yy'}} +{{today | date 'dd/mm/yy'}} ``` ShortDate, ShortTime and ShortDateTime format data like angular's data pipe but easier. Also the pipes get format from config service by culture. @@ -13,17 +14,18 @@ ShortDate, ShortTime and ShortDateTime format data like angular's data pipe but # ShortDate Pipe ```html - {{today | shortDatePipe }} +{{today | shortDatePipe }} ``` # ShortTime Pipe ```html - {{today | shortTimePipe }} +{{today | shortTimePipe }} ``` # ShortDateTime Pipe ```html - {{today | shortDateTimePipe }} +{{today | shortDateTimePipe }} ``` +}%} diff --git a/docs/en/UI/Angular/Dynamic-Form-Extensions.md b/docs/en/UI/Angular/Dynamic-Form-Extensions.md index 1764b0cad7..f576dcafdc 100644 --- a/docs/en/UI/Angular/Dynamic-Form-Extensions.md +++ b/docs/en/UI/Angular/Dynamic-Form-Extensions.md @@ -7,7 +7,7 @@ Form prop extension system allows you to add a new field to the create and/or ed Form Prop Extension Example: 'Date of Birth' Field -You can validate the field, perform visibility checks, and do more. You will also have access to the current entity when creating a contibutor for an edit form. +You can validate the field, perform visibility checks, and do more. You will also have access to the current entity when creating a contributor for an edit form. ## How to Set Up diff --git a/docs/en/UI/Angular/Loading-Strategy.md b/docs/en/UI/Angular/Loading-Strategy.md index 5322d13eda..a222233088 100644 --- a/docs/en/UI/Angular/Loading-Strategy.md +++ b/docs/en/UI/Angular/Loading-Strategy.md @@ -102,7 +102,7 @@ Sets given paremeters and `crossorigin="anonymous"` as attributes of created `` element and places it at the **beginning** of `` tag in the document. +Sets given parameters and `crossorigin="anonymous"` as attributes of created `