Browse Source

Merge branch 'dev' into cmskit-page-rework

pull/17642/head
Enis Necipoglu 3 years ago
parent
commit
60f6c3bd4f
No known key found for this signature in database GPG Key ID: 1EC55E13241E1680
  1. 40
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
  2. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json
  3. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json
  4. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json
  5. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  6. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json
  7. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json
  8. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json
  9. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json
  10. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json
  11. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json
  12. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json
  13. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json
  14. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json
  15. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json
  16. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json
  17. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json
  18. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json
  19. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json
  20. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
  21. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json
  22. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
  23. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json
  24. 30
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
  25. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/en.json
  26. 236
      docs/en/Community-Articles/2023-09-20-Moving-Background-Job-Execution-To-A-Separate-Application/POST.md
  27. BIN
      docs/en/Community-Articles/2023-09-20-Moving-Background-Job-Execution-To-A-Separate-Application/images/1.png
  28. BIN
      docs/en/Community-Articles/2023-09-20-Moving-Background-Job-Execution-To-A-Separate-Application/images/2.png
  29. BIN
      docs/en/Community-Articles/2023-09-20-Moving-Background-Job-Execution-To-A-Separate-Application/images/solution.png
  30. 12
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Zxcvbn/ZxcvbnScriptContributor.cs
  31. 1
      framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs
  32. 4
      framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpWebApplicationFactoryIntegratedTest.cs
  33. 1
      framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj
  34. 46
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  35. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs
  36. 10
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs
  37. 3
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs
  38. 15
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs
  39. 17
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs
  40. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceServiceTemplateBase.cs
  41. 3
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs
  42. 3
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Module/ModuleTemplateBase.cs
  43. 5
      framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs
  44. 1
      framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/AbpFluentValidationConventionalRegistrar.cs
  45. 16
      framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/JQuery/JQueryProxyScriptGenerator.cs
  46. 11
      framework/test/Volo.Abp.FluentValidation.Tests/Volo/Abp/FluentValidation/ApplicationService_FluentValidation_Tests.cs
  47. 21
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js
  48. 21
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js
  49. 8
      modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/DefaultContentDto.cs
  50. 8
      modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContent.cs
  51. 4
      modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewViewComponent.cs
  52. 7
      modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/Default.cshtml
  53. 2
      modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml
  54. 3
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogConsts.cs
  55. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/BlogPostScrollIndexFeature.cs
  56. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json
  57. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json
  58. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json
  59. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json
  60. 451
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json
  61. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json
  62. 3
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json
  63. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json
  64. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json
  65. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json
  66. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json
  67. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json
  68. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json
  69. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json
  70. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json
  71. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json
  72. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json
  73. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json
  74. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json
  75. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json
  76. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json
  77. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json
  78. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json
  79. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json
  80. 15
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/DefaultBlogFeatureProvider.cs
  81. 2
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml
  82. 24
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml
  83. 4
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs
  84. 23
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml
  85. 2
      npm/ng-packs/package.json
  86. 5
      npm/ng-packs/packages/generators/generators.json
  87. 20
      npm/ng-packs/packages/generators/src/generators/change-theme/generator.spec.ts
  88. 26
      npm/ng-packs/packages/generators/src/generators/change-theme/generator.ts
  89. 3
      npm/ng-packs/packages/generators/src/generators/change-theme/index.ts
  90. 5
      npm/ng-packs/packages/generators/src/generators/change-theme/schema.d.ts
  91. 41
      npm/ng-packs/packages/generators/src/generators/change-theme/schema.json
  92. 8
      npm/ng-packs/packages/generators/src/generators/change-theme/theme-options.enum.ts
  93. 4
      npm/ng-packs/packages/generators/src/index.ts
  94. 156
      npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts
  95. 51
      npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts
  96. 1
      npm/ng-packs/packages/schematics/src/utils/angular/ast-utils.ts
  97. 129
      npm/packs/zxcvbn/README.md
  98. 5
      npm/packs/zxcvbn/abp.resourcemapping.js
  99. 32
      npm/packs/zxcvbn/package.json
  100. 2
      templates/app-nolayers/angular/package.json

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

@ -493,6 +493,44 @@
"QuotationTemplate.Tax/VAT:": "Tax / Vat (%{0}) :", "QuotationTemplate.Tax/VAT:": "Tax / Vat (%{0}) :",
"QuotationTemplate.TotalDiscount:": "Total Discount :", "QuotationTemplate.TotalDiscount:": "Total Discount :",
"QuotationTemplate.TOTALDUE:": "TOTAL DUE :", "QuotationTemplate.TOTALDUE:": "TOTAL DUE :",
"QuotationTemplate.BankAccount": "Our bank account information can be found at {0}" "QuotationTemplate.BankAccount": "Our bank account information can be found at {0}",
"Permission:Raffles": "Raffle",
"Permission:Draw": "Draw",
"Menu:Raffles": "Raffles",
"RaffleIsNotDrawable": "Raffle is not drawable",
"WinnerCountMustBeGreaterThanZero": "Winner count must be greater than zero",
"FullDescription": "Full Description",
"VisibilityStartDate": "Visibility Start Date",
"VisibilityEndDate": "Visibility End Date",
"RaffleDate": "Raffle Date",
"SubscriptionCode": "Subscription Code",
"GroupCode": "Group Code",
"MaxWinnerCount": "Max Winner Count",
"ReDraw": "Re-Draw",
"EditRaffle": "Edit Raffle",
"Raffles": "Raffles",
"CreateARaffle": "Create a raffle",
"Draw": "Draw",
"Enum:RaffleStatus:0": "Active",
"Enum:RaffleStatus:1": "Next",
"Enum:RaffleStatus:2": "Past",
"DrawDone": "Draw Done",
"HomePageShowType": "Home Page Show Type",
"None": "None",
"Card": "Card",
"Horizontal": "Horizontal",
"Winners": "Winners",
"StartDateMustBeLessThanEndDate": "Start date must be less than end date",
"VisibilityStartDateMustBeLessThanVisibilityEndDate": "Visibility start date must be less than visibility end date",
"StartDateMustBeGreaterThanVisibilityStartDate": "Start date must be greater than visibility start date",
"EndDateMustBeLessThanVisibilityEndDate": "End date must be less than visibility end date",
"DrawnDone": "Drawn Done",
"AddColor": "Add Color",
"Colors": "Colors",
"RemoveColor": "Remove Color",
"MaxColorCountWarning": "You can add up to {0} colors",
"MinColorCountWarning": "You must add at least {0} colors",
"RaffleDeletionConfirmationMessage": "Are you sure you want to delete this raffle?",
"CreateRaffle": "Create Raffle"
} }
} }

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\"> نظام أساسي كامل لتطوير الويب </ span> <span class=\"second-line\"> </ span> <span class=\"third-line\"> مدمج <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> framework </span>", "IndexPageHeroSection": "<span class=\"first-line\"> نظام أساسي كامل لتطوير الويب </ span> <span class=\"second-line\"> </ span> <span class=\"third-line\"> مدمج <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> framework </span>",
"AbpCommercialShortDescription": "يوفر ABP Commercial وحدات تطبيق مسبقة الإنشاء وأدوات تطوير سريعة للتطبيقات وموضوعات واجهة مستخدم احترافية ودعمًا متميزًا والمزيد.", "AbpCommercialShortDescription": "يوفر ABP Commercial وحدات تطبيق مسبقة الإنشاء وأدوات تطوير سريعة للتطبيقات وموضوعات واجهة مستخدم احترافية ودعمًا متميزًا والمزيد.",
"LiveDemo": "عرض حي", "LiveDemo": "عرض حي",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> باستخدام حساب ABP الخاص بك، <a href=\"{2}\">{3}</a>إلى abp.io.<br/>أو املأ النموذج أدناه لإنشاء عرض توضيحي مباشر الآن",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "هناك حساب بالفعل باستخدام عنوان البريد الإلكتروني المحدد: <b>{0}</b><br/> يمكنك تسجيل الدخول باستخدام حسابك للمتابعة.",
"GetLicence": "احصل على ترخيص", "GetLicence": "احصل على ترخيص",
"Application": "تطبيق", "Application": "تطبيق",
"StartupTemplates": "قوالب بدء تشغيل ABP", "StartupTemplates": "قوالب بدء تشغيل ABP",
@ -129,12 +131,14 @@
"YourFullName": "اسمك الكامل", "YourFullName": "اسمك الكامل",
"EmailField": "عنوان البريد الإلكتروني", "EmailField": "عنوان البريد الإلكتروني",
"YourEmailAddress": "عنوان بريدك الإلكتروني", "YourEmailAddress": "عنوان بريدك الإلكتروني",
"ValidEmailAddressIsRequired": "مطلوب عنوان بريد إلكتروني صالح.",
"HowMayWeHelpYou": "كيف يمكن أن نساعدك؟", "HowMayWeHelpYou": "كيف يمكن أن نساعدك؟",
"SendMessage": "أرسل رسالة", "SendMessage": "أرسل رسالة",
"Success": "النجاح", "Success": "النجاح",
"WeWillReplyYou": "لقد تلقينا رسالتك وسنتواصل معك قريبًا.", "WeWillReplyYou": "لقد تلقينا رسالتك وسنتواصل معك قريبًا.",
"GoHome": "اذهب للمنزل", "GoHome": "اذهب للمنزل",
"CreateLiveDemo": "إنشاء عرض حي", "CreateLiveDemo": "إنشاء عرض حي",
"CreateLiveDemoDescription": "بمجرد إرسال هذا النموذج ، ستتلقى رسالة بريد إلكتروني تحتوي على رابط العرض التوضيحي الخاص بك.",
"RegisterToTheNewsletter": "سجل في النشرة الإخبارية لتلقي معلومات بخصوص ABP.IO ، بما في ذلك الإصدارات الجديدة وما إلى ذلك.", "RegisterToTheNewsletter": "سجل في النشرة الإخبارية لتلقي معلومات بخصوص ABP.IO ، بما في ذلك الإصدارات الجديدة وما إلى ذلك.",
"EnterYourEmailOrLogin": "أدخل عنوان بريدك الإلكتروني لإنشاء العرض التوضيحي أو <a href=\"{0}\"> تسجيل الدخول </a> باستخدام حسابك الحالي.", "EnterYourEmailOrLogin": "أدخل عنوان بريدك الإلكتروني لإنشاء العرض التوضيحي أو <a href=\"{0}\"> تسجيل الدخول </a> باستخدام حسابك الحالي.",
"ApplicationTemplate": "نموذج التطبيق", "ApplicationTemplate": "نموذج التطبيق",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">Kompletní</span><span class=\"second-line\"> platforma pro vývoj webu</span><span class=\"third-line\">vestavěná na <img src= \"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>", "IndexPageHeroSection": "<span class=\"first-line\">Kompletní</span><span class=\"second-line\"> platforma pro vývoj webu</span><span class=\"third-line\">vestavěná na <img src= \"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>",
"AbpCommercialShortDescription": "ABP Commercial poskytuje předpřipravené aplikační moduly, nástroje pro rychlý vývoj aplikací, profesionální témata uživatelského rozhraní, prémiovou podporu a další.", "AbpCommercialShortDescription": "ABP Commercial poskytuje předpřipravené aplikační moduly, nástroje pro rychlý vývoj aplikací, profesionální témata uživatelského rozhraní, prémiovou podporu a další.",
"LiveDemo": "Živá ukázka", "LiveDemo": "Živá ukázka",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> pomocí vašeho účtu ABP, <a href=\"{2}\">{3}</a> na abp.io.<br/>Nebo vyplňte níže uvedený formulář a vytvořte si nyní živou ukázku",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Zadaná e-mailová adresa <b>{0}</b> je již registrována.<br/> Můžete se přihlásit se svým účtem a pokračovat.",
"GetLicence": "Získejte licenci", "GetLicence": "Získejte licenci",
"Application": "aplikace", "Application": "aplikace",
"StartupTemplates": "Spouštěcí šablony", "StartupTemplates": "Spouštěcí šablony",
@ -129,12 +131,14 @@
"YourFullName": "Vaše celé jméno", "YourFullName": "Vaše celé jméno",
"EmailField": "Emailová adresa", "EmailField": "Emailová adresa",
"YourEmailAddress": "Vaše emailová adresa", "YourEmailAddress": "Vaše emailová adresa",
"ValidEmailAddressIsRequired": "Je vyžadována platná e-mailová adresa.",
"HowMayWeHelpYou": "Jak vám můžeme pomoci?", "HowMayWeHelpYou": "Jak vám můžeme pomoci?",
"SendMessage": "Poslat zprávu", "SendMessage": "Poslat zprávu",
"Success": "Úspěch", "Success": "Úspěch",
"WeWillReplyYou": "Obdrželi jsme vaši zprávu a brzy se vám ozveme.", "WeWillReplyYou": "Obdrželi jsme vaši zprávu a brzy se vám ozveme.",
"GoHome": "Jdi domů", "GoHome": "Jdi domů",
"CreateLiveDemo": "Vytvořit živé demo", "CreateLiveDemo": "Vytvořit živé demo",
"CreateLiveDemoDescription": "Po odeslání tohoto formuláře obdržíte e-mail obsahující odkaz na vaši ukázku.",
"RegisterToTheNewsletter": "Zaregistrujte se k odběru newsletteru a získejte informace o ABP.IO, včetně nových verzí atd.", "RegisterToTheNewsletter": "Zaregistrujte se k odběru newsletteru a získejte informace o ABP.IO, včetně nových verzí atd.",
"EnterYourEmailOrLogin": "Chcete-li vytvořit ukázku, zadejte svou e-mailovou adresu nebo se <a href=\"{0}\">přihlaste</a> pomocí svého stávajícího účtu.", "EnterYourEmailOrLogin": "Chcete-li vytvořit ukázku, zadejte svou e-mailovou adresu nebo se <a href=\"{0}\">přihlaste</a> pomocí svého stávajícího účtu.",
"ApplicationTemplate": "Šablona aplikace", "ApplicationTemplate": "Šablona aplikace",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">Eine komplette</span><span class=\"second-line\"> Webentwicklungsplattform</span><span class=\"third-line\">aufgebaute <img src= \"{0}\" width=\"110\" class=\"ml-1\" /> Framework</span>", "IndexPageHeroSection": "<span class=\"first-line\">Eine komplette</span><span class=\"second-line\"> Webentwicklungsplattform</span><span class=\"third-line\">aufgebaute <img src= \"{0}\" width=\"110\" class=\"ml-1\" /> Framework</span>",
"AbpCommercialShortDescription": "ABP Commercial bietet vorgefertigte Anwendungsmodule, schnelle Anwendungsentwicklungstools, professionelle UI-Themen, Premium-Support und mehr.", "AbpCommercialShortDescription": "ABP Commercial bietet vorgefertigte Anwendungsmodule, schnelle Anwendungsentwicklungstools, professionelle UI-Themen, Premium-Support und mehr.",
"LiveDemo": "Live-Demo", "LiveDemo": "Live-Demo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> mit Ihrem ABP-Konto, <a href=\"{2}\">{3}</a> zu abp.io.<br/>Oder füllen Sie das Formular unten aus, um jetzt eine Live-Demo zu erstellen",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Es gibt bereits ein Konto mit der angegebenen E-Mail-Adresse: <b>{0}</b><br/> Sie können sich mit Ihrem Konto anmelden, um fortzufahren.",
"GetLicence": "Holen Sie sich eine Lizenz", "GetLicence": "Holen Sie sich eine Lizenz",
"Application": "Anwendung", "Application": "Anwendung",
"StartupTemplates": "Startup-Vorlagen", "StartupTemplates": "Startup-Vorlagen",
@ -129,12 +131,14 @@
"YourFullName": "Ihren vollständigen Namen", "YourFullName": "Ihren vollständigen Namen",
"EmailField": "E-Mail-Addresse", "EmailField": "E-Mail-Addresse",
"YourEmailAddress": "Ihre E-Mail-Adresse", "YourEmailAddress": "Ihre E-Mail-Adresse",
"ValidEmailAddressIsRequired": "Eine gültige E-Mail-Adresse ist erforderlich.",
"HowMayWeHelpYou": "Wie können wir Ihnen helfen?", "HowMayWeHelpYou": "Wie können wir Ihnen helfen?",
"SendMessage": "Nachricht senden", "SendMessage": "Nachricht senden",
"Success": "Erfolg", "Success": "Erfolg",
"WeWillReplyYou": "Wir haben Ihre Nachricht erhalten und werden uns in Kürze bei Ihnen melden.", "WeWillReplyYou": "Wir haben Ihre Nachricht erhalten und werden uns in Kürze bei Ihnen melden.",
"GoHome": "Nach Hause gehen", "GoHome": "Nach Hause gehen",
"CreateLiveDemo": "Live-Demo erstellen", "CreateLiveDemo": "Live-Demo erstellen",
"CreateLiveDemoDescription": "Sobald Sie dieses Formular absenden, erhalten Sie eine E-Mail mit Ihrem Demo-Link.",
"RegisterToTheNewsletter": "Melden Sie sich für den Newsletter an, um Informationen zu ABP.IO, einschließlich Neuerscheinungen etc. zu erhalten.", "RegisterToTheNewsletter": "Melden Sie sich für den Newsletter an, um Informationen zu ABP.IO, einschließlich Neuerscheinungen etc. zu erhalten.",
"EnterYourEmailOrLogin": "Geben Sie Ihre E-Mail-Adresse ein, um Ihre Demo zu erstellen, oder <a href=\"{0}\">Login</a> mit Ihrem bestehenden Konto.", "EnterYourEmailOrLogin": "Geben Sie Ihre E-Mail-Adresse ein, um Ihre Demo zu erstellen, oder <a href=\"{0}\">Login</a> mit Ihrem bestehenden Konto.",
"ApplicationTemplate": "Bewerbungsvorlage", "ApplicationTemplate": "Bewerbungsvorlage",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json

@ -49,6 +49,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">A complete</span><span class=\"second-line\"> web development platform</span><span class=\"third-line\">built-on <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>", "IndexPageHeroSection": "<span class=\"first-line\">A complete</span><span class=\"second-line\"> web development platform</span><span class=\"third-line\">built-on <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>",
"AbpCommercialShortDescription": "ABP Commercial provides pre-built application modules, rapid application development tooling, professional UI themes, premium support and more.", "AbpCommercialShortDescription": "ABP Commercial provides pre-built application modules, rapid application development tooling, professional UI themes, premium support and more.",
"LiveDemo": "Live Demo", "LiveDemo": "Live Demo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> using your ABP account, <a href=\"{2}\">{3}</a> to abp.io.<br/>Or fill the form below to create a live demo now",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "There is already an account with the given email address: <b>{0}</b><br/> You can login with your account to proceed.",
"GetLicence": "Get a License", "GetLicence": "Get a License",
"Application": "Application", "Application": "Application",
"StartupTemplates": "Startup Templates", "StartupTemplates": "Startup Templates",
@ -132,12 +134,14 @@
"LastNameField": "Last Name", "LastNameField": "Last Name",
"EmailField": "E-mail Address", "EmailField": "E-mail Address",
"YourEmailAddress": "Your e-mail address", "YourEmailAddress": "Your e-mail address",
"ValidEmailAddressIsRequired": "A valid e-mail address is required.",
"HowMayWeHelpYou": "How may we help you?", "HowMayWeHelpYou": "How may we help you?",
"SendMessage": "Send Message", "SendMessage": "Send Message",
"Success": "Success", "Success": "Success",
"WeWillReplyYou": "We received your message and will be in touch shortly.", "WeWillReplyYou": "We received your message and will be in touch shortly.",
"GoHome": "Go Home", "GoHome": "Go Home",
"CreateLiveDemo": "Create Live Demo", "CreateLiveDemo": "Create Live Demo",
"CreateLiveDemoDescription": "Once you submit this form, you will receive an email containing your demo link.",
"RegisterToTheNewsletter": "Register for the newsletter to receive information regarding ABP.IO, including new releases etc.", "RegisterToTheNewsletter": "Register for the newsletter to receive information regarding ABP.IO, including new releases etc.",
"EnterYourEmailOrLogin": "Enter your e-mail address to create your demo or <a href=\"{0}\">Login</a> using your existing account.", "EnterYourEmailOrLogin": "Enter your e-mail address to create your demo or <a href=\"{0}\">Login</a> using your existing account.",
"ApplicationTemplate": "Application Template", "ApplicationTemplate": "Application Template",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\"> Una </span> <span class=\"second-line\"> plataforma de desarrollo web completa </span> <span class=\"third-line\"> integrada <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> marco </span>", "IndexPageHeroSection": "<span class=\"first-line\"> Una </span> <span class=\"second-line\"> plataforma de desarrollo web completa </span> <span class=\"third-line\"> integrada <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> marco </span>",
"AbpCommercialShortDescription": "ABP Commercial proporciona módulos de aplicaciones prediseñados, herramientas de desarrollo rápido de aplicaciones, temas de interfaz de usuario profesionales, soporte premium y más.", "AbpCommercialShortDescription": "ABP Commercial proporciona módulos de aplicaciones prediseñados, herramientas de desarrollo rápido de aplicaciones, temas de interfaz de usuario profesionales, soporte premium y más.",
"LiveDemo": "Demo en vivo", "LiveDemo": "Demo en vivo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> usando su cuenta ABP, <a href=\"{2}\">{3}</a> a abp.io.<br/>O complete el siguiente formulario para crear una demostración en vivo ahora",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Ya existe una cuenta con la dirección de correo electrónico especificada: <b>{0}</b><br/> Puede iniciar sesión con su cuenta para continuar.",
"GetLicence": "Obtener una licencia", "GetLicence": "Obtener una licencia",
"Application": "Solicitud", "Application": "Solicitud",
"StartupTemplates": "Plantillas de inicio", "StartupTemplates": "Plantillas de inicio",
@ -129,12 +131,14 @@
"YourFullName": "Tu nombre completo", "YourFullName": "Tu nombre completo",
"EmailField": "Dirección de correo electrónico", "EmailField": "Dirección de correo electrónico",
"YourEmailAddress": "Tu correo electrónico", "YourEmailAddress": "Tu correo electrónico",
"ValidEmailAddressIsRequired": "Se requiere una dirección de correo electrónico válida.",
"HowMayWeHelpYou": "¿Cómo podemos ayudarle?", "HowMayWeHelpYou": "¿Cómo podemos ayudarle?",
"SendMessage": "Enviar mensaje", "SendMessage": "Enviar mensaje",
"Success": "Éxito", "Success": "Éxito",
"WeWillReplyYou": "Recibimos su mensaje y nos pondremos en contacto a la brevedad.", "WeWillReplyYou": "Recibimos su mensaje y nos pondremos en contacto a la brevedad.",
"GoHome": "Vete a casa", "GoHome": "Vete a casa",
"CreateLiveDemo": "Crear demostración en vivo", "CreateLiveDemo": "Crear demostración en vivo",
"CreateLiveDemoDescription": "Una vez que envíe este formulario, recibirá un correo electrónico con el enlace de su demostración.",
"RegisterToTheNewsletter": "Regístrese para recibir el boletín informativo para recibir información sobre ABP.IO, incluidos nuevos lanzamientos, etc.", "RegisterToTheNewsletter": "Regístrese para recibir el boletín informativo para recibir información sobre ABP.IO, incluidos nuevos lanzamientos, etc.",
"EnterYourEmailOrLogin": "Ingrese su dirección de correo electrónico para crear su demostración o <a href=\"{0}\"> Iniciar sesión </a> con su cuenta existente.", "EnterYourEmailOrLogin": "Ingrese su dirección de correo electrónico para crear su demostración o <a href=\"{0}\"> Iniciar sesión </a> con su cuenta existente.",
"ApplicationTemplate": "Plantilla de aplicación", "ApplicationTemplate": "Plantilla de aplicación",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json

@ -49,6 +49,8 @@
"IndexPageHeroSection": "<span class=\"first-line\"> Täydellinen </span><span class=\"second-line\"> verkkokehitysympäristö </span><span class=\"third-line\"> sisäänrakennettu <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> kehys </span>", "IndexPageHeroSection": "<span class=\"first-line\"> Täydellinen </span><span class=\"second-line\"> verkkokehitysympäristö </span><span class=\"third-line\"> sisäänrakennettu <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> kehys </span>",
"AbpCommercialShortDescription": "ABP Commercial tarjoaa valmiita sovellusmoduuleja, nopean sovelluskehitystyökalun, ammattimaiset käyttöliittymäteemat, ensiluokkaisen tuen ja paljon muuta.", "AbpCommercialShortDescription": "ABP Commercial tarjoaa valmiita sovellusmoduuleja, nopean sovelluskehitystyökalun, ammattimaiset käyttöliittymäteemat, ensiluokkaisen tuen ja paljon muuta.",
"LiveDemo": "Live-esittely", "LiveDemo": "Live-esittely",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> käyttämällä ABP-tiliäsi, <a href=\"{2}\">{3}</a> abp.io: lle.<br/>Tai täytä alla oleva lomake luodaksesi live-esittelyn nyt",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Sähköpostiosoitteella <b>{0}</b> on jo tili.<br/> Voit kirjautua sisään tilillesi jatkaaksesi.",
"GetLicence": "Hanki lisenssi", "GetLicence": "Hanki lisenssi",
"Application": "Sovellus", "Application": "Sovellus",
"StartupTemplates": "Käynnistysmallit", "StartupTemplates": "Käynnistysmallit",
@ -132,12 +134,14 @@
"LastNameField": "Sukunimi", "LastNameField": "Sukunimi",
"EmailField": "Sähköpostiosoite", "EmailField": "Sähköpostiosoite",
"YourEmailAddress": "Sähköpostiosoitteesi", "YourEmailAddress": "Sähköpostiosoitteesi",
"ValidEmailAddressIsRequired": "Kelvollinen sähköpostiosoite vaaditaan",
"HowMayWeHelpYou": "Kuinka voimme auttaa sinua?", "HowMayWeHelpYou": "Kuinka voimme auttaa sinua?",
"SendMessage": "Lähetä viesti", "SendMessage": "Lähetä viesti",
"Success": "Menestys", "Success": "Menestys",
"WeWillReplyYou": "Saimme viestisi ja otamme sinuun pian yhteyttä.", "WeWillReplyYou": "Saimme viestisi ja otamme sinuun pian yhteyttä.",
"GoHome": "Mene kotiin", "GoHome": "Mene kotiin",
"CreateLiveDemo": "Luo live-esittely", "CreateLiveDemo": "Luo live-esittely",
"CreateLiveDemoDescription": "Kun lähetät tämän lomakkeen, saat sähköpostin, jossa on linkki demoosi.",
"RegisterToTheNewsletter": "Rekisteröidy uutiskirjeeseen saadaksesi tietoa ABP.IO: sta, mukaan lukien uudet julkaisut jne.", "RegisterToTheNewsletter": "Rekisteröidy uutiskirjeeseen saadaksesi tietoa ABP.IO: sta, mukaan lukien uudet julkaisut jne.",
"EnterYourEmailOrLogin": "Kirjoita sähköpostiosoitteesi luodaksesi esittely tai <a href=\"{0}\"> kirjaudu sisään </a> nykyisellä tililläsi.", "EnterYourEmailOrLogin": "Kirjoita sähköpostiosoitteesi luodaksesi esittely tai <a href=\"{0}\"> kirjaudu sisään </a> nykyisellä tililläsi.",
"ApplicationTemplate": "Sovelluksen malli", "ApplicationTemplate": "Sovelluksen malli",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">Une plate-forme de développement Web</span><span class=\"second-line\"> complète </span><span class=\"third-line\"> intégrée <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> cadre </span>", "IndexPageHeroSection": "<span class=\"first-line\">Une plate-forme de développement Web</span><span class=\"second-line\"> complète </span><span class=\"third-line\"> intégrée <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> cadre </span>",
"AbpCommercialShortDescription": "ABP Commercial fournit des modules d'application prédéfinis, des outils de développement rapide d'applications, des thèmes d'interface utilisateur professionnels, un support premium et plus encore.", "AbpCommercialShortDescription": "ABP Commercial fournit des modules d'application prédéfinis, des outils de développement rapide d'applications, des thèmes d'interface utilisateur professionnels, un support premium et plus encore.",
"LiveDemo": "Démo en direct", "LiveDemo": "Démo en direct",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> en utilisant votre compte ABP, <a href=\"{2}\">{3}</a> à abp.io.<br/>Ou remplissez le formulaire ci-dessous pour créer une démo en direct maintenant",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Il existe déjà un compte avec l'adresse e-mail fournie: <b>{0}</b><br/> Vous pouvez vous connecter avec votre compte pour continuer.",
"GetLicence": "Obtenez une licence", "GetLicence": "Obtenez une licence",
"Application": "Application", "Application": "Application",
"StartupTemplates": "Modèles de démarrage", "StartupTemplates": "Modèles de démarrage",
@ -129,12 +131,14 @@
"YourFullName": "Votre nom complet", "YourFullName": "Votre nom complet",
"EmailField": "Adresse e-mail", "EmailField": "Adresse e-mail",
"YourEmailAddress": "Votre adresse email", "YourEmailAddress": "Votre adresse email",
"ValidEmailAddressIsRequired": "Une adresse e-mail valide est requise.",
"HowMayWeHelpYou": "Comment pouvons nous vous aider?", "HowMayWeHelpYou": "Comment pouvons nous vous aider?",
"SendMessage": "Envoyer le message", "SendMessage": "Envoyer le message",
"Success": "Succès", "Success": "Succès",
"WeWillReplyYou": "Nous avons reçu votre message et vous contacterons sous peu.", "WeWillReplyYou": "Nous avons reçu votre message et vous contacterons sous peu.",
"GoHome": "Retour à l'acceuil", "GoHome": "Retour à l'acceuil",
"CreateLiveDemo": "Créer une démo en direct", "CreateLiveDemo": "Créer une démo en direct",
"CreateLiveDemoDescription": "Une fois que vous avez soumis ce formulaire, vous recevrez un e-mail contenant le lien de votre démo.",
"RegisterToTheNewsletter": "Inscrivez-vous à la newsletter pour recevoir des informations concernant ABP.IO, y compris les nouvelles versions, etc.", "RegisterToTheNewsletter": "Inscrivez-vous à la newsletter pour recevoir des informations concernant ABP.IO, y compris les nouvelles versions, etc.",
"EnterYourEmailOrLogin": "Saisissez votre adresse e-mail pour créer votre démo ou <a href=\"{0}\"> Connectez-vous </a> à l'aide de votre compte existant.", "EnterYourEmailOrLogin": "Saisissez votre adresse e-mail pour créer votre démo ou <a href=\"{0}\"> Connectez-vous </a> à l'aide de votre compte existant.",
"ApplicationTemplate": "Modèle d'application", "ApplicationTemplate": "Modèle d'application",

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

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">एक पूर्ण</span><span class=\"second-line\"> वेब डेवलपमेंट प्लेटफॉर्म</span><span class=\"third-line\">बिल्ट-ऑन <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> Framework</span>", "IndexPageHeroSection": "<span class=\"first-line\">एक पूर्ण</span><span class=\"second-line\"> वेब डेवलपमेंट प्लेटफॉर्म</span><span class=\"third-line\">बिल्ट-ऑन <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> Framework</span>",
"AbpCommercialShortDescription": "एबीपी कमर्शियल प्री-बिल्ट एप्लिकेशन मॉड्यूल, रैपिड एप्लिकेशन डेवलपमेंट टूलिंग, पेशेवर यूआई थीम, प्रीमियम सपोर्ट आदि प्रदान करता है।", "AbpCommercialShortDescription": "एबीपी कमर्शियल प्री-बिल्ट एप्लिकेशन मॉड्यूल, रैपिड एप्लिकेशन डेवलपमेंट टूलिंग, पेशेवर यूआई थीम, प्रीमियम सपोर्ट आदि प्रदान करता है।",
"LiveDemo": "लाइव डेमो", "LiveDemo": "लाइव डेमो",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> अपने एबीपी खाते का उपयोग करते हुए, <a href=\"{2}\">{3}</a> abp.io पर आपका स्वागत है। <br/> या अब एक लाइव डेमो बनाने के लिए नीचे दिए गए फॉर्म को भरें",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "दिए गए ईमेल पते <b>{0}</b> के साथ पहले से ही एक खाता है। <br/> आप अपने खाते से लॉगिन करके आगे बढ़ सकते हैं।",
"GetLicence": "एक लाइसेंस प्राप्त करें", "GetLicence": "एक लाइसेंस प्राप्त करें",
"Application": "आवेदन", "Application": "आवेदन",
"StartupTemplates": "स्टार्टअप टेम्पलेट", "StartupTemplates": "स्टार्टअप टेम्पलेट",
@ -129,12 +131,14 @@
"YourFullName": "आपका पूरा नाम", "YourFullName": "आपका पूरा नाम",
"EmailField": "ईमेल पता", "EmailField": "ईमेल पता",
"YourEmailAddress": "आपका ईमेल पता", "YourEmailAddress": "आपका ईमेल पता",
"ValidEmailAddressIsRequired": "एक वैध ईमेल पता आवश्यक है।",
"HowMayWeHelpYou": "हम कैसे आपकी सहायता कर सकते हैं?", "HowMayWeHelpYou": "हम कैसे आपकी सहायता कर सकते हैं?",
"SendMessage": "मेसेज भेजें", "SendMessage": "मेसेज भेजें",
"Success": "सफलता", "Success": "सफलता",
"WeWillReplyYou": "हमें आपका संदेश प्राप्त हुआ और शीघ्र ही संपर्क में आएगा।", "WeWillReplyYou": "हमें आपका संदेश प्राप्त हुआ और शीघ्र ही संपर्क में आएगा।",
"GoHome": "घर जाओ", "GoHome": "घर जाओ",
"CreateLiveDemo": "लाइव डेमो बनाएँ", "CreateLiveDemo": "लाइव डेमो बनाएँ",
"CreateLiveDemoDescription": "एक बार जब आप इस फॉर्म को जमा करते हैं, तो आपको अपने डेमो लिंक को समेत एक ईमेल प्राप्त होगा।",
"RegisterToTheNewsletter": "ABP.IO के बारे में जानकारी प्राप्त करने के लिए न्यूज़लेटर के लिए रजिस्टर करें, जिसमें नई रिलीज़ आदि शामिल हैं।", "RegisterToTheNewsletter": "ABP.IO के बारे में जानकारी प्राप्त करने के लिए न्यूज़लेटर के लिए रजिस्टर करें, जिसमें नई रिलीज़ आदि शामिल हैं।",
"EnterYourEmailOrLogin": "अपना डेमो बनाने के लिए अपना ई-मेल पता दर्ज करें या अपने मौजूदा खाते का उपयोग करके <a href=\"{0}\">लॉगिन करें</a>।", "EnterYourEmailOrLogin": "अपना डेमो बनाने के लिए अपना ई-मेल पता दर्ज करें या अपने मौजूदा खाते का उपयोग करके <a href=\"{0}\">लॉगिन करें</a>।",
"ApplicationTemplate": "एप्लिकेशन टेम्पलेट", "ApplicationTemplate": "एप्लिकेशन टेम्पलेट",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json

@ -49,6 +49,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">Teljes</span><span class=\"second-line\"> webfejlesztői platform</span><span class=\"third-line\">beépített <img src= \"{0}\" width=\"110\" class=\"ml-1\" /> keretrendszer</span>", "IndexPageHeroSection": "<span class=\"first-line\">Teljes</span><span class=\"second-line\"> webfejlesztői platform</span><span class=\"third-line\">beépített <img src= \"{0}\" width=\"110\" class=\"ml-1\" /> keretrendszer</span>",
"AbpCommercialShortDescription": "Az ABP Commercial előre beépített alkalmazásmodulokat, gyors alkalmazásfejlesztési eszközöket, professzionális felhasználói felületi témákat, prémium támogatást és még sok mást kínál.", "AbpCommercialShortDescription": "Az ABP Commercial előre beépített alkalmazásmodulokat, gyors alkalmazásfejlesztési eszközöket, professzionális felhasználói felületi témákat, prémium támogatást és még sok mást kínál.",
"LiveDemo": "Élő Demo", "LiveDemo": "Élő Demo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> az ABP-fiókjával, <a href=\"{2}\">{3}</a> az abp.io-ra.<br/>Vagy töltse ki az alábbi űrlapot, hogy most létrehozzon egy élő bemutatót",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Már van fiók a megadott e-mail címmel: <b>{0}</b><br/> Bejelentkezhet a fiókjával a folytatáshoz.",
"GetLicence": "Szerezzen engedélyt", "GetLicence": "Szerezzen engedélyt",
"Application": "Alkalmazás", "Application": "Alkalmazás",
"StartupTemplates": "Indítási sablonok", "StartupTemplates": "Indítási sablonok",
@ -132,12 +134,14 @@
"LastNameField": "Vezetéknév", "LastNameField": "Vezetéknév",
"EmailField": "Email cím", "EmailField": "Email cím",
"YourEmailAddress": "Az email címed", "YourEmailAddress": "Az email címed",
"ValidEmailAddressIsRequired": "Érvényes e-mail cím szükséges",
"HowMayWeHelpYou": "Hogyan segíthetünk?", "HowMayWeHelpYou": "Hogyan segíthetünk?",
"SendMessage": "Üzenet küldése", "SendMessage": "Üzenet küldése",
"Success": "Siker", "Success": "Siker",
"WeWillReplyYou": "Megkaptuk üzenetét, és hamarosan felvesszük Önnel a kapcsolatot.", "WeWillReplyYou": "Megkaptuk üzenetét, és hamarosan felvesszük Önnel a kapcsolatot.",
"GoHome": "Hazamenni", "GoHome": "Hazamenni",
"CreateLiveDemo": "Élő bemutató létrehozása", "CreateLiveDemo": "Élő bemutató létrehozása",
"CreateLiveDemoDescription": "Miután elküldte ezt a űrlapot, e-mailt kap, amely tartalmazza a bemutató linkjét.",
"RegisterToTheNewsletter": "Regisztráljon a hírlevélre, hogy információkat kapjon az ABP.IO-ról, beleértve az új kiadásokat stb.", "RegisterToTheNewsletter": "Regisztráljon a hírlevélre, hogy információkat kapjon az ABP.IO-ról, beleértve az új kiadásokat stb.",
"EnterYourEmailOrLogin": "Adja meg e-mail címét a bemutató létrehozásához, vagy <a href=\"{0}\">jelentkezzen be</a> meglévő fiókjával.", "EnterYourEmailOrLogin": "Adja meg e-mail címét a bemutató létrehozásához, vagy <a href=\"{0}\">jelentkezzen be</a> meglévő fiókjával.",
"ApplicationTemplate": "Alkalmazássablon", "ApplicationTemplate": "Alkalmazássablon",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">Heilstætt</span><span class=\"second-line\"> vefþróunar umhverfi </span><span class=\"third-line\">byggt á <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> ABP</span>", "IndexPageHeroSection": "<span class=\"first-line\">Heilstætt</span><span class=\"second-line\"> vefþróunar umhverfi </span><span class=\"third-line\">byggt á <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> ABP</span>",
"AbpCommercialShortDescription": "ABP Commercial býður upp á forsmíðaðar forritareiningar, tól sem hraða þróun, fagmanlega hannaðar UI þemur, úrvals stuðning og fleira.", "AbpCommercialShortDescription": "ABP Commercial býður upp á forsmíðaðar forritareiningar, tól sem hraða þróun, fagmanlega hannaðar UI þemur, úrvals stuðning og fleira.",
"LiveDemo": "Virkt sýnidæmi", "LiveDemo": "Virkt sýnidæmi",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> með þínum ABP reikningi, <a href=\"{2}\">{3}</a> til abp.io.<br/>Eða fylltu út formið hér að neðan til að búa til virkt sýnidæmi núna",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Það er nú þegar reikningur með þessu netfangi: <b>{0}</b><br/> Þú getur skráð þig inn með þínum reikningi til að halda áfram.",
"GetLicence": "Sækja Leyfi", "GetLicence": "Sækja Leyfi",
"Application": "Umsókn", "Application": "Umsókn",
"StartupTemplates": "Byrjunar Sniðmát", "StartupTemplates": "Byrjunar Sniðmát",
@ -129,12 +131,14 @@
"YourFullName": "Þitt fulla nafn", "YourFullName": "Þitt fulla nafn",
"EmailField": "Netfang", "EmailField": "Netfang",
"YourEmailAddress": "Netfangið þitt", "YourEmailAddress": "Netfangið þitt",
"ValidEmailAddressIsRequired": "Netfangið þarf að vera gilt.",
"HowMayWeHelpYou": "Hvernig getum við aðstoðað þig?", "HowMayWeHelpYou": "Hvernig getum við aðstoðað þig?",
"SendMessage": "Senda skilaboð", "SendMessage": "Senda skilaboð",
"Success": "Heppnaðist", "Success": "Heppnaðist",
"WeWillReplyYou": "Við höfum móttekið skilaboðin þín og munum hafa samband innan tíðar.", "WeWillReplyYou": "Við höfum móttekið skilaboðin þín og munum hafa samband innan tíðar.",
"GoHome": "Fara heim", "GoHome": "Fara heim",
"CreateLiveDemo": "Búa til Live Demo", "CreateLiveDemo": "Búa til Live Demo",
"CreateLiveDemoDescription": "Þegar þú sendir þetta form, færðu tölvupóst sem inniheldur tengilinn þinn.",
"RegisterToTheNewsletter": "Skráning á póstlista fyrir fréttabréf með upplýsingum um ABP.IO, þ.á.m. nýjar útgáfur o.s.frv..", "RegisterToTheNewsletter": "Skráning á póstlista fyrir fréttabréf með upplýsingum um ABP.IO, þ.á.m. nýjar útgáfur o.s.frv..",
"EnterYourEmailOrLogin": "Settu inn netfangið þitt til að búa til kynningu eða <a href=\"{0}\">Login</a> með þínum notandareikningi.", "EnterYourEmailOrLogin": "Settu inn netfangið þitt til að búa til kynningu eða <a href=\"{0}\">Login</a> með þínum notandareikningi.",
"ApplicationTemplate": "Forritssniðmát", "ApplicationTemplate": "Forritssniðmát",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\"> Una completa </span><span class=\"second-line\"> piattaforma di sviluppo web </span><span class=\"third-line\"> integrata <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework </span>", "IndexPageHeroSection": "<span class=\"first-line\"> Una completa </span><span class=\"second-line\"> piattaforma di sviluppo web </span><span class=\"third-line\"> integrata <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework </span>",
"AbpCommercialShortDescription": "ABP Commercial fornisce moduli applicativi predefiniti, strumenti per lo sviluppo rapido di applicazioni, temi dell'interfaccia utente professionale, supporto premium e altro ancora.", "AbpCommercialShortDescription": "ABP Commercial fornisce moduli applicativi predefiniti, strumenti per lo sviluppo rapido di applicazioni, temi dell'interfaccia utente professionale, supporto premium e altro ancora.",
"LiveDemo": "Dimostrazione dal vivo", "LiveDemo": "Dimostrazione dal vivo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> utilizzando il tuo account ABP, <a href=\"{2}\">{3}</a> a abp.io.<br/>O compilare il modulo sottostante per creare una demo live ora",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Esiste già un account con l'indirizzo email specificato: <b>{0}</b><br/> Puoi accedere con il tuo account per procedere.",
"GetLicence": "Ottieni una licenza", "GetLicence": "Ottieni una licenza",
"Application": "Applicazione", "Application": "Applicazione",
"StartupTemplates": "Modelli di avvio", "StartupTemplates": "Modelli di avvio",
@ -129,12 +131,14 @@
"YourFullName": "Il tuo nome completo", "YourFullName": "Il tuo nome completo",
"EmailField": "Indirizzo e-mail", "EmailField": "Indirizzo e-mail",
"YourEmailAddress": "Il tuo indirizzo di posta elettronica", "YourEmailAddress": "Il tuo indirizzo di posta elettronica",
"ValidEmailAddressIsRequired": "È richiesto un indirizzo email valido.",
"HowMayWeHelpYou": "Come possiamo aiutarti?", "HowMayWeHelpYou": "Come possiamo aiutarti?",
"SendMessage": "Invia messaggio", "SendMessage": "Invia messaggio",
"Success": "Successo", "Success": "Successo",
"WeWillReplyYou": "Abbiamo ricevuto il tuo messaggio e ti contatteremo a breve.", "WeWillReplyYou": "Abbiamo ricevuto il tuo messaggio e ti contatteremo a breve.",
"GoHome": "Torna all'inizio", "GoHome": "Torna all'inizio",
"CreateLiveDemo": "Crea demo live", "CreateLiveDemo": "Crea demo live",
"CreateLiveDemoDescription": "Una volta inviato questo modulo, riceverai un'e-mail contenente il link alla tua demo.",
"RegisterToTheNewsletter": "Registrati alla newsletter per ricevere informazioni su ABP.IO, comprese le nuove versioni ecc.", "RegisterToTheNewsletter": "Registrati alla newsletter per ricevere informazioni su ABP.IO, comprese le nuove versioni ecc.",
"EnterYourEmailOrLogin": "Inserisci il tuo indirizzo e-mail per creare la tua demo o <a href=\"{0}\"> Accedi </a> utilizzando il tuo account esistente.", "EnterYourEmailOrLogin": "Inserisci il tuo indirizzo e-mail per creare la tua demo o <a href=\"{0}\"> Accedi </a> utilizzando il tuo account esistente.",
"ApplicationTemplate": "Modello di applicazione", "ApplicationTemplate": "Modello di applicazione",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">Een compleet</span><span class=\"second-line\"> webontwikkelingsplatform</span><span class=\"third-line\">ingebouwd <img src= \"{0}\" width=\"110\" class=\"ml-1\" /> raamwerk</span>", "IndexPageHeroSection": "<span class=\"first-line\">Een compleet</span><span class=\"second-line\"> webontwikkelingsplatform</span><span class=\"third-line\">ingebouwd <img src= \"{0}\" width=\"110\" class=\"ml-1\" /> raamwerk</span>",
"AbpCommercialShortDescription": "ABP Commercial biedt kant-en-klare applicatiemodules, tooling voor snelle applicatieontwikkeling, professionele UI-thema's, premium ondersteuning en meer.", "AbpCommercialShortDescription": "ABP Commercial biedt kant-en-klare applicatiemodules, tooling voor snelle applicatieontwikkeling, professionele UI-thema's, premium ondersteuning en meer.",
"LiveDemo": "Live demonstratie", "LiveDemo": "Live demonstratie",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> met behulp van uw ABP-account, <a href=\"{2}\">{3}</a> naar abp.io.<br/>Of vul het onderstaande formulier in om nu een live demo te maken",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Er is al een account met het opgegeven e-mailadres: <b>{0}</b><br/> U kunt inloggen met uw account om door te gaan.",
"GetLicence": "Verkrijg een licentie", "GetLicence": "Verkrijg een licentie",
"Application": "Sollicitatie", "Application": "Sollicitatie",
"StartupTemplates": "Opstartsjablonen", "StartupTemplates": "Opstartsjablonen",
@ -129,12 +131,14 @@
"YourFullName": "Je volledige naam", "YourFullName": "Je volledige naam",
"EmailField": "E-mailadres", "EmailField": "E-mailadres",
"YourEmailAddress": "Jouw e-mailadres", "YourEmailAddress": "Jouw e-mailadres",
"ValidEmailAddressIsRequired": "Een geldig e-mailadres is vereist.",
"HowMayWeHelpYou": "Hoe kunnen we je helpen?", "HowMayWeHelpYou": "Hoe kunnen we je helpen?",
"SendMessage": "Bericht versturen", "SendMessage": "Bericht versturen",
"Success": "Succes", "Success": "Succes",
"WeWillReplyYou": "We hebben uw bericht ontvangen en nemen spoedig contact met u op.", "WeWillReplyYou": "We hebben uw bericht ontvangen en nemen spoedig contact met u op.",
"GoHome": "Ga naar huis", "GoHome": "Ga naar huis",
"CreateLiveDemo": "Live demo maken", "CreateLiveDemo": "Live demo maken",
"CreateLiveDemoDescription": "Zodra u dit formulier indient, ontvangt u een e-mail met uw demolink.",
"RegisterToTheNewsletter": "Schrijf je in voor de nieuwsbrief om informatie over ABP.IO te ontvangen, inclusief nieuwe releases etc.", "RegisterToTheNewsletter": "Schrijf je in voor de nieuwsbrief om informatie over ABP.IO te ontvangen, inclusief nieuwe releases etc.",
"EnterYourEmailOrLogin": "Voer uw e-mailadres in om uw demo te maken of <a href=\"{0}\">Log in</a> met uw bestaande account.", "EnterYourEmailOrLogin": "Voer uw e-mailadres in om uw demo te maken of <a href=\"{0}\">Log in</a> met uw bestaande account.",
"ApplicationTemplate": "Toepassingssjabloon", "ApplicationTemplate": "Toepassingssjabloon",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">A complete</span><span class=\"second-line\"> web development platform</span><span class=\"third-line\">built-on <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>", "IndexPageHeroSection": "<span class=\"first-line\">A complete</span><span class=\"second-line\"> web development platform</span><span class=\"third-line\">built-on <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>",
"AbpCommercialShortDescription": "ABP Commercial zapewnia gotowe moduły aplikacji, narzędzia do szybkiego tworzenia aplikacji, profesjonalne motywy interfejsu użytkownika, wsparcie premium i nie tylko.", "AbpCommercialShortDescription": "ABP Commercial zapewnia gotowe moduły aplikacji, narzędzia do szybkiego tworzenia aplikacji, profesjonalne motywy interfejsu użytkownika, wsparcie premium i nie tylko.",
"LiveDemo": "Demo na żywo", "LiveDemo": "Demo na żywo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> korzystając z konta ABP, <a href=\"{2}\">{3}</a> to abp.io.<br/>Lub wypełnij poniższy formularz, aby utworzyć teraz demo na żywo",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Istnieje już konto o podanym adresie e-mail: <b>{0}</b><br/> Możesz się zalogować na swoje konto, aby kontynuować.",
"GetLicence": "Uzyskaj licencję", "GetLicence": "Uzyskaj licencję",
"Application": "Podanie", "Application": "Podanie",
"StartupTemplates": "Szablony startowe", "StartupTemplates": "Szablony startowe",
@ -129,12 +131,14 @@
"YourFullName": "Twoje pełne imię", "YourFullName": "Twoje pełne imię",
"EmailField": "Adres e-mail", "EmailField": "Adres e-mail",
"YourEmailAddress": "Twój adres email", "YourEmailAddress": "Twój adres email",
"ValidEmailAddressIsRequired": "Wymagany jest prawidłowy adres e-mail.",
"HowMayWeHelpYou": "Jak możemy Ci pomóc?", "HowMayWeHelpYou": "Jak możemy Ci pomóc?",
"SendMessage": "Wyślij wiadomość", "SendMessage": "Wyślij wiadomość",
"Success": "Powodzenie", "Success": "Powodzenie",
"WeWillReplyYou": "Otrzymaliśmy Twoją wiadomość i wkrótce się z Tobą skontaktujemy.", "WeWillReplyYou": "Otrzymaliśmy Twoją wiadomość i wkrótce się z Tobą skontaktujemy.",
"GoHome": "Idź do domu", "GoHome": "Idź do domu",
"CreateLiveDemo": "Utwórz demo na żywo", "CreateLiveDemo": "Utwórz demo na żywo",
"CreateLiveDemoDescription": "Po wysłaniu tego formularza otrzymasz e-mail z linkiem do swojego demo.",
"RegisterToTheNewsletter": "Zarejestruj się do newslettera, aby otrzymywać informacje dotyczące ABP.IO, w tym nowości itp.", "RegisterToTheNewsletter": "Zarejestruj się do newslettera, aby otrzymywać informacje dotyczące ABP.IO, w tym nowości itp.",
"EnterYourEmailOrLogin": "Wprowadź swój adres e-mail, aby utworzyć demo lub <a href=\"{0}\">Zaloguj się</a> przy użyciu istniejącego konta.", "EnterYourEmailOrLogin": "Wprowadź swój adres e-mail, aby utworzyć demo lub <a href=\"{0}\">Zaloguj się</a> przy użyciu istniejącego konta.",
"ApplicationTemplate": "Szablon aplikacji", "ApplicationTemplate": "Szablon aplikacji",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\"> Uma completa </span> <span class=\"second-line\"> plataforma de desenvolvimento web </span> <span class=\"third-line\"> integrada <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> estrutura </span>", "IndexPageHeroSection": "<span class=\"first-line\"> Uma completa </span> <span class=\"second-line\"> plataforma de desenvolvimento web </span> <span class=\"third-line\"> integrada <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> estrutura </span>",
"AbpCommercialShortDescription": "ABP Commercial fornece módulos de aplicativos pré-construídos, ferramentas de desenvolvimento rápido de aplicativos, temas de UI profissionais, suporte premium e muito mais.", "AbpCommercialShortDescription": "ABP Commercial fornece módulos de aplicativos pré-construídos, ferramentas de desenvolvimento rápido de aplicativos, temas de UI profissionais, suporte premium e muito mais.",
"LiveDemo": "Demonstração ao vivo", "LiveDemo": "Demonstração ao vivo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> usando sua conta ABP, <a href=\"{2}\">{3}</a> para abp.io.<br/>Ou preencha o formulário abaixo para criar uma demonstração ao vivo agora",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Já existe uma conta com o endereço de e-mail fornecido: <b>{0}</b><br/> Você pode fazer login com sua conta para continuar.",
"GetLicence": "Obtenha uma licença", "GetLicence": "Obtenha uma licença",
"Application": "Aplicativo", "Application": "Aplicativo",
"StartupTemplates": "Modelos de inicialização", "StartupTemplates": "Modelos de inicialização",
@ -129,12 +131,14 @@
"YourFullName": "Seu nome completo", "YourFullName": "Seu nome completo",
"EmailField": "Endereço de e-mail", "EmailField": "Endereço de e-mail",
"YourEmailAddress": "Seu endereço de email", "YourEmailAddress": "Seu endereço de email",
"ValidEmailAddressIsRequired": "Um endereço de e-mail válido é obrigatório.",
"HowMayWeHelpYou": "Como podemos ajudá-lo?", "HowMayWeHelpYou": "Como podemos ajudá-lo?",
"SendMessage": "Enviar mensagem", "SendMessage": "Enviar mensagem",
"Success": "Sucesso", "Success": "Sucesso",
"WeWillReplyYou": "Recebemos sua mensagem e entraremos em contato em breve.", "WeWillReplyYou": "Recebemos sua mensagem e entraremos em contato em breve.",
"GoHome": "Ir para casa", "GoHome": "Ir para casa",
"CreateLiveDemo": "Criar demonstração ao vivo", "CreateLiveDemo": "Criar demonstração ao vivo",
"CreateLiveDemoDescription": "Depois de enviar este formulário, você receberá um e-mail contendo o link da sua demonstração.",
"RegisterToTheNewsletter": "Cadastre-se no boletim informativo para receber informações sobre ABP.IO, incluindo novos lançamentos etc.", "RegisterToTheNewsletter": "Cadastre-se no boletim informativo para receber informações sobre ABP.IO, incluindo novos lançamentos etc.",
"EnterYourEmailOrLogin": "Digite seu endereço de e-mail para criar sua demonstração ou <a href=\"{0}\"> Faça login </a> usando sua conta existente.", "EnterYourEmailOrLogin": "Digite seu endereço de e-mail para criar sua demonstração ou <a href=\"{0}\"> Faça login </a> usando sua conta existente.",
"ApplicationTemplate": "Modelo de aplicativo", "ApplicationTemplate": "Modelo de aplicativo",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">A complete</span><span class=\"second-line\"> web development platform</span><span class=\"third-line\">built-on <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>", "IndexPageHeroSection": "<span class=\"first-line\">A complete</span><span class=\"second-line\"> web development platform</span><span class=\"third-line\">built-on <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>",
"AbpCommercialShortDescription": "ABP Commercial oferă module de aplicaţii pre-construite, instrumente de dezvoltare rapidă a aplicaţiilor, teme UI profesionale, asistenţă premium şi multe altele.", "AbpCommercialShortDescription": "ABP Commercial oferă module de aplicaţii pre-construite, instrumente de dezvoltare rapidă a aplicaţiilor, teme UI profesionale, asistenţă premium şi multe altele.",
"LiveDemo": "Live Demo", "LiveDemo": "Live Demo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> folosind contul ABP, <a href=\"{2}\">{3}</a> la abp.io.<br/>Sau completaţi formularul de mai jos pentru a crea un demo live acum",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Există deja un cont cu adresa de email specificată: <b>{0}</b><br/> Puteţi să vă autentificaţi cu contul dumneavoastră pentru a continua.",
"GetLicence": "Obţine o licenţă", "GetLicence": "Obţine o licenţă",
"Application": "Application", "Application": "Application",
"StartupTemplates": "Şabloane de lansare", "StartupTemplates": "Şabloane de lansare",
@ -129,12 +131,14 @@
"YourFullName": "Numele dumneavoastră complet", "YourFullName": "Numele dumneavoastră complet",
"EmailField": "Adresa de email", "EmailField": "Adresa de email",
"YourEmailAddress": "Adresa dumneavoastră de email", "YourEmailAddress": "Adresa dumneavoastră de email",
"ValidEmailAddressIsRequired": "Vă rugăm să introduceţi o adresă de email validă.",
"HowMayWeHelpYou": "Cum vă putem ajuta?", "HowMayWeHelpYou": "Cum vă putem ajuta?",
"SendMessage": "Trimite mesaj", "SendMessage": "Trimite mesaj",
"Success": "Succes", "Success": "Succes",
"WeWillReplyYou": "Am primit mesajul dumneavoastră şi vă vom contacta cât de repede posibil.", "WeWillReplyYou": "Am primit mesajul dumneavoastră şi vă vom contacta cât de repede posibil.",
"GoHome": "Navigaţi acasă", "GoHome": "Navigaţi acasă",
"CreateLiveDemo": "Crează Demo Live", "CreateLiveDemo": "Crează Demo Live",
"CreateLiveDemoDescription": "După ce trimiteţi acest formular, veţi primi un email care conţine link-ul demo-ului dumneavoastră.",
"RegisterToTheNewsletter": "Înregistraţi-va la newsletter pentru a primi informaţii despre ABP.IO, inclusiv lansări noi etc.", "RegisterToTheNewsletter": "Înregistraţi-va la newsletter pentru a primi informaţii despre ABP.IO, inclusiv lansări noi etc.",
"EnterYourEmailOrLogin": "Introduceţi-vă adresa de email pentru a vă crea demo-ul sau <a href=\"{0}\">Autentificaţi-vă</a> folosind contul existent.", "EnterYourEmailOrLogin": "Introduceţi-vă adresa de email pentru a vă crea demo-ul sau <a href=\"{0}\">Autentificaţi-vă</a> folosind contul existent.",
"ApplicationTemplate": "Application Template", "ApplicationTemplate": "Application Template",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\"> Полная </span> <span class=\"second-line\"> платформа веб-разработки </span> <span class=\"third-line\"> встроенная <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> каркас </span>", "IndexPageHeroSection": "<span class=\"first-line\"> Полная </span> <span class=\"second-line\"> платформа веб-разработки </span> <span class=\"third-line\"> встроенная <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> каркас </span>",
"AbpCommercialShortDescription": "ABP Commercial предоставляет готовые модули приложений, инструменты для быстрой разработки приложений, профессиональные темы пользовательского интерфейса, поддержку премиум-класса и многое другое.", "AbpCommercialShortDescription": "ABP Commercial предоставляет готовые модули приложений, инструменты для быстрой разработки приложений, профессиональные темы пользовательского интерфейса, поддержку премиум-класса и многое другое.",
"LiveDemo": "Живая демонстрация", "LiveDemo": "Живая демонстрация",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> используя свою учетную запись ABP, <a href=\"{2}\">{3}</a> на abp.io. <br/> Или заполните форму ниже, чтобы создать живую демонстрацию прямо сейчас",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Уже есть учетная запись с указанным адресом электронной почты: <b>{0}</b><br/> Вы можете войти в свою учетную запись, чтобы продолжить.",
"GetLicence": "Получить лицензию", "GetLicence": "Получить лицензию",
"Application": "заявка", "Application": "заявка",
"StartupTemplates": "Шаблоны запуска", "StartupTemplates": "Шаблоны запуска",
@ -129,12 +131,14 @@
"YourFullName": "Ваше полное имя", "YourFullName": "Ваше полное имя",
"EmailField": "Адрес электронной почты", "EmailField": "Адрес электронной почты",
"YourEmailAddress": "Ваш адрес электронной почты", "YourEmailAddress": "Ваш адрес электронной почты",
"ValidEmailAddressIsRequired": "Требуется действительный адрес электронной почты.",
"HowMayWeHelpYou": "Как мы можем Вам помочь?", "HowMayWeHelpYou": "Как мы можем Вам помочь?",
"SendMessage": "Отправить сообщение", "SendMessage": "Отправить сообщение",
"Success": "Успех", "Success": "Успех",
"WeWillReplyYou": "Мы получили ваше сообщение и скоро свяжемся с вами.", "WeWillReplyYou": "Мы получили ваше сообщение и скоро свяжемся с вами.",
"GoHome": "Иди домой", "GoHome": "Иди домой",
"CreateLiveDemo": "Создать живую демонстрацию", "CreateLiveDemo": "Создать живую демонстрацию",
"CreateLiveDemoDescription": "После отправки этой формы вы получите электронное письмо со ссылкой на демонстрацию.",
"RegisterToTheNewsletter": "Подпишитесь на рассылку новостей, чтобы получать информацию о ABP.IO, в том числе о новых выпусках и т. Д.", "RegisterToTheNewsletter": "Подпишитесь на рассылку новостей, чтобы получать информацию о ABP.IO, в том числе о новых выпусках и т. Д.",
"EnterYourEmailOrLogin": "Введите свой адрес электронной почты, чтобы создать демоверсию, или <a href=\"{0}\"> войдите </a>, используя существующую учетную запись.", "EnterYourEmailOrLogin": "Введите свой адрес электронной почты, чтобы создать демоверсию, или <a href=\"{0}\"> войдите </a>, используя существующую учетную запись.",
"ApplicationTemplate": "Шаблон приложения", "ApplicationTemplate": "Шаблон приложения",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">Kompletná</span><span class=\"second-line\"> web vývojová platforma</span><span class=\"third-line\">postavená na <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> frameworku</span>", "IndexPageHeroSection": "<span class=\"first-line\">Kompletná</span><span class=\"second-line\"> web vývojová platforma</span><span class=\"third-line\">postavená na <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> frameworku</span>",
"AbpCommercialShortDescription": "ABP Commercial poskytuje predpripravené aplikačné moduly, nástroje na rýchly vývoj aplikácií, profesionálne témy používateľského rozhrania, prémiovú podporu a ďalšie.", "AbpCommercialShortDescription": "ABP Commercial poskytuje predpripravené aplikačné moduly, nástroje na rýchly vývoj aplikácií, profesionálne témy používateľského rozhrania, prémiovú podporu a ďalšie.",
"LiveDemo": "Live ukážka", "LiveDemo": "Live ukážka",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> použitím vášho ABP účtu, <a href=\"{2}\">{3}</a> na abp.io.<br/>Alebo vyplňte nižšie uvedený formulár a vytvorte si teraz live ukážku",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Už existuje účet s danou emailovou adresou: <b>{0}</b><br/> Môžete sa prihlásiť pomocou svojho účtu a pokračovať.",
"GetLicence": "Získajte licenciu", "GetLicence": "Získajte licenciu",
"Application": "Aplikácia", "Application": "Aplikácia",
"StartupTemplates": "Štartovacie šablóny", "StartupTemplates": "Štartovacie šablóny",
@ -129,12 +131,14 @@
"YourFullName": "Vaše celé meno", "YourFullName": "Vaše celé meno",
"EmailField": "Emailová adresa", "EmailField": "Emailová adresa",
"YourEmailAddress": "Vaša emailová adresa", "YourEmailAddress": "Vaša emailová adresa",
"ValidEmailAddressIsRequired": "Je potrebná platná emailová adresa.",
"HowMayWeHelpYou": "Ako vám môžeme pomôcť?", "HowMayWeHelpYou": "Ako vám môžeme pomôcť?",
"SendMessage": "Odoslať správu", "SendMessage": "Odoslať správu",
"Success": "Úspech", "Success": "Úspech",
"WeWillReplyYou": "Dostali sme vašu správu a čoskoro vás budeme kontaktovať.", "WeWillReplyYou": "Dostali sme vašu správu a čoskoro vás budeme kontaktovať.",
"GoHome": "Prejsť Domov", "GoHome": "Prejsť Domov",
"CreateLiveDemo": "Vytvoriť live ukážku", "CreateLiveDemo": "Vytvoriť live ukážku",
"CreateLiveDemoDescription": "Po odoslaní tohto formulára obdržíte e-mail obsahujúci odkaz na vašu ukážku.",
"RegisterToTheNewsletter": "Zaregistrujte sa na odber noviniek a dostávajte informácie o ABP.IO, vrátane nových verzií atď.", "RegisterToTheNewsletter": "Zaregistrujte sa na odber noviniek a dostávajte informácie o ABP.IO, vrátane nových verzií atď.",
"EnterYourEmailOrLogin": "Zadajte svoju emailovú adresu a vytvorte si ukážku alebo sa <a href=\"{0}\">prihláste</a> pomocou svojho existujúceho konta.", "EnterYourEmailOrLogin": "Zadajte svoju emailovú adresu a vytvorte si ukážku alebo sa <a href=\"{0}\">prihláste</a> pomocou svojho existujúceho konta.",
"ApplicationTemplate": "Šablóna žiadosti", "ApplicationTemplate": "Šablóna žiadosti",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">Popolna</span><span class=\"second-line\"> platforma za spletno razvoj</span><span class=\"third-line\">vgrajena <img src= \"{0}\" width=\"110\" class=\"ml-1\" /> okvir</span>", "IndexPageHeroSection": "<span class=\"first-line\">Popolna</span><span class=\"second-line\"> platforma za spletno razvoj</span><span class=\"third-line\">vgrajena <img src= \"{0}\" width=\"110\" class=\"ml-1\" /> okvir</span>",
"AbpCommercialShortDescription": "ABP Commercial ponuja vnaprej izdelane aplikacijske module, orodja za hiter razvoj aplikacij, profesionalne teme uporabniškega vmesnika, vrhunsko podporo in še več.", "AbpCommercialShortDescription": "ABP Commercial ponuja vnaprej izdelane aplikacijske module, orodja za hiter razvoj aplikacij, profesionalne teme uporabniškega vmesnika, vrhunsko podporo in še več.",
"LiveDemo": "Demo v živo", "LiveDemo": "Demo v živo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> s svojim ABP računom, <a href=\"{2}\">{3}</a> na abp.io.<br/>Ali izpolnite spodnji obrazec, da ustvarite demo v živo zdaj",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Za navedeni e-poštni naslov že obstaja račun: <b>{0}</b><br/> Lahko se prijavite s svojim računom, da nadaljujete.",
"GetLicence": "Pridobite licenco", "GetLicence": "Pridobite licenco",
"Application": "Aplikacija", "Application": "Aplikacija",
"StartupTemplates": "Predloge za zagon", "StartupTemplates": "Predloge za zagon",
@ -129,12 +131,14 @@
"YourFullName": "Tvoje polno ime", "YourFullName": "Tvoje polno ime",
"EmailField": "Email naslov", "EmailField": "Email naslov",
"YourEmailAddress": "Vaš email naslov", "YourEmailAddress": "Vaš email naslov",
"ValidEmailAddressIsRequired": "Veljaven e-poštni naslov je obvezen",
"HowMayWeHelpYou": "Kako vam lahko pomagamo?", "HowMayWeHelpYou": "Kako vam lahko pomagamo?",
"SendMessage": "Pošlji sporočilo", "SendMessage": "Pošlji sporočilo",
"Success": "uspeh", "Success": "uspeh",
"WeWillReplyYou": "Prejeli smo vaše sporočilo in vas bomo v kratkem kontaktirali.", "WeWillReplyYou": "Prejeli smo vaše sporočilo in vas bomo v kratkem kontaktirali.",
"GoHome": "Pojdi domov", "GoHome": "Pojdi domov",
"CreateLiveDemo": "Ustvari demo v živo", "CreateLiveDemo": "Ustvari demo v živo",
"CreateLiveDemoDescription": "Ko pošljete ta obrazec, boste prejeli e-poštno sporočilo s povezavo do svojega demo.",
"RegisterToTheNewsletter": "Registrirajte se za glasilo, če želite prejemati informacije o ABP.IO, vključno z novimi izdajami itd.", "RegisterToTheNewsletter": "Registrirajte se za glasilo, če želite prejemati informacije o ABP.IO, vključno z novimi izdajami itd.",
"EnterYourEmailOrLogin": "Vnesite svoj e-poštni naslov, če želite ustvariti predstavitev, ali <a href=\"{0}\">Prijavite se</a> z obstoječim računom.", "EnterYourEmailOrLogin": "Vnesite svoj e-poštni naslov, če želite ustvariti predstavitev, ali <a href=\"{0}\">Prijavite se</a> z obstoječim računom.",
"ApplicationTemplate": "Predloga aplikacije", "ApplicationTemplate": "Predloga aplikacije",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json

@ -48,6 +48,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">A complete</span><span class=\"second-line\"> web development platform</span><span class=\"third-line\">built-on <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>", "IndexPageHeroSection": "<span class=\"first-line\">A complete</span><span class=\"second-line\"> web development platform</span><span class=\"third-line\">built-on <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>",
"AbpCommercialShortDescription": "ABP Commercial, önceden oluşturulmuş uygulama modülleri, hızlı uygulama geliştirme araçları, profesyonel UI temaları, premium destek ve daha fazlasını sağlar.", "AbpCommercialShortDescription": "ABP Commercial, önceden oluşturulmuş uygulama modülleri, hızlı uygulama geliştirme araçları, profesyonel UI temaları, premium destek ve daha fazlasını sağlar.",
"LiveDemo": "Canlı Demo", "LiveDemo": "Canlı Demo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> ABP hesabınızı kullanarak, <a href=\"{2}\">{3}</a> abp.io'ya hoş geldiniz.<br/>Veya aşağıdaki formu doldurarak şimdi canlı bir demo oluşturun",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Zaten <b>{0}</b> e-posta adresiyle bir hesap var.<br/> Devam etmek için hesabınızla giriş yapabilirsiniz.",
"GetLicence": "Lisans Alın", "GetLicence": "Lisans Alın",
"Application": "Başvuru", "Application": "Başvuru",
"StartupTemplates": "Başlangıç Şablonları", "StartupTemplates": "Başlangıç Şablonları",
@ -131,12 +133,14 @@
"YourFullName": "Tam adınız", "YourFullName": "Tam adınız",
"EmailField": "E-posta Adresi", "EmailField": "E-posta Adresi",
"YourEmailAddress": "E-posta adresiniz", "YourEmailAddress": "E-posta adresiniz",
"ValidEmailAddressIsRequired": "Geçerli bir e-posta adresi gereklidir",
"HowMayWeHelpYou": "Size nasıl yardımcı olabiliriz?", "HowMayWeHelpYou": "Size nasıl yardımcı olabiliriz?",
"SendMessage": "Mesaj gönder", "SendMessage": "Mesaj gönder",
"Success": "Başarı", "Success": "Başarı",
"WeWillReplyYou": "Mesajınızı aldık ve kısa süre içinde sizinle iletişime geçeceğiz.", "WeWillReplyYou": "Mesajınızı aldık ve kısa süre içinde sizinle iletişime geçeceğiz.",
"GoHome": "Eve git", "GoHome": "Eve git",
"CreateLiveDemo": "Canlı Demo Oluştur", "CreateLiveDemo": "Canlı Demo Oluştur",
"CreateLiveDemoDescription": "Bu formu gönderdikten sonra, demo bağlantınızı içeren bir e-posta alacaksınız.",
"RegisterToTheNewsletter": "ABP.IO hakkında yeni yayınlar vb. dahil olmak üzere bilgi almak için haber bültenine kaydolun.", "RegisterToTheNewsletter": "ABP.IO hakkında yeni yayınlar vb. dahil olmak üzere bilgi almak için haber bültenine kaydolun.",
"EnterYourEmailOrLogin": "Demonuzu oluşturmak için e-posta adresinizi girin veya mevcut hesabınızı kullanarak <a href=\"{0}\">Giriş yapın</a>.", "EnterYourEmailOrLogin": "Demonuzu oluşturmak için e-posta adresinizi girin veya mevcut hesabınızı kullanarak <a href=\"{0}\">Giriş yapın</a>.",
"ApplicationTemplate": "Uygulama Şablonu", "ApplicationTemplate": "Uygulama Şablonu",

4
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json

@ -46,6 +46,8 @@
"IndexPageHeroSection": "<span class=\"first-line\"> Nền tảng phát triển web hoàn chỉnh </span> <span class=\"second-line\"> </span> <span class=\"third-line\"> được tích hợp sẵn <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> khung </span>", "IndexPageHeroSection": "<span class=\"first-line\"> Nền tảng phát triển web hoàn chỉnh </span> <span class=\"second-line\"> </span> <span class=\"third-line\"> được tích hợp sẵn <img src=\"{0}\" width = \"110\" class=\"ml-1\" /> khung </span>",
"AbpCommercialShortDescription": "ABP Commercial cung cấp các mô-đun ứng dụng được tạo sẵn, công cụ phát triển ứng dụng nhanh chóng, các chủ đề giao diện người dùng chuyên nghiệp, hỗ trợ cao cấp và hơn thế nữa.", "AbpCommercialShortDescription": "ABP Commercial cung cấp các mô-đun ứng dụng được tạo sẵn, công cụ phát triển ứng dụng nhanh chóng, các chủ đề giao diện người dùng chuyên nghiệp, hỗ trợ cao cấp và hơn thế nữa.",
"LiveDemo": "Bản thử trực tiếp", "LiveDemo": "Bản thử trực tiếp",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> hoặc <a href=\"{2}\">{3}</a> đến abp.io. <br/> Hoặc điền vào biểu mẫu bên dưới để tạo bản trình diễn trực tiếp ngay bây giờ",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "Đã có một tài khoản với địa chỉ email đã cho: <b> {0} </b> <br/> Bạn có thể đăng nhập vào tài khoản của mình để tiếp tục.",
"GetLicence": "Nhận giấy phép", "GetLicence": "Nhận giấy phép",
"Application": "Ứng dụng", "Application": "Ứng dụng",
"StartupTemplates": "Mẫu khởi động", "StartupTemplates": "Mẫu khởi động",
@ -129,12 +131,14 @@
"YourFullName": "Tên đầy đủ của bạn", "YourFullName": "Tên đầy đủ của bạn",
"EmailField": "Địa chỉ email", "EmailField": "Địa chỉ email",
"YourEmailAddress": "Địa chỉ email của bạn", "YourEmailAddress": "Địa chỉ email của bạn",
"ValidEmailAddressIsRequired": "Địa chỉ email hợp lệ là bắt buộc",
"HowMayWeHelpYou": "Chúng tôi có thể giúp gì cho bạn?", "HowMayWeHelpYou": "Chúng tôi có thể giúp gì cho bạn?",
"SendMessage": "Gửi tin nhắn", "SendMessage": "Gửi tin nhắn",
"Success": "Sự thành công", "Success": "Sự thành công",
"WeWillReplyYou": "Chúng tôi đã nhận được tin nhắn của bạn và sẽ sớm liên hệ với bạn.", "WeWillReplyYou": "Chúng tôi đã nhận được tin nhắn của bạn và sẽ sớm liên hệ với bạn.",
"GoHome": "Về nhà", "GoHome": "Về nhà",
"CreateLiveDemo": "Tạo bản trình diễn trực tiếp", "CreateLiveDemo": "Tạo bản trình diễn trực tiếp",
"CreateLiveDemoDescription": "Sau khi bạn gửi biểu mẫu này, bạn sẽ nhận được một email chứa liên kết bản demo của mình.",
"RegisterToTheNewsletter": "Đăng ký nhận bản tin để nhận thông tin về ABP.IO, bao gồm các bản phát hành mới, v.v.", "RegisterToTheNewsletter": "Đăng ký nhận bản tin để nhận thông tin về ABP.IO, bao gồm các bản phát hành mới, v.v.",
"EnterYourEmailOrLogin": "Nhập địa chỉ e-mail của bạn để tạo bản demo hoặc <a href=\"{0}\"> Đăng nhập </a> bằng tài khoản hiện có của bạn.", "EnterYourEmailOrLogin": "Nhập địa chỉ e-mail của bạn để tạo bản demo hoặc <a href=\"{0}\"> Đăng nhập </a> bằng tài khoản hiện có của bạn.",
"ApplicationTemplate": "Mẫu ứng dụng", "ApplicationTemplate": "Mẫu ứng dụng",

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

@ -49,6 +49,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">一个完整的</span><span class=\"second-line\">web开发平台</span><span class=\"third-line\">基于 <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> 框架</span>", "IndexPageHeroSection": "<span class=\"first-line\">一个完整的</span><span class=\"second-line\">web开发平台</span><span class=\"third-line\">基于 <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> 框架</span>",
"AbpCommercialShortDescription": "ABP商业版提供了预构建的应用程序模块, 快速的应用程序开发工具, 专业的UI主题, 高级支持等.", "AbpCommercialShortDescription": "ABP商业版提供了预构建的应用程序模块, 快速的应用程序开发工具, 专业的UI主题, 高级支持等.",
"LiveDemo": "在线演示", "LiveDemo": "在线演示",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> 到你的ABP账户, <a href=\"{2}\">{3}</a> 到 abp.io.<br/>或者填写下面的表单立即创建在线演示",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "已经有一个使用此电子邮件地址的帐户: <b>{0}</b><br/> 你可以使用你的帐户登录继续.",
"GetLicence": "获得许可", "GetLicence": "获得许可",
"Application": "应用程序", "Application": "应用程序",
"StartupTemplates": "启动模板", "StartupTemplates": "启动模板",
@ -132,12 +134,14 @@
"LastNameField": "姓氏", "LastNameField": "姓氏",
"EmailField": "E-mail地址", "EmailField": "E-mail地址",
"YourEmailAddress": "你的e-mail地址", "YourEmailAddress": "你的e-mail地址",
"ValidEmailAddressIsRequired": "请输入有效的e-mail地址",
"HowMayWeHelpYou": "需要获得购买帮助?(提供中文服务)", "HowMayWeHelpYou": "需要获得购买帮助?(提供中文服务)",
"SendMessage": "发送消息", "SendMessage": "发送消息",
"Success": "成功", "Success": "成功",
"WeWillReplyYou": "你的消息已经发送! 我们会在短时间内给你答复.", "WeWillReplyYou": "你的消息已经发送! 我们会在短时间内给你答复.",
"GoHome": "回到主页面", "GoHome": "回到主页面",
"CreateLiveDemo": "创建在线演示", "CreateLiveDemo": "创建在线演示",
"CreateLiveDemoDescription": "一旦你提交此表单,你将收到一封包含你的演示链接的电子邮件.",
"RegisterToTheNewsletter": "注册到时事简报以获取有关ABP.IO的消息,比如新发布的内容.", "RegisterToTheNewsletter": "注册到时事简报以获取有关ABP.IO的消息,比如新发布的内容.",
"EnterYourEmailOrLogin": "输入你的e-mail地址来创建你的演示或者使用你的已有账号<a href=\"{0}\">登录</a>.", "EnterYourEmailOrLogin": "输入你的e-mail地址来创建你的演示或者使用你的已有账号<a href=\"{0}\">登录</a>.",
"ApplicationTemplate": "应用程序模板", "ApplicationTemplate": "应用程序模板",

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

@ -48,6 +48,8 @@
"IndexPageHeroSection": "<span class=\"first-line\">一個完整的</span><span class=\"second-line\">web開發平臺</span><span class=\"third-line\">基於 <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> 框架</span>", "IndexPageHeroSection": "<span class=\"first-line\">一個完整的</span><span class=\"second-line\">web開發平臺</span><span class=\"third-line\">基於 <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> 框架</span>",
"AbpCommercialShortDescription": "ABP商業版提供了預構建的應用程序模塊, 快速的應用程序開發工具, 專業的UI主題, 高級支持等.", "AbpCommercialShortDescription": "ABP商業版提供了預構建的應用程序模塊, 快速的應用程序開發工具, 專業的UI主題, 高級支持等.",
"LiveDemo": "在線演示", "LiveDemo": "在線演示",
"LiveDemoLead": " <a href=\"{0}\">{1}</a> 使用你的ABP賬號, <a href=\"{2}\">{3}</a> 到 abp.io.<br/>或者填寫下面的表單立即創建一個在線演示",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "已經有一個使用該電子郵件地址的賬號: <b>{0}</b><br/> 你可以使用你的賬號登錄以繼續.",
"GetLicence": "獲得許可", "GetLicence": "獲得許可",
"Application": "應用程序", "Application": "應用程序",
"StartupTemplates": "啟動模板", "StartupTemplates": "啟動模板",
@ -131,12 +133,14 @@
"YourFullName": "你的全名", "YourFullName": "你的全名",
"EmailField": "E-mail地址", "EmailField": "E-mail地址",
"YourEmailAddress": "你的e-mail地址", "YourEmailAddress": "你的e-mail地址",
"ValidEmailAddressIsRequired": "請輸入有效的e-mail地址",
"HowMayWeHelpYou": "我們如何幫助你", "HowMayWeHelpYou": "我們如何幫助你",
"SendMessage": "發送消息", "SendMessage": "發送消息",
"Success": "成功", "Success": "成功",
"WeWillReplyYou": "你的消息已經發送! 我們會在短時間內給你答復.", "WeWillReplyYou": "你的消息已經發送! 我們會在短時間內給你答復.",
"GoHome": "回到主頁面", "GoHome": "回到主頁面",
"CreateLiveDemo": "創建在線演示", "CreateLiveDemo": "創建在線演示",
"CreateLiveDemoDescription": "一旦你提交此表單,你將收到一封包含你的演示鏈接的電子郵件.",
"RegisterToTheNewsletter": "註冊到時事簡報以獲取有關ABP.IO的消息,比如新發布的內容.", "RegisterToTheNewsletter": "註冊到時事簡報以獲取有關ABP.IO的消息,比如新發布的內容.",
"EnterYourEmailOrLogin": "輸入你的e-mail地址來創建你的演示或者使用你的已有賬號<a href=\"{0}\">登錄</a>.", "EnterYourEmailOrLogin": "輸入你的e-mail地址來創建你的演示或者使用你的已有賬號<a href=\"{0}\">登錄</a>.",
"ApplicationTemplate": "應用程序模板", "ApplicationTemplate": "應用程序模板",

30
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json

@ -191,6 +191,34 @@
"DiscordPageTitle": "ABP Discord Community", "DiscordPageTitle": "ABP Discord Community",
"ViewVideo": "View Video", "ViewVideo": "View Video",
"AbpCommunityTitleContent": "ABP Community - Open Source ABP Framework", "AbpCommunityTitleContent": "ABP Community - Open Source ABP Framework",
"CommunitySlogan": "A unique community platform for <span class=\"d-inline-block d-md-block gradient-community\">ABP Lovers</span>" "CommunitySlogan": "A unique community platform for <span class=\"d-inline-block d-md-block gradient-community\">ABP Lovers</span>",
"RaffleIsNotActive": "Raffle is not active",
"YouAreAlreadyJoinedToThisRaffle": "You are already joined to this raffle",
"InvalidSubscriptionCode": "Invalid subscription code",
"Raffle:{0}": "Raffle: {0}",
"Join": "Join",
"Leave": "Leave",
"LoginToJoin": "Login to join",
"ToEnd:": "To end:",
"ToStart:": "To start:",
"days": "days",
"hrs": "hrs",
"min": "min",
"sec": "sec",
"Winners:": "Winners:",
"To{0}LuckyWinners": "to {0} lucky winner(s)",
"ActiveRaffles": "Active <span class=\"gradient-community\">Raffles</span>",
"UpcomingRaffles": "Upcoming <span class=\"gradient-community\">Raffles</span>",
"CompletedRaffles": "Completed <span class=\"gradient-community\">Raffles</span>",
"NoActiveRaffleTitle": "No active raffle is available at the moment.",
"NoActiveRaffleDescription": "No active raffle is available at the moment.",
"RaffleSubscriptionCodeInputMessage": "This raffle requires a registration code. Please enter the registration code below:",
"RaffleSubscriptionCodeInputErrorMessage": "The registration code is incorrect. Please try again.",
"GoodJob!": "Good Job!",
"RaffleJoinSuccessMessage": "You are successfully registered tor the raffle. You will be informed via email if you win the prize!",
"RaffleLoginAndRegisterMessage": "You should sign in to join a raffle. You can create an account for free if you haven't registered yet.",
"Ok": "Ok",
"SeeDetails": "See Details",
"WaitingForDraw": "Waiting for draw"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/en.json

@ -3,6 +3,7 @@
"texts": { "texts": {
"Buy": "Buy", "Buy": "Buy",
"SeeBookDetails": "See Book Details", "SeeBookDetails": "See Book Details",
"MasteringAbpFrameworkEBookDescription": "This book will help you gain a complete understanding of the framework and modern web application development techniques." "MasteringAbpFrameworkEBookDescription": "This book will help you gain a complete understanding of the framework and modern web application development techniques.",
"Feedback": "Feedback"
} }
} }

236
docs/en/Community-Articles/2023-09-20-Moving-Background-Job-Execution-To-A-Separate-Application/POST.md

@ -0,0 +1,236 @@
# Moving Background Job Execution To A Separate Application
In this article, I will show you how to move the background job execution to a separate application.
Here are some benefits of doing this:
* If your background jobs consume high system resources (CPU, RAM or Disk), then you can deploy that background application to a dedicated server so it won't affect your application's performance.
* You can scale your background job application independently from your web application. For example, you can deploy multiple instances of your background job application to a Kubernetes cluster and scale it easily.
Here are some disadvantages of doing this:
* You need to deploy and maintain at least two applications instead of one.
* You need to implement a mechanism to share the common code between your applications. For example, you can create a shared project and add it to your applications as a project reference.
## Source code
You can find the source code of the application at [abpframework/abp-samples](https://github.com/abpframework/abp-samples/tree/master/SeparateBackgroundJob).
You can check the PR to see the changes step by step: [abpframework/abp-samples#250](https://github.com/abpframework/abp-samples/pull/250)
## Creating the Web Application
First, we need to create a new web application using the ABP CLI:
```bash
abp new SeparateBackgroundJob -t app
```
* Create a shared project named `SeparateBackgroundJob.Common.Shared` to share the `BackgroundJob` and `BackgroundJobArgs` classes between the web and job executor applications.
* Install the `Volo.Abp.BackgroundJobs.Abstractions` package to the `SeparateBackgroundJob.Common.Shared` project.
Add the `SeparateBackgroundJobCommonSharedModule` class to the `SeparateBackgroundJob.Common.Shared` project:
```csharp
[DependsOn(typeof(AbpBackgroundJobsAbstractionsModule))]
public class SeparateBackgroundJobCommonSharedModule : AbpModule
{
}
```
Add the `MyReportJob` and `MyReportJobArgs` classes to the `SeparateBackgroundJob.Common.Shared` project:
```csharp
public class MyReportJob : AsyncBackgroundJob<MyReportJobArgs>, ITransientDependency
{
public override Task ExecuteAsync(MyReportJobArgs args)
{
Logger.LogInformation("Executing MyReportJob with args: {0}", args.Content);
return Task.CompletedTask;
}
}
public class MyReportJobArgs
{
public string? Content { get; set; }
}
```
Add the `SeparateBackgroundJob.Common.Shared` project reference to the `SeparateBackgroundJob.Domain` project and add `SeparateBackgroundJobCommonSharedModule` to the `DependsOn` attribute of the `SeparateBackgroundJobDomainModule` class:
```csharp
[DependsOn(
typeof(SeparateBackgroundJobDomainSharedModule),
typeof(AbpAuditLoggingDomainModule),
typeof(AbpBackgroundJobsDomainModule),
typeof(AbpFeatureManagementDomainModule),
typeof(AbpIdentityDomainModule),
typeof(AbpOpenIddictDomainModule),
typeof(AbpPermissionManagementDomainOpenIddictModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpSettingManagementDomainModule),
typeof(AbpTenantManagementDomainModule),
typeof(AbpEmailingModule),
typeof(SeparateBackgroundJobCommonSharedModule) //Add this line
)]
public class SeparateBackgroundJobDomainModule : AbpModule
```
Open the `Index.cshtml` and replace the content with the following code:
```csharp
@page
@using Microsoft.AspNetCore.Mvc.Localization
@using SeparateBackgroundJob.Localization
@using Volo.Abp.Users
@model SeparateBackgroundJob.Web.Pages.IndexModel
@inject IHtmlLocalizer<SeparateBackgroundJobResource> L
@inject ICurrentUser CurrentUser
@section styles {
<abp-style src="/Pages/Index.css"/>
}
@section scripts {
<abp-script src="/Pages/Index.js"/>
}
<div class="container">
<abp-card>
<abp-card-header>
<abp-card-title>
Add NEW BACKGROUND JOB
</abp-card-title>
</abp-card-header>
<abp-card-body>
<form id="NewItemForm" method="post" class="row row-cols-lg-auto g-3 align-items-center">
<div class="col-12">
<div class="input-group">
<input id="ReportContent" required name="ReportContent" type="text" class="form-control" placeholder="enter text...">
</div>
</div>
<div class="col-12">
<button type="submit" class="btn btn-primary">Add</button>
</div>
</form>
</abp-card-body>
</abp-card>
</div>
```
Open the `Index.cshtml.cs` and replace the content with the following code:
```csharp
public class IndexModel : SeparateBackgroundJobPageModel
{
private readonly IBackgroundJobManager _backgroundJobManager;
[BindProperty(SupportsGet = true)]
public string? ReportContent { get; set; }
public IndexModel(IBackgroundJobManager backgroundJobManager)
{
_backgroundJobManager = backgroundJobManager;
}
public void OnGet()
{
}
public async Task OnPostAsync()
{
await _backgroundJobManager.EnqueueAsync(new MyReportJobArgs
{
Content = ReportContent
});
Alerts.Success("Job is queued!");
}
}
```
Run the application and navigate to the home page. You should see the following page:
![1](images/1.png)
When you enter some text and click the **Add** button, the job will be queued and executed in the web application:
## Creating the Console Application
Now we split the background job execution to a separate console application.
Open the `SeparateBackgroundJobWebModule` class to disable the background job execution in the web application:
```csharp
public class SeparateBackgroundJobWebModule : AbpModule
{
....
public override void ConfigureServices(ServiceConfigurationContext context)
{
...
//Disable background job execution in the web application
Configure<AbpBackgroundJobOptions>(options =>
{
options.IsJobExecutionEnabled = false;
});
}
...
}
```
* Create a new console application using the ABP CLI:
```bash
abp new BackgroundJobExecutor -t console
```
* Add the `BackgroundJobExecutor` project to the solution of the web application.
* Add the `SeparateBackgroundJob.Common.Shared` project reference to the `BackgroundJobExecutor` project.
* Install the `Volo.Abp.BackgroundJobs.EntityFrameworkCore` and `Volo.Abp.EntityFrameworkCore.SqlServer` packages to the `BackgroundJobExecutor` project.
Update the `BackgroundJobExecutorModule` class as follows:
```csharp
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpBackgroundJobsEntityFrameworkCoreModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(SeparateBackgroundJobCommonSharedModule)
)]
public class BackgroundJobExecutorModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpDbContextOptions>(options =>
{
options.UseSqlServer();
});
}
....
}
```
Open the `appsettings.json` file to configure the [connection string](https://docs.abp.io/en/abp/latest/Connection-Strings#configure-the-connection-strings):
```json
{
"ConnectionStrings": {
"AbpBackgroundJobs": "Server=(LocalDb)\\MSSQLLocalDB;Database=SeparateBackgroundJob;Trusted_Connection=True"
}
}
```
> You must use the same connection string for the web application, `AbpBackgroundJobs` is the default connection string name for the background job module.
The solution structure should look like this:
![solution](images/solution.png)
Now, run the web and console application. When you enter some text and click the **Add** button, the job will be queued and executed in the console application:
![2](images/2.png)

BIN
docs/en/Community-Articles/2023-09-20-Moving-Background-Job-Execution-To-A-Separate-Application/images/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

BIN
docs/en/Community-Articles/2023-09-20-Moving-Background-Job-Execution-To-A-Separate-Application/images/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

BIN
docs/en/Community-Articles/2023-09-20-Moving-Background-Job-Execution-To-A-Separate-Application/images/solution.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

12
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Zxcvbn/ZxcvbnScriptContributor.cs

@ -0,0 +1,12 @@
using System.Collections.Generic;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.Zxcvbn;
public class ZxcvbnScriptContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.AddIfNotContains("/libs/zxcvbn/zxcvbn.js");
}
}

1
framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs

@ -42,6 +42,7 @@ public abstract class AbpAspNetCoreIntegratedTestBase<TStartupModule> : AbpTestB
protected virtual IHostBuilder CreateHostBuilder() protected virtual IHostBuilder CreateHostBuilder()
{ {
return Host.CreateDefaultBuilder() return Host.CreateDefaultBuilder()
.AddAppSettingsSecretsJson()
.ConfigureWebHostDefaults(webBuilder => .ConfigureWebHostDefaults(webBuilder =>
{ {
if (typeof(TStartupModule).IsAssignableTo<IAbpModule>()) if (typeof(TStartupModule).IsAssignableTo<IAbpModule>())

4
framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpWebApplicationFactoryIntegratedTest.cs

@ -27,7 +27,9 @@ public abstract class AbpWebApplicationFactoryIntegratedTest<TProgram> : WebAppl
protected override IHost CreateHost(IHostBuilder builder) protected override IHost CreateHost(IHostBuilder builder)
{ {
builder.ConfigureServices(ConfigureServices); builder
.AddAppSettingsSecretsJson()
.ConfigureServices(ConfigureServices);
return base.CreateHost(builder); return base.CreateHost(builder);
} }

1
framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj

@ -23,6 +23,7 @@
<PackageReference Include="Polly" Version="$(PollyPackageVersion)" /> <PackageReference Include="Polly" Version="$(PollyPackageVersion)" />
<PackageReference Include="Polly.Extensions.Http" Version="3.0.0" /> <PackageReference Include="Polly.Extensions.Http" Version="3.0.0" />
<PackageReference Include="LibGit2Sharp" Version="0.26.2" /> <PackageReference Include="LibGit2Sharp" Version="0.26.2" />
<PackageReference Include="StackExchange.Redis" Version="2.6.122" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

46
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs

@ -8,12 +8,14 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using StackExchange.Redis;
using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.Bundling; using Volo.Abp.Cli.Bundling;
using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.Commands.Services;
using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.LIbs;
using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.Cli.ProjectBuilding;
using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
using Volo.Abp.Cli.ProjectModification; using Volo.Abp.Cli.ProjectModification;
using Volo.Abp.Cli.Utils; using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -89,6 +91,8 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien
var projectArgs = await GetProjectBuildArgsAsync(commandLineArgs, template, projectName); var projectArgs = await GetProjectBuildArgsAsync(commandLineArgs, template, projectName);
await CheckCreatingRequirements(projectArgs);
var result = await TemplateProjectBuilder.BuildAsync( var result = await TemplateProjectBuilder.BuildAsync(
projectArgs projectArgs
); );
@ -97,6 +101,8 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien
Logger.LogInformation($"'{projectName}' has been successfully created to '{projectArgs.OutputFolder}'"); Logger.LogInformation($"'{projectName}' has been successfully created to '{projectArgs.OutputFolder}'");
await CheckCreatedRequirements(projectArgs);
ConfigureNpmPackagesForTheme(projectArgs); ConfigureNpmPackagesForTheme(projectArgs);
await CreateOpenIddictPfxFilesAsync(projectArgs); await CreateOpenIddictPfxFilesAsync(projectArgs);
await RunGraphBuildForMicroserviceServiceTemplate(projectArgs); await RunGraphBuildForMicroserviceServiceTemplate(projectArgs);
@ -120,6 +126,46 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien
OpenRelatedWebPage(projectArgs, template, isTiered, commandLineArgs); OpenRelatedWebPage(projectArgs, template, isTiered, commandLineArgs);
} }
private Task CheckCreatingRequirements(ProjectBuildArgs projectArgs)
{
return Task.CompletedTask;
}
private async Task CheckCreatedRequirements(ProjectBuildArgs projectArgs)
{
var errors = new List<string>();
if (projectArgs.ExtraProperties.ContainsKey("PreRequirements:Redis"))
{
var isConnected = false;
try
{
var redis = await ConnectionMultiplexer.ConnectAsync("127.0.0.1", options => options.ConnectTimeout = 3000);
isConnected = redis.IsConnected;
}
catch (Exception e)
{
// ignored
}
finally
{
if (!isConnected)
{
errors.Add("\t* Redis is not installed or not running on your computer.");
}
}
}
if (errors.Any())
{
Logger.LogWarning("NOTICE: The following tools are required to run your solution.");
foreach (var error in errors)
{
Logger.LogWarning(error);
}
}
}
public string GetUsageInfo() public string GetUsageInfo()
{ {
var sb = new StringBuilder(); var sb = new StringBuilder();

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs

@ -484,6 +484,11 @@ public abstract class ProjectCreationCommandBase
protected Task CreateOpenIddictPfxFilesAsync(ProjectBuildArgs projectArgs) protected Task CreateOpenIddictPfxFilesAsync(ProjectBuildArgs projectArgs)
{ {
if (!projectArgs.ExtraProperties.ContainsKey(nameof(RandomizeAuthServerPassPhraseStep)))
{
return Task.CompletedTask;
}
var module = projectArgs.ExtraProperties[nameof(RandomizeAuthServerPassPhraseStep)]; var module = projectArgs.ExtraProperties[nameof(RandomizeAuthServerPassPhraseStep)];
if (string.IsNullOrWhiteSpace(module)) if (string.IsNullOrWhiteSpace(module))
{ {

10
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Cli.ProjectBuilding.Templates;
namespace Volo.Abp.Cli.ProjectBuilding.Building; namespace Volo.Abp.Cli.ProjectBuilding.Building;
@ -28,7 +29,14 @@ public abstract class TemplateInfo
public virtual IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context) public virtual IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)
{ {
return Array.Empty<ProjectBuildPipelineStep>(); var steps = new List<ProjectBuildPipelineStep>();
ConfigureCheckPreRequirements(context, steps);
return steps;
}
protected void ConfigureCheckPreRequirements(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new CheckRedisPreRequirements());
} }
public bool IsPro() public bool IsPro()

3
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Building.Steps; using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
@ -20,7 +21,7 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase
public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context) public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)
{ {
var steps = new List<ProjectBuildPipelineStep>(); var steps = base.GetCustomSteps(context).ToList();
switch (context.BuildArgs.DatabaseProvider) switch (context.BuildArgs.DatabaseProvider)
{ {

15
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs

@ -28,7 +28,7 @@ public abstract class AppTemplateBase : TemplateInfo
public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context) public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)
{ {
var steps = new List<ProjectBuildPipelineStep>(); var steps = base.GetCustomSteps(context).ToList();
ConfigureTenantSchema(context, steps); ConfigureTenantSchema(context, steps);
SwitchDatabaseProvider(context, steps); SwitchDatabaseProvider(context, steps);
@ -165,7 +165,11 @@ public abstract class AppTemplateBase : TemplateInfo
steps.Add(new RemoveFolderStep("/angular")); steps.Add(new RemoveFolderStep("/angular"));
} }
if (context.BuildArgs.MobileApp != MobileApp.ReactNative) if(context.BuildArgs.MobileApp == MobileApp.ReactNative)
{
context.Symbols.Add("mobile:react-native");
}
else
{ {
steps.Add(new RemoveFolderStep(MobileApp.ReactNative.GetFolderName().EnsureStartsWith('/'))); steps.Add(new RemoveFolderStep(MobileApp.ReactNative.GetFolderName().EnsureStartsWith('/')));
} }
@ -174,6 +178,7 @@ public abstract class AppTemplateBase : TemplateInfo
{ {
steps.Add(new MauiChangeApplicationIdGuidStep()); steps.Add(new MauiChangeApplicationIdGuidStep());
steps.Add(new MauiChangePortStep()); steps.Add(new MauiChangePortStep());
context.Symbols.Add("mobile:maui");
} }
else else
{ {
@ -192,10 +197,12 @@ public abstract class AppTemplateBase : TemplateInfo
context.BuildArgs.ExtraProperties.ContainsKey("separate-auth-server")) context.BuildArgs.ExtraProperties.ContainsKey("separate-auth-server"))
{ {
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Public")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Public"));
context.Symbols.Add("ui:mvc-public-host");
} }
else else
{ {
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Public.Host")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Public.Host"));
context.Symbols.Add("ui:mvc-public");
} }
} }
} }
@ -399,6 +406,7 @@ public abstract class AppTemplateBase : TemplateInfo
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer"));
steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host")); steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
context.Symbols.Add("HostWithIds");
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305")); steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
} }
} }
@ -424,6 +432,7 @@ public abstract class AppTemplateBase : TemplateInfo
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer"));
steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host")); steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
context.Symbols.Add("HostWithIds");
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305")); steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
} }
@ -517,6 +526,7 @@ public abstract class AppTemplateBase : TemplateInfo
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer"));
steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host")); steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
context.Symbols.Add("HostWithIds");
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305")); steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
} }
@ -554,6 +564,7 @@ public abstract class AppTemplateBase : TemplateInfo
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer"));
steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host")); steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
context.Symbols.Add("HostWithIds");
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305")); steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
} }
} }

17
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs

@ -0,0 +1,17 @@
using System;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Building;
namespace Volo.Abp.Cli.ProjectBuilding.Templates;
public class CheckRedisPreRequirements : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
var modules = context.Files.Where(f => f.Name.EndsWith("Module.cs", StringComparison.OrdinalIgnoreCase));
if (modules.Any(module => module.Content.Contains("Redis:Configuration")))
{
context.BuildArgs.ExtraProperties["PreRequirements:Redis"] = "true";
}
}
}

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceServiceTemplateBase.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Building.Steps; using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
@ -33,14 +34,14 @@ public abstract class MicroserviceServiceTemplateBase : TemplateInfo
public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context) public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)
{ {
var steps = new List<ProjectBuildPipelineStep>(); var steps = base.GetCustomSteps(context).ToList();
DeleteUnrelatedUiProject(context, steps); DeleteUnrelatedUiProject(context, steps);
SetRandomPortForHostProject(context, steps); SetRandomPortForHostProject(context, steps);
RandomizeStringEncryption(context, steps); RandomizeStringEncryption(context, steps);
RandomizeAuthServerPassPhrase(context, steps); RandomizeAuthServerPassPhrase(context, steps);
ChangeConnectionString(context, steps); ChangeConnectionString(context, steps);
return steps; return steps;
} }

3
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Building.Steps; using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
@ -19,7 +20,7 @@ public abstract class MicroserviceTemplateBase : TemplateInfo
public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context) public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)
{ {
var steps = new List<ProjectBuildPipelineStep>(); var steps = base.GetCustomSteps(context).ToList();
DeleteUnrelatedProjects(context, steps); DeleteUnrelatedProjects(context, steps);
RandomizeStringEncryption(context, steps); RandomizeStringEncryption(context, steps);

3
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Module/ModuleTemplateBase.cs

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Building.Steps; using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
@ -21,7 +22,7 @@ public abstract class ModuleTemplateBase : TemplateInfo
public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context) public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)
{ {
var steps = new List<ProjectBuildPipelineStep>(); var steps = base.GetCustomSteps(context).ToList();
DeleteUnrelatedProjects(context, steps); DeleteUnrelatedProjects(context, steps);
RandomizeSslPorts(context, steps); RandomizeSslPorts(context, steps);

5
framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs

@ -18,11 +18,12 @@ public static class ConfigurationHelper
var builder = new ConfigurationBuilder() var builder = new ConfigurationBuilder()
.SetBasePath(options.BasePath!) .SetBasePath(options.BasePath!)
.AddJsonFile(options.FileName + ".json", optional: options.Optional, reloadOnChange: options.ReloadOnChange); .AddJsonFile(options.FileName + ".json", optional: options.Optional, reloadOnChange: options.ReloadOnChange)
.AddJsonFile(options.FileName + ".secrets.json", optional: true, reloadOnChange: options.ReloadOnChange);
if (!options.EnvironmentName.IsNullOrEmpty()) if (!options.EnvironmentName.IsNullOrEmpty())
{ {
builder = builder.AddJsonFile($"{options.FileName}.{options.EnvironmentName}.json", optional: options.Optional, reloadOnChange: options.ReloadOnChange); builder = builder.AddJsonFile($"{options.FileName}.{options.EnvironmentName}.json", optional: true, reloadOnChange: options.ReloadOnChange);
} }
if (options.EnvironmentName == "Development") if (options.EnvironmentName == "Development")

1
framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/AbpFluentValidationConventionalRegistrar.cs

@ -24,6 +24,7 @@ public class AbpFluentValidationConventionalRegistrar : DefaultConventionalRegis
{ {
return new List<Type>() return new List<Type>()
{ {
type,
typeof(IValidator<>).MakeGenericType(GetFirstGenericArgumentOrNull(type, 1)!) typeof(IValidator<>).MakeGenericType(GetFirstGenericArgumentOrNull(type, 1)!)
}; };
} }

16
framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/JQuery/JQueryProxyScriptGenerator.cs

@ -114,7 +114,21 @@ public class JQueryProxyScriptGenerator : IProxyScriptGenerator, ITransientDepen
if (versionParam != null) if (versionParam != null)
{ {
var version = FindBestApiVersion(action); var version = FindBestApiVersion(action);
script.AppendLine($" var {ProxyScriptingJsFuncHelper.NormalizeJsVariableName(versionParam.Name)} = api_version ? api_version : '{version}';"); if (parameterList.Contains("api_version"))
{
script.AppendLine($" var {ProxyScriptingJsFuncHelper.NormalizeJsVariableName(versionParam.Name)} = api_version ? api_version : '{version}';");
}
else
{
var apiVersion = action.Parameters.FirstOrDefault(p =>
p.BindingSourceId.IsIn(ParameterBindingSources.ModelBinding, ParameterBindingSources.Query) &&
p.Name == "api-version");
if (apiVersion != null && parameterList.Contains(apiVersion.NameOnMethod))
{
var apiVersionVariable = ProxyScriptingJsFuncHelper.GetParamNameInJsFunc(apiVersion);
script.AppendLine($" {apiVersionVariable} = {apiVersionVariable} ? {apiVersionVariable} : '{version}';");
}
}
} }
script.AppendLine(" return abp.ajax($.extend(true, {"); script.AppendLine(" return abp.ajax($.extend(true, {");

11
framework/test/Volo.Abp.FluentValidation.Tests/Volo/Abp/FluentValidation/ApplicationService_FluentValidation_Tests.cs

@ -103,6 +103,17 @@ public class ApplicationService_FluentValidation_Tests : AbpIntegratedTest<Appli
output.ShouldBe("444"); output.ShouldBe("444");
} }
[Fact]
public void Should_Add_Validators_To_DI()
{
var validator = ServiceProvider.GetService<IValidator<MyMethodInput>>();
validator.GetType().ShouldBe(typeof(MyMethodInputValidator));
validator = ServiceProvider.GetService<MyMethodInputValidator>();
validator.GetType().ShouldBe(typeof(MyMethodInputValidator));
}
[DependsOn(typeof(AbpAutofacModule))] [DependsOn(typeof(AbpAutofacModule))]
[DependsOn(typeof(AbpFluentValidationModule))] [DependsOn(typeof(AbpFluentValidationModule))]
public class TestModule : AbpModule public class TestModule : AbpModule

21
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js

@ -253,12 +253,13 @@ $(function () {
initEditor(); initEditor();
var editor; var editor;
var addWidgetButton;
function initEditor() { function initEditor() {
var $editorContainer = $("#ContentEditor"); var $editorContainer = $("#ContentEditor");
var inputName = $editorContainer.data('input-id'); var inputName = $editorContainer.data('input-id');
var $editorInput = $('#' + inputName); var $editorInput = $('#' + inputName);
var initialValue = $editorInput.val(); var initialValue = $editorInput.val();
addWidgetButton = createAddWidgetButton();
editor = new toastui.Editor({ editor = new toastui.Editor({
el: $editorContainer[0], el: $editorContainer[0],
@ -279,7 +280,7 @@ $(function () {
['code', 'codeblock'], ['code', 'codeblock'],
// Using Option: Customize the last button // Using Option: Customize the last button
[{ [{
el: createAddWidgetButton(), el: addWidgetButton,
command: 'bold', command: 'bold',
tooltip: 'Add Widget' tooltip: 'Add Widget'
}] }]
@ -334,20 +335,28 @@ $(function () {
editor.insertText(txt); editor.insertText(txt);
}); });
var $previewArea;
$('.tab-item').on('click', function () { $('.tab-item').on('click', function () {
if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) {
if(!$previewArea){
$previewArea = $("#ContentEditor .toastui-editor-md-preview");
$previewArea.replaceWith("<iframe id='previewArea' style='height: 100%; width: 100%; border: 0px; display: inline;'></iframe>");
}
$previewArea.attr("srcdoc", '');
addWidgetButton.disabled = true;
let content = editor.getMarkdown(); let content = editor.getMarkdown();
localStorage.setItem('content', content); localStorage.setItem('content', content);
$.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) {
editor.setHTML(result); $previewArea = $("#previewArea");
$previewArea.attr("srcdoc", result);
var highllightedText = $('#ContentEditor').find('.toastui-editor-md-preview-highlight');
highllightedText.removeClass('toastui-editor-md-preview-highlight');
}); });
} }
else if ($(this).attr("aria-label") == 'Write') { else if ($(this).attr("aria-label") == 'Write') {
addWidgetButton.disabled = false;
var retrievedObject = localStorage.getItem('content'); var retrievedObject = localStorage.getItem('content');
editor.setMarkdown(retrievedObject); editor.setMarkdown(retrievedObject);
} }

21
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/update.js

@ -164,12 +164,15 @@ $(function () {
initEditor(); initEditor();
var editor; var editor;
var addWidgetButton;
function initEditor() { function initEditor() {
var $editorContainer = $("#ContentEditor"); var $editorContainer = $("#ContentEditor");
var inputName = $editorContainer.data('input-id'); var inputName = $editorContainer.data('input-id');
var $editorInput = $('#' + inputName); var $editorInput = $('#' + inputName);
var initialValue = $editorInput.val(); var initialValue = $editorInput.val();
addWidgetButton = createAddWidgetButton();
editor = new toastui.Editor({ editor = new toastui.Editor({
el: $editorContainer[0], el: $editorContainer[0],
usageStatistics: false, usageStatistics: false,
@ -189,7 +192,7 @@ $(function () {
['code', 'codeblock'], ['code', 'codeblock'],
// Using Option: Customize the last button // Using Option: Customize the last button
[{ [{
el: createAddWidgetButton(), el: addWidgetButton,
command: 'bold', command: 'bold',
tooltip: 'Add Widget' tooltip: 'Add Widget'
}] }]
@ -255,20 +258,28 @@ $(function () {
editor.insertText(txt); editor.insertText(txt);
}); });
var $previewArea;
$('.tab-item').on('click', function () { $('.tab-item').on('click', function () {
if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) { if ($(this).attr("aria-label") == 'Preview' && editor.isMarkdownMode()) {
if(!$previewArea){
$previewArea = $("#ContentEditor .toastui-editor-md-preview");
$previewArea.replaceWith("<iframe id='previewArea' style='height: 100%; width: 100%; border: 0px; display: inline;'></iframe>");
}
$previewArea.attr("srcdoc", '');
addWidgetButton.disabled = true;
let content = editor.getMarkdown(); let content = editor.getMarkdown();
localStorage.setItem('content', content); localStorage.setItem('content', content);
$.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) { $.post("/CmsKitCommonWidgets/ContentPreview", { content: content }, function (result) {
editor.setHTML(result); $previewArea = $("#previewArea");
$previewArea.attr("srcdoc", result);
var highllightedText = $('#ContentEditor').find('.toastui-editor-md-preview-highlight');
highllightedText.removeClass('toastui-editor-md-preview-highlight');
}); });
} }
else if ($(this).attr("aria-label") == 'Write') { else if ($(this).attr("aria-label") == 'Write') {
addWidgetButton.disabled = false;
var retrievedObject = localStorage.getItem('content'); var retrievedObject = localStorage.getItem('content');
editor.setMarkdown(retrievedObject); editor.setMarkdown(retrievedObject);
} }

8
modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/DefaultContentDto.cs

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using JetBrains.Annotations;
namespace Volo.CmsKit.Contents; namespace Volo.CmsKit.Contents;
@ -7,4 +8,11 @@ namespace Volo.CmsKit.Contents;
public class DefaultContentDto : IContent public class DefaultContentDto : IContent
{ {
public List<ContentFragment> ContentFragments { get; set; } public List<ContentFragment> ContentFragments { get; set; }
public bool AllowHtmlTags { get; set; } = true;
public bool PreventXSS { get; set; } = true;
[CanBeNull]
public string ReferralLink { get; set; } = null;
} }

8
modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Contents/IContent.cs

@ -4,5 +4,11 @@ namespace Volo.CmsKit.Contents;
public interface IContent public interface IContent
{ {
public List<ContentFragment> ContentFragments { get; set; } List<ContentFragment> ContentFragments { get; set; }
bool AllowHtmlTags { get; set; }
bool PreventXSS { get; set; }
string ReferralLink { get; set; }
} }

4
modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/ContentPreviewViewComponent.cs

@ -25,7 +25,9 @@ public class ContentPreviewViewComponent : AbpViewComponent
return View("~/Pages/CmsKit/Components/ContentPreview/Default.cshtml", new DefaultContentDto return View("~/Pages/CmsKit/Components/ContentPreview/Default.cshtml", new DefaultContentDto
{ {
ContentFragments = fragments ContentFragments = fragments,
AllowHtmlTags = true,
PreventXSS = false
}); });
} }
} }

7
modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/ContentPreview/Default.cshtml

@ -8,8 +8,5 @@
Layout = ThemeManager.CurrentTheme.GetEmptyLayout(); Layout = ThemeManager.CurrentTheme.GetEmptyLayout();
} }
<abp-card> <div class="mt-3">@await Component.InvokeAsync(typeof(ContentFragmentViewComponent), Model)</div>
<abp-card-body>
@await Component.InvokeAsync(typeof(ContentFragmentViewComponent), Model)
</abp-card-body>
</abp-card>

2
modules/cms-kit/src/Volo.CmsKit.Common.Web/Pages/CmsKit/Components/Contents/ContentFragment.cshtml

@ -14,7 +14,7 @@
{ {
if (contentFragment.Type == ContentConsts.Markdown) if (contentFragment.Type == ContentConsts.Markdown)
{ {
@Html.Raw(await MarkdownRenderer.RenderAsync(contentFragment.GetProperty<string>("Content"))) @Html.Raw(await MarkdownRenderer.RenderAsync(contentFragment.GetProperty<string>("Content"), Model.ContentDto.AllowHtmlTags, Model.ContentDto.PreventXSS, Model.ContentDto.ReferralLink))
} }
else if (contentFragment.Type == ContentConsts.Widget) else if (contentFragment.Type == ContentConsts.Widget)
{ {

3
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogConsts.cs

@ -3,5 +3,8 @@
public class BlogConsts public class BlogConsts
{ {
public static int MaxNameLength { get; set; } = 64; public static int MaxNameLength { get; set; } = 64;
public static int MaxSlugLength { get; set; } = 64; public static int MaxSlugLength { get; set; } = 64;
public const string PreventXssFeatureName = "CmsKit.BlogPost.PreventXssFeature";
} }

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/BlogPostScrollIndexFeature.cs

@ -3,7 +3,6 @@ using Volo.Abp.GlobalFeatures;
namespace Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit.GlobalFeatures;
[GlobalFeatureName(Name)] [GlobalFeatureName(Name)]
public class BlogPostScrollIndexFeature : GlobalFeature public class BlogPostScrollIndexFeature : GlobalFeature
{ {

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ar.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "التقييمات", "CmsKit.Ratings": "التقييمات",
"CmsKit.Reactions": "تفاعلات", "CmsKit.Reactions": "تفاعلات",
"CmsKit.Tags": "العلامات", "CmsKit.Tags": "العلامات",
"CmsKit.BlogPost.PreventXssFeature": "منع XSS",
"CmsKit:0002": "المحتوى موجود بالفعل!", "CmsKit:0002": "المحتوى موجود بالفعل!",
"CmsKit:0003": "الكيان {0} غير قابل للعلامة.", "CmsKit:0003": "الكيان {0} غير قابل للعلامة.",
"CmsKit:Blog:0001": "slug المحدد ({Slug}) موجود بالفعل!", "CmsKit:Blog:0001": "slug المحدد ({Slug}) موجود بالفعل!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Hodnocení", "CmsKit.Ratings": "Hodnocení",
"CmsKit.Reactions": "Reakce", "CmsKit.Reactions": "Reakce",
"CmsKit.Tags": "Tagy", "CmsKit.Tags": "Tagy",
"CmsKit.BlogPost.PreventXssFeature": "Zabraňte XSS",
"CmsKit:0002": "Obsah již existuje!", "CmsKit:0002": "Obsah již existuje!",
"CmsKit:0003": "Entitu {0} nelze označit.", "CmsKit:0003": "Entitu {0} nelze označit.",
"CmsKit:Blog:0001": "Daný slimák ({Slug}) již existuje!", "CmsKit:Blog:0001": "Daný slimák ({Slug}) již existuje!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/de-DE.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Bewertungen", "CmsKit.Ratings": "Bewertungen",
"CmsKit.Reactions": "Reaktionen", "CmsKit.Reactions": "Reaktionen",
"CmsKit.Tags": "Stichworte", "CmsKit.Tags": "Stichworte",
"CmsKit.BlogPost.PreventXssFeature": "XSS-Prävention",
"CmsKit:0002": "Inhalt ist bereits vorhanden!", "CmsKit:0002": "Inhalt ist bereits vorhanden!",
"CmsKit:0003": "Die Entität {0} kann nicht mit Tags versehen werden.", "CmsKit:0003": "Die Entität {0} kann nicht mit Tags versehen werden.",
"CmsKit:Blog:0001": "Die angegebene Schnecke ({Slug}) existiert bereits!", "CmsKit:Blog:0001": "Die angegebene Schnecke ({Slug}) existiert bereits!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/el.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Βαθμολογία", "CmsKit.Ratings": "Βαθμολογία",
"CmsKit.Reactions": "Αντιδράσεις", "CmsKit.Reactions": "Αντιδράσεις",
"CmsKit.Tags": "Ετικέτες", "CmsKit.Tags": "Ετικέτες",
"CmsKit.BlogPost.PreventXssFeature": "Αποτροπή XSS",
"CmsKit:0002": "Το περιεχόμενο υπάρχει ήδη!", "CmsKit:0002": "Το περιεχόμενο υπάρχει ήδη!",
"CmsKit:0003": "Η οντότητα {0} δεν μπορεί να επισημανθεί.", "CmsKit:0003": "Η οντότητα {0} δεν μπορεί να επισημανθεί.",
"CmsKit:Blog:0001": "Το δεδομένο slug ({Slug}) υπάρχει ήδη!", "CmsKit:Blog:0001": "Το δεδομένο slug ({Slug}) υπάρχει ήδη!",

451
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json

@ -1,228 +1,229 @@
{ {
"culture": "en", "culture": "en",
"texts": { "texts": {
"AddSubMenuItem": "Add Sub Menu Item", "AddSubMenuItem": "Add Sub Menu Item",
"AreYouSure": "Are You Sure?", "AreYouSure": "Are You Sure?",
"BlogDeletionConfirmationMessage": "The blog '{0}' will be deleted. Are you sure?", "BlogDeletionConfirmationMessage": "The blog '{0}' will be deleted. Are you sure?",
"BlogFeatureNotAvailable": "This feature is not available now. Enable with 'GlobalFeatureManager' to use it.", "BlogFeatureNotAvailable": "This feature is not available now. Enable with 'GlobalFeatureManager' to use it.",
"BlogId": "Blog", "BlogId": "Blog",
"BlogPostDeletionConfirmationMessage": "The blog post '{0}' will be deleted. Are you sure?", "BlogPostDeletionConfirmationMessage": "The blog post '{0}' will be deleted. Are you sure?",
"BlogPosts": "Blog Posts", "BlogPosts": "Blog Posts",
"Blogs": "Blogs", "Blogs": "Blogs",
"ChoosePreference": "Choose Preference...", "ChoosePreference": "Choose Preference...",
"Cms": "CMS", "Cms": "CMS",
"CmsKit.Comments": "Comments", "CmsKit.Comments": "Comments",
"CmsKit.Ratings": "Ratings", "CmsKit.Ratings": "Ratings",
"CmsKit.Reactions": "Reactions", "CmsKit.Reactions": "Reactions",
"CmsKit.Tags": "Tags", "CmsKit.Tags": "Tags",
"CmsKit:0002": "Content already exists!", "CmsKit:0002": "Content already exists!",
"CmsKit:0003": "The entity {0} is not taggable.", "CmsKit:0003": "The entity {0} is not taggable.",
"CmsKit:Blog:0001": "The given slug ({Slug}) already exists!", "CmsKit:Blog:0001": "The given slug ({Slug}) already exists!",
"CmsKit:BlogPost:0001": "The given slug already exists!", "CmsKit:BlogPost:0001": "The given slug already exists!",
"CmsKit:Comments:0001": "The entity {EntityType} is not commentable.", "CmsKit:Comments:0001": "The entity {EntityType} is not commentable.",
"CmsKit:Media:0001": "'{Name}' is not a valid media name.", "CmsKit:Media:0001": "'{Name}' is not a valid media name.",
"CmsKit:Media:0002": "The entity can't have media.", "CmsKit:Media:0002": "The entity can't have media.",
"CmsKit:Page:0001": "The given url ({Slug}) already exists. Please try with different url.", "CmsKit:Page:0001": "The given url ({Slug}) already exists. Please try with different url.",
"CmsKit:Rating:0001": "The entity {EntityType} can't be rated.", "CmsKit:Rating:0001": "The entity {EntityType} can't be rated.",
"CmsKit:Reaction:0001": "The entity {EntityType} can't have reactions.", "CmsKit:Reaction:0001": "The entity {EntityType} can't have reactions.",
"CmsKit:Tag:0002": "The entity is not taggable!", "CmsKit:Tag:0002": "The entity is not taggable!",
"CommentAuthorizationExceptionMessage": "Those comments are not allowed for public display.", "CommentAuthorizationExceptionMessage": "Those comments are not allowed for public display.",
"CommentDeletionConfirmationMessage": "This comment and all replies will be deleted!", "CommentDeletionConfirmationMessage": "This comment and all replies will be deleted!",
"Comments": "Comments", "Comments": "Comments",
"Content": "Content", "Content": "Content",
"ContentDeletionConfirmationMessage": "Are you sure to delete this content?", "ContentDeletionConfirmationMessage": "Are you sure to delete this content?",
"Contents": "Contents", "Contents": "Contents",
"CoverImage": "Cover Image", "CoverImage": "Cover Image",
"CreateBlogPostPage": "New Blog Post", "CreateBlogPostPage": "New Blog Post",
"CreationTime": "Creation Time", "CreationTime": "Creation Time",
"Delete": "Delete", "Delete": "Delete",
"Detail": "Detail", "Detail": "Detail",
"Details": "Details", "Details": "Details",
"DisplayName": "Display Name", "DisplayName": "Display Name",
"DoYouPreferAdditionalEmails": "Do you prefer additional emails?", "DoYouPreferAdditionalEmails": "Do you prefer additional emails?",
"Edit": "Edit", "Edit": "Edit",
"EndDate": "End Date", "EndDate": "End Date",
"EntityId": "Entity Id", "EntityId": "Entity Id",
"EntityType": "Entity Type", "EntityType": "Entity Type",
"ExportCSV": "Export CSV", "ExportCSV": "Export CSV",
"Features": "Features", "Features": "Features",
"GenericDeletionConfirmationMessage": "Are you sure to delete '{0}'?", "GenericDeletionConfirmationMessage": "Are you sure to delete '{0}'?",
"IsActive": "Active", "IsActive": "Active",
"LastModification": "Last Modification", "LastModification": "Last Modification",
"LastModificationTime": "Last Modification Time", "LastModificationTime": "Last Modification Time",
"LoginToAddComment": "Login to add comment", "LoginToAddComment": "Login to add comment",
"LoginToRate": "Login to rate", "LoginToRate": "Login to rate",
"LoginToReact": "Login to react", "LoginToReact": "Login to react",
"LoginToReply": "Login to reply", "LoginToReply": "Login to reply",
"MainMenu": "Main Menu", "MainMenu": "Main Menu",
"MakeMainMenu": "Make Main Menu", "MakeMainMenu": "Make Main Menu",
"Menu:CMS": "CMS", "Menu:CMS": "CMS",
"Menus": "Menus", "Menus": "Menus",
"MenuDeletionConfirmationMessage": "The menu '{0}' will be deleted. Are you sure?", "MenuDeletionConfirmationMessage": "The menu '{0}' will be deleted. Are you sure?",
"MenuItemDeletionConfirmationMessage": "Are sure to delete this menu item?", "MenuItemDeletionConfirmationMessage": "Are sure to delete this menu item?",
"MenuItemMoveConfirmMessage": "Are you sure you want to move '{0}' under '{1}'?", "MenuItemMoveConfirmMessage": "Are you sure you want to move '{0}' under '{1}'?",
"MenuItems": "Menu Items", "MenuItems": "Menu Items",
"Message": "Message", "Message": "Message",
"MessageDeletionConfirmationMessage": "This comment will be deleted completely.", "MessageDeletionConfirmationMessage": "This comment will be deleted completely.",
"NewBlog": "New Blog", "NewBlog": "New Blog",
"NewBlogPost": "New Blog Post", "NewBlogPost": "New Blog Post",
"NewMenu": "New Menu", "NewMenu": "New Menu",
"NewMenuItem": "New Root Menu Item", "NewMenuItem": "New Root Menu Item",
"NewPage": "New Page", "NewPage": "New Page",
"NewTag": "New Tag", "NewTag": "New Tag",
"NoMenuItems": "There is no menu item yet!", "NoMenuItems": "There is no menu item yet!",
"OK": "OK", "OK": "OK",
"PageDeletionConfirmationMessage": "Are you sure to delete this page?", "PageDeletionConfirmationMessage": "Are you sure to delete this page?",
"PageId": "Page", "PageId": "Page",
"Pages": "Pages", "Pages": "Pages",
"PageSlugInformation": "Slug is used on url. Your url will be '/{{slug}}'.", "PageSlugInformation": "Slug is used on url. Your url will be '/{{slug}}'.",
"Permission:BlogManagement": "Blog Management", "Permission:BlogManagement": "Blog Management",
"Permission:BlogManagement.Create": "Create", "Permission:BlogManagement.Create": "Create",
"Permission:BlogManagement.Delete": "Delete", "Permission:BlogManagement.Delete": "Delete",
"Permission:BlogManagement.Features": "Features", "Permission:BlogManagement.Features": "Features",
"Permission:BlogManagement.Update": "Update", "Permission:BlogManagement.Update": "Update",
"Permission:BlogPostManagement": "Blog Post Management", "Permission:BlogPostManagement": "Blog Post Management",
"Permission:BlogPostManagement.Create": "Create", "Permission:BlogPostManagement.Create": "Create",
"Permission:BlogPostManagement.Delete": "Delete", "Permission:BlogPostManagement.Delete": "Delete",
"Permission:BlogPostManagement.Update": "Update", "Permission:BlogPostManagement.Update": "Update",
"Permission:BlogPostManagement.Publish": "Publish", "Permission:BlogPostManagement.Publish": "Publish",
"Permission:CmsKit": "CmsKit Admin", "Permission:CmsKit": "CmsKit Admin",
"Permission:Comments": "Comment Management", "Permission:Comments": "Comment Management",
"Permission:Comments.Delete": "Delete", "Permission:Comments.Delete": "Delete",
"Permission:Contents": "Content Management", "Permission:Contents": "Content Management",
"Permission:Contents.Create": "Create Content", "Permission:Contents.Create": "Create Content",
"Permission:Contents.Delete": "Delete Content", "Permission:Contents.Delete": "Delete Content",
"Permission:Contents.Update": "Update Content", "Permission:Contents.Update": "Update Content",
"Permission:MediaDescriptorManagement": "Media Management", "Permission:MediaDescriptorManagement": "Media Management",
"Permission:MediaDescriptorManagement:Create": "Create", "Permission:MediaDescriptorManagement:Create": "Create",
"Permission:MediaDescriptorManagement:Delete": "Delete", "Permission:MediaDescriptorManagement:Delete": "Delete",
"Permission:MenuItemManagement": "Menu Item Management", "Permission:MenuItemManagement": "Menu Item Management",
"Permission:MenuItemManagement.Create": "Create", "Permission:MenuItemManagement.Create": "Create",
"Permission:MenuItemManagement.Delete": "Delete", "Permission:MenuItemManagement.Delete": "Delete",
"Permission:MenuItemManagement.Update": "Update", "Permission:MenuItemManagement.Update": "Update",
"Permission:MenuManagement": "Menu Management", "Permission:MenuManagement": "Menu Management",
"Permission:MenuManagement.Create": "Create", "Permission:MenuManagement.Create": "Create",
"Permission:MenuManagement.Delete": "Delete", "Permission:MenuManagement.Delete": "Delete",
"Permission:MenuManagement.Update": "Update", "Permission:MenuManagement.Update": "Update",
"Permission:Menus": "Menu Management", "Permission:Menus": "Menu Management",
"Permission:Menus.Create": "Create", "Permission:Menus.Create": "Create",
"Permission:Menus.Delete": "Delete", "Permission:Menus.Delete": "Delete",
"Permission:Menus.Update": "Update", "Permission:Menus.Update": "Update",
"Permission:PageManagement": "Page Management", "Permission:PageManagement": "Page Management",
"Permission:PageManagement:Create": "Create", "Permission:PageManagement:Create": "Create",
"Permission:PageManagement:Delete": "Delete", "Permission:PageManagement:Delete": "Delete",
"Permission:PageManagement:Update": "Update", "Permission:PageManagement:Update": "Update",
"Permission:PageManagement:SetAsHomePage": "Set As Home Page", "Permission:PageManagement:SetAsHomePage": "Set As Home Page",
"Permission:TagManagement": "Tag Management", "Permission:TagManagement": "Tag Management",
"Permission:TagManagement.Create": "Create", "Permission:TagManagement.Create": "Create",
"Permission:TagManagement.Delete": "Delete", "Permission:TagManagement.Delete": "Delete",
"Permission:TagManagement.Update": "Update", "Permission:TagManagement.Update": "Update",
"Permission:GlobalResources": "Global Resources", "Permission:GlobalResources": "Global Resources",
"Permission:CmsKitPublic": "CmsKit Public", "Permission:CmsKitPublic": "CmsKit Public",
"Permission:Comments.DeleteAll": "Delete All", "Permission:Comments.DeleteAll": "Delete All",
"PickYourReaction": "Pick your reaction", "PickYourReaction": "Pick your reaction",
"Rating": "Rating", "Rating": "Rating",
"RatingUndoMessage": "Your rating will be undo.", "RatingUndoMessage": "Your rating will be undo.",
"Reactions": "Reactions", "Reactions": "Reactions",
"Read": "Read", "Read": "Read",
"RepliesToThisComment": "Replies to this comment", "RepliesToThisComment": "Replies to this comment",
"Reply": "Reply", "Reply": "Reply",
"ReplyTo": "Reply to", "ReplyTo": "Reply to",
"SamplePageMessage": "A sample page for the Pro module", "SamplePageMessage": "A sample page for the Pro module",
"SaveChanges": "Save Changes", "SaveChanges": "Save Changes",
"Script": "Script", "Script": "Script",
"SelectAll": "Select All", "SelectAll": "Select All",
"Send": "Send", "Send": "Send",
"SendMessage": "Send Message", "SendMessage": "Send Message",
"SelectedAuthor": "Author", "SelectedAuthor": "Author",
"ShortDescription": "Short description", "ShortDescription": "Short description",
"Slug": "Slug", "Slug": "Slug",
"Source": "Source", "Source": "Source",
"SourceUrl": "Source Url", "SourceUrl": "Source Url",
"Star": "Star", "Star": "Star",
"StartDate": "Start Date", "StartDate": "Start Date",
"Style": "Style", "Style": "Style",
"Subject": "Subject", "Subject": "Subject",
"SubjectPlaceholder": "Please type a subject", "SubjectPlaceholder": "Please type a subject",
"Submit": "Submit", "Submit": "Submit",
"Subscribe": "Subscribe", "Subscribe": "Subscribe",
"SuccessfullySaved": "Successfully saved!", "SuccessfullySaved": "Successfully saved!",
"TagDeletionConfirmationMessage": "Are you sure to delete '{0}' tag?", "TagDeletionConfirmationMessage": "Are you sure to delete '{0}' tag?",
"Tags": "Tags", "Tags": "Tags",
"Text": "Text", "Text": "Text",
"ThankYou": "Thank you", "ThankYou": "Thank you",
"Title": "Title", "Title": "Title",
"Undo": "Undo", "Undo": "Undo",
"Update": "Update", "Update": "Update",
"UpdatePreferenceSuccessMessage": "Your preferences have been saved.", "UpdatePreferenceSuccessMessage": "Your preferences have been saved.",
"UpdateYourEmailPreferences": "Update your email preferences", "UpdateYourEmailPreferences": "Update your email preferences",
"UnMakeMainMenu": "Unmake Main Menu", "UnMakeMainMenu": "Unmake Main Menu",
"UploadFailedMessage": "Upload failed.", "UploadFailedMessage": "Upload failed.",
"UserId": "User Id", "UserId": "User Id",
"Username": "Username", "Username": "Username",
"YourComment": "Your comment", "YourComment": "Your comment",
"YourEmailAddress": "Your e-mail address", "YourEmailAddress": "Your e-mail address",
"YourFullName": "Your full name", "YourFullName": "Your full name",
"YourMessage": "Your Message", "YourMessage": "Your Message",
"YourReply": "Your reply", "YourReply": "Your reply",
"MarkdownSupported": "<a href=\"https://www.markdownguide.org/basic-syntax/\">Markdown</a> supported.", "MarkdownSupported": "<a href=\"https://www.markdownguide.org/basic-syntax/\">Markdown</a> supported.",
"GlobalResources": "Global Resources", "GlobalResources": "Global Resources",
"SavedSuccessfully": "Saved successfully", "SavedSuccessfully": "Saved successfully",
"CmsKit.BlogPost.Status.0": "Draft", "CmsKit.BlogPost.Status.0": "Draft",
"CmsKit.BlogPost.Status.1": "Published", "CmsKit.BlogPost.Status.1": "Published",
"CmsKit.BlogPost.Status.2": "Waiting for review", "CmsKit.BlogPost.Status.2": "Waiting for review",
"BlogPostPublishConfirmationMessage": "Are you sure to publish the blog post \"{0}\"?", "BlogPostPublishConfirmationMessage": "Are you sure to publish the blog post \"{0}\"?",
"SuccessfullyPublished": "Successfully published!", "SuccessfullyPublished": "Successfully published!",
"Draft": "Draft", "Draft": "Draft",
"Publish": "Publish", "Publish": "Publish",
"BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?", "BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?",
"BlogPostSendToReviewConfirmationMessage": "Are you sure to send the blog post \"{0}\" to admin review for publishing?", "BlogPostSendToReviewConfirmationMessage": "Are you sure to send the blog post \"{0}\" to admin review for publishing?",
"SaveAsDraft": "Save as draft", "SaveAsDraft": "Save as draft",
"SendToReview": "Send to review", "SendToReview": "Send to review",
"SendToReviewToPublish": "Send to review to publish", "SendToReviewToPublish": "Send to review to publish",
"BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing.", "BlogPostSendToReviewSuccessMessage": "The blog post \"{0}\" has been sent to admin review for publishing.",
"HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list.", "HasBlogPostWaitingForReviewMessage": "You have a blog post waiting for review. Click to list.",
"SelectAStatus": "Select a status", "SelectAStatus": "Select a status",
"Status": "Status", "Status": "Status",
"CmsKit.BlogPost.ScrollIndex": "Quick navigation bar in blog posts", "CmsKit.BlogPost.ScrollIndex": "Quick navigation bar in blog posts",
"Add": "Add", "CmsKit.BlogPost.PreventXssFeature": "Prevent XSS",
"AddWidget": "Add Widget", "Add": "Add",
"PleaseConfigureWidgets": "Please configure widgets", "AddWidget": "Add Widget",
"SelectAnAuthor": "Select an Author", "PleaseConfigureWidgets": "Please configure widgets",
"InThisDocument": "In This Document", "SelectAnAuthor": "Select an Author",
"GoToTop": "Go To Top", "InThisDocument": "In This Document",
"SetAsHomePage": "Change Home Page Status", "GoToTop": "Go To Top",
"CompletedSettingAsHomePage": "Set as home page", "SetAsHomePage": "Change Home Page Status",
"IsHomePage": "Is Home Page", "CompletedSettingAsHomePage": "Set as home page",
"RemovedSettingAsHomePage": "Removed setting the home page", "IsHomePage": "Is Home Page",
"Feature:CmsKitGroup": "Cms Kit", "RemovedSettingAsHomePage": "Removed setting the home page",
"Feature:BlogEnable": "Blogpost", "Feature:CmsKitGroup": "Cms Kit",
"Feature:BlogEnableDescription": "CMS Kit's blogpost system that allows create blogs and posts dynamically in the application.", "Feature:BlogEnable": "Blogpost",
"Feature:CommentEnable": "Commenting", "Feature:BlogEnableDescription": "CMS Kit's blogpost system that allows create blogs and posts dynamically in the application.",
"Feature:CommentEnableDescription": "CMS Kit's comment system allows commenting on entities such as BlogPost.", "Feature:CommentEnable": "Commenting",
"Feature:GlobalResourceEnable": "Global resourcing", "Feature:CommentEnableDescription": "CMS Kit's comment system allows commenting on entities such as BlogPost.",
"Feature:GlobalResourceEnableDescription": "CMS Kit's global resoruces feature that allows managing global styles & scripts.", "Feature:GlobalResourceEnable": "Global resourcing",
"Feature:MenuEnable": "Menu", "Feature:GlobalResourceEnableDescription": "CMS Kit's global resoruces feature that allows managing global styles & scripts.",
"Feature:MenuEnableDescription": "CMS Kit's dynamic menu system that allows adding/removing application menus dynamically.", "Feature:MenuEnable": "Menu",
"Feature:PageEnable": "Paging", "Feature:MenuEnableDescription": "CMS Kit's dynamic menu system that allows adding/removing application menus dynamically.",
"Feature:PageEnableDescription": "CMS Kit's page system that allows creating static pages with specific URL.", "Feature:PageEnable": "Paging",
"Feature:RatingEnable": "Rating", "Feature:PageEnableDescription": "CMS Kit's page system that allows creating static pages with specific URL.",
"Feature:RatingEnableDescription": "CMS Kit's rating system that allows users to rate entities such as BlogPost.", "Feature:RatingEnable": "Rating",
"Feature:ReactionEnable": "Reaction", "Feature:RatingEnableDescription": "CMS Kit's rating system that allows users to rate entities such as BlogPost.",
"Feature:ReactionEnableDescription": "CMS Kit's reaction system that allows users to send reactions to entities such as BlogPost, Comments, etc.", "Feature:ReactionEnable": "Reaction",
"Feature:TagEnable": "Taging", "Feature:ReactionEnableDescription": "CMS Kit's reaction system that allows users to send reactions to entities such as BlogPost, Comments, etc.",
"Feature:TagEnableDescription": "CMS Kit's tag system that allows tagging entities such as BlogPost.", "Feature:TagEnable": "Taging",
"DeleteBlogPostMessage": "The blog will be deleted. Are you sure?", "Feature:TagEnableDescription": "CMS Kit's tag system that allows tagging entities such as BlogPost.",
"CaptchaCode": "Captcha code", "DeleteBlogPostMessage": "The blog will be deleted. Are you sure?",
"CommentTextRequired": "Comment is required", "CaptchaCode": "Captcha code",
"CaptchaCodeErrorMessage": "The answer you entered for the CAPTCHA was not correct. Please try again", "CommentTextRequired": "Comment is required",
"CaptchaCodeMissingMessage": "The captcha code is missing!", "CaptchaCodeErrorMessage": "The answer you entered for the CAPTCHA was not correct. Please try again",
"UnAllowedExternalUrlMessage": "You included an unallowed external URL. Please try again without the external URL.", "CaptchaCodeMissingMessage": "The captcha code is missing!",
"URL": "URL", "UnAllowedExternalUrlMessage": "You included an unallowed external URL. Please try again without the external URL.",
"PopularTags": "Popular Tags", "URL": "URL",
"RemoveCoverImageConfirmationMessage": "Are you sure you want to remove the cover image?", "PopularTags": "Popular Tags",
"RemoveCoverImage": "Remove cover image", "RemoveCoverImageConfirmationMessage": "Are you sure you want to remove the cover image?",
"CssClass": "CSS Class", "RemoveCoverImage": "Remove cover image",
"TagsHelpText": "Tags should be comma-separated (e.g.: tag1, tag2, tag3)" "CssClass": "CSS Class",
} "TagsHelpText": "Tags should be comma-separated (e.g.: tag1, tag2, tag3)"
}
} }

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/es.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Calificaciones", "CmsKit.Ratings": "Calificaciones",
"CmsKit.Reactions": "Reacciones", "CmsKit.Reactions": "Reacciones",
"CmsKit.Tags": "Etiquetas", "CmsKit.Tags": "Etiquetas",
"CmsKit.BlogPost.PreventXssFeature": "Prevenir ataques XSS",
"CmsKit:0002": "¡El contenido ya existe!", "CmsKit:0002": "¡El contenido ya existe!",
"CmsKit:0003": "La entidad {0} no se puede etiquetar.", "CmsKit:0003": "La entidad {0} no se puede etiquetar.",
"CmsKit:Blog:0001": "¡La babosa dada ({Slug}) ya existe!", "CmsKit:Blog:0001": "¡La babosa dada ({Slug}) ya existe!",

3
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fa.json

@ -181,6 +181,7 @@
"HasBlogPostWaitingForReviewMessage": "شما یک پست وبلاگ دارید که منتظر بررسی است. برای لیست کلیک کنید.", "HasBlogPostWaitingForReviewMessage": "شما یک پست وبلاگ دارید که منتظر بررسی است. برای لیست کلیک کنید.",
"SelectAStatus": "انتخاب وضعیت", "SelectAStatus": "انتخاب وضعیت",
"Status": "وضعیت", "Status": "وضعیت",
"CmsKit.BlogPost.ScrollIndex": "نوار پیمایش سریع در پست های وبلاگ" "CmsKit.BlogPost.ScrollIndex": "نوار پیمایش سریع در پست های وبلاگ",
"CmsKit.BlogPost.PreventXssFeature": "جلوگیری از XSS"
} }
} }

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fi.json

@ -185,6 +185,7 @@
"SelectAStatus": "Valitse tila", "SelectAStatus": "Valitse tila",
"Status": "Tila", "Status": "Tila",
"CmsKit.BlogPost.ScrollIndex": "Pikanavigointipalkki blogikirjoituksissa", "CmsKit.BlogPost.ScrollIndex": "Pikanavigointipalkki blogikirjoituksissa",
"CmsKit.BlogPost.PreventXssFeature": "Estä XSS",
"Add": "Lisää", "Add": "Lisää",
"AddWidget": "Lisää widget", "AddWidget": "Lisää widget",
"PleaseConfigureWidgets": "Määritä widgetit", "PleaseConfigureWidgets": "Määritä widgetit",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Évaluations", "CmsKit.Ratings": "Évaluations",
"CmsKit.Reactions": "Réactions", "CmsKit.Reactions": "Réactions",
"CmsKit.Tags": "Mots clés", "CmsKit.Tags": "Mots clés",
"CmsKit.BlogPost.PreventXssFeature": "Empêcher les attaques XSS",
"CmsKit:0002": "Le contenu existe déjà!", "CmsKit:0002": "Le contenu existe déjà!",
"CmsKit:0003": "L'entité {0} ne peut pas être taguée.", "CmsKit:0003": "L'entité {0} ne peut pas être taguée.",
"CmsKit:Blog:0001": "Le slug donné ({Slug}) existe déjà!", "CmsKit:Blog:0001": "Le slug donné ({Slug}) existe déjà!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hi.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "रेटिंग्स", "CmsKit.Ratings": "रेटिंग्स",
"CmsKit.Reactions": "प्रतिक्रियाओं", "CmsKit.Reactions": "प्रतिक्रियाओं",
"CmsKit.Tags": "टैग", "CmsKit.Tags": "टैग",
"CmsKit.BlogPost.PreventXssFeature": "XSS रोकें",
"CmsKit:0002": "सामग्री पहले से मौजूद है!", "CmsKit:0002": "सामग्री पहले से मौजूद है!",
"CmsKit:0003": "इकाई {0} टैग करने योग्य नहीं है।", "CmsKit:0003": "इकाई {0} टैग करने योग्य नहीं है।",
"CmsKit:Blog:0001": "दिया गया स्लग ({Slug}) पहले से मौजूद है!", "CmsKit:Blog:0001": "दिया गया स्लग ({Slug}) पहले से मौजूद है!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/hu.json

@ -182,6 +182,7 @@
"SelectAStatus": "Válasszon állapotot", "SelectAStatus": "Válasszon állapotot",
"Status": "Állapot", "Status": "Állapot",
"CmsKit.BlogPost.ScrollIndex": "Gyors navigációs sáv a blogbejegyzésekben", "CmsKit.BlogPost.ScrollIndex": "Gyors navigációs sáv a blogbejegyzésekben",
"CmsKit.BlogPost.PreventXssFeature": "XSS megelőzése",
"Add": "Hozzáadás", "Add": "Hozzáadás",
"AddWidget": "Widget hozzáadása", "AddWidget": "Widget hozzáadása",
"PleaseConfigureWidgets": "Kérjük, állítsa be a widgeteket", "PleaseConfigureWidgets": "Kérjük, állítsa be a widgeteket",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/is.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Skor", "CmsKit.Ratings": "Skor",
"CmsKit.Reactions": "Viðbrögð", "CmsKit.Reactions": "Viðbrögð",
"CmsKit.Tags": "Tög", "CmsKit.Tags": "Tög",
"CmsKit.BlogPost.PreventXssFeature": "Fyrirbyggja XSS árásir",
"CmsKit:0002": "Efni nú þegar til!", "CmsKit:0002": "Efni nú þegar til!",
"CmsKit:0003": "Ekki hægt að tagga einingu {0}", "CmsKit:0003": "Ekki hægt að tagga einingu {0}",
"CmsKit:Blog:0001": "Uppgefin snigill ({Slug}) er þegar til!", "CmsKit:Blog:0001": "Uppgefin snigill ({Slug}) er þegar til!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/it.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Valutazioni", "CmsKit.Ratings": "Valutazioni",
"CmsKit.Reactions": "Reazioni", "CmsKit.Reactions": "Reazioni",
"CmsKit.Tags": "Tag", "CmsKit.Tags": "Tag",
"CmsKit.BlogPost.PreventXssFeature": "Prevenzione XSS",
"CmsKit:0002": "Il contenuto esiste già!", "CmsKit:0002": "Il contenuto esiste già!",
"CmsKit:0003": "L'entità {0} non è codificabile.", "CmsKit:0003": "L'entità {0} non è codificabile.",
"CmsKit:Blog:0001": "Lo slug specificato ({Slug}) esiste già!", "CmsKit:Blog:0001": "Lo slug specificato ({Slug}) esiste già!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/nl.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Beoordelingen", "CmsKit.Ratings": "Beoordelingen",
"CmsKit.Reactions": "Reacties", "CmsKit.Reactions": "Reacties",
"CmsKit.Tags": "Tags", "CmsKit.Tags": "Tags",
"CmsKit.BlogPost.PreventXssFeature": "XSS-functie voorkomen",
"CmsKit:0002": "Inhoud bestaat al!", "CmsKit:0002": "Inhoud bestaat al!",
"CmsKit:0003": "De entiteit {0} kan niet worden getagd.", "CmsKit:0003": "De entiteit {0} kan niet worden getagd.",
"CmsKit:Blog:0001": "De opgegeven slug ({Slug}) bestaat al!", "CmsKit:Blog:0001": "De opgegeven slug ({Slug}) bestaat al!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pl-PL.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Oceny", "CmsKit.Ratings": "Oceny",
"CmsKit.Reactions": "Reakcje", "CmsKit.Reactions": "Reakcje",
"CmsKit.Tags": "Tagi", "CmsKit.Tags": "Tagi",
"CmsKit.BlogPost.PreventXssFeature": "Zapobiegaj atakom XSS",
"CmsKit:0002": "Treść już istnieje!", "CmsKit:0002": "Treść już istnieje!",
"CmsKit:0003": "Jednostka {0} nie może być otagowana.", "CmsKit:0003": "Jednostka {0} nie może być otagowana.",
"CmsKit:Blog:0001": "Podany ślimak ({Slug}) już istnieje!", "CmsKit:Blog:0001": "Podany ślimak ({Slug}) już istnieje!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/pt-BR.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Avaliações", "CmsKit.Ratings": "Avaliações",
"CmsKit.Reactions": "Reações", "CmsKit.Reactions": "Reações",
"CmsKit.Tags": "Tag", "CmsKit.Tags": "Tag",
"CmsKit.BlogPost.PreventXssFeature": "Prevenir recurso XSS",
"CmsKit:0002": "O conteúdo já existe!", "CmsKit:0002": "O conteúdo já existe!",
"CmsKit:0003": "A entidade {0} não pode ser etiquetada.", "CmsKit:0003": "A entidade {0} não pode ser etiquetada.",
"CmsKit:Blog:0001": "O slug fornecido ({Slug}) já existe!", "CmsKit:Blog:0001": "O slug fornecido ({Slug}) já existe!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ro-RO.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Evaluări", "CmsKit.Ratings": "Evaluări",
"CmsKit.Reactions": "Reacţii", "CmsKit.Reactions": "Reacţii",
"CmsKit.Tags": "Etichete", "CmsKit.Tags": "Etichete",
"CmsKit.BlogPost.PreventXssFeature": "Prevenirea Xss",
"CmsKit:0002": "Conţinutul există deja!", "CmsKit:0002": "Conţinutul există deja!",
"CmsKit:0003": "Entitatea {0} nu este etichetabilă.", "CmsKit:0003": "Entitatea {0} nu este etichetabilă.",
"CmsKit:Blog:0001": "Slugul ({Slug}) există deja!", "CmsKit:Blog:0001": "Slugul ({Slug}) există deja!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/ru.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Рейтинги", "CmsKit.Ratings": "Рейтинги",
"CmsKit.Reactions": "Реакции", "CmsKit.Reactions": "Реакции",
"CmsKit.Tags": "Теги", "CmsKit.Tags": "Теги",
"CmsKit.BlogPost.PreventXssFeature": "Защита от XSS",
"CmsKit:0002": "Контент уже существует!", "CmsKit:0002": "Контент уже существует!",
"CmsKit:0003": "Сущность {0} не может быть помечена.", "CmsKit:0003": "Сущность {0} не может быть помечена.",
"CmsKit:Blog:0001": "Указанный слаг ({Slug}) уже существует!", "CmsKit:Blog:0001": "Указанный слаг ({Slug}) уже существует!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sk.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Hodnotenia", "CmsKit.Ratings": "Hodnotenia",
"CmsKit.Reactions": "Reakcie", "CmsKit.Reactions": "Reakcie",
"CmsKit.Tags": "Tagy", "CmsKit.Tags": "Tagy",
"CmsKit.BlogPost.PreventXssFeature": "Zabraňte XSS",
"CmsKit:0002": "Obsah už existuje!", "CmsKit:0002": "Obsah už existuje!",
"CmsKit:0003": "Entite {0} nie je možné priradiť tag.", "CmsKit:0003": "Entite {0} nie je možné priradiť tag.",
"CmsKit:Blog:0001": "Zadaný slug ({Slug}) už existuje!", "CmsKit:Blog:0001": "Zadaný slug ({Slug}) už existuje!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/sl.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Ocene", "CmsKit.Ratings": "Ocene",
"CmsKit.Reactions": "Reakcije", "CmsKit.Reactions": "Reakcije",
"CmsKit.Tags": "Oznake", "CmsKit.Tags": "Oznake",
"CmsKit.BlogPost.PreventXssFeature": "Prepreči XSS",
"CmsKit:0002": "Vsebina že obstaja!", "CmsKit:0002": "Vsebina že obstaja!",
"CmsKit:0003": "Entiteta {0} ni mogoče označiti.", "CmsKit:0003": "Entiteta {0} ni mogoče označiti.",
"CmsKit:Blog:0001": "Podani polž ({Slug}) že obstaja!", "CmsKit:Blog:0001": "Podani polž ({Slug}) že obstaja!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json

@ -187,6 +187,7 @@
"RemoveCoverImageConfirmationMessage": "Kapak resmini kaldırmak istediğinize emin misiniz?", "RemoveCoverImageConfirmationMessage": "Kapak resmini kaldırmak istediğinize emin misiniz?",
"RemoveCoverImage": "Kapak resmini kaldır", "RemoveCoverImage": "Kapak resmini kaldır",
"CmsKit.BlogPost.ScrollIndex": "Blog yazılarında hızlı gezinme çubuğu", "CmsKit.BlogPost.ScrollIndex": "Blog yazılarında hızlı gezinme çubuğu",
"CmsKit.BlogPost.PreventXssFeature": "XSS önleme özelliği",
"Add": "Ekle", "Add": "Ekle",
"AddWidget": "Widget Ekle", "AddWidget": "Widget Ekle",
"PleaseConfigureWidgets": "Lütfen widget'leri yapılandırın", "PleaseConfigureWidgets": "Lütfen widget'leri yapılandırın",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/vi.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "Xếp hạng", "CmsKit.Ratings": "Xếp hạng",
"CmsKit.Reactions": "Phản ứng", "CmsKit.Reactions": "Phản ứng",
"CmsKit.Tags": "Thẻ", "CmsKit.Tags": "Thẻ",
"CmsKit.BlogPost.PreventXssFeature": "Ngăn chặn XSS",
"CmsKit:0002": "Nội dung đã tồn tại!", "CmsKit:0002": "Nội dung đã tồn tại!",
"CmsKit:0003": "Thực thể {0} không thể gắn thẻ.", "CmsKit:0003": "Thực thể {0} không thể gắn thẻ.",
"CmsKit:Blog:0001": "Sên đã cho ({Slug}) đã tồn tại!", "CmsKit:Blog:0001": "Sên đã cho ({Slug}) đã tồn tại!",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json

@ -185,6 +185,7 @@
"SelectAStatus": "选择一个状态", "SelectAStatus": "选择一个状态",
"Status": "状态", "Status": "状态",
"CmsKit.BlogPost.ScrollIndex": "博客文章快速导航栏", "CmsKit.BlogPost.ScrollIndex": "博客文章快速导航栏",
"CmsKit.BlogPost.PreventXssFeature": "防止XSS攻击",
"Add": "添加", "Add": "添加",
"AddWidget": "添加组件", "AddWidget": "添加组件",
"PleaseConfigureWidgets": "请配置组件", "PleaseConfigureWidgets": "请配置组件",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json

@ -15,6 +15,7 @@
"CmsKit.Ratings": "評分", "CmsKit.Ratings": "評分",
"CmsKit.Reactions": "反應", "CmsKit.Reactions": "反應",
"CmsKit.Tags": "標籤", "CmsKit.Tags": "標籤",
"CmsKit.BlogPost.PreventXssFeature": "防止XSS攻擊",
"CmsKit:0002": "內容已經存在!", "CmsKit:0002": "內容已經存在!",
"CmsKit:0003": "實體 {0} 不可標記.", "CmsKit:0003": "實體 {0} 不可標記.",
"CmsKit:Blog:0001": "給定的slug ({Slug}) 已經存在!", "CmsKit:Blog:0001": "給定的slug ({Slug}) 已經存在!",

15
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/DefaultBlogFeatureProvider.cs

@ -11,12 +11,13 @@ public class DefaultBlogFeatureProvider : IDefaultBlogFeatureProvider, ITransien
public virtual Task<List<BlogFeature>> GetDefaultFeaturesAsync(Guid blogId) public virtual Task<List<BlogFeature>> GetDefaultFeaturesAsync(Guid blogId)
{ {
return Task.FromResult(new List<BlogFeature> return Task.FromResult(new List<BlogFeature>
{ {
new BlogFeature(blogId, CommentsFeature.Name), new BlogFeature(blogId, CommentsFeature.Name),
new BlogFeature(blogId, ReactionsFeature.Name), new BlogFeature(blogId, ReactionsFeature.Name),
new BlogFeature(blogId, RatingsFeature.Name), new BlogFeature(blogId, RatingsFeature.Name),
new BlogFeature(blogId, TagsFeature.Name), new BlogFeature(blogId, TagsFeature.Name),
new BlogFeature(blogId, BlogPostScrollIndexFeature.Name) new BlogFeature(blogId, BlogPostScrollIndexFeature.Name),
}); new BlogFeature(blogId, BlogConsts.PreventXssFeatureName)
});
} }
} }

2
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/Default.cshtml

@ -204,7 +204,7 @@
{ {
@foreach (var reply in comment.Replies) @foreach (var reply in comment.Replies)
{ {
<div class="bg-light card p-3 mx-0 mt-3"> <div class="comment-container card p-3 mx-0 mt-3">
<div class="comment"> <div class="comment">
<h5> <h5>
@GetCommentTitle(reply.Author, reply.CreationTime).Invoke(null) @GetCommentTitle(reply.Author, reply.CreationTime).Invoke(null)

24
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml

@ -69,7 +69,9 @@
</p> </p>
@(await Component.InvokeAsync(typeof(ContentFragmentViewComponent), new DefaultContentDto @(await Component.InvokeAsync(typeof(ContentFragmentViewComponent), new DefaultContentDto
{ {
ContentFragments = Model.ViewModel.ContentFragments ContentFragments = Model.ViewModel.ContentFragments,
AllowHtmlTags = true,
PreventXSS = Model.PreventXssFeature.IsEnabled,
})) }))
<p class="mb-3"> <p class="mb-3">
@if (Model.ViewModel.LastModificationTime != null) @if (Model.ViewModel.LastModificationTime != null)
@ -137,19 +139,19 @@
} }
@if (isScrollIndexEnabled) @if (isScrollIndexEnabled)
{ {
<div id="scroll-index" class="docs-inner-anchors mt-2"> <div id="scroll-index" class="docs-inner-anchors mt-2">
<h5>@L["InThisDocument"]</h5> <h5>@L["InThisDocument"]</h5>
<nav id="blog-post-sticky-index" class="navbar index-scroll pt-0"> <nav id="blog-post-sticky-index" class="navbar index-scroll pt-0">
</nav> </nav>
<div class="row"> <div class="row">
<div class="col p-0 py-3"> <div class="col p-0 py-3">
<a href="#" class="scroll-top-btn"> <a href="#" class="scroll-top-btn">
<i class="fa fa-chevron-up"></i> @L["GoToTop"] <i class="fa fa-chevron-up"></i> @L["GoToTop"]
</a> </a>
</div>
</div> </div>
</div> </div>
</div>
} }
</div> </div>

4
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/BlogPost.cshtml.cs

@ -29,6 +29,8 @@ public class BlogPostModel : CmsKitPublicPageModelBase
public BlogFeatureDto BlogPostScrollIndexFeature { get; private set; } public BlogFeatureDto BlogPostScrollIndexFeature { get; private set; }
public BlogFeatureDto PreventXssFeature { get; private set; }
protected IBlogPostPublicAppService BlogPostPublicAppService { get; } protected IBlogPostPublicAppService BlogPostPublicAppService { get; }
protected IBlogFeatureAppService BlogFeatureAppService { get; } protected IBlogFeatureAppService BlogFeatureAppService { get; }
@ -81,6 +83,8 @@ public class BlogPostModel : CmsKitPublicPageModelBase
BlogPostScrollIndexFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.BlogPostScrollIndexFeature.Name); BlogPostScrollIndexFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, GlobalFeatures.BlogPostScrollIndexFeature.Name);
} }
PreventXssFeature = await BlogFeatureAppService.GetOrDefaultAsync(ViewModel.BlogId, BlogConsts.PreventXssFeatureName);
return Page(); return Page();
} }
} }

23
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Pages/Index.cshtml

@ -7,23 +7,30 @@
@section styles{ @section styles{
<abp-style src="/Pages/Public/CmsKit/Pages/index.css" /> <abp-style src="/Pages/Public/CmsKit/Pages/index.css" />
@if (!Model.ViewModel.Style.IsNullOrEmpty())
<style> {
@Html.Raw(Model.ViewModel.Style) <style>
</style> @Html.Raw(Model.ViewModel.Style)
</style>
}
} }
@section scripts{ @section scripts{
<script> @if (!Model.ViewModel.Script.IsNullOrEmpty())
@Html.Raw(Model.ViewModel.Script) {
</script> <script>
@Html.Raw(Model.ViewModel.Script)
</script>
}
} }
<abp-card> <abp-card>
<abp-card-body> <abp-card-body>
@(await Component.InvokeAsync(typeof(ContentFragmentViewComponent), new DefaultContentDto @(await Component.InvokeAsync(typeof(ContentFragmentViewComponent), new DefaultContentDto
{ {
ContentFragments = Model.ViewModel.ContentFragments ContentFragments = Model.ViewModel.ContentFragments,
PreventXSS = false,
AllowHtmlTags = true,
})) }))
</abp-card-body> </abp-card-body>
</abp-card> </abp-card>

2
npm/ng-packs/package.json

@ -34,7 +34,7 @@
"build:schematics": "cd scripts && yarn && yarn build:schematics && cd ..", "build:schematics": "cd scripts && yarn && yarn build:schematics && cd ..",
"dev:schematics": "tsc -p packages/schematics/tsconfig.json -w", "dev:schematics": "tsc -p packages/schematics/tsconfig.json -w",
"mock:schematics": "cd scripts/mock-schematic && yarn && yarn start", "mock:schematics": "cd scripts/mock-schematic && yarn && yarn start",
"debug:schematics": "./node_modules/.bin/ng g ./packages/schematics/src/collection.json:proxy-add --module __default --apiName __default --source __default --target __default --url https://localhost:44305 --serviceType application --entryPoint __default ", "debug:schematics": "./node_modules/.bin/nx g ./packages/schematics/src/collection.json:proxy-add --module identity --apiName __default --source __default --target __default --url https://localhost:44305 --serviceType application --entryPoint __default ",
"debug:schematics-dist": "./node_modules/.bin/ng g ./dist/packages/schematics/collection.json:proxy-add --module __default --apiName __default --source __default --target __default --url http://localhost:4300 --service-type application --entryPoint __default", "debug:schematics-dist": "./node_modules/.bin/ng g ./dist/packages/schematics/collection.json:proxy-add --module __default --apiName __default --source __default --target __default --url http://localhost:4300 --service-type application --entryPoint __default",
"ci": "yarn affected:lint && yarn affected:build && yarn affected:test", "ci": "yarn affected:lint && yarn affected:build && yarn affected:test",
"lerna": "lerna", "lerna": "lerna",

5
npm/ng-packs/packages/generators/generators.json

@ -9,6 +9,11 @@
"factory": "./src/generators/update-version/generator", "factory": "./src/generators/update-version/generator",
"schema": "./src/generators/update-version/schema.json", "schema": "./src/generators/update-version/schema.json",
"description": "update-version generator" "description": "update-version generator"
},
"change-theme": {
"factory": "./src/generators/change-theme/generator",
"schema": "./src/generators/change-theme/schema.json",
"description": "change-theme generator"
} }
} }
} }

20
npm/ng-packs/packages/generators/src/generators/change-theme/generator.spec.ts

@ -0,0 +1,20 @@
import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
import { Tree, readProjectConfiguration } from '@nx/devkit';
import { changeThemeGenerator } from './generator';
import { ChangeThemeGeneratorSchema } from './schema';
describe('change-theme generator', () => {
let tree: Tree;
const options: ChangeThemeGeneratorSchema = { name: 'test' };
beforeEach(() => {
tree = createTreeWithEmptyWorkspace();
});
it('should run successfully', async () => {
await changeThemeGenerator(tree, options);
const config = readProjectConfiguration(tree, 'test');
expect(config).toBeDefined();
});
});

26
npm/ng-packs/packages/generators/src/generators/change-theme/generator.ts

@ -0,0 +1,26 @@
import { Tree } from '@nx/devkit';
import { wrapAngularDevkitSchematic } from '@nx/devkit/ngcli-adapter';
import { ChangeThemeGeneratorSchema } from './schema';
import { ThemeOptionsEnum } from './theme-options.enum';
export async function changeThemeGenerator(host: Tree, schema: ChangeThemeGeneratorSchema) {
const schematicPath = schema.localPath || '@abp/ng.schematics';
const runAngularLibrarySchematic = wrapAngularDevkitSchematic(
schema.localPath ? `${host.root}${schematicPath}` : schematicPath,
'change-theme',
);
await runAngularLibrarySchematic(host, {
...schema,
});
return () => {
const destTheme = Object.values(ThemeOptionsEnum).find(
(theme, index) => index + 1 === schema.name,
);
console.log(`✅️ Switched to Theme ${destTheme}`);
};
}
export default changeThemeGenerator;

3
npm/ng-packs/packages/generators/src/generators/change-theme/index.ts

@ -0,0 +1,3 @@
export * from './theme-options.enum';
export * from './schema';
export * from './generator';

5
npm/ng-packs/packages/generators/src/generators/change-theme/schema.d.ts

@ -0,0 +1,5 @@
export interface ChangeThemeGeneratorSchema {
name: number;
targetOption: string;
localPath?: string;
}

41
npm/ng-packs/packages/generators/src/generators/change-theme/schema.json

@ -0,0 +1,41 @@
{
"$schema": "http://json-schema.org/schema",
"$id": "SchematicsABPThemeChanger",
"title": "ABP Theme Style Generator API Schema",
"type": "object",
"properties": {
"name": {
"description": "The name of theme will change.",
"type": "number",
"$default": {
"$source": "argv",
"index": 0
},
"enum": [1, 2, 3, 4],
"x-prompt": {
"message": "Which theme would you like to use?",
"type": "list",
"items": [
{ "value": 1, "label": "Basic" },
{ "value": 2, "label": "Lepton" },
{ "value": 3, "label": "LeptonXLite" },
{ "value": 4, "label": "LeptonX" }
]
}
},
"targetProject": {
"description": "The name of the project will change the style.The project type must be 'application'",
"type": "string",
"x-prompt": "Please enter the project name",
"$default": {
"$source": "argv",
"index": 1
}
},
"localPath": {
"description": "If set value schematics will work on given path",
"type": "string"
}
},
"required": ["name", "targetProject"]
}

8
npm/ng-packs/packages/generators/src/generators/change-theme/theme-options.enum.ts

@ -0,0 +1,8 @@
// this enum create by https://raw.githubusercontent.com/abpframework/abp/rel-7.4/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Theme.cs
export enum ThemeOptionsEnum {
Basic = 1,
Lepton = 2,
LeptonXLite = 3,
LeptonX = 4,
}

4
npm/ng-packs/packages/generators/src/index.ts

@ -1 +1,3 @@
export * from './generators/generate-proxy' export * from './generators/change-theme';
export * from './generators/generate-proxy';
export * from './generators/update-version';

156
npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts

@ -1,10 +1,17 @@
import { Rule, SchematicsException } from '@angular-devkit/schematics';
import { isLibrary, updateWorkspace, WorkspaceDefinition } from '../../utils';
import { allStyles, styleMap } from './style-map';
import { ProjectDefinition } from '@angular-devkit/core/src/workspace';
import { JsonArray, JsonValue } from '@angular-devkit/core'; import { JsonArray, JsonValue } from '@angular-devkit/core';
import { Rule, SchematicsException, Tree, chain } from '@angular-devkit/schematics';
import { ProjectDefinition } from '@angular-devkit/core/src/workspace';
import * as ts from 'typescript';
import { allStyles, importMap, styleMap } from './style-map';
import { ChangeThemeOptions } from './model'; import { ChangeThemeOptions } from './model';
import { Change, InsertChange, isLibrary, updateWorkspace, WorkspaceDefinition } from '../../utils';
import { ThemeOptionsEnum } from './theme-options.enum'; import { ThemeOptionsEnum } from './theme-options.enum';
import {
addImportToModule,
findNodes,
getDecoratorMetadata,
getMetadataField,
} from '../../utils/angular/ast-utils';
export default function (_options: ChangeThemeOptions): Rule { export default function (_options: ChangeThemeOptions): Rule {
return async () => { return async () => {
@ -14,9 +21,12 @@ export default function (_options: ChangeThemeOptions): Rule {
throw new SchematicsException('The theme name does not selected'); throw new SchematicsException('The theme name does not selected');
} }
return updateWorkspace(storedWorkspace => { return chain([
updateProjectStyle(selectedProject, storedWorkspace, targetThemeName); updateWorkspace(storedWorkspace => {
}); updateProjectStyle(selectedProject, storedWorkspace, targetThemeName);
}),
updateAppModule(selectedProject, targetThemeName),
]);
}; };
} }
@ -48,6 +58,138 @@ function updateProjectStyle(
targetOption.styles = [...newStyles, ...sanitizedStyles] as JsonArray; targetOption.styles = [...newStyles, ...sanitizedStyles] as JsonArray;
} }
function updateAppModule(selectedProject: string, targetThemeName: ThemeOptionsEnum): Rule {
return (host: Tree) => {
const angularJSON = host.read('angular.json');
if (!angularJSON) {
throw new SchematicsException('The angular.json does not found');
}
const workspace = JSON.parse(angularJSON.toString());
const project = workspace.projects[selectedProject];
if (!project || !project.sourceRoot) {
throw new SchematicsException('The target project does not found');
}
const appModulePath = project.sourceRoot + '/app/app.module.ts';
return chain([
removeImportPath(appModulePath, targetThemeName),
removeImportFromNgModuleMetadata(appModulePath, targetThemeName),
insertImports(appModulePath, targetThemeName),
]);
};
}
function removeImportPath(appModulePath: string, selectedTheme: ThemeOptionsEnum): Rule {
return (host: Tree) => {
const recorder = host.beginUpdate(appModulePath);
const sourceText = host.read(appModulePath)?.toString('utf-8');
const source = ts.createSourceFile(
appModulePath,
sourceText!,
ts.ScriptTarget.Latest,
true,
ts.ScriptKind.TS,
);
const impMap = Array.from(importMap.values())
.filter(f => f !== importMap.get(selectedTheme))
.reduce((acc, val) => [...acc, ...val], []);
const nodes = findNodes(source, ts.isImportDeclaration);
const filteredNodes = nodes.filter(n => impMap.some(f => n.getFullText().match(f.path)));
if (!filteredNodes || filteredNodes.length < 1) {
return;
}
filteredNodes.map(importPath =>
recorder.remove(importPath.getStart(), importPath.getWidth() + 1),
);
host.commitUpdate(recorder);
return host;
};
}
function removeImportFromNgModuleMetadata(
appModulePath: string,
selectedTheme: ThemeOptionsEnum,
): Rule {
return (host: Tree) => {
const recorder = host.beginUpdate(appModulePath);
const sourceText = host.read(appModulePath)?.toString('utf-8');
const source = ts.createSourceFile(
appModulePath,
sourceText!,
ts.ScriptTarget.Latest,
true,
ts.ScriptKind.TS,
);
const impMap = Array.from(importMap.values())
.filter(f => f !== importMap.get(selectedTheme))
.reduce((acc, val) => [...acc, ...val], []);
const node = getDecoratorMetadata(source, 'NgModule', '@angular/core')[0] || {};
if (!node) {
throw new SchematicsException('The app module does not found');
}
const matchingProperties = getMetadataField(node as ts.ObjectLiteralExpression, 'imports');
const assignment = matchingProperties[0] as ts.PropertyAssignment;
const assignmentInit = assignment.initializer as ts.ArrayLiteralExpression;
const elements = assignmentInit.elements;
if (!elements || elements.length < 1) {
return;
}
const filteredElements = elements.filter(f =>
impMap.some(s => f.getText().match(s.importName)),
);
if (!filteredElements || filteredElements.length < 1) {
return;
}
filteredElements.map(willRemoveModule =>
recorder.remove(willRemoveModule.getStart(), willRemoveModule.getWidth() + 1),
);
host.commitUpdate(recorder);
return host;
};
}
function insertImports(appModulePath: string, selectedTheme: ThemeOptionsEnum): Rule {
return (host: Tree) => {
const recorder = host.beginUpdate(appModulePath);
const sourceText = host.read(appModulePath)?.toString('utf-8');
const source = ts.createSourceFile(
appModulePath,
sourceText!,
ts.ScriptTarget.Latest,
true,
ts.ScriptKind.TS,
);
const selected = importMap.get(selectedTheme);
const changes: Change[] = [];
selected!.map(({ importName, path }) =>
changes.push(...addImportToModule(source, appModulePath, importName, path)),
);
if (changes.length > 0) {
for (const change of changes) {
if (change instanceof InsertChange) {
recorder.insertLeft(change.pos, change.toAdd);
}
}
}
host.commitUpdate(recorder);
return host;
};
}
export function getProjectTargetOptions( export function getProjectTargetOptions(
project: ProjectDefinition, project: ProjectDefinition,
buildTarget: string, buildTarget: string,

51
npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts

@ -8,6 +8,11 @@ export type StyleDefinition =
} }
| string; | string;
export type ImportDefinition = {
path: string;
importName: string;
};
export const styleMap = new Map<ThemeOptionsEnum, StyleDefinition[]>(); export const styleMap = new Map<ThemeOptionsEnum, StyleDefinition[]>();
styleMap.set(ThemeOptionsEnum.Basic, [ styleMap.set(ThemeOptionsEnum.Basic, [
@ -241,3 +246,49 @@ styleMap.set(ThemeOptionsEnum.LeptonXLite, [
]); ]);
// the code written by Github co-pilot. thank go-pilot. You are the best sidekick. // the code written by Github co-pilot. thank go-pilot. You are the best sidekick.
export const allStyles = Array.from(styleMap.values()).reduce((acc, val) => [...acc, ...val], []); export const allStyles = Array.from(styleMap.values()).reduce((acc, val) => [...acc, ...val], []);
export const importMap = new Map<ThemeOptionsEnum, ImportDefinition[]>();
importMap.set(ThemeOptionsEnum.Basic, [
{
path: '@abp/ng.theme.basic',
importName: 'ThemeBasicModule.forRoot()',
},
]);
importMap.set(ThemeOptionsEnum.Lepton, [
{
path: '@volo/abp.ng.theme.lepton',
importName: 'ThemeLeptonModule.forRoot()',
},
]);
importMap.set(ThemeOptionsEnum.LeptonXLite, [
{
path: '@abp/ng.theme.lepton-x',
importName: 'ThemeLeptonXModule.forRoot()',
},
{
path: '@abp/ng.theme.lepton-x/layouts',
importName: 'SideMenuLayoutModule.forRoot()',
},
{
path: '@abp/ng.theme.lepton-x/account',
importName: 'AccountLayoutModule.forRoot()',
},
]);
importMap.set(ThemeOptionsEnum.LeptonX, [
{
path: '@volosoft/abp.ng.theme.lepton-x',
importName: 'ThemeLeptonXModule.forRoot()',
},
{
path: '@volosoft/abp.ng.theme.lepton-x/layouts',
importName: 'SideMenuLayoutModule.forRoot()',
},
{
path: '@volosoft/abp.ng.theme.lepton-x/account',
importName: 'AccountLayoutModule.forRoot()',
},
]);

1
npm/ng-packs/packages/schematics/src/utils/angular/ast-utils.ts

@ -446,7 +446,6 @@ export function addSymbolToNgModuleMetadata(
toInsert = `, ${symbolName}`; toInsert = `, ${symbolName}`;
} }
} }
if (importPath !== null) { if (importPath !== null) {
return [ return [
new InsertChange(ngModulePath, position, toInsert), new InsertChange(ngModulePath, position, toInsert),

129
npm/packs/zxcvbn/README.md

@ -0,0 +1,129 @@
## ℹ️ Description
ABP Framework is a complete open-source infrastructure to create modern web applications by following the best practices and conventions of software development. This package is a part of the [ABP Framework](https://abp.io) and contains client-side files.
For more information, check out the below links:
🔗Official Website: https://abp.io
🔗Commercial Website: https://commercial.abp.io
🔗Commercial Demo: https://commercial.abp.io/demo
🔗GitHub Repository: https://github.com/abpframework/abp
🔗Official Theme: https://www.LeptonTheme.com
🔗Documentation: https://docs.abp.io
🔗Community: https://community.abp.io
🔗Blog: https://blog.abp.io
🔗Books: https://abp.io/books
🔗Twitter: https://twitter.com/abpframework
🔗Discord: https://community.abp.io/discord
🔗Stackoverflow: https://stackoverflow.com/questions/tagged/abp
🔗YouTube: https://www.youtube.com/@Volosoft
## 🤔 Why ABP Platform?
Why should you use the ABP.IO Platform instead of creating a new solution from scratch?
You can find the answer here 👉🏻 [Why ABP Platform?](https://docs.abp.io/en/commercial/latest/why-abp-io-platform)
## 🚀 Key Features of the ABP Framework
🟡 Modularity
🟡 Multi-Tenancy
🟡 Bootstrap Tag Helpers
🟡 Dynamic Forms
🟡 Authentication
🟡 Authorization
🟡 Distributed Event Bus
🟡 BLOB Storing
🟡 Text Templating
🟡 Tooling: ABP CLI
🟡 Cross-Cutting Concerns
🟡 Bundling & Minification
🟡 Virtual File System
🟡 Theming
🟡 Background Jobs
🟡 DDD Infrastructure
🟡 Auto REST APIs
🟡 Dynamic Client Proxies
🟡 Multiple Database Providers
🟡 Data filtering
🟡 Test Infrastructure
🟡 Audit Logging
🟡 Object to Object Mapping
🟡 Email & SMS Abstractions
🟡 Localization
🟡 Setting Management
🟡 Extension Methods
🟡 Aspect Oriented Programming
🟡 Dependency Injection
## 🧐 How It Works?
The following page explains how you use the ABP.IO Platform as a .NET developer 👉 [How it works?](https://commercial.abp.io/how-it-works)
### 📘 Supported Database Providers
🔵 Entity Framework Core
🔵 MongoDB
🔵 Dapper
### 🎴 Supported UI Frameworks
🔵 Angular
🔵 Razor Pages
🔵 Blazor Web Assembly
🔵 Blazor Server
🔵 MAUI with Blazor Hybrid
## 📫 Bug & Support
Support for open-source ABP Framework client-side packages is available at [GitHub Issues](https://github.com/abpframework/abp/issues), and the commercial support is available at [support.abp.io](https://support.abp.io).

5
npm/packs/zxcvbn/abp.resourcemapping.js

@ -0,0 +1,5 @@
module.exports = {
mappings: {
"@node_modules/zxcvbn/dist/zxcvbn.js": "@libs/zxcvbn/"
}
}

32
npm/packs/zxcvbn/package.json

@ -0,0 +1,32 @@
{
"version": "7.4.0-rc.3",
"name": "@abp/zxcvbn",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~7.4.0-rc.3",
"zxcvbn" : "^4.4.2"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"license": "LGPL-3.0",
"keywords": [
"aspnetcore",
"boilerplate",
"framework",
"web",
"best-practices",
"angular",
"maui",
"blazor",
"mvc",
"csharp",
"webapp"
]
}

2
templates/app-nolayers/angular/package.json

@ -20,7 +20,7 @@
"@abp/ng.setting-management": "~7.4.0-rc.3", "@abp/ng.setting-management": "~7.4.0-rc.3",
"@abp/ng.tenant-management": "~7.4.0-rc.3", "@abp/ng.tenant-management": "~7.4.0-rc.3",
"@abp/ng.theme.shared": "~7.4.0-rc.3", "@abp/ng.theme.shared": "~7.4.0-rc.3",
"@abp/ng.theme.lepton-x": "~2.4.0-rc.2", "@abp/ng.theme.lepton-x": "~2.4.0-rc.3",
"@angular/animations": "~16.0.0", "@angular/animations": "~16.0.0",
"@angular/common": "~16.0.0", "@angular/common": "~16.0.0",
"@angular/compiler": "~16.0.0", "@angular/compiler": "~16.0.0",

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

Loading…
Cancel
Save