Browse Source

Merge branch 'dev' into IdentitySession

pull/18242/head
maliming 3 years ago
parent
commit
3f72ee10c9
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 2
      .github/ISSUE_TEMPLATE/config.yml
  2. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ar.json
  3. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/cs.json
  4. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/de.json
  5. 5
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json
  6. 12
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
  7. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/es.json
  8. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/fi.json
  9. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/fr.json
  10. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hi.json
  11. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hr.json
  12. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hu.json
  13. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/is.json
  14. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/it.json
  15. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/nl.json
  16. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/pl-PL.json
  17. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/pt-BR.json
  18. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ro-RO.json
  19. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ru.json
  20. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/sk.json
  21. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/sl.json
  22. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json
  23. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/vi.json
  24. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json
  25. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hant.json
  26. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json
  27. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json
  28. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json
  29. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json
  30. 12
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  31. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json
  32. 10
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json
  33. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json
  34. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json
  35. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hr.json
  36. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json
  37. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json
  38. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json
  39. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json
  40. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json
  41. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json
  42. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json
  43. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json
  44. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json
  45. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json
  46. 12
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
  47. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json
  48. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
  49. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json
  50. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ar.json
  51. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/cs.json
  52. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/de.json
  53. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
  54. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/es.json
  55. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/fi.json
  56. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/fr.json
  57. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hi.json
  58. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hr.json
  59. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hu.json
  60. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/is.json
  61. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/it.json
  62. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/nl.json
  63. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/pl-PL.json
  64. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/pt-BR.json
  65. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json
  66. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ru.json
  67. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/sk.json
  68. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/sl.json
  69. 17
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json
  70. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/vi.json
  71. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json
  72. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hant.json
  73. 24
      docs/en/API/Static-CSharp-API-Clients.md
  74. 2
      docs/en/Getting-Started-Setup-Environment-Single-Layer.md
  75. 2
      docs/en/Getting-Started-Setup-Environment.md
  76. 4
      docs/en/Modules/OpenIddict.md
  77. 4
      docs/en/Modules/Tenant-Management.md
  78. 78
      docs/en/Repositories.md
  79. 18
      docs/en/Road-Map.md
  80. 56
      docs/en/Testing.md
  81. BIN
      docs/en/images/solution-test-projects.png
  82. BIN
      docs/en/images/unitest-efcore-mongodb.png
  83. BIN
      docs/en/images/vs-run-tests-in-parallel.png
  84. BIN
      docs/en/images/vs-startup-template-tests.png
  85. 2
      docs/zh-Hans/Getting-Started-Setup-Environment.md
  86. 29
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs
  87. 7
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs
  88. 52
      framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpUnitTestSqliteConnection.cs
  89. 2
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
  90. 8
      framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs
  91. 2
      framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs
  92. 2
      framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs
  93. 19
      framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs
  94. 2
      latest-versions.json
  95. 2
      modules/account/src/Volo.Abp.Account.HttpApi/Volo/Abp/Account/AccountController.cs
  96. 2
      modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AbpAccountApplicationTestModule.cs
  97. 2
      modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs
  98. 2
      modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/AbpBackgroundJobsEntityFrameworkCoreTestModule.cs
  99. 6
      modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json
  100. 9439
      modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/libs/@fortawesome/fontawesome-free/css/all.css

2
.github/ISSUE_TEMPLATE/config.yml

@ -2,7 +2,7 @@ blank_issues_enabled: true
contact_links: contact_links:
- name: Issue with ABP Commercial - name: Issue with ABP Commercial
url: https://support.abp.io/QA/Questions url: https://support.abp.io/QA/Questions
about: Please open issues relating to ABP Commercial in support.abp.io. about: Please open ABP Commercial related issues at https://support.abp.io.
- name: Ask a question (community support) - name: Ask a question (community support)
url: https://stackoverflow.com/questions/tagged/abp url: https://stackoverflow.com/questions/tagged/abp
about: Ask a question that will be answered by the ABP community about: Ask a question that will be answered by the ABP community

7
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ar.json

@ -231,6 +231,11 @@
"BlogProfile": "الملف الشخصي للمدونة", "BlogProfile": "الملف الشخصي للمدونة",
"Tickets": "التذاكر", "Tickets": "التذاكر",
"MeetTheABPCommunity": "ABP <span class=\"gradient-community\">المجتمع</span> معرفة", "MeetTheABPCommunity": "ABP <span class=\"gradient-community\">المجتمع</span> معرفة",
"DisplayName:CommunityIndexPagePoll": "استطلاع" "DisplayName:CommunityIndexPagePoll": "استطلاع",
"OrganizationOverview": "نظرة عامة على المنظمة",
"EmailPreferences": "تفضيلات البريد الإلكتروني",
"DoYouAgreePrivacyPolicy": "بالضغط <i>يشترك</i> الزر الذي توافق عليه <a href=\"https://account.abp.io/Account/TermsConditions\">شروط</a> و <a href=\"https://account.abp.io/Account/Privacy\">سياسة الخصوصية</a>.",
"VideoCourses": "دورات الفيديو",
"Resources": "موارد"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/cs.json

@ -231,6 +231,12 @@
"BlogProfile": "Profil blogu", "BlogProfile": "Profil blogu",
"Tickets": "Vstupenky", "Tickets": "Vstupenky",
"MeetTheABPCommunity": "ABP <span class=\"gradient-community\">Komunita</span> poznat", "MeetTheABPCommunity": "ABP <span class=\"gradient-community\">Komunita</span> poznat",
"DisplayName:CommunityIndexPagePoll": "Anketa na stránce s indexem komunity" "DisplayName:CommunityIndexPagePoll": "Anketa na stránce s indexem komunity",
"OrganizationOverview": "Přehled organizace",
"EmailPreferences": "Předvolby e-mailu",
"DoYouAgreePrivacyPolicy": "Kliknutím <i>předplatit</i> souhlasíte s <a href=\"https://account.abp.io/Account/TermsConditions\">Podmínky</a> a <a href=\"https://account.abp.io/Account/Privacy\">Zásady ochrany osobních údajů</a>.",
"VideoCourses": "Video kurzy",
"Resources": "Zdroje"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/de.json

@ -230,6 +230,12 @@
"BlogProfile": "Blog-Profil", "BlogProfile": "Blog-Profil",
"Tickets": "Tickets", "Tickets": "Tickets",
"MeetTheABPCommunity": "ABP <span class=\"gradient-community\">Community</span> kennenlernen", "MeetTheABPCommunity": "ABP <span class=\"gradient-community\">Community</span> kennenlernen",
"DisplayName:CommunityIndexPagePoll": "Community-Indexseite-Umfrage" "DisplayName:CommunityIndexPagePoll": "Community-Indexseite-Umfrage",
"OrganizationOverview": "Organisationsübersicht",
"EmailPreferences": "E-Mail Einstellungen",
"DoYouAgreePrivacyPolicy": "Beim Klicken <i>Abonnieren</i> Mit der Schaltfläche stimmen Sie dem zu <a href=\"https://account.abp.io/Account/TermsConditions\">Bedingungen</a> Und <a href=\"https://account.abp.io/Account/Privacy\">Datenschutzrichtlinie</a>.",
"VideoCourses": "Videokurse",
"Resources": "Ressourcen"
} }
} }

5
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json

@ -34,6 +34,9 @@
"FreeDDDBook": "Free DDD E-book", "FreeDDDBook": "Free DDD E-book",
"New": "New", "New": "New",
"Volo.AbpIo.Domain:020005": "License extend year can not be lower than {MinExtendLicenseYear} year and greater than {MaxExtendLicenseYear} years ", "Volo.AbpIo.Domain:020005": "License extend year can not be lower than {MinExtendLicenseYear} year and greater than {MaxExtendLicenseYear} years ",
"DisplayName:CommunityIndexPagePoll": "Community Index Page Poll" "DisplayName:CommunityIndexPagePoll": "Community Index Page Poll",
"OrganizationOverview": "Organization Overview",
"EmailPreferences": "Email Preferences",
"DoYouAgreePrivacyPolicy": "By clicking <i>Subscribe</i> button you agree to the <a href=\"https://account.abp.io/Account/TermsConditions\">Terms & Conditions</a> and <a href=\"https://account.abp.io/Account/Privacy\">Privacy Policy</a>."
} }
} }

12
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json

@ -239,6 +239,16 @@
"Trainings": "Trainings", "Trainings": "Trainings",
"MeetTheABPCommunity": "Meet the ABP <span class=\"gradient-community\">Community</span>", "MeetTheABPCommunity": "Meet the ABP <span class=\"gradient-community\">Community</span>",
"DisplayName:CommunityIndexPagePoll": "Community Index Page Poll", "DisplayName:CommunityIndexPagePoll": "Community Index Page Poll",
"ReturnOfInvestment": "Return Of Investment" "ReturnOfInvestment": "Return Of Investment",
"PromotionalOffers": "Promotional Offers",
"PromotionalOffersDefinition": "Discounts, seasonal campaigns, etc.",
"EventsDefinition": "Community Talks, Webinars, ABP .NET Conference, etc.",
"ReleaseNotesDefinition": "ABP.IO Platform releases, new products, etc.",
"Newsletter": "Newsletter",
"NewsletterDefinition": "Blog posts, community news, etc.",
"OrganizationOverview": "Organization Overview",
"EmailPreferences": "Email Preferences",
"DoYouAgreePrivacyPolicy": "By clicking <i>Subscribe</i> button you agree to the <a href=\"https://account.abp.io/Account/TermsConditions\">Terms & Conditions</a> and <a href=\"https://account.abp.io/Account/Privacy\">Privacy Policy</a>.",
"VideoCourses" : "Video Courses"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/es.json

@ -230,6 +230,12 @@
"BlogProfile": "Perfil del blog", "BlogProfile": "Perfil del blog",
"Tickets": "Entradas", "Tickets": "Entradas",
"MeetTheABPCommunity": "Conozca la ABP<span class=\"gradient-community\">Comunidad</span>", "MeetTheABPCommunity": "Conozca la ABP<span class=\"gradient-community\">Comunidad</span>",
"DisplayName:CommunityIndexPagePoll": "Encuesta de la página de índice de la comunidad" "DisplayName:CommunityIndexPagePoll": "Encuesta de la página de índice de la comunidad",
"OrganizationOverview": "Descripción de la organización",
"EmailPreferences": "Preferencias de correo electrónico",
"DoYouAgreePrivacyPolicy": "Haciendo click <i>Suscribir</i> botón estás de acuerdo con el <a href=\"https://account.abp.io/Account/TermsConditions\">Términos</a> y <a href=\"https://account.abp.io/Account/Privacy\">política de privacidad</a>.",
"VideoCourses": "Cursos en vídeo",
"Resources": "Recursos"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/fi.json

@ -231,6 +231,12 @@
"BlogProfile": "Blogin profiili", "BlogProfile": "Blogin profiili",
"Tickets": "Liput", "Tickets": "Liput",
"MeetTheABPCommunity": "Tutustu ABP<span class=\"gradient-community\">Yhteisö</span>:n kanssa", "MeetTheABPCommunity": "Tutustu ABP<span class=\"gradient-community\">Yhteisö</span>:n kanssa",
"DisplayName:CommunityIndexPagePoll": "Yhteisön indeksointisivun kysely" "DisplayName:CommunityIndexPagePoll": "Yhteisön indeksointisivun kysely",
"OrganizationOverview": "Organisaation yleiskatsaus",
"EmailPreferences": "Sähköpostiasetukset",
"DoYouAgreePrivacyPolicy": "Klikkaamalla <i>Tilaa</i> -painiketta hyväksyt <a href=\"https://account.abp.io/Account/TermsConditions\">Ehdot</a> ja <a href=\"https://account.abp.io/Account/Privacy\">Tietosuojakäytäntö</a>.",
"VideoCourses": "Videokurssit",
"Resources": "Resurssit"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/fr.json

@ -231,6 +231,12 @@
"BlogProfile": "Profil du blog", "BlogProfile": "Profil du blog",
"Tickets": "Des billets", "Tickets": "Des billets",
"MeetTheABPCommunity": "Découvrez ABP avec la <span class=\"gradient-community\">Communauté</span>", "MeetTheABPCommunity": "Découvrez ABP avec la <span class=\"gradient-community\">Communauté</span>",
"DisplayName:CommunityIndexPagePoll": "Sondage de la page d&#39;accueil de la communauté" "DisplayName:CommunityIndexPagePoll": "Sondage de la page d&#39;accueil de la communauté",
"OrganizationOverview": "Aperçu de l'organisation",
"EmailPreferences": "Préférences de messagerie",
"DoYouAgreePrivacyPolicy": "En cliquant <i>S'abonner</i> bouton, vous acceptez le <a href=\"https://account.abp.io/Account/TermsConditions\">Termes</a> et <a href=\"https://account.abp.io/Account/Privacy\">politique de confidentialité</a>.",
"VideoCourses": "Cours vidéo",
"Resources": "Ressources"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hi.json

@ -231,6 +231,12 @@
"BlogProfile": "ब्लॉग प्रोफ़ाइल", "BlogProfile": "ब्लॉग प्रोफ़ाइल",
"Tickets": "टिकट", "Tickets": "टिकट",
"MeetTheABPCommunity": "ABP से मिलें <span class=\"gradient-community\">समुदाय</span>", "MeetTheABPCommunity": "ABP से मिलें <span class=\"gradient-community\">समुदाय</span>",
"DisplayName:CommunityIndexPagePoll": "सामुदायिक अनुभाग मतदान" "DisplayName:CommunityIndexPagePoll": "सामुदायिक अनुभाग मतदान",
"OrganizationOverview": "संगठन अवलोकन",
"EmailPreferences": "ईमेल प्राथमिकताएं",
"DoYouAgreePrivacyPolicy": "क्लिक करके <i>सदस्यता लें</i> जिस बटन से आप सहमत हैं <a href=\"https://account.abp.io/Account/TermsConditions\">शर्तें</a> और <a href=\"https://account.abp.io/Account/Privacy\">गोपनीयता नीति</a>.",
"VideoCourses": "वीडियो पाठ्यक्रम",
"Resources": "संसाधन"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hr.json

@ -231,6 +231,12 @@
"BlogProfile": "Blog profil", "BlogProfile": "Blog profil",
"Tickets": "Ulaznice", "Tickets": "Ulaznice",
"MeetTheABPCommunity": "Upoznaj ABP <span class=\"gradient-community\">Zajednicu</span>", "MeetTheABPCommunity": "Upoznaj ABP <span class=\"gradient-community\">Zajednicu</span>",
"DisplayName:CommunityIndexPagePoll": "Anketa na stranici indeksa zajednice" "DisplayName:CommunityIndexPagePoll": "Anketa na stranici indeksa zajednice",
"OrganizationOverview": "Pregled organizacije",
"EmailPreferences": "Postavke e-pošte",
"DoYouAgreePrivacyPolicy": "Klikom <i>Pretplatite se</i> gumb slažete se s <a href=\"https://account.abp.io/Account/TermsConditions\">Pojmovi</a> i <a href=\"https://account.abp.io/Account/Privacy\">Politika privatnosti</a>.",
"VideoCourses": "Video tečajevi",
"Resources": "Resursi"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/hu.json

@ -231,6 +231,12 @@
"BlogProfile": "Blog profil", "BlogProfile": "Blog profil",
"Tickets": "Jegyek", "Tickets": "Jegyek",
"MeetTheABPCommunity": "Ismerd meg az ABP-t a <span class=\"gradient-community\">Közösséggel</span>", "MeetTheABPCommunity": "Ismerd meg az ABP-t a <span class=\"gradient-community\">Közösséggel</span>",
"DisplayName:CommunityIndexPagePoll": "Közösségi Indexoldal Szavazás" "DisplayName:CommunityIndexPagePoll": "Közösségi Indexoldal Szavazás",
"OrganizationOverview": "Szervezet áttekintése",
"EmailPreferences": "E-mail beállítások",
"DoYouAgreePrivacyPolicy": "Kattintással <i>Iratkozz fel</i> gombbal elfogadja a <a href=\"https://account.abp.io/Account/TermsConditions\">Feltételek</a> és <a href=\"https://account.abp.io/Account/Privacy\">Adatvédelmi irányelvek</a>.",
"VideoCourses": "Videó tanfolyamok",
"Resources": "Erőforrások"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/is.json

@ -231,6 +231,12 @@
"BlogProfile": "Bloggprófíll", "BlogProfile": "Bloggprófíll",
"Tickets": "Miðar", "Tickets": "Miðar",
"MeetTheABPCommunity": "Kynnistuðu ABP <span class=\"gradient-community\">Samfélagið</span>", "MeetTheABPCommunity": "Kynnistuðu ABP <span class=\"gradient-community\">Samfélagið</span>",
"DisplayName:CommunityIndexPagePoll": "Samfélagssnið" "DisplayName:CommunityIndexPagePoll": "Samfélagssnið",
"OrganizationOverview": "Yfirlit yfir stofnun",
"EmailPreferences": "Tölvupóststillingar",
"DoYouAgreePrivacyPolicy": "Með því að smella <i>Gerast áskrifandi</i> hnappinn sem þú samþykkir <a href=\"https://account.abp.io/Account/TermsConditions\">Skilmálar</a> og <a href=\"https://account.abp.io/Account/Privacy\">Friðhelgisstefna</a>.",
"VideoCourses": "Vídeónámskeið",
"Resources": "Auðlindir"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/it.json

@ -231,6 +231,12 @@
"BlogProfile": "Profilo del blog", "BlogProfile": "Profilo del blog",
"Tickets": "Biglietti", "Tickets": "Biglietti",
"MeetTheABPCommunity": "Incontra la ABP<span class=\"gradient-community\">comunità</span>", "MeetTheABPCommunity": "Incontra la ABP<span class=\"gradient-community\">comunità</span>",
"DisplayName:CommunityIndexPagePoll": "Sondaggio della pagina indice della comunità" "DisplayName:CommunityIndexPagePoll": "Sondaggio della pagina indice della comunità",
"OrganizationOverview": "Panoramica dell'organizzazione",
"EmailPreferences": "preferenze email",
"DoYouAgreePrivacyPolicy": "Cliccando <i>sottoscrivi</i> pulsante accetti il <a href=\"https://account.abp.io/Account/TermsConditions\">Termini</a> E <a href=\"https://account.abp.io/Account/Privacy\">politica sulla riservatezza</a>.",
"VideoCourses": "Videocorsi",
"Resources": "Risorse"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/nl.json

@ -231,6 +231,12 @@
"BlogProfile": "Blogprofiel", "BlogProfile": "Blogprofiel",
"Tickets": "Kaartjes", "Tickets": "Kaartjes",
"MeetTheABPCommunity": "Maak kennis met ABP <span class=\"gradient-community\">Gemeenschap</span>", "MeetTheABPCommunity": "Maak kennis met ABP <span class=\"gradient-community\">Gemeenschap</span>",
"DisplayName:CommunityIndexPagePoll": "Gemeenschapsindexpagina-enquête" "DisplayName:CommunityIndexPagePoll": "Gemeenschapsindexpagina-enquête",
"OrganizationOverview": "Organisatieoverzicht",
"EmailPreferences": "e-mail voorkeuren",
"DoYouAgreePrivacyPolicy": "Door te klikken <i>Abonneren</i> knop waarmee u akkoord gaat <a href=\"https://account.abp.io/Account/TermsConditions\">Voorwaarden</a> En <a href=\"https://account.abp.io/Account/Privacy\">Privacybeleid</a>.",
"VideoCourses": "Videocursussen",
"Resources": "Bronnen"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/pl-PL.json

@ -231,6 +231,12 @@
"BlogProfile": "Profil bloga", "BlogProfile": "Profil bloga",
"Tickets": "Bilety", "Tickets": "Bilety",
"MeetTheABPCommunity": "Maak kennis met ABP <span class=\"gradient-community\">Gemeenschap</span>", "MeetTheABPCommunity": "Maak kennis met ABP <span class=\"gradient-community\">Gemeenschap</span>",
"DisplayName:CommunityIndexPagePoll": "Ankieta na stronie głównej społeczności" "DisplayName:CommunityIndexPagePoll": "Ankieta na stronie głównej społeczności",
"OrganizationOverview": "Przegląd organizacji",
"EmailPreferences": "Preferencje poczty e-mail",
"DoYouAgreePrivacyPolicy": "Klikając <i>Subskrybuj</i> przycisk, na który wyrażasz zgodę <a href=\"https://account.abp.io/Account/TermsConditions\">Warunki</a> I <a href=\"https://account.abp.io/Account/Privacy\">Polityka prywatności</a>.",
"VideoCourses": "Kursy wideo",
"Resources": "Zasoby"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/pt-BR.json

@ -231,6 +231,12 @@
"BlogProfile": "Perfil do blog", "BlogProfile": "Perfil do blog",
"Tickets": "Ingressos", "Tickets": "Ingressos",
"MeetTheABPCommunity": "Conheça a ABP com a <span class=\"gradient-community\">Comunidade</span>", "MeetTheABPCommunity": "Conheça a ABP com a <span class=\"gradient-community\">Comunidade</span>",
"DisplayName:CommunityIndexPagePoll": "Enquete da página inicial da comunidade" "DisplayName:CommunityIndexPagePoll": "Enquete da página inicial da comunidade",
"OrganizationOverview": "Visão geral da organização",
"EmailPreferences": "Preferências de Email",
"DoYouAgreePrivacyPolicy": "Clicando <i>Se inscrever</i> botão você concorda com o <a href=\"https://account.abp.io/Account/TermsConditions\">Termos</a> e <a href=\"https://account.abp.io/Account/Privacy\">política de Privacidade</a>.",
"VideoCourses": "Cursos em vídeo",
"Resources": "Recursos"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ro-RO.json

@ -231,6 +231,12 @@
"BlogProfile": "Profil blog", "BlogProfile": "Profil blog",
"Tickets": "bilete", "Tickets": "bilete",
"MeetTheABPCommunity": "Cunoaște ABP cu <span class=\"gradient-community\">Comunitatea</span>", "MeetTheABPCommunity": "Cunoaște ABP cu <span class=\"gradient-community\">Comunitatea</span>",
"DisplayName:CommunityIndexPagePoll": "Sondajul de pe pagina de index a comunității" "DisplayName:CommunityIndexPagePoll": "Sondajul de pe pagina de index a comunității",
"OrganizationOverview": "Prezentare a organizației",
"EmailPreferences": "preferinte de email",
"DoYouAgreePrivacyPolicy": "Dând clicuri <i>Abonati-va</i> butonul sunteți de acord cu <a href=\"https://account.abp.io/Account/TermsConditions\">Termeni</a> și <a href=\"https://account.abp.io/Account/Privacy\">Politica de confidențialitate</a>.",
"VideoCourses": "Cursuri video",
"Resources": "Resurse"
} }
} }

7
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ru.json

@ -237,6 +237,11 @@
"Packages": "Пакеты", "Packages": "Пакеты",
"Trainings": "Тренинги", "Trainings": "Тренинги",
"MeetTheABPCommunity": "Познакомьтесь с ABP с <span class=\"gradient-community\">Сообществом</span>", "MeetTheABPCommunity": "Познакомьтесь с ABP с <span class=\"gradient-community\">Сообществом</span>",
"DisplayName:CommunityIndexPagePoll": "Опрос на главной странице сообщества" "DisplayName:CommunityIndexPagePoll": "Опрос на главной странице сообщества",
"OrganizationOverview": "Обзор организации",
"EmailPreferences": "Настройки электронной почты",
"DoYouAgreePrivacyPolicy": "Кликнув <i>Подписаться</i> кнопку вы соглашаетесь с <a href=\"https://account.abp.io/Account/TermsConditions\">Условия</a> и <a href=\"https://account.abp.io/Account/Privacy\">политика конфиденциальности</a>.",
"VideoCourses": "Видео курсы",
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/sk.json

@ -231,6 +231,12 @@
"BlogProfile": "Profil blogu", "BlogProfile": "Profil blogu",
"Tickets": "Vstupenky", "Tickets": "Vstupenky",
"MeetTheABPCommunity": "Spoznajte ABP s <span class=\"gradient-community\">Komunitou</span>", "MeetTheABPCommunity": "Spoznajte ABP s <span class=\"gradient-community\">Komunitou</span>",
"DisplayName:CommunityIndexPagePoll": "Anketa na stránke indexu komunity" "DisplayName:CommunityIndexPagePoll": "Anketa na stránke indexu komunity",
"OrganizationOverview": "Prehľad organizácie",
"EmailPreferences": "Predvoľby e-mailu",
"DoYouAgreePrivacyPolicy": "Kliknutím <i>Prihlásiť sa na odber</i> súhlasíte s <a href=\"https://account.abp.io/Account/TermsConditions\">Podmienky</a> a <a href=\"https://account.abp.io/Account/Privacy\">Zásady ochrany osobných údajov</a>.",
"VideoCourses": "Video kurzy",
"Resources": "Zdroje"
} }
} }

6
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/sl.json

@ -231,6 +231,10 @@
"BlogProfile": "Blog profil", "BlogProfile": "Blog profil",
"Tickets": "Vstopnice", "Tickets": "Vstopnice",
"MeetTheABPCommunity": "Spoznajte ABP z <span class=\"gradient-community\">Skupnostjo</span>", "MeetTheABPCommunity": "Spoznajte ABP z <span class=\"gradient-community\">Skupnostjo</span>",
"DisplayName:CommunityIndexPagePoll": "Anketa na strani z indeksom skupnosti" "DisplayName:CommunityIndexPagePoll": "Anketa na strani z indeksom skupnosti",
"OrganizationOverview": "Pregled organizacije",
"EmailPreferences": "E-poštne nastavitve",
"DoYouAgreePrivacyPolicy": "S klikom <i>Naročite se</i> gumb se strinjate z <a href=\"https://account.abp.io/Account/TermsConditions\">Pogoji</a> in <a href=\"https://account.abp.io/Account/Privacy\">Politika zasebnosti</a>.",
"VideoCourses": "Video tečaji"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json

@ -181,6 +181,12 @@
"Raffles": "Çekilişler", "Raffles": "Çekilişler",
"HowItWorks": "Nasıl Çalışıyor?", "HowItWorks": "Nasıl Çalışıyor?",
"WhyABPIOPlatform": "Neden ABP.IO Platform?", "WhyABPIOPlatform": "Neden ABP.IO Platform?",
"ReleaseNotes": "Sürüm Notları" "ReleaseNotes": "Sürüm Notları",
"Resources": "Kaynaklar",
"VideoCourses": "Video Kurslar",
"OrganizationOverview": "Organizasyon Detayı",
"EmailPreferences": "E-posta Tercihleri",
"DoYouAgreePrivacyPolicy": "<i>Abone Ol</i> butonuna tıklayarak <a href=\"https://account.abp.io/Account/TermsConditions\">Şartlar</a> ve <a href=\"https://account.abp.io/Account/Privacy\">Gizlilik Politikası</a> kurallarımızı kabul etmiş olursunuz."
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/vi.json

@ -230,6 +230,12 @@
"BlogProfile": "Hồ sơ blog", "BlogProfile": "Hồ sơ blog",
"Tickets": "Vé", "Tickets": "Vé",
"MeetTheABPCommunity": "Gặp gỡ ABP với <span class=\"gradient-community\">Cộng đồng</span>", "MeetTheABPCommunity": "Gặp gỡ ABP với <span class=\"gradient-community\">Cộng đồng</span>",
"DisplayName:CommunityIndexPagePoll": "Bình chọn trang chủ cộng đồng" "DisplayName:CommunityIndexPagePoll": "Bình chọn trang chủ cộng đồng",
"OrganizationOverview": "Tổng quan về tổ chức",
"EmailPreferences": "Tuỳ chọn email",
"DoYouAgreePrivacyPolicy": "Bằng cách nhấp chuột <i>Đặt mua</i> nút bạn đồng ý với <a href=\"https://account.abp.io/Account/TermsConditions\">Điều kiện</a> Và <a href=\"https://account.abp.io/Account/Privacy\">Chính sách bảo mật</a>.",
"VideoCourses": "Khóa học video",
"Resources": "Tài nguyên"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json

@ -231,6 +231,12 @@
"BlogProfile": "博客简介", "BlogProfile": "博客简介",
"Tickets": "门票", "Tickets": "门票",
"MeetTheABPCommunity": "与 ABP 一起认识 <span class=\"gradient-community\">社区</span>", "MeetTheABPCommunity": "与 ABP 一起认识 <span class=\"gradient-community\">社区</span>",
"DisplayName:CommunityIndexPagePoll": "社区首页投票" "DisplayName:CommunityIndexPagePoll": "社区首页投票",
"OrganizationOverview": "组织概况",
"EmailPreferences": "电子邮件首选项",
"DoYouAgreePrivacyPolicy": "通过点击 <i>订阅</i> 按钮表示您同意 <a href=\"https://account.abp.io/Account/TermsConditions\">条款</a> 和 <a href=\"https://account.abp.io/Account/Privacy\">隐私政策</a>。",
"VideoCourses": "视频课程",
"Resources": "资源"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hant.json

@ -231,6 +231,12 @@
"BlogProfile": "部落格簡介", "BlogProfile": "部落格簡介",
"Tickets": "門票", "Tickets": "門票",
"MeetTheABPCommunity": "與 ABP 一起認識 <span class=\"gradient-community\">社群</span>", "MeetTheABPCommunity": "與 ABP 一起認識 <span class=\"gradient-community\">社群</span>",
"DisplayName:CommunityIndexPagePoll": "社區首頁調查" "DisplayName:CommunityIndexPagePoll": "社區首頁調查",
"OrganizationOverview": "组织概况",
"EmailPreferences": "电子邮件首选项",
"DoYouAgreePrivacyPolicy": "通过点击 <i>订阅</i> 按钮表示您同意 <a href=\"https://account.abp.io/Account/TermsConditions\">条款</a> 和 <a href=\"https://account.abp.io/Account/Privacy\">隐私政策</a>。",
"VideoCourses": "视频课程",
"Resources": "资源"
} }
} }

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

@ -584,7 +584,7 @@
"StartupTemplates_Page_Description": "يسمح لك ABP التجاري ببناء حلول بأي مستوى من التعقيد. يوفر حلين رئيسيين لبدء التشغيل. يمكنك اختيار واحد قريب من متطلباتك وبناء الحل المخصص الخاص بك فوقه.", "StartupTemplates_Page_Description": "يسمح لك ABP التجاري ببناء حلول بأي مستوى من التعقيد. يوفر حلين رئيسيين لبدء التشغيل. يمكنك اختيار واحد قريب من متطلباتك وبناء الحل المخصص الخاص بك فوقه.",
"MicroserviceStartupSolutionForDotnet": "حل بدء تشغيل Microservice لـ .NET", "MicroserviceStartupSolutionForDotnet": "حل بدء تشغيل Microservice لـ .NET",
"MonolithSolutionForDotnet": "حل مترابط (معياري) لـ .NET", "MonolithSolutionForDotnet": "حل مترابط (معياري) لـ .NET",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} ساعة (ساعات)", "TrainingDetailsHeaderInfo_TrainingHour": "{0} ساعة",
"Trainings_Content": "محتوى التدريب", "Trainings_Content": "محتوى التدريب",
"Trial_Page_StartYourFreeTrial": "ابدا <span class=\"gradient-commercial\">تجربتك المجانية</span>", "Trial_Page_StartYourFreeTrial": "ابدا <span class=\"gradient-commercial\">تجربتك المجانية</span>",
"TrialLicenseFeatures": "ستتمكن من الاستفادة من جميع ميزات ABP التجاري", "TrialLicenseFeatures": "ستتمكن من الاستفادة من جميع ميزات ABP التجاري",
@ -796,6 +796,10 @@
"PaymentFailedInfo": "عذرا، فشل الدفع! ", "PaymentFailedInfo": "عذرا، فشل الدفع! ",
"UsedPayment": "لقد تم استخدام هذه الدفعة بالفعل", "UsedPayment": "لقد تم استخدام هذه الدفعة بالفعل",
"ManageLicense": "التحكم في الترخيص", "ManageLicense": "التحكم في الترخيص",
"AbpPlatformLeptonXTheme": "سمة LeptonX للوحة تحكم المشرف الخاصة بك من قبل <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "سمة LeptonX للوحة تحكم المشرف الخاصة بك من قبل <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "سابق",
"PricingDiscount": "تخفيض",
"YourOrganizationOverview": "Your Organization Overview",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} ساعة"
} }
} }

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

@ -410,7 +410,11 @@
"PaymentFailedInfo": "Omlouváme se, platba se nezdařila! ", "PaymentFailedInfo": "Omlouváme se, platba se nezdařila! ",
"UsedPayment": "Tato platba již byla použita", "UsedPayment": "Tato platba již byla použita",
"ManageLicense": "Správa licence", "ManageLicense": "Správa licence",
"AbpPlatformLeptonXTheme": "LeptonX téma pro váš správce účtu od <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX téma pro váš správce účtu od <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Předchozí",
"PricingDiscount": "Sleva",
"YourOrganizationOverview": "Přehled vaší organizace",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} hodina",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} hodin"
} }
} }

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

@ -391,6 +391,11 @@
"PaymentFailedInfo": "Entschuldigung, die Zahlung ist fehlgeschlagen! ", "PaymentFailedInfo": "Entschuldigung, die Zahlung ist fehlgeschlagen! ",
"UsedPayment": "Diese Zahlung wurde bereits verwendet", "UsedPayment": "Diese Zahlung wurde bereits verwendet",
"ManageLicense": "Lizenz verwalten", "ManageLicense": "Lizenz verwalten",
"AbpPlatformLeptonXTheme": "LeptonX-Theme für Ihr Admin-Dashboard von <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX-Theme für Ihr Admin-Dashboard von <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Vorherige",
"PricingDiscount": "Rabatt",
"YourOrganizationOverview": "Ihre Organisationsübersicht",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} Stunde",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} Stunden"
} }
} }

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

@ -113,6 +113,10 @@
"BlackFridayDiscount": "Black Friday Discount", "BlackFridayDiscount": "Black Friday Discount",
"MultipleOrganizationInfo": "See All Your Organizations", "MultipleOrganizationInfo": "See All Your Organizations",
"PaymentFailedInfo": "Sorry, payment failed! This could be due to insufficient funds, invalid credit card numbers or invalid pin", "PaymentFailedInfo": "Sorry, payment failed! This could be due to insufficient funds, invalid credit card numbers or invalid pin",
"UsedPayment": "This payment has been already used" "UsedPayment": "This payment has been already used",
"Previous": "Previous",
"YourOrganizationOverview": "Your Organization Overview",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} hour",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} hours"
} }
} }

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

@ -610,7 +610,7 @@
"StartupTemplates_Page_Description": "ABP Commercial allows you to build solutions with any level of complexity. It provides two main pre-built startup solutions. You can select the one close to your requirements and build your own custom solution on top of it.", "StartupTemplates_Page_Description": "ABP Commercial allows you to build solutions with any level of complexity. It provides two main pre-built startup solutions. You can select the one close to your requirements and build your own custom solution on top of it.",
"MicroserviceStartupSolutionForDotnet": "Microservice Startup Solution for .NET", "MicroserviceStartupSolutionForDotnet": "Microservice Startup Solution for .NET",
"MonolithSolutionForDotnet": "Monolith (modular) Solution for .NET", "MonolithSolutionForDotnet": "Monolith (modular) Solution for .NET",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} hour(s)", "TrainingDetailsHeaderInfo_TrainingHour": "{0} hours",
"Trainings_Content": "Content of Training", "Trainings_Content": "Content of Training",
"Trial_Page_StartYourFreeTrial": "Start Your <span class=\"gradient-commercial\">Free Trial</span>", "Trial_Page_StartYourFreeTrial": "Start Your <span class=\"gradient-commercial\">Free Trial</span>",
"TrialLicenseFeatures": "You'll be able to benefit from all ABP commercial features", "TrialLicenseFeatures": "You'll be able to benefit from all ABP commercial features",
@ -1180,6 +1180,14 @@
"ReturnOfInvestmentPageAbout": "This page covers the fundamental steps of developing a software solution and explains how the ABP.IO Platform reduces your development costs at each step.", "ReturnOfInvestmentPageAbout": "This page covers the fundamental steps of developing a software solution and explains how the ABP.IO Platform reduces your development costs at each step.",
"LearnMore": "Learn More", "LearnMore": "Learn More",
"ReturnOfInvestment": "Return of Investment", "ReturnOfInvestment": "Return of Investment",
"ReturnOfInvestment_Description": "Learn how to reduce your development costs by more than %50." "ReturnOfInvestment_Description": "Learn how to reduce your development costs by more than %50.",
"Previous": "Previous",
"PricingDiscount": "Save",
"PricingTeamTitle": "Team",
"PricingBusinessTitle": "Business",
"PricingEnterpriseTitle": "Enterprise",
"SpecialDiscount": "Special Discount",
"YourOrganizationOverview": "Your Organization Overview",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} hour"
} }
} }

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

@ -391,6 +391,11 @@
"PaymentFailedInfo": "Lo sentimos, ¡el pago falló! ", "PaymentFailedInfo": "Lo sentimos, ¡el pago falló! ",
"UsedPayment": "Este pago ya ha sido utilizado.", "UsedPayment": "Este pago ya ha sido utilizado.",
"ManageLicense": "Gestionar licencia", "ManageLicense": "Gestionar licencia",
"AbpPlatformLeptonXTheme": "Tema LeptonX para su panel de administración por <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Tema LeptonX para su panel de administración por <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Anterior",
"PricingDiscount": "Descuento",
"YourOrganizationOverview": "Descripción general de su organización",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} hora",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} horas"
} }
} }

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

@ -607,7 +607,7 @@
"StartupTemplates_Page_Description": "ABP Commercialin avulla voit rakentaa minkä tahansa monimutkaisia ratkaisuja. Se tarjoaa kaksi pääasiallista valmiiksi rakennettua käynnistysratkaisua. Voit valita tarpeitasi vastaavan ja rakentaa oman mukautetun ratkaisun sen päälle.", "StartupTemplates_Page_Description": "ABP Commercialin avulla voit rakentaa minkä tahansa monimutkaisia ratkaisuja. Se tarjoaa kaksi pääasiallista valmiiksi rakennettua käynnistysratkaisua. Voit valita tarpeitasi vastaavan ja rakentaa oman mukautetun ratkaisun sen päälle.",
"MicroserviceStartupSolutionForDotnet": "Mikropalvelu käynnistysmalli .NET:ille", "MicroserviceStartupSolutionForDotnet": "Mikropalvelu käynnistysmalli .NET:ille",
"MonolithSolutionForDotnet": "Monoliitti (modulaarinen) Ratkaisu .NET:ille", "MonolithSolutionForDotnet": "Monoliitti (modulaarinen) Ratkaisu .NET:ille",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} tunti(a)", "TrainingDetailsHeaderInfo_TrainingHour": "{0} tuntia",
"Trainings_Content": "Koulutuksen sisältö", "Trainings_Content": "Koulutuksen sisältö",
"Trial_Page_StartYourFreeTrial": "Aloita <span class=\"gradient-commercial\">ilmainen kokeilujaksosi</span>", "Trial_Page_StartYourFreeTrial": "Aloita <span class=\"gradient-commercial\">ilmainen kokeilujaksosi</span>",
"TrialLicenseFeatures": "Voit hyötyä kaikista ABP:n kaupallisista ominaisuuksista", "TrialLicenseFeatures": "Voit hyötyä kaikista ABP:n kaupallisista ominaisuuksista",
@ -831,7 +831,11 @@
"MultipleOrganizationInfo": "Katso kaikki organisaatiosi", "MultipleOrganizationInfo": "Katso kaikki organisaatiosi",
"PaymentFailedInfo": "Anteeksi, maksu epäonnistui! ", "PaymentFailedInfo": "Anteeksi, maksu epäonnistui! ",
"UsedPayment": "Tämä maksu on jo käytetty", "UsedPayment": "Tämä maksu on jo käytetty",
"ManageLicense": "Hallinnoi lisenssiä", "ManageLicense": "Hallinnoi lisenssiä",
"AbpPlatformLeptonXTheme": "LeptonX-teema hallintapaneelillesi ABP Platformin toimesta <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX-teema hallintapaneelillesi ABP Platformin toimesta <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Edellinen",
"PricingDiscount": "Alennus",
"YourOrganizationOverview": "Organisaation yleiskatsaus",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} tunti"
} }
} }

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

@ -410,6 +410,11 @@
"PaymentFailedInfo": "Désolé, le paiement a échoué! ", "PaymentFailedInfo": "Désolé, le paiement a échoué! ",
"UsedPayment": "Ce paiement a déjà été utilisé", "UsedPayment": "Ce paiement a déjà été utilisé",
"ManageLicense": "Gérer la licence", "ManageLicense": "Gérer la licence",
"AbpPlatformLeptonXTheme": "Thème LeptonX pour votre tableau de bord administrateur par <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Thème LeptonX pour votre tableau de bord administrateur par <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Précédent",
"PricingDiscount": "Rabais",
"YourOrganizationOverview": "Aperçu de votre organisation",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} heure",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} heures"
} }
} }

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

@ -409,6 +409,11 @@
"PaymentFailedInfo": "क्षमा करें, भुगतान विफल रहा! ", "PaymentFailedInfo": "क्षमा करें, भुगतान विफल रहा! ",
"UsedPayment": "इस भुगतान का उपयोग पहले ही किया जा चुका है", "UsedPayment": "इस भुगतान का उपयोग पहले ही किया जा चुका है",
"ManageLicense": "लाइसेंस प्रबंधन", "ManageLicense": "लाइसेंस प्रबंधन",
"AbpPlatformLeptonXTheme": "ABP Platform द्वारा आपके व्यवस्थापक डैशबोर्ड के लिए LeptonX थीम" "AbpPlatformLeptonXTheme": "ABP Platform द्वारा आपके व्यवस्थापक डैशबोर्ड के लिए LeptonX थीम",
"Previous": "पहले का",
"PricingDiscount": "छूट",
"YourOrganizationOverview": "आपके संगठन का अवलोकन",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} घंटा",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} घंटे"
} }
} }

8
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hr.json

@ -610,7 +610,7 @@
"StartupTemplates_Page_Description": "ABP Commercial omogućuje vam izradu rješenja bilo koje razine složenosti. Pruža dva glavna unaprijed izgrađena rješenja za pokretanje. Možete odabrati onaj koji je bliži vašim zahtjevima i na njemu izgraditi vlastito prilagođeno rješenje.", "StartupTemplates_Page_Description": "ABP Commercial omogućuje vam izradu rješenja bilo koje razine složenosti. Pruža dva glavna unaprijed izgrađena rješenja za pokretanje. Možete odabrati onaj koji je bliži vašim zahtjevima i na njemu izgraditi vlastito prilagođeno rješenje.",
"MicroserviceStartupSolutionForDotnet": "Rješenje za pokretanje mikroservisa za .NET", "MicroserviceStartupSolutionForDotnet": "Rješenje za pokretanje mikroservisa za .NET",
"MonolithSolutionForDotnet": "Monolitno (modularno) rješenje za .NET", "MonolithSolutionForDotnet": "Monolitno (modularno) rješenje za .NET",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} sat(i)", "TrainingDetailsHeaderInfo_TrainingHour": "{0} sati",
"Trainings_Content": "Sadržaj obuke", "Trainings_Content": "Sadržaj obuke",
"Trial_Page_StartYourFreeTrial": "Započnite <span class=\"gradient-commercial\">besplatno probno razdoblje</span>", "Trial_Page_StartYourFreeTrial": "Započnite <span class=\"gradient-commercial\">besplatno probno razdoblje</span>",
"TrialLicenseFeatures": "Moći ćete imati koristi od svih ABP komercijalnih značajki", "TrialLicenseFeatures": "Moći ćete imati koristi od svih ABP komercijalnih značajki",
@ -1088,6 +1088,10 @@
"PaymentFailedInfo": "Nažalost, plaćanje nije uspjelo! ", "PaymentFailedInfo": "Nažalost, plaćanje nije uspjelo! ",
"UsedPayment": "Ovo plaćanje je već iskorišteno", "UsedPayment": "Ovo plaćanje je već iskorišteno",
"ManageLicense": "Upravljanje licencom", "ManageLicense": "Upravljanje licencom",
"AbpPlatformLeptonXTheme": "LeptonX Tema za vašu administratorsku nadzornu ploču od strane <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX Tema za vašu administratorsku nadzornu ploču od strane <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Prethodno",
"PricingDiscount": "Popust",
"YourOrganizationOverview": "Pregled vaše organizacije",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} sat"
} }
} }

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

@ -758,6 +758,10 @@
"PaymentFailedInfo": "Sajnos a fizetés sikertelen! ", "PaymentFailedInfo": "Sajnos a fizetés sikertelen! ",
"UsedPayment": "Ezt a fizetést már felhasználták", "UsedPayment": "Ezt a fizetést már felhasználták",
"ManageLicense": "Licenc kezelése", "ManageLicense": "Licenc kezelése",
"AbpPlatformLeptonXTheme": "LeptonX téma az Adminisztrációs Vezérlőpultjához az <span class=\"gradient-commercial\">ABP Platform</span> által" "AbpPlatformLeptonXTheme": "LeptonX téma az Adminisztrációs Vezérlőpultjához az <span class=\"gradient-commercial\">ABP Platform</span> által",
"Previous": "Előző",
"PricingDiscount": "Kedvezmény",
"YourOrganizationOverview": "Az Ön szervezetének áttekintése",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} óra"
} }
} }

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

@ -388,6 +388,11 @@
"PaymentFailedInfo": "Því miður, greiðsla mistókst! ", "PaymentFailedInfo": "Því miður, greiðsla mistókst! ",
"UsedPayment": "Þessi greiðsla hefur þegar verið notuð", "UsedPayment": "Þessi greiðsla hefur þegar verið notuð",
"ManageLicense": "Stjórna leyfi", "ManageLicense": "Stjórna leyfi",
"AbpPlatformLeptonXTheme": "LeptonX Þema fyrir stjórnborð stjórnanda þíns af <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX Þema fyrir stjórnborð stjórnanda þíns af <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Fyrri",
"PricingDiscount": "Afsláttur",
"YourOrganizationOverview": "Yfirlit yfir stofnunina þína",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} klukkustund",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} klukkustundir"
} }
} }

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

@ -409,6 +409,11 @@
"PaymentFailedInfo": "Siamo spiacenti, pagamento non riuscito! ", "PaymentFailedInfo": "Siamo spiacenti, pagamento non riuscito! ",
"UsedPayment": "Questo pagamento è già stato utilizzato", "UsedPayment": "Questo pagamento è già stato utilizzato",
"ManageLicense": "Gestisci la licenza", "ManageLicense": "Gestisci la licenza",
"AbpPlatformLeptonXTheme": "Tema LeptonX per la tua bacheca amministrativa di <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Tema LeptonX per la tua bacheca amministrativa di <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Precedente",
"PricingDiscount": "Sconto",
"YourOrganizationOverview": "Panoramica della tua organizzazione",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} ora",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} ore"
} }
} }

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

@ -388,6 +388,11 @@
"PaymentFailedInfo": "Excuses, betaling mislukt! ", "PaymentFailedInfo": "Excuses, betaling mislukt! ",
"UsedPayment": "Deze betaling is al gebruikt", "UsedPayment": "Deze betaling is al gebruikt",
"ManageLicense": "Licentie beheren", "ManageLicense": "Licentie beheren",
"AbpPlatformLeptonXTheme": "LeptonX-thema voor uw beheerdersdashboard door <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX-thema voor uw beheerdersdashboard door <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Vorig",
"PricingDiscount": "Korting",
"YourOrganizationOverview": "Uw organisatieoverzicht",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} uur",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} uur"
} }
} }

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

@ -388,6 +388,11 @@
"PaymentFailedInfo": "Przepraszamy, płatność nie powiodła się! ", "PaymentFailedInfo": "Przepraszamy, płatność nie powiodła się! ",
"UsedPayment": "Ta płatność została już wykorzystana", "UsedPayment": "Ta płatność została już wykorzystana",
"ManageLicense": "Zarządzaj licencją", "ManageLicense": "Zarządzaj licencją",
"AbpPlatformLeptonXTheme": "Motyw LeptonX dla Twojej konsoli administracyjnej od <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Motyw LeptonX dla Twojej konsoli administracyjnej od <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Poprzedni",
"PricingDiscount": "Rabat",
"YourOrganizationOverview": "Przegląd Twojej organizacji",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} godzina",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} godzin"
} }
} }

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

@ -411,6 +411,11 @@
"PaymentFailedInfo": "Desculpe, o pagamento falhou! ", "PaymentFailedInfo": "Desculpe, o pagamento falhou! ",
"UsedPayment": "Este pagamento já foi usado", "UsedPayment": "Este pagamento já foi usado",
"ManageLicense": "Gerenciar Licença", "ManageLicense": "Gerenciar Licença",
"AbpPlatformLeptonXTheme": "Tema LeptonX para o seu Painel de Administração por <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Tema LeptonX para o seu Painel de Administração por <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Anterior",
"PricingDiscount": "Desconto",
"YourOrganizationOverview": "Visão geral da sua organização",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} hora",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} horas"
} }
} }

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

@ -388,6 +388,11 @@
"PaymentFailedInfo": "Ne pare rău, plata nu a reușit! ", "PaymentFailedInfo": "Ne pare rău, plata nu a reușit! ",
"UsedPayment": "Această plată a fost deja utilizată", "UsedPayment": "Această plată a fost deja utilizată",
"ManageLicense": "Administrare licență", "ManageLicense": "Administrare licență",
"AbpPlatformLeptonXTheme": "Tema LeptonX pentru panoul tău de administrare de la <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Tema LeptonX pentru panoul tău de administrare de la <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Anterior",
"PricingDiscount": "Reducere",
"YourOrganizationOverview": "Prezentare generală a organizației dvs",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} oră",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} ore"
} }
} }

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

@ -611,7 +611,7 @@
"StartupTemplates_Page_Description": "ABP Commercial позволяет создавать решения любого уровня сложности. ", "StartupTemplates_Page_Description": "ABP Commercial позволяет создавать решения любого уровня сложности. ",
"MicroserviceStartupSolutionForDotnet": "Решение для запуска микросервисов для .NET", "MicroserviceStartupSolutionForDotnet": "Решение для запуска микросервисов для .NET",
"MonolithSolutionForDotnet": "Монолитное (модульное) решение для .NET", "MonolithSolutionForDotnet": "Монолитное (модульное) решение для .NET",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} час(а)", "TrainingDetailsHeaderInfo_TrainingHour": "{0} часа",
"Trainings_Content": "Содержание обучения", "Trainings_Content": "Содержание обучения",
"Trial_Page_StartYourFreeTrial": "Начните свой <span class=\"gradient-commercial\">Бесплатная пробная версия</span>", "Trial_Page_StartYourFreeTrial": "Начните свой <span class=\"gradient-commercial\">Бесплатная пробная версия</span>",
"TrialLicenseFeatures": "Вы сможете воспользоваться всеми коммерческими функциями ABP.", "TrialLicenseFeatures": "Вы сможете воспользоваться всеми коммерческими функциями ABP.",
@ -1089,6 +1089,10 @@
"PaymentFailedInfo": "Извините, оплата не удалась! ", "PaymentFailedInfo": "Извините, оплата не удалась! ",
"UsedPayment": "Этот платеж уже использован", "UsedPayment": "Этот платеж уже использован",
"ManageLicense": "Управление лицензией", "ManageLicense": "Управление лицензией",
"AbpPlatformLeptonXTheme": "Тема LeptonX для вашей панели администратора от <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Тема LeptonX для вашей панели администратора от <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Предыдущий",
"PricingDiscount": "Скидка",
"YourOrganizationOverview": "Обзор вашей организации",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} час"
} }
} }

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

@ -407,6 +407,11 @@
"PaymentFailedInfo": "Ľutujeme, platba zlyhala! ", "PaymentFailedInfo": "Ľutujeme, platba zlyhala! ",
"UsedPayment": "Táto platba už bola použitá", "UsedPayment": "Táto platba už bola použitá",
"ManageLicense": "Spravovať licenciu", "ManageLicense": "Spravovať licenciu",
"AbpPlatformLeptonXTheme": "Téma LeptonX pre váš administratívny panel od <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Téma LeptonX pre váš administratívny panel od <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Predchádzajúce",
"PricingDiscount": "Zľava",
"YourOrganizationOverview": "Prehľad vašej organizácie",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} hodina",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} hodín"
} }
} }

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

@ -388,6 +388,11 @@
"PaymentFailedInfo": "Žal plačilo ni uspelo! ", "PaymentFailedInfo": "Žal plačilo ni uspelo! ",
"UsedPayment": "To plačilo je že bilo uporabljeno", "UsedPayment": "To plačilo je že bilo uporabljeno",
"ManageLicense": "Upravljanje licenco", "ManageLicense": "Upravljanje licenco",
"AbpPlatformLeptonXTheme": "LeptonX Tema za vaš upraviteljski nadzorni pult s strani <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "LeptonX Tema za vaš upraviteljski nadzorni pult s strani <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Prejšnja",
"PricingDiscount": "Popust",
"YourOrganizationOverview": "Pregled vaše organizacije",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} ura",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} ur"
} }
} }

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

@ -274,7 +274,7 @@
"LiveTrainingSupport": "Canlı eğitim ve destek", "LiveTrainingSupport": "Canlı eğitim ve destek",
"AndMore": "ve dahası", "AndMore": "ve dahası",
"AdditionalDeveloperLicense": "Ek geliştirici lisansı", "AdditionalDeveloperLicense": "Ek geliştirici lisansı",
"ProjectCount": "proje sayısı", "ProjectCount": "Proje sayısı",
"AllProModules": "Tüm profesyonel modüller", "AllProModules": "Tüm profesyonel modüller",
"AllProThemes": "Tüm profesyonel temalar", "AllProThemes": "Tüm profesyonel temalar",
"AllProStartupTemplates": "Tüm profesyonel başlangıç şablonları", "AllProStartupTemplates": "Tüm profesyonel başlangıç şablonları",
@ -615,12 +615,12 @@
"TotalDeveloperPrice": "Toplam Geliştirici Fiyatı", "TotalDeveloperPrice": "Toplam Geliştirici Fiyatı",
"Purchase_PricePerDeveloper": "<span>{0}</span> geliştirici başına", "Purchase_PricePerDeveloper": "<span>{0}</span> geliştirici başına",
"Purchase_IncludedDeveloperInfo": "{0} {1} dahil.", "Purchase_IncludedDeveloperInfo": "{0} {1} dahil.",
"Purchase_LicenseExtraDeveloperPurchaseMessage": "<span class=\"fw-6\">{0} lisansı</span> {1} geliştirici(ler) içerir. Şimdi veya daha sonra ek geliştiriciler ekleyebilirsiniz.", "Purchase_LicenseExtraDeveloperPurchaseMessage": "<span class=\"fw-6\">{0} lisansı</span> {1} geliştirici içerir. Şimdi veya daha sonra ek geliştirici ekleyebilirsiniz.",
"StartupTemplates_Page_Title": "ABP Başlangıç Şablonları", "StartupTemplates_Page_Title": "ABP Başlangıç Şablonları",
"StartupTemplates_Page_Description": "ABP Commercial, her düzeyde karmaşıklığa sahip projeler oluşturmanıza olanak tanır. Önceden oluşturulmuş iki ana başlangıç projesi sunar. Gereksinimlerinize yakın olanı seçebilir ve bunun üzerine kendi özel projenizi oluşturabilirsiniz.", "StartupTemplates_Page_Description": "ABP Commercial, her düzeyde karmaşıklığa sahip projeler oluşturmanıza olanak tanır. Önceden oluşturulmuş iki ana başlangıç projesi sunar. Gereksinimlerinize yakın olanı seçebilir ve bunun üzerine kendi özel projenizi oluşturabilirsiniz.",
"MicroserviceStartupSolutionForDotnet": ".NET için Mikroservis Başlatma Projesi", "MicroserviceStartupSolutionForDotnet": ".NET için Mikroservis Başlatma Projesi",
"MonolithSolutionForDotnet": ".NET için Monolith (modüler) Proje", "MonolithSolutionForDotnet": ".NET için Monolith (modüler) Proje",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} saat(ler)", "TrainingDetailsHeaderInfo_TrainingHour": "{0} saat",
"Trainings_Content": "Eğitim İçeriği", "Trainings_Content": "Eğitim İçeriği",
"Trial_Page_StartYourFreeTrial": "<span class=\"gradient-commercial\">Ücretsiz Denemenizi</span> Başlatın", "Trial_Page_StartYourFreeTrial": "<span class=\"gradient-commercial\">Ücretsiz Denemenizi</span> Başlatın",
"TrialLicenseFeatures": "Tüm ABP Commercial özelliklerinden yararlanabileceksiniz", "TrialLicenseFeatures": "Tüm ABP Commercial özelliklerinden yararlanabileceksiniz",
@ -998,6 +998,10 @@
"MyOrganizations_Detail_LicenseStartDate": "Lisans Başlangıç Tarihi", "MyOrganizations_Detail_LicenseStartDate": "Lisans Başlangıç Tarihi",
"MyOrganizations_Detail_LicenseExpiryDate": "Bitiş Tarihi", "MyOrganizations_Detail_LicenseExpiryDate": "Bitiş Tarihi",
"ManageLicense": "Lisansı Yönet", "ManageLicense": "Lisansı Yönet",
"AbpPlatformLeptonXTheme": "<span class=\"gradient-commercial\">ABP Platform</span> Yönetici Kontrol Paneliniz için LeptonX Teması" "AbpPlatformLeptonXTheme": "<span class=\"gradient-commercial\">ABP Platform</span> Yönetici Kontrol Paneliniz için LeptonX Teması",
"Previous": "Önceki",
"PricingDiscount": "İndirim",
"YourOrganizationOverview": "Organizasyon Detayı",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} saat"
} }
} }

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

@ -388,6 +388,11 @@
"PaymentFailedInfo": "Rất tiếc, thanh toán không thành công! ", "PaymentFailedInfo": "Rất tiếc, thanh toán không thành công! ",
"UsedPayment": "Khoản thanh toán này đã được sử dụng", "UsedPayment": "Khoản thanh toán này đã được sử dụng",
"ManageLicense": "Quản lý Giấy phép", "ManageLicense": "Quản lý Giấy phép",
"AbpPlatformLeptonXTheme": "Chủ đề LeptonX cho Bảng điều khiển quản trị của bạn bởi <span class=\"gradient-commercial\">ABP Platform</span>" "AbpPlatformLeptonXTheme": "Chủ đề LeptonX cho Bảng điều khiển quản trị của bạn bởi <span class=\"gradient-commercial\">ABP Platform</span>",
"Previous": "Trước",
"PricingDiscount": "Popust",
"YourOrganizationOverview": "Tổng quan về tổ chức của bạn",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} giờ",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} giờ"
} }
} }

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

@ -1090,6 +1090,10 @@
"PaymentFailedInfo": "抱歉,支付失败!", "PaymentFailedInfo": "抱歉,支付失败!",
"UsedPayment": "该付款已被使用", "UsedPayment": "该付款已被使用",
"ManageLicense": "管理许可证", "ManageLicense": "管理许可证",
"AbpPlatformLeptonXTheme": "由 <span class=\"gradient-commercial\">ABP Platform</span> 提供的您的管理仪表板的 LeptonX 主题" "AbpPlatformLeptonXTheme": "由 <span class=\"gradient-commercial\">ABP Platform</span> 提供的您的管理仪表板的 LeptonX 主题",
"Previous": "以前的",
"PricingDiscount": "折扣",
"YourOrganizationOverview": "您的组织概览",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} 小时"
} }
} }

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

@ -1079,6 +1079,10 @@
"PaymentFailedInfo": "抱歉,支付失败!", "PaymentFailedInfo": "抱歉,支付失败!",
"UsedPayment": "该付款已被使用", "UsedPayment": "该付款已被使用",
"ManageLicense": "管理許可證", "ManageLicense": "管理許可證",
"AbpPlatformLeptonXTheme": "由 <span class=\"gradient-commercial\">ABP Platform</span> 提供的您的管理儀表板的 LeptonX 主題" "AbpPlatformLeptonXTheme": "由 <span class=\"gradient-commercial\">ABP Platform</span> 提供的您的管理儀表板的 LeptonX 主題",
"Previous": "以前的",
"PricingDiscount": "折扣",
"YourOrganizationOverview": "您的组织概览",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} 小时"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ar.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "مطور برامج، مدير تكنولوجيا المعلومات، إلخ.", "TitlePlaceholder": "مطور برامج، مدير تكنولوجيا المعلومات، إلخ.",
"Characters": "الأحرف", "Characters": "الأحرف",
"ABPTestimonialDescription": "ABP Framework: دعونا نسمع شهادتك", "ABPTestimonialDescription": "ABP Framework: دعونا نسمع شهادتك",
"LeaveUsReview": "ترك لنا المراجعة" "LeaveUsReview": "ترك لنا المراجعة",
"DocumentationButtonTitle": "توثيق"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/cs.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Vývojář softwaru, CTO atd.", "TitlePlaceholder": "Vývojář softwaru, CTO atd.",
"Characters": "znaky", "Characters": "znaky",
"ABPTestimonialDescription": "ABP Framework: Pojďme slyšet vaši referenci", "ABPTestimonialDescription": "ABP Framework: Pojďme slyšet vaši referenci",
"LeaveUsReview": "Zanechte nám recenzi" "LeaveUsReview": "Zanechte nám recenzi",
"DocumentationButtonTitle": "Dokumentace"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/de.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Softwareentwickler, CTO usw.", "TitlePlaceholder": "Softwareentwickler, CTO usw.",
"Characters": "zeichen", "Characters": "zeichen",
"ABPTestimonialDescription": "ABP Framework: Lass uns deine Bewertung hören", "ABPTestimonialDescription": "ABP Framework: Lass uns deine Bewertung hören",
"LeaveUsReview": "Hinterlassen Sie uns eine Bewertung" "LeaveUsReview": "Hinterlassen Sie uns eine Bewertung",
"DocumentationButtonTitle": "Dokumentation"
} }
} }

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

@ -479,6 +479,8 @@
"PasswordRequired": "The Password field is required.", "PasswordRequired": "The Password field is required.",
"AddressLength": "The field Address must be a string with a maximum length of 255.", "AddressLength": "The field Address must be a string with a maximum length of 255.",
"GenderRequired": "The Gender field is required.", "GenderRequired": "The Gender field is required.",
"LeaveUsReview": "Leave us review" "LeaveUsReview": "Leave us review",
"DocumentationButtonTitle": "Documentation"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/es.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Desarrollador de software, CTO, etc.", "TitlePlaceholder": "Desarrollador de software, CTO, etc.",
"Characters": "caracteres", "Characters": "caracteres",
"ABPTestimonialDescription": "ABP Framework: Escuchemos tu testimonio", "ABPTestimonialDescription": "ABP Framework: Escuchemos tu testimonio",
"LeaveUsReview": "Déjanos tu reseña" "LeaveUsReview": "Déjanos tu reseña",
"DocumentationButtonTitle": "Documentación"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/fi.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Ohjelmistokehittäjä, CTO, jne.", "TitlePlaceholder": "Ohjelmistokehittäjä, CTO, jne.",
"Characters": "hahmot", "Characters": "hahmot",
"ABPTestimonialDescription": "ABP Framework: Kuunnellaanpa sinun suosittelua", "ABPTestimonialDescription": "ABP Framework: Kuunnellaanpa sinun suosittelua",
"LeaveUsReview": "Jätä meille arvostelu" "LeaveUsReview": "Jätä meille arvostelu",
"DocumentationButtonTitle": "Dokumentointi"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/fr.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Développeur de logiciels, CTO, etc.", "TitlePlaceholder": "Développeur de logiciels, CTO, etc.",
"Characters": "caractères", "Characters": "caractères",
"ABPTestimonialDescription": "ABP Framework : Écoutons votre témoignage", "ABPTestimonialDescription": "ABP Framework : Écoutons votre témoignage",
"LeaveUsReview": "Laissez-nous votre avis" "LeaveUsReview": "Laissez-nous votre avis",
"DocumentationButtonTitle": "Documentation"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hi.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "सॉफ़्टवेयर डेवेलपर, सीटीओ, आदि।", "TitlePlaceholder": "सॉफ़्टवेयर डेवेलपर, सीटीओ, आदि।",
"Characters": "अक्षर", "Characters": "अक्षर",
"ABPTestimonialDescription": "ABP Framework: आइए आपका प्रशंसापत्र सुनें", "ABPTestimonialDescription": "ABP Framework: आइए आपका प्रशंसापत्र सुनें",
"LeaveUsReview": "हमें समीक्षा छोड़ें" "LeaveUsReview": "हमें समीक्षा छोड़ें",
"DocumentationButtonTitle": "प्रलेखन"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hr.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Razvojni inženjer, CTO, itd.", "TitlePlaceholder": "Razvojni inženjer, CTO, itd.",
"Characters": "znakovi", "Characters": "znakovi",
"ABPTestimonialDescription": "ABP Framework: Hajde da čujemo tvoje iskustvo", "ABPTestimonialDescription": "ABP Framework: Hajde da čujemo tvoje iskustvo",
"LeaveUsReview": "Ostavite nam recenziju" "LeaveUsReview": "Ostavite nam recenziju",
"DocumentationButtonTitle": "Dokumentacija"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hu.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Szoftvertervező, CTO, stb.", "TitlePlaceholder": "Szoftvertervező, CTO, stb.",
"Characters": "karakterek", "Characters": "karakterek",
"ABPTestimonialDescription": "ABP Framework: Halljuk az Ön beszámolóját", "ABPTestimonialDescription": "ABP Framework: Halljuk az Ön beszámolóját",
"LeaveUsReview": "Hagyjon véleményt nekünk" "LeaveUsReview": "Hagyjon véleményt nekünk",
"DocumentationButtonTitle": "Dokumentáció"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/is.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Hugbúnaðarþróunarmiðill, CTO o.s.frv.", "TitlePlaceholder": "Hugbúnaðarþróunarmiðill, CTO o.s.frv.",
"Characters": "stafir", "Characters": "stafir",
"ABPTestimonialDescription": "ABP Framework: Við skulum heyra vitnisburð þinn", "ABPTestimonialDescription": "ABP Framework: Við skulum heyra vitnisburð þinn",
"LeaveUsReview": "Skildu eftir okkur umsögn" "LeaveUsReview": "Skildu eftir okkur umsögn",
"DocumentationButtonTitle": "Skjöl"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/it.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Sviluppatore di software, CTO ecc.", "TitlePlaceholder": "Sviluppatore di software, CTO ecc.",
"Characters": "caratteri", "Characters": "caratteri",
"ABPTestimonialDescription": "ABP Framework: Ascoltiamo la tua testimonianza", "ABPTestimonialDescription": "ABP Framework: Ascoltiamo la tua testimonianza",
"LeaveUsReview": "Lasciaci una recensione" "LeaveUsReview": "Lasciaci una recensione",
"DocumentationButtonTitle": "Documentazione"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/nl.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Softwareontwikkelaar, CTO enz.", "TitlePlaceholder": "Softwareontwikkelaar, CTO enz.",
"Characters": "tekens", "Characters": "tekens",
"ABPTestimonialDescription": "ABP Framework: Laten we uw getuigenis horen", "ABPTestimonialDescription": "ABP Framework: Laten we uw getuigenis horen",
"LeaveUsReview": "Laat ons een beoordeling achter" "LeaveUsReview": "Laat ons een beoordeling achter",
"DocumentationButtonTitle": "Documentatie"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/pl-PL.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Programista, CTO itp.", "TitlePlaceholder": "Programista, CTO itp.",
"Characters": "znaki", "Characters": "znaki",
"ABPTestimonialDescription": "Struktura ABP: Posłuchajmy Twojej opinii", "ABPTestimonialDescription": "Struktura ABP: Posłuchajmy Twojej opinii",
"LeaveUsReview": "Zostaw nam recenzję" "LeaveUsReview": "Zostaw nam recenzję",
"DocumentationButtonTitle": "Dokumentacja"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/pt-BR.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Desenvolvedor de software, CTO etc.", "TitlePlaceholder": "Desenvolvedor de software, CTO etc.",
"Characters": "caracteres", "Characters": "caracteres",
"ABPTestimonialDescription": "Estrutura ABP: vamos ouvir seu depoimento", "ABPTestimonialDescription": "Estrutura ABP: vamos ouvir seu depoimento",
"LeaveUsReview": "Deixe-nos uma avaliação" "LeaveUsReview": "Deixe-nos uma avaliação",
"DocumentationButtonTitle": "Documentação"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Dezvoltator software, CTO etc.", "TitlePlaceholder": "Dezvoltator software, CTO etc.",
"Characters": "caractere", "Characters": "caractere",
"ABPTestimonialDescription": "Cadrul ABP: Haideți să vă ascultăm mărturia", "ABPTestimonialDescription": "Cadrul ABP: Haideți să vă ascultăm mărturia",
"LeaveUsReview": "Lasă-ne o recenzie" "LeaveUsReview": "Lasă-ne o recenzie",
"DocumentationButtonTitle": "Documentație"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ru.json

@ -466,6 +466,7 @@
"TitlePlaceholder": "Разработчик программного обеспечения, технический директор и т. д.", "TitlePlaceholder": "Разработчик программного обеспечения, технический директор и т. д.",
"Characters": "Символы", "Characters": "Символы",
"ABPTestimonialDescription": "ABP Framework: давайте послушаем ваш отзыв", "ABPTestimonialDescription": "ABP Framework: давайте послушаем ваш отзыв",
"LeaveUsReview": "Оставьте нам отзыв" "LeaveUsReview": "Оставьте нам отзыв",
"DocumentationButtonTitle": "Документация"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/sk.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Vývojár softvéru, CTO atď.", "TitlePlaceholder": "Vývojár softvéru, CTO atď.",
"Characters": "znaky", "Characters": "znaky",
"ABPTestimonialDescription": "Rámec ABP: Vypočujme si vaše svedectvo", "ABPTestimonialDescription": "Rámec ABP: Vypočujme si vaše svedectvo",
"LeaveUsReview": "Zanechajte nám recenziu" "LeaveUsReview": "Zanechajte nám recenziu",
"DocumentationButtonTitle": "Dokumentácia"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/sl.json

@ -468,6 +468,7 @@
"TitlePlaceholder": "Razvijalec programske opreme, tehnični direktor itd.", "TitlePlaceholder": "Razvijalec programske opreme, tehnični direktor itd.",
"Characters": "znaki", "Characters": "znaki",
"ABPTestimonialDescription": "Ogrodje ABP: poslušajmo vaše pričevanje", "ABPTestimonialDescription": "Ogrodje ABP: poslušajmo vaše pričevanje",
"LeaveUsReview": "Pustite nam oceno" "LeaveUsReview": "Pustite nam oceno",
"DocumentationButtonTitle": "Dokumentacija"
} }
} }

17
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json

@ -154,7 +154,7 @@
"AndMore": "ve dahası...", "AndMore": "ve dahası...",
"Code": "Kod", "Code": "Kod",
"Result": "Sonuç", "Result": "Sonuç",
"SeeTheDocumentForMoreInformation": "Daha fazlası için <a href=\"{1}\">{0} dökümantasyonuna</a> göz atın.", "SeeTheDocumentForMoreInformation": "Daha fazlası için <a href=\"{1}\">{0} dokümantasyonuna</a> göz atın.",
"IndexPageHeroSection": "<span class=\"first-line shine\"><strong>open source</strong></span><span class=\"second-line text-uppercase\">Web Application<br />Framework </span><span class=\"third-line shine2\"><strong>for asp.net core</strong></span>", "IndexPageHeroSection": "<span class=\"first-line shine\"><strong>open source</strong></span><span class=\"second-line text-uppercase\">Web Application<br />Framework </span><span class=\"third-line shine2\"><strong>for asp.net core</strong></span>",
"UiFramework": "UI Framework", "UiFramework": "UI Framework",
"EmailAddress": "E-Posta Adresi", "EmailAddress": "E-Posta Adresi",
@ -178,7 +178,7 @@
"ProgressiveWebApplication": "Progresif Web Uygulaması", "ProgressiveWebApplication": "Progresif Web Uygulaması",
"UseslatestPreVersion": "En son yayın öncesi sürümünü kullanır", "UseslatestPreVersion": "En son yayın öncesi sürümünü kullanır",
"ReadTheDocumentation": "<span class=\"text-primary\">Belgeleri okuyun</span><span class=\"text-success\"></span>", "ReadTheDocumentation": "<span class=\"text-primary\">Belgeleri okuyun</span><span class=\"text-success\"></span>",
"Documentation": "Dökümanlar", "Documentation": "Dokümanlar",
"GettingStartedTutorial": "Başlarken Eğitimi", "GettingStartedTutorial": "Başlarken Eğitimi",
"ApplicationDevelopmentTutorial": "Uygulama Geliştirme Eğitimi", "ApplicationDevelopmentTutorial": "Uygulama Geliştirme Eğitimi",
"TheStartupTemplate": "Başlangıç Şablonu", "TheStartupTemplate": "Başlangıç Şablonu",
@ -214,7 +214,7 @@
"Packages": "Paketler", "Packages": "Paketler",
"NugetPackages": "Nuget Paketleri", "NugetPackages": "Nuget Paketleri",
"NPMPackages": "NPM Paketleri", "NPMPackages": "NPM Paketleri",
"SeeDocs": "Dökümanı Görüntüle", "SeeDocs": "Dokümanı Görüntüle",
"None": "Hiçbiri", "None": "Hiçbiri",
"Application": "Uygulama", "Application": "Uygulama",
"ApplicationExplanation": "Domain Driven Design pratikleri üzerine oluşturulmuş çok katmanlı bir çözüm oluşturur. Bakıma ve geliştirmeye açık kod tabanına ihtiyaç duyan uzun süreli projeler için önerilir.", "ApplicationExplanation": "Domain Driven Design pratikleri üzerine oluşturulmuş çok katmanlı bir çözüm oluşturur. Bakıma ve geliştirmeye açık kod tabanına ihtiyaç duyan uzun süreli projeler için önerilir.",
@ -227,7 +227,7 @@
"License": "Lisans", "License": "Lisans",
"ProjectCreationSuccessMessage": "Projeniz başarıyla oluşturulmuştur", "ProjectCreationSuccessMessage": "Projeniz başarıyla oluşturulmuştur",
"HowToRunSolution": "Uygulamayı Nasıl Çalıştırabiliriz?", "HowToRunSolution": "Uygulamayı Nasıl Çalıştırabiliriz?",
"GettingStartedMessage": "Uygulamanızı nasıl yapılandıracağınızı ve çalıştıracağınızı öğrenmek için başlanıç dökümanına bakınız.", "GettingStartedMessage": "Uygulamanızı nasıl yapılandıracağınızı ve çalıştıracağınızı öğrenmek için başlanıç dokümanına bakınız.",
"WebAppDevTutorial": "Web Uygulaması Geliştirme Öğreticisi", "WebAppDevTutorial": "Web Uygulaması Geliştirme Öğreticisi",
"WebAppDevTutorialMessage": "Adım adım web uygulaması geliştirme örneği için web uygulaması geliştirme öğreticisine bakınız.", "WebAppDevTutorialMessage": "Adım adım web uygulaması geliştirme örneği için web uygulaması geliştirme öğreticisine bakınız.",
"CommunityPosts": "Topluluk Makaleleri", "CommunityPosts": "Topluluk Makaleleri",
@ -238,7 +238,6 @@
"ClientSideDevelopmentDocumentationMessage": "Kullanıcı arayüzü (istemci tarafı) geliştirmeyle ilgili temel noktaları öğrenmek için {0} belgesine bakın.", "ClientSideDevelopmentDocumentationMessage": "Kullanıcı arayüzü (istemci tarafı) geliştirmeyle ilgili temel noktaları öğrenmek için {0} belgesine bakın.",
"DatabaseProviderDocumentationMessage": "Veritabanı katmanı geliştirmeyle ilgili temel noktaları öğrenmek için {0} belgesine bakın.", "DatabaseProviderDocumentationMessage": "Veritabanı katmanı geliştirmeyle ilgili temel noktaları öğrenmek için {0} belgesine bakın.",
"ABPCommercialExplanationMessage": "ABP Commercial, ABP Framework için premium modüller, temalar, araçlar ve destek sağlar.", "ABPCommercialExplanationMessage": "ABP Commercial, ABP Framework için premium modüller, temalar, araçlar ve destek sağlar.",
"ImplementingDDD": "Domain Driven Design'ı Uygulayın",
"DDDBookExplanation": "ABP Framework ile Domain Driven Design'ın uygulanması için pratik bir kılavuz.", "DDDBookExplanation": "ABP Framework ile Domain Driven Design'ın uygulanması için pratik bir kılavuz.",
"Overview": "Genel Bakış", "Overview": "Genel Bakış",
"DDDBookPracticalGuide": "Bu kitap Domain Driven Design'ın uygulanması için pratik bir kılavuz görevi görür. Uygulama ayrıntıları ABP Framework altyapısına dayanırken, temel kavramlar, prensipler ve modeller bir .NET çözümü olmasa bile her türlü çözümde uygulanabilir.", "DDDBookPracticalGuide": "Bu kitap Domain Driven Design'ın uygulanması için pratik bir kılavuz görevi görür. Uygulama ayrıntıları ABP Framework altyapısına dayanırken, temel kavramlar, prensipler ve modeller bir .NET çözümü olmasa bile her türlü çözümde uygulanabilir.",
@ -290,7 +289,7 @@
"AbpNewCommandExplanation": "ABP başlangıç şablonlarını kullanarak yeni çözümler oluşturur.", "AbpNewCommandExplanation": "ABP başlangıç şablonlarını kullanarak yeni çözümler oluşturur.",
"AbpAddModuleCommandExplanation": "Çözümünüze önceden oluşturulmuş uygulama modülleri yükler", "AbpAddModuleCommandExplanation": "Çözümünüze önceden oluşturulmuş uygulama modülleri yükler",
"ExploreAllCLICommands": "Tüm CLI komutlarını keşfedin", "ExploreAllCLICommands": "Tüm CLI komutlarını keşfedin",
"ExploreDocumentationAndGuides": "Kapsamlı belge ve kılavuzları keşfedin.", "ExploreDocumentationAndGuides": "Kapsamlı doküman ve kılavuzları keşfedin.",
"Documentations": "Belgeler", "Documentations": "Belgeler",
"Views": "Görünümler", "Views": "Görünümler",
"ReadMore": "Daha fazla oku", "ReadMore": "Daha fazla oku",
@ -428,6 +427,10 @@
"PasswordRequired": "Şifre alanı zorunludur.", "PasswordRequired": "Şifre alanı zorunludur.",
"AddressLength": "Adres alanı maksimum uzunluğu 255 karakter olmalıdır.", "AddressLength": "Adres alanı maksimum uzunluğu 255 karakter olmalıdır.",
"GenderRequired": "Cinsiyet alanı zorunludur.", "GenderRequired": "Cinsiyet alanı zorunludur.",
"LeaveUsReview": "Yorumunuzu paylaşın" "LeaveUsReview": "Yorumunuzu paylaşın",
"BuildingMicroserviceSolutionsShortDescription": "Bu kitap, ABP Framework kullanarak mikroservis tabanlı uygulamalar geliştirmek ve yönetmek için bir başvuru rehberidir.",
"VideoCourses": "Video Kurslar",
"DocumentationButtonTitle": "Dokümantasyon"
} }
} }

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

@ -468,6 +468,8 @@
"TitlePlaceholder": "Nhà phát triển phần mềm, CTO, v.v.", "TitlePlaceholder": "Nhà phát triển phần mềm, CTO, v.v.",
"Characters": "Ký tự", "Characters": "Ký tự",
"ABPTestimonialDescription": "Khung ABP: Hãy nghe lời chứng thực của bạn", "ABPTestimonialDescription": "Khung ABP: Hãy nghe lời chứng thực của bạn",
"LeaveUsReview": "Để lại cho chúng tôi xem xét" "LeaveUsReview": "Để lại cho chúng tôi xem xét",
"DocumentationButtonTitle": "Tài liệu"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json

@ -470,6 +470,7 @@
"TitlePlaceholder": "软件开发人员、CTO等", "TitlePlaceholder": "软件开发人员、CTO等",
"Characters": "字符", "Characters": "字符",
"ABPTestimonialDescription": "ABP 框架:让我们听听您的感言", "ABPTestimonialDescription": "ABP 框架:让我们听听您的感言",
"LeaveUsReview": "给我们留下评论" "LeaveUsReview": "给我们留下评论",
"DocumentationButtonTitle": "文档"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hant.json

@ -470,6 +470,7 @@
"TitlePlaceholder": "软件开发人员、CTO等", "TitlePlaceholder": "软件开发人员、CTO等",
"Characters": "字符", "Characters": "字符",
"ABPTestimonialDescription": "ABP 框架:让我们听听您的感言", "ABPTestimonialDescription": "ABP 框架:让我们听听您的感言",
"LeaveUsReview": "给我们留下评论" "LeaveUsReview": "给我们留下评论",
"DocumentationButtonTitle": "文档"
} }
} }

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

@ -65,8 +65,9 @@ Now, it's ready to configure the application for the static client proxy generat
````csharp ````csharp
[DependsOn( [DependsOn(
typeof(AbpHttpClientModule) //used to create client proxies typeof(AbpHttpClientModule), //used to create client proxies
)] typeof(AbpVirtualFileSystemModule) //virtual file system
)]
public class MyClientAppModule : AbpModule public class MyClientAppModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
@ -75,6 +76,12 @@ public class MyClientAppModule : AbpModule
context.Services.AddStaticHttpClientProxies( context.Services.AddStaticHttpClientProxies(
typeof(MyClientAppModule).Assembly typeof(MyClientAppModule).Assembly
); );
// Include the generated app-generate-proxy.json in the virtual file system
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<MyClientAppModule>();
});
} }
} }
```` ````
@ -84,8 +91,9 @@ public class MyClientAppModule : AbpModule
````csharp ````csharp
[DependsOn( [DependsOn(
typeof(AbpHttpClientModule), //used to create client proxies typeof(AbpHttpClientModule), //used to create client proxies
typeof(AbpVirtualFileSystemModule), //virtual file system
typeof(BookStoreApplicationContractsModule) //contains the application service interfaces typeof(BookStoreApplicationContractsModule) //contains the application service interfaces
)] )]
public class MyClientAppModule : AbpModule public class MyClientAppModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
@ -94,6 +102,12 @@ public class MyClientAppModule : AbpModule
context.Services.AddStaticHttpClientProxies( context.Services.AddStaticHttpClientProxies(
typeof(BookStoreApplicationContractsModule).Assembly typeof(BookStoreApplicationContractsModule).Assembly
); );
// Include the generated app-generate-proxy.json in the virtual file system
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<MyClientAppModule>();
});
} }
} }
```` ````
@ -139,7 +153,7 @@ This command should generate the following files under the `ClientProxies` folde
* `BookClientProxy.Generated.cs` is the actual generated proxy class in this example. `BookClientProxy` is a `partial` class * where you can write your custom code (ABP won't override it). * `BookClientProxy.Generated.cs` is the actual generated proxy class in this example. `BookClientProxy` is a `partial` class * where you can write your custom code (ABP won't override it).
* `IBookAppService.cs` is the app service. * `IBookAppService.cs` is the app service.
* `BookDto.cs` is the Dto class which uses by app service. * `BookDto.cs` is the Dto class which uses by app service.
* `app-generate-proxy.json` contains information about the remote HTTP endpoint, so ABP can properly perform HTTP requests. * `app-generate-proxy.json` contains information about the remote HTTP endpoint, so ABP can properly perform HTTP requests. This file must be configured as an embedded resource in your project, so that it can be found by the virtual file system.
#### Without Contracts #### Without Contracts
@ -152,7 +166,7 @@ This command should generate the following files under the `ClientProxies` folde
![generated-static-client-proxies](../images/generated-static-client-proxies-without-contracts.png) ![generated-static-client-proxies](../images/generated-static-client-proxies-without-contracts.png)
* `BookClientProxy.Generated.cs` is the actual generated proxy class in this example. `BookClientProxy` is a `partial` class where you can write your custom code (ABP won't override it). * `BookClientProxy.Generated.cs` is the actual generated proxy class in this example. `BookClientProxy` is a `partial` class where you can write your custom code (ABP won't override it).
* `app-generate-proxy.json` contains information about the remote HTTP endpoint, so ABP can properly perform HTTP requests. * `app-generate-proxy.json` contains information about the remote HTTP endpoint, so ABP can properly perform HTTP requests. This file must be configured as an embedded resource in your project, so that it can be found by the virtual file system.
> `generate-proxy` command generates proxies for only the APIs you've defined in your application. If you are developing a modular application, you can specify the `-m` (or `--module`) parameter to specify the module you want to generate proxies. See the *generate-proxy* section in the [ABP CLI](../CLI.md) documentation for other options. > `generate-proxy` command generates proxies for only the APIs you've defined in your application. If you are developing a modular application, you can specify the `-m` (or `--module`) parameter to specify the module you want to generate proxies. See the *generate-proxy* section in the [ABP CLI](../CLI.md) documentation for other options.

2
docs/en/Getting-Started-Setup-Environment-Single-Layer.md

@ -30,7 +30,7 @@ The following tools should be installed on your development machine:
* An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 8.0+](https://dotnet.microsoft.com/download/dotnet) development. * An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 8.0+](https://dotnet.microsoft.com/download/dotnet) development.
{{ if UI != "Blazor" }} {{ if UI != "Blazor" }}
* [Node v16 or v18](https://nodejs.org/) * [Node v16+](https://nodejs.org/)
* [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) <sup id="a-yarn">[1](#f-yarn)</sup> or npm v6+ (already installed with Node) * [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) <sup id="a-yarn">[1](#f-yarn)</sup> or npm v6+ (already installed with Node)
{{ end }} {{ end }}

2
docs/en/Getting-Started-Setup-Environment.md

@ -30,7 +30,7 @@ The following tools should be installed on your development machine:
* An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 8.0+](https://dotnet.microsoft.com/download/dotnet) development. * An IDE (e.g. [Visual Studio](https://visualstudio.microsoft.com/vs/)) that supports [.NET 8.0+](https://dotnet.microsoft.com/download/dotnet) development.
{{ if UI != "Blazor" }} {{ if UI != "Blazor" }}
* [Node v16 or v18](https://nodejs.org/) * [Node v16+](https://nodejs.org/)
* [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) <sup id="a-yarn">[1](#f-yarn)</sup> or npm v6+ (already installed with Node) * [Yarn v1.20+ (not v2)](https://classic.yarnpkg.com/en/docs/install) <sup id="a-yarn">[1](#f-yarn)</sup> or npm v6+ (already installed with Node)
{{ end }} {{ end }}
{{ if Tiered == "Yes" }} {{ if Tiered == "Yes" }}

4
docs/en/Modules/OpenIddict.md

@ -215,6 +215,10 @@ This module implements OpenIddict stores:
- `IOpenIddictScopeStore` - `IOpenIddictScopeStore`
- `IOpenIddictTokenStore` - `IOpenIddictTokenStore`
#### AbpOpenIddictStoreOptions
You can configure the `PruneIsolationLevel/DeleteIsolationLevel` of `AbpOpenIddictStoreOptions` to set the isolation level for the store operations becasue different databases have different isolation levels.
##### Repositories ##### Repositories
The following custom repositories are defined in this module: The following custom repositories are defined in this module:

4
docs/en/Modules/Tenant-Management.md

@ -56,7 +56,7 @@ This module defines the following ETOs (Event Transfer Objects) to allow you to
**Example: Get notified when a new tenant has been created** **Example: Get notified when a new tenant has been created**
``` ```cs
public class MyHandler : public class MyHandler :
IDistributedEventHandler<EntityCreatedEto<TenantEto>>, IDistributedEventHandler<EntityCreatedEto<TenantEto>>,
ITransientDependency ITransientDependency
@ -131,4 +131,4 @@ ABP Framework allows to use *database per tenant* approach that allows a tenant
## See Also ## See Also
* [Multi-Tenancy](../Multi-Tenancy.md) * [Multi-Tenancy](../Multi-Tenancy.md)
* [ABP Commercial SaaS Module](https://docs.abp.io/en/commercial/latest/modules/saas) * [ABP Commercial SaaS Module](https://docs.abp.io/en/commercial/latest/modules/saas)

78
docs/en/Repositories.md

@ -2,13 +2,13 @@
"*Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects*" (Martin Fowler). "*Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects*" (Martin Fowler).
Repositories, in practice, are used to perform database operations for domain objects (see [Entities](Entities.md)). Generally, a separated repository is used for each **aggregate root** or entity. Repositories, in practice, are used to perform database operations for domain objects (see [Entities](Entities.md)). Generally, a separate repository is used for each **aggregate root** or entity.
## Generic Repositories ## Generic Repositories
ABP can provide a **default generic repository** for each aggregate root or entity. You can [inject](Dependency-Injection.md) `IRepository<TEntity, TKey>` into your service and perform standard **CRUD** operations. ABP can provide a **default generic repository** for each aggregate root or entity. You can [inject](Dependency-Injection.md) `IRepository<TEntity, TKey>` into your service and perform standard **CRUD** operations.
> Database provider layer should be properly configured to be able to use the default generic repositories. It is **already done** if you've created your project using the startup templates. If not, refer to the database provider documents ([EF Core](Entity-Framework-Core.md) / [MongoDB](MongoDB.md)) to configure it. > The database provider layer should be properly configured to be able to use the default generic repositories. It is **already done** if you've created your project using the startup templates. If not, refer to the database provider documents ([EF Core](Entity-Framework-Core.md) / [MongoDB](MongoDB.md)) to configure it.
**Example usage of a default generic repository:** **Example usage of a default generic repository:**
@ -52,25 +52,25 @@ In this example;
### Standard Repository Methods ### Standard Repository Methods
Generic Repositories provides some standard CRUD features out of the box: Generic Repositories provide some standard CRUD features out of the box:
* `GetAsync`: Returns a single entity by its `Id` or a predicate (lambda expression). * `GetAsync`: Returns a single entity by its `Id` or a predicate (lambda expression).
* Throws `EntityNotFoundException` if the requested entity was not found. * Throws `EntityNotFoundException` if the requested entity was not found.
* Throws `InvalidOperationException` if there are multiple entities with given predicate. * Throws `InvalidOperationException` if there are multiple entities with the given predicate.
* `FindAsync`: Returns a single entity by its `Id` or a predicate (lambda expression). * `FindAsync`: Returns a single entity by its `Id` or a predicate (lambda expression).
* Returns `null` if the requested entity was not found. * Returns `null` if the requested entity was not found.
* Throws `InvalidOperationException` if there are multiple entities with given predicate. * Throws `InvalidOperationException` if there are multiple entities with the given predicate.
* `InsertAsync`: Inserts a new entity to the database. * `InsertAsync`: Inserts a new entity into the database.
* `UpdateAsync`: Updates an existing entity in the database. * `UpdateAsync`: Updates an existing entity in the database.
* `DeleteAsync`: Deletes the given entity from database. * `DeleteAsync`: Deletes the given entity from the database.
* This method has an overload that takes a predicate (lambda expression) to delete multiple entities satisfies the given condition. * This method has an overload that takes a predicate (lambda expression) to delete multiple entities to satisfy the given condition.
* `GetListAsync`: Returns the list of all entities in the database. * `GetListAsync`: Returns the list of all entities in the database.
* `GetPagedListAsync`: Returns a limited list of entities. Gets `skipCount`, `maxResultCount` and `sorting` parameters. * `GetPagedListAsync`: Returns a limited list of entities. Gets `skipCount`, `maxResultCount`, and `sorting` parameters.
* `GetCountAsync`: Gets count of all entities in the database. * `GetCountAsync`: Gets the count of all entities in the database.
There are overloads of these methods. There are overloads of these methods.
* Provides `UpdateAsync` and `DeleteAsync` methods to update or delete an entity by entity object or it's id. * Provides `UpdateAsync` and `DeleteAsync` methods to update or delete an entity by entity object or its id.
* Provides `DeleteAsync` method to delete multiple entities by a filter. * Provides `DeleteAsync` method to delete multiple entities by a filter.
### Querying / LINQ over the Repositories ### Querying / LINQ over the Repositories
@ -142,7 +142,7 @@ Any standard LINQ method can be used over the `IQueryable` returned from the rep
> This sample uses `ToList()` method, but it is **strongly suggested to use the asynchronous methods** to perform database queries, like `ToListAsync()` for this example. See the **`IQueryable` & Async Operations** section to learn how you can do it. > This sample uses `ToList()` method, but it is **strongly suggested to use the asynchronous methods** to perform database queries, like `ToListAsync()` for this example. See the **`IQueryable` & Async Operations** section to learn how you can do it.
> **Exposing `IQueryable` to outside of a repository** class may leak your data access logic to the application layer. If you want to strictly follow the **layered architecture** principles, you can consider to implement a custom repository class and wrap your data access logic inside your repository class. You can see the ***Custom Repositories*** section to learn how to create custom repository classes for your application. > **Exposing `IQueryable` outside of a repository** class may leak your data access logic to the application layer. If you want to strictly follow the **layered architecture** principles, you can consider to implement a custom repository class and wrap your data access logic inside your repository class. You can see the ***Custom Repositories*** section to learn how to create custom repository classes for your application.
### Bulk Operations ### Bulk Operations
@ -158,27 +158,27 @@ These methods work with multiple entities and can take advantage of bulk operati
### Soft / Hard Delete ### Soft / Hard Delete
`DeleteAsync` method of the repository doesn't delete the entity if the entity is a **soft-delete** entity (that implements `ISoftDelete`). Soft-delete entities are marked as "deleted" in the database. Data Filter system ensures that the soft deleted entities are not retrieved from database normally. `DeleteAsync` method of the repository doesn't delete the entity if the entity is a **soft-delete** entity (that implements `ISoftDelete`). Soft-delete entities are marked as "deleted" in the database. The Data Filter system ensures that the soft deleted entities are not retrieved from the database normally.
If your entity is a soft-delete entity, you can use the `HardDeleteAsync` method to physically delete the entity from database in case of you need it. If your entity is a soft-delete entity, you can use the `HardDeleteAsync` method to physically delete the entity from the database in case you need it.
> See the [Data Filtering](Data-Filtering.md) documentation for more about soft-delete. > See the [Data Filtering](Data-Filtering.md) documentation for more about soft-delete.
### Delete Direct ### Delete Direct
`DeleteDirectAsync` method of the repository deletes all entities those fit to the given predicate. It directly deletes entities from database, without fetching them. `DeleteDirectAsync` method of the repository deletes all entities that fit to the given predicate. It directly deletes entities from the database, without fetching them.
Some features (like soft-delete, multi-tenancy and audit logging) won't work, so use this method carefully when you need it. Use the `DeleteAsync` method if you need to these features. Some features (like soft-delete, multi-tenancy, and audit logging) won't work, so use this method carefully when you need it. Use the `DeleteAsync` method if you need these features.
> Currently only [EF Core supports it](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#basic-executedelete-examples), For the ORMs that don't support direct delete, we will fallback to the existing `DeleteAsync` method. > Currently only [EF Core supports it](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#basic-executedelete-examples), For the ORMs that don't support direct delete, we will fall back to the existing `DeleteAsync` method.
### Ensure Entities Exists ### Ensure Entities Exist
The `EnsureExistsAsync` extension method accepts entity id or entities query expression to ensure entities exist, otherwise, it will throw `EntityNotFoundException`. The `EnsureExistsAsync` extension method accepts entity id or entities query expression to ensure entities exist, otherwise, it will throw `EntityNotFoundException`.
### Enabling / Disabling the Change Tracking ### Enabling / Disabling the Change Tracking
ABP provides repository extension methods and attributes those can be used to control the change tracking behavior for queried entities in the underlying database provider. ABP provides repository extension methods and attributes that can be used to control the change-tracking behavior for queried entities in the underlying database provider.
Disabling change tracking can gain performance if you query many entities from the database for read-only purposes. Querying single or a few entities won't make much performance difference, but you are free to use it whenever you like. Disabling change tracking can gain performance if you query many entities from the database for read-only purposes. Querying single or a few entities won't make much performance difference, but you are free to use it whenever you like.
@ -215,13 +215,13 @@ public class MyDemoService : ApplicationService
} }
```` ````
> `DisableTracking` extension method returns a `IDisposable` object, so you can safely **restore** the change tracking behavior to the **previous state** one the `using` block ends. Basically, `DisableTracking` method ensures that the change tracking is disabled inside the `using` block, but doesn't affect outside of the `using` block. That means, if change tracking was already disabled, `DisableTracking` and the disposable return value do nothing. > `DisableTracking` extension method returns an `IDisposable` object, so you can safely **restore** the change tracking behavior to the **previous state** once the `using` block ends. Basically, `DisableTracking` method ensures that the change tracking is disabled inside the `using` block, but doesn't affect outside of the `using` block. That means, if change tracking was already disabled, `DisableTracking` and the disposable return value do nothing.
`EnableTracking()` method works exactly opposite to the `DisableTracking()` method. You typically won't use it (because the change tracking is already enabled by default), but it is there in case of you need that. `EnableTracking()` method works exactly opposite to the `DisableTracking()` method. You typically won't use it (because the change tracking is already enabled by default), but it is there in case you need that.
#### Attributes for Change Tracking #### Attributes for Change Tracking
You typically use the `DisableTracking()` method for the application service methods those only returns data, but doesn't make any change on entities. For such cases, you can use the `DisableEntityChangeTracking` attribute on your method/class as a shortcut to disable the change tracking for whole method body. You typically use the `DisableTracking()` method for the application service methods that only return data, but don't make any change to entities. For such cases, you can use the `DisableEntityChangeTracking` attribute on your method/class as a shortcut to disable the change tracking for the whole method body.
**Example: Using the `DisableEntityChangeTracking` attribute on a method** **Example: Using the `DisableEntityChangeTracking` attribute on a method**
@ -240,12 +240,12 @@ public virtual async Task<List<PersonDto>> GetListAsync()
`DisableEntityChangeTracking` and `EnableEntityChangeTracking` attributes can be used on a **method** or on a **class** (which affects all of the class methods). `DisableEntityChangeTracking` and `EnableEntityChangeTracking` attributes can be used on a **method** or on a **class** (which affects all of the class methods).
ABP uses dynamic proxying to make these attributes working. There are some rules here: ABP uses dynamic proxying to make these attributes work. There are some rules here:
* If you are **not injecting** the service over an interface (like `IPersonAppService`), then the methods of the service must be `virtual`. Otherwise, [dynamic proxy / interception](Dynamic-Proxying-Interceptors.md) system can not work. * If you are **not injecting** the service over an interface (like `IPersonAppService`), then the methods of the service must be `virtual`. Otherwise, [dynamic proxy / interception](Dynamic-Proxying-Interceptors.md) system can not work.
* Only `async` methods (methods returning a `Task` or `Task<T>`) are intercepted. * Only `async` methods (methods returning a `Task` or `Task<T>`) are intercepted.
> Change tracking behavior doesn't affect tracking entity objects returned from `InsertAsync` and `UpdateAsync` methods. The objects returned from these methods are always tracked (if the underlying provider has the change tracking feature) and any change you made to these objects are saved into the database. > Change tracking behavior doesn't affect tracking entity objects returned from `InsertAsync` and `UpdateAsync` methods. The objects returned from these methods are always tracked (if the underlying provider has the change tracking feature) and any change you make to these objects are saved into the database.
## Other Generic Repository Types ## Other Generic Repository Types
@ -255,13 +255,13 @@ Standard `IRepository<TEntity, TKey>` interface exposes the standard `IQueryable
ABP provides `IBasicRepository<TEntity, TPrimaryKey>` and `IBasicRepository<TEntity>` interfaces to support such scenarios. You can extend these interfaces (and optionally derive from `BasicRepositoryBase`) to create custom repositories for your entities. ABP provides `IBasicRepository<TEntity, TPrimaryKey>` and `IBasicRepository<TEntity>` interfaces to support such scenarios. You can extend these interfaces (and optionally derive from `BasicRepositoryBase`) to create custom repositories for your entities.
Depending on `IBasicRepository` but not depending on `IRepository` has an advantage to make possible to work with all data sources even if they don't support `IQueryable`. Depending on `IBasicRepository` but not depending on `IRepository` has the advantage of making it possible to work with all data sources even if they don't support `IQueryable`.
Major vendors, like Entity Framework, NHibernate or MongoDB already support `IQueryable`. So, working with `IRepository` is the **suggested** way for typical applications. But reusable module developers may consider `IBasicRepository` to support a wider range of data sources. Major vendors, like Entity Framework, NHibernate, or MongoDB already support `IQueryable`. So, working with `IRepository` is the **suggested** way for typical applications. However reusable module developers may consider `IBasicRepository` to support a wider range of data sources.
### Read Only Repositories ### Read Only Repositories
There are also `IReadOnlyRepository<TEntity, TKey>` and `IReadOnlyBasicRepository<Tentity, TKey>` interfaces for who only want to depend on querying capabilities of the repositories. There are also `IReadOnlyRepository<TEntity, TKey>` and `IReadOnlyBasicRepository<Tentity, TKey>` interfaces for those who only want to depend on the querying capabilities of the repositories.
The `IReadOnlyRepository<TEntity, TKey>` derives the `IReadOnlyBasicRepository<Tentity, TKey>` and provides the following properties and methods as well: The `IReadOnlyRepository<TEntity, TKey>` derives the `IReadOnlyBasicRepository<Tentity, TKey>` and provides the following properties and methods as well:
@ -276,27 +276,27 @@ Methods:
- `WithDetails()` 1 overload - `WithDetails()` 1 overload
- `WithDetailsAsync()` 1 overload - `WithDetailsAsync()` 1 overload
Where as the `IReadOnlyBasicRepository<Tentity, TKey>` provides the following methods: Whereas the `IReadOnlyBasicRepository<Tentity, TKey>` provides the following methods:
- `GetCountAsync()` - `GetCountAsync()`
- `GetListAsync()` - `GetListAsync()`
- `GetPagedListAsync()` - `GetPagedListAsync()`
They can all be seen as below: They can all be seen below:
![generic-repositories](images/generic-repositories.png) ![generic-repositories](images/generic-repositories.png)
#### Read Only Repositories behavior in Entity Framework Core #### Read Only Repositories behavior in Entity Framework Core
Entity Framework Core read-only repository implementation uses [EF Core's No-Tracking feature](https://learn.microsoft.com/en-us/ef/core/querying/tracking#no-tracking-queries). That means the entities returned from the repository will not be tracked by the EF Core [change tracker](https://learn.microsoft.com/en-us/ef/core/change-tracking/), because it is expected that you won't update entities queried from a read-only repository. If you need to track the entities, you can still use the [AsTracking()](https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.entityframeworkqueryableextensions.astracking) extension method on the LINQ expression, or `EnableTracking()` extension method on the repository object (See *Enabling / Disabling the Change Tracking* section in this document). Entity Framework Core read-only repository implementation uses [EF Core's No-Tracking feature](https://learn.microsoft.com/en-us/ef/core/querying/tracking#no-tracking-queries). That means the entities returned from the repository will not be tracked by the EF Core [change tracker](https://learn.microsoft.com/en-us/ef/core/change-tracking/) because it is expected that you won't update entities queried from a read-only repository. If you need to track the entities, you can still use the [AsTracking()](https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.entityframeworkqueryableextensions.astracking) extension method on the LINQ expression, or `EnableTracking()` extension method on the repository object (See *Enabling / Disabling the Change Tracking* section in this document).
> This behavior works only if the repository object is injected with one of the read-only repository interfaces (`IReadOnlyRepository<...>` or `IReadOnlyBasicRepository<...>`). It won't work if you have injected a standard repository (e.g. `IRepository<...>`) then casted it to a read-only repository interface. > This behavior works only if the repository object is injected with one of the read-only repository interfaces (`IReadOnlyRepository<...>` or `IReadOnlyBasicRepository<...>`). It won't work if you have injected a standard repository (e.g. `IRepository<...>`) and then cast it to a read-only repository interface.
### Generic Repository without a Primary Key ### Generic Repository without a Primary Key
If your entity does not have an Id primary key (it may have a composite primary key for instance) then you cannot use the `IRepository<TEntity, TKey>` (or basic/readonly versions) defined above. In that case, you can inject and use `IRepository<TEntity>` for your entity. If your entity does not have an Id primary key (it may have a composite primary key for instance) then you cannot use the `IRepository<TEntity, TKey>` (or basic/readonly versions) defined above. In that case, you can inject and use `IRepository<TEntity>` for your entity.
> `IRepository<TEntity>` has a few missing methods those normally works with the `Id` property of an entity. Because of the entity has no `Id` property in that case, these methods are not available. One example is the `Get` method that gets an id and returns the entity with given id. However, you can still use `IQueryable<TEntity>` features to query entities by standard LINQ methods. > `IRepository<TEntity>` has a few missing methods that normally work with the `Id` property of an entity. Because the entity has no `Id` property in that case, these methods are not available. One example is the `Get` method which gets an id and returns the entity with the given id. However, you can still use `IQueryable<TEntity>` features to query entities by standard LINQ methods.
## Custom Repositories ## Custom Repositories
@ -304,7 +304,7 @@ Default generic repositories will be sufficient for most cases. However, you may
### Custom Repository Example ### Custom Repository Example
ABP does not force you to implement any interface or inherit from any base class for a repository. It can be just a simple POCO class. However, it's suggested to inherit existing repository interface and classes to make your work easier and get the standard methods out of the box. ABP does not force you to implement any interface or inherit from any base class for a repository. It can be just a simple POCO class. However, it's suggested to inherit existing repository interfaces and classes to make your work easier and get the standard methods out of the box.
#### Custom Repository Interface #### Custom Repository Interface
@ -348,7 +348,7 @@ You can directly access the data access provider (`DbContext` in this case) to p
## IQueryable & Async Operations ## IQueryable & Async Operations
`IRepository` provides `GetQueryableAsync()` to obtain an `IQueryable`, that means you can **directly use LINQ extension methods** on it, as shown in the example of the "*Querying / LINQ over the Repositories*" section above. `IRepository` provides `GetQueryableAsync()` to obtain an `IQueryable`, which means you can **directly use LINQ extension methods** on it, as shown in the example of the "*Querying / LINQ over the Repositories*" section above.
**Example: Using the `Where(...)` and the `ToList()` extension methods** **Example: Using the `Where(...)` and the `ToList()` extension methods**
@ -376,7 +376,7 @@ Based on your requirements and development model, you have the following options
**The easiest solution** is to directly add the EF Core package from the project you want to use these async methods. **The easiest solution** is to directly add the EF Core package from the project you want to use these async methods.
> Add the [Volo.Abp.EntityFrameworkCore](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore) NuGet package to your project, which indirectly reference to the EF Core package. This ensures that you use the correct version of the EF Core compatible to the rest of your application. > Add the [Volo.Abp.EntityFrameworkCore](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore) NuGet package to your project, which indirectly references the EF Core package. This ensures that you use the correct version of the EF Core compatible with the rest of your application.
When you add the NuGet package to your project, you can take full power of the EF Core extension methods. When you add the NuGet package to your project, you can take full power of the EF Core extension methods.
@ -391,7 +391,7 @@ var people = queryable
This method is suggested; This method is suggested;
* If you are developing an application and you **don't plan to change** EF Core in the future, or you can **tolerate** it if you need to change later. We believe that's reasonable if you are developing a final application. * If you are developing an application and you **don't plan to change** EF Core in the future, or you can **tolerate** it if you need to change it later. We believe that's reasonable if you are developing a final application.
#### MongoDB Case #### MongoDB Case
@ -432,7 +432,7 @@ var queryable = await _bookRepository.GetQueryableAsync();
var count = await queryable.Where(x => x.Name.Contains("A")).CountAsync(); var count = await queryable.Where(x => x.Name.Contains("A")).CountAsync();
``` ```
This is because the `CountAsync()` method in this example is called on a `IQueryable` interface, not on the repository object. See the other options for such cases. This is because the `CountAsync()` method in this example is called on an `IQueryable` interface, not on the repository object. See the other options for such cases.
This method is suggested **wherever possible**. This method is suggested **wherever possible**.
@ -488,7 +488,7 @@ namespace AbpDemo
> `ApplicationService` and `DomainService` base classes already have `AsyncExecuter` properties pre-injected and usable without needing an explicit constructor injection. > `ApplicationService` and `DomainService` base classes already have `AsyncExecuter` properties pre-injected and usable without needing an explicit constructor injection.
ABP Framework executes the query asynchronously using the actual database provider's API. While that is not a usual way to execute a query, it is the best way to use the async API without depending on the database provider. ABP Framework executes the query asynchronously using the actual database provider's API. While that is not the usual way to execute a query, it is the best way to use the async API without depending on the database provider.
This method is suggested; This method is suggested;
@ -499,7 +499,7 @@ For example, ABP Framework uses the `IAsyncQueryableExecuter` in the `CrudAppSer
### Option-4: Custom Repository Methods ### Option-4: Custom Repository Methods
You can always create custom repository methods and use the database provider specific APIs, like async extension methods here. See [EF Core](Entity-Framework-Core.md) or [MongoDb](MongoDB.md) document for more info about the custom repositories. You can always create custom repository methods and use the database provider-specific APIs, like async extension methods here. See [EF Core](Entity-Framework-Core.md) or [MongoDb](MongoDB.md) document for more info about the custom repositories.
This method is suggested; This method is suggested;

18
docs/en/Road-Map.md

@ -1,33 +1,31 @@
# ABP Framework Road Map # ABP Framework Road Map
This document provides a road map, release schedule and planned features for the ABP Framework. This document provides a road map, release schedule, and planned features for the ABP Framework.
## Next Versions ## Next Versions
### v8.1 ### v8.2
The next version will be 8.1 and planned to release the stable 8.1 version in February, 2024. We will be mostly working on the following topics: The next version will be 8.2 and planned to release the stable 8.2 version in June 2024. We will be mostly working on the following topics:
* Blazor Full-Stack UI ([#16156](https://github.com/abpframework/abp/issues/16156)) * Blazor Full-Stack UI ([#18289](https://github.com/abpframework/abp/issues/18289))
* Upgrade to OpenIddict 5.x ([#17605](https://github.com/abpframework/abp/issues/17605))
* Angular Universal ([#15782](https://github.com/abpframework/abp/issues/15782)) * Angular Universal ([#15782](https://github.com/abpframework/abp/issues/15782))
* Blazor - Forms & Validation Documentation ([#16400](https://github.com/abpframework/abp/issues/16400)) * Upgrading React Native template to the latest major release 0.72.7 ([#18191](https://github.com/abpframework/abp/issues/18191))
* Deployment Documents Improvements ([#15034](https://github.com/abpframework/abp/issues/15034)) * Deployment Documents Improvements ([#15034](https://github.com/abpframework/abp/issues/15034))
* Improvements on the existing features and provide more guides. * Improvements on the existing features and provide more guides.
See the [8.1 milestone](https://github.com/abpframework/abp/milestone/94) for all the issues we've planned to work on. See the [8.2 milestone](https://github.com/abpframework/abp/milestone/95) for all the issues we've planned to work on.
## Backlog Items ## Backlog Items
The *Next Versions* section above shows the main focus of the planned versions. However, in each release we add new features to the core framework and the [application modules](Modules/Index.md). The *Next Versions* section above shows the main focus of the planned versions. However, in each release, we add new features to the core framework and the [application modules](Modules/Index.md).
Here is a list of major items in the backlog we are considering working on in the next versions. Here is a list of major items in the backlog we are considering working on in the next versions.
* [#6655](https://github.com/abpframework/abp/pull/6655) / Use Typescript for the MVC UI * [#86](https://github.com/abpframework/abp/issues/86) / GrapQL Integration
* [#236](https://github.com/abpframework/abp/issues/236) / Resource based authorization system * [#236](https://github.com/abpframework/abp/issues/236) / Resource based authorization system
* [#2882](https://github.com/abpframework/abp/issues/2882) / Providing a gRPC integration infrastructure (while it is [already possible](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) to create or consume gRPC endpoints for your application, we plan to create endpoints for the [standard application modules](https://docs.abp.io/en/abp/latest/Modules/Index)) * [#2882](https://github.com/abpframework/abp/issues/2882) / Providing a gRPC integration infrastructure (while it is [already possible](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) to create or consume gRPC endpoints for your application, we plan to create endpoints for the [standard application modules](https://docs.abp.io/en/abp/latest/Modules/Index))
* [#57](https://github.com/abpframework/abp/issues/57) / Built-in CQRS infrastructure * [#57](https://github.com/abpframework/abp/issues/57) / Built-in CQRS infrastructure
* [#2532](https://github.com/abpframework/abp/issues/2532) / CosmosDB integration with EF Core and MongoDB API
* [#4223](https://github.com/abpframework/abp/issues/4223) / WebHook system * [#4223](https://github.com/abpframework/abp/issues/4223) / WebHook system
* [#162](https://github.com/abpframework/abp/issues/162) / Azure ElasticDB Integration for multitenancy * [#162](https://github.com/abpframework/abp/issues/162) / Azure ElasticDB Integration for multitenancy
* [#2296](https://github.com/abpframework/abp/issues/2296) / Feature toggling infrastructure * [#2296](https://github.com/abpframework/abp/issues/2296) / Feature toggling infrastructure

56
docs/en/Testing.md

@ -36,7 +36,7 @@ There are more than one test project, organized by the layers;
* `Domain.Tests` is used to test your Domain Layer objects (like [Domain Services](Domain-Services.md) and [Entities](Entities.md)). * `Domain.Tests` is used to test your Domain Layer objects (like [Domain Services](Domain-Services.md) and [Entities](Entities.md)).
* `Application.Tests` is used to test your Application Layer (like [Application Services](Application-Services.md)). * `Application.Tests` is used to test your Application Layer (like [Application Services](Application-Services.md)).
* `EntityFrameworkCore.Tests` is used to test your custom repository implementations or EF Core mappings (this project will be different if you use another [Database Provider](Data-Access.md)). * `EntityFrameworkCore.Tests` is used to implement abstract test classes and test your custom repository implementations or EF Core mappings (this project will be different if you use another [Database Provider](Data-Access.md)).
* `Web.Tests` is used to test the UI Layer (like Pages, Controllers and View Components). This project does exists only for MVC / Razor Page applications. * `Web.Tests` is used to test the UI Layer (like Pages, Controllers and View Components). This project does exists only for MVC / Razor Page applications.
* `TestBase` contains some classes those are shared/used by the other projects. * `TestBase` contains some classes those are shared/used by the other projects.
@ -537,12 +537,13 @@ using Xunit;
namespace MyProject.Issues namespace MyProject.Issues
{ {
public class IssueManager_Integration_Tests : MyProjectDomainTestBase public abstract class IssueManager_Integration_Tests<TStartupModule> : MyProjectDomainTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
private readonly IssueManager _issueManager; private readonly IssueManager _issueManager;
private readonly Issue _issue; private readonly Issue _issue;
public IssueManager_Integration_Tests() protected IssueManager_Integration_Tests()
{ {
_issueManager = GetRequiredService<IssueManager>(); _issueManager = GetRequiredService<IssueManager>();
_issue = new Issue _issue = new Issue
@ -577,6 +578,8 @@ namespace MyProject.Issues
} }
```` ````
> The `IssueManager_Integration_Tests` class is an abstract class, and tests in this class are not seen on the tests explorer, see the **Implementing unit tests in EF Core and MongoDB** section below to learn how to list tests in the test explorer and run them.
* First test method assigns the issue to the User 1, which has already assigned to 3 issues in the Data Seed code. So, it throws a `BusinessException`. * First test method assigns the issue to the User 1, which has already assigned to 3 issues in the Data Seed code. So, it throws a `BusinessException`.
* Second test method assigns the issue to User 2, which has only 1 issue assigned. So, the method succeeds. * Second test method assigns the issue to User 2, which has only 1 issue assigned. So, the method succeeds.
@ -625,11 +628,12 @@ using Xunit;
namespace MyProject.Issues namespace MyProject.Issues
{ {
public class IssueAppService_Tests : MyProjectApplicationTestBase public abstract class IssueAppService_Tests<TStartupModule> : MyProjectApplicationTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
private readonly IIssueAppService _issueAppService; private readonly IIssueAppService _issueAppService;
public IssueAppService_Tests() protected IssueAppService_Tests()
{ {
_issueAppService = GetRequiredService<IIssueAppService>(); _issueAppService = GetRequiredService<IIssueAppService>();
} }
@ -647,6 +651,8 @@ namespace MyProject.Issues
} }
```` ````
> The `IssueAppService_Tests` class is an abstract, and tests in this class are not seen on the tests explorer, see the **Implementing unit tests in EF Core and MongoDB** section below to learn how to list tests in the test explorer and run them.
It's that simple. This test method tests everything, including the application service, EF Core mapping, object to object mapping and the repository implementation. In this way, you can fully test the Application Layer and the Domain Layer of your solution. It's that simple. This test method tests everything, including the application service, EF Core mapping, object to object mapping and the repository implementation. In this way, you can fully test the Application Layer and the Domain Layer of your solution.
### Dealing with Unit of Work in Integration Tests ### Dealing with Unit of Work in Integration Tests
@ -658,11 +664,12 @@ In the ABP Framework, all the database operations must be performed inside a uni
In some cases, you may need to manually control the unit of work scope. Consider the following test method: In some cases, you may need to manually control the unit of work scope. Consider the following test method:
````csharp ````csharp
public class IssueRepository_Tests : MyProjectDomainTestBase public abstract class IssueRepository_Tests<TStartupModule> : MyProjectDomainTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
private readonly IRepository<Issue, Guid> _issueRepository; private readonly IRepository<Issue, Guid> _issueRepository;
public IssueRepository_Tests() protected IssueRepository_Tests()
{ {
_issueRepository = GetRequiredService<IRepository<Issue, Guid>>(); _issueRepository = GetRequiredService<IRepository<Issue, Guid>>();
} }
@ -676,17 +683,20 @@ public class IssueRepository_Tests : MyProjectDomainTestBase
} }
```` ````
> The `IssueRepository_Tests` class is an abstract, and tests in this class are not seen on the tests explorer, see the **Implementing unit tests in EF Core and MongoDB** section below to learn how to list tests in the test explorer and run them.
We are using `_issueRepository.GetQueryableAsync` to obtain an `IQueryable<Issue>` object. Then, we are using the `FirstOrDefaultAsync` method to query an issue by its title. The database query is executed at this point, and you get an exception indicating that there is no active unit of work. We are using `_issueRepository.GetQueryableAsync` to obtain an `IQueryable<Issue>` object. Then, we are using the `FirstOrDefaultAsync` method to query an issue by its title. The database query is executed at this point, and you get an exception indicating that there is no active unit of work.
To make that test properly working, you should manually start a unit of work scope as shown in the following example: To make that test properly working, you should manually start a unit of work scope as shown in the following example:
````csharp ````csharp
public class IssueRepository_Tests : MyProjectDomainTestBase public abstract class IssueRepository_Tests<TStartupModule> : MyProjectDomainTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
private readonly IRepository<Issue, Guid> _issueRepository; private readonly IRepository<Issue, Guid> _issueRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IUnitOfWorkManager _unitOfWorkManager;
public IssueRepository_Tests() protected IssueRepository_Tests()
{ {
_issueRepository = GetRequiredService<IRepository<Issue, Guid>>(); _issueRepository = GetRequiredService<IRepository<Issue, Guid>>();
_unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>(); _unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>();
@ -716,12 +726,13 @@ In some cases, you may want to directory work with the Entity Framework's `DbCon
The following example shows how you can create a `DbContext` object in a test method: The following example shows how you can create a `DbContext` object in a test method:
````csharp ````csharp
public class MyDbContext_Tests : MyProjectDomainTestBase public abstract class MyDbContext_Tests<TStartupModule> : MyProjectDomainTestBase<TStartupModule>
where TStartupModule : IAbpModule
{ {
private readonly IDbContextProvider<MyProjectDbContext> _dbContextProvider; private readonly IDbContextProvider<MyProjectDbContext> _dbContextProvider;
private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IUnitOfWorkManager _unitOfWorkManager;
public IssueRepository_Tests() protected IssueRepository_Tests()
{ {
_dbContextProvider = GetRequiredService<IDbContextProvider<MyProjectDbContext>>(); _dbContextProvider = GetRequiredService<IDbContextProvider<MyProjectDbContext>>();
_unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>(); _unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>();
@ -740,10 +751,33 @@ public class MyDbContext_Tests : MyProjectDomainTestBase
} }
```` ````
> The `MyDbContext_Tests` class is an abstract, and tests in this class are not seen on the tests explorer, see the **Implementing unit tests in EF Core and MongoDB** section below to learn how to list tests in the test explorer and run them.
Just like we've done in the *Dealing with Unit of Work in Integration Tests* section, we should perform `DbContext` operations inside an active unit of work. Just like we've done in the *Dealing with Unit of Work in Integration Tests* section, we should perform `DbContext` operations inside an active unit of work.
For [MongoDB](MongoDB.md), you can use the `IMongoDbContextProvider<T>` service to obtain a `DbContext` object and directly use MongoDB APIs in your test methods. For [MongoDB](MongoDB.md), you can use the `IMongoDbContextProvider<T>` service to obtain a `DbContext` object and directly use MongoDB APIs in your test methods.
## Implementing unit tests in EF Core and MongoDB
The unit test classes in the `.Domain.Test` and `.Application.Tests` projects are all abstract classes. Therefore, we need to implement the test classes in EF Core or MongoDB test projects to run the tests, otherwise they will be ignored.
An example implementation for the `IssueManager_Integration_Tests` class in the `.EntityFrameworkCore.Tests` project is shown below:
````csharp
namespace MyProject.EntityFrameworkCore.Applications;
public class EfCoreIssueAppService_Tests : IssueAppService_Tests<MyProjectEntityFrameworkCoreTestModule>
{
}
````
> By deriving from the related abstract classes, now we can see the all tests in the test explorers and run them.
![unitest-efcore-mongodb](images/unitest-efcore-mongodb.png)
As you can see from the folder structure, all tests are clearly placed into the related subfolders, and they will be seen in the test explorer with this separation. Thus, you can clearly see which tests are related to which layers and projects.
## UI Tests ## UI Tests
In general, there are two types of UI Tests; In general, there are two types of UI Tests;

BIN
docs/en/images/solution-test-projects.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 109 KiB

BIN
docs/en/images/unitest-efcore-mongodb.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

BIN
docs/en/images/vs-run-tests-in-parallel.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 576 KiB

BIN
docs/en/images/vs-startup-template-tests.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 344 KiB

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

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

29
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs

@ -54,19 +54,22 @@ public class AbpInputTagHelperService : AbpTagHelperService<AbpInputTagHelper>
output.TagMode = TagMode.StartTagAndEndTag; output.TagMode = TagMode.StartTagAndEndTag;
output.TagName = "div"; output.TagName = "div";
LeaveOnlyGroupAttributes(context, output); LeaveOnlyGroupAttributes(context, output);
if (TagHelper.FloatingLabel && !isCheckBox) if (!IsOutputHidden(output))
{ {
output.Attributes.AddClass("form-floating"); if (TagHelper.FloatingLabel && !isCheckBox)
} {
if (TagHelper.AddMarginBottomClass) output.Attributes.AddClass("form-floating");
{ }
output.Attributes.AddClass(isCheckBox ? "mb-2" : "mb-3"); if (TagHelper.AddMarginBottomClass)
} {
if (isCheckBox) output.Attributes.AddClass(isCheckBox ? "mb-2" : "mb-3");
{ }
output.Attributes.AddClass("custom-checkbox"); if (isCheckBox)
output.Attributes.AddClass("custom-control"); {
output.Attributes.AddClass("form-check"); output.Attributes.AddClass("custom-checkbox");
output.Attributes.AddClass("custom-control");
output.Attributes.AddClass("form-check");
}
} }
output.Content.AppendHtml(innerHtml); output.Content.AppendHtml(innerHtml);
} }
@ -263,7 +266,7 @@ public class AbpInputTagHelperService : AbpTagHelperService<AbpInputTagHelper>
} }
protected virtual async Task<string> GetLabelAsHtmlAsync(TagHelperContext context, TagHelperOutput output, TagHelperOutput inputTag, bool isCheckbox) protected virtual async Task<string> GetLabelAsHtmlAsync(TagHelperContext context, TagHelperOutput output, TagHelperOutput inputTag, bool isCheckbox)
{ {
if (IsOutputHidden(inputTag) || TagHelper.SuppressLabel) if (IsOutputHidden(inputTag) || TagHelper.SuppressLabel)
{ {
return string.Empty; return string.Empty;

7
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs

@ -553,11 +553,16 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase<CSharpServi
var s2 = s1[i].Split(","); var s2 = s1[i].Split(",");
for (var x = 0; x < s2.Length; x++) for (var x = 0; x < s2.Length; x++)
{ {
type.Append(s2[x].Split(".").Last()); var s3 = s2[x].Split(".").Last();
type.Append(s3);
if (x < s2.Length - 1) if (x < s2.Length - 1)
{ {
type.Append(", "); type.Append(", ");
} }
else if(!s3.Contains(">"))
{
type.Append("<");
}
} }
} }
else else

52
framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpUnitTestSqliteConnection.cs

@ -0,0 +1,52 @@
using System.Threading;
using Microsoft.Data.Sqlite;
using Volo.Abp.Threading;
namespace Volo.Abp.EntityFrameworkCore.Sqlite;
/// <summary>
/// This class is for unit testing purposes.
/// It prevents exceptions in concurrent testing because Sqlite is not thread-safe.
/// </summary>
public class AbpUnitTestSqliteConnection : SqliteConnection
{
public AbpUnitTestSqliteConnection(string connectionString)
: base(connectionString)
{
}
public override SqliteCommand CreateCommand()
{
return new AbpSqliteCommand
{
Connection = this,
CommandTimeout = DefaultTimeout,
Transaction = Transaction
};
}
}
internal class AbpSqliteCommand : SqliteCommand
{
private readonly static SemaphoreSlim Semaphore = new SemaphoreSlim(1, 1);
public override SqliteConnection? Connection
{
get => base.Connection;
set
{
using (Semaphore.Lock())
{
base.Connection = value;
}
}
}
protected override void Dispose(bool disposing)
{
using (Semaphore.Lock())
{
base.Dispose(disposing);
}
}
}

2
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs

@ -316,7 +316,7 @@ public abstract class AbpDbContext<TDbContext> : DbContext, IAbpEfCoreDbContext,
break; break;
case EntityState.Modified: case EntityState.Modified:
ApplyAbpConceptsForModifiedEntity(entry); ApplyAbpConceptsForModifiedEntity(entry);
if (entry.Properties.Any(x => x.IsModified && x.Metadata.ValueGenerated == ValueGenerated.Never)) if (entry.Properties.Any(x => x.IsModified && (x.Metadata.ValueGenerated == ValueGenerated.Never || x.Metadata.ValueGenerated == ValueGenerated.OnAdd)))
{ {
if (entry.Entity is ISoftDelete && entry.Entity.As<ISoftDelete>().IsDeleted) if (entry.Entity is ISoftDelete && entry.Entity.As<ISoftDelete>().IsDeleted)
{ {

8
framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs

@ -11,6 +11,8 @@ public class AbpStringToEnumConverter<T> : JsonConverter<T>
private JsonSerializerOptions? _readJsonSerializerOptions; private JsonSerializerOptions? _readJsonSerializerOptions;
private JsonSerializerOptions? _writeJsonSerializerOptions;
public AbpStringToEnumConverter() public AbpStringToEnumConverter()
: this(namingPolicy: null, allowIntegerValues: true) : this(namingPolicy: null, allowIntegerValues: true)
{ {
@ -39,7 +41,11 @@ public class AbpStringToEnumConverter<T> : JsonConverter<T>
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{ {
JsonSerializer.Serialize(writer, value); _writeJsonSerializerOptions ??= JsonSerializerOptionsHelper.Create(options, x =>
x == this ||
x.GetType() == typeof(AbpStringToEnumFactory));
JsonSerializer.Serialize(writer, value, _writeJsonSerializerOptions);
} }
public override T ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) public override T ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)

2
framework/test/Volo.Abp.Auditing.Tests/Volo/Abp/Auditing/AbpAuditingTestModule.cs

@ -62,7 +62,7 @@ public class AbpAuditingTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
using (var context = new AbpAuditingTestDbContext(new DbContextOptionsBuilder<AbpAuditingTestDbContext>() using (var context = new AbpAuditingTestDbContext(new DbContextOptionsBuilder<AbpAuditingTestDbContext>()

2
framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs

@ -93,7 +93,7 @@ public class AbpEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
using (var context = new TestMigrationsDbContext(new DbContextOptionsBuilder<TestMigrationsDbContext>().UseSqlite(connection).Options)) using (var context = new TestMigrationsDbContext(new DbContextOptionsBuilder<TestMigrationsDbContext>().UseSqlite(connection).Options))

19
framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization;
using Shouldly; using Shouldly;
using Volo.Abp.Json.SystemTextJson.JsonConverters; using Volo.Abp.Json.SystemTextJson.JsonConverters;
using Xunit; using Xunit;
@ -53,10 +54,26 @@ public class AbpStringToEnum_Tests
var testClassJson = JsonSerializer.Serialize(new TestClass() var testClassJson = JsonSerializer.Serialize(new TestClass()
{ {
Day = DayOfWeek.Monday Day = DayOfWeek.Monday
}); }, options);
testClassJson.ShouldBe("{\"Day\":1}"); testClassJson.ShouldBe("{\"Day\":1}");
options = new JsonSerializerOptions()
{
Converters =
{
new AbpStringToEnumFactory(),
new JsonStringEnumConverter()
}
};
testClassJson = JsonSerializer.Serialize(new TestClass()
{
Day = DayOfWeek.Monday
}, options);
testClassJson.ShouldBe("{\"Day\":\"Monday\"}");
testClassJson = JsonSerializer.Serialize(new Dictionary<DayOfWeek, string> testClassJson = JsonSerializer.Serialize(new Dictionary<DayOfWeek, string>
{ {
{DayOfWeek.Monday, "Mo"} {DayOfWeek.Monday, "Mo"}

2
latest-versions.json

@ -1,6 +1,6 @@
[ [
{ {
"version": "8.0.3", "version": "8.0.4",
"releaseDate": "", "releaseDate": "",
"type": "stable", "type": "stable",
"message": "" "message": ""

2
modules/account/src/Volo.Abp.Account.HttpApi/Volo/Abp/Account/AccountController.cs

@ -33,7 +33,7 @@ public class AccountController : AbpControllerBase, IAccountAppService
[HttpPost] [HttpPost]
[Route("verify-password-reset-token")] [Route("verify-password-reset-token")]
public Task<bool> VerifyPasswordResetTokenAsync(VerifyPasswordResetTokenInput input) public virtual Task<bool> VerifyPasswordResetTokenAsync(VerifyPasswordResetTokenInput input)
{ {
return AccountAppService.VerifyPasswordResetTokenAsync(input); return AccountAppService.VerifyPasswordResetTokenAsync(input);
} }

2
modules/account/test/Volo.Abp.Account.Application.Tests/Volo/Abp/Account/AbpAccountApplicationTestModule.cs

@ -44,7 +44,7 @@ public class AbpAccountApplicationTestModule : AbpModule
} }
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new IdentityDbContext( new IdentityDbContext(

2
modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreTestModule.cs

@ -31,7 +31,7 @@ public class AbpAuditLoggingEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new AbpAuditLoggingDbContext( new AbpAuditLoggingDbContext(

2
modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo/Abp/BackgroundJobs/EntityFrameworkCore/AbpBackgroundJobsEntityFrameworkCoreTestModule.cs

@ -31,7 +31,7 @@ public class AbpBackgroundJobsEntityFrameworkCoreTestModule : AbpModule
private static SqliteConnection CreateDatabaseAndGetConnection() private static SqliteConnection CreateDatabaseAndGetConnection()
{ {
var connection = new SqliteConnection("Data Source=:memory:"); var connection = new AbpUnitTestSqliteConnection("Data Source=:memory:");
connection.Open(); connection.Open();
new BackgroundJobsDbContext( new BackgroundJobsDbContext(

6
modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json

@ -3,8 +3,8 @@
"name": "asp.net", "name": "asp.net",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "~8.1.0-rc.1", "@abp/aspnetcore.mvc.ui.theme.shared": "~8.1.0-rc.2",
"@abp/prismjs": "~8.1.0-rc.1", "@abp/prismjs": "~8.1.0-rc.2",
"@abp/highlight.js": "~8.1.0-rc.1" "@abp/highlight.js": "~8.1.0-rc.2"
} }
} }

9439
modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/libs/@fortawesome/fontawesome-free/css/all.css

File diff suppressed because it is too large

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

Loading…
Cancel
Save