Browse Source

Merge branch 'dev' into service-type

pull/14288/head
maliming 3 years ago
parent
commit
cfa52a8848
No known key found for this signature in database GPG Key ID: 96224957E51C89E
  1. 2
      .github/workflows/build-and-test.yml
  2. 29
      .github/workflows/spellcheck.yml
  3. 6
      Directory.Build.props
  4. 5
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/en.json
  5. 5
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
  6. 12
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json
  7. 10
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json
  8. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de-DE.json
  9. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json
  10. 54
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  11. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json
  12. 10
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json
  13. 10
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json
  14. 10
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json
  15. 17
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json
  16. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json
  17. 10
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json
  18. 9
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json
  19. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json
  20. 10
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json
  21. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json
  22. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json
  23. 10
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json
  24. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json
  25. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
  26. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json
  27. 19
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
  28. 10
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json
  29. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
  30. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json
  31. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json
  32. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json
  33. 2
      build/build-all.ps1
  34. 151
      cSpell.json
  35. 50
      docs/en/API/Static-CSharp-API-Clients.md
  36. 2
      docs/en/Blob-Storing-Aws.md
  37. 2
      docs/en/Blog-Posts/2022-01-11 v5_1_Release_Stable/POST.md
  38. 9
      docs/en/CLI.md
  39. 2
      docs/en/Community-Articles/2020-04-19-Customize-the-SignIn-Manager/POST.md
  40. 4
      docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md
  41. 2
      docs/en/Community-Articles/2020-05-29-Real-Time-Messaging-In-A-Distributed-Architecture-Using-Abp-Framework-SingalR-RabbitMQ/POST.md
  42. 6
      docs/en/Community-Articles/2020-07-21-File-Upload-Download-With-BLOB-Storage-System-in-ASPNET-Core-ABP-Framework/POST.md
  43. 2
      docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md
  44. 4
      docs/en/Community-Articles/2021-03-12-Simple-SignalR-Notification/POST.md
  45. 4
      docs/en/Community-Articles/2022-02-22-Integrating-MAUI-Client-via-using-OpenID-Connect/README.md
  46. 265
      docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/Upgrade-Your-Existing-Projects-to-Dotnet7.md
  47. BIN
      docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/as-single-query.jpg
  48. BIN
      docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/cover-image.jpg
  49. 6
      docs/en/Contribution/How-to-Contribute-abp.io-as-a-frontend-developer.md
  50. 12
      docs/en/Data-Seeding.md
  51. 2
      docs/en/Dependency-Injection.md
  52. 12
      docs/en/Deployment/Clustered-Environment.md
  53. 2
      docs/en/Distributed-Event-Bus-Rebus-Integration.md
  54. 4
      docs/en/Entity-Framework-Core-Oracle.md
  55. 2
      docs/en/Getting-Started-React-Native.md
  56. 2
      docs/en/Getting-Started-Setup-Environment.md
  57. 24
      docs/en/JSON.md
  58. 2
      docs/en/Migration-Guides/Abp-4_0-Blazor.md
  59. 2
      docs/en/Migration-Guides/Abp-5_2.md
  60. 36
      docs/en/Migration-Guides/Abp-7_0.md
  61. 4
      docs/en/Migration-Guides/IdentityServer_To_OpenIddict.md
  62. 2
      docs/en/Migration-Guides/OpenIddict-Mvc.md
  63. 122
      docs/en/Migration-Guides/OpenIddict-Step-by-Step.md
  64. 2
      docs/en/Module-Entity-Extensions.md
  65. 2
      docs/en/Modules/Cms-Kit/Dynamic-Widget.md
  66. 2
      docs/en/Modules/Cms-Kit/Index.md
  67. 2
      docs/en/Modules/OpenIddict.md
  68. 8
      docs/en/Previews.md
  69. 2
      docs/en/Redis-Cache.md
  70. 2
      docs/en/SignalR-Integration.md
  71. 2
      docs/en/Specifications.md
  72. 12
      docs/en/Startup-Templates/Index.md
  73. 186
      docs/en/Themes/LeptonXLite/Angular.md
  74. 48
      docs/en/Tutorials/Part-3.md
  75. 2
      docs/en/Tutorials/Todo/Index.md
  76. 2
      docs/en/Tutorials/Todo/Single-Layer/Index.md
  77. 18
      docs/en/UI/Angular/Account-Module.md
  78. 4
      docs/en/UI/Angular/Chart-Component.md
  79. 10
      docs/en/UI/Angular/DateTime-Format-Pipe.md
  80. 2
      docs/en/UI/Angular/Dynamic-Form-Extensions.md
  81. 2
      docs/en/UI/Angular/Loading-Strategy.md
  82. 2
      docs/en/UI/Angular/Quick-Start.md
  83. 219
      docs/en/UI/Angular/Theme-Configurations.md
  84. 6
      docs/en/UI/AspNetCore/Client-Side-Package-Management.md
  85. 1
      docs/en/UI/AspNetCore/JavaScript-API/Auth.md
  86. 5
      docs/en/UI/AspNetCore/JavaScript-API/DOM.md
  87. BIN
      docs/en/images/angular-footer.png
  88. BIN
      docs/en/images/generated-static-client-proxies-with-contracts.png
  89. BIN
      docs/en/images/generated-static-client-proxies-without-contracts.png
  90. BIN
      docs/en/images/generated-static-client-proxies.png
  91. 1
      docs/zh-Hans/CLI.md
  92. 2
      docs/zh-Hans/Getting-Started-Setup-Environment.md
  93. 111
      docs/zh-Hans/SMS-Sending.md
  94. 2
      docs/zh-Hans/Tutorials/Todo/Index.md
  95. 28
      framework/Volo.Abp.sln
  96. 2
      framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj
  97. 2
      framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj
  98. 2
      framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj
  99. 2
      framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj
  100. 2
      framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj

2
.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

29
.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

6
Directory.Build.props

@ -2,13 +2,13 @@
<PropertyGroup>
<!-- All Microsoft AspNetCore packages -->
<MicrosoftAspNetCorePackageVersion>6.0.5</MicrosoftAspNetCorePackageVersion>
<MicrosoftAspNetCorePackageVersion>7.0.0-rc.2.*</MicrosoftAspNetCorePackageVersion>
<!-- All Microsoft EntityFrameworkCore packages -->
<MicrosoftEntityFrameworkCorePackageVersion>6.0.5</MicrosoftEntityFrameworkCorePackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>7.0.0-rc.2.*</MicrosoftEntityFrameworkCorePackageVersion>
<!-- All Microsoft packages -->
<MicrosoftPackageVersion>6.0.0</MicrosoftPackageVersion>
<MicrosoftPackageVersion>7.0.0-rc.2.*</MicrosoftPackageVersion>
<!-- Microsoft.NET.Test.Sdk https://www.nuget.org/packages/Microsoft.NET.Test.Sdk -->
<MicrosoftNETTestSdkPackageVersion>17.2.0</MicrosoftNETTestSdkPackageVersion>

5
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"
}
}
}

5
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json

@ -404,6 +404,9 @@
"Tags": "Tags",
"SetTagsInfo": "Tags should be comma-separated. Eg: CSharp, Entity Framework",
"RejectTrialLicenseWarningMessage": "Are you sure you want to reject this trial license request?",
"ExportToExcel": "Export to Excel"
"ExportToExcel": "Export to Excel",
"OverallTotalPrice": "Overall Total Price",
"OverallDiscountPrice": "Overall Discount Price",
"OverallDiscountText": "Overall Discount Text"
}
}

12
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}. إذا كنت عميلاً بالفعل ، <a href='{4}' target='_blank'> سجّل الدخول إلى حسابك </a> لمراجعة أسعار التجديد المتاحة.",
"LicenseRenewalCostExplanation": "سعر تجديد (تمديد) رخصة الفريق الاساسية هو ${0}, رخصة العمل الاساسية هو ${1} ورخصة المؤسسة الاساسية هو${2}. ان كنت عميلا بالفعل, <a href='{3}' target='_blank'>سجل الدخول الى حسابك</a> لمراجعة سعر التجديد الحالي.",
"HowDoIRenewMyLicense": "كيف أجدد الترخيص الخاص بي؟",
"HowDoIRenewMyLicenseExplanation": "يمكنك تجديد ترخيصك بالانتقال إلى <a href='{0}' target='_blank'> صفحة إدارة المؤسسة </a>. للاستفادة من أسعار التجديد المبكر المخفضة الخاصة بنا ، تأكد من التجديد قبل انتهاء صلاحية ترخيصك. ومع ذلك ، لا تقلق بشأن عدم معرفة متى تنتهي فرصة التجديد المبكر الخاصة بك. ستتلقى 3 رسائل بريد إلكتروني للتذكير قبل انتهاء صلاحية اشتراكك. سنرسلها في غضون 30 يومًا و 7 أيام ويوم واحد قبل انتهاء الصلاحية.",
"IsSourceCodeIncluded": "هل يتضمن ترخيصي الكود المصدري للوحدات والموضوعات التجارية؟",
@ -190,7 +190,7 @@
"ChangingDevelopers": "هل يمكنني تغيير المطورين المسجلين لمنظمتي في المستقبل؟",
"ChangingDevelopersExplanation": "بالإضافة إلى إضافة مطورين جدد إلى الترخيص الخاص بك ، يمكنك أيضًا تغيير المطورين الحاليين (يمكنك إزالة مطور وإضافة مطور جديد إلى نفس المقعد) دون أي تكلفة إضافية.",
"WhenShouldIRenewMyLicense": "متى يجب أن أجدد رخصتي؟",
"WhenShouldIRenewMyLicenseExplanation": "إذا جددت ترخيصك في غضون <strong> شهر واحد </ strong> بعد انتهاء صلاحية الترخيص ، فسيتم تطبيق الخصومات التالية: ترخيص الفريق {0}٪ خصم ، ترخيص تجاري {1}٪ خصم ، ترخيص Enterprise {2}٪ خصم . إذا قمت بتجديد ترخيصك بعد <strong> شهر واحد </ strong> من تاريخ انتهاء صلاحية الترخيص ، فسيكون سعر التجديد هو نفسه سعر شراء الترخيص ولن يكون هناك خصم على التجديد.",
"WhenShouldIRenewMyLicenseExplanation": "إذا قمت بتجديد ترخيصك في غضون <strong> شهر واحد </ strong> بعد انتهاء صلاحية ترخيصك ، فسيتم تطبيق الخصومات التالية: ترخيص الفريق {0}؛ رخصة تجارية {1} ؛ ترخيص المؤسسة {2}. ومع ذلك ، إذا جددت ترخيصك بعد <strong> شهر واحد </ strong> من تاريخ انتهاء صلاحية الترخيص ، فسيكون سعر التجديد هو نفسه سعر شراء الترخيص ولن يكون هناك خصم على التجديد.",
"TrialPlan": "هل لديك خطة تجريبية؟",
"DoYouAcceptBankWireTransfer": "هل تقبل التحويل البنكي؟",
"DoYouAcceptBankWireTransferExplanation": "نعم ، نحن نقبل التحويل البنكي. <br /> بعد إرسال رسوم الترخيص عبر التحويل المصرفي ، أرسل لنا بريدًا إلكترونيًا على accounting@abp.io إيصالك ونوع الترخيص المطلوب. معلومات حسابنا المصرفي الدولي:",
@ -360,7 +360,7 @@
"Next": "التالي",
"StartTrial": "ابدأ الإصدار التجريبي المجاني",
"ContactUsIssues": "اتصل بنا إذا كان لديك أي مشاكل",
"TrialActivatedWarning": "عزيزي {0} ، يحق للمستخدم الحصول على فترة تجريبية مجانية واحدة فقط. لقد استخدمت بالفعل الفترة التجريبية الخاصة بك.",
"TrialActivatedWarning": ".يحق للمستخدم الحصول على فترة تجريبية مجانية واحدة فقط. لقد استخدمت بالفعل الفترة التجريبية الخاصة بك",
"SaveAndDownload": "حفظ وتنزيل",
"CompanyNameValidationMessage": "اسم الشركة طويل جدا!",
"AddressValidationMessage": "العنوان طويل جدا!",
@ -373,13 +373,15 @@
"TrialLicenseModelInvalidErrorMessage": "أحد الحقول التالية غير صالح: اسم البلد أو حجم الشركة أو الصناعة أو الغرض من الاستخدام.",
"Trial": "محاكمة",
"Purchased": "تم شراؤها",
"PurchaseLicense": "رخصة شراء",
"PurchaseLicense": "شراء {0} رخصة",
"PurchaseTrialLicenseMessage": "تاريخ انتهاء الترخيص الخاص بك هو {0}. <br> إذا كنت ترغب في الاستمرار في استخدام المشاريع التي أنشأتها أثناء الفترة التجريبية المجانية ، فأنت بحاجة إلى تغيير مفاتيح الترخيص في ملفات <code> appsettings.secrets.json </code> الخاصة بك. هنا هو مفتاح الترخيص الخاص بك:",
"TrialLicenseExpireMessage": "أنت تستخدم الترخيص التجريبي وستنتهي صلاحية الترخيص التجريبي في {0}.",
"TryForFree": "حاول مجانا",
"TrialLicenseExpiredInfo": "انتهت فترة الترخيص التجريبي الخاص بك!",
"CommercialNewsletterConfirmationMessage": "أوافق على <a href=\"https://commercial.abp.io/TermsConditions\"> البنود والشروط </a> و <a href=\"https://commercial.abp.io/Privacy\"> سياسة الخصوصية </a>.",
"RenewLicenseEarly": "إذا قمت بتجديد رخصتي في وقت مبكر ، هل سأحصل على السنة كاملة؟",
"RenewLicenseEarylExplanation": "عند تجديد الترخيص الخاص بك قبل تاريخ انتهاء الترخيص الخاص بك ، ستتم إضافة سنة واحدة إلى تاريخ انتهاء الترخيص الخاص بك. على سبيل المثال ، إذا انتهت صلاحية ترخيصك في {0} -06-06 وقمت بتجديده في {0} -01-01 ، فسيكون تاريخ انتهاء صلاحية الترخيص الجديد {1} -06-06."
"RenewLicenseEarylExplanation": "عند تجديد الترخيص الخاص بك قبل تاريخ انتهاء الترخيص الخاص بك ، ستتم إضافة سنة واحدة إلى تاريخ انتهاء الترخيص الخاص بك. على سبيل المثال ، إذا انتهت صلاحية ترخيصك في {0} -06-06 وقمت بتجديده في {0} -01-01 ، فسيكون تاريخ انتهاء صلاحية الترخيص الجديد {1} -06-06.",
"discountForYears": "{0}٪ خصم لمدة {1} سنة (سنوات)",
"BlackFridayDiscount": "خصم الجمعة السوداء"
}
}

10
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 <strong>1 měsíce</strong> 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 <strong>1 měsíc</strong> 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 <strong>1 měsíce</strong> 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 <strong>1 měsíci</strong> 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.<br />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}. <br> 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 <code>appsettings.secrets.json</code>. 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,8 @@
"CommercialNewsletterConfirmationMessage": "I agree to the <a href=\"https://commercial.abp.io/TermsConditions\">Terms & Conditions</a> and <a href=\"https://commercial.abp.io/Privacy\">Privacy Policy</a>.",
"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",
"BlackFridayDiscount": "Black Friday sleva"
}
}

7
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}. <br> 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 <code>appsettings.secrets.json</code>-Dateien ändern. Hier ist Ihr Lizenzschlüssel:",
"TrialLicenseExpireMessage": "Sie verwenden die Testlizenz und Ihre Testlizenz läuft am {0} ab.",
"TryForFree": "Kostenlos testen",
@ -381,6 +381,7 @@
"CommercialNewsletterConfirmationMessage": "Ich stimme den <a href=\"https://commercial.abp.io/TermsConditions\">Allgemeinen Geschäftsbedingungen</a> und der <a href=\"https://commercial.abp.io/Privacy\">Datenschutzerklärung . zu </a>.",
"ContinueWithNewOrganization": "Weiter mit einer neuen Organisation",
"RenewLicenseEarly": "Erhalte ich das ganze Jahr, wenn ich meine Lizenz vorzeitig erneuere?",
"RenewLicenseEarylExplanation": "Wenn Sie Ihre Lizenz vor dem Ablaufdatum Ihrer Lizenz erneuern, wird Ihr Lizenzablaufdatum um 1 Jahr verlängert. Wenn Ihre Lizenz beispielsweise am {0}-06-06 abläuft und Sie sie am {0}-01-01 erneuern, ist das neue Ablaufdatum der Lizenz der {1}-06-06."
"RenewLicenseEarylExplanation": "Wenn Sie Ihre Lizenz vor dem Ablaufdatum Ihrer Lizenz erneuern, wird Ihr Lizenzablaufdatum um 1 Jahr verlängert. Wenn Ihre Lizenz beispielsweise am {0}-06-06 abläuft und Sie sie am {0}-01-01 erneuern, ist das neue Ablaufdatum der Lizenz der {1}-06-06.",
"BlackFridayDiscount": "Black Friday Rabatt"
}
}

3
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json

@ -109,6 +109,7 @@
"ContinueWithNewOrganization": "Continue with a new organization",
"RenewLicenseEarly": "If I renew my license early, will I get the full year?",
"RenewLicenseEarylExplanation": "When you renew your license before your license expiry date, 1 year will be added to your license expiry date. For example, if your license expires on {0}-06-06 and you renew it on {0}-01-01, your new license expiry date will be {1}-06-06.",
"LicenseTypeNotCorrect": "The license type is not correct!"
"LicenseTypeNotCorrect": "The license type is not correct!",
"BlackFridayDiscount": "Black Friday Discount"
}
}

54
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 <a href=\"{0}\">premium support</a> anymore.",
"WhatHappensWhenLicenseEndsExplanation7": "You can extend (renew) your license if you want to continue getting these benefits. If you extend your license within <strong>1 month</strong> 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 <strong>1 month</strong> 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 <strong>1 month</strong> 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 <strong>1 month</strong> 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 <strong>1 month</strong> 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 <strong>1 month</strong> 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 <a href={0} target='_blank'>here</a>. 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?",
@ -564,7 +565,7 @@
"MyOrganizations_Detail_PaymentProviderInfo": "If you have purchased your license through <i>{0}</i> gateway, it sends the PDF invoice to your email address, see <a href=\"{1}\" target=\"_blank\">{0} invoicing.</a>",
"MyOrganizations_Detail_PayUInfo": "If you have purchased through the <i>PayU</i> 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 <span class=\"text-primary\">{0}</span> license",
"Continue": "Continue",
"PurchaseLicense": "Purchase {0} license",
"DownloadInvoiceModal_DownloadInvoice": "Download Invoice",
@ -746,10 +747,55 @@
"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.",
"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"
"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",
"BlackFridayDiscount": "Black Friday Discount"
}
}

7
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}. <br> Si desea continuar usando los proyectos que creó durante su período de prueba gratuito, debe cambiar las claves de licencia en sus archivos <code> appsettings.secrets.json </code>. Aquí está su clave de licencia:",
"TrialLicenseExpireMessage": "Está utilizando la licencia de prueba y su licencia de prueba caducará el {0}.",
"TryForFree": "Prueba gratis",
@ -381,6 +381,7 @@
"CommercialNewsletterConfirmationMessage": "Acepto los <a href=\"https://commercial.abp.io/TermsConditions\"> Términos y condiciones </a> y la <a href=\"https://commercial.abp.io/Privacy\"> Política de privacidad </a>.",
"ContinueWithNewOrganization": "Continuar con una nueva organización",
"RenewLicenseEarly": "Si renuevo mi licencia antes, ¿obtendré el año completo?",
"RenewLicenseEarylExplanation": "Cuando renueve su licencia antes de la fecha de vencimiento de su licencia, se agregará 1 año a la fecha de vencimiento de su licencia. Por ejemplo, si su licencia vence el {0} -06-06 y la renueva el {0} -01-01, la fecha de vencimiento de su nueva licencia será {1} -06-06."
"RenewLicenseEarylExplanation": "Cuando renueve su licencia antes de la fecha de vencimiento de su licencia, se agregará 1 año a la fecha de vencimiento de su licencia. Por ejemplo, si su licencia vence el {0} -06-06 y la renueva el {0} -01-01, la fecha de vencimiento de su nueva licencia será {1} -06-06.",
"BlackFridayDiscount": "Descuento de viernes negro"
}
}

10
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 <strong>1 kuukauden</strong> kuluessa lisenssin vanhenemisesta, seuraavat alennukset sovelletaan: Team License {0} % alennus, Business License {1} % alennus, Enterprise License {2} % alennus . Jos uusit lisenssisi <strong>1 kuukauden</strong> lisenssin päättymispäivän jälkeen, uusimishinta on sama kuin lisenssin ostohinta, eikä uusimisesta saa alennusta.",
"WhenShouldIRenewMyLicenseExplanation": "Jos uusit lisenssisi <strong>1 kuukauden</strong> kuluessa lisenssin vanhenemisesta, seuraavat alennukset sovelletaan: Team License {0} ; Business License {1} ; Enterprise License {2} ; . Jos uusit lisenssisi <strong>1 kuukauden</strong> 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.<br />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}. <br> Jos haluat jatkaa ilmaisen kokeilujakson aikana luomiesi projektien käyttöä, sinun on vaihdettava lisenssiavaimet <code>appsettings.secrets.json</code>-tiedostoissasi. Tässä on lisenssiavaimesi:",
"TrialLicenseExpireMessage": "Käytät kokeiluversiota, ja kokeilukäyttölupasi vanhenee {0}.",
"TryForFree": "Kokeile ilmaiseksi",
@ -381,6 +381,8 @@
"CommercialNewsletterConfirmationMessage": "Hyväksyn <a href=\"https://commercial.abp.io/TermsConditions\">käyttöehdot</a> ja <a href=\"https://commercial.abp.io/Privacy\">tietosuojakäytännön </a>.",
"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)",
"BlackFridayDiscount": "Black Friday -alennus"
}
}

10
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 <strong>1 mois</strong> 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 <strong>1 mois</strong> 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 <strong>1 mois</strong> 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 <strong>1 mois</strong> 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.<br />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}. <br> 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 <code>appsettings.secrets.json</code>. 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,8 @@
"CommercialNewsletterConfirmationMessage": "J'accepte les <a href=\"https://commercial.abp.io/TermsConditions\">Conditions générales</a> et la <a href=\"https://commercial.abp.io/Privacy\">Politique de confidentialité </a>.",
"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)",
"BlackFridayDiscount": "Remise Black Friday"
}
}

10
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json

@ -190,7 +190,7 @@
"ChangingDevelopers": "क्या मैं भविष्य में अपने संगठन के पंजीकृत डेवलपर्स को बदल सकता हूं?",
"ChangingDevelopersExplanation": "अपने लाइसेंस में नए डेवलपर्स को जोड़ने के अलावा, आप मौजूदा डेवलपर्स को भी बदल सकते हैं (आप एक डेवलपर को हटा सकते हैं और एक ही सीट पर एक नया जोड़ सकते हैं) बिना किसी अतिरिक्त लागत के।",
"WhenShouldIRenewMyLicense": "मुझे अपना लाइसेंस कब नवीनीकृत करना चाहिए?",
"WhenShouldIRenewMyLicenseExplanation": "यदि आप अपने लाइसेंस की समय सीमा समाप्त होने के बाद <strong>1 महीने</strong> के भीतर अपना लाइसेंस नवीनीकृत करते हैं, तो निम्नलिखित छूटें लागू होंगी: टीम लाइसेंस {0}% छूट, व्यवसाय लाइसेंस {1}% छूट, एंटरप्राइज़ लाइसेंस {2}% छूट . यदि आप अपने लाइसेंस की समाप्ति तिथि के बाद <strong>1 महीने</strong> अपने लाइसेंस का नवीनीकरण करते हैं, तो नवीनीकरण मूल्य लाइसेंस खरीद मूल्य के समान होगा और आपके नवीनीकरण पर कोई छूट नहीं होगी।",
"WhenShouldIRenewMyLicenseExplanation": "यदि आप अपने लाइसेंस की समय सीमा समाप्त होने के बाद <strong>1 महीने</strong> के भीतर अपना लाइसेंस नवीनीकृत करते हैं, तो निम्नलिखित छूटें लागू होंगी: टीम लाइसेंस {0} ; व्यवसाय लाइसेंस {1} ; एंटरप्राइज़ लाइसेंस {2} . यदि आप अपने लाइसेंस की समाप्ति तिथि के बाद <strong>1 महीने</strong> अपने लाइसेंस का नवीनीकरण करते हैं, तो नवीनीकरण मूल्य लाइसेंस खरीद मूल्य के समान होगा और आपके नवीनीकरण पर कोई छूट नहीं होगी।",
"TrialPlan": "क्या आपके पास एक परीक्षण योजना है?",
"DoYouAcceptBankWireTransfer": "क्या आप बैंक वायर ट्रांसफर स्वीकार करते हैं?",
"DoYouAcceptBankWireTransferExplanation": "हां, हम बैंक वायर ट्रांसफर स्वीकार करते हैं।<br />बैंक हस्तांतरण के माध्यम से लाइसेंस शुल्क भेजने के बाद, हमें अपनी रसीद और अनुरोधित लाइसेंस के प्रकार accounting@abp.io पर ईमेल करें। हमारे अंतरराष्ट्रीय बैंक खाते की जानकारी:",
@ -360,7 +360,7 @@
"Next": "अगला",
"StartTrial": "मेरा नि:शुल्क परीक्षण प्रारंभ करें",
"ContactUsIssues": "अगर आपको कोई समस्या है तो हमसे संपर्क करें",
"TrialActivatedWarning": "प्रिय {0}, एक उपयोगकर्ता केवल 1 नि:शुल्क परीक्षण अवधि का हकदार है। आप पहले ही अपनी परीक्षण अवधि का उपयोग कर चुके हैं।",
"TrialActivatedWarning": "एक उपयोगकर्ता केवल 1 निशुल्क परीक्षण अवधि का हकदार है। आपने पहले ही अपनी परीक्षण अवधि का उपयोग कर लिया है।",
"SaveAndDownload": "सहेजें और डाउनलोड करें",
"CompanyNameValidationMessage": "कंपनी का नाम बहुत लंबा है!",
"AddressValidationMessage": "पता बहुत लंबा है!",
@ -373,11 +373,13 @@
"TrialLicenseModelInvalidErrorMessage": "निम्न में से एक फ़ील्ड अमान्य है: देश का नाम, कंपनी का आकार, उद्योग या उपयोग का उद्देश्य।",
"Trial": "परीक्षण",
"Purchased": "खरीदी",
"PurchaseLicense": "खरीद लाइसेंस",
"PurchaseLicense": "खरीदें {0} लाइसेंस",
"PurchaseTrialLicenseMessage": "आपके लाइसेंस की समाप्ति तिथि {0} है। <br> यदि आप अपनी नि:शुल्क परीक्षण अवधि के दौरान बनाए गए प्रोजेक्ट का उपयोग जारी रखना चाहते हैं, तो आपको अपनी <code>appsettings.secrets.json</code> फ़ाइलों में लाइसेंस कुंजियों को बदलना होगा। यहां आपकी लाइसेंस कुंजी है:",
"TrialLicenseExpireMessage": "आप परीक्षण लाइसेंस का उपयोग कर रहे हैं और आपका परीक्षण लाइसेंस {0} को समाप्त हो जाएगा।",
"TryForFree": "मुफ्त में आजमाइये",
"TrialLicenseExpiredInfo": "आपके परीक्षण लाइसेंस की अवधि समाप्त हो गई है!",
"CommercialNewsletterConfirmationMessage": "मैं <a href=\"https://commercial.abp.io/TermsConditions\">नियम और शर्तों</a> और <a href=\"https://commercial.abp.io/Privacy\">गोपनीयता नीति से सहमत हूं </a>."
"CommercialNewsletterConfirmationMessage": "मैं <a href=\"https://commercial.abp.io/TermsConditions\">नियम और शर्तों</a> और <a href=\"https://commercial.abp.io/Privacy\">गोपनीयता नीति से सहमत हूं </a>.",
"discountForYears": "{1}वर्ष(वर्षों) के लिए {0}% छूट",
"BlackFridayDiscount": "ब्लैक फ्राइडे छूट",
}
}

17
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 <a href=\"{0}\">prémium támogatást</a> 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ő <strong>1 hónapon</strong> 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ő <strong>1 hónapon belül</strong> 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ő <strong>1 hónapon belül</strong> 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 <strong>1 hónappal</strong> 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ő <strong>1 hónapon belül</strong> 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 <strong>1 hónap</strong> 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 <a href={0} target='_blank'>ide</a> . 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.<br> 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: <b>{0}</b> . 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 <i>(z) {0}</i> á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: <a href=\"{1}\" target=\"_blank\">{0} számlázás.</a>",
"MyOrganizations_Detail_PayUInfo": "Ha a <i>PayU</i> á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 <span class=\"text-primary\">{0}</span> 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,10 @@
"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",
"BlackFridayDiscount": "Black Friday Kedvezmény"
}
}

7
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,11 +373,12 @@
"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}. <br> Ef þú vilt halda áfram að nota verkefnin sem þú bjóst til á ókeypis prufutímabilinu þarftu að breyta leyfislyklunum í <code> appsettings.secrets.json </code> skránni þinn. Hér er leyfislykillinn þinn:",
"TrialLicenseExpireMessage": "Þú ert að nota prufuleyfið og prufuleyfið rennur út {0}.",
"TryForFree": "Prófaðu ókeypis",
"TrialLicenseExpiredInfo": "Prófunartímabil þitt er útrunnið!",
"CommercialNewsletterConfirmationMessage": "Ég samþykki <a href=\"https://commercial.abp.io/TermsConditions\">skilmálana</a> og <a href=\"https://commercial.abp.io/Privacy\">persónuverndarstefnuna </a>."
"CommercialNewsletterConfirmationMessage": "Ég samþykki <a href=\"https://commercial.abp.io/TermsConditions\">skilmálana</a> og <a href=\"https://commercial.abp.io/Privacy\">persónuverndarstefnuna </a>.",
"BlackFridayDiscount": "Black Friday afsláttur"
}
}

10
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 <strong>1 mese</strong> 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 <strong>1 mese</strong> 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 <strong>1 mese</strong> dopo la scadenza della licenza, verranno applicati i seguenti sconti: Licenza Team {0} ; Licenza Business {1} ; Licenza Enterprise {2} . Se rinnovi la licenza <strong>1 mese</strong> 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.<br />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,13 @@
"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}. <br> Se desideri continuare a utilizzare i progetti che hai creato durante il periodo di prova gratuito, devi modificare le chiavi di licenza nei file <code>appsettings.secrets.json</code>. 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 <a href=\"https://commercial.abp.io/TermsConditions\">Termini e condizioni</a> e la <a href=\"https://commercial.abp.io/Privacy\">Informativa sulla privacy </a>."
"CommercialNewsletterConfirmationMessage": "Accetto i <a href=\"https://commercial.abp.io/TermsConditions\">Termini e condizioni</a> e la <a href=\"https://commercial.abp.io/Privacy\">Informativa sulla privacy </a>.",
"discountForYears": "{0}% di sconto per {1} anno/i",
"BlackFridayDiscount": "Sconto Black Friday"
}
}

9
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, <a href='{4}' target='_blank'>log in op uw account</a> 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, <a href='{3}' target='_blank'>log in op uw account</a> om de huidige verlengingsprijzen te bekijken.",
"HowDoIRenewMyLicense": "Hoe verleng ik mijn licentie?",
"HowDoIRenewMyLicenseExplanation": "U kunt uw licentie verlengen door naar de <a href='{0}' target='_blank'>organisatiebeheerpagina</a> 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,11 +373,12 @@
"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}. <br> Als je de projecten die je tijdens je gratis proefperiode hebt gemaakt wilt blijven gebruiken, moet je de licentiesleutels in je <code>appsettings.secrets.json</code>-bestanden wijzigen. Hier is uw licentiesleutel:",
"TrialLicenseExpireMessage": "U gebruikt de proeflicentie en uw proeflicentie verloopt op {0}.",
"TryForFree": "Probeer gratis",
"TrialLicenseExpiredInfo": "Uw proeflicentieperiode is verlopen!",
"CommercialNewsletterConfirmationMessage": "Ik ga akkoord met de <a href=\"https://commercial.abp.io/TermsConditions\">Algemene voorwaarden</a> en het <a href=\"https://commercial.abp.io/Privacy\">Privacybeleid </a>."
"CommercialNewsletterConfirmationMessage": "Ik ga akkoord met de <a href=\"https://commercial.abp.io/TermsConditions\">Algemene voorwaarden</a> en het <a href=\"https://commercial.abp.io/Privacy\">Privacybeleid </a>.",
"BlackFridayDiscount": "Black Friday korting"
}
}

7
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,11 +373,12 @@
"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}. <br> Jeśli chcesz nadal korzystać z projektów utworzonych podczas bezpłatnego okresu próbnego, musisz zmienić klucze licencyjne w plikach <code>appsettings.secrets.json</code>. 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",
"TrialLicenseExpiredInfo": "Twoja licencja próbna wygasła!",
"CommercialNewsletterConfirmationMessage": "Wyrażam zgodę na <a href=\"https://commercial.abp.io/TermsConditions\">Warunki</a> i <a href=\"https://commercial.abp.io/Privacy\">Politykę prywatności </a>."
"CommercialNewsletterConfirmationMessage": "Wyrażam zgodę na <a href=\"https://commercial.abp.io/TermsConditions\">Warunki</a> i <a href=\"https://commercial.abp.io/Privacy\">Politykę prywatności </a>.",
"BlackFridayDiscount": "Zniżka Black Friday"
}
}

10
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 <strong> 1 mês </strong> 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 <strong> 1 mês </strong> 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 <strong> 1 mês </strong> 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 <strong> 1 mês </strong> 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. <br /> 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,13 @@
"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}. <br> 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 <code> appsettings.secrets.json </code>. 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 <a href=\"https://commercial.abp.io/TermsConditions\"> Termos e Condições </a> e a <a href=\"https://commercial.abp.io/Privacy\"> Política de Privacidade </a>"
"CommercialNewsletterConfirmationMessage": "Eu concordo com os <a href=\"https://commercial.abp.io/TermsConditions\"> Termos e Condições </a> e a <a href=\"https://commercial.abp.io/Privacy\"> Política de Privacidade </a>",
"discountForYears": "{0}% de desconto por {1} ano(s)",
"BlackFridayDiscount": "Desconto de Black Friday"
}
}

7
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,11 +373,12 @@
"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}. <br> 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 <code>appsettings.secrets.json</code>. Iată cheia de licență:",
"TrialLicenseExpireMessage": "Utilizați licența de probă și licența de probă va expira pe {0}.",
"TryForFree": "Încearcă pe gratis",
"TrialLicenseExpiredInfo": "Perioada de licență de probă a expirat!",
"CommercialNewsletterConfirmationMessage": "Sunt de acord cu <a href=\"https://commercial.abp.io/TermsConditions\">Termenii și condițiile</a> și cu <a href=\"https://commercial.abp.io/Privacy\">Politica de confidențialitate </a>."
"CommercialNewsletterConfirmationMessage": "Sunt de acord cu <a href=\"https://commercial.abp.io/TermsConditions\">Termenii și condițiile</a> și cu <a href=\"https://commercial.abp.io/Privacy\">Politica de confidențialitate </a>.",
"BlackFridayDiscount": "Black Friday Discount"
}
}

7
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,11 +373,12 @@
"TrialLicenseModelInvalidErrorMessage": "Одно из следующих полей недействительно: название страны, размер компании, отрасль или цель использования.",
"Trial": "Испытание",
"Purchased": "Куплено",
"PurchaseLicense": "Купить лицензию",
"PurchaseLicense": "Купить {0} лицензию",
"PurchaseTrialLicenseMessage": "Срок действия вашей лицензии: {0}. <br> Если вы хотите продолжить использование проектов, созданных в течение бесплатного пробного периода, вам необходимо изменить лицензионные ключи в файлах <code> appsettings.secrets.json </code>. Вот ваш лицензионный ключ:",
"TrialLicenseExpireMessage": "Вы используете пробную лицензию, и срок ее действия истечет {0}.",
"TryForFree": "Попробуй бесплатно",
"TrialLicenseExpiredInfo": "Срок действия вашей пробной лицензии истек!",
"CommercialNewsletterConfirmationMessage": "Я согласен с <a href=\"https://commercial.abp.io/TermsConditions\"> Положениями и условиями </a> и <a href=\"https://commercial.abp.io/Privacy\"> Политикой конфиденциальности </a>."
"CommercialNewsletterConfirmationMessage": "Я согласен с <a href=\"https://commercial.abp.io/TermsConditions\"> Положениями и условиями </a> и <a href=\"https://commercial.abp.io/Privacy\"> Политикой конфиденциальности </a>.",
"BlackFridayDiscount": "Черная пятница Скидка"
}
}

10
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 <strong>1 mesiaca</strong> 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 <strong>1 mesiac</strong> 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 <strong>1 mesiaca</strong> 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 <strong>1 mesiac</strong> 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.<br />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,13 @@
"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}. <br> 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 <code>appsettings.secrets.json</code>. 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 <a href=\"https://commercial.abp.io/TermsConditions\">Terms & Conditions</a> and <a href=\"https://commercial.abp.io/Privacy\">Privacy Policy</a>."
"CommercialNewsletterConfirmationMessage": "I agree to the <a href=\"https://commercial.abp.io/TermsConditions\">Terms & Conditions</a> and <a href=\"https://commercial.abp.io/Privacy\">Privacy Policy</a>.",
"discountForYears": "{0} % odpusteného prívesku {1} an(ov)",
"BlackFridayDiscount": "Black Friday zľava"
}
}

7
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,11 +373,12 @@
"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}. <br> Če želite še naprej uporabljati projekte, ki ste jih ustvarili med brezplačnim preizkusnim obdobjem, morate spremeniti licenčne ključe v datotekah <code>appsettings.secrets.json</code>. Tukaj je vaš licenčni ključ:",
"TrialLicenseExpireMessage": "Uporabljate preizkusno licenco in vaša preizkusna licenca bo potekla {0}.",
"TryForFree": "Poskusite brezplačno",
"TrialLicenseExpiredInfo": "Vaša preizkusna licenca je potekla!",
"CommercialNewsletterConfirmationMessage": "Strinjam se s <a href=\"https://commercial.abp.io/TermsConditions\">pogoji in določili</a> in <a href=\"https://commercial.abp.io/Privacy\">pravilnikom o zasebnosti </a>."
"CommercialNewsletterConfirmationMessage": "Strinjam se s <a href=\"https://commercial.abp.io/TermsConditions\">pogoji in določili</a> in <a href=\"https://commercial.abp.io/Privacy\">pravilnikom o zasebnosti </a>.",
"BlackFridayDiscount": "Popust Black Friday"
}
}

7
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}. <br> Ücretsiz deneme süreniz boyunca oluşturduğunuz projeleri kullanmaya devam etmek istiyorsanız, <code>appsettings.secrets.json</code> 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",
@ -745,6 +745,7 @@
"ConfirmedEmailAddressRequiredToStartTrial": "Deneme lisansı başlatmak için onaylanmış bir e -posta adresiniz olmalı.",
"EmailVerificationMailNotSent": "E-posta doğrulama postası gönderilemedi.",
"GetConfirmationEmail": "Daha önce bir onay e-postası almadıysanız <a href=\"javascript:void(0);\" id=\"{0}\"> almak için buraya tıklayın.</a>",
"WhichLicenseTypeYouAreInterestedIn": "Hangi lisans türüyle ilgileniyorsunuz?"
"WhichLicenseTypeYouAreInterestedIn": "Hangi lisans türüyle ilgileniyorsunuz?",
"BlackFridayDiscount": "Kara Cuma İndirimi"
}
}

7
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,11 +373,12 @@
"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}. <br> 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 <code> appsettings.secrets.json </code> 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í",
"TrialLicenseExpiredInfo": "Thời gian cấp phép dùng thử của bạn đã hết hạn!",
"CommercialNewsletterConfirmationMessage": "Tôi đồng ý với <a href=\"https://commercial.abp.io/TermsConditions\"> Điều khoản & điều kiện </a> và <a href=\"https://commercial.abp.io/Privacy\"> Chính sách quyền riêng tư </a>."
"CommercialNewsletterConfirmationMessage": "Tôi đồng ý với <a href=\"https://commercial.abp.io/TermsConditions\"> Điều khoản & điều kiện </a> và <a href=\"https://commercial.abp.io/Privacy\"> Chính sách quyền riêng tư </a>.",
"BlackFridayDiscount": "Giảm giá Black Friday"
}
}

19
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json

@ -202,10 +202,11 @@
"WhatHappensWhenLicenseEndsExplanation4": "你不能在你的许可证到期后安装ABP商业平台上添加的新模块和主题。",
"WhatHappensWhenLicenseEndsExplanation5": "你不能使用ABP Suite。",
"WhatHappensWhenLicenseEndsExplanation6": "你不能再获得<a href=\"{0}\">高级支持</a>。",
"WhatHappensWhenLicenseEndsExplanation7": "如果你想继续获得这些奖励,你可以继续续费你的许可证。如果你在许可证到期后<strong>1个月</strong>内续费,将会应用以下折扣:团队许可证{0}%折扣,商业许可证{1}%折扣,企业许可证{2}%折扣。",
"WhatHappensWhenLicenseEndsExplanation7": "如果您想继续获得这些好处,您可以延长(续订)您的许可证。 如果您在许可证到期后 <strong>1 个月</strong>内延长许可证,将应用以下折扣:团队许可证 {0}; 营业执照{1}; 企业许可证 {2}。",
"discountForYears": "{0}% 折扣 {1} 年",
"WhatHappensWhenLicenseEndsExplanation8": "您生成的 ABP 项目未存储在我们的服务器上。 因此,您有责任保留下载的源代码。 当您的许可证到期时,将无法获取您生成的 ABP 项目源代码。",
"WhenShouldIRenewMyLicense": "我什么时候应该续订我的许可?",
"WhenShouldIRenewMyLicenseExplanation": "如果您在许可证到期后 <strong>1 个月</strong>内续订许可证,将享受以下折扣:团队许可证 {0}% 折扣、商业许可证 {1}% 折扣、企业许可证 {2}% 折扣 . 如果您在许可证到期后 <strong>1 个月</strong>续订许可证,续订价格将与许可证购买价格相同,并且续订不会有折扣。",
"WhenShouldIRenewMyLicenseExplanation": "如果您在许可证到期后 <strong>1 个月</strong> 内续订许可证,将适用以下折扣:团队许可证 {0}; 营业执照{1}; 企业许可证 {2}。 但是,如果您在许可证到期后 <strong>1 个月</strong>续订许可证,续订价格将与许可证购买价格相同,并且您的续订不会有任何折扣。",
"TrialPlan": "你们有试用计划吗?",
"TrialPlanExplanation": "ABP商业团队许可证有14天的试用期。若要了解更多信息,请访问<a href={0} target='_blank'>这里</a>。此外,我们为团队许可证提供30天的金额返还保证。你只需要在30天内请求退款。商业和企业许可证将提供60%的金额返还保证。这是因为商业和企业许可证包含了所有模块和主题的全部源代码。",
"DoYouAcceptBankWireTransfer": "你们接受银行电汇吗?",
@ -375,7 +376,7 @@
"Next": "下一个",
"StartTrial": "开始我的免费试用",
"ContactUsQuestions": "如果你有任何问题,请联系我们",
"TrialActivatedWarning": "亲爱的{0},用户只能享受 1 个免费试用期。您已经使用了试用期。",
"TrialActivatedWarning": "一个用户只能有 1 个免费试用期。您已经使用了试用期。",
"ActivationRequirement": "你已经距离开始你的试用还有最后一步。<br>检查你的信息后,我们将激活你的许可证。一旦你的许可证激活,我们将向<b>{0}</b>发送电子邮件。请不要担心,这个过程不会太久!",
"SaveAndDownload": "保存和下载",
"CompanyNameValidationMessage": "公司名称太长!",
@ -561,12 +562,12 @@
"Products": "产品",
"TotalPrice": "总价格",
"ThereIsNoInvoice": "没有发票",
"MyOrganizations_Detail_PaymentProviderInfo": "如果您通过 <i>{0}</i> 网关购买了许可证,PDF 发票会被发送到您的电子邮件地址,请参阅 <a href=\"{1}\" target=\"_blank\">{ 0} 发票。</a>",
"MyOrganizations_Detail_PaymentProviderInfo": "如果您通过 <i>{0}</i> 网关购买了许可证,它会将 PDF 发票发送到您的电子邮件地址,请参阅 <a href=\"{1}\" target=\"_blank\"> {0} 发票。</a>",
"MyOrganizations_Detail_PayUInfo": "如果您是通过<i>PayU</i>网关购买的,请点击\"索取发票\"按钮并填写账单信息。",
"MyOrganizations_Detail_ConclusionInfo": "您的发票申请将在 {0} 个工作日内完成。",
"ExtendYourLicense": "延长您的 {0} 许可",
"ExtendYourLicense": "延长您的 <span class=\"text-primary\">{0}</span> 许可",
"Continue": "继续",
"PurchaseLicense": "购买许可证",
"PurchaseLicense": "购买 {0} 许可证",
"DownloadInvoiceModal_DownloadInvoice": "下载发票",
"DownloadInvoiceModal_SaveInformationOnlyOnce": "您只能保存一次账单信息。",
"InvoiceModal_EnterCompanyName": "请输入您的法定公司名称...",
@ -737,6 +738,10 @@
"GetConfirmationEmail": "<a href=\"javascript:void(0);\" id=\"{0}\">点击这里获取确认邮件</a> 如果你还没有收到。",
"WhichLicenseTypeYouAreInterestedIn": "你感兴趣的许可证类型是什么?",
"BlazoriseLicense": "我们是否需要购买Blazorise许可证?",
"BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。"
"BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。",
"ExtendPaymentInfoSection_DeveloperPrice": "{0} x 开发者价格",
"ExtendPaymentInfoSection_DiscountRate": "折扣 {0}%",
"TotalNetPrice": "总净价",
"BlackFridayDiscount": "黑色星期五折扣"
}
}

10
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json

@ -192,7 +192,7 @@
"ChangingDevelopers": "我將來可以更改我組織的註冊開發人員嗎?",
"ChangingDevelopersExplanation": "除了將新的開發人員添加到你的許可中之外,你還可以更改現有的開發人員(可以刪除一個開發人員並將新的開發人員添加到同一位置),而無需任何額外費用.",
"WhenShouldIRenewMyLicense": "我什麽時候應該續訂我的許可?",
"WhenShouldIRenewMyLicenseExplanation": "如果您在許可證到期後 <strong>1 個月</strong>內續訂許可證,將享受以下折扣:團隊許可證 {0}% 折扣、商業許可證 {1}% 折扣、企業許可證 {2}% 折扣 . 如果您在許可證到期後 <strong>1 個月</strong>續訂許可證,續訂價格將與許可證購買價格相同,並且續訂不會有折扣。",
"WhenShouldIRenewMyLicenseExplanation": "如果您在許可證到期後 <strong>1 個月</strong>內續訂許可證,將享受以下折扣:團隊許可證 {0} ; 商業許可證 {1} ;企業許可證 {2}. 如果您在許可證到期後 <strong>1 個月</strong>續訂許可證,續訂價格將與許可證購買價格相同,並且續訂不會有折扣。",
"TrialPlan": "你們有試用計劃嗎?",
"DoYouAcceptBankWireTransfer": "你們接受銀行電匯嗎?",
"DoYouAcceptBankWireTransferExplanation": "是的,我們接受銀行電匯。<br />在通過銀行轉賬發送許可費後,將您的收據和所需的許可類型通過電子郵件發送至accounting@abp.io。 我們的國際銀行賬戶信息:",
@ -362,7 +362,7 @@
"Next": "下一個",
"StartTrial": "開始我的免費試用",
"ContactUsIssues": "如果您有任何問題,請聯繫我們",
"TrialActivatedWarning": "親愛的{0},用戶只能享受 1 個免費試用期。您已經使用了試用期。",
"TrialActivatedWarning": "一個用戶只能有 1 個免費試用期。您已經使用了試用期。",
"SaveAndDownload": "保存和下載",
"CompanyNameValidationMessage": "公司名稱太長!",
"AddressValidationMessage": "地址太長!",
@ -375,13 +375,15 @@
"TrialLicenseModelInvalidErrorMessage": "以下字段之一無效:國家名稱、公司規模、行業或使用目的。",
"Trial": "審判",
"Purchased": "已購買",
"PurchaseLicense": "購買許可證",
"PurchaseLicense": "購買 {0} 許可證",
"PurchaseTrialLicenseMessage": "您的許可證到期日期是 {0}。 <br> 如果您想繼續使用您在免費試用期內創建的項目,您需要更改 <code>appsettings.secrets.json</code> 文件中的許可證密鑰。這是您的許可證密鑰:",
"TrialLicenseExpireMessage": "您正在使用試用許可證,您的試用許可證將於 {0}到期。",
"TryForFree": "免費試用",
"TrialLicenseExpiredInfo": "您的試用許可期限已過!",
"CommercialNewsletterConfirmationMessage": "我同意<a href=\"https://commercial.abp.io/TermsConditions\">條款和條件</a>和<a href=\"https://commercial.abp.io/Privacy\">隱私政策</a>。",
"BlazoriseLicense": "我们是否需要购买Blazorise许可证?",
"BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。"
"BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。",
"discountForYears": "{0}% 折扣 {1} 年",
"BlackFridayDiscount": "黑色星期五折扣"
}
}

2
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<span class=\"gradient-community\"> Community</span> 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",

2
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 <span class=\"gradient-community\">közösségi</span> 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",

2
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<span class=\"gradient-community\"> Topluluk</span> 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",

2
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<span class=\"gradient-community\">社区</span>会谈",
"Events_Page_WritingFromUser": "阅读来自 ABP 社区的 {0} 的文章。",
"Members_Page_WritingFromUser": "阅读来自 ABP 社区的 {0} 的文章。",
"Post_Create_Page_MetaTitle": "最新帖子",
"Post_Create_Page_MetaDescription": "创建您的帖子以分享您对 ABP 框架的经验并为 ABP 社区做出贡献。",
"Post_Create_Page_CreateNewPost": "创建新帖子",

2
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

151
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": "\\<a(.*)\\>",
"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"
]
}

50
docs/en/API/Static-CSharp-API-Clients.md

@ -36,6 +36,12 @@ public interface IBookAppService : IApplicationService
Implement this class in your service application. You can use [auto API controller system](Auto-API-Controllers.md) to expose the service as a REST API endpoint.
## With Contracts or Without Contracts
`Without Contracts` depending on target service's `application.contracts` package, so they can reuse the DTOs and other related classes. However, that can be a problem when we want to create fully independently developed and deployed microservices. We want to use the static proxy generation even without depending target service's application.contracts package.
`With Contracts` generate all the `classes/enums/other` types in the client side (including application service interfaces) , This is also the default behavior of the `generate-proxy` command.
## Client Proxy Generation
First, add [Volo.Abp.Http.Client](https://www.nuget.org/packages/Volo.Abp.Http.Client) nuget package to your client project:
@ -53,7 +59,27 @@ public class MyClientAppModule : AbpModule
}
````
Now, it's ready to configure the application for the static client proxy generation. Example:
Now, it's ready to configure the application for the static client proxy generation.
### With Contracts Example
````csharp
[DependsOn(
typeof(AbpHttpClientModule) //used to create client proxies
)]
public class MyClientAppModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// Prepare for static client proxy generation
context.Services.AddStaticHttpClientProxies(
typeof(MyClientAppModule).Assembly
);
}
}
````
### Without Contracts Example
````csharp
[DependsOn(
@ -98,6 +124,8 @@ Server side must be up and running while generating the client proxy code. So, r
Open a command-line terminal in the root folder of your client project (`.csproj`) and type the following command:
#### With Contracts
````bash
abp generate-proxy -t csharp -u http://localhost:53929/
````
@ -106,9 +134,25 @@ abp generate-proxy -t csharp -u http://localhost:53929/
This command should generate the following files under the `ClientProxies` folder:
![generated-static-client-proxies](../images/generated-static-client-proxies.png)
![generated-static-client-proxies](../images/generated-static-client-proxies-with-contracts.png)
* `BookClientProxy.Generated.cs` is the actual generated proxy class in this example. `BookClientProxy` is a `partial` class * where you can write your custom code (ABP won't override it).
* `IBookAppService.cs` is the app service.
* `BookDto.cs` is the Dto class which uses by app service.
* `app-generate-proxy.json` contains information about the remote HTTP endpoint, so ABP can properly perform HTTP requests.
#### Without Contracts
````bash
abp generate-proxy -t csharp -u http://localhost:53929/ --without-contracts
````
This command should generate the following files under the `ClientProxies` folder:
![generated-static-client-proxies](../images/generated-static-client-proxies-without-contracts.png)
`BookClientProxy.Generated.cs` is the actual generated proxy class in this example. `BookClientProxy` is a `partial` class where you can write your custom code (ABP won't override it). `app-generate-proxy.json` contains information about the remote HTTP endpoint, so ABP can properly perform HTTP requests.
* `BookClientProxy.Generated.cs` is the actual generated proxy class in this example. `BookClientProxy` is a `partial` class where you can write your custom code (ABP won't override it).
* `app-generate-proxy.json` contains information about the remote HTTP endpoint, so ABP can properly perform HTTP requests.
> `generate-proxy` command generates proxies for only the APIs you've defined in your application. If you are developing a modular application, you can specify the `-m` (or `--module`) parameter to specify the module you want to generate proxies. See the *generate-proxy* section in the [ABP CLI](../CLI.md) documentation for other options.

2
docs/en/Blob-Storing-Aws.md

@ -59,7 +59,7 @@ Configure<AbpBlobStoringOptions>(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 (-).

2
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

9
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.
@ -506,6 +506,7 @@ abp login <username> # Allows you to enter your
abp login <username> -p <password> # Specify the password as a parameter (password is visible)
abp login <username> --organization <organization> # If you have multiple organizations, you need set your active organization
abp login <username> -p <password> -o <organization> # You can enter both your password and organization in the same command
abp login <username> --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.

2
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<Volo.Abp.Identity.IdentityUser>

4
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:

2
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.

6
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.

2
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

4
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)

4
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.

265
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 `<TargetFramework>*</TargetFramework>` in the `*.csproj` files to support .NET 7:
```xml
<TargetFramework>net7.0</TargetFramework>
```
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
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.Components" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.0-rc.2.*">
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.0-rc.2.*">
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Composite" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.FileSystemGlobbing" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="7.0.0-rc.2.*" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="7.0.0-rc.2.*" />
<PackageReference Include="System.Text.Encodings.Web" Version="7.0.0-rc.2.*" />
<PackageReference Include="System.Text.Json" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="7.0.0-rc.2.*" />
<PackageReference Include="System.Collections.Immutable" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="7.0.0-rc.2.*" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="7.0.0-rc.2.*" />
```
---
## 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
<TargetFramework>net7.0</TargetFramework>
```
### 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
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
```
### 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 🤗
...

BIN
docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/as-single-query.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
docs/en/Community-Articles/2022-10-27-Dotnet7-Upgrade/cover-image.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

6
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.

12
docs/en/Data-Seeding.md

@ -131,6 +131,16 @@ Then the data seed contributors can access to these properties via the `DataSeed
If a module needs to a parameter, it should be declared on the [module documentation](Modules/Index.md). For example, the [Identity Module](Modules/Identity.md) can use `AdminEmail` and `AdminPassword` parameters if you provide (otherwise uses the default values).
### Separate Unit Of Works
The default seed will be in a unit of work and may use transactions. If there are multiple `IDataSeedContributor` or too much data written, it may cause a database timeout error.
We provide an extension method of `SeedInSeparateUowAsync` for the `IDataSeeder` service to create a separate unit of work for each `IDataSeedContributor`.
````csharp
public static Task SeedInSeparateUowAsync(this IDataSeeder seeder, Guid? tenantId = null, AbpUnitOfWorkOptions options = null, bool requiresNew = false)
````
### Where & How to Seed Data?
It is important to understand where & how to execute the `IDataSeeder.SeedAsync()`?
@ -163,4 +173,4 @@ We suggest the same way on development. Run the DbMigrator console application w
You probably want to seed the data also for automated [testing](Testing.md), so want to use the `IDataSeeder.SeedAsync()`. In the [application startup template](Startup-Templates/Application.md), it is done in the [OnApplicationInitialization](Module-Development-Basics.md) method of the *YourProjectName*TestBaseModule class of the TestBase project.
In addition to the standard seed data (that is also used on production), you may want to seed additional data unique to the automated tests. If so, you can create a new data seed contributor in the test project to have more data to work on.
In addition to the standard seed data (that is also used on production), you may want to seed additional data unique to the automated tests. If so, you can create a new data seed contributor in the test project to have more data to work on.

2
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

12
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.
* 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.

2
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).

4
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.

2
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.

2
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) <sup id="a-yarn">[1](#f-yarn)</sup> or npm v6+ (already installed with Node)
{{ end }}
{{ if Tiered == "Yes" }}

24
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<IJsonSerializerProvider>`)**: 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<string>`)**: 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<Action<JsonTypeInfo>>`)**: 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.

2
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 `<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>` 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;

2
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 `<ModalContent>` and replace it with `Size="ModalSize.Fullscreen"` parameter.

36
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<string>)`: 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

4
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)

2
docs/en/Migration-Guides/OpenIddict-Mvc.md

@ -27,7 +27,7 @@
with
```csharp
typeof(AbpAccountWebModule),
typeof(AbpAccountWebOpenIddictModule),
```
- In **MyApplicationWebModule.cs** `ConfigureServices` method **update authentication configuration**:

122
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
<PackageReference Include="Volo.Abp.IdentityServer.Domain.Shared" Version="6.0.*" />
```
```csharp
<PackageReference Include="Volo.Abp.IdentityServer.Domain.Shared" Version="6.0.*" />
```
with
```csharp
<PackageReference Include="Volo.Abp.OpenIddict.Domain.Shared" Version="6.0.*" />
```
```csharp
<PackageReference Include="Volo.Abp.OpenIddict.Domain.Shared" Version="6.0.*" />
```
- 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
<PackageReference Include="Volo.Abp.IdentityServer.Domain" Version="6.0.*" />
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.IdentityServer" Version="6.0.*" />
```
```csharp
<PackageReference Include="Volo.Abp.IdentityServer.Domain" Version="6.0.*" />
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.IdentityServer" Version="6.0.*" />
```
with
```csharp
<PackageReference Include="Volo.Abp.OpenIddict.Domain" Version="6.0.*" />
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.OpenIddict" Version="6.0.*" />
```
```csharp
<PackageReference Include="Volo.Abp.OpenIddict.Domain" Version="6.0.*" />
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.OpenIddict" Version="6.0.*" />
```
- 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
@ -101,19 +107,19 @@ If you are using MongoDB, skip this step and check the *MongoDB* layer section.
- 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**:
@ -165,19 +171,19 @@ If you are using EntityFrameworkCore, skip this step and check the *EntityFramew
- 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)

2
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()

2
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

2
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.

2
docs/en/Modules/OpenIddict.md

@ -293,6 +293,8 @@ PreConfigure<AbpOpenIddictAspNetCoreOptions>(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.

8
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:

2
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.

2
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)

2
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.

12
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.

186
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,15 +69,15 @@ 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
@ -85,22 +85,18 @@ In order to migrate to LeptonX on your server side projects (Host and/or AuthSer
## Customization
### Layouts
The Angular version of LeptonX Lite provides **layout components** for your **user interface** on [ABP Framework Theming](https://docs.abp.io/en/abp/latest/UI/Angular/Theming). You can use layouts to **organize your user interface**. You can replace the **layout components** and some parts of the **layout components** with the [ABP replaceable component system](https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement).
The 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.
- **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.
The **Layout components** and all the replacable components are predefined in `eThemeLeptonXComponents` as enum.
### How to replace a component
```js
@ -122,8 +118,8 @@ export class AppComponent {
}
}
```
See the [Component Replacement](https://docs.abp.io/en/abp/latest/UI/Angular/Component-Replacement) documentation for more information on how to replace components.
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
@ -131,16 +127,14 @@ The **brand component** is a simple component that can be used to display your b
```js
///...
this.replaceableComponents.add({
component: YourNewLogoComponent,
key: eThemeLeptonXComponents.Logo,
});
this.replaceableComponents.add({
component: YourNewLogoComponent,
key: eThemeLeptonXComponents.Logo,
});
///...
```
![Brand component](../../images/leptonxlite-brand-component.png)
![Brand component](../../images/leptonxlite-brand-component.png)
## Breadcrumb Component
@ -148,14 +142,14 @@ On websites that have a lot of pages, **breadcrumb navigation** can greatly **en
```js
///...
this.replaceableComponents.add({
component: YourNewSidebarComponent,
key: eThemeLeptonXComponents.Breadcrumb,
});
this.replaceableComponents.add({
component: YourNewSidebarComponent,
key: eThemeLeptonXComponents.Breadcrumb,
});
///...
```
![Breadcrumb component](../../images/leptonxlite-breadcrumb-component.png)
![Breadcrumb component](../../images/leptonxlite-breadcrumb-component.png)
## Sidebar Menu Component
@ -163,54 +157,61 @@ Sidebar menus have been used as a **directory for Related Pages** to a **Service
```js
///...
this.replaceableComponents.add({
component: YourNewSidebarComponent,
key: eThemeLeptonXComponents.Sidebar,
});
this.replaceableComponents.add({
component: YourNewSidebarComponent,
key: eThemeLeptonXComponents.Sidebar,
});
///...
```
![Sidebar menu component](../../images/leptonxlite-sidebar-menu-component.png)
![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)
![Page alerts component](../../images/leptonxlite-page-alerts-component.png)
```js
///...
this.replaceableComponents.add({
component: YourNewPageAlertContainerComponent,
key: eThemeLeptonXComponents.PageAlertContainer,
});
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,
});
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** <u>**without trying to locate it across the website.**</u>
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** <u>**without trying to locate it across the website.**</u>
![Language switch component](../../images/leptonxlite-language-switch-component.png)
![Language switch component](../../images/leptonxlite-language-switch-component.png)
```js
///...
this.replaceableComponents.add({
component: YourNewLanguagesComponent,
key: eThemeLeptonXComponents.Languages,
});
this.replaceableComponents.add({
component: YourNewLanguagesComponent,
key: eThemeLeptonXComponents.Languages,
});
///...
```
@ -219,33 +220,84 @@ Think about a **multi-lingual** website and the first thing that could **hit you
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,
});
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)
![Mobile user menu component](../../images/leptonxlite-mobile-user-menu-component.png)
```js
///...
this.replaceableComponents.add({
component: YourNewMobileNavbarComponent,
key: eThemeLeptonXComponents.MobileNavbar,
});
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.
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,
});
///...
```

48
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"
}
]
})

2
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"}}

2
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"}}

18
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.

4
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<any>` | - |

10
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
<span> {{today | date 'dd/mm/yy'}}</span>
<span>{{today | date 'dd/mm/yy'}}</span>
```
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
<span> {{today | shortDatePipe }}</span>
<span>{{today | shortDatePipe }}</span>
```
# ShortTime Pipe
```html
<span> {{today | shortTimePipe }}</span>
<span>{{today | shortTimePipe }}</span>
```
# ShortDateTime Pipe
```html
<span> {{today | shortDateTimePipe }}</span>
<span>{{today | shortDateTimePipe }}</span>
```
}%}

2
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
<img alt="Form Prop Extension Example: 'Date of Birth' Field" src="./images/form-prop-extensions---birthday-field.gif" width="800px" style="max-width:100%">
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

2
docs/en/UI/Angular/Loading-Strategy.md

@ -102,7 +102,7 @@ Sets given paremeters and `crossorigin="anonymous"` as attributes of created `<s
LOADING_STRATEGY.PrependAnonymousStyleToHead(href: string, integrity?: string)
```
Sets given paremeters and `crossorigin="anonymous"` as attributes of created `<style>` element and places it at the **beginning** of `<head>` tag in the document.
Sets given parameters and `crossorigin="anonymous"` as attributes of created `<style>` element and places it at the **beginning** of `<head>` tag in the document.
## See Also

2
docs/en/UI/Angular/Quick-Start.md

@ -4,7 +4,7 @@
Please follow the steps below to prepare your development environment for Angular.
1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js v12 or v14 installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system.
1. **Install Node.js:** Please visit [Node.js downloads page](https://nodejs.org/en/download/) and download proper Node.js v16 or v18 installer for your OS. An alternative is to install [NVM](https://github.com/nvm-sh/nvm) and use it to have multiple versions of Node.js in your operating system.
2. **[Optional] Install Yarn:** You may install Yarn v1 (not v2) following the instructions on [the installation page](https://classic.yarnpkg.com/en/docs/install). Yarn v1 delivers an arguably better developer experience compared to npm v6 and below. You may skip this step and work with npm, which is built-in in Node.js, instead.
3. **[Optional] Install VS Code:** [VS Code](https://code.visualstudio.com/) is a free, open-source IDE which works seamlessly with TypeScript. Although you can use any IDE including Visual Studio or Rider, VS Code will most likely deliver the best developer experience when it comes to Angular projects. ABP project templates even contain plugin recommendations for VS Code users, which VS Code will ask you to install when you open the Angular project folder. Here is a list of recommended extensions:
- [Angular Language Service](https://marketplace.visualstudio.com/items?itemName=angular.ng-template)

219
docs/en/UI/Angular/Theme-Configurations.md

@ -1,3 +1,220 @@
# Angular UI: Theme Configurations
> This document is in draft version.
Theme packages no longer import styles as CSS modules as of ABP version 6.0. The following style settings need to be included to the angular.json file in order for theme packages to load styles.
## Lepton X Lite
```json
{
"input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/bootstrap-dim.css",
"inject": false,
"bundleName": "bootstrap-dim"
},
{
"input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/ng-bundle.css",
"inject": false,
"bundleName": "ng-bundle"
},
{
"input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/side-menu/layout-bundle.css",
"inject": false,
"bundleName": "layout-bundle"
},
{
"input": "node_modules/@abp/ng.theme.lepton-x/assets/css/abp-bundle.css",
"inject": false,
"bundleName": "abp-bundle"
},
{
"input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/bootstrap-dim.rtl.css",
"inject": false,
"bundleName": "bootstrap-dim.rtl"
},
{
"input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/ng-bundle.rtl.css",
"inject": false,
"bundleName": "ng-bundle.rtl"
},
{
"input": "node_modules/@volo/ngx-lepton-x.lite/assets/css/side-menu/layout-bundle.rtl.css",
"inject": false,
"bundleName": "layout-bundle.rtl"
},
{
"input": "node_modules/@abp/ng.theme.lepton-x/assets/css/abp-bundle.rtl.css",
"inject": false,
"bundleName": "abp-bundle.rtl"
},
```
## Theme Basic
```json
{
"input": "node_modules/bootstrap/dist/css/bootstrap.rtl.min.css",
"inject": false,
"bundleName": "bootstrap-rtl.min"
},
{
"input": "node_modules/bootstrap/dist/css/bootstrap.min.css",
"inject": true,
"bundleName": "bootstrap-ltr.min"
},
```
## Lepton X
```json
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/dark.css",
"inject": false,
"bundleName": "dark"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/light.css",
"inject": false,
"bundleName": "light"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/dim.css",
"inject": false,
"bundleName": "dim"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-dim.css",
"inject": false,
"bundleName": "bootstrap-dim"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-dark.css",
"inject": false,
"bundleName": "bootstrap-dark"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-light.css",
"inject": false,
"bundleName": "bootstrap-light"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/ng-bundle.css",
"inject": false,
"bundleName": "ng-bundle"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/side-menu/layout-bundle.css",
"inject": false,
"bundleName": "layout-bundle"
},
{
"input": "node_modules/@volosoft/abp.ng.theme.lepton-x/assets/css/abp-bundle.css",
"inject": false,
"bundleName": "abp-bundle"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/dark.rtl.css",
"inject": false,
"bundleName": "dark.rtl"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/light.rtl.css",
"inject": false,
"bundleName": "light.rtl"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/dim.rtl.css",
"inject": false,
"bundleName": "dim.rtl"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-dim.rtl.css",
"inject": false,
"bundleName": "bootstrap-dim.rtl"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-dark.rtl.css",
"inject": false,
"bundleName": "bootstrap-dark.rtl"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/bootstrap-light.rtl.css",
"inject": false,
"bundleName": "bootstrap-light.rtl"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/ng-bundle.rtl.css",
"inject": false,
"bundleName": "ng-bundle.rtl"
},
{
"input": "node_modules/@volosoft/ngx-lepton-x/assets/css/side-menu/layout-bundle.rtl.css",
"inject": false,
"bundleName": "layout-bundle.rtl"
},
{
"input": "node_modules/@volosoft/abp.ng.theme.lepton-x/assets/css/abp-bundle.rtl.css",
"inject": false,
"bundleName": "abp-bundle.rtl"
}
```
## Theme Lepton
```json
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton1.min.css",
"inject": false,
"bundleName": "lepton1"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton2.min.css",
"inject": false,
"bundleName": "lepton2"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton3.min.css",
"inject": false,
"bundleName": "lepton3"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton4.min.css",
"inject": false,
"bundleName": "lepton4"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton5.min.css",
"inject": false,
"bundleName": "lepton5"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton6.min.css",
"inject": false,
"bundleName": "lepton6"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton1.rtl.min.css",
"inject": false,
"bundleName": "lepton1.rtl"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton2.rtl.min.css",
"inject": false,
"bundleName": "lepton2.rtl"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton3.rtl.min.css",
"inject": false,
"bundleName": "lepton3.rtl"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton4.rtl.min.css",
"inject": false,
"bundleName": "lepton4.rtl"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton5.rtl.min.css",
"inject": false,
"bundleName": "lepton5.rtl"
},
{
"input": "node_modules/@volo/abp.ng.theme.lepton/dist/global/styles/lepton6.rtl.min.css",
"inject": false,
"bundleName": "lepton6.rtl"
},
```

6
docs/en/UI/AspNetCore/Client-Side-Package-Management.md

@ -18,7 +18,7 @@ To solve the versioning problem, we created a **standard set of packages** those
The benefit of a **standard package** is:
* It depends on a **standard version** of a package. Depending on this package is **safe** because all modules depend on the same version.
* It contains the mappings copy library resources (js, css, img... files) from the **node_modules** folder to **wwwroot/libs** folder. See the *Mapping The Library Resources* section for more.
* It contains the mappings copy library resources (js, css, img... files) from the `node_modules` folder to `wwwroot/libs` folder. See the *Mapping The Library Resources* section for more.
Depending on a standard package is easy. Just add it to your **package.json** file like you normally do. Example:
@ -57,7 +57,7 @@ See current standard packages for examples.
### Mapping The Library Resources
Using NPM packages and NPM/Yarn tool is the de facto standard for client side libraries. NPM/Yarn tool creates a **node_modules** folder in the root folder of your web project.
Using NPM packages and NPM/Yarn tool is the de facto standard for client side libraries. NPM/Yarn tool creates a **node_modules** folder in the root folder of your web project.
Next challenge is copying needed resources (js, css, img... files) from the `node_modules` into a folder inside the **wwwroot** folder to make it accessible to the clients/browsers.
@ -108,7 +108,7 @@ Once you properly configure the `abp.resourcemapping.js` file, you can run the f
abp install-libs
````
When you run this command, all packages will copy their own resources into the **wwwroot/libs** folder. Running `abp install-libs` is only necessary if you make a change in your dependencies in the **package.json** file.
When you run this command, all packages will copy their own resources into the `wwwroot/libs` folder. Running `abp install-libs` is only necessary if you make a change in your dependencies in the **package.json** file.
#### See Also

1
docs/en/UI/AspNetCore/JavaScript-API/Auth.md

@ -20,5 +20,4 @@ if (abp.auth.isGranted('DeleteUsers')) {
* ` abp.auth.isAnyGranted(...)`: Gets one or more permission/policy names and returns `true` if at least one of them has granted.
* `abp.auth.areAllGranted(...)`: Gets one or more permission/policy names and returns `true` if all of them of them have granted.
* `abp.auth.policies`: This is an object where its keys are the permission/policy names. You can find all permission/policy names here.
* `abp.auth.grantedPolicies`: This is an object where its keys are the permission/policy names. You can find the granted permission/policy names here.

5
docs/en/UI/AspNetCore/JavaScript-API/DOM.md

@ -61,7 +61,7 @@ Script initializer (`abp.dom.initializers.initializeScript`) can execute a JavaS
Assume that you've a container to load the element inside:
````html
<div id="LazyComponent"></div>
<div id="LazyComponent"></div>
````
And this is the component that will be loaded via AJAX from the server and inserted into the container:
@ -113,5 +113,4 @@ The following Bootstrap components and libraries are automatically initialized w
* Tooltip
* Popover
* Timeage
* Timeago

BIN
docs/en/images/angular-footer.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
docs/en/images/generated-static-client-proxies-with-contracts.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
docs/en/images/generated-static-client-proxies-without-contracts.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
docs/en/images/generated-static-client-proxies.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

1
docs/zh-Hans/CLI.md

@ -409,6 +409,7 @@ abp login <username> # Allows you to enter your
abp login <username> -p <password> # Specify the password as a parameter (password is visible)
abp login <username> --organization <organization> # If you have multiple organizations, you need set your active organization
abp login <username> -p <password> -o <organization> # You can enter both your password and organization in the same command
abp login <username> --device # Use device login flow
```
> 当使用-p参数,请注意,因为你的密码是可见的. 它对于CI / CD自动化管道很有用.

2
docs/zh-Hans/Getting-Started-Setup-Environment.md

@ -21,7 +21,7 @@
* 一个集成开发环境 (比如: [Visual Studio](https://visualstudio.microsoft.com/vs/)) 它需要支持 [.NET 6.0+](https://dotnet.microsoft.com/download/dotnet) 的开发.
{{ if UI != "Blazor" }}
* [Node v12 或 v14](https://nodejs.org/)
* [Node v16 或 v18](https://nodejs.org/)
* [Yarn v1.20+ (不是v2)](https://classic.yarnpkg.com/en/docs/install) <sup id="a-yarn">[1](#f-yarn)</sup> 或 npm v6+ (已跟随Node一起安装)
{{ end }}
{{ if Tiered == "Yes" }}

111
docs/zh-Hans/SMS-Sending.md

@ -0,0 +1,111 @@
# 短信发送
ABP 框架提供一个用于发送短信的抽象, 有如下优点:
- 在不改变应用程序代码的情况下, 你可以**非常容易地切换**短信发送提供者(提供商).
- 如果你想创建可重用的应用程序模块, 则不需要假设短信是如何发送的.
## 安装
建议你使用[ABP CLI](CLI.md)来安装这个包.
### 使用Abp CLI
在项目所在目录(.csproj 文件所在目录)打开命令行工具, 输入如下命令:
```bash
abp add-package Volo.Abp.Sms
```
### 手动安装
如果你想要手动安装;
1. 添加 [Volo.Abp.Sms](https://www.nuget.org/packages/Volo.Abp.Sms) NuGet 包到你的项目中:
```
Install-Package Volo.Abp.Sms
```
2. 在你的模块的依赖列表中添加对模块`AbpSmsModule`的依赖:
```csharp
[DependsOn(
//...其它依赖
typeof(AbpSmsModule) //添加新模块的依赖
)]
public class YourModule : AbpModule
{
}
```
## 发送短信
[注入](Dependency-Injection.md) `ISmsSender`, 并使用`SendAsync`方法来发送短信.
**例子:**
```csharp
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Sms;
namespace MyProject
{
public class MyService : ITransientDependency
{
private readonly ISmsSender _smsSender;
public MyService(ISmsSender smsSender)
{
_smsSender = smsSender;
}
public async Task DoItAsync()
{
await _smsSender.SendAsync(
"+012345678901", // 目标手机号
"This is test sms..." // 消息内容
);
}
}
}
```
示例中给定的`SendAsync`方法是一个扩展方法, 用于发送带有基本参数的短信.此外, 你也可以传入一个有如下属性的`SmsMessage`对象:
- `PhoneNumber` (`string`):目标手机号
- `Text` (`string`):短信消息内容
- `Properties` (`Dictionary<string, string>`):用于传入自定义参数的键值对
## NullSmsSender
`NullSmsSender`是`ISmsSender`的一个默认实现.它写入内容到[日志](Logging.md)中, 而不是真正地发送短信.
开发时, 你不想真正地发送短信时, 这个类是非常有用的.**然而, 若你想真实发送短信, 你需要在你的应用程序代码中实现`ISmsSender`接口.**
## 实现ISmsSender接口
通过创建一个实现`ISmsSender`接口的类, 你可以很容易创建你自己的短信发送实现, 如下所示:
```csharp
using System.IO;
using System.Threading.Tasks;
using Volo.Abp.Sms;
using Volo.Abp.DependencyInjection;
namespace AbpDemo
{
public class MyCustomSmsSender : ISmsSender, ITransientDependency
{
public async Task SendAsync(SmsMessage smsMessage)
{
// 发送短信
}
}
}
```
## More
[ABP Commercial](https://commercial.abp.io/)提供Twilio的集成包, 用于使用[Twilio service](https://docs.abp.io/en/commercial/latest/modules/twilio-sms)来发送短信.

2
docs/zh-Hans/Tutorials/Todo/Index.md

@ -26,7 +26,7 @@
{{if UI=="NG"}}
* [Node v14.x](https://nodejs.org/)
* [Node v16.x](https://nodejs.org/)
{{end}}

28
framework/Volo.Abp.sln

@ -409,6 +409,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.RemoteServices", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.PlugIn", "test\Volo.Abp.AspNetCore.Mvc.PlugIn\Volo.Abp.AspNetCore.Mvc.PlugIn.csproj", "{C6D6D878-208A-4FD2-822E-365545D8681B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Newtonsoft", "src\Volo.Abp.Json.Newtonsoft\Volo.Abp.Json.Newtonsoft.csproj", "{9DD41C8F-0886-483C-B98B-C55EAA7F226D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.SystemTextJson", "src\Volo.Abp.Json.SystemTextJson\Volo.Abp.Json.SystemTextJson.csproj", "{0AD06E14-CBFE-4551-8D18-9E921D8F2A87}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Abstractions", "src\Volo.Abp.Json.Abstractions\Volo.Abp.Json.Abstractions.csproj", "{08531C5D-0436-4721-986D-96446CF54316}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.NewtonsoftJson", "src\Volo.Abp.AspNetCore.Mvc.NewtonsoftJson\Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj", "{0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Dapr", "src\Volo.Abp.Dapr\Volo.Abp.Dapr.csproj", "{192A829F-D608-4E41-8DE0-058E943E453F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EventBus.Dapr", "src\Volo.Abp.EventBus.Dapr\Volo.Abp.EventBus.Dapr.csproj", "{DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}"
@ -1231,6 +1239,22 @@ Global
{C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C6D6D878-208A-4FD2-822E-365545D8681B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C6D6D878-208A-4FD2-822E-365545D8681B}.Release|Any CPU.Build.0 = Release|Any CPU
{9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Release|Any CPU.Build.0 = Release|Any CPU
{0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Release|Any CPU.Build.0 = Release|Any CPU
{08531C5D-0436-4721-986D-96446CF54316}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{08531C5D-0436-4721-986D-96446CF54316}.Debug|Any CPU.Build.0 = Debug|Any CPU
{08531C5D-0436-4721-986D-96446CF54316}.Release|Any CPU.ActiveCfg = Release|Any CPU
{08531C5D-0436-4721-986D-96446CF54316}.Release|Any CPU.Build.0 = Release|Any CPU
{0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Release|Any CPU.Build.0 = Release|Any CPU
{192A829F-D608-4E41-8DE0-058E943E453F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{192A829F-D608-4E41-8DE0-058E943E453F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{192A829F-D608-4E41-8DE0-058E943E453F}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -1461,6 +1485,10 @@ Global
{3683340D-92F5-4B14-B77B-34A163333309} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{EDFFDA74-090D-439C-A58D-06CCF86D4423} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{C6D6D878-208A-4FD2-822E-365545D8681B} = {447C8A77-E5F0-4538-8687-7383196D04EA}
{9DD41C8F-0886-483C-B98B-C55EAA7F226D} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{0AD06E14-CBFE-4551-8D18-9E921D8F2A87} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{08531C5D-0436-4721-986D-96446CF54316} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{192A829F-D608-4E41-8DE0-058E943E453F} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{DCC41E99-EBC7-4F19-BA0D-A6F770D8E431} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{18B796D2-D45D-41AE-9A42-75C9B14B20DF} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}

2
framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Authentication.JwtBearer</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Authentication.JwtBearer</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

2
framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<AssemblyName>Volo.Abp.AspNetCore.Authentication.OAuth</AssemblyName>
<PackageId>Volo.Abp.AspNetCore.Authentication.OAuth</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

2
framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<RootNamespace />
</PropertyGroup>

2
framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile>

2
framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<IsPackable>true</IsPackable>
<OutputType>Library</OutputType>
<NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save