Browse Source

Merge remote-tracking branch 'origin/rel-7.1' into auto-merge/rel-7-0/1784

pull/15903/head
Barış Can Yılmaz 3 years ago
parent
commit
64d7ed0d77
  1. 14
      .github/pull_request_template.md
  2. 18
      .github/workflows/auto-pr.yml
  3. 1
      .github/workflows/image-compression.yml
  4. 31
      .github/workflows/spellcheck.yml
  5. 4
      .gitignore
  6. 2
      Directory.Build.props
  7. 2
      README.md
  8. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/ar.json
  9. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ar.json
  10. 47
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
  11. 165
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/ar.json
  12. 24
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
  13. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json
  14. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/ar.json
  15. 415
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json
  16. 24
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  17. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json
  18. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
  19. 70
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
  20. 58
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/ar.json
  21. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/cs.json
  22. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/de.json
  23. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
  24. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/es.json
  25. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/fi.json
  26. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/fr.json
  27. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hi.json
  28. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/hu.json
  29. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/is.json
  30. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/it.json
  31. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/nl.json
  32. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/pl-PL.json
  33. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/pt-BR.json
  34. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/ro-RO.json
  35. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/ru.json
  36. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/sk.json
  37. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/sl.json
  38. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json
  39. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/vi.json
  40. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json
  41. 249
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ar.json
  42. 12
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
  43. 40
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json
  44. 151
      cSpell.json
  45. 2
      common.props
  46. 49
      docs/en/Application-Startup.md
  47. 207
      docs/en/Blog-Posts/2023-02-08 v7_1_Preview/POST.md
  48. BIN
      docs/en/Blog-Posts/2023-02-08 v7_1_Preview/community-talks-conver-image.png
  49. BIN
      docs/en/Blog-Posts/2023-02-08 v7_1_Preview/cover-image.png
  50. BIN
      docs/en/Blog-Posts/2023-02-08 v7_1_Preview/ndc-london.png
  51. BIN
      docs/en/Blog-Posts/2023-02-08 v7_1_Preview/saas-impersonation-1.png
  52. BIN
      docs/en/Blog-Posts/2023-02-08 v7_1_Preview/saas-impersonation-2.png
  53. BIN
      docs/en/Blog-Posts/2023-02-08 v7_1_Preview/suite-blazor-wasm-nolayers.png
  54. 1
      docs/en/CLI.md
  55. 129
      docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md
  56. BIN
      docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman1.png
  57. BIN
      docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman2.png
  58. 47
      docs/en/Community-Articles/2022-11-22-The-new-EF-Core-interceptors/POST.md
  59. 197
      docs/en/Community-Articles/2022-11-22-gRPC-JSON-Transcoding/POST.md
  60. BIN
      docs/en/Community-Articles/2022-11-22-gRPC-JSON-Transcoding/google-api-folders.png
  61. BIN
      docs/en/Community-Articles/2022-11-22-gRPC-JSON-Transcoding/grpc-result.png
  62. BIN
      docs/en/Community-Articles/2022-11-22-gRPC-JSON-Transcoding/grpcurl.png
  63. BIN
      docs/en/Community-Articles/2022-11-22-gRPC-JSON-Transcoding/json-transcoding.png
  64. 71
      docs/en/Community-Articles/2022-11-23-Signalr-client-results/POST.md
  65. 139
      docs/en/Community-Articles/2022-11-25-EFCore-Mapping-Strategies/Post.md
  66. BIN
      docs/en/Community-Articles/2022-11-25-EFCore-Mapping-Strategies/banner.png
  67. BIN
      docs/en/Community-Articles/2022-11-25-EFCore-Mapping-Strategies/inheritance.png
  68. BIN
      docs/en/Community-Articles/2022-11-25-JSON-columns/Database.png
  69. 134
      docs/en/Community-Articles/2022-11-25-JSON-columns/post.md
  70. 73
      docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md
  71. 7
      docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md
  72. 88
      docs/en/Community-Articles/2022-11-28-Model-building-conventions-ef7/POST.md
  73. 71
      docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md
  74. 208
      docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md
  75. 231
      docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md
  76. BIN
      docs/en/Community-Articles/2022-11-29-Rate-Limiting/cover-image.png
  77. 68
      docs/en/Community-Articles/2022-12-29-Use-Weixin-Authentication-for-MVC-Applications/Post.md
  78. BIN
      docs/en/Community-Articles/2022-12-29-Use-Weixin-Authentication-for-MVC-Applications/login-with-weixin.jpg
  79. BIN
      docs/en/Community-Articles/2022-12-29-Use-Weixin-Authentication-for-MVC-Applications/offical-account.jpg
  80. 300
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/POST.md
  81. BIN
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/benchmark.png
  82. BIN
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/discard-pattern.png
  83. BIN
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/json-transcoding.png
  84. BIN
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/maui.png
  85. BIN
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/range-pattern.png
  86. BIN
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/rate-limiting-1.png
  87. BIN
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/rate-limiting-2.png
  88. BIN
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/raw-string-literals.png
  89. BIN
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/required-members.png
  90. BIN
      docs/en/Community-Articles/2022-18-11-whats-new-with-net7/var-pattern.png
  91. 86
      docs/en/Community-Articles/2023-02-06-Converting-Create-Edit-Modal-To-Page/POST.md
  92. BIN
      docs/en/Community-Articles/2023-02-06-Converting-Create-Edit-Modal-To-Page/images/new.gif
  93. BIN
      docs/en/Community-Articles/2023-02-06-Converting-Create-Edit-Modal-To-Page/images/old.gif
  94. 68
      docs/en/Distributed-Event-Bus.md
  95. 15
      docs/en/Entities.md
  96. 20
      docs/en/Entity-Framework-Core.md
  97. 19
      docs/en/Migration-Guides/Abp-7_1.md
  98. 1
      docs/en/Migration-Guides/Index.md
  99. 6
      docs/en/Modules/Cms-Kit/Blogging.md
  100. 25
      docs/en/Modules/Cms-Kit/Comments.md

14
.github/pull_request_template.md

@ -0,0 +1,14 @@
### Description
Resolves #xxxx (write the related issue number if available)
TODO: Describe what this PR has changed, add screenshot or animated GIF if available, write if it is a breaking change, and how to fix the breaking changes for existing applications if so.
### Checklist
- [ ] I fully tested it as developer / designer and created unit / integration tests
- [ ] I documented it (or no need to document or I will create a separate documentation issue)
### How to test it?
Please describe how this can be tested by the test engineers if it is not already explicit - or remove this section if no need to description.

18
.github/workflows/auto-pr.yml

@ -1,13 +1,13 @@
name: Merge branch rel-7.1 with rel-7.0
name: Merge branch dev with rel-7.1
on:
push:
branches:
- rel-7.0
- rel-7.1
permissions:
contents: read
jobs:
merge-rel-7-1-with-rel-7-0:
merge-dev-with-rel-7-1:
permissions:
contents: write # for peter-evans/create-pull-request to create branch
pull-requests: write # for peter-evans/create-pull-request to create a PR
@ -15,16 +15,16 @@ jobs:
steps:
- uses: actions/checkout@v2
with:
ref: rel-7.1
ref: dev
- name: Reset promotion branch
run: |
git fetch origin rel-7.0:rel-7.0
git reset --hard rel-7.0
git fetch origin rel-7.1:rel-7.1
git reset --hard rel-7.1
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
branch: auto-merge/rel-7-0/${{github.run_number}}
title: Merge branch rel-7.1 with rel-7.0
body: This PR generated automatically to merge rel-7.1 with rel-7.0. Please review the changed files before merging to prevent any errors that may occur.
branch: auto-merge/rel-7-1/${{github.run_number}}
title: Merge branch dev with rel-7.1
body: This PR generated automatically to merge dev with rel-7.1. Please review the changed files before merging to prevent any errors that may occur.
reviewers: ${{github.actor}}
token: ${{ github.token }}

1
.github/workflows/image-compression.yml

@ -6,6 +6,7 @@ on:
- "**.jpeg"
- "**.png"
- "**.webp"
- "**.gif"
types:
- opened
- synchronize

31
.github/workflows/spellcheck.yml

@ -1,31 +0,0 @@
name: Documentation Checks
on:
push:
branches:
- dev
paths:
# This ensures the check will only be run when something changes in the docs content
- "docs/en/**/*"
pull_request:
branches:
- dev
paths:
- "docs/en/**/*"
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
spellcheck:
name: "Docs: Spellcheck (En)"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
name: Check out the code
- uses: actions/setup-node@v1
name: Setup node
with:
node-version: "16"
- run: npm install -g cspell
name: Install cSpell
- run: cspell --config ./cSpell.json "docs/en/**/*.md" --no-progress # Update for path to the markdown files
name: Run cSpell

4
.gitignore

@ -326,4 +326,6 @@ deploy/_run_all_log.txt
# No commit yarn.lock files in the subfolders of templates directory
templates/**/yarn.lock
templates/**/yarn.lock
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Logs/logs.txt
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json

2
Directory.Build.props

@ -17,7 +17,7 @@
<NSubstitutePackageVersion>4.3.0</NSubstitutePackageVersion>
<!-- Shouldly https://www.nuget.org/packages/Shouldly -->
<ShouldlyPackageVersion>4.0.3</ShouldlyPackageVersion>
<ShouldlyPackageVersion>4.1.0</ShouldlyPackageVersion>
<!-- xunit https://www.nuget.org/packages/xUnit -->
<xUnitPackageVersion>2.4.1</xUnitPackageVersion>

2
README.md

@ -1,6 +1,6 @@
# ABP Framework
![build and test](https://img.shields.io/github/workflow/status/abpframework/abp/build%20and%20test/dev?style=flat-square)
![build and test](https://img.shields.io/github/actions/workflow/status/abpframework/abp/build-and-test.yml?branch=dev&style=flat-square)
[![codecov](https://codecov.io/gh/abpframework/abp/branch/dev/graph/badge.svg?token=jUKLCxa6HF)](https://codecov.io/gh/abpframework/abp)
[![NuGet](https://img.shields.io/nuget/v/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core)
[![NuGet (with prereleases)](https://img.shields.io/nuget/vpre/Volo.Abp.Core.svg?style=flat-square)](https://www.nuget.org/packages/Volo.Abp.Core)

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

@ -5,11 +5,11 @@
"Welcome": "أهلا و سهلا",
"UseOneOfTheFollowingLinksToContinue": "استخدم أحد الروابط التالية للمتابعة",
"FrameworkHomePage": "الصفحة الرئيسية للنظام",
"FrameworkDocumentation": "وثائق النظام",
"FrameworkDocumentation": "مستندات النظام",
"OfficialBlog": "المدونة الرسمية",
"CommercialHomePage": "الصفحة الرئيسية للنظام التجاري",
"CommercialSupportWebSite": "موقع الدعم الفني للنظام التجاري",
"CommunityWebSite": "موقع مجتمع ABP",
"CommunityWebSite": "موقع منتدى ABP",
"ManageAccount": "حسابي | ABP.IO",
"ManageYourAccount": "إدارة حسابك"
}

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

@ -169,7 +169,7 @@
"QuestionCountsMustBeGreaterThanZero": "يجب أن يكون TotalQuestionCount و RemainingQuestionCount صفرًا أو أكبر من الصفر!",
"UnlimitedQuestionCount": "عدد أسئلة غير محدود",
"Notes": "ملاحظات",
"Menu:Community": "المجتمع",
"Menu:Community": "المنتدى",
"Menu:Posts": "مقالات",
"Wait": "انتظر",
"Approve": "موافقة",
@ -183,7 +183,7 @@
"PostHasBeenWaiting": "تم إيقاف المقال",
"PostHasBeenApproved": "تم الموافقة على المقال",
"PostHasBeenRejected": "تم رفض المقال",
"Permission:Community": "المجتمع",
"Permission:Community": "المنتدى",
"Permission:CommunityPost": "مقال",
"Link": "رابط",
"Enum:ContentSource:0": "Github",

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

@ -407,6 +407,51 @@
"ExportToExcel": "Export to Excel",
"OverallTotalPrice": "Overall Total Price",
"OverallDiscountPrice": "Overall Discount Price",
"OverallDiscountText": "Overall Discount Text"
"OverallDiscountText": "Overall Discount Text",
"SelectReport": "- Select Report -",
"NoDataAvailable": "No data available",
"StatisticsOfCachedContents": "Statistics of cached NuGet package contents for nuget.abp.io",
"Compact": "Compact",
"EditSettings": "Edit Settings",
"CurrentEstimatedSize": "Current Estimated Size",
"CurrentEntryCount": "Current Entry Count",
"TotalHits": "Total Hits",
"TotalMisses": "Total Misses",
"NoResponseFrom": "No response from",
"ContentCacheSlidingExpirationByDay": "Content Cache Sliding Expiration By Day",
"MaxDaysForCaching": "Max Days For Caching",
"Enabled": "Enabled",
"Menu:NugetPackagesContentCache": "NuGet Packages Content Cache",
"NugetPackagesContentCache": "NuGet Content Cache",
"SlidingExpritionByDayInfo": "Gets or sets how long a cache entry can be inactive (e.g. not accessed) before it will be removed. This will not extend the entry lifetime beyond the absolute expiration.",
"MaxDaysForCachingInfo": "Gets or sets an absolute expiration time, relative to now.",
"CurrentEstimatedSizeInfo": "Indicates an estimated sum of all the NuGet packages' content size currently in the memory cache",
"CurrentEntryCountInfo": "Indicates the number of instances currently in the memory cache.",
"TotalHitsInfo": "Indicates the total number of cache misses. A cache hit occurs when a file is requested from a cache and the cache is able to fulfill that request.",
"TotalMissesInfo": "Indicates the total number of cache hits. A cache miss is when the cache does not contain the requested content.",
"Permission:VersionHistory": "Version History",
"Caches": "Caches",
"VersionHistories": "Version History",
"Version": "Version",
"PublishDate": "Publish Date",
"IsStableVersion": "Stable Version",
"IsActive": "Active",
"NewVersion": "New Version",
"VersionHistoryDeletionConfirmationMessage": "Are you sure you want to delete this version?",
"CreateAbpConsultantLogoInfo": "Maximum file size: <b>1MB</b> <br/> Supported file types: <b>jpg, jpeg, png, SVG, WebP</b>",
"UrlCode": "Url Code",
"Clear": "Clear",
"Permission:AbpConsultant": "ABP Consultant",
"Menu:AbpConsultants": "ABP Consultants",
"CreateAbpConsultant": "Create ABP Consultant",
"UrlCodeIsNotAvailable": "Url code is used by another ABP Consultant.",
"AbpConsultants": "ABP Consultants",
"AbpConsultant": "ABP Consultant",
"AbpConsultantEdit": "Edit ABP Consultant",
"AbpConsultantCreate": "Create ABP Consultant",
"WhoWeAreItem": "Who We Are Item",
"FieldIsRequired": "{0} is required.",
"FieldIsNotValid": " {0} is not valid.",
"InterestedLicenseType": "Interested License Type"
}
}

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

@ -9,36 +9,179 @@
"Volo.AbpIo.Domain:010009": "لا يمكن أن يكون عدد المطورين المسموح لهم أقل من 0!",
"Volo.AbpIo.Domain:010010": "تم تجاوز الحد الأقصى لعدد عناوين mac!",
"Volo.AbpIo.Domain:010011": "لا يمكن أن تحتوي الرخصة الشخصية على أكثر من مطور واحد!",
"Volo.AbpIo.Domain:010012": "لا يمكن تمديد الترخيص بعد شهر واحد من انتهاء صلاحية الترخيص!",
"Volo.AbpIo.Domain:010012": "لا يمكن تمديد الرخصة بعد شهر واحد من انتهاء صلاحية الرخصة!",
"Volo.AbpIo.Domain:020001": "تعذر حذف حزمة NPM هذه لأن \"{NugetPackages}\" حزم Nuget تعتمد على هذه الحزمة.",
"Volo.AbpIo.Domain:020002": "تعذر حذف حزمة NPM هذه لأن \"{Modules}\" الوحدات النمطية تستخدم هذه الحزمة.",
"Volo.AbpIo.Domain:020003": "تعذر حذف حزمة NPM هذه لأن \"{Modules}\" الوحدات النمطية تستخدم هذه الحزمة و \"{NugetPackages}\" حزم Nuget تعتمد على هذه الحزمة.",
"Volo.AbpIo.Domain:020004": "تعذر حذف حزمة Nuget هذه لأن \"{Modules}\" الوحدات النمطية تستخدم هذه الحزمة.",
"Volo.AbpIo.Domain:030001": "اسم هذه المنظمة موجود بالفعل.",
"Volo.AbpIo.Domain:030002": "بمجرد التفعيل، لا يمكنك تبديل الرخصة التجريبية إلى الحالة المطلوبة!",
"Volo.AbpIo.Domain:030003": "لا يوجد مثل هذه الحالة!",
"Volo.AbpIo.Domain:030004": "لا يمكن تغيير الحالة بسبب خطأ غير متوقع!",
"Volo.AbpIo.Domain:030005": "يمكن تحديث تاريخ البدء والانتهاء عندما تكون الرخصة التجريبية في حالة -منشطة-!",
"Volo.AbpIo.Domain:030006": "يجب أن يكون تاريخ الانتهاء أكبر من تاريخ البدء!",
"Volo.AbpIo.Domain:030007": "تم تفعيل هذه الرخصة التجريبية بالفعل!",
"Volo.AbpIo.Domain:030008": "يمكن تحديد تاريخ الشراء فقط عندما تكون الحالة -تم الشراء-!",
"Volo.AbpIo.Domain:030009": "المستخدم ليس موجود!",
"Volo.AbpIo.Domain:030010": "لشراء الرخصة التجريبية ، تحتاج أولاً إلى تفعيل الرخصة التجريبية الخاص بك!",
"Volo.AbpIo.Domain:030011": "لا يمكنك حذف رخصة تجريبية عند شرائها!",
"Volo.AbpIo.Domain:070000": "لا يمكن أن يحتوي اسم المؤسسة إلا على أحرف لاتينية وأرقام ونقاط وواصلات!",
"Volo.AbpIo.Domain:070001": "لا يمكن أن يحتوي اسم الشركة إلا على أحرف لاتينية وأرقام ونقاط وواصلات!",
"WantToLearn?": "تريد أن تتعلم؟",
"ReadyToGetStarted?": "على استعداد للبدء؟",
"JoinOurCommunity": "انضم إلى مجتمعنا",
"JoinOurCommunity": "انضم إلى منتدانا",
"GetStartedUpper": "دعنا نبدأ",
"ForkMeOnGitHub": "GitHub أعطنى تنبيه على",
"Features": "خصائص",
"GetStarted": "دعنا نبدأ",
"Documents": "وثائق",
"Community": "مجتمع",
"Documents": "المستندات",
"Community": نتدى",
"ContributionGuide": "دليل المساهمة",
"Blog": "المدونة",
"Commercial": "تجارى",
"MyAccount": "حسابي",
"Permission:License": "رخصة",
"Permission:UserInfo": "معلومات مفيدة",
"SeeDocuments": "انظر للوثائق",
"SeeDocuments": "انظر للمستندات",
"Samples": "عينات",
"Framework": "إطار العمل",
"Support": "الدعم",
"FreeDDDBook": "كتاب إلكتروني مجاني DDD",
"FreeDDDBook": "كتاب تصميم مقاد بالنطاق DDD إلكتروني مجاني",
"New": "جديد",
"Volo.AbpIo.Domain:020005": "لا يمكن أن تكون سنة تمديد الترخيص أقل من {MinExtendLicenseYear} سنة وأكبر من {MaxExtendLicenseYear} عام (سنوات)",
"TrialLicensePeriodHasExpired": "انتهت فترة الترخيص التجريبي الخاص بك قبل {0} يوم.",
"TrialLicensePeriodWillExpire": "ستنتهي فترة الترخيص التجريبي الخاص بك في غضون {0} يوم.",
"TrialLicensePeriodExpireToday": "ستنتهي فترة الترخيص التجريبي الخاص بك اليوم.",
"PurchaseNow": "شراء الآن!"
"Volo.AbpIo.Domain:020005": "لا يمكن أن تكون سنة تمديد الرخصة أقل من {MinExtendLicenseYear} سنة وأكبر من {MaxExtendLicenseYear} عام (سنوات)",
"TrialLicensePeriodHasExpired": "انتهت فترة الرخصة التجريبية الخاصة بك قبل {0} يوم.",
"TrialLicensePeriodWillExpire": "ستنتهي فترة الرخصة التجريبية الخاصة بك في غضون {0} يوم.",
"TrialLicensePeriodExpireToday": "ستنتهي فترة الرخصة التجريبية الخاصة بك اليوم.",
"PurchaseNow": "شراء الآن!",
"LatestReleaseLogs": "أحدث سجلات الإصدار",
"RoadMap": "خريطة الطريق",
"FAQ": "الاسئلة الشائعة",
"SourceCode": "الكود الأصل",
"SeeAllPosts": "انظر جميع المنشورات",
"Contribute": "مساهمة",
"LiveDemo": "عرض مباشر",
"GetLicense": "احصل على رخصة",
"OpenSource": "مصدر مفتوح",
"WebApplication": "تطبيق ويب",
"MeetTheABP": "تعرف على ABP",
"CompleteWebDevelopment": "تطوير ويب كامل",
"Platform": "منصة",
"ABPDescription": "اطار عمل ABP هو بنية تحتية كاملة لإنشاء تطبيقات ويب حديثة باتباع أفضل ممارسات واتفاقيات تطوير البرامج.",
"StrongInfrastructure": "بنية تحتية قوية",
"CompleteArchitecture": "معمارية كاملة",
"DeveloperFocused": "مركزة على المطور",
"ShareYourExperiences": "شارك خبراتك مع إطار عمل ABP",
"LatestPosts": "آخر المنشورات",
"LatestVideos": "أحدث مقاطع الفيديو",
"Views": "المشاهدات",
"LearnLatestNewsAboutABPFramework": "احصل على معلومات حول الأحداث في ABP مثل الإصدارات الجديدة والمصادر المجانية والمشاركات والمزيد.",
"DeveloperTools": "ادوات المطور",
"StartupTemplates": "عارضات بدء التشغيل",
"ApplicationModules": "وحدات التطبيق",
"UI": "واجهة المستخدم",
"Themes": "السمات",
"Premium": "ممتاز",
"PrivacyPolicy": "سياسة الخصوصية",
"TermsAndConditions": "البنود و الظروف",
"WouldLikeToReceiveMarketingMaterials": "أرغب في تلقي مواد تسويقية مثل صفقات المنتجات والعروض الخاصة.",
"JoinOurMarketingNewsletter": "انضم إلى النشرة الإخبارية التسويقية",
"CommunityPrivacyPolicyConfirmation": "أوافق على الشروط والأحكام و <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">سياسة الخصوصية</a>.",
"WouldLikeToReceiveNotification": "أرغب في تلقي آخر الأخبار من مواقع abp.io.",
"CommercialNewsletterConfirmationMessage": "أنا أوافق على <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/TermsConditions\">البنود و الظروف</a> و <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">سياسة الخصوصية</a>.",
"FreeDDDEBook": "كتاب تصميم مقاد بالنطاق DDD إلكتروني مجاني",
"AdditionalServices": "خدمات إضافية",
"Learn": "تعلم",
"AccountOverview": "نظرة عامة على الحساب",
"MyOrganizations": "منظماتي",
"MySupportQuestions": "أسئلة الدعم الخاصة بي",
"MyProfile": "صفحتي الشخصية",
"Logout": "تسجيل الخروج",
"Home": "الصفحة الرئيسية",
"Posts": "المنشورات",
"Videos": "مقاطع الفيديو",
"JoinTheABPCommunity": "انضم إلى منتدى ABP",
"SubmitYourPost": "سلم منشورك",
"Modules": "الوحدات",
"Tools": "الادوات",
"Pricing": "التسعير",
"ChangeLogs": "تغيير السجلات",
"SubscribeToNewsletter": "اشترك في النشرة الإخبارية",
"SubscribeToNewsletterDescription": "احصل على معلومات حول الأحداث في ABP مثل الإصدارات الجديدة والمصادر المجانية والمشاركات والمزيد.",
"EmailAddress": "البريد الالكترونى",
"Subscribe": "اشتراك",
"WelcomeToABP": "مرحبًا بك في ABP",
"EULA": "اتفاقية مستخدم الرخصة EULA",
"ABPCommercialIntroductionMessage": "وحدات تطبيق مبنية مسبقا ، وعارضات بدء تشغيل متقدمة ، وأدوات التطوير السريع للتطبيقات ، وسمات واجهة مستخدم ااحترافية ، ودعم متميز.",
"MasteringAbpFrameworkEBook": "إتقان إطار عمل ABP",
"MasteringTheABPFrameworkExplanation": "سيساعدك هذا الكتاب ، الذي كتبه مبتكر إطار عمل ABP ، على اكتساب فهم كامل للإطار وتقنيات تطوير تطبيقات الويب الحديثة.",
"Speakers": "المتحدثين",
"PreviousEvents": "الأحداث السابقة",
"WatchTheEvent": "شاهد الحدث",
"RegisterNow": "سجل الان",
"ThereIsNoEvent": "لا يوجد حدث.",
"Events": "الأحداث",
"Volo.AbpIo.Domain:080000": "يوجد بالفعل عنصر شراء اسمه \"{Name}\"",
"MasteringAbpFrameworkBook": "الكتاب: إتقان إطار عمل ABP",
"ABPIO-CommonPreferenceDefinition": "احصل على آخر الأخبار حول منصة ABP مثل المنشورات الجديدة والأحداث والمزيد.",
"BuiltOn": "مبني على",
"AbpFramework": "إطار عمل ABP",
"Volo.AbpIo.Domain:080001": "لا يمكن أن يكون وقت البدء أكبر من وقت الانتهاء",
"Enum:BookType:0": "إتقان إطار عمل ABP",
"Enum:PurchasePlatform:0": "أمازون",
"Enum:PurchasePlatform:1": "باكت",
"Copied": "تم النسخ!",
"CouldNotCopy": "تعذر النسخ!",
"CopyNotSupportByYourBrowser": "هذه الميزة لا تعمل في المتصفح الذي تستخدمه.",
"City": "المدينة",
"ZipCode": "الرمز البريدي",
"Address": "العنوان",
"Homepage": "الصفحة الرئيسية",
"Year": "السنة",
"Copyright": "حقوق النشر © <a href=\"{0}\" target=\"_blank\">{1}</a>",
"DomainDrivenDesign": "التصميم المُقاد بالنطاق DDD",
"CrossCuttingConcerns": "اهتمامات مشتركة",
"AbpCommunity": "منتدى ABP",
"Footer_GithubStarCount": "{0} نجمة على GitHub",
"Footer_NugetDownloadCount": "{0} تنزيلات على NuGet",
"AbpDescription": "ABP هو إطار تطبيق مفتوح المصدر يركز على تطوير تطبيقات الويب القائمة على AspNet Core. لا تكرر نفسك، ركز على كود عملك الخاص.",
"Layout_AbpFramework_MetaTitle": "إطار عمل ABP - إطار عمل تطبيق ويب مفتوح المصدر",
"CommunityTalks_CountdownDays": "أيام",
"CommunityTalks_CountdownHours": "ساعات",
"CommunityTalks_CountdownMinutes": "دقيقة",
"CommunityTalks_CountdownSeconds": "ثانية",
"SeePreviousEvents": "انظر الأحداث السابقة",
"CookieConsent_Accept": "قبول",
"CookieConsent_Explanation_1": "نحن نستخدم ملفات تعريف الارتباط لنمنحك أفضل تجربة على موقعنا.",
"CookieConsent_Explanation_2": "إذا واصلت التصفح ، فإنك توافق على <a href=\"@Url.Page(\"/Privacy\")\">سياسة الخصوصية وسياسة ملفات تعريف الارتباط.</a>.",
"Error_Page_400_Title": "كانت هناك مشكلة في خدمة الصفحة المطلوبة.",
"Error_Page_400_Description_1": "عادةً ما يعني هذا حدوث خطأ غير متوقع أثناء معالجة طلبك.",
"Error_Page_400_Description_2": "إذا استمرت المشكلة، اتصل بنا على <a href=\"mailto:info@abp.io\">info@abp.io</a> وسنساعدك في الوصول إلى طريقك.",
"GoToHomepage": "اذهب إلى الصفحة الرئيسية",
"Error_Page_404_Title": "الصفحة غير موجودة!",
"Error_Page_404_Description_1": "هذه ليست الصفحة التي تبحث عنها.",
"Error_Page_500_Title": "يبدو أنه حدث خطأ ما!",
"Error_Page_500_Description_1": "نحن نتتبع هذه الأخطاء تلقائيًا ، ولكن إذا استمرت المشكلة فلا تتردد في <br /> الاتصال بنا. في غضون ذلك ، حاول تحديث الصفحة.",
"Error_Page_500_Description_2": "تواصل معنا على <a href=\"mailto:info@abp.io\" target=\"_blank\">info@abp.io</a>.",
"Books": "الكتب",
"ABPDiscordServer": "ABP سيرفر الدسكورد",
"ABPCommunityTalks": "برامج منتدى ABP الحوارية",
"ABPCommunityPosts": "منشورات منتدى ABP",
"BuyAndGetMonths": "شراء 12 شهر، <span class=\"text-info\">احصل على 14 شهرا!</span>",
"GetYourDeal": "احصل على صفقتك",
"BuyOrRenewLicense": "اشترِ أو جدد الرخصة الآن واحصل على شهرين إضافيين!",
"BuyOrRenewLicenseToGetExtra2Months": "اشترِ أو جدد الرخصة الآن واحصل على شهرين إضافيين! اسرع! ⏰ آخر يوم: {0}",
"HurryUp": "اسرع!",
"LastDay": "آخر يوم: {0}",
"BuyNewLicenseBetweenDatesToGetBenefit": "اشتر رخصة جديدة بين {0} و {1} للاستفادة لمدة شهرين إضافيين!",
"CheckAllCommunityTalks": "تحقق من جميع منشورات المنتدى",
"ReadMore": "قراءة المزيد",
"Post": "نشر",
"ExploreTheContentsCreatedByTheCoreABPTeamAndTheABPCommunity": "استكشف المحتويات التي أنشأها فريق ABP الأساسي ومنتدى ABP.",
"WelcomeFallCampaign": "مرحبا بكم في حملة الخريف!",
"GiveAwayForNewPurchases": "سيتم منح التدريب لتطوير التطبيقات مجانا مع عمليات الشراء الجديدة!",
"BlackFriday": "<strong>السوداء</strong> <span>الجمعة</span>",
"ValidForExistingCustomers": "صالح أيضًا <br> للعملاء الحاليين!",
"CampaignBetweenDates": "من {0} <br>إلى {1}",
"SaveUpTo": "<span>وفر</span> ماقد يصل الى <strong>${0}K</strong>"
}
}

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

@ -26,6 +26,7 @@
"Volo.AbpIo.Domain:030009": "User not found!",
"Volo.AbpIo.Domain:030010": "To purchase the trial license, you first need to activate your trial license!",
"Volo.AbpIo.Domain:030011": "You cannot delete a trial license when it is purchased!",
"Volo.AbpIo.Domain:030012": "A user is entitled to have only 1 free trial period. You already used your trial license.",
"Volo.AbpIo.Domain:070000": "The organization name can only contain latin letters, numbers, dots and hyphens!",
"Volo.AbpIo.Domain:070001": "The company name can only contain latin letters, numbers, dots, space and hyphens!",
"WantToLearn?": "Want to learn?",
@ -183,6 +184,27 @@
"BlackFriday": "<strong>BLACK</strong> <span>FRIDAY</span>",
"ValidForExistingCustomers": "Also valid for the <br> existing customers!",
"CampaignBetweenDates": "From {0} <br>to {1}",
"SaveUpTo": "<span>SAVE</span> UP TO<strong>${0}K</strong>"
"SaveUpTo": "<span>SAVE</span> UP TO<strong>${0}K</strong>",
"ImplementingDDD": "Implementing Domain Driven Design",
"ExploreTheEBook": "Explore the E-Book",
"ExploreTheBook": "Explore the Book",
"ConsultantType": "Consultancy Type",
"Expert": "ABP Expert",
"Partner": "ABP Partner",
"Industry": "Industry",
"Location": "Location",
"Contact": "Contact",
"Partner_Year": "Partnership Year",
"Info": "Info",
"SpokenLanguages": "Spoken Languages",
"SocialMedia": "Social Media",
"Activity": "Activity",
"Type": "Type",
"Contribution": "Contribution",
"WhoWeAre": "Who We Are",
"Icons": "Icons",
"Url": "Url",
"Icon": "Icon",
"RecentActivities": "Recent Activities"
}
}

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

@ -179,6 +179,10 @@
"Post": "邮政",
"ExploreTheContentsCreatedByTheCoreABPTeamAndTheABPCommunity": "探索核心 ABP 团队和 ABP 社区创建的内容。",
"WelcomeFallCampaign": "欢迎秋季活动!",
"GiveAwayForNewPurchases": "新购买将赠送应用程序开发课堂培训!"
"GiveAwayForNewPurchases": "新购买将赠送应用程序开发课堂培训!",
"BlackFriday": "<strong>黑色</strong> <span>星期五</span>",
"ValidForExistingCustomers": "也适用于 <br> 现有用户!",
"CampaignBetweenDates": "从 {0} <br>至 {1}",
"SaveUpTo": "<span>最多节省</span> 至<strong>${0}K</strong>"
}
}
}

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

@ -0,0 +1,7 @@
{
"culture": "ar",
"texts": {
"AbpTitle": "إطار عمل ABP - إطار عمل تطبيق ويب مفتوح المصدر",
"AbpDescription": "ABP هو إطار عمل مفتوح المصدر يركز على تطوير تطبيقات الويب القائمة على AspNet Core. لا تكرر نفسك ، ركز على كود عملك الخاص."
}
}

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

@ -57,14 +57,14 @@
"PremiumSupport": "دعم متميز",
"PremiumForumSupport": "دعم المنتدى المتميز",
"UI": "واجهة المستخدم",
"Themes": "ثيمات",
"Themes": "السمات",
"JoinOurNewsletter": "اشترك في صحيفتنا الإخبارية",
"Send": "يرسل",
"Learn": "يتعلم",
"AdditionalServices": "خدمات إضافية",
"WhatIsABPFramework": "ما هو إطار ABP؟",
"OpenSourceBaseFramework": "إطار عمل قاعدة مفتوحة المصدر",
"ABPFrameworkExplanation": "<p class=\"lead\"> يعتمد ABP Commercial على إطار عمل ABP ، وهو إطار عمل تطبيقات ويب مفتوح المصدر وقائم على المجتمع لـ ASP.NET Core. </p> <p> يوفر إطار عمل ABP بنية تحتية ممتازة للكتابة القابلة للصيانة والتوسعة وشفرة قابلة للاختبار مع أفضل الممارسات. </ p> <p> مبنية ومتكاملة مع الأدوات الشائعة التي تعرفها بالفعل. منحنى تعليمي منخفض ، وتكيف سهل ، وتطور مريح. </ p>",
"ABPFrameworkExplanation": "<p class=\"lead\"> يعتمد ABP Commercial على إطار عمل ABP ، وهو إطار عمل تطبيقات ويب مفتوح المصدر وقائم على المنتدى لـ ASP.NET Core. </p> <p> يوفر إطار عمل ABP بنية تحتية ممتازة للكتابة القابلة للصيانة والتوسعة وشفرة قابلة للاختبار مع أفضل الممارسات. </ p> <p> مبنية ومتكاملة مع الأدوات الشائعة التي تعرفها بالفعل. منحنى تعليمي منخفض ، وتكيف سهل ، وتطور مريح. </ p>",
"Modular": "معياري",
"MicroserviceCompatible": "متوافق مع Microservice",
"DomainDrivenDesignInfrastructure": "بنية تحتية للتصميم يحركها المجال",
@ -158,7 +158,7 @@
"WhatIsTheABPCommercial": "ما هو برنامج ABP التجاري؟",
"WhatAreDifferencesThanAbpFramework": "ما هي الاختلافات بين إطار عمل ABP مفتوح المصدر وإطار عمل ABP التجاري؟",
"ABPCommercialExplanation": "ABP Commercial عبارة عن مجموعة من الوحدات النمطية والأدوات والسمات والخدمات المتميزة التي تم إنشاؤها فوق <a target=\"_blank\" href=\"{0}\"> إطار عمل ABP </a> مفتوح المصدر. يتم تطوير ودعم ABP Commercial من قبل نفس الفريق الذي يقف وراء إطار عمل ABP.",
"WhatAreDifferencesThanABPFrameworkExplanation": "<p> <a target=\"_blank\" href=\"{0}\"> إطار عمل ABP </a> عبارة عن إطار عمل لتطوير تطبيقات معياري وقابل للتخصيص ومتوافق مع خدمة دقيقة لـ ASP.NET Core. إنه يوفر بنية كاملة وبنية تحتية قوية لتجعلك تركز على رمز عملك الخاص بدلاً من تكرار نفسك لكل مشروع جديد. يعتمد على أفضل ممارسات تطوير البرامج والأدوات الشائعة التي تعرفها بالفعل. </p> <p> إطار عمل ABP مجاني تمامًا ومفتوح المصدر وقائم على المجتمع. كما أنه يوفر سمة مجانية وبعض الوحدات النمطية مسبقة الصنع (مثل إدارة الهوية وإدارة المستأجر). </ p>",
"WhatAreDifferencesThanABPFrameworkExplanation": "<p> <a target=\"_blank\" href=\"{0}\"> إطار عمل ABP </a> عبارة عن إطار عمل لتطوير تطبيقات معياري وقابل للتخصيص ومتوافق مع خدمة دقيقة لـ ASP.NET Core. إنه يوفر بنية كاملة وبنية تحتية قوية لتجعلك تركز على رمز عملك الخاص بدلاً من تكرار نفسك لكل مشروع جديد. يعتمد على أفضل ممارسات تطوير البرامج والأدوات الشائعة التي تعرفها بالفعل. </p> <p> إطار عمل ABP مجاني تمامًا ومفتوح المصدر وقائم على المنتدى. كما أنه يوفر سمة مجانية وبعض الوحدات النمطية مسبقة الصنع (مثل إدارة الهوية وإدارة المستأجر). </ p>",
"VisitTheFrameworkVSCommercialDocument": "قم بزيارة الرابط التالي للحصول على مزيد من المعلومات <a href=\"{0}\" target=\"_blank\"> {1} </a>",
"ABPCommercialFollowingBenefits": "يضيف ABP Commercial المزايا التالية إلى جانب إطار عمل ABP ؛",
"Professional": "احترافي",
@ -208,7 +208,7 @@
"MicroserviceSupportExplanation3": "نحن نقدم نموذجًا من <a href=\"{0}\"> حل تجريبي للخدمة المصغرة </a> يوضح تنفيذ بنية الخدمة الدقيقة لمساعدتك في إنشاء الحل الخاص بك.",
"MicroserviceSupportExplanation4": "لذا ، فإن الإجابة المختصرة هي \"<strong> نعم ، فهي تدعم بنية الخدمات الدقيقة </ strong>\".",
"MicroserviceSupportExplanation5": "ومع ذلك ، يعد نظام الخدمة الصغيرة حلاً وسيكون لكل حل متطلبات مختلفة ، وطوبولوجيا الشبكة ، وسيناريوهات الاتصال ، وإمكانيات المصادقة ، وقرارات فصل/مشاركة قاعدة البيانات ، وتكوينات وقت التشغيل ، وتكاملات أنظمة الجهات الخارجية وغيرها الكثير.",
"MicroserviceSupportExplanation6": "يوفر إطار عمل ABP و ABP Commercial بنية تحتية لسيناريوهات الخدمة الصغيرة والوحدات النمطية المتوافقة مع الخدمة الصغيرة والعينات والوثائق لمساعدتك في بناء الحل الخاص بك. ولكن لا تتوقع تنزيل الحل الذي تحلم به والذي تم إنشاؤه مسبقًا من أجلك مباشرةً. ستحتاج إلى فهمها وجمع بعض الأجزاء معًا بناءً على متطلباتك.",
"MicroserviceSupportExplanation6": "يوفر إطار عمل ABP و ABP Commercial بنية تحتية لسيناريوهات الخدمة الصغيرة والوحدات النمطية المتوافقة مع الخدمة الصغيرة والعينات والمستندات لمساعدتك في بناء الحل الخاص بك. ولكن لا تتوقع تنزيل الحل الذي تحلم به والذي تم إنشاؤه مسبقًا من أجلك مباشرةً. ستحتاج إلى فهمها وجمع بعض الأجزاء معًا بناءً على متطلباتك.",
"WhereCanIDownloadSourceCode": "أين يمكنني تنزيل شفرة المصدر؟",
"WhereCanIDownloadSourceCodeExplanation": "يمكنك تنزيل الكود المصدري لجميع وحدات ABP والحزم والسمات Angular عبر ABP Suite أو ABP CLI. راجع <a href=\"{0}\"> كيفية تنزيل شفرة المصدر؟ </a>",
"ComputerLimitation": "كم عدد أجهزة الكمبيوتر التي يمكن للمطور تسجيل الدخول إليها عند تطوير برنامج ABP؟",
@ -252,7 +252,7 @@
"SeeABPSuiteDocument": "راجع مستند ABP Suite للتعرف على استخدام ABP Suite.",
"AskQuestionsOnSupport": "يمكنك طرح الأسئلة على الدعم التجاري لبرنامج ABP.",
"Documentation": "توثيق",
"SeeModulesDocument": "راجع مستند الوحدات للحصول على قائمة بجميع الوحدات التجارية (الموالية) ووثائقها.",
"SeeModulesDocument": "راجع مستند الوحدات للحصول على قائمة بجميع الوحدات التجارية (الموالية) ومستنداتها.",
"Pricing": "التسعير",
"PricingExplanation": "اختر الميزات والوظائف التي يحتاجها عملك اليوم. قم بالترقية بسهولة مع نمو عملك.",
"Team": "فريق",
@ -311,7 +311,7 @@
"New": "جديد",
"MongoDB": "MongoDB",
"EBookDDD": "تصميم يحرك مجال الكتاب الإلكتروني",
"PracticalGuideForImplementingDDD": "هذا الكتاب هو دليل عملي لتنفيذ التصميم المستند إلى المجال باستخدام إطار عمل ABP.",
"PracticalGuideForImplementingDDD": "هذا الكتاب هو دليل عملي لتنفيذ التصميم المُقاد بالمجال باستخدام إطار عمل ABP.",
"IntroducingDDD": "تقديم تصميم يحركه المجال",
"DDDLayersAndCleanArchitecture": "طبقات DDD والعمارة النظيفة",
"LayeringOfADotnetSolution": "طبقات حل NET",
@ -322,9 +322,9 @@
"Download": "تحميل",
"DDDEBook": "DDD الكتاب الإلكتروني",
"ImplementingDDD": "تنفيذ تصميم يحركه المجال",
"DDDBookExplanation": "دليل عملي لتنفيذ التصميم المستند إلى المجال باستخدام إطار عمل ABP.",
"DDDBookExplanation": "دليل عملي لتنفيذ التصميم المُقاد بالمجال باستخدام إطار عمل ABP.",
"Overview": "ملخص",
"DDDBookPracticalGuide": "هذا دليل عملي لتنفيذ التصميم المستند إلى المجال (DDD). بينما تعتمد تفاصيل التنفيذ على البنية التحتية لـ ABP Framework ، فإن المفاهيم الأساسية والمبادئ والأنماط قابلة للتطبيق في أي نوع من الحلول ، حتى لو لم يكن حل .NET.",
"DDDBookPracticalGuide": "هذا دليل عملي لتنفيذ التصميم المُقاد بالمجال (DDD). بينما تعتمد تفاصيل التنفيذ على البنية التحتية لـ ABP Framework ، فإن المفاهيم الأساسية والمبادئ والأنماط قابلة للتطبيق في أي نوع من الحلول ، حتى لو لم يكن حل .NET.",
"TableOfContents": "جدول المحتويات",
"IntroductionToImplementingDDD": "مقدمة في تنفيذ التصميم على أساس المجال",
"WhatIsDDD": "ما هو المجال على أساس التصميم؟",
@ -382,6 +382,403 @@
"RenewLicenseEarly": "إذا قمت بتجديد رخصتي في وقت مبكر ، هل سأحصل على السنة كاملة؟",
"RenewLicenseEarylExplanation": "عند تجديد الترخيص الخاص بك قبل تاريخ انتهاء الترخيص الخاص بك ، ستتم إضافة سنة واحدة إلى تاريخ انتهاء الترخيص الخاص بك. على سبيل المثال ، إذا انتهت صلاحية ترخيصك في {0} -06-06 وقمت بتجديده في {0} -01-01 ، فسيكون تاريخ انتهاء صلاحية الترخيص الجديد {1} -06-06.",
"discountForYears": "{0}٪ خصم لمدة {1} سنة (سنوات)",
"BlackFridayDiscount": "خصم الجمعة السوداء"
"BlackFridayDiscount": "خصم الجمعة السوداء",
"OpenSourceWebApplication": "تطبيق ويب مفتوح المصدر",
"CompleteWebDevelopment": "تطوير ويب كامل",
"ABPFrameworkDescription": "إطار عمل ABP هو بنية تحتية كاملة لإنشاء تطبيقات ويب حديثة من خلال اتباع أفضل ممارسات تطوير البرامج والاتفاقيات.",
"CommunityDescription": "شارك خبراتك مع إطار عمل ABP!",
"GetStarted": "ابدأ",
"Views": "المشاهدات",
"LatestPosts": "آخر المنشورات",
"PreBuiltApplication": "تطبيق مبني مسبقًا",
"DatabaseProviders": "مزودي قواعد البيانات",
"UIFrameworks": "أطر عمل واجهة المستخدم",
"UsefulLinks": "روابط مفيدة",
"Platform": "منصة",
"CoolestCompaniesUseABPCommercial": "أروع الشركات تستخدم بالفعل <span class=\"fw-6\">ABP التجاري.</span>",
"UserInterface": "واجهة المستخدم",
"APIGateway": "بوابة API",
"Microservice": "خدمة مصغرة",
"Database": "قاعدة البيانات",
"Architecture": "البنية",
"MicroserviceArchitectureExplanation": "هذه بنية حل كاملة تتكون من تطبيقات متعددة وبوابات API وخدمات مصغرة وقواعد بيانات لبناء حل خدمات مصغرة قابل للتطوير باستخدام أحدث التقنيات.",
"BusinessLogic": "منطق الأعمال",
"DataAccessLayer": "طبقة الوصول إلى البيانات",
"Monolith": "متراصة",
"ModularArchitectureExplanation": "يوفر قالب بدء التشغيل هذا بنية حل ذات طبقات ووحدات تعتمد على التصميم المُقاد بالمجال DDD لإنشاء قاعدة بيانات نظيفة وقابلة للصيانة.",
"SeeDetails": "انظر التفاصيل",
"SeeDocumentation": "تحقق من المستندات",
"Bs5Compatible": "سمة احترافية متوافقة مع Bootstrap 5 ، مثالية لموقعك الإداري.",
"LeptonXTheme": "سمة LeptonX",
"LeptonXDark": "LeptonX داكن",
"LeptonXLight": "فاتح LeptonX",
"LeptonXSemiDark": "LeptonX شبه داكن",
"BuiltOnBs5Library": "بنيت على مكتبة Bootstrap 5",
"FullyCompatibleWithBs5": "100٪ متوافق مع بنية Bootstrap 5 HTML وفئات CSS",
"ResponsiveAndMobileCompatible": "دعم اليمين-لليسار سريع الاستجابة ومتوافق مع الأجهزة المحمولة",
"ProvidesStylesForDatatables": "يوفر أنماطًا لجداول البيانات",
"MultipleLayoutOptions": "خيارات تخطيط متعددة",
"EasilyInstallAndUpgrade": "سهولة التثبيت والترقية",
"SupportForum": "منتدى الدعم",
"TrustedBy": "موثوق به من قبل",
"OurPricing": "<span class=\"gradient-commercial\">تسعيرنا</span>",
"Plans": "الخطط",
"NameSurname": "الاسم واللقب",
"Unspecified": "غير محدد",
"LicenceType": "نوع الرخصة",
"LicenseDiscountWarning": "تستخدم صفحة الخصم هذه رمز الخصم الافتراضي ولمطوري VOLOSOFT. لا تعمل روابط الشراء أدناه.",
"DiscountedLicenseExplanation": "أسعار التراخيص هذه مخصصة للشركات الناشئة الصغيرة والمطورين الفرديين والطلاب والمنظمات غير الربحية والمشاريع!",
"General": "عام",
"License": "رخصة",
"Development": "تطوير",
"Payment": "دفع",
"WatchExplainerVideo": "فلنلتقي! شاهد الفيديو التوضيحي",
"LightDarkAndSemiDarkThemes": "فاتح ، داكن وشبه داكن",
"LeptonXThemeExplanation": "يمكن لـ Lepton Theme تغيير المظهر الخاص بك وفقًا لإعدادات نظامك.",
"PRO": "برو",
"WelcomeToABPCommercial": "مرحبا بك في <span class=\"gradient-commercial\">ABP تجاري!</span>",
"YourAccountDetails": "تفاصيل حسابك",
"OrganizationName": "اسم المنظمة",
"AddDevelopers": "أضف المطورين",
"StartDevelopment": "ابدأ التطوير",
"CreateAndRunApplicationUsingStartupTemplate": "تعرف على كيفية إنشاء تطبيق ويب جديد وتشغيله باستخدام نموذج بدء التشغيل التجاري ABP.",
"CommunityDescription2": "<span class=\"fw-6\">community.abp.io</span> هو مكان حيث يمكن للأشخاص مشاركة المقالات ذات الصلة بـ ABP. ابحث عن المقالات والبرامج التعليمية وعينات التعليمات البرمجية ودراسات الحالة وقابل أشخاصًا في نفس المسار الذي تقابله.",
"UseABPSuiteExplanation": "استخدم ABP Suite لتنزيل الكود المصدري للوحدات والسمات.",
"ManageModulesWithSuite": "يمكنك أيضًا إدارة وحدات ABP الخاصة بك باستخدام Suite.",
"LearnHowToInstallSuite": "تعرف على كيفية تثبيت واستخدام ABP Suite.",
"SeeMore": "رؤية المزيد",
"SeeLess": "رؤية أقل",
"LayeredSolutionStructure": "هيكل الحل متعدد الطبقات",
"LayeredSolutionStructureExplanation": "يتم وضع الحل على أساس مبادئ وأنماط التصميم المُقاد بالمجال DDD لعزل منطق عملك عن البنية التحتية والتكامل ولتعظيم إمكانية صيانة الكود وإعادة استخدامه. يوفر إطار عمل ABP بالفعل تجريدات وفئات أساسية وأدلة لتنفيذ التصميم المُقاد بالمجال DDD حقًا لتطبيقك.",
"MultipleUIOptions": "خيارات متعددة لواجهة المستخدم",
"MultipleUIOptionsExplanation": "نحن نحب طرقًا مختلفة لإنشاء واجهة المستخدم. يوفر حل بدء التشغيل هذا ثلاثة خيارات مختلفة لإطار عمل واجهة المستخدم لتطبيق عملك.",
"MultipleDatabaseOptions": "خيارات قاعدة بيانات متعددة",
"MultipleDatabaseOptionsExplanation": "لديك خياران لموفر قاعدة البيانات (بالإضافة إلى استخدام كليهما في تطبيق واحد). استخدم Entity Framework Core للعمل مع أي قاعدة بيانات علائقية واستخدم Dapper اختياريًا عندما تحتاج إلى كتابة استعلامات منخفضة المستوى للحصول على أداء أفضل. يعد MongoDB خيارًا آخر إذا كنت بحاجة إلى استخدام قاعدة بيانات NoSQL قائمة على المستندات. في حين أن هؤلاء الموفرين مدمجون جيدًا وملخصون ومهيئون مسبقًا ، يمكنك في الواقع التفاعل مع أي نظام قاعدة بيانات يمكنك استخدامه مع .NET.",
"ModularArchitectureExplanation2": "النمطية هي مواطن من الدرجة الأولى في منصة ABP.IO. يتم تقسيم جميع وظائف التطبيق إلى وحدات اختيارية معزولة جيدًا. يأتي حل بدء التشغيل بالفعل مع وحدات <a href=\"@Url.Page(\"/Modules\")\" class=\"text-primary\">ABP Commercial الأساسية </a> المثبتة مسبقًا. يمكنك أيضًا إنشاء الوحدات النمطية الخاصة بك لبناء نظام معياري لتطبيقك الخاص.",
"MultiTenancyForSaasBusiness": "متعدد الإيجارات لأعمال SaaS الخاصة بك",
"MultiTenancyForSaasBusinessExplanation": "توفر ABP Commercial نظامًا كاملاً ومتعدد الإيجارات لإنشاء أنظمة SaaS (البرمجيات كخدمة). يسمح للمستأجرين بمشاركة قواعد البيانات الخاصة بهم أو الحصول عليها من خلال إنشاء قاعدة بيانات سريعة ونظام الهجرة.",
"MicroserviceStartupSolution": "حل بدء تشغيل الخدمات المصغرة",
"MicroserviceArchitectureExplanation2": "يمكنك الحصول عليه لنظام الخدمات المصغرة التالي الخاص بك للاستفادة من الحل الأساسي المبني مسبقًا والتجربة المحسنة.",
"PreIntegratedTools": "مُدمج مسبقًا في الأدوات الشائعة",
"PreIntegratedToolsExplanation": "الحل مدمج بالفعل مع الأدوات والتقنيات المتوافقة مع معايير الصناعة، بينما يمكنك دائمًا تغييرها والدمج مع أدواتك المفضلة.",
"SingleSignOnAuthenticationServer": "خادم مصادقة الدخول الموحد",
"SingleSignOnAuthenticationServerExplanation": "يحتوي الحل على تطبيق خادم مصادقة تستخدمه التطبيقات الأخرى كخادم تسجيل دخول فردي مع ميزات إدارة الوصول إلى واجهة برمجة التطبيقات. يعتمد على IdentityServer.",
"WebAppsWithGateways": "تطبيقين ويب مع بوابتين API",
"WebAppsWithGatewaysExplanation": "يحتوي الحل على تطبيقين للويب ، يحتوي كل منهما على بوابة API مخصصة (BFF - نمط الواجهة الخلفية للواجهة الأمامية).",
"BackOfficeApplication": "تطبيق المكتب الخلفي",
"BackOfficeApplicationExplanation": "تطبيق الويب الفعلي لنظامك، مع خيارات إطار عمل متعددة لواجهة المستخدم. يمكنك إنشاء أي نوع من تطبيقات الأعمال.",
"LandingWebsite": "موقع هبوط",
"LandingWebsiteExplanation": "موقع عام للهبوط / موقع عام يمكن استخدامه لعدة أغراض، مثل التعريف بشركتك وبيع منتجاتك وما إلى ذلك.",
"ABPFrameworkEBook": "الكتاب الإلكتروني لإتقان إطار عمل ABP",
"MasteringAbpFrameworkEBookDescription": "مشمول في رخصة ABP التجارية الخاصة بك",
"FullName": "الاسم الكامل",
"LicenseTypeNotCorrect": "نوع الرخصة خاطئ!",
"Trainings": "التدريبات",
"ChooseTrainingPlaceholder": "اختر التدريب ...",
"DoYouNeedTrainings": "هل تحتاج إلى أحد هذه التدريبات؟",
"DoYouNeedTraining": "هل تحتاج إلى تدريب {0}؟",
"GetInTouchUs": "تواصل معنا",
"ForMoreInformationClickHere": "لمزيد من المعلومات, اضغط <a href='{0}'>هنا.</a>",
"IsGetOnboardingTraining": "هل ترغب في الحصول على تدريب تطوير تطبيقات الويب والإعداد؟",
"OnboardingWebApplicationDevelopmentTrainingMessage": "لجدولة تقويم التدريب الخاص بك، الرجاء التواصل مع {0} بعد انشاء المنظمة",
"CustomPurchaseMessage": "للخطوة التالية، انقر على {0} للاتصال بنا.",
"Note": "ملحوظة",
"AdditionalNote": "ملحوظة إضافية",
"OnboardingTrainingFaqTitle": "هل لديكم تدريب على ABP؟",
"OnboardingTrainingFaqExplanation": "نعم، لدينا خدمات تدريب ABP لمساعدتك في بدء مشروع ABP الخاص بك بسرعة. ستتعرف على ABP من أحد أعضاء فريق ABP الأساسي وستحصل على المهارات اللازمة لبدء مشروع ABP الخاص بك. خلال التدريب، سنشرح كيفية إعداد بيئة التطوير الخاصة بك، وتثبيت الأدوات المطلوبة، وإنشاء صفحة CRUD تعمل بكامل طاقتها. سيكون التدريب مباشرًا وسيتم استخدام برنامج Zoom، ونحن منفتحون لاستخدام منصات اجتماعات أخرى عبر الإنترنت. ستكون لغة التدريب هي اللغة الإنجليزية. يمكنك أيضًا طرح أسئلتك حول برنامج ABP أثناء الجلسات. سيتم التخطيط للوقت والتاريخ المناسبين لكلا الطرفين. للحصول على مزيد من المعلومات، تواصل معنا على <a href=\"mailto:info@abp.io\">info@abp.io</a>.",
"AddBasket": "إضافة إلى السلة",
"SendTrainingRequest": "إرسال طلب تدريب",
"OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* النسخة الإنجليزية من هذه الوثيقة هي الأحدث وستتم العةدة اليها خلال أي نزاع.",
"Pricing_Page_Title": "الخطط والتسعير",
"Pricing_Page_Description": "اختر الميزات والوظائف التي يحتاجها عملك اليوم. شراء رخصة تجارية ABP وإنشاء مشاريع غير محدودة.",
"Pricing_Page_HurryUp": "أسرع!",
"Pricing_Page_BuyLicense": "اشترِ رخصة من <strong>أسعار 2021</strong> حتى 16 يناير!",
"Pricing_Page_ValidForExistingCustomers": "صالحة أيضًا للعملاء الحاليين وتجديد الرخص.",
"Pricing_Page_Hint1": "يشمل سعر الرخصة عددًا معينًا من مقاعد المطورين. إذا كان لديك المزيد من المطورين ، فيمكنك دائمًا شراء مقاعد إضافية.",
"Pricing_Page_Hint2": "يمكنك شراء المزيد من رخص المطورين الآن أو في المستقبل. تعتمد الرخص على المقاعد، لذا يمكنك نقل مقعد من مطور إلى آخر.",
"Pricing_Page_Hint3": "يمكنك تطوير عدد غير محدود من المنتجات المختلفة برخصتك.",
"Pricing_Page_Hint4": "ABP Suite هي أداة تساعد في تطويرك لتحسين إنتاجيتك. يدعم إنشاء صفحات CRUD وإنشاء مشاريع جديدة.",
"Pricing_Page_Hint5": "يمكنك استخدام جميع الوحدات المدمجة مسبقًا في تطبيقاتك.",
"Pricing_Page_Hint6": "يمكنك استخدام جميع السمات المبنية مسبقًا في تطبيقاتك.",
"Pricing_Page_Hint7": "عارضة بدء التشغيل هو أحد حلول Visual Studio لجعلك تبدأ بمشروعك. تمت إضافة جميع الوحدات الأساسية وتهيئتها مسبقًا لك.",
"Pricing_Page_Hint8": "يشرح الكتاب الإلكتروني اتقان إطار عمل ABP كيفية تنفيذ حلول .NET مع أفضل الممارسات. يُباع الكتاب على Amazon.com ويمكنك تنزيله مجانًا ضمن رخصتك.",
"Pricing_Page_Hint9": "يمكنك تنزيل الكود المصدري لأي وحدة نمطية. قد ترغب في إضافة شفرة المصدر إلى الحل الخاص بك لإجراء تغييرات جذرية أو الاحتفاظ بها لنفسك لأسباب أمنية.",
"Pricing_Page_Hint10": "الرخص لمدى الحياة. هذا يعني أنه يمكنك الاستمرار في تطوير تطبيقك إلى الأبد. يتم منح الوصول إلى أحدث إصدار والحصول على الدعم خلال فترة الرخصة (عام واحد ما لم تقم بتجديده).",
"Pricing_Page_Hint11": "لا قيود على النشر! يمكنك النشر على أي عدد تريده من الخوادم ، بما في ذلك الخدمات السحابية أو المحلية.",
"Pricing_Page_Hint12": "يمكنك تحديث الوحدات والسمات والأدوات إلى أحدث إصدار خلال فترة الرخصة النشطة. بعد انتهاء صلاحية الرخصة الخاصة بك، تحتاج إلى تجديدها، للاستمرار في الحصول على تحديثات لإصلاحات الأخطاء، والميزات الجديدة والتحسينات.",
"Pricing_Page_Hint13": "يمكنك الحصول على الدعم المتميز لمدة عام واحد (يمكنك تجديد رخصتك لتمديده).",
"Pricing_Page_Hint14": "رخص الفريق والعمل لها حد لعدد الحوادث/الأسئلة. إذا اشتريت رخصة مطور إضافية، فسيزيد حد الحوادث بمقدار {0} (لرخصة الفريق) أو {1} (لرخصة العمل) لكل مطور.",
"Pricing_Page_Hint15": "الدعم الخاص تتضمنه فقط رخصة المؤسسة. يمكنك إرسال بريد إلكتروني مباشرة إلى فريق ABP أو طرح أسئلة على support.abp.io مع خيار التذكرة الخاصة. التذاكر الخاصة غير مرئية للعامة.",
"Pricing_Page_Hint16": "يمكنك تنزيل الكود المصدري لجميع سمات ABP. قد ترغب في إضافة الكود المصدري إلى الحل الخاص بك لإجراء تغييرات جذرية أو الاحتفاظ بها لنفسك لأسباب أمنية.",
"Pricing_Page_Testimonial_1": "سمحت ABP التجاري لشركة SC Ventures بتقديم منصة SaaS لقاعدة بيانات ذات صوامع متعددة المستأجرين على مستوى البنوك في 9 أشهر لدعم تمويل سلسلة التوريد للحسابات المدينة / الحسابات الدائنة لفواتير ذات قيمة كبيرة من العديد من المراسي المتكاملة. مكنت نمطية ABP الفريق من التسليم في وقت قياسي ، واجتياز جميع VAPT ، ونشر مكدس الخدمات المصغرة في حاويات عبر CI / CD كامل وخطوط الأنابيب في الإنتاج.",
"Pricing_Page_Testimonial_2": "نحن نرى قيمة استخدام ABP التجاري لتقليل النفقات العامة لمشاريع التطوير المخصصة. والفريق قادر على توحيد نمط الكود في تدفقات المشروع المختلفة. نرى المزيد من الإمكانات في إطار العمل بالنسبة لنا لبناء ميزات جديدة بشكل أسرع من ذي قبل. نحن على ثقة من أننا سنرى باستمرار قيمة الاستفادة من ABP التجاري.",
"Pricing_Page_Testimonial_3": "نحن نحب ABP. ليس علينا كتابة كل شيء من الصفر. نبدأ من الميزات الجاهزة ونركز فقط على ما نحتاج حقًا إلى كتابته. أيضًا ، ABP مصمم جيدًا والشفرة عالية الجودة مع عدد أقل من الأخطاء. إذا كان علينا كتابة كل ما نحتاجه بمفردنا ، فقد نضطر إلى قضاء سنوات. مرة أخرى نحب أن الإصدار الجديد ، أو إصلاح المشكلة ، أو التحسين يأتي قريبًا جدًا كل أسبوعين. نحن لا ننتظر طويلا.",
"Pricing_Page_Testimonial_4": "ABP التجاري منتج رائع يوصى به. تسويق المنتجات التجارية لعملائنا في منصة واحدة قابلة للتكوين. البداية السريعة التي يوفرها إطار العمل والأدوات لأي فريق تستحق كل سنت. كانت ABP هي الأنسب لاحتياجاتنا.",
"Pricing_Page_Testimonial_5": "إطار عمل ABP ليس مجرد إطار عمل ، ولكنه أيضًا دليل لتطوير / إدارة المشروع ، لأنه يوفر تدريب DDD و GenericRepository و DI و Microservice و Modularity. حتى إذا كنت لن تستخدم الإطار نفسه ، يمكنك تطوير نفسك باستخدام docs.abp.io المُعد جيدًا ومهنيًا (OpenIdict و Redis و Quartz وما إلى ذلك). نظرًا لأن العديد من الأشياء مبنية مسبقًا ، فإنها تقصر وقت تطوير المشروع بشكل كبير (مثل صفحة تسجيل الدخول ، ومعالجة الاستثناءات ، وتصفية البيانات ، والبذر ، وتسجيل التدقيق ، والترجمة ، ووحدة التحكم في واجهة برمجة التطبيقات التلقائية ، وما إلى ذلك). كمثال من تطبيقنا ، لقد استخدمت Local Event Bus للتحكم في المخزون. لذلك ، أنا قادر على إدارة حركات الأوامر عن طريق كتابة معالج الأسهم. إنه لأمر رائع ألا تضيع الوقت من أجل CreationTime ، CreatorId. يتم ملؤها تلقائيًا.",
"AbpBookDownloadArea_ClaimYourEBook": "احصل على كتاب <span class='gradient-framework'>إتقان إطار عمل ABP</span> الالكتروني الخاص بك",
"AddMemberModal_Warning_1": "اذا كان <strong>المستخدم</strong> الذي تحاول اضافته لا يوجد في النظام, يرجى مطالبة عضو فريقك بالتسجيل في <a href='{0}/Account/Register'>{0}</a> ومشاركة اسم المستخدم الخاص بحسابه معك.",
"MyOrganizations_Detail_WelcomeMessage": "مرحبًا بك في مؤسستك، {0}",
"MyOrganizations_Detail_OrganizationManagement": "<span class=\"gradient-commercial\">إدارة</span> المنظمة",
"OrganizationDisplayName": "اسم عرض المنظمة",
"MyOrganizations_Detail_EditDisplayName": "تعديل اسم العرض",
"MyOrganizations_Detail_UpgradeYourLicense": "قم بترقية رخصتك",
"MyOrganizations_Detail_LicenseStartAndExpiryDate": "تاريخ بدء الترخيص - تاريخ انتهاء الصلاحية",
"MyOrganizations_Detail_OwnerRightInfo": "أنت تستخدم {0} من {1} حقوق المالك.",
"MyOrganizations_Detail_CopyApiKey": "انسخ المفتاح",
"MyOrganizations_Detail_ApiKeyDescription": "مفتاح API هو الرمز المميز لحزم PRO المستضافة على <a href=\"{0}\" target=\"_blank\" class=\"text-primary\" rel=\"noopener\">{1}.</a>",
"MyOrganizations_Detail_YourPrivateNugetSource": "مصدر NuGet الخاص بك هو <a href=\"{0}\" target=\"_blank\" class=\"text-primary\" rel=\"noopener\">{0}</a>",
"MyOrganizations_Detail_PrivateNugetSourceWarning": "تتم إضافة هذا تلقائيًا كوجز إلى NuGet.Config في حل ABP الخاص بك. لا تشارك مفتاحك الخاص مع مستخدمين غير مصرح لهم!",
"MyOrganizations_Detail_DeveloperSeatInfo": "أنت تستخدم {0} من {1} مقاعد مطوري البرامج.",
"NeedMoreSeatsForYourTeam": "هل تحتاج إلى المزيد من المقاعد لفريقك؟",
"MyOrganizations_Detail_PricePerYear": "{0} / سنويًا",
"MyOrganizations_Detail_PurchaseDeveloperSeats": "شراء مقاعد المطور",
"Invoices": "الفواتير",
"RequestInvoice": "طلب الفاتورة",
"OrderNumber": "رقم الطلب",
"Date": "التاريخ",
"Products": "المنتجات",
"TotalPrice": "السعر الإجمالي",
"ThereIsNoInvoice": "لا يوجد فاتورة",
"MyOrganizations_Detail_PaymentProviderInfo": "إذا اشتريت ترخيصك من خلال بوابة <i>{0}</i>، فإنها تُرسل فاتورة PDF إلى عنوان بريدك الإلكتروني، راجع <a href=\"{1}\" target=\"_blank\">{0} الفواتير.</a>",
"MyOrganizations_Detail_PayUInfo": "إذا كنت قد اشتريت من خلال بوابة <i>PayU</i>، انقر على زر \"طلب الفاتورة\" واملأ معلومات الفوترة.",
"MyOrganizations_Detail_ConclusionInfo": "سيتم إنهاء طلب الفاتورة في غضون {0} يوم عمل.",
"ExtendYourLicense": "قم بتمديد رخصة <span class=\"text-primary\">{0}</span> الخاصة بك",
"Continue": "استمر",
"DownloadInvoiceModal_DownloadInvoice": "تحميل فاتورة",
"DownloadInvoiceModal_SaveInformationOnlyOnce": "يمكنك حفظ معلومات الفواتير الخاصة بك مرة واحدة فقط.",
"InvoiceModal_EnterCompanyName": "أدخل اسم شركتك القانوني...",
"InvoiceModal_EnterCompanyAddress": "أدخل عنوان شركتك القانوني...",
"InvoiceModal_EnterTaxNumber": "أدخل رقم الضريبة / ضريبة القيمة المضافة إذا كان متاحًا...",
"RequestInvoiceModal_EnterNotes": "أدخل رسالتك الإضافية حول فاتورتك...",
"PrePayment_PayWithIyzico": "ستدفع عن طريق Iyzico",
"ContinueToCheckout": "الاستمرار في الخروج",
"PrePayment_IyzicoRedirectionInfo": "ستتم إعادة توجيهك إلى بوابة الدفع Iyzico لإكمال عملية الشراء بشكل آمن.",
"PrePayment_IyzicoAcceptVisaAndMasterCard": "تقبل Iyzico بطاقات الفيزا وماستركارد.",
"Purchase": "شراء",
"AcceptTermsAndConditions": "لقد قرأت وفهمت وقبلت <a href=\"{0}\" target=\"_blank\" class=\"text-primary\" rel=\"noopener\">سياسة الخصوصية</a>، <a href=\"{1}\" target=\"_blank\" class=\"text-primary\" rel=\"noopener\">البنود والشروط</a> و <a href=\"{2}\" target=\"_blank\" class=\"text-primary\"> اتفاقية مستخدم الرخصة EULA.</a>",
"AcceptTermsAndConditionsWarningMessage": "الرجاء قبول سياسة الخصوصية والشروط والأحكام",
"SelectGatewayToContinue": "الرجاء تحديد بوابة للمتابعة!",
"GatewaySelection_SelectGateway": "حدد بوابة الدفع",
"GatewaySelection_RedirectionMessage": "بعد ذلك، ستتم إعادة توجيهك إلى موقع بوابة الدفع المحدد للمعاملة.",
"PaymentSucceed_PaymentSuccessMessage": "تم الدفع بنجاح",
"PaymentSucceed_ThanksForPurchase": "شكرا لك على الشراء!",
"PaymentSucceed_CreateYourOrganization": "أنشئ مؤسستك",
"PaymentSucceed_AddMeAsDeveloper": "أنا مطور، أضفني كمطور لمؤسستي.",
"PaymentSucceed_CreateOrganization": "إنشاء منظمة",
"PaymentSucceed_OrganizationDescription": "المنظمة تتكون من المطورين والمالكين. المطورون هم المستخدمون الذين يكتبون الكود في مشروع ABP وسيستفيدون من موقع <a href=\"{0}\" target=\"_blank\">{1}</a>. المالكون هم المستخدمون الذين يخصصون مقاعد للمطورين ويديرون الرخصة.",
"PaymentSucceed_ViewOrganization": "انقر هنا لعرض المنظمة",
"Purchase_TotalAnnualPrice": "المجموع <small class=\"opacity-50\">(رسوم سنوية)</small>",
"Purchase_TrainingPrice": "سعر التدريب",
"Purchase_OnboardingTraining": "تدريب مباشر على ABP وتطوير تطبيقات الويب",
"TotalDeveloperPrice": "إجمالي سعر المطور",
"Purchase_PricePerDeveloper": "<span>{0} {1}</span> لكل مطور",
"Purchase_IncludedDeveloperInfo": "{0} {1} يتضمن.",
"Purchase_LicenseExtraDeveloperPurchaseMessage": "رخصة <span class=\"fw-6\">{0} </span> تحتوي على {1} مطور/ين. يمكنك إضافة مطورين إضافيين الآن أو لاحقًا.",
"StartupTemplates_Page_Title": "عارضات بدء التشغيل",
"StartupTemplates_Page_Description": "يسمح لك ABP التجاري ببناء حلول بأي مستوى من التعقيد. يوفر حلين رئيسيين لبدء التشغيل. يمكنك اختيار واحد قريب من متطلباتك وبناء الحل المخصص الخاص بك فوقه.",
"MicroserviceStartupSolutionForDotnet": "حل بدء تشغيل Microservice لـ .NET",
"MonolithSolutionForDotnet": "حل مترابط (معياري) لـ .NET",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} ساعة (ساعات)",
"Trainings_Content": "محتوى التدريب",
"Trial_Page_StartYourFreeTrial": "ابدا <span class=\"gradient-commercial\">تجربتك المجانية</span>",
"TrialLicenseFeatures": "ستتمكن من الاستفادة من جميع ميزات ABP التجاري",
"TrialPeriodDays": "سيكون لديك ترخيص الفريق لمدة {0} يوم",
"TrialForumSupportIncident": "سيكون لديك {0} بطاقات دعم المنتدى للحوادث",
"Contact_Page_Title": "تواصل مع فريق تطوير ABP",
"Contact_Page_Description": "تواصل مع فريق تطوير ABP، إذا كنت بحاجة إلى أي مساعدة أو شاركنا أفكارك وآرائك! فريق دعم ABP جاهز للمساعدة.",
"Demo_Page_Title": "إنشاء عرض",
"Demo_Page_Description": "أنشئ عرضًا توضيحيًا مجانيًا لمشاهدة نموذج تطبيق تم إنشاؤه باستخدام نموذج بدء التشغيل التجاري ABP. لا تكرر نفسك لمتطلبات التطبيق المشتركة.",
"Discounted_Page_Title": "Discounted pricing",
"Discounted_Page_Description": "اختر الميزات والوظائف التي يحتاجها عملك اليوم. شراء رخصة تجارية ABP وإنشاء مشاريع غير محدودة",
"Faq_Page_Title": "الاسئلة الشائعة (FAQ)",
"Faq_Page_Description": "هل لديك اسئلة؟ ابحث عن الأسئلة الشائعة أو اطرح علينا سؤالاً باستخدام نموذج الاتصال.",
"Faq_Page_SwiftCode": "رمز سويفت SWIFT",
"Faq_Page_BankName": "اسم البنك",
"Faq_Page_AccountName": "أسم الحساب",
"Faq_Page_AccountNumber": "رقم حساب",
"Faq_Page_Currency": "العملة",
"Faq_Page_VatNumber": "رقم ضريبة القيمة المضافة",
"Faq_Page_OtherCurrenciesInfo": "للعملات الأخرى ، انظر الى <a href='{0}'>جميع الحسابات</a>",
"ModuleDetail_Page_Title": "تفاصيل الوحدة - {0}",
"ProjectCreatedSuccess_Page_Title": "تم إنشاء مشروعك",
"ProjectCreatedSuccess_Page_Description": "تم إنشاء مشروع ABP الخاص بك بنجاح!",
"Suite_Page_Title": "ABP Suite - إنشاء صفحات CRUD",
"Suite_Page_Description": "يوفر ABP التجاري أدوات تطوير سريعة للتطبيقات لزيادة إنتاجية المطورين. يتيح لك ABP Suite إنشاء صفحات CRUD بسهولة.",
"Themes_Page_Title": "سمات واجهة المستخدم الحديثة والوظيفية",
"Themes_Page_Description": "يوفر ABP التجاري العديد من سمات واجهة المستخدم الاحترافية والحديثة. أنشئ عرضًا تجريبيًا مجانيًا للحصول على عرض سريع لشكل واجهة المستخدم.",
"Tools_Page_Title": "أدوات تطوير التطبيقات السريعة",
"Tools_Page_Description": "يوفر ABP التجاري أدوات تطوير سريعة للتطبيقات لزيادة إنتاجية المطورين. يتيح لك ABP Suite إنشاء صفحات CRUD بسهولة.",
"DeveloperPrice": "سعر المطور",
"AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0} <small>مطورين</small>",
"LicenseRemainingDays": "لمدة <span> {0} </span> يوم",
"ExtendPaymentInfoSection_Description": "من خلال تمديد / تجديد رخصتك، ستستمر في الحصول على <a href=\"{0}\" target=\"_blank\">الدعم المتميز</a>. ستتمكن أيضًا من الحصول على تحديثات رئيسية أو ثانوية للوحدات والسمات. ستتمكن من الاستمرار في إنشاء مشاريع جديدة. وستظل قادرًا على استخدام <a href=\"{1}\" target=\"_blank\">ABP Suite</a> مما يسرع من تطويرك.",
"LicenseRenewalPrice": "سعر تجديد الرخصة",
"LicensePrice": "سعر الرخصة",
"TrialLicensePaymentInfoSection_Description": "<strong>شراء رخصة:</strong> بشراء رخصة، ستستمر في الحصول على <a href=\"{0}\" target=\"_blank\" rel=\"noopener\">الدعم المتميز</a>. ستتمكن أيضًا من الحصول على تحديثات رئيسية أو ثانوية للوحدات والسمات. ستتمكن من الاستمرار في إنشاء مشاريع جديدة. وستظل قادرًا على استخدام <a href=\"{1}\" target=\"_blank\" rel=\"noopener\">ABP Suite</a> مما يسرع من تطويرك.<br> راجع <a href=\"{2}\" target=\"_blank\" rel=\"noopener\">جدول مقارنة الرخصة</a> للتحقق من الاختلافات بين أنواع الرخص.",
"SelectTargetLicense": "حدد الرخصة المرادة",
"UpgradePaymentInfoSection_ExtendMyLicenseForOneYear": "نعم، قم بتمديد تاريخ انتهاء رخصتي لمدة عام واحد.",
"UpgradePaymentInfoSection_WantToExtendLicense": "هل تريد تمديد ترخيصك لمدة {0} سنة (سنوات) أخرى؟",
"UpgradePaymentInfoSection_UpgradingWillNotExtendLicense": "لن تؤدي الترقية إلى تمديد تاريخ انتهاء رخصتك!",
"UpgradePaymentInfoSection_LicenseUpgradeDescription": "من خلال ترقية رخصتك، ستقوم بالترقية إلى نوع رخصة أعلى مما سيتيح لك الحصول على مزايا إضافية. راجع <a href=\"/Pricing\" target=\"_blank\">جدول مقارنة الرخص</a> للتحقق من الاختلافات بين أنواع الرخص.",
"Landing_Page_CustomerStories": "قصص العملاء",
"Landing_Page_OurGreatCustomers": "عملائنا الكرام",
"Landing_Page_WebApplicationFramework": "إطار تطبيق ويب",
"Landing_Page_WebDevelopmentPlatform": "منصة تطوير ويب",
"Landing_Page_CompleteWebDevelopmentPlatform": "منصة تطوير ويب الكاملة",
"Landing_Page_TryFreeDemo": "جرب نسخة تجريبية مجانية",
"Landing_Page_StartingPointForWebApplications": "نقطة البداية لتطبيقات الويب القائمة على ASP.NET Core! يعتمد على إطار عمل ABP لأفضل تطوير ويب.",
"Landing_Page_AbpProvidesSoftwareInfrastructure": "يوفر إطار عمل ABP بنية أساسية للبرامج لتطوير تطبيقات ويب ممتازة مع أفضل الممارسات.",
"Landing_Page_MicroserviceCompatibleArchitecture": "بنية متوافقة مع الخدمات المصغرة",
"Landing_Page_PreBuiltApplicationModulesAndThemes": "وحدات وموضوعات التطبيق المبنية مسبقًا",
"Landing_Page_MultiTenantArchitecture": "بنية متعددة المستأجرين",
"Landing_Page_MultiTenancyDescription": "جعلت تطبيقات SaaS سهلة! متعدد ايجارات متكامل من قاعدة البيانات إلى واجهة المستخدم.",
"Landing_Page_DDDIntroduction": "تم تصميمه وتطويره بناءً على أنماط ومبادئ التصميم المُقاد بالمجال DDD. يوفر نموذجًا متعدد الطبقات لتطبيقك.",
"Landing_Page_CrossCuttingConcernsInfo": "بنية تحتية كاملة للترخيص والتحقق من الصحة ومعالجة الاستثناءات والتخزين المؤقت وتسجيل التدقيق وإدارة المعاملات والمزيد.",
"Landing_Page_PreBuiltApplicationModules": "وحدات التطبيق سابقة الإنشاء والتي تتضمن متطلبات تطبيقات الويب الأكثر شيوعًا.",
"Landing_Page_ChatModule": "الدردشة",
"Landing_Page_DocsModule": "المستندات",
"Landing_Page_FileManagementModule": "إدارة الملفات",
"Landing_Page_CustomerStory_1": "سمحت ABP التجاري لشركة SC Ventures بتقديم منصة SaaS لقاعدة بيانات ذات صوامع متعددة المستأجرين على مستوى البنوك في 9 أشهر لدعم تمويل سلسلة التوريد للحسابات المدينة / الحسابات الدائنة لفواتير ذات قيمة كبيرة من العديد من المراسي المتكاملة. مكنت نمطية ABP الفريق من التسليم في وقت قياسي ، واجتياز جميع VAPT ، ونشر مكدس الخدمات المصغرة في حاويات عبر CI / CD كامل وخطوط الأنابيب في الإنتاج.",
"Landing_Page_CustomerStory_2": "نحن نرى قيمة استخدام ABP التجاري لتقليل النفقات العامة لمشاريع التطوير المخصصة. والفريق قادر على توحيد نمط الكود في تدفقات المشروع المختلفة. نرى المزيد من الإمكانات في إطار العمل بالنسبة لنا لبناء ميزات جديدة بشكل أسرع من ذي قبل. نحن على ثقة من أننا سنرى باستمرار قيمة الاستفادة من ABP التجاري.",
"Landing_Page_CustomerStory_3": "نحن نحب ABP. ليس علينا كتابة كل شيء من الصفر. نبدأ من الميزات الجاهزة ونركز فقط على ما نحتاج حقًا إلى كتابته. أيضًا، ABP مصمم جيدًا والشفرة عالية الجودة مع عدد أقل من الأخطاء. إذا كان علينا كتابة كل ما نحتاجه بمفردنا، فقد نضطر إلى قضاء سنوات. مرة أخرى نحب أن الإصدار الجديد، أو إصلاح المشكلة، \n أو التحسين يأتي قريبًا جدًا كل أسبوعين. نحن لا ننتظر طويلا.",
"Landing_Page_CustomerStory_4": "التجاري منتج رائع يوصى به. تسويق المنتجات التجارية لعملائنا في منصة واحدة قابلة للتكوين. البداية السريعة التي يوفرها إطار العمل والأدوات لأي فريق تستحق كل سنت. كانت ABP هي الأنسب لاحتياجاتنا.",
"Landing_Page_AdditionalServices": "رخصة مخصصة أو مجمعة، تدريب مبدئي، تدريب مباشر ودعم ، تطوير مشروع مخصص، نقل المشاريع الحالية والمزيد...",
"Landing_Page_IncludedDeveloperLicenses": "رخص المطورين المتضمنة <strong> {0} </strong>",
"Landing_Page_SeeOnDemo": "انظر في العرض",
"Landing_Page_LeptonThemes": "سمات ليبتون",
"Landing_Page_AccountModuleDescription_1": "تنفذ هذه الوحدة نظام المصادقة على التطبيق:",
"Landing_Page_AccountModuleDescription_2": "يقدم صفحة <strong>تسجيل الدخول</strong> مع اسم المستخدم وكلمة المرور",
"Landing_Page_AccountModuleDescription_3": "يقدم صفحة <strong>تسجيل</strong>ل إنشاء حساب جديد.",
"Landing_Page_AccountModuleDescription_4": "يقدم صفحة <strong>نسيت كلمة المرور</strong> لإرسال رابط <strong>إعادة تعيين كلمة المرور</strong> كبريد إلكتروني.",
"Landing_Page_AccountModuleDescription_5": "يوفر وظيفة <strong>تأكيد البريد الإلكتروني</strong> مع واجهة المستخدم.",
"Landing_Page_AccountModuleDescription_6": "تنفذ المصادقة <strong>ذات العاملين</strong> (الرسائل القصيرة والبريد الإلكتروني).",
"Landing_Page_AccountModuleDescription_7": "تنفذ <strong>تأمين المستخدم</strong> (يقفل الحساب لفترة زمنية محددة عندما يحدث عدد معين من عمليات تسجيل الدخول الفاشلة بسبب بيانات اعتماد غير صالحة خلال فترة زمنية معينة).",
"Landing_Page_AccountModuleDescription_8": "ينفذ واجهة مستخدم ووظائف خادم مصادقة <strong>Identity Server</strong> .",
"Landing_Page_AccountModuleDescription_9": "يسمح <strong>بالتبديل بين المستأجرين</strong> في بيئة متعددة المستأجرين.",
"Landing_Page_AccountModuleDescription_10": "يسمح بتغيير <strong>لغة واجهة المستخدم</strong> للتطبيق.",
"Landing_Page_AuditLoggingModuleDescription_1": "توفر هذه الوحدة واجهة مستخدم تقارير سجل التدقيق للبنية التحتية للتدقيق. يسمح بالبحث عن إدخالات سجل التدقيق وتصفيتها وإظهارها وسجلات تغيير الكيان.",
"Landing_Page_AuditLoggingModuleDescription_2": "يتكون إدخال سجل التدقيق من بيانات مهمة حول كل طلب عميل:",
"Landing_Page_AuditLoggingModuleDescription_3": "URL ،المتصفح، عنوان IP ،اسم العميل",
"Landing_Page_AuditLoggingModuleDescription_4": "المستخدم",
"Landing_Page_AuditLoggingModuleDescription_5": "طريقة HTTP، رمز حالة إرجاع HTTP",
"Landing_Page_AuditLoggingModuleDescription_6": "نجاح / فشل ، تفاصيل الاستثناء إذا كانت متوفرة",
"Landing_Page_AuditLoggingModuleDescription_7": "مدة تنفيذ الطلب",
"Landing_Page_AuditLoggingModuleDescription_8": "تم إنشاء الكيانات أو حذفها أو تحديثها في هذا الطلب (بخصائص تم تغييرها).",
"Landing_Page_BloggingModuleDescription_1": "تضيف هذه الوحدة مدونة بسيطة إلى تطبيق ABP الخاص بك:",
"Landing_Page_BloggingModuleDescription_2": "يسمح بإنشاء مدونات متعددة في تطبيق واحد.",
"Landing_Page_BloggingModuleDescription_3": "يدعم تنسيق Markdown.",
"Landing_Page_BloggingModuleDescription_4": "يسمح لكتابة تعليق على المنشور.",
"Landing_Page_BloggingModuleDescription_5": "يسمح بتعيين علامات إلى مشاركات المدونة.",
"Landing_Page_BloggingModuleDescription_6": "انظر الى <a href=\"blog.abp.io\">blog.abp.io</a> موقع الويب كمثال حي لوحدة التدوين.",
"Landing_Page_ChatModuleDescription_1": "تُستخدم هذه الوحدة للمراسلة في الوقت الفعلي بين المستخدمين في التطبيق.",
"Landing_Page_ChatModuleDescription_2": "المراسلة في الوقت الحقيقي على صفحة الدردشة.",
"Landing_Page_ChatModuleDescription_3": "بحث المستخدمين في التطبيق عن محادثات جديدة.",
"Landing_Page_ChatModuleDescription_4": "قائمة جهات الاتصال للمحادثات الأخيرة.",
"Landing_Page_ChatModuleDescription_5": "إشعارات الرسائل الجديدة عندما ينظر المستخدم إلى صفحة أخرى.",
"Landing_Page_ChatModuleDescription_6": "إجمالي شارة عدد الرسائل غير المقروءة على أيقونة القائمة.",
"Landing_Page_ChatModuleDescription_7": "عدد الرسائل غير المقروءة لكل محادثة.",
"Landing_Page_ChatModuleDescription_8": "تحميل كسول المحادثات.",
"Landing_Page_DocsModuleDescription_1": "تستخدم هذه الوحدة لإنشاء مواقع الويب الخاصة بالتوثيق الفني؛",
"Landing_Page_DocsModuleDescription_2": "تكامل <strong>GitHub مدمج</strong>: يمكنك كتابة المستندات وإدارتها مباشرةً على GitHub.",
"Landing_Page_DocsModuleDescription_3": "دعم <strong> تعيين الإصدار </ strong> المدمج مباشرةً في إصدارات GitHub.",
"Landing_Page_DocsModuleDescription_4": "دعم <strong> متعدد اللغات </ strong> (مع دعم احتياطي للغة الافتراضية).",
"Landing_Page_DocsModuleDescription_5": "يدعم تنسيقات <strong> Markdown </ strong> و HTML.",
"Landing_Page_DocsModuleDescription_6": "يوفر قسم <strong> تنقل </ strong> و <strong> مخططًا تفصيليًا </ strong>.",
"Landing_Page_DocsModuleDescription_7": "يسمح باستضافة مستندات <strong> مشاريع متعددة </ strong> في تطبيق واحد.",
"Landing_Page_DocsModuleDescription_8": "روابط إلى الملف على GitHub ،بحيث يمكن لأي شخص المساهمة بسهولة من خلال النقر على <strong>رابط التعديل</strong>.",
"Landing_Page_DocsModuleDescription_9": "بالإضافة إلى مصدر GitHub، يسمح ببساطة باستخدام مجلد كمصدر توثيق.",
"Landing_Page_FileManagementModuleDescription_1": "تحميل وتنزيل وتنظيم الملفات في هيكل مجلد هرمي.",
"Landing_Page_FileManagementModuleDescription_2": "تُستخدم هذه الوحدة لتحميل الملفات وتنزيلها وتنظيمها في هيكل مجلد هرمي. كما أنه متوافق مع تعددية الإيجارات ويمكنك تحديد الحجم الإجمالي للمستأجرين.",
"Landing_Page_FileManagementModuleDescription_3": "تعتمد هذه الوحدة على نظام <a href=\"https://docs.abp.io/en/abp/latest/Blob-Storing\">BLOB تخزين</a>، لذا يمكنها استخدام موفري تخزين مختلفين لتخزين محتويات الملف.",
"Landing_Page_IdentityModuleDescription_1": "تطبق هذه الوحدة نظام المستخدم والدور للتطبيق:",
"Landing_Page_IdentityModuleDescription_2": "مبني على مكتبة <a href=\"https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity\">Microsoft's ASP.NET Core Identity</a>.",
"Landing_Page_IdentityModuleDescription_3": "إدارة <strong> الأدوار </ strong> و <strong> المستخدمين </ strong> في النظام. يُسمح للمستخدم بأن يكون له <strong> أدوار متعددة </ strong>.",
"Landing_Page_IdentityModuleDescription_4": "عيِّن <strong> الأذونات </ strong> في الدور ومستوى المستخدم.",
"Landing_Page_IdentityModuleDescription_5": "تمكين / تعطيل <strong> المصادقة الثنائية </ strong> و <strong> قفل </ strong> المستخدم لكل مستخدم.",
"Landing_Page_IdentityModuleDescription_6": "إدارة <strong> ملف المستخدم </ strong> الأساسي و <strong> كلمة المرور </ strong>.",
"Landing_Page_IdentityModuleDescription_7": "إدارة <strong> أنواع المطالبات </ strong> في النظام، وتعيين مطالبات للأدوار والمستخدمين.",
"Landing_Page_IdentityModuleDescription_8": "إعداد الصفحة لإدارة <strong> تعقيد كلمة المرور </ strong> وتسجيل دخول المستخدم والحساب وتأمين.",
"Landing_Page_IdentityModuleDescription_9": "يدعم مصادقة <strong> LDAP </strong>.",
"Landing_Page_IdentityModuleDescription_10": "يوفر <strong> البريد الإلكتروني & amp؛ رقم الهاتف </ strong> التحقق.",
"Landing_Page_IdentityModuleDescription_11": "يدعم تكامل تسجيل الدخول الاجتماعي (Twitter ، Facebook ، GitHub ، إلخ ...).",
"Landing_Page_IdentityModuleDescription_12": "إدارة <strong> الوحدات التنظيمية </ strong> في النظام.",
"Landing_Page_PaymentModuleDescription_1": "يوفر تكاملاً لبوابات الدفع المختلفة.",
"Landing_Page_PaymentModuleDescription_2": "توفر هذه الوحدة تكاملاً لبوابات الدفع ، بحيث يمكنك بسهولة الحصول على مدفوعات من عملائك.",
"Landing_Page_PaymentModuleDescription_3": "تدعم هذه الوحدة بوابات الدفع التالية",
"Welcome_Page_UseSameCredentialForCommercialWebsites": "استخدم نفس بيانات الاعتماد لكلا <a href=\"https://commercial.abp.io\" class=\"text-primary\">commercial.abp.io</a> و <a href=\"https://support.abp.io\" class=\"text-primary\">support.abp.io</a>.",
"WatchCrudPagesVideo": "شاهد فيديو \"Creating CRUD Pages with ABP Suite\"!",
"WatchGeneratingFromDatabaseVideo": "Watch the \"ABP Suite: Generating CRUD Pages From Existing Database Tables\" Video!",
"WatchTakeCloserLookVideo": "شاهد فيديو \"Take a closer look at the code generation: ABP Suite\"!",
"ConfirmedEmailAddressRequiredToStartTrial": "يجب أن يكون لديك عنوان بريد إلكتروني مؤكد لبدء ترخيص تجريبي.",
"EmailVerificationMailNotSent": "تعذر إرسال بريد التحقق من البريد الإلكتروني.",
"GetConfirmationEmail": "<a href=\"javascript:void(0);\" id=\"{0}\" class=\"text-decoration-underline\">انقر هنا للحصول على بريد إلكتروني للتأكيد</a> إذا لم تكن قد حصلت عليه من قبل.",
"WhichLicenseTypeYouAreInterestedIn": "ما نوع الرخصة المهتم بها؟",
"DontTakeOurWordForIt": "لا تأخذ كلمتنا لذلك...",
"ReadAbpCommercialUsersWantYouToKnow": "اقرأ ما يريد مستخدمو ABP التجاري أن تعرفه",
"Testimonial_ShortDescription_1": "جعلت نمطية ABP من الممكن للفريق التسليم في الوقت المناسب.",
"Testimonial_ShortDescription_2": "بناء ميزات جديدة بشكل أسرع من ذي قبل.",
"Testimonial_ShortDescription_3": "نبدأ من الميزات الجاهزة ونركز فقط على ما نحتاج حقًا إلى كتابته.",
"Testimonial_ShortDescription_4": "كانت ABP التجاري هي الأنسب لاحتياجاتنا.",
"OnlineReviewersOnAbpCommercial": "مراجعات عبر الإنترنت حول ABP التجاري",
"SeeWhatToldAboutAbpCommercial": "تعرف على ما قيل عن ABP التجاري واكتب أفكارك إذا كنت تريد ذلك.",
"BlazoriseLicense": "هل نحن بحاجة لشراء رخصة Blazorise؟",
"BlazoriseLicenseExplanation": "لدينا اتفاقية بين Volosoft و Megabit، مع هذه الاتفاقية يتم تضمين رخصة Blazorise مع منتجات ABP التجارية وبالتالي لا يحتاج عملاؤنا إلى شراء رخصة Blazorise إضافية.",
"ExtendPaymentInfoSection_DeveloperPrice": "{0} x سعر المطور(ين)",
"ExtendPaymentInfoSection_DiscountRate": "خصم ٪{0}",
"TotalNetPrice": "إجمالي السعر الصافي",
"EFCore": "Entity Framework Core",
"All": "الجميع",
"Mvc": "MVC",
"DataBaseProvider": "مزود البيانات",
"UIFramework": "إطار عمل واجهة المستخدم",
"LeptonXThemeForDashboard": "سمة LeptonX للوحة تحكم المشرف الخاصة بك بواسطة",
"AbpPlatform": "منصة ABP",
"YouDeserveGoodUXUI": "أنت تستحق واجهة مستخدم جيدة وتجربة مستخدم أفضل. سمة LeptonX من ABP موجود هنا لخدمته.",
"ViewLiveDemo": "شاهد العرض التوضيحي المباشر للموضوع",
"GetLeptonX": "احصل على LeptonX الآن",
"SeeLeptonXDocumentation": "انظر مستندات LeptonX",
"SimplifiedMenu": "قائمة مبسطة",
"SimplifiedMenuDescription": "يمكنك بسهولة العثور على الصفحة التي تبحث عنها من خلال تصفية القائمة",
"YourFavoritePages": "صفحاتك المفضلة في متناول يدك",
"YourFavoritePagesDescription": "يمكنك إضافة الصفحة أو إزالتها بسهولة من المفضلة بالنقر فوق رمز النجمة في الزاوية اليمنى العليا من الصفحة.",
"BreadCrumbs": "مسار التنقل للتبديل السلس",
"BreadCrumbsDescription": "باستخدام Breadcrumb ، يمكنك التبديل إلى الصفحات على نفس المستوى بنقرة واحدة ، حتى عندما تكون القائمة اليسرى مغلقة ، وتعمل على الأجهزة اللوحية والهواتف المحمولة المستجيبة!",
"YourMenu": "القائمة الخاصة بك كما يحلو لك",
"YourMenuDescription": "قم بتخصيص الرموز القابلة للنقر مباشرةً والمربعات المنسدلة في قائمة المستخدم كما يحلو لك. قائمة المستخدم قابلة للتخصيص بالكامل حسب احتياجاتك",
"RtlSupport": "دعم من اليمين إلى اليسار للغتك",
"RtlSupportDescription": "سمة LeptonX تدعم اليمين الى اليسار للغتك. توجد خيارات اللغة في قائمة الإعدادات لتتمكن من تغيير اللغة.",
"YourColors": "ألوانك على واجهة مستخدم لوحة تحكم المشرف",
"YourColorsDescription": "تعمل سمة LeptonX وفقًا لتفضيلات النظام لديك وله سمة فاتحة للوحة القيادة، وسمة داكنة للوحة القيادة، وخيارات سمة شبه داكنة للوحة القيادة.",
"ArrangeContentWidth": "رتب بسهولة عرض المحتوى الخاص بك",
"ArrangeContentWidthDescription": "يمكنك بسهولة تغيير عرض منطقة المحتوى الخاصة بك.",
"LeptonXCompatibleWith": "سمة LeptonX متوافقة مع",
"MobileResponsiveTemplate": "نموذج استجابة الجوال",
"MobileResponsiveTemplateDescription1": "اقترب من لوحة تحكم ادارة LeptonX من أي جهاز تريده.",
"MobileResponsiveTemplateDescription2": "مصمم لتتمكن من استخدامه بسهولة في كل جهاز خاص بك. إنه يستجيب للأجهزة المحمولة وأحجام الكمبيوتر اللوحي.",
"TopMenuLayoutOption": "خيار تخطيط القائمة العلوية",
"TopMenuLayoutOptionDescription1": "إذا كنت ترغب في إعداد موقع الويب الخاص بك باستخدام لوحة تحكم المسؤول نفسها، فمن الممكن القيام بذلك باستخدام سمة LeptonX!",
"TopMenuLayoutOptionDescription2": "فقط جرب تخطيط قائمة LeptonX العلوية الخاصة لتحقيق ذلك!",
"EasilyCustomizable": "قابل للتخصيص بسهولة لألوان علامتك التجارية",
"EasilyCustomizableDescription1": "يمكنك تخصيص سمة LeptonX باستخدام عدد قليل من متغيرات SCSS. لا تجاوز، لا يوجد تحميل CSS إضافي!",
"EasilyCustomizableDescription2": "باستخدام LeptonX، يمكنك ترتيب لوحة تحكم المسؤول الخاصة بك كيفما تشاء.",
"IndependentLayout": "منطقة التخطيط والمحتوى المستقلة",
"IndependentLayoutDescription1": "تم تصميم البنية التحتية لتخطيط LeptonX بشكل منفصل تمامًا عن المحتوى.",
"IndependentLayoutDescription2": "هذا يعني أنه يمكنك تصميم مشروعك بحرية بهيكل محتوى بخلاف Bootstrap إذا كنت تريد ذلك.",
"MostUsedLibraries": "تتكامل المكتبات الأكثر استخدامًا مع LeptonX",
"MostUsedLibrariesDescription1": "يحتوي LeptonX على مكتباتك الأكثر استخدامًا. يسمح لك باستخدام مكتبات مثل ApexCharts و DataTables و DropZone و FullCalender و JSTree و Select2 و Toastr دون عناء.",
"MostUsedLibrariesDescription2": "يدعم LeptonX أيضًا مكتبات MVC Angular و Blazor الخاصة.",
"CreateAndCustomize": "قم بإنشاء وتخصيص الصفحات التي تحتاجها في ثوانٍ باستخدام صفحات LeptonX المخصصة",
"CreateAndCustomizeDescription": "باستخدام سمة LeptonX، يمكنك أيضًا الوصول إلى العديد من صفحات html المعدة مسبقًا. وتشمل هذه العديد من الصفحات مثل صفحة تسجيل الدخول، والمدونة، والأسئلة الشائعة، وقائمة الاشتراك، والفواتير، والتسعير، وإدارة الملفات.",
"LeptonThemeForAdmin": "Lepton للوحة تحكم المشرف الخاصة بك بواسطة سمة",
"LeptonThemeForAdminDescription": "لا تزال سمة Lepton متاحة وسيتم الحفاظ عليها. إذا كنت تريد التبديل إلى سمة LeptonX كمستخدم سمة Lepton، يمكنك الاطلاع على المستندات لمعرفة الكيفية.",
"LeptonCompatibleWith": "Lepton متوافق مع سمة",
"UpgradePaymentInfoSection_DeveloperPrice": "{0} لـ {1} مطور (مطورون) إضافي",
"Upgrade": "ترقية",
"Renewal": "التجديد",
"UpgradePaymentInfoSection_LicensePrice": "رخصة {0}",
"UpgradePaymentInfoSection_LicenseRenewalPrice": "تجديد الرخصة",
"Total": "المجموع",
"SupportPolicyFaqTitle": "ما هي سياسة الدعم الخاصة بك؟",
"SupportPolicyFaqExplanation": "نحن ندعم فقط الإصدار الرئيسي النشط والسابق. لا نضمن إصدار تصحيح للإصدارات الرئيسية الثالثة والأقدم. على سبيل المثال ، إذا كان الإصدار النشط هو 7.0.0 ، فسنصدر إصدارات تصحيح لكل من 6.x.x و 7.x.x. إلى جانب ذلك ، نحن نقدم الدعم فقط لإطار عمل ABP والقضايا التجارية المتعلقة بـ ABP. هذا يعني أنه لا يتم تقديم أي دعم لتطبيقات الطرف الثالث والخدمات السحابية والمكتبات الطرفية الأخرى التي تستخدمها منتجات ABP. سنبذل جهودًا معقولة تجاريًا لتزويد عملائنا بالدعم الفني خلال ساعات العمل الرسمية لـ \"Volosoft Bilisim A.S\". من ناحية أخرى ، نحن لا نلتزم بوقت استجابة اتفاقية مستوى الخدمة (SLA) ، لكننا سنحاول الرد على المشكلات الفنية في أسرع وقت ممكن خلال ساعات العمل الرسمية لدينا. ما لم يتم إبرام اتفاقية خاصة مع العميل ، فإننا نقدم الدعم فقط على https://support.abp.io. لدينا أيضًا دعم خاص بالبريد الإلكتروني ، وهو متاح فقط لحاملي تراخيص المؤسسة."
}
}

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

@ -210,7 +210,7 @@
"TrialPlan": "Do you have a trial plan?",
"TrialPlanExplanation": "It has a 14 days trial period for the ABP Commercial team license. For more information visit <a href={0} target='_blank'>here</a>. Furthermore, for the Team licenses we provide a 30 days money-back guarantee. You can just request a refund in the first 30 days. For the Business and Enterprise licenses, we provide 60% refund in 30 days. This is because Business and Enterprise licenses include the full source code of all the modules and the themes.",
"DoYouAcceptBankWireTransfer": "Do you accept bank wire transfers?",
"DoYouAcceptBankWireTransferExplanation": "Yes, we accept bank wire transfers.<br/>After sending the license fee via bank transfer, send your receipt and requested license type to accounting@abp.io.<br/>Our international bank account information:",
"DoYouAcceptBankWireTransferExplanation": "Yes, we accept bank wire transfers.<br/>After sending the license fee via bank transfer, send your receipt and requested license type to accounting@volosoft.com.<br/>Our international bank account information:",
"HowToUpgrade": "How to upgrade existing applications when a new version is available?",
"HowToUpgradeExplanation1": "When you create a new application using ABP Commercial, all the modules and theme are used as NuGet and NPM packages. So, you can easily upgrade the packages when a new version is available.",
"HowToUpgradeExplanation2": "In addition to the standard NuGet/NPM upgrades, <a href=\"{0}\">ABP CLI</a> provides an update command that automatically finds and upgrades all ABP related packages in your solution.",
@ -369,7 +369,6 @@
"FreeTrial": "Free Trial",
"AcceptsMarketingCommunications": " Yes, I`d like to receive ABP Commercial marketing communications.",
"PurposeOfUsage": "Purpose of usage",
"Industry": "Industry",
"Choose": "- Choose -",
"CompanyOrganizationName": "Company / Organization name",
"CompanySize": "Company size",
@ -735,7 +734,7 @@
"WatchTakeCloserLookVideo": "Watch the \"Take a closer look at the code generation: ABP Suite\" Video!",
"ConfirmedEmailAddressRequiredToStartTrial": "You should have a confirmed email address in order to start a trial license.",
"EmailVerificationMailNotSent": "Email verification mail couldn't send.",
"GetConfirmationEmail": "<a href=\"javascript:void(0);\" id=\"{0}\">Click here to get a confirmation email</a> if you haven't got it before.",
"GetConfirmationEmail": "<a href=\"javascript:void(0);\" id=\"{0}\" class=\"text-decoration-underline\">Click here to get a verification email</a> if you haven't got it before.",
"WhichLicenseTypeYouAreInterestedIn": "Which license type you are interested in?",
"DontTakeOurWordForIt": "Don't take our word for it...",
"ReadAbpCommercialUsersWantYouToKnow": "Read what ABP Commercial users want you to know",
@ -747,7 +746,7 @@
"SeeWhatToldAboutAbpCommercial": "See what has been told about ABP Commercial and write your thoughts if you want.",
"BlazoriseLicense": "Do we need to buy Blazorise license?",
"BlazoriseLicenseExplanation": "We have an agreement between Volosoft and Megabit, with this agreement Blazorise license is bundled with ABP Commercial products therefore our customers do not need to purchase an extra Blazorise license.",
"ExtendPaymentInfoSection_DeveloperPrice": "{0} x Developer(s) Price",
"ExtendPaymentInfoSection_DeveloperPrice": "{0}x Additional Developer(s)",
"ExtendPaymentInfoSection_DiscountRate": "Discount {0}%",
"TotalNetPrice": "Total Net Price",
"EFCore": "Entity Framework Core",
@ -804,6 +803,21 @@
"UpgradePaymentInfoSection_LicenseRenewalPrice": "License renewal",
"Total": "Total",
"SupportPolicyFaqTitle": "What is your support policy?",
"SupportPolicyFaqExplanation": "We do support only the active and the previous major version. We do not guarantee a patch release for the 3rd and older major versions. For example, if the active version is 7.0.0, we will release patch releases for both 6.x.x and 7.x.x. Besides, we provide support only for ABP Framework and ABP Commercial related issues. That means no support is given for the 3rd party applications, cloud services and other peripheral libraries used by ABP products. We will use commercially reasonable efforts to provide our customers with technical support during \"Volosoft Bilisim A.S\"s official business hours. On the other hand, we do not commit to a service-level agreement (SLA) response time, but we will try to respond to the technical issues as quickly as possible within our official working hours. Unless a special agreement is made with the customer, we only provide support at https://support.abp.io. We also have private email support, which is only available to Enterprise License holders."
"SupportPolicyFaqExplanation": "We do support only the active and the previous major version. We do not guarantee a patch release for the 3rd and older major versions. For example, if the active version is 7.0.0, we will release patch releases for both 6.x.x and 7.x.x. Besides, we provide support only for ABP Framework and ABP Commercial related issues. That means no support is given for the 3rd party applications, cloud services and other peripheral libraries used by ABP products. We will use commercially reasonable efforts to provide our customers with technical support during \"Volosoft Bilisim A.S\"s official business hours. On the other hand, we do not commit to a service-level agreement (SLA) response time, but we will try to respond to the technical issues as quickly as possible within our official working hours. Unless a special agreement is made with the customer, we only provide support at https://support.abp.io. We also have private email support, which is only available to Enterprise License holders.",
"TotalDevelopers": "Total {0} developer(s)",
"CustomPurchaseExplanation": "Tailored to your specific needs",
"WhereDidYouHearAboutUs": "Where did you hear about us?",
"Twitter": "Twitter",
"Facebook": "Facebook",
"Youtube": "YouTube",
"Google": "Google",
"Github": "GitHub",
"Friend": " From a friend",
"Other": "Other",
"WhereDidYouHearAboutUs_explain": "Specify ...",
"DeletingMemberWarningMessage": "\"{0}\" will be removed from the developer list. If you want, you can assign this empty seat to another developer later.",
"AdditionalInfo": "If the developer seats are above your requirements, you can reduce them. You can email at <a href=\"mailto:info@abp.io\">info@abp.io</a> to remove some of your developer seats. Clearing unused developer seats will reduce the license renewal cost. If you want, you can re-purchase additional developer seats within your active license period. Note that, since there are {0} developers in this license package, you cannot reduce this number.",
"LinkExpiredErrorMessage": "The link you are trying to access is expired.",
"ExpirationDate": "Expiration Date"
}
}

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

@ -735,7 +735,7 @@
"WatchTakeCloserLookVideo": "Tekintse meg a „Nézze meg közelebbről a kódgenerálást: ABP Suite” videót!",
"ConfirmedEmailAddressRequiredToStartTrial": "A próbalicenc elindításához rendelkeznie kell egy megerősített e-mail címmel.",
"EmailVerificationMailNotSent": "Nem sikerült elküldeni az ellenőrző e-mailt.",
"GetConfirmationEmail": "<a href=\"javascript:void(0);\" id=\"{0}\">Kattintson ide, ha megerősítő e-mailt szeretne kapni,</a> ha még nem kapta meg.",
"GetConfirmationEmail": "<a href=\"javascript:void(0);\" id=\"{0}\" class=\"text-decoration-underline\">Kattintson ide, ha megerősítő e-mailt szeretne kapni,</a> ha még nem kapta meg.",
"WhichLicenseTypeYouAreInterestedIn": "Melyik licenctípus érdekli?",
"DontTakeOurWordForIt": "Ne fogadd el a szavunkat...",
"ReadAbpCommercialUsersWantYouToKnow": "Olvassa el, hogy az ABP Commercial felhasználói mit szeretnének tudni",
@ -745,9 +745,9 @@
"Testimonial_ShortDescription_4": "Az ABP Commercial volt a legjobban megfelelő az igényeinknek.",
"OnlineReviewersOnAbpCommercial": "Online vélemények az ABP Commercial-ról",
"SeeWhatToldAboutAbpCommercial": "Tekintse meg, mit mondtak az ABP Commercialról, és írja le gondolatait, ha akarja.",
"ExtendPaymentInfoSection_DeveloperPrice": "{0} x Developer(s) Price",
"ExtendPaymentInfoSection_DeveloperPrice": "{0}x További Fejlesztő(k)",
"ExtendPaymentInfoSection_DiscountRate": "Kedvezmény: {0}%",
"TotalNetPrice": "Total Net Price",
"BlackFridayDiscount": "Black Friday Kedvezmény"
}
}
}

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

@ -744,7 +744,7 @@
"WatchTakeCloserLookVideo": "\"Kod üretimine daha yakından bakın: ABP Suite\" videosunu izleyin!",
"ConfirmedEmailAddressRequiredToStartTrial": "Deneme lisansı başlatmak için onaylanmış bir e -posta adresiniz olmalı.",
"EmailVerificationMailNotSent": "E-posta doğrulama postası gönderilemedi.",
"GetConfirmationEmail": "Daha önce bir onay e-postası almadıysanız <a href=\"javascript:void(0);\" id=\"{0}\"> almak için buraya tıklayın.</a>",
"GetConfirmationEmail": "Daha önce bir onay e-postası almadıysanız <a href=\"javascript:void(0);\" id=\"{0}\" class=\"text-decoration-underline\"> almak için buraya tıklayın.</a>",
"WhichLicenseTypeYouAreInterestedIn": "Hangi lisans türüyle ilgileniyorsunuz?",
"BlackFridayDiscount": "Kara Cuma İndirimi"
}

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

@ -735,13 +735,75 @@
"WatchTakeCloserLookVideo": "观看“详细了解ABP Suite 的代码生成”视频!",
"ConfirmedEmailAddressRequiredToStartTrial": "你应该有一个确认的电子邮件地址,以便开始试用许可证。",
"EmailVerificationMailNotSent": "电子邮件验证邮件不能发送。",
"GetConfirmationEmail": "<a href=\"javascript:void(0);\" id=\"{0}\">点击这里获取确认邮件</a> 如果你还没有收到。",
"GetConfirmationEmail": "<a href=\"javascript:void(0);\" id=\"{0}\" class=\"text-decoration-underline\">点击这里获取确认邮件</a> 如果你还没有收到。",
"WhichLicenseTypeYouAreInterestedIn": "你感兴趣的许可证类型是什么?",
"DontTakeOurWordForIt": "不要相信我们的话......",
"ReadAbpCommercialUsersWantYouToKnow": "阅读 ABP Commercial 用户希望您了解到的内容",
"Testimonial_ShortDescription_1": "ABP 的模块化使得团队能够及时交付项目。",
"Testimonial_ShortDescription_2": "比以前更快地构建新功能。",
"Testimonial_ShortDescription_3": "我们从开箱即用的功能开始,只专注于我们真正需要编写的内容。",
"Testimonial_ShortDescription_4": "ABP Commercial 最适合我们的需求。",
"OnlineReviewersOnAbpCommercial": "ABP Commercial 在线评论",
"SeeWhatToldAboutAbpCommercial": "查看关于 ABP Comemrcial 的报道,并根据需要写下您的想法。",
"BlazoriseLicense": "我们是否需要购买Blazorise许可证?",
"BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。",
"ExtendPaymentInfoSection_DeveloperPrice": "{0} x 开发者价格",
"ExtendPaymentInfoSection_DeveloperPrice": "{0}x 额外的 开发者价格",
"ExtendPaymentInfoSection_DiscountRate": "折扣 {0}%",
"TotalNetPrice": "总净价",
"BlackFridayDiscount": "黑色星期五折扣"
"EFCore": "实体框架核心",
"All": "全部",
"Mvc": "MVC",
"DataBaseProvider": "数据提供者",
"UIFramework": "UI 框架",
"LeptonXThemeForDashboard": "管理仪表板的 LeptonX 主题",
"AbpPlatform": "ABP 平台",
"YouDeserveGoodUXUI": "您值得拥有良好的用户界面和更好的用户体验。 ABP 的 LeptonX Theme 就是为它服务的。",
"ViewLiveDemo": "查看在线主题演示",
"GetLeptonX": "立即获取 LeptonX",
"SeeLeptonXDocumentation": "请参阅 LeptonX 文档",
"SimplifiedMenu": "简化菜单",
"SimplifiedMenuDescription": "您可以通过过滤菜单轻松找到您要查找的页面",
"YourFavoritePages": "您最喜欢的页面触手可及",
"YourFavoritePagesDescription": "通过单击页面右上角的星形图标,可以轻松地将页面添加到收藏夹或从中删除。",
"BreadCrumbs": "用于无缝切换的页面路径导航",
"BreadCrumbsDescription": "使用页面路径导航,您可以一键切换到同一级别的页面,即使是左侧菜单关闭,它适用于平板电脑和移动设备响应!",
"YourMenu": "随心所欲的菜单",
"YourMenuDescription": "根据需要自定义用户菜单上可直接单击的图标和下拉框。 用户菜单可完全根据您的需要定制",
"RtlSupport": "对您的语言的 RTL 支持",
"RtlSupportDescription": "LeptonX 主题支持您的语言的 RTL。 语言选项位于设置菜单中,供您更改语言。",
"YourColors": "您在管理仪表板 UI 上的颜色",
"YourColorsDescription": "LeptonX 主题根据您的系统偏好工作,并具有仪表板浅色主题、仪表板深色主题和仪表板半深色主题选项。",
"ArrangeContentWidth": "轻松安排您的内容宽度",
"ArrangeContentWidthDescription": "轻松更改内容区域的宽度。",
"LeptonXCompatibleWith": "与LeptonX主题兼容",
"MobileResponsiveTemplate": "移动设备响应模板",
"MobileResponsiveTemplateDescription1": "从您喜欢的任何设备访问您的LeptonX管理仪表板。",
"MobileResponsiveTemplateDescription2": "它是为您设计的,在您的每一个设备上都可以轻松使用。它可以在移动设备和平板电脑上响应。",
"TopMenuLayoutOption": "菜单顶部布局选项",
"TopMenuLayoutOptionDescription1": "如果你想设置你的网站与相同的管理仪表板,通过使用LeptonX主题是可以做到的!",
"TopMenuLayoutOptionDescription2": "只需尝试LeptonX顶部菜单布局,就可以实现!",
"EasilyCustomizable": "易于定制您的品牌颜色",
"EasilyCustomizableDescription1": "您可以仅使用几个SCSS变量自定义LeptonX主题。没有重写,没有额外的CSS加载!",
"EasilyCustomizableDescription2": "使用LeptonX,您可以随意安排您的管理仪表板。",
"IndependentLayout": "独立的布局和内容区域",
"IndependentLayoutDescription1": "LeptonX 的布局基础设施的设计与内容完全分开。",
"IndependentLayoutDescription2": "这意味着您可以根据需要使用 Bootstrap 以外的内容结构自由设计您的项目。",
"MostUsedLibraries": "与 LeptonX 集成的最常用的库",
"MostUsedLibrariesDescription1": "LeptonX包含您最常用的库。它允许您使用库,如 ApexCharts, DataTables, DropZone, FullCalender, JSTree, Select2, Toastr 并毫不费力。",
"MostUsedLibrariesDescription2": "LeptonX还支持MVC Angular和Blazor特定的库。",
"CreateAndCustomize": "使用LeptonX自定义页面在几秒钟内创建和自定义所需的页面",
"CreateAndCustomizeDescription": "通过使用LeptonX Theme,您还可以访问许多预先制作的html页面。这些包括许多页面,如登录页面,博客,常见问题解答,订阅列表,发票,定价,文件管理。",
"LeptonThemeForAdmin": "为您的管理仪表板的Lepton主题",
"LeptonThemeForAdminDescription": "Lepton主题仍然可用,并将保持。如果您想以Lepton Theme用户的身份切换到LeptonX Theme,您可以查看文档了解如何操作。",
"LeptonCompatibleWith": "Lepton主题兼容",
"BlackFridayDiscount": "黑色星期五折扣",
"UpgradePaymentInfoSection_DeveloperPrice": "{0} 对于 {1} 额外的开发人员",
"Upgrade": "升级",
"Renewal": "续订",
"UpgradePaymentInfoSection_LicensePrice": "{0} 许可证",
"UpgradePaymentInfoSection_LicenseRenewalPrice": "许可证续订",
"Total": "总计",
"SupportPolicyFaqTitle": "您的支持政策是什么?",
"SupportPolicyFaqExplanation": "我们只支持有效的和以前的主要版本。 我们不保证为第 3 个和更早的主要版本发布补丁。 例如,如果有效版本是 7.0.0,我们将发布 6.x.x 和 7.x.x 的补丁版本。 此外,我们仅对 ABP Framework 和 ABP Commercial 相关问题提供支持。 这意味着不支持 ABP 产品使用的第 3 方应用程序、云服务和其他外围库。 我们将尽商业上合理的努力在“Volosoft Bilisim A.S”的正式营业时间内为我们的客户提供技术支持。 另一方面,我们不承诺服务级别协议 (SLA) 响应时间,但我们会尽量在我们的官方工作时间内尽快响应技术问题。 除非与客户达成特殊协议,否则我们仅在 https://support.abp.io 上提供支持。 我们还提供私人电子邮件支持,仅适用于企业许可证持有者。"
}
}
}

58
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/ar.json

@ -1,7 +1,7 @@
{
"culture": "ar",
"texts": {
"Permission:CommunityPost": "مقالة المجتمع",
"Permission:CommunityPost": "مقالة المنتدى",
"Permission:Edit": "تعديل",
"Waiting": "انتظار",
"Approved": "تمت الموافقة",
@ -24,12 +24,12 @@
"Summary": "الخلاصة",
"MostRead": "الأكثر قراءة",
"Latest": "آخر",
"ContributeAbpCommunity": "المساهمة في مجتمع ABP",
"ContributeAbpCommunity": "المساهمة في منتدى ABP",
"SubmitYourPost": "إرسال مقالتك",
"ContributionGuide": "دليل المساهمة",
"BugReport": "الإبلاغ عن خطأ",
"SeeAllPosts": "انظر جميع المقالات",
"WelcomeToABPCommunity!": "مرحبًا بك في مجتمع ABP!",
"WelcomeToABPCommunity!": "مرحبًا بك في منتدى ABP!",
"MyProfile": "ملفى",
"MyOrganizations": "منظماتي",
"EmailNotValid": "من فضلك أدخل بريد أليكترونى صحيح.",
@ -94,11 +94,11 @@
"NoThanks": "لا شكرا",
"MaybeLater": "ربما في وقت لاحق",
"JoinOurPostNewsletter": "انضم إلى النشرة الإخبارية لمقالتنا",
"Community": "تواصل اجتماعي",
"Community": "منتدى",
"Marketing": "تسويق",
"CommunityPrivacyPolicyConfirmation": "أوافق على البنود والشروط و <a href=\"https://commercial.abp.io/Privacy\"> سياسة الخصوصية </a>.",
"PostRequestMessageTitle": "<a href=\"https://github.com/abpframework/abp/issues/new\"> افتح مشكلة </a> على GitHub لطلب مقالة/برنامج تعليمي تريد رؤيته على موقع الويب هذا.",
"PostRequestMessageBody": "هنا ، قائمة المقالات المطلوبة من قبل المجتمع. هل تريد كتابة مقال مطلوب؟ الرجاء الضغط على الطلب والانضمام إلى المناقشة.",
"PostRequestMessageBody": "هنا ، قائمة المقالات المطلوبة من قبل المنتدى. هل تريد كتابة مقال مطلوب؟ الرجاء الضغط على الطلب والانضمام إلى المناقشة.",
"Language": "لغة",
"CreatePostLanguageInfo": "لغة محتوى المنشور.",
"VideoPost": "مشاركة الفيديو",
@ -116,7 +116,7 @@
"GithubPostUrl": "عنوان Url لمقال Github",
"ExternalPostUrl": "عنوان URL للمادة الخارجية",
"CreatePostCoverInfo": "لإنشاء منشور فعال ، أضف صورة غلاف. قم بتحميل صور بنسبة عرض إلى ارتفاع تبلغ 16: 9 للحصول على أفضل عرض. الحد الأقصى لحجم الملف: 1 ميغا بايت.",
"ThankYouForContribution": "شكرًا لك على المساهمة في مجتمع ABP.",
"ThankYouForContribution": "شكرًا لك على المساهمة في منتدى ABP.",
"GithubPost": "المادة جيثب",
"GithubPostSubmitStepOne": "<span class=\"font-weight-bold\"> 1. </span> اكتب مقالة في أي مستودع GitHub عام بتنسيق Markdown. <a target=\"_blank\" href=\"https://github.com/abpframework/abp/blob/dev/docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md\"> مثال </a>",
"GithubPostSubmitStepTwo": "<span class=\"font-weight-bold\"> 2. </span> أرسل عنوان URL لمقالتك باستخدام النموذج.",
@ -143,6 +143,50 @@
"Volo.AbpIo.Domain:060001": "عنوان URL المصدر (\"{PostUrl}\") ليس عنوان URL لـ Github",
"Volo.AbpIo.Domain:060002": "محتوى المقالة غير متوفر من مورد Github (\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "لم يتم العثور على محتوى مقال!",
"SeeMore": "شاهد المزيد"
"SeeMore": "رؤية المزيد",
"JoinTheABPCommunity": "انضم إلى منتدى ABP",
"ABPCommunityTalks": "برامج منتدى ABP الحوارية",
"LiveDemo": "عرض مباشر",
"GetLicense": "الحصول على رخصة",
"GetStarted": "البدء",
"SourceCode": "كود المصدر",
"LeaveComment": "اترك تعليقا",
"ShowMore": "عرض المزيد",
"NoPublishedPostsYet": "لا يوجد أي منشور حتى الآن.",
"Name": "الاسم",
"Surname": "اسم العائلة",
"WebSite": "الموقع الالكتروني",
"FullURL": "رابط URL الكامل",
"JobTitle": "الوظيفة",
"Prev": "سابق",
"Previous": "السابق",
"Next": "التالي",
"Share": "مشاركة",
"SortBy": "صنف حسب",
"NoPublishedEventsYet": "لا توجد أحداث منشورة حتى الآن.",
"SubscribeYoutubeChannel": "اشترك في قناة يوتيوب",
"Enum:EventType:0": "البرامج الحوارية",
"MemberNotPublishedPostYet": "هذا العضو لم ينشر أي منشورات حتى الآن.",
"TimeAgo": "قبل {0}",
"Discord_Page_JoinCommunityMessage": "انضم إلى منتدى ABP Discord",
"Discord_Page_Announce": "يسعدنا الإعلان عن سيرفر دسكورد الخاص بمنتدى ABP",
"Discord_Page_Description_1": "منتدى ABP ينمو منذ اليوم الأول. أردنا الانتقال إلى الخطوة التالية من خلال إنشاء سيرفر دسكورد ABP رسمي حتى يتمكن منتدى ABP من التفاعل مع بعضهم البعض باستخدام عجائب المراسلة الفورية.",
"Discord_Page_Description_2": "سيرفر الدسكورد الخاص بمنتدى ABP هو المكان الذي يمكنك فيه عرض إبداعاتك باستخدام إطار عمل ABP، ومشاركة النصائح التي أدت إلى نتيجة معك، ومواكبة آخر الأخبار والإعلانات حول إطار عمل ABP، ما عليك سوى الدردشة مع أعضاء المنتدى لتبادل الأفكار والاستمتاع!",
"Discord_Page_Description_3": "سيرفر الدسكورد الخاص بمنتدى ABP هذا هو السيرفر الرسمي مع وجود فريق ABP الأساسي على السيرفر للمراقبة.",
"Discord_Page_JoinToServer": "انضم إلى سيرفر ديسكورد ABP",
"Events_Page_MetaTitle": "أحداث منتدى ABP",
"Events_Page_MetaDescription": "العروض المباشرة، التي يستضيفها فريق ABP، عبارة عن جلسات عفوية مليئة بالمحتوى المجتمعي والعروض التوضيحية والأسئلة والأجوبة والمناقشات حول ما يحدث في ABP.",
"Events_Page_Title": "ABP<span class=\"gradient-community\"> لمنتدى</span> البرامج الحوارية",
"Members_Page_WritingFromUser": "اقرأ الكتابة من {0} على منتدى ABP",
"Post_Create_Page_MetaTitle": "منشور جديد",
"Post_Create_Page_MetaDescription": "أنشئ منشورك لمشاركة تجاربك حول إطار عمل ABP والمساهمة في منتدى ABP.",
"Post_Create_Page_CreateNewPost": "إنشاء منشور جديد",
"Post_Index_Page_MetaDescription": "الغرض من منتدى ABP هو إنشاء بيئة مساهمة للمطورين الذين يستخدمون إطار عمل برنامج ABP.",
"Layout_Title": "{0} | ABP منتدى",
"Layout_MetaDescription": "منتدى ABP هو عبارة عن بيئة حيث يمكن للأشخاص مشاركة منشورات حول إطار عمل برنامج ABP ومتابعة المشاريع.",
"Index_Page_CommunityIntroduction": "إن هذا محور لإطار عمل ABP و.NET وتطوير البرامج. يمكنك قراءة المقالات ومشاهدة مقاطع الفيديو التعليمية والحصول على معلومات حول تقدم تطوير ABP والأحداث المتعلقة بـ ABP ومساعدة المطورين الآخرين ومشاركة خبرتك مع منتدى ABP.",
"TagsInArticle": "العلامات في المقال",
"WelcomeToABP": "أهلا بكم في ABP",
"IConsentToMedium": ".https://medium.com/volosoft أوافق على نشر هذا المنشور على"
}
}

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

@ -142,6 +142,7 @@
"MinimumSearchContent": "Musíte zadat alespoň 3 znaky!",
"Volo.AbpIo.Domain:060001": "Zdrojová adresa URL („{PostUrl}“) není adresa URL Github",
"Volo.AbpIo.Domain:060002": "Obsah článku není dostupný ze zdroje Github(\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "Nebyl nalezen žádný obsah článku!"
"Volo.AbpIo.Domain:060003": "Nebyl nalezen žádný obsah článku!",
"IConsentToMedium": "Souhlasím se zveřejněním tohoto příspěvku na https://medium.com/volosoft."
}
}

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

@ -142,6 +142,7 @@
"Volo.AbpIo.Domain:060001": "Quell-URL(\"{PostUrl}\") ist keine Github-URL",
"Volo.AbpIo.Domain:060002": "Artikelinhalt ist über die Github(\"{PostUrl}\")-Ressource nicht verfügbar.",
"Volo.AbpIo.Domain:060003": "Kein Artikelinhalt gefunden!",
"SeeMore": "Mehr Sehen"
"SeeMore": "Mehr Sehen",
"IConsentToMedium": "Ich stimme der Veröffentlichung dieses Beitrags auf https://medium.com/volosoft zu."
}
}

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

@ -13,7 +13,6 @@
"Status": "Status",
"ContentSource": "Content Source",
"Details": "Details",
"Url": "Url",
"Title": "Title",
"CreationTime": "Creation time",
"Save": "Save",
@ -184,6 +183,7 @@
"Layout_Title": "{0} | ABP Community",
"Layout_MetaDescription": "ABP Community is an environment where people can share posts about ABP framework and follows the projects.",
"Index_Page_CommunityIntroduction": "This is a hub for ABP Framework, .NET and software development. You can read the articles, watch the video tutorials, get informed about ABP’s development progress and ABP-related events, help other developers and share your expertise with the ABP community.",
"TagsInArticle": "Tags in article"
"TagsInArticle": "Tags in article",
"IConsentToMedium": "I consent to the publication of this post at https://medium.com/volosoft."
}
}

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

@ -143,6 +143,7 @@
"Volo.AbpIo.Domain:060001": "La URL de origen (\"{PostUrl}\") no es la URL de Github",
"Volo.AbpIo.Domain:060002": "El contenido del artículo no está disponible en el recurso de Github (\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "¡No se encontró contenido del artículo!",
"SeeMore": "Ver Más"
"SeeMore": "Ver Más",
"IConsentToMedium": "Acepto la publicación de esta publicación en https://medium.com/volosoft."
}
}

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

@ -143,6 +143,7 @@
"Volo.AbpIo.Domain:060001": "Lähteen URL-osoite (\"{PostUrl}\") ei ole Githubin URL-osoite",
"Volo.AbpIo.Domain:060002": "Artikkelin sisältö ei ole saatavilla Githubin (\"{PostUrl}\") -resurssista.",
"Volo.AbpIo.Domain:060003": "Artikkelin sisältöä ei löytynyt!",
"SeeMore": "Katso Lisää"
"SeeMore": "Katso Lisää",
"IConsentToMedium": "Hyväksyn tämän viestin julkaisemisen osoitteessa https://medium.com/volosoft."
}
}

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

@ -143,6 +143,7 @@
"Volo.AbpIo.Domain:060001": "L'URL source (\"{PostUrl}\") n'est pas une URL Github",
"Volo.AbpIo.Domain:060002": "Le contenu de l'post n'est pas disponible à partir de la ressource Github(\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "Aucun contenu d'post trouvé !",
"SeeMore": "Voir Plus"
"SeeMore": "Voir Plus",
"IConsentToMedium": "Je consens à la publication de cet article sur https://medium.com/volosoft."
}
}

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

@ -143,6 +143,7 @@
"Volo.AbpIo.Domain:060001": "स्रोत URL (\"{PostUrl}\") जीथब URL नहीं है",
"Volo.AbpIo.Domain:060002": "लेख सामग्री Github (\"{PostUrl}\") संसाधन से उपलब्ध नहीं है।",
"Volo.AbpIo.Domain:060003": "कोई लेख सामग्री नहीं मिली!",
"SeeMore": "और देखें"
"SeeMore": "और देखें",
"IConsentToMedium": "मैं https://medium.com/volosoft पर इस पोस्ट के प्रकाशन के लिए सहमति देता/देती हूं।"
}
}

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

@ -184,6 +184,7 @@
"Layout_Title": "{0} | ABP-közösség",
"Layout_MetaDescription": "Az ABP Community egy olyan környezet, ahol az emberek megoszthatnak bejegyzéseket az ABP keretrendszerről, és követhetik a projekteket.",
"Index_Page_CommunityIntroduction": "Ez az ABP Framework, a .NET és a szoftverfejlesztés központja. Elolvashatja a cikkeket, megnézheti az oktatóvideókat, tájékozódhat az ABP fejlesztési előrehaladásáról és az ABP-vel kapcsolatos eseményekről, segíthet más fejlesztőknek, és megoszthatja szakértelmét az ABP közösséggel.",
"TagsInArticle": "Címkék a cikkben"
"TagsInArticle": "Címkék a cikkben",
"IConsentToMedium": "Hozzájárulok a bejegyzés közzétételéhez a https://medium.com/volosoft oldalon."
}
}

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

@ -143,6 +143,7 @@
"Volo.AbpIo.Domain:060001": "Upprunaslóð (\"{PostUrl} \") er ekki Github slóð",
"Volo.AbpIo.Domain:060002": "Innihald greinar er ekki fáanlegt frá Github (\"{PostUrl} \") resoursum.",
"Volo.AbpIo.Domain:060003": "Innihald greinar fannst ekki!",
"SeeMore": "Sjá Meira"
"SeeMore": "Sjá Meira",
"IConsentToMedium": "Ég samþykki birtingu þessarar færslu á https://medium.com/volosoft."
}
}

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

@ -143,6 +143,7 @@
"Volo.AbpIo.Domain:060001": "Source URL(\"{PostUrl}\") non è un URL di GitHub",
"Volo.AbpIo.Domain:060002": "Il contenuto dell'articolo non è disponibile dalla risorsa Github(\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "Nessun contenuto dell'articolo trovato!",
"SeeMore": "Vedi Altro"
"SeeMore": "Vedi Altro",
"IConsentToMedium": "Acconsento alla pubblicazione di questo post su https://medium.com/volosoft."
}
}

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

@ -142,6 +142,7 @@
"MinimumSearchContent": "U moet minimaal 3 tekens invoeren!",
"Volo.AbpIo.Domain:060001": "Bron-URL (\"{PostUrl}\") is geen Github-URL",
"Volo.AbpIo.Domain:060002": "Artikelinhoud is niet beschikbaar via Github(\"{PostUrl}\") bron.",
"Volo.AbpIo.Domain:060003": "Geen artikelinhoud gevonden!"
"Volo.AbpIo.Domain:060003": "Geen artikelinhoud gevonden!",
"IConsentToMedium": "Ik stem in met de publicatie van dit bericht op https://medium.com/volosoft."
}
}

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

@ -142,6 +142,7 @@
"MinimumSearchContent": "Musisz wpisać co najmniej 3 znaki!",
"Volo.AbpIo.Domain:060001": "Źródłowy adres URL („{PostUrl}”) nie jest adresem URL Github",
"Volo.AbpIo.Domain:060002": "Treść artykułu nie jest dostępna w zasobach Github(\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "Nie znaleziono treści artykułu!"
"Volo.AbpIo.Domain:060003": "Nie znaleziono treści artykułu!",
"IConsentToMedium": "Wyrażam zgodę na publikację tego posta na stronie https://medium.com/volosoft."
}
}

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

@ -142,6 +142,7 @@
"MinimumSearchContent": "Você deve inserir pelo menos 3 caracteres!",
"Volo.AbpIo.Domain:060001": "O URL da fonte (\"{PostUrl}\") não é o URL do Github",
"Volo.AbpIo.Domain:060002": "O conteúdo do artigo não está disponível no recurso Github (\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "Nenhum conteúdo do artigo encontrado!"
"Volo.AbpIo.Domain:060003": "Nenhum conteúdo do artigo encontrado!",
"IConsentToMedium": "Eu concordo com a publicação deste post em https://medium.com/volosoft."
}
}

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

@ -143,6 +143,7 @@
"Volo.AbpIo.Domain:060001": "Sursa URL(\"{PostUrl}\") nu este URL GitHub",
"Volo.AbpIo.Domain:060002": "Conţinutul articolului nu este disponibil din resursa de pe GitHub(\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "Nu a fost găsit conţinutul articolului!",
"SeeMore": "Vezi mai mult"
"SeeMore": "Vezi mai mult",
"IConsentToMedium": "Sunt de acord cu publicarea acestei postări la https://medium.com/volosoft."
}
}

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

@ -142,6 +142,7 @@
"MinimumSearchContent": "Вы должны ввести минимум 3 символа!",
"Volo.AbpIo.Domain:060001": "Исходный URL (\"{PostUrl}\") не является URL-адресом Github",
"Volo.AbpIo.Domain:060002": "Контент статьи недоступен на ресурсе Github (\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "Контент статьи не найден!"
"Volo.AbpIo.Domain:060003": "Контент статьи не найден!",
"IConsentToMedium": "Я даю согласие на публикацию этого поста на https://medium.com/volosoft."
}
}

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

@ -143,6 +143,7 @@
"Volo.AbpIo.Domain:060001": "Zdrojová URL(\"{PostUrl}\") nie je URL Githubu",
"Volo.AbpIo.Domain:060002": "Obsah článku nie je dostupný v Github zdroji(\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "Nenašiel sa žiadny obsah článku!",
"SeeMore": "Vidět Víc"
"SeeMore": "Vidět Víc",
"IConsentToMedium": "Súhlasím so zverejnením tohto príspevku na https://medium.com/volosoft."
}
}

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

@ -142,6 +142,7 @@
"MinimumSearchContent": "Vnesti morate vsaj 3 znake!",
"Volo.AbpIo.Domain:060001": "Izvorni URL (\"{PostUrl}\") ni URL Github",
"Volo.AbpIo.Domain:060002": "Vsebina članka ni na voljo iz vira Github(\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "Vsebina članka ni bila najdena!"
"Volo.AbpIo.Domain:060003": "Vsebina članka ni bila najdena!",
"IConsentToMedium": "Soglašam z objavo te objave na https://medium.com/volosoft."
}
}

3
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json

@ -189,6 +189,7 @@
"Post_Index_Page_MetaDescription": "ABP Topluluğu'nun amacı, ABP çerçevesini kullanan geliştiriciler için bir katkı ortamı yaratmaktır.",
"Layout_Title": "{0} | ABP Topluluğu",
"Layout_MetaDescription": "ABP Topluluğu, insanların ABP çerçevesi hakkında paylaşımlarda bulunabileceği ve projeleri takip edebileceği bir ortamdır.",
"Index_Page_CommunityIntroduction": "Burası ABP Çerçevesi, .NET ve yazılım geliştirme için bir merkezdir. Makaleleri okuyabilir, eğitim videolarını izleyebilir, ABP'nin gelişim süreci ve ABP ile ilgili etkinlikler hakkında bilgi alabilir, diğer geliştiricilere yardımcı olabilir ve uzmanlığınızı ABP topluluğu ile paylaşabilirsiniz."
"Index_Page_CommunityIntroduction": "Burası ABP Çerçevesi, .NET ve yazılım geliştirme için bir merkezdir. Makaleleri okuyabilir, eğitim videolarını izleyebilir, ABP'nin gelişim süreci ve ABP ile ilgili etkinlikler hakkında bilgi alabilir, diğer geliştiricilere yardımcı olabilir ve uzmanlığınızı ABP topluluğu ile paylaşabilirsiniz.",
"IConsentToMedium": "Bu yazının https://medium.com/volosoft adresinde yayınlanmasına izin veriyorum."
}
}

3
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/vi.json

@ -142,6 +142,7 @@
"MinimumSearchContent": "Bạn phải nhập ít nhất 3 ký tự!",
"Volo.AbpIo.Domain:060001": "URL nguồn (\"{PostUrl}\") không phải là URL Github",
"Volo.AbpIo.Domain:060002": "Nội dung Bài viết không có sẵn từ tài nguyên Github (\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003": "Không tìm thấy nội dung bài viết!"
"Volo.AbpIo.Domain:060003": "Không tìm thấy nội dung bài viết!",
"IConsentToMedium": "Tôi đồng ý với việc xuất bản bài đăng này tại https://medium.com/volosoft."
}
}

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

@ -183,6 +183,8 @@
"Post_Index_Page_MetaDescription": "ABP 社区的目的是为使用 ABP 框架的开发人员创建一个贡献环境。",
"Layout_Title": "{0} | ABP 社区",
"Layout_MetaDescription": "ABP 社区是一个人们可以分享有关 ABP 框架的帖子并关注项目的环境。",
"Index_Page_CommunityIntroduction": "这是 ABP 框架、.NET 和软件开发的中心。 您可以阅读文章,观看视频教程,了解 ABP 的开发进度和 ABP 相关事件,帮助其他开发人员并与 ABP 社区分享您的专业知识。"
"Index_Page_CommunityIntroduction": "这是 ABP 框架、.NET 和软件开发的中心。 您可以阅读文章,观看视频教程,了解 ABP 的开发进度和 ABP 相关事件,帮助其他开发人员并与 ABP 社区分享您的专业知识。",
"TagsInArticle": "文章中的标签",
"IConsentToMedium": "我同意在 https://medium.com/volosoft 上发布这篇文章。"
}
}
}

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

@ -14,23 +14,23 @@
"CreateNow": "إنشاء جديد",
"TheStartupProject": "مشروع بدء التشغيل",
"Tutorial": "الدورة التعليمية",
"UsingCLI": "باستخدام CLI",
"UsingCLI": "باستخدام واجهة الأوامر CLI",
"SeeDetails": "انظر التفاصيل",
"AbpShortDescription": "ABP Framework بنية أساسية كاملة لإنشاء تطبيقات ويب حديثة باتباع أفضل ممارسات واتفاقيات تطوير البرامج.",
"SourceCodeUpper": "شفرة المصدر",
"AbpShortDescription": "إطار عمل ABP هو بنية أساسية كاملة لإنشاء تطبيقات ويب حديثة باتباع أفضل ممارسات واتفاقيات تطوير البرامج.",
"SourceCodeUpper": "الكود الأصل",
"LatestReleaseLogs": "أحدث سجلات الإصدار",
"Infrastructure": "البنية التحتية",
"Architecture": "الهيكلة",
"Modular": "معياري",
"DontRepeatYourself": "لا تكرر نفسك",
"DeveloperFocused": "تركيز المطور",
"DeveloperFocused": "مركزة على المطور",
"FullStackApplicationInfrastructure": "البنية التحتية الكاملة للتطبيق.",
"DomainDrivenDesign": "Domain Driven Design",
"DomainDrivenDesignExplanation": "تم تصميمه وتطويره بناءً على أنماط ومبادئ DDD. يوفر نموذجًا متعدد الطبقات لتطبيقك.",
"DomainDrivenDesign": "التصميم المُقاد بالمجال DDD",
"DomainDrivenDesignExplanation": "تم تصميمه وتطويره بناءً على أنماط ومبادئ التصميم المُقاد بالمجال DDD. يوفر نموذجًا متعدد الطبقات لتطبيقك.",
"Authorization": "تفويض",
"AuthorizationExplanation": "إذن متقدم مع نظام أذونات مستخدم ودور ودقيق. مبني على مكتبة هوية Microsoft.",
"MultiTenancy": "متعدد الايجار",
"MultiTenancyExplanationShort": "جعلت تطبيقات SaaS سهلة! متعدد الإيجارات المتكاملة من قاعدة البيانات إلى واجهة المستخدم.",
"AuthorizationExplanation": "إذن متقدم وبالغ الدقة مع نظام أذونات للمستخدم والأدوار. مبني على مكتبة Microsoft Identity.",
"MultiTenancy": "التعددية",
"MultiTenancyExplanationShort": "جعلت تطبيقات SaaS سهلة! تعددية بشكل متكامل من قاعدة البيانات إلى واجهة المستخدم.",
"CrossCuttingConcerns": "اهتمامات مشتركة",
"CrossCuttingConcernsExplanationShort": "بنية تحتية كاملة للتفويض والتحقق من الصحة ومعالجة الاستثناءات والتخزين المؤقت وتسجيل التدقيق وإدارة المعاملات والمزيد.",
"BuiltInBundlingMinification": "تجميع وتصغير مدمج",
@ -38,17 +38,17 @@
"VirtualFileSystem": "نظام الملفات الافتراضي",
"VirtualFileSystemExplanation": "قم بتضمين العروض والنصوص والأنماط والصور ... في الحزم/المكتبات وإعادة استخدامها في تطبيقات مختلفة.",
"Theming": "تصميم",
"ThemingExplanationShort": "استخدم وتخصيص سمة واجهة المستخدم القياسية القائمة على التمهيد أو قم بإنشاء سمة خاصة بك.",
"BootstrapTagHelpersDynamicForms": "أدوات مساعدة علامة التمهيد والنماذج الديناميكية",
"BootstrapTagHelpersDynamicFormsExplanation": "بدلاً من كتابة التفاصيل المتكررة لمكونات التمهيد يدويًا ، استخدم مساعدي علامات ABP لتبسيطها والاستفادة من التحسس. أنشئ نماذج واجهة مستخدم بسرعة استنادًا إلى نموذج C # باستخدام مساعد علامة النموذج الديناميكي.",
"HTTPAPIsDynamicProxies": "HTTP APIs & Dynamic Proxies",
"ThemingExplanationShort": "استخدم وقم بتخصيص سمة واجهة المستخدم القياسية القائمة على التمهيد أو قم بإنشاء سمة خاصة بك.",
"BootstrapTagHelpersDynamicForms": "علامات مساعدة من Bootstrap ونماذج ديناميكية",
"BootstrapTagHelpersDynamicFormsExplanation": "بدلاً من كتابة التفاصيل المتكررة لمكونات Bootstrap يدويًا ، استخدم مساعدي علامات ABP لتبسيطها والاستفادة من IntelliSense. أنشئ نماذج واجهة مستخدم بسرعة استنادًا إلى نموذج C# باستخدام مساعد علامة النموذج الديناميكي.",
"HTTPAPIsDynamicProxies": "HTTP APIs و Proxies ديناميكية",
"HTTPAPIsDynamicProxiesExplanation": "كشف خدمات التطبيقات تلقائيًا على أنها واجهات برمجة تطبيقات HTTP بنمط REST ، واستهلكها باستخدام وكلاء JavaScript و C # الديناميكيين.",
"CompleteArchitectureInfo": "هندسة معمارية حديثة لإنشاء حلول برمجية قابلة للصيانة.",
"DomainDrivenDesignBasedLayeringModelExplanation": "يساعدك على تنفيذ بنية طبقات تستند إلى DDD وبناء قاعدة رمز قابلة للصيانة.",
"DomainDrivenDesignBasedLayeringModelExplanationCont": "يوفر قوالب بدء التشغيل ، والملخصات ، والفئات الأساسية ، والخدمات ، والوثائق والأدلة لمساعدتك على تطوير تطبيقك بناءً على أنماط ومبادئ DDD.",
"CompleteArchitectureInfo": "معمارية حديثة لإنشاء حلول برمجية قابلة للصيانة.",
"DomainDrivenDesignBasedLayeringModelExplanation": "يساعدك على تنفيذ بنية طبقات تستند إلى التصميم المُقاد بالمجال DDD وبناء قاعدة رمز قابلة للصيانة.",
"DomainDrivenDesignBasedLayeringModelExplanationCont": "يوفر عارضات بدء التشغيل، والملخصات، والفئات الأساسية، والخدمات، والمستندات والأدلة لمساعدتك على تطوير تطبيقك بناءً على أنماط ومبادئ التصميم المُقاد بالمجال DDD.",
"MicroserviceCompatibleModelExplanation": "تم تصميم إطار العمل الأساسي ووحدات ما قبل الإنشاء مع مراعاة بنية الخدمات المصغرة.",
"MicroserviceCompatibleModelExplanationCont": "يوفر البنية التحتية وعمليات الدمج والعينات والوثائق لتنفيذ حلول الخدمات المصغرة بشكل أسهل ، في حين أنه لا يجلب تعقيدًا إضافيًا إذا كنت تريد تطبيقًا مترابطًا.",
"ModularInfo": "يوفر ABP نظام وحدة نمطية يسمح لك بتطوير وحدات تطبيق قابلة لإعادة الاستخدام ، والربط بأحداث دورة حياة التطبيق ، والتعبير عن التبعيات بين الأجزاء الأساسية في نظامك.",
"MicroserviceCompatibleModelExplanationCont": "يوفر البنية التحتية وعمليات الدمج والعينات والمستندات لتنفيذ حلول الخدمات المصغرة بشكل أسهل ، في حين أنه لا يجلب تعقيدًا إضافيًا إذا كنت تريد تطبيقًا مترابطًا.",
"ModularInfo": "يوفر ABP نظام وحدة نمطية يسمح لك بتطوير وحدات تطبيق قابلة لإعادة الاستخدام، والربط بأحداث دورة حياة التطبيق، والتعبير عن التبعيات بين الأجزاء الأساسية في نظامك.",
"PreBuiltModulesThemes": "الوحدات والسمات المبنية مسبقًا",
"PreBuiltModulesThemesExplanation": "الوحدات والسمات مفتوحة المصدر والتجارية جاهزة للاستخدام في تطبيق عملك.",
"NuGetNPMPackages": "حزم NuGet و NPM",
@ -56,7 +56,7 @@
"ExtensibleReplaceable": "قابل للتوسيع/قابل للاستبدال",
"ExtensibleReplaceableExplanation": "تم تصميم جميع الخدمات والوحدات النمطية في الاعتبار قابلية التوسع. يمكنك استبدال الخدمات والصفحات والأنماط والمكونات.",
"CrossCuttingConcernsExplanation2": "اجعل قاعدة الشفرة أصغر حتى تتمكن من التركيز على الكود الخاص بنشاطك التجاري.",
"CrossCuttingConcernsExplanation3": "لا ترسل وقتًا لتنفيذ متطلبات التطبيق المشتركة في مشاريع متعددة.",
"CrossCuttingConcernsExplanation3": "لا تقضي وقتًا لتنفيذ متطلبات التطبيق المشتركة في مشاريع متعددة.",
"AuthenticationAuthorization": "المصادقة والتفويض",
"ExceptionHandling": "معالجة الاستثناء",
"Validation": "التحقق من الصحة",
@ -81,22 +81,22 @@
"SeeAllFeatures": "انظر جميع الميزات",
"CLI_CommandLineInterface": "CLI (واجهة سطر الأوامر)",
"CLI_CommandLineInterfaceExplanation": "يتضمن CLI لمساعدتك على أتمتة إنشاء مشاريع جديدة وإضافة وحدات نمطية جديدة.",
"StartupTemplates": "قوالب بدء التشغيل",
"StartupTemplatesExplanation": "توفر قوالب بدء التشغيل المختلفة حلاً مهيئًا بالكامل لبدء التطوير السريع.",
"BasedOnFamiliarTools": "بناءاً على أدوات معروفة",
"BasedOnFamiliarToolsExplanation": "مصمم ومتكامل مع الأدوات الشائعة التي تعرفها بالفعل. منحنى تعليمي منخفض ، سهل التكيف ، تنمية مريحة.",
"StartupTemplates": "عارضات بدء التشغيل",
"StartupTemplatesExplanation": "توفر عارضات بدء التشغيل المختلفة حلاً مهيئًا بالكامل لبدء التطوير السريع.",
"BasedOnFamiliarTools": "بناءً على أدوات معروفة",
"BasedOnFamiliarToolsExplanation": "مصمم ومتكامل مع الأدوات الشائعة التي تعرفها بالفعل. منحنى تعليمي منخفض، سهل التكيف، تنمية مريحة.",
"ORMIndependent": "ORM مستقل",
"ORMIndependentExplanation": "الإطار الأساسي هو ORM/قاعدة البيانات مستقل ويمكن أن يعمل مع أي مصدر بيانات. يتوفر مقدمو Entity Framework Core و MongoDB بالفعل.",
"ORMIndependentExplanation": "الإطار الأساسي هو ORM/قاعدة بيانات مستقل ويمكن أن يعمل مع أي مصدر بيانات. يتوفر مقدمو Entity Framework Core و MongoDB بالفعل.",
"Features": "استكشف ميزات إطار عمل ABP",
"ABPCLI": "ABP CLI",
"ABPCLI": "ABP CLI واجهة سطر الأوامر",
"Modularity": "النمطية",
"BootstrapTagHelpers": "مساعدي علامة التمهيد",
"DynamicForms": "شاشات ديناميكية",
"BundlingMinification": "التجميع والتصغير",
"BackgroundJobs": "وظائف الخلفية",
"BackgroundJobsExplanation": "حدد فئات بسيطة لتنفيذ المهام في الخلفية كما هو الحال في قائمة الانتظار. استخدم مدير الوظائف المدمج أو ادمج مدير الوظائف الخاص بك. تكامل <a href=\"{0}\"> Hangfire </a> و <a href=\"{1}\"> RabbitMQ </a> متاحة بالفعل.",
"DDDInfrastructure": "البنية التحتية DDD",
"DomainDrivenDesignInfrastructure": "البنية التحتية للتصميم يحركها المجال",
"DDDInfrastructure": "بنية تحتية لـDDD",
"DomainDrivenDesignInfrastructure": "البنية التحتية للتصميم المُقاد بالمجال",
"AutoRESTAPIs": "واجهات برمجة تطبيقات Auto REST",
"DynamicClientProxies": "وكلاء العميل الديناميكي",
"DistributedEventBus": "حافلة الحدث الموزعة",
@ -106,7 +106,7 @@
"ObjectToObjectMapping": "مطابقة كائن إلى كائن",
"ObjectToObjectMappingExplanation": "تجريد <a href=\"{0}\"> كائن لتعيين كائن </a> مع تكامل AutoMapper.",
"EmailSMSAbstractions": "التجريد من البريد الإلكتروني والرسائل النصية القصيرة",
"EmailSMSAbstractionsWithTemplatingSupport": "تجريدات البريد الإلكتروني والرسائل النصية القصيرة مع دعم القوالب",
"EmailSMSAbstractionsWithTemplatingSupport": "تجريدات البريد الإلكتروني والرسائل النصية القصيرة مع دعم العارضات",
"Localization": "التعريب",
"SettingManagement": "إدارة الإعدادات",
"ExtensionMethods": "طرق التمديد",
@ -116,14 +116,14 @@
"DependencyInjectionByConventions": "حقن التبعية بالاتفاقيات",
"ABPCLIExplanation": "ABP CLI (واجهة سطر الأوامر) هي أداة سطر أوامر لإجراء بعض العمليات الشائعة للحلول المستندة إلى ABP.",
"ModularityExplanation": "يوفر ABP بنية أساسية كاملة لبناء وحدات التطبيق الخاصة بك والتي قد تحتوي على كيانات وخدمات وتكامل قواعد البيانات وواجهات برمجة التطبيقات ومكونات واجهة المستخدم وما إلى ذلك ..",
"MultiTenancyExplanation": "لا يدعم إطار عمل ABP تطوير التطبيقات متعددة المستأجرين فحسب ، بل يجعل الكود الخاص بك في الغالب غير مدرك للتعددية المستأجرة.",
"MultiTenancyExplanation2": "يمكن تحديد المستأجر الحالي تلقائيًا ، وعزل بيانات المستأجرين المختلفين عن بعضهم البعض.",
"MultiTenancyExplanation": "لا يدعم إطار عمل ABP تطوير التطبيقات المتعددة فحسب، بل يجعل الكود الخاص بك في الغالب غير مدرك للتعددية المستأجرة.",
"MultiTenancyExplanation2": "يمكن تحديد المستأجر الحالي تلقائيًا، وعزل بيانات المستأجرين المختلفين عن بعضهم البعض.",
"MultiTenancyExplanation3": "يدعم قاعدة بيانات واحدة وقاعدة بيانات لكل مستأجر ونهج مختلطة.",
"MultiTenancyExplanation4": "أنت تركز على رمز عملك وتدع إطار العمل للتعامل مع عقود الإيجار المتعددة نيابة عنك.",
"BootstrapTagHelpersExplanation": "بدلاً من كتابة التفاصيل المتكررة لمكونات التمهيد يدويًا ، استخدم مساعدي علامات ABP لتبسيطها والاستفادة من التحسس. يمكنك بالتأكيد استخدام Bootstrap متى احتجت إليه.",
"BootstrapTagHelpersExplanation": "بدلاً من كتابة التفاصيل المتكررة لمكونات التمهيد يدويًا، استخدم مساعدي علامات ABP لتبسيطها والاستفادة من IntelliSense. يمكنك بالتأكيد استخدام Bootstrap متى احتجت إليه.",
"DynamicFormsExplanation": "يمكن لمساعدي النموذج الديناميكي وعلامات الإدخال إنشاء النموذج الكامل من فئة C # كنموذج.",
"AuthenticationAuthorizationExplanation": "خيارات المصادقة والترخيص الغنية المدمجة في ASP.NET Core Identity & IdentityServer4. يوفر نظام إذن موسع ومفصل.",
"CrossCuttingConcernsExplanation": "لا تكرر نفسك لتنفيذ كل هذه الأشياء الشائعة مرارًا وتكرارًا. ركز على رمز عملك ودع برنامج ABP يقوم بأتمتة ذلك من خلال الاتفاقيات.",
"AuthenticationAuthorizationExplanation": "خيارات المصادقة والرخصة الغنية المدمجة في ASP.NET Core Identity & IdentityServer4. يوفر نظام إذن موسع ومفصل.",
"CrossCuttingConcernsExplanation": "لا تكرر نفسك لتنفيذ كل هذه الأشياء الشائعة مرارًا وتكرارًا. ركز على كود عملك ودع ABP يقوم بأتمتة ذلك من خلال الاتفاقيات.",
"DatabaseConnectionTransactionManagement": "اتصال قاعدة البيانات وإدارة المعاملات",
"CorrelationIdTracking": "تتبع معرف الارتباط",
"BundlingMinificationExplanation": "تقدم ABP نظام تجميع وتقليل بسيط وديناميكي وقوي ونمطي ومدمج.",
@ -165,18 +165,18 @@
"BasedLayeringModel": "نموذج الطبقات القائم",
"Microservice": "خدمة مصغرة",
"Compatible": "متوافق",
"MeeTTheABPCommunityInfo": "مهمتنا هي خلق بيئة حيث يمكن للمطورين مساعدة بعضهم البعض بالمقالات ، والبرامج التعليمية ، ودراسات الحالة ، وما إلى ذلك ، ومقابلة أشخاص متشابهين في التفكير.",
"JoinTheABPCommunityInfo": "انخرط في مجتمع نابض بالحياة وكن مساهمًا في إطار عمل برنامج ABP!",
"MeeTTheABPCommunityInfo": "مهمتنا هي صنع بيئة حيث يمكن للمطورين مساعدة بعضهم البعض بالمقالات، والبرامج التعليمية، ودراسات الحالة، وما إلى ذلك، ومقابلة أشخاص متشابهين في التفكير.",
"JoinTheABPCommunityInfo": "انخرط في منتدى نابض بالحياة وكن مساهمًا في إطار عمل ABP!",
"AllPosts": "جميع المقالات",
"SubmitYourPost": "إرسال مقالتك",
"DynamicClientProxyDocument": "اطلع على وثائق الوكيل الديناميكي للعميل لـ <a href=\"{0}\"> JavaScript </a> و <a href=\"{1}\"> C # </a>.",
"DynamicClientProxyDocument": "اطلع على مستندات الوكيل الديناميكي للعميل لـ <a href=\"{0}\"> JavaScript </a> و <a href=\"{1}\"> C # </a>.",
"EmailSMSAbstractionsDocument": "راجع مستندات <a href=\"{0}\"> المراسلة بالبريد الإلكتروني </a> و <a href=\"{1}\"> إرسال الرسائل القصيرة </a> للحصول على مزيد من المعلومات.",
"CreateProjectWizard": "ينشئ هذا المعالج مشروعًا جديدًا من قالب بدء التشغيل الذي تم تكوينه بشكل صحيح لبدء الانتقال إلى مشروعك.",
"TieredOption": "ينشئ حلاً متدرجًا حيث يتم فصل طبقات واجهة برمجة تطبيقات الويب و Http فعليًا. إذا لم يتم تحديده ، يتم إنشاء حل متعدد الطبقات يكون أقل تعقيدًا ومناسبًا لمعظم السيناريوهات.",
"SeparateIdentityServerOption": "يفصل جانب الخادم إلى تطبيقين: الأول مخصص لخادم الهوية والآخر مخصص لواجهة برمجة تطبيقات HTTP من جانب الخادم.",
"UseslatestPreVersion": "يستخدم أحدث نسخة تجريبية",
"ReadTheDocumentation": "<span class=\"text-primary\"> اقرأ </ span> <span class=\"text-success\"> الوثائق </ span>",
"Documentation": "توثيق",
"ReadTheDocumentation": "<span class=\"text-primary\"> اقرأ </ span> <span class=\"text-success\"> المستندات </ span>",
"Documentation": "المستندات",
"GettingStartedTutorial": "برنامج تعليمي للشروع في العمل",
"ApplicationDevelopmentTutorial": "البرنامج التعليمي لتطوير التطبيقات",
"TheStartupTemplate": "نموذج بدء التشغيل",
@ -195,50 +195,50 @@
"MultipleUIOptionsExplanation": "تم تصميم إطار العمل الأساسي كواجهة مستخدم مستقلة ويمكن أن يعمل مع أي نوع من أنظمة واجهة المستخدم ، في حين أن هناك العديد من الخيارات المدمجة والمبنية مسبقًا متوفرة خارج الصندوق.",
"MultipleDBOptionsExplanation": "يمكن أن يعمل إطار العمل مع أي مصدر بيانات ، بينما يتم تطوير ودعم مقدمي الخدمات التاليين رسميًا ؛",
"SelectLanguage": "اختار اللغة",
"LatestPostOnCommunity": "أحدث مقال عن مجتمع ABP",
"LatestPostOnCommunity": "أحدث مقال عن منتدى ABP",
"Register": "يسجل",
"IsDownloadable": "قابل للتنزيل",
"DatabaseOptions": "خيارات قاعدة البيانات",
"BackToPackagesPage": "العودة إلى صفحة الباقات",
"HowToInstall": "كيفية تثبيت",
"HowToInstall": "كيفية التثبيت",
"SeeOnNpm": "انظر على NPM",
"SeeOnNuget": "انظر على نوجيت",
"SeeOnNuget": "انظر على Nuget",
"MVCGulpCommandExplanation": "إذا كنت تستخدم واجهة مستخدم MVC (Razor Pages) ، فقم بتشغيل الأمر \"gulp\" بعد تثبيت الحزمة.",
"UsingABPCLI": "استخدام <a href=\"https://docs.abp.io/en/abp/latest/CLI\"> Abp CLI </a>",
"WithoutABPCLI": "بدون ABP CLI",
"ABPCLIModuleDependency": "يضيف Abp Cli اعتمادًا على الوحدة تلقائيًا.",
"WithoutABPCLI": "بدون واجهة سطر الأوامر ABP CLI",
"ABPCLIModuleDependency": "يضيف واجهة سطر الأوامر ABP Cli اعتمادًا على الوحدة تلقائيًا.",
"AddModuleDependency": "ثم أضف تبعية الوحدة النمطية",
"Packages": "الحزم",
"NugetPackages": "حزم نوجيت",
"NPMPackages": "حزم NPM",
"SeeDocs": "انظر المستندات",
"None": "لا أحد",
"None": "لا يوجد",
"Application": "تطبيق",
"Module": "وحدة",
"PackageName": "اسم الحزمة",
"LicenseURL": "URL الترخيص",
"LicenseURL": "رابط الرخصة",
"License": "رخصة",
"ProjectCreationSuccessMessage": "تم إنشاء مشروعك بنجاح",
"HowToRunSolution": "كيف تدير الحل الخاص بك؟",
"GettingStartedMessage": "راجع مستند البدء لمعرفة كيفية تكوين الحل وتشغيله.",
"WebAppDevTutorial": "دروس تطوير تطبيقات الويب",
"WebAppDevTutorialMessage": "انظر وثيقة البرنامج التعليمي لتطوير تطبيقات الويب للحصول على عينة تطوير خطوة بخطوة.",
"CommunityPosts": "مقالات المجتمع",
"CommunityPostMessage": "تحقق من منصة مجتمع ABP لقراءة مقالات مفيدة حول إطار عمل ABP.",
"CommunityPosts": "مقالات المنتدى",
"CommunityPostMessage": "تحقق من منصة منتدى ABP لقراءة مقالات مفيدة حول إطار عمل ABP.",
"InvestigateSolutionDetails": "تحقق من تفاصيل الحل",
"StartupTemplateDocumentationMessage": "راجع مستند نموذج بدء تشغيل التطبيق للتعرف على بنية الحل وهيكله.",
"ClientSideDevelopment": "تطوير جانب العميل",
"ClientSideDevelopmentDocumentationMessage": "راجع مستند {0} للتعرف على النقاط الأساسية لتطوير واجهة المستخدم (جانب العميل).",
"DatabaseProviderDocumentationMessage": "راجع مستند {0} للتعرف على النقاط الرئيسية لتطوير طبقة قاعدة البيانات.",
"ABPCommercialExplanationMessage": "يوفر ABP Commercial وحدات وسمات وأدوات متميزة ودعمًا لإطار عمل ABP.",
"ImplementingDDD": "تنفيذ تصميم يحركه المجال",
"DDDBookExplanation": "دليل عملي لتنفيذ التصميم المستند إلى المجال باستخدام إطار عمل ABP.",
"ImplementingDDD": "تنفيذ التصميم المُقاد بالمجال",
"DDDBookExplanation": "دليل عملي لتنفيذ التصميم المُقاد بالمجال باستخدام إطار عمل ABP.",
"Overview": "ملخص",
"DDDBookPracticalGuide": "هذا دليل عملي لتنفيذ التصميم المستند إلى المجال (DDD). بينما تستند تفاصيل التنفيذ إلى البنية الأساسية لـ ABP Framework ، يمكن تطبيق المفاهيم والمبادئ والنماذج الأساسية على أي حل ، حتى لو لم يكن حل .NET.",
"DDDBookPracticalGuide": "هذا دليل عملي لتنفيذ التصميم المُقاد بالمجال (DDD). بينما تستند تفاصيل التنفيذ إلى البنية الأساسية لإطار عمل ABP، يمكن تطبيق المفاهيم والمبادئ والنماذج الأساسية على أي حل، حتى لو لم يكن حل.NET.",
"TableOfContents": "جدول المحتويات",
"IntroductionToImplementingDDD": "مقدمة في تنفيذ التصميم على أساس المجال",
"WhatIsDDD": "ما هو المجال على أساس التصميم؟",
"Implementation": "تطبيق",
"IntroductionToImplementingDDD": "مقدمة في تنفيذ التصميم المُقاد بالمجال",
"WhatIsDDD": "ما هو التصميم المُقاد بالمجال؟",
"Implementation": "التطبيق",
"TheBigPicture": "الصورة الكبيرة",
"TheBuildingBlock": "حجر الاساس",
"ExampleUseCase": "مثال على حالة الاستخدام",
@ -256,10 +256,10 @@
"Surname": "اسم العائلة",
"CompanyName": "اسم الشركة",
"DoYouAgreePrivacyPolicy": "أوافق على <a href=\"https://account.abp.io/Account/TermsConditions\"> البنود والشروط </a> و <a href=\"https://account.abp.io/Account/Privacy \"> سياسة الخصوصية </a>.",
"Free": "حر",
"DDDEBook": "DDD الكتاب الإلكتروني",
"PracticalGuideForImplementingDDD": "هذا الكتاب هو دليل عملي لتنفيذ التصميم المستند إلى المجال باستخدام إطار عمل ABP.",
"IntroducingDDD": "تقديم تصميم يحركه المجال",
"Free": "مجاني",
"DDDEBook": "DDD الكتاب الإلكتروني التصميم المُقاد بالمجال",
"PracticalGuideForImplementingDDD": "هذا الكتاب هو دليل عملي لتنفيذ التصميم المُقاد بالمجال باستخدام إطار عمل ABP.",
"IntroducingDDD": "مقدمو للتصميم المُقاد بالمجال",
"DDDLayersAndCleanArchitecture": "طبقات DDD والعمارة النظيفة",
"LayeringOfADotnetSolution": "طبقات حل NET",
"ImplementingDDDBuildingBlocks": "تنفيذ اللبنات الأساسية DDD",
@ -267,12 +267,143 @@
"SamplesAndDiscussions": "العينات والمناقشات",
"EmailNotValid": "رجاء قم بإدخال بريد الكتروني صحيح.",
"WeWillSendYouADownloadLink": "تم إرسال ارتباط لتنزيل الكتاب الإلكتروني إلى {0}. تحقق من صندوق الوارد الخاص بك ، البريد غير المرغوب فيه أو صناديق البريد العشوائي!",
"GoHome": "اذهب للمنزل",
"GoHome": "اذهب للصفحة الرئيسية",
"InvalidFormInputs": "من فضلك ، اكتب المعلومات الصحيحة المحددة في النموذج.",
"DDDBookEmailBody": "شكرا لك. <br /> لتنزيل كتابك ، <a href=\"{0}\"> انقر هنا </a>.",
"SubscribeToNewsletter": "اشترك في النشرة الإخبارية للحصول على معلومات حول الأحداث في منصة ABP.IO ، مثل الإصدارات الجديدة والمقالات والعروض والمزيد.",
"FirstEdition": "الطبعة الأولى",
"ThankYou": "شكرا لك!",
"CheckboxMandatory": "تحتاج إلى التحقق من هذا للمتابعة!"
"CheckboxMandatory": "تحتاج إلى التحقق من هذا للمتابعة!",
"UserInterface": "واجهة المستخدم",
"APIGateway": "بوابة API",
"Database": "قاعدة البيانات",
"Saas": "Saas",
"OpenSourceWebApp": "مفتوح <span class=\"forever\">المصدر </span> <br/> تطبيق ويب",
"Framework": "إطار العمل",
"AuditLoggingExplanation": "تتبع تلقائيًا جميع العمليات وتغييرات البيانات في نظامك.",
"AbpNewCommandExplanation": "ينشئ حلولًا جديدة باستخدام عارضات بدء تشغيل ABP.",
"AbpAddModuleCommandExplanation": "يثبت وحدات التطبيق سابقة الإنشاء على الحل الخاص بك",
"AbpUpdateCommandExplanation": "يقوم تلقائيًا بتحديث جميع حزم NuGet و NPM المتعلقة بـ ABP في الحل الخاص بك.",
"ExploreAllCLICommands": "استكشف جميع أوامر CLI",
"ExploreDocumentationAndGuides": "استكشف المستندات والأدلة الشاملة.",
"Documentations": "المستندات",
"Views": "المشاهدات",
"EnterYouEmailToGetNews": "أدخل بريدك الإلكتروني للحصول على آخر الأخبار حول إطار عمل ABP",
"Tiered": "متدرج",
"SeparateIdentityServer": "خادم هوية منفصل",
"ProgressiveWebApplication": "تطبيق ويب تقدمي",
"Preview": "معاينة",
"CreateANewSolution": "قم بإنشاء حل جديد",
"ABPFrameworkFeatures": "إطار عمل ABP <span class=\"gradient-framework\">ميزات</span>",
"Commercial": "تجاري",
"ThirdPartyTools": "أدوات الطرف الثالث",
"Back": "عودة",
"Community": "المنتدى",
"SeeMore": "رؤية المزيد",
"DetailsOfTheEBook": "تفاصيل الكتاب الإلكتروني",
"JoinOurMarketingNewsletter": "انضم إلى النشرة الإخبارية التسويقية",
"FrameworkNewsletterConfirmationMessage": "أنا أوافق على <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/TermsConditions\">البنود و الظروف</a> و<a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">سياسة الخصوصية</a>.",
"GetYourFreeEBook": "احصل على <span class=\"gradient-framework d-block\">كتابك إلالكتروني المجاني DDD</span>",
"EverythingYouNeedToKnow": "كل ما تحتاج إلى معرفته.",
"PreOrderNow": "اطلب مسبقًا الآن",
"UITheming": "سمات واجهة المستخدم",
"UIThemingExplanation": "أنشئ سمات وتخطيطات لواجهة مستخدم قابلة لإعادة الاستخدام أو استخدم أحد سمات واجهة المستخدم المبنية مسبقًا.",
"DataFilteringExplanation2": "تصفية تلقائيًا عند الاستعلام من قاعدة البيانات لتنفيذ أنماط بسهولة مثل الحذف الناعم والتعددية.",
"NeedHelp": "تحتاج مساعدة؟",
"GiveYourProjectAName": "امنح مشروعك اسما",
"SelectProjectType": "حدد نوع المشروع",
"SelectUIFramework": "حدد إطار عمل واجهة المستخدم",
"SelectDatabaseProvider": "حدد موفر قاعدة البيانات",
"SelectDatabaseManagementSystem": "حدد نظام إدارة قواعد البيانات",
"InstallingTheABPCLI": "تثبيت واجهة سطر الأوامر ABP CLI",
"CreateYourProjectNow": "أنشئ مشروعك الآن",
"OrderOn": "اطلب على {0}",
"DownloadFreeDDDBook": "تنزيل كتاب DDD المجاني",
"WhatIsABPFramework": "ما هو إطار عمل ABP؟",
"TenantDatabase": "قاعدة بيانات المستأجر {0}",
"SharedDatabase": "قاعدة بيانات مشتركة",
"ConnectionResolver": "محلل الاتصال",
"TenantBasedDataFilter": "عامل تصفية بيانات المستأجر",
"ApplicationCode": "كود التطبيق",
"TenantResolution": "قرار المستأجر",
"TenantUser": "مستخدم المستأجر {0}",
"CardTitle": "عنوان البطاقة",
"View": "العرض",
"Model": "النموذج",
"Email": "البريد الإلكتروني",
"Password": "كلمة المرور",
"Address": "العنوان",
"Gender": "نوع الجنس",
"Male": "ذكر",
"Female": "أنثى",
"Submit": "تسليم",
"Unspecified": "غير محدد",
"StaticFileMiddleware": "البرامج الوسيطة للملفات الثابتة",
"RazorViewEngine": "محرك عرض Razor",
"PhysicalFiles": "الملفات المادية (wwwroot)",
"EmbeddedFiles": "الملفات المضمنة (DLL)",
"DynamicFiles": "الملفات الديناميكية (الذاكرة)",
"BuildSolutionsWithAbp": "أنشئ حلول .NET قابلة للصيانة باتباع أفضل ممارسات تطوير البرامج باستخدام ABP.",
"BuyOnAmazon": "شراء على أمازون",
"BuyOnPackt": "شراء على باكت",
"Discounted": "مخفضة",
"MasteringAbpFramework_Book_KeyFeatures": "الميزات الرئيسية",
"MasteringAbpFramework_Book_Key_Features_Description_1": "قم ببناء حلول برمجية قوية وقابلة للصيانة وموحدة وقابلة للتطوير باستخدام ABP إطار عمل.",
"MasteringAbpFramework_Book_Key_Features_Description_2": "تعرف على كيفية تنفيذ مبادئ صلبة والتصميم المُقاد بالمجال في تطبيقات الويب الخاصة بك.",
"MasteringAbpFramework_Book_Key_Features_Description_3": "اكتشف كيف يعمل إطار عمل ABP على تسريع دورة التطوير عن طريق أتمتة المهام المتكررة.",
"MasteringAbpFramework_Book_Description": "وصف الكتاب",
"MasteringAbpFramework_Book_Description_Details_1": "ABP إطار عمل هو بنية أساسية كاملة لإنشاء تطبيقات ويب حديثة باتباع أفضل \n ممارسات واتفاقيات تطوير البرامج. مع إطار العمل والنظام البيئي عالي المستوى لـ ABP ، يمكنك\n تنفيذ مبدأ عدم تكرار نفسك (DRY) والتركيز على كود عملك.",
"MasteringAbpFramework_Book_Description_Details_2": "هذا الكتاب الذي كتبه مبتكر ABP إطار عمل، سيساعدك على اكتساب فهم كامل\n للإطار وتقنيات تطوير تطبيقات الويب الحديثة. من خلال التفسيرات خطوة بخطوة للمفاهيم الأساسية\n والأمثلة العملية، ستفهم متطلبات حل الويب الحديث وكيف يجعل ABP\n إطار عمل تطوير الحلول الخاصة بك أمرًا ممتعًا. ستكتشف المتطلبات\n المشتركة لتطوير تطبيقات الويب الخاصة بالمؤسسات واستكشاف البنية التحتية التي توفرها ABP. في جميع\n أنحاء الكتاب ، ستتعامل مع أفضل ممارسات تطوير البرامج لبناء حلول ويب قابلة للصيانة\n وقابلة للصيانة.",
"MasteringAbpFramework_Book_Description_Details_3": "بنهاية هذا الكتاب ، ستتمكن من إنشاء حل ويب كامل يسهل\n تطويره وصيانته واختباره.",
"MasteringAbpFramework_Book_WhatYouWillLearn": "ماذا ستتعلم",
"MasteringAbpFramework_Book_What_You_Will_Learn_1": "قم بإعداد بيئة التطوير وابدأ مع إطار عمل ABP.",
"MasteringAbpFramework_Book_What_You_Will_Learn_2": "اعمل مع Entity Framework Core وMongoDB لتطوير طبقة الوصول إلى البيانات الخاصة بك.",
"MasteringAbpFramework_Book_What_You_Will_Learn_3": "فهم الاهتمامات المتداخلة وكيف تعمل ABP على أتمتة المهام المتكررة.",
"MasteringAbpFramework_Book_What_You_Will_Learn_4": "تحكم في تنفيذ التصميم المستند إلى المجال باستخدام إطار عمل ABP.",
"MasteringAbpFramework_Book_What_You_Will_Learn_5": "قم ببناء صفحات ومكونات واجهة المستخدم باستخدام ASP.NET Core MVC (Razor Pages) و Blazor.",
"MasteringAbpFramework_Book_What_You_Will_Learn_6": "العمل مع التعددية لإنشاء تطبيقات ويب معيارية.",
"MasteringAbpFramework_Book_What_You_Will_Learn_7": "افهم النموذجية وأنشئ وحدات تطبيق قابلة لإعادة الاستخدام.",
"MasteringAbpFramework_Book_What_You_Will_Learn_8": "اكتب اختبارات الوحدة والتكامل وواجهة المستخدم باستخدام إطار عمل ABP.",
"MasteringAbpFramework_Book_WhoIsThisBookFor": "لمن هذا الكتاب",
"MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "هذا الكتاب مخصص لمطوري الويب الذين يرغبون في تعلم معماريات البرامج وأفضل الممارسات لبناء\n حلول قائمة على الويب يمكن صيانتها باستخدام تقنيات Microsoft وإطار عمل ABP. المعرفة الأساسية لـ C #\n و ASP.NET Core ضرورية للبدء في هذا الكتاب.",
"ComputersAndTechnology": "الكمبيوتر والتكنولوجيا",
"BuildingMicroserviceSolutions": "بناء حلول الخدمات المصغرة",
"MicroserviceBookPracticalGuide": "هذا الكتاب هو دليل مرجعي لتطوير وإدارة التطبيقات القائمة على الخدمات المصغرة باستخدام إطار عمل ABP. يشير إلى the <strong> تطبيق مرجعي لعينة خدمة مصغرة من .NET:</strong>: eShopOnContainers ويناقش التصميم المعماري وأساليب التنفيذ باستخدام إطار عمل ABP. بنهاية هذا الكتاب ، ستتعرف على كيفية تعامل ABP مع تعقيدات الخدمات المصغرة الشائعة مثل التفويض والمعاملات الموزعة والاتصالات بين الخدمات المصغرة والنشر وما إلى ذلك.",
"IntroducingTheSolution": "نقدم حل eShopOnAbp",
"RunningTheSolution": "تشغيل الحل",
"UnderstandingTheAuthenticationSystem": "فهم نظام المصادقة",
"ExploringTheApplications": "استكشاف التطبيقات",
"UnderstandingTheAPIGateways": "فهم بوابات API",
"DevelopingTheMicroservices": "تطوير الخدمات المصغرة",
"UnderstandingTheInfrastructure": "فهم البنية التحتية",
"DiggingInTheUseCases": "التنقيب في وقائع الاستخدام",
"DeployingTheSolution": "نشر الحل",
"ThisBookIsInDraftStageAndIsNotCompletedYet": "هذا الكتاب في مرحلة المسودة ولم يكتمل بعد.",
"Authors": "المؤلفون",
"MicroserviceEBook": "الكتاب الإلكتروني للخدمة المصغرة",
"SelectUITheme": "حدد سمة واجهة المستخدم",
"LeptonXLiteTheme": "LeptonX Lite سمة",
"BasicTheme": "Basic سمة",
"LeptonXLiteThemeInfo": " سمة Bootstrap UI عصرية وأنيقة. مثالي إذا كنت ترغب في الحصول على سمة واجهة مستخدم جاهزة للإنتاج. هذا هو أحدث موضوع وهو الافتراضي.",
"BasicThemeInfo": "سمة واجهة مستخدم بسيطة بألوان وأنماط Bootstrap بسيطة. مثالي إذا كنت ستقوم ببناء سمة واجهة المستخدم الخاصة بك.",
"SeeDocumentation": "انظر الى <a href='{0}' target='_blank'>المستندات</a>.",
"SeeFullScreen": "<a href='{0}' target='_blank'>🖼️ انظر الى الصورة</a>",
"BuildingMicroserviceSolutionsShortDescription": "هذا الكتاب هو دليل مرجعي لتطوير وإدارة التطبيقات القائمة على الخدمات المصغرة باستخدام إطار عمل ABP.",
"InstallAbpCliMessage": "قم بتثبيت واجهة سطر الأوامر ABP CLI في محطة سطر الأوامر، إذا لم تكن قد قمت بتثبيتها من قبل:",
"Terminal": "محطة سطر الأوامر",
"Copy": "نسخ",
"RunTheFollowingCommand": "قم بتشغيل الأمر التالي في محطة سطر الأوامر:",
"ChangeSolutionOptionsBelow": "يمكنك تغيير خيارات الحل أدناه.",
"MultiLayerApplication": "تطبيق <br>متعدد الطبقات",
"MultiLayerApplicationExplanation1": "يُنشئ حلاً متعدد الطبقات يعتمد على ممارسات التصميم المُقاد بالمجال.",
"MultiLayerApplicationExplanation2": "يوصى به للمشاريع طويلة الأجل التي تحتاج إلى قاعدة بيانات قابلة للصيانة والتوسيع.",
"SingleLayerApplication": "تطبيق <br>أحادي الطبقة",
"SingleLayerApplicationExplanation1": "يقوم بإنشاء تطبيق ويب أحادي الطبقة. ",
"SingleLayerApplicationExplanation2": "موصى به لبناء تطبيق بمعمارية أبسط وأسهل في الفهم.",
"ApplicationModule": "وحدة <br>التطبيق",
"SeeTheScreenshot": "انظر الى الصورة",
"Details": "التفاصيل",
"ApplicationModuleExplanation1": "إنشاء حل وحدة تطبيق ذات طبقات كاملة وقابلة لإعادة الاستخدام.",
"ApplicationModuleExplanation2": "يمكنك استخدام هذا الخيار لإنشاء وحدات نمطية لتطبيقك المعياري."
}
}

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

@ -406,6 +406,16 @@
"SingleLayerApplicationExplanation1": "Creates a single-layer web application. ",
"SingleLayerApplicationExplanation2": "Recommended for building an application with a simpler and easy to understand architecture.",
"ApplicationModule": "Application <br>Module",
"SeeTheScreenshot": "See the screenshot"
"SeeTheScreenshot": "See the screenshot",
"ApplicationModuleExplanation1": "Creates a reusable, fully layered application module solution.",
"ApplicationModuleExplanation2": "You can use this option to create modules for your modular application.",
"Expert_": "Expert",
"Partner_": "Partnership",
"WebSite": "Web Site",
"Expert_Year": "Expertise Year",
"CompanyInfo": "Company Info",
"Date": "Date",
"WhoWeAre_Partner": "Who We Are",
"WhoWeAre_Expert": "About Me"
}
}

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

@ -372,8 +372,42 @@
"MasteringAbpFramework_Book_WhoIsThisBookFor": "这本书是给谁看的",
"MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "本书适用于希望学习软件架构和最佳实践的 Web 开发人员,以使用 Microsoft 技术和 ABP 框架构建\n 可维护的基于 Web 的解决方案。 C#\n 和 ASP.NET Core 的基本知识是开始阅读本书所必需的。",
"ComputersAndTechnology": "计算机与技术",
"BuildingMicroserviceSolutions": "构建微服务解决方案",
"MicroserviceBookPracticalGuide": "本书是使用 ABP 框架开发和管理基于微服务的应用程序的参考指南。 它引用了 <strong>.NET 微服务示例参考应用程序</strong>:eShopOnContainers,并讨论了使用 ABP 框架的架构设计和实现方法。 读完本书,您将了解 ABP 如何处理常见的微服务复杂性,例如授权、分布式事务、微服务间通信、部署等。",
"IntroducingTheSolution": "介绍 eShopOnAbp 解决方案",
"RunningTheSolution": "运行解决方案",
"UnderstandingTheAuthenticationSystem": "了解身份验证系统",
"ExploringTheApplications": "探索应用",
"UnderstandingTheAPIGateways": "了解 API 网关",
"DevelopingTheMicroservices": "开发微服务",
"UnderstandingTheInfrastructure": "了解基础设施",
"DiggingInTheUseCases": "挖掘用例",
"DeployingTheSolution": "部署解决方案",
"ThisBookIsInDraftStageAndIsNotCompletedYet": "这本书正在草案阶段,还没有完成。",
"SelectUITheme": "选择 UI 主题"
"Authors": "作者",
"MicroserviceEBook": "微服务电子书",
"SelectUITheme": "选择 UI 主题",
"LeptonXLiteTheme": "LeptonX Lite 主题",
"BasicTheme": "基本主题",
"LeptonXLiteThemeInfo": " 现代时尚的 Bootstrap UI 主题。 如果你想要一个生产就绪的 UI 主题,这是理想的选择。 这是最新的主题,也是默认主题。",
"BasicThemeInfo": "具有简单 Bootstrap 颜色和样式的极简 UI 主题。 如果您要构建自己的 UI 主题,则非常适合。",
"SeeDocumentation": "请参阅 <a href='{0}' target='_blank'>文档</a>.",
"SeeFullScreen": "<a href='{0}' target='_blank'>🖼️ 如截图所示</a>",
"BuildingMicroserviceSolutionsShortDescription": "本书是使用 ABP 框架开发和管理基于微服务的应用程序的参考指南。",
"InstallAbpCliMessage": "如果之前没有安装,请在命令行终端中安装 ABP CLI:",
"Terminal": "终端",
"Copy": "复制",
"RunTheFollowingCommand": "在命令行终端中运行以下命令:",
"ChangeSolutionOptionsBelow": "您可以更改下面的解决方案选项。",
"MultiLayerApplication": "多层<br>应用",
"MultiLayerApplicationExplanation1": "基于领域驱动设计实践创建完全分层的解决方案。",
"MultiLayerApplicationExplanation2": "推荐用于需要可维护和可扩展代码库的长期项目。",
"SingleLayerApplication": "单层<br>应用",
"SingleLayerApplicationExplanation1": "创建单层 Web 应用程序。 ",
"SingleLayerApplicationExplanation2": "推荐用于构建具有更简单且易于理解的体系结构的应用程序。",
"ApplicationModule": "应用程序模块",
"SeeTheScreenshot": "如截图所示",
"ApplicationModuleExplanation1": "创建可重用的、完全分层的应用程序模块解决方案。",
"ApplicationModuleExplanation2": "您可以使用此选项为您的模块化应用程序创建模块。"
}
}
}

151
cSpell.json

@ -1,151 +0,0 @@
{
"version": "0.2",
"language": "en",
"words": [
"ABP's",
"abpframework",
"Antiforgery",
"appsettings",
"aspnet",
"aspnetcore",
"Autofac",
"automagically",
"Blazor",
"CQRS",
"crossfade",
"Dapr",
"Datagrid's",
"Datatable",
"datepicker",
"dismissable",
"dockerized",
"entrypoints",
"findability",
"hoverable",
"Iddict",
"IntelliCode",
"Keysize",
"Linq",
"Microservices",
"middlewares",
"Minifier",
"multitenancy",
"multitenant",
"Navs",
"Newtonsoft",
"Npgsql",
"oidc",
"overridable",
"Parameterless",
"Passwordless",
"PKCE",
"preconfigured",
"proxying",
"redirections",
"scrollbars",
"signin",
"Templating",
"textboxes",
"toolset",
"unsubscription",
"Xunit"
],
"ignoreWords": [
"Aliyun",
"Allibone",
"Blazorise",
"Boutwell",
"Cmskit",
"connectionstrings",
"Devart",
"Formik",
"Halil",
"Hanselman",
"hikalkan",
"Ibrahim",
"İbrahim",
"Kalkan",
"Kirti",
"Kommunity",
"Kulkarni",
"Luxon",
"malihu",
"Malik",
"Masis",
"Minio",
"NGXS",
"NSWAG",
"Scriban",
"Serilog",
"Shoudly",
"Shouldly",
"Sweetalert",
"Syncfusion",
"Telerik",
"Timeago",
"Toastr",
"Volo",
"Volosoft",
"Xeevis"
],
"patterns": [
{
"name": "Markdown links",
"pattern": "\\((.*)\\)",
"description": ""
},
{
"name": "Markdown code blocks",
"pattern": "/^(\\s*`{3,}).*[\\s\\S]*?^\\1/gmx",
"description": "Taken from the cSpell example at https://cspell.org/configuration/patterns/#verbose-regular-expressions"
},
{
"name": "Inline code blocks",
"pattern": "\\`([^\\`\\r\\n]+?)\\`",
"description": "https://stackoverflow.com/questions/41274241/how-to-capture-inline-markdown-code-but-not-a-markdown-code-fence-with-regex"
},
{
"name": "Link contents",
"pattern": "\\<a(.*)\\>",
"description": ""
},
{
"name": "Snippet references",
"pattern": "-- snippet:(.*)",
"description": ""
},
{
"name": "Snippet references 2",
"pattern": "\\<\\[sample:(.*)",
"description": "another kind of snippet reference"
},
{
"name": "Multi-line code blocks",
"pattern": "/^\\s*```[\\s\\S]*?^\\s*```/gm"
},
{
"name": "HTML Tags",
"pattern": "<[^>]*>",
"description": "Reference: https://stackoverflow.com/questions/11229831/regular-expression-to-remove-html-tags-from-a-string"
},
{
"name": "Markdown Image",
"pattern": "!\\[(.*)\\]\\((.*)\\)"
}
],
"ignoreRegExpList": [
"Markdown links",
"Markdown code blocks",
"Inline code blocks",
"Link contents",
"Snippet references",
"Snippet references 2",
"Multi-line code blocks",
"HTML Tags",
"Markdown Image"
],
"ignorePaths": [
"**/*Release/Post.md",
"**/*Preview/POST.md"
]
}

2
common.props

@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>7.0.3</Version>
<Version>7.1.0-rc.2</Version>
<NoWarn>$(NoWarn);CS1591;CS0436</NoWarn>
<PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>https://abp.io/</PackageProjectUrl>

49
docs/en/Application-Startup.md

@ -204,6 +204,7 @@ We've passed a lambda method to configure the `ApplicationName` option. Here's a
* `ApplicationName`: A human-readable name for the application. It is a unique value for an application.
* `Configuration`: Can be used to setup the [application configuration](Configuration.md) when it is not provided by the hosting system. It is not needed for ASP.NET Core and other .NET hosted applications. However, if you've used `AbpApplicationFactory` with an internal service provider, you can use this option to configure how the application configuration is built.
* `Environment`: Environment name for the application.
* `PlugInSources`: A list of plugin sources. See the [Plug-In Modules documentation](PlugIn-Modules) to learn how to work with plugins.
* `Services`: The `IServiceCollection` object that can be used to register service dependencies. You generally don't need that, because you configure your services in your [module class](Module-Development-Basics.md). However, it can be used while writing extension methods for the `AbpApplicationCreationOptions` class.
@ -253,6 +254,54 @@ The `IAbpApplication` interface extends the `IApplicationInfoAccessor` interface
`IAbpApplication` is disposable. Always dispose of it before exiting your application.
## IAbpHostEnvironment
Sometimes, while creating an application, we need to get the current hosting environment and take actions according to that. In such cases, we can use some services such as [IWebHostEnvironment](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.iwebhostenvironment?view=aspnetcore-7.0) or [IWebAssemblyHostEnvironment](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.webassembly.hosting.iwebassemblyhostenvironment) provided by .NET, in the final application.
However, we can not use these services in a class library, which is used by the final application. ABP Framework provides the `IAbpHostEnvironment` service, which allows you to get the current environment name whenever you want. `IAbpHostEnvironment` is used by the ABP Framework in several places to perform specific actions by the environment. For example, ABP Framework reduces the cache duration on the **Development** environment for some services.
`IAbpHostEnvironment` obtains the current environment name by the following order:
1. Gets and sets the environment name if it's specified in the `AbpApplicationCreationOptions`.
2. Tries to obtain the environment name from the `IWebHostEnvironment` or `IWebAssemblyHostEnvironment` services for ASP.NET Core & Blazor WASM applications if the environment name isn't specified in the `AbpApplicationCreationOptions`.
3. Sets the environment name as **Production**, if the environment name is not specified or can not be obtained from the services.
You can configure the `AbpApplicationCreationOptions` [options class](Options.md) while creating the ABP application and set an environment name to its `Environment` property. You can find the `AddApplication` or `AddApplicationAsync` call in your solution (typically in the `Program.cs` file), and set the `Environment` option as shown below:
```csharp
await builder.AddApplicationAsync<OrderingServiceHttpApiHostModule>(options =>
{
options.Environment = Environments.Staging; //or directly set as "Staging"
});
```
Then, whenever you need to get the current environment name or check the environment, you can use the `IAbpHostEnvironment` interface:
```csharp
public class MyDemoService
{
private readonly IAbpHostEnvironment _abpHostEnvironment;
public MyDemoService(IAbpHostEnvironment abpHostEnvironment)
{
_abpHostEnvironment = abpHostEnvironment;
}
public void MyMethod()
{
var environmentName = _abpHostEnvironment.EnvironmentName;
if (_abpHostEnvironment.IsDevelopment()) { /* ... */ }
if (_abpHostEnvironment.IsStaging()) { /* ... */ }
if (_abpHostEnvironment.IsProduction()) { /* ... */ }
if (_abpHostEnvironment.IsEnvironment("custom-environment")) { /* ... */ }
}
}
```
## .NET Generic Host & ASP.NET Core Integrations
`AbpApplicationFactory` can create a standalone ABP application container without any external dependency. However, in most cases, you will want to integrate it with [.NET's generic host](https://learn.microsoft.com/en-us/dotnet/core/extensions/generic-host) or ASP.NET Core. For such usages, ABP provides built-in extension methods to easily create an ABP application container that is well-integrated to these systems.

207
docs/en/Blog-Posts/2023-02-08 v7_1_Preview/POST.md

@ -0,0 +1,207 @@
# ABP.IO Platform 7.1 RC Has Been Released
Today, we are happy to release the [ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) version **7.1 RC** (Release Candidate). This blog post introduces the new features and important changes in this new version.
Try this version and provide feedback for a more stable version of ABP v7.1! Thanks to all of you.
## Get Started with the 7.1 RC
Follow the steps below to try version 7.1.0 RC today:
1) **Upgrade** the ABP CLI to version `7.1.0-rc.1` using a command line terminal:
````bash
dotnet tool update Volo.Abp.Cli -g --version 7.1.0-rc.1
````
**or install** it if you haven't before:
````bash
dotnet tool install Volo.Abp.Cli -g --version 7.1.0-rc.1
````
2) Create a **new application** with the `--preview` option:
````bash
abp new BookStore --preview
````
See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all the available options.
> You can also use the [Get Started](https://abp.io/get-started) page to generate a CLI command to create a new application.
You can use any IDE that supports .NET 7.x, like [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/).
## Migrating to 7.1
This version doesn't introduce any breaking changes. However, Entity Framework developers may need to add a new code-first database migration to their projects since we made some improvements to the existing entities of some application modules.
## What's New with ABP Framework 7.1?
In this section, I will introduce some major features released in this version. In addition to these features, so many enhancements have been made in this version too.
Here is a brief list of the titles explained in the next sections:
* Blazor WASM option added to Application Single Layer Startup Template
* Introducing the `IHasEntityVersion` interface and `EntitySynchronizer` base class
* Introducing the `DeleteDirectAsync` method for the `IRepository` interface
* Introducing the `IAbpHostEnvironment` interface
* Improvements on the eShopOnAbp project
* Others
### Blazor WASM option added to Application Single Layer Startup Template
We've created the [Application (Single Layer) Startup Template](https://docs.abp.io/en/abp/7.1/Startup-Templates/Application-Single-Layer) in v5.2 with three UI types: Angular, Blazor Server and MVC. At the moment, we didn't provide UI option for Blazor, because it required 3 projects at least (server-side, client-side and shared library between these two projects).
In this version, we've added the Blazor WASM option to the **Application (Single Layer) Startup Template**. It still contains three projects (`blazor`, `host`, and `contracts`) but hosted by a single `host` project.
You can use the following CLI command to create an `app-nolayers` template with the Blazor UI as the UI option:
```bash
abp new TodoApp -t app-nolayers -u blazor --version 7.1.0-rc.1
```
> You can check the [Quick Start documentation](https://docs.abp.io/en/abp/7.1/Tutorials/Todo/Single-Layer/Index?UI=Blazor&DB=EF) for a quick start with this template.
### Introducing the `IHasEntityVersion` interface and `EntitySynchronizer` base class
Entity synchronization is an important concept, especially in distributed applications and module development. If we have an entity that is related to other modules, we need to align/sync their data once the entity changes and versioning entity changes can also be good, so we can know whether they're synced or not.
In this version, [@gdlcf88](https://github.com/gdlcf88) made a great contribution to the ABP Framework and introduced the `IHasEntityVersion` interface which adds **auto-versioning** to entity classes and `EntitySynchronizer` base class to **automatically sync an entity's properties from a source entity**.
You can check the issue and documentation from the following links for more info:
- [Issue: Entity synchronizers and a new EntityVersion audit property](https://github.com/abpframework/abp/issues/14196)
- [Versioning Entities](https://docs.abp.io/en/abp/7.1/Entities#versioning-entities)
- [Distributed Event Bus - Entity Synchronizer](https://docs.abp.io/en/abp/7.1/Distributed-Event-Bus#entity-synchronizer)
> Note: The entities of some modules from the ABP Framework have implemented the `IHasEntityVersion` interface. Therefore, if you are upgrading your application from an earlier version, you need to create a new migration and apply it to your database.
### Introducing the `DeleteDirectAsync` method for the `IRepository` interface
EF 7 introduced a new [`ExecuteDeleteAsync`](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#executeupdate-and-executedelete-bulk-updates) method that deletes entities without involving the change tracker into the process. Therefore, it's much faster.
We've added the `DeleteDirectAsync` method to the `IRepository<>` interface to take the full power of EF 7. It deletes all entities that fit the given predicate. It directly deletes entities from the database, without fetching them. Therefore, some features (like **soft-delete**, **multi-tenancy**, and **audit logging)** won't work, so use this method carefully when you need it. And use the `DeleteAsync` method if you need those features.
### Introducing the `IAbpHostEnvironment` interface
Sometimes, while creating an application, we need to get the current hosting environment and take actions according to that. In such cases, we can use some services such as [IWebHostEnvironment](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.iwebhostenvironment?view=aspnetcore-7.0) or [IWebAssemblyHostEnvironment](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.webassembly.hosting.iwebassemblyhostenvironment) provided by .NET, in the final application.
However, we can not use these services in a class library, which is used by the final application. ABP Framework provides the `IAbpHostEnvironment` service, which allows you to get the current environment name whenever you want. `IAbpHostEnvironment` is used by the ABP Framework in several places to perform specific actions by the environment. For example, ABP Framework reduces the cache duration on the **Development** environment for some services.
**Usage:**
```csharp
public class MyService
{
private readonly IAbpHostEnvironment _abpHostEnvironment;
public MyService(IAbpHostEnvironment abpHostEnvironment)
{
_abpHostEnvironment = abpHostEnvironment;
}
public void MyMethod()
{
//getting the current environment name
var environmentName = _abpHostEnvironment.EnvironmentName;
//check for the current environment
if (_abpHostEnvironment.IsDevelopment()) { /* ... */ }
}
}
```
You can inject the `IAbpHostEnvironment` into your service and get the current environment by using its `EnvironmentName` property. You can also check the current environment by using its extension methods such as `IsDevelopment()`.
> Check the [ABP Application Startup](https://docs.abp.io/en/abp/7.1/Application-Startup) documentation for more information.
### Improvements on the eShopOnAbp project
K8s and Docker configurations have been made within this version (Dockerfiles and helm-charts have been added and image build scripts have been updated). See [#14083](https://github.com/abpframework/abp/issues/14083) for more information.
### Others
* Referral Links have been added to the CMS Kit Comment Feature (optional). You can specify common referral links (such as "nofollow" and "noreferrer") for links in the comments. See [#15458](https://github.com/abpframework/abp/issues/15458) for more information.
* ReCaptcha verification has been added to the CMS Kit Comment Feature (optional). You can enable ReCaptcha support to enable protection against bots. See the [documentation](https://docs.abp.io/en/abp/7.1/Modules/Cms-Kit/Comments) for more information.
* In the development environment, it is a must to reduce cache durations for some points. We typically don't have to invalidate the cache manually or wait on it for a certain time to be invalidated. For that purpose, we have reduced the cache durations for some points on the development environment. See [#14842](https://github.com/abpframework/abp/pull/14842) for more information.
## What's New with ABP Commercial 7.1?
We've also worked on [ABP Commercial](https://commercial.abp.io/) to align the new features and changes made in the ABP Framework. The following sections introduce a few new features coming with ABP Commercial 7.1.
### Blazor WASM option added to Application Single Layer Pro Startup Template
The [**Application (Single Layer) Startup Template**](https://docs.abp.io/en/commercial/latest/startup-templates/application-single-layer/index) with Blazor UI is also available for ABP Commercial customers with this version as explained above.
You can use the following CLI command to create an `app-nolayers-pro` template with Blazor UI as the UI option:
```bash
abp new TodoApp -t app-nolayers-pro -u blazor --version 7.1.0-rc.1
```
You can also create an `app-nolayers-pro` template with Blazor UI via ABP Suite:
![](suite-blazor-wasm-nolayers.png)
### Suite - MAUI Blazor Code Generation
We provided a new UI option "MAUI Blazor" for the `app-pro` template in the previous version and it's possible to create a `maui-blazor` application with both ABP CLI and ABP Suite.
You can create an `app-pro` template with the MAUI Blazor as the UI option with the following ABP CLI command:
```bash
abp new Acme.BookStore -t app-pro -u maui-blazor
```
In this version, we implemented the code generation for MAUI Blazor. You can create and generate CRUD pages for this new UI option as you do in other UI types.
> Note: MAUI Blazor is currently only available with the `app-pro` template.
### SaaS Module - Allowing entering a username while impersonating the tenant
In the previous versions, we were able to impersonate a tenant from the [SaaS Module's Tenant Management UI](https://docs.abp.io/en/commercial/7.1/modules/saas#tenant-management). There was a constraint in this approach, which forced us to only impersonate the "admin" user. However, the tenant might change the admin user's username, or we may want to impersonate another user of the tenant.
Thus, with this version, we decided to allow the impersonation of the tenant by the specified username.
*You can click on the "Login with this tenant" action button:*
![](saas-impersonation-1.png)
*Then, Specify the admin name of the tenant:*
![](saas-impersonation-2.png)
## Community News
### New ABP Community Posts
* [Sergei Gorlovetsky](https://community.abp.io/members/Sergei.Gorlovetsky) has created two new community articles:
* [Why ABP Framework is one of the best tools for migration from legacy MS Access systems to latest Web app](https://community.abp.io/posts/why-abp-framework-is-one-of-the-best-tools-for-migration-from-legacy-ms-access-systems-to-latest-web-app-7l39eof0)
* [ABP Framework — 5 steps Go No Go Decision Tree](https://community.abp.io/posts/abp-framework-5-steps-go-no-go-decision-tree-2sy6r2st)
* [Onur Pıçakcı](https://github.com/onurpicakci) has created his first ABP community article that explains how to contribute to ABP Framework. You can read it 👉 [here](https://community.abp.io/posts/how-to-contribute-to-abp-framework-46dvzzvj).
* [Maliming](https://github.com/maliming) has created a new community article to show how to convert create/edit modals to a page. You can read it 👉 [here](https://community.abp.io/posts/converting-createedit-modal-to-page-4ps5v60m).
We thank you all. We thank all the authors for contributing to the [ABP Community platform](https://community.abp.io/).
### Volosoft Attended NDC London 2023
![](ndc-london.png)
Core team members of the ABP Framework, [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) and [Alper Ebicoglu](https://twitter.com/alperebicoglu) attended [NDC London 2023](https://ndclondon.com/) from the 23rd to the 27th of January.
### Community Talks 2023.1: LeptonX Customization
![](community-talks-conver-image.png)
In this episode of ABP Community Talks, 2023.1; we'll talk about **LeptonX Customization**. We will dive into the details and show you how to customize the [LeptonX Theme](https://leptontheme.com/) with examples.
The event will be live on Thursday, February 16, 2023 (20:00 - 21:00 UTC).
> Register to listen and ask your questions now 👉 https://kommunity.com/volosoft/events/abp-community-talks-20231-leptonx-customization-03f9fd8c.
## Conclusion
This version comes with some new features and a lot of enhancements to the existing features. You can see the [Road Map](https://docs.abp.io/en/abp/7.1/Road-Map) documentation to learn about the release schedule and planned features for the next releases. Please try the ABP v7.1 RC and provide feedback to help us release a more stable version.
Thanks for being a part of this community!

BIN
docs/en/Blog-Posts/2023-02-08 v7_1_Preview/community-talks-conver-image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
docs/en/Blog-Posts/2023-02-08 v7_1_Preview/cover-image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
docs/en/Blog-Posts/2023-02-08 v7_1_Preview/ndc-london.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

BIN
docs/en/Blog-Posts/2023-02-08 v7_1_Preview/saas-impersonation-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
docs/en/Blog-Posts/2023-02-08 v7_1_Preview/saas-impersonation-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
docs/en/Blog-Posts/2023-02-08 v7_1_Preview/suite-blazor-wasm-nolayers.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

1
docs/en/CLI.md

@ -138,6 +138,7 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample
* `--ui` or `-u`: Specifies the UI framework. Default framework is `mvc`. Available frameworks:
* `mvc`: ASP.NET Core MVC.
* `angular`: Angular UI.
* `blazor`: Blazor UI.
* `blazor-server`: Blazor Server UI.
* `none`: Without UI.
* `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers:

129
docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md

@ -0,0 +1,129 @@
# How to add a custom grant type in OpenIddict
## ITokenExtensionGrant
Create a class that inherits `ITokenExtensionGrant`, and then register it with the framework.
In the `MyTokenExtensionGrant` class below we try to get the token details, The `ForbidResult` handles the failure case and `SignInResult` returns a new token response, You can pass more parameters to implement business checks.
```cs
public class MyTokenExtensionGrant : ITokenExtensionGrant
{
public const string ExtensionGrantName = "MyTokenExtensionGrant";
public string Name => ExtensionGrantName;
public async Task<IActionResult> HandleAsync(ExtensionGrantContext context)
{
var userToken = context.Request.GetParameter("token").ToString();
if (string.IsNullOrEmpty(userToken))
{
return new ForbidResult(
new[] {OpenIddictServerAspNetCoreDefaults.AuthenticationScheme},
properties: new AuthenticationProperties(new Dictionary<string, string>
{
[OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.InvalidRequest
}!));
}
var transaction = await context.HttpContext.RequestServices.GetRequiredService<IOpenIddictServerFactory>().CreateTransactionAsync();
transaction.EndpointType = OpenIddictServerEndpointType.Introspection;
transaction.Request = new OpenIddictRequest
{
ClientId = context.Request.ClientId,
ClientSecret = context.Request.ClientSecret,
Token = userToken
};
var notification = new OpenIddictServerEvents.ProcessAuthenticationContext(transaction);
var dispatcher = context.HttpContext.RequestServices.GetRequiredService<IOpenIddictServerDispatcher>();
await dispatcher.DispatchAsync(notification);
if (notification.IsRejected)
{
return new ForbidResult(
new []{ OpenIddictServerAspNetCoreDefaults.AuthenticationScheme },
properties: new AuthenticationProperties(new Dictionary<string, string>
{
[OpenIddictServerAspNetCoreConstants.Properties.Error] = notification.Error ?? OpenIddictConstants.Errors.InvalidRequest,
[OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = notification.ErrorDescription,
[OpenIddictServerAspNetCoreConstants.Properties.ErrorUri] = notification.ErrorUri
}));
}
var principal = notification.GenericTokenPrincipal;
if (principal == null)
{
return new ForbidResult(
new []{ OpenIddictServerAspNetCoreDefaults.AuthenticationScheme },
properties: new AuthenticationProperties(new Dictionary<string, string>
{
[OpenIddictServerAspNetCoreConstants.Properties.Error] = notification.Error ?? OpenIddictConstants.Errors.InvalidRequest,
[OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = notification.ErrorDescription,
[OpenIddictServerAspNetCoreConstants.Properties.ErrorUri] = notification.ErrorUri
}));
}
var userId = principal.FindUserId();
var userManager = context.HttpContext.RequestServices.GetRequiredService<IdentityUserManager>();
var user = await userManager.GetByIdAsync(userId.Value);
var userClaimsPrincipalFactory = context.HttpContext.RequestServices.GetRequiredService<IUserClaimsPrincipalFactory<IdentityUser>>();
var claimsPrincipal = await userClaimsPrincipalFactory.CreateAsync(user);
claimsPrincipal.SetScopes(principal.GetScopes());
claimsPrincipal.SetResources(await GetResourcesAsync(context, principal.GetScopes()));
await context.HttpContext.RequestServices.GetRequiredService<AbpOpenIddictClaimDestinationsManager>().SetAsync(principal);
return new SignInResult(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, claimsPrincipal);
}
private async Task<IEnumerable<string>> GetResourcesAsync(ExtensionGrantContext context, ImmutableArray<string> scopes)
{
var resources = new List<string>();
if (!scopes.Any())
{
return resources;
}
await foreach (var resource in context.HttpContext.RequestServices.GetRequiredService<IOpenIddictScopeManager>().ListResourcesAsync(scopes))
{
resources.Add(resource);
}
return resources;
}
}
```
```cs
public override void PreConfigureServices(ServiceConfigurationContext context)
{
//...
PreConfigure<OpenIddictServerBuilder>(builder =>
{
builder.Configure(openIddictServerOptions =>
{
openIddictServerOptions.GrantTypes.Add(MyTokenExtensionGrant.ExtensionGrantName);
});
});
//...
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
//...
Configure<AbpOpenIddictExtensionGrantsOptions>(options =>
{
options.Grants.Add(MyTokenExtensionGrant.ExtensionGrantName, new MyTokenExtensionGrant());
});
//...
}
```
![Http request 1](postman1.png)
![Http request 2](postman2.png)
## Source code
https://github.com/abpframework/abp/commit/3210f138454697647689b4868c8d4b7b3da02d44

BIN
docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 KiB

BIN
docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/postman2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 KiB

47
docs/en/Community-Articles/2022-11-22-The-new-EF-Core-interceptors/POST.md

@ -0,0 +1,47 @@
# The new EF Core interceptors
## Interceptors
EF Core 7 has made a lot of enhancements to interceptors, You can see the list from [EF Core improved interceptors](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#new-and-improved-interceptors-and-events).
* Interception for creating and populating new entity instances (aka "materialization")
* Interception to modify the LINQ expression tree before a query is compiled
* Interception for optimistic concurrency handling (DbUpdateConcurrencyException)
* Interception for connections before checking if the connection string has been set
* Interception for when EF Core has finished consuming a result set, but before that result set is closed
* Interception for the creation of a DbConnection by EF Core
* Interception for DbCommand after it has been initialized
## Lazy initialization of `connection string`
You generally don't need to use [this](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#lazy-initialization-of-a-connection-string) feature, ABP has its own [connection string feature](https://docs.abp.io/en/abp/latest/Connection-Strings).
The framework will automatically handle the module or multi-tenant connection string
## Add interceptors in `AbpDbContext`
[Add interceptors](https://learn.microsoft.com/en-us/ef/core/logging-events-diagnostics/interceptors#registering-interceptors) is very simple, Add your `interceptors` in the `OnConfiguring` method of `DbContext`
````csharp
public class BookStoreDbContext : AbpDbContext<BookStoreDbContext>,
{
public BookStoreDbContext(DbContextOptions<BookStoreDbContext> options)
: base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.AddInterceptors(new MyEfCorenterceptor());
base.OnConfiguring(optionsBuilder);
}
}
````
> Some interceptors may be [Singleton](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-7.0#service-lifetimes) services. This means a single instance is used by many `DbContext` instances. The implementation must be thread-safe.
See the [EF Core Interceptors documentation](https://learn.microsoft.com/en-us/ef/core/logging-events-diagnostics/interceptors) for more information.

197
docs/en/Community-Articles/2022-11-22-gRPC-JSON-Transcoding/POST.md

@ -0,0 +1,197 @@
# gRPC - JSON Transcoding
In this article, I'll show you one of the new features that came with .NET 7: **JSON Transcoding**.
> I've created a community article to highlight some interesting features (briefly) that are now available with the release of .NET 7. You can check it from [here](https://community.abp.io/posts/whats-new-with-.net-7-tlq2g43w).
## What is gRPC? What are the pros and cons?
[gRPC](https://grpc.io/) is a high-performance RPC framework and uses HTTP/2 and Protobuf (protocol buffers).
### gRPC - Advantages
* **Lightweight messages**: Payload is much smaller than JSON.
* **High performance**: Much faster than REST and JSON communication.
* **Faster serialization/deserialization**: Protobufs are binary encoded. This means that it will use fewer CPU cycles to serialize/deserialize the messages.
### gRPC - Disadvantages
* **Lack of maturity**
* **Limited browser support - hard to test (in a way)**: Since gRPC relies on HTTP/2, you can’t call a gRPC service from a web browser directly. This is where JSON Transcoding comes into play.
## What is JSON Transcoding?
Despite the benefits that gRPC provides, REST APIs have an important place in modern web applications. We can easily create, expose and test them.
On the other hand, gRPC services are not easy to test as mentioned above. We can’t access a gRPC service yet through the browser since browsers don’t understand binary protocols. We need to use some tools to access endpoints, such as [gRPCurl](https://github.com/fullstorydev/grpcurl).
![](grpcurl.png)
JSON Transcoding is an extension for ASP.NET Core that creates RESTful JSON APIs for gRPC services and overcomes this problem. You can see an illustration down below:
![](json-transcoding.png)
By using JSON Transcoding, we can expose our gRPC services and access them via HTTP call. Let's see it in action.
## Creating & Exposing gRPC Services in ABP Based Applications
> You can find the source code of the application at https://github.com/EngincanV/abp-grpc-json-transcoding.
### Creating the Application
Create an empty folder, open a command-line terminal and type the following command in the terminal window to create a new ABP solution using the ABP CLI:
```csharp
abp new BookStore -t app --ui angular --preview
```
I've created an application with the Angular UI, but the UI is not important for this tutorial, you can select your favorite UI.
> **Note:** Your application should be ABP 7.0+.
### Configuring gRPC & JSON Transcoding
In this solution, `*.HttpApi.Host` is the project that configures and runs the server-side application. So, we will make changes in that project.
First, we need to add two packages ([Grpc.AspNetCore](https://www.nuget.org/packages/Grpc.AspNetCore) and [Microsoft.AspNetCore.Grpc.JsonTranscoding](https://www.nuget.org/packages/Microsoft.AspNetCore.Grpc.JsonTranscoding)) into this project with the following commands:
```bash
dotnet add package Grpc.AspNetCore
dotnet add package Microsoft.AspNetCore.Grpc.JsonTranscoding
```
Then, add the [*google/api/http.proto*](https://github.com/dotnet/aspnetcore/blob/main/src/Grpc/JsonTranscoding/test/testassets/Sandbox/google/api/http.proto) and [*google/api/annotations.proto*](https://github.com/dotnet/aspnetcore/blob/main/src/Grpc/JsonTranscoding/test/testassets/Sandbox/google/api/annotations.proto) files under to the **google/api** folder. These files are required for JSON Transcoding and contain all the stuff related to that.
![](google-api-folders.png)
Then, open the module class (`BookStoreHttpApiHostModule.cs`) and update it as below:
```csharp
public class BookStoreHttpApiHostModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// other configurations...
context.Services.AddGrpc().AddJsonTranscoding(); //add this line
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
// other middlewares...
app.UseConfiguredEndpoints(builder =>
{
builder.MapGrpcService<BookAppService>(); //add this line
});
}
}
```
* Here, we've registered the related gRPC services into the DI container by calling the `AddGdpr()` and `AddJsonTranscoding()` methods.
* Also, we've defined our gRPC service: `BookAppService`. We have not created this service yet and will create it in the next section.
So far, we've added the required packages to our project and made the related configurations. Now we can start creating our gRPC services.
### Implementing gRPC Services
Create a **Protos** folder and define a `bookstore.proto` file in it. Then fill it with the below content:
```proto
syntax = "proto3";
import "google/api/annotations.proto"; //import related Google APIs
option csharp_namespace = "BookStore";
message Book {
string title = 1;
string author = 2;
int32 page_count = 3;
optional string language = 4;
}
message GetBookListRequest {}
message GetBookListResponse { repeated Book books = 1; }
service BookApp {
rpc GetBookList(GetBookListRequest) returns (GetBookListResponse) {
option (google.api.http) = {
get: "/v1/book-store/books" //expose from this url
};
}
}
```
* Here, we've defined the `bookstore.proto` file. You can consider this file as a contract that the server and client have agreed on.
* An important point here, we've imported the `google/api/annotations.proto` (we added this file under the **google/api** folder in the previous section) and by using the `google.api.http` we are exposing this gRPC service (with the specified URL).
* So, when we run the application we can send a request to that endpoint and see the result.
* Thanks to JSON Transcoding, we don't need to use any other tools to test our gRPC services anymore!
Let's mark the `bookstore.proto` file as our protobuf file in the `*.HttpApi.Host.csproj` file:
```xml
<ItemGroup>
<Protobuf Include="Protos\bookstore.proto" GrpcServices="Server" />
</ItemGroup>
```
For the final step, we just need to define a service that corresponds to the service that we've defined in the `bookstore.proto` file. Voilà 🎉!
So, create a new class named `BookAppService` under the `Services` folder:
```csharp
using System.Threading.Tasks;
using Grpc.Core;
namespace BookStore.Services;
public class BookAppService : BookApp.BookAppBase
{
//notice: we did not create GetBookListResponse and GetBookListRequest classes
//Grpc.AspNetCore package did behalf of us
public override Task<GetBookListResponse> GetBookList(GetBookListRequest request, ServerCallContext context)
{
var response = new GetBookListResponse();
response.Books.Add(new Book
{
Title = "The Hitchhiker's Guide to the Galaxy",
Author = "Douglas Adams",
PageCount = 42
});
response.Books.Add(new Book
{
Title = "The Lord of the Rings",
Author = "J.R.R. Tolkien",
PageCount = 1234
});
return Task.FromResult(response);
}
}
```
* Here, as you notice we've inherited our service from the `BookAppBase` class. You might wonder where it came from.
* The **Grpc.AspNetCore** package creates auto-generated classes from our protobuf file (`bookstore.proto`). We just need to inherit from `BookAppService` class (it's matched with the service name that we've defined in protobuf file), override the `GetBookList` method and implement it. That's it.
* Also, notice we did not create the other classes such as `Book`, `GetBookListRequest` and `GetBookListResponse`. These are all auto-generated from our protobuf file.
We've created a gRPC service and now let's run our application (before running the application, run the `*.DbMigrator` project to create the database and seed the initial data) and see it in action.
![](grpc-result.png)
## Conclusion
In this article, I've briefly introduced the JSON Transcoding feature that was shipped with .NET 7 and showed it in an ABP Based application.
> See the [gRPC JSON transcoding in ASP.NET Core gRPC apps](https://learn.microsoft.com/en-us/aspnet/core/grpc/json-transcoding?view=aspnetcore-7.0) documentation for more information.
## References
* https://devblogs.microsoft.com/dotnet/announcing-grpc-json-transcoding-for-dotnet/
* https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-7.0?view=aspnetcore-7.0#json-transcoding
* https://learn.microsoft.com/en-us/aspnet/core/grpc/json-transcoding?view=aspnetcore-7.0
* https://sahansera.dev/building-grpc-server-dotnet/

BIN
docs/en/Community-Articles/2022-11-22-gRPC-JSON-Transcoding/google-api-folders.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
docs/en/Community-Articles/2022-11-22-gRPC-JSON-Transcoding/grpc-result.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
docs/en/Community-Articles/2022-11-22-gRPC-JSON-Transcoding/grpcurl.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
docs/en/Community-Articles/2022-11-22-gRPC-JSON-Transcoding/json-transcoding.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

71
docs/en/Community-Articles/2022-11-23-Signalr-client-results/POST.md

@ -0,0 +1,71 @@
# Signalr Client results
ASP.NET Core 7 supports [requesting a result from a client](https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-7.0?view=aspnetcore-7.0#signalr), in this article, we will show you how to use client results with the ABP framework.
## Create a SignalR hub
```csharp
public class ChatHub : AbpHub
{
public async Task<string> WaitForMessage(string connectionId)
{
var message = await Clients.Client(connectionId).InvokeAsync<string>("GetMessage");
return message;
}
}
```
* ChatHub inherits from `AbpHub` that has useful base properties like `CurrentUser`.
* Define the `WaitForMessage` method to call the client's `GetMessage` method and get the return value.
> Using `InvokeAsync` from a Hub method requires setting the [MaximumParallelInvocationsPerClient](https://learn.microsoft.com/en-us/aspnet/core/signalr/configuration?view=aspnetcore-7.0&tabs=dotnet#configure-server-options) option to a value greater than 1.
## Client
Clients should return results in their `.On(...)` handlers.
### .NET Client
```csharp
hubConnection.On("GetMessage", async () =>
{
Console.WriteLine("Enter message:");
var message = await Console.In.ReadLineAsync();
return message;
});
```
### JavaScript client
```js
connection.on("GetMessage", function () {
const message = prompt("Enter message:");
return message;
});
```
## Strongly-typed hubs
We can use strongly-typed instead of `InvokeAsync` by inheriting from `AbpHub<T>` or `Hub<T>`:
```csharp
public interface IClient
{
Task<string> GetMessage();
}
public class ChatHub : AbpHub<IClient>
{
public async Task<string> WaitForMessage(string connectionId)
{
string message = await Clients.Client(connectionId).GetMessage();
return message;
}
}
```
## See also:
* [ABP SignalR-Integration documentation](https://docs.abp.io/en/abp/latest/SignalR-Integration)
* [Microsoft client-results documentation](https://learn.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-7.0#client-results)

139
docs/en/Community-Articles/2022-11-25-EFCore-Mapping-Strategies/Post.md

@ -0,0 +1,139 @@
# Inheritance Strategies in Entity Framework Core 7
In this article, I'll show you all the object mapping strategies of EF Core and especially the new one: **TPC Inheritance Mapping**. TPC mapping is the new feature introduced with Entity Framework Core 7. It's called Table Per Concrete type inheritance mapping. I'll explain the EF Core's inheritance mapping strategies with how the inherited entity and the specific information are saved into a relational database. I'll also explain which strategy is best for your case.
By default, EF Core maps an inheritance hierarchy of .NET types to a single database table. And it's called TPH (table-per-hierarchy) mapping.
In the previous versions EF Core , Table Per Hierarchy (TPH) or Table Per Type (TPT) were supported. And now TPC came!
To explain in a more clear way, I'll use the following entity model.
`Car`, `Bus` and `Motorcylce` are inherited from the `Vehicle` object.
```csharp
public abstract class Vehicle
{
public int Id { get; set; }
public string VehicleModel { get; set; }
}
//////////////////////////////////////
public class Car : Vehicle
{
public string Segment { get; set; }
}
//////////////////////////////////////
public class Bus : Vehicle
{
public int? SeatCount { get; set; }
}
//////////////////////////////////////
public class Motorcycle : Vehicle
{
public int CylinderCount { get; set; }
}
```
![inheritance](inheritance.png)
Here's the list of available strategies to map `Car`, `Bus` and `Motorcylce`:
## TPH (Table Per Hierarchy)
TPH maps an inheritance hierarchy of .NET types to **a single database table**. So a single table is created for all types. This is the default behavior of EF Core. If you explicitly want to use this strategy, you can write `UseTphMappingStrategy()` to the root entity in the `OnModelCreating()` method in the `DbContext` class. As you see from the following table, it adds an extra column, `Discriminator` to separate the `Car`, `Bus` and `Motorcycle`. This way of persistence is an unnormalized form.
```sql
CREATE TABLE [Vehicles] (
[Id] int NOT NULL IDENTITY,
[Discriminator] nvarchar(max) NOT NULL, -- "Car", "Bus", "Motorcylce"
[VehicleModel] nvarchar(max) NOT NULL,
[Segment] nvarchar(max) NULL,
[SeatCount] int NULL,
[CylinderCount] int NOT NULL
);
```
## TPT (Table per Type)
With the TPT strategy, a different table is created for every type. The table itself is used to determine the type of the object saved, and each table contains only columns for the properties of that type. The data is saved in multiple tables, and this way of persistence is normalized form.
```sql
CREATE TABLE [Vehicles] (
[Id] int NOT NULL IDENTITY,
[VehicleModel] nvarchar(max) NOT NULL
);
CREATE TABLE [Car] (
[Id] int NOT NULL,
[Segment] nvarchar(max) NULL
);
CREATE TABLE [Bus] (
[Id] int NOT NULL,
[SeatCount] int NULL,
);
CREATE TABLE [Motorcycle] (
[Id] int NOT NULL,
[CylinderCount] int NOT NULL
);
```
If you explicitly want to use this strategy, you can write `UseTptMappingStrategy()` to the root entity in the `OnModelCreating()` method in the `DbContext` class.
## TPC (Table Per Concrete type)
It's the new strategy that has been introduced with EF Core 7. In this way, a different table is created for each concrete type. While in the TPT, the table itself indicates the type of the object saved, in TPC, each table contains columns for every property in the concrete type *and its base types*. As you see from the following tables, no `Vehicles` table is being created. The `VehicleModel` field is common in each table.
```sql
CREATE TABLE [Car] (
[Id] int NOT NULL DEFAULT (NEXT VALUE FOR [VehicleIds]),
[VehicleModel] nvarchar(max) NOT NULL, -- common field for each type
[Segment] nvarchar(max) NULL
);
CREATE TABLE [Bus] (
[Id] int NOT NULL DEFAULT (NEXT VALUE FOR [VehicleIds]),
[VehicleModel] nvarchar(max) NOT NULL, -- common field for each type
[SeatCount] int NULL
);
CREATE TABLE [Motorcycle] (
[Id] int NOT NULL DEFAULT (NEXT VALUE FOR [VehicleIds]),
[VehicleModel] nvarchar(max) NOT NULL, -- common field for each type
[CylinderCount] int NOT NULL
);
```
This strategy maps each .NET type to **a different database table**. You write `UseTpcMappingStrategy()` to the root entity in the root entity in the `OnModelCreating()` method in the `DbContext` class.
## How do you choose which mapping type is best for you?
* **TPH:** In most cases, the TPH mapping is a good choice which is the default one. This way, the table columns increase because all the properties are saved in the same table, but it's easy to query in a single table.
* **TPT** In this form, data is persisted in a normalized form. For this reason, you can choose TPT, but generally, it's not being used. But the disadvantage is when you filter by `VehicleModel` column, it must join `Vehicles`, `Bus`, `Car`, `Motorcycle` tables. So it's not a feasible fetching way.
* **TPC:** This new strategy is similar to TPT but resolves some of the TPT problems. Because it stores the data in its own table, it doesn't divide across multiple tables. This option can be chosen when the mapped hierarchy is large and has many concrete types, each with many properties.
For example, if `Car`, `Bus`, or `Motorcycle` have 20 properties for each type, then it's better to store them in a separate table, so we should use TPC. But if these entities have only 3-5 properties, then TPH is the way to go.
> ### Jeremy Likness says;
>
> - If your code mostly queries entities of a single leaf type, then use TPC because the storage requirements are smaller since there are no null columns and no discriminator no index is ever needed on the discriminator column, which would slow down updates and possibly also queries. An index may not be needed when using TPH either, but that depends on various factors. If your code mostly queries for entities of many types, such as writing queries against the base type, lean towards TPH. If your database system supports it (for example SQL Server), then consider using sparse columns for columns that will be rarely populated. Use TPT only if constrained to do so by external factors.
*References:*
* https://devblogs.microsoft.com/dotnet/announcing-ef7-preview5/#primary-keys

BIN
docs/en/Community-Articles/2022-11-25-EFCore-Mapping-Strategies/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
docs/en/Community-Articles/2022-11-25-EFCore-Mapping-Strategies/inheritance.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
docs/en/Community-Articles/2022-11-25-JSON-columns/Database.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

134
docs/en/Community-Articles/2022-11-25-JSON-columns/post.md

@ -0,0 +1,134 @@
# JSON Columns in Entity Framework Core 7
In this article, we will see how to use the new **JSON Columns** features that came with EF Core 7 in an ABP based application (with examples).
## JSON Columns
Most relational databases support columns that contain JSON documents. The JSON in these columns can be drilled into with queries. This allows, for example, filtering and sorting by the elements of the documents, as well as projection of elements out of the documents into results. JSON columns allow relational databases to take on some of the characteristics of document databases, creating a useful hybrid between these two database management approaches.
EF7 contains provider-agnostic support for JSON columns, with an implementation for SQL Server. This support allows the mapping of aggregates built from .NET types to JSON documents. Normal LINQ queries can be used on the aggregates, and these will be translated to the appropriate query constructs needed to drill into the JSON. EF7 also supports updating and saving changes to JSON documents.
> You can find more information about JSON columns in EF Core's [documentation](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns).
### Mapping JSON Columns
In EF Core, aggregate types can be defined using `OwnsOne` and `OwnsMany` methods. `OwnsOne` can be used to map a single aggregate and the `OwnsMany` method can be used to map a collection of aggregates.
With EF 7, we have a new extension method for mapping property to a JSON Column: `ToJson`. We can use this method to mark a property as a JSON Column. The property can be of any type that can be serialized to JSON.
The following example shows how to map a JSON column to an aggregate type:
```csharp
public class ContactDetails
{
public Address Address { get; set; }
public string? Phone { get; set; }
}
public class Address
{
public Address(string street, string city, string postcode, string country)
{
Street = street;
City = city;
Postcode = postcode;
Country = country;
}
public string Street { get; set; }
public string City { get; set; }
public string Postcode { get; set; }
public string Country { get; set; }
}
public class Person : AggregateRoot<int>
{
public string Name { get; set; } = null!;
public ContactDetails ContactDetails { get; set; } = null!;
}
```
* Above, we have defined an aggregate type `ContactDetails` that contains an `Address` and a `Phone` number. The aggregate type is configured in `OnModelCreating` using `OwnsOne` and `ToJson` methods below.
* The `Address` property is mapped to a JSON column using `ToJson`, and the `Phone` property is mapped to a regular column. This requires just one call to **ToJson()** when configuring the aggregate type:
```csharp
public class MyDbContext : AbpDbContext<MyDbContext>
{
public DbSet<Person> Persons { get; set; }
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Person>(b =>
{
b.ToTable(MyProjectConsts.DbTablePrefix + "Persons", MyProjectConsts.DbSchema);
b.ConfigureByConvention();
b.OwnsOne(x=>x.ContactDetails, c =>
{
c.ToJson(); //mark as JSON Column
c.OwnsOne(cd => cd.Address);
});
});
}
}
```
### Querying JSON Columns
Queries into JSON columns work just the same as querying into any other aggregate type in EF Core. That's it, just use the LINQ! Here are some examples:
```csharp
var persons = await (await GetDbSetAsync()).ToListAsync();
var contacts = await (await GetDbSetAsync()).Select(person => new
{
person,
person.ContactDetails.Phone, //query over JSON column
Addresses = person.ContactDetails.Address //query over JSON column
}).ToListAsync();
var addresses = await (await GetDbSetAsync()).Select(person => new
{
person,
Addresses = person.ContactDetails.Address //query over JSON column
}).ToListAsync();
```
### Updating JSON Columns
You can update JSON columns the same as updating any record by using the `UpdateAsync` method. The following example shows how to update a JSON column:
```csharp
var person = await (await GetDbSetAsync()).FirstAsync();
person.ContactDetails.Phone = "123456789";
person.ContactDetails.Address = new Address("Street", "City", "Postcode", "Country");
await UpdateAsync(person, true);
```
### JSON Column in a Database
After you've configured the database relations, created a new migration and applied it to database you will have a database table like below:
![image](./Database.png)
As you can see, thanks to JSON Columns feature the **ContactDetails** row has JSON content and we can use it in a query or update it from our application with the LINQ JSON query support that mentioned above.
### Conclusion
In this article, I've briefly introduced the JSON Columns feature that was shipped with EF Core 7. It's pretty straightforward to use JSON Columns in an ABP based application. You can see the examples above and give it a try!
### The Source Code
* You can find the full source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreJSONColumnDemo).
### References
* [https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns)
* [https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities](https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities)

73
docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md

@ -0,0 +1,73 @@
# gRPC - Health Checks
In this article we will show how to use gRPC health checks with the ABP Framework.
## Health Checks
ASP.NET Core 7 supports gRPC health checks. Health Checks allow us to determine the overall health and availability of our application infrastructure. They are exposed as HTTP endpoints and can be configured to provide information for various monitoring scenarios, such as the response time and memory usage of our application, or whether our application can communicate with our database provider.
### gRPC Health Checks
The [gRPC health checking protocol](https://github.com/grpc/grpc/blob/master/doc/health-checking.md) is a standard for reporting the health of gRPC server apps. An app exposes health checks as a gRPC service. They are typically used with an external monitoring service to check the status of an app.
### Grpc.AspNetCore.HealthChecks
ASP.NET Core supports the gRPC health checking protocol with the [Grpc.AspNetCore.HealthChecks](https://www.nuget.org/packages/Grpc.AspNetCore.HealthChecks) package. Results from .NET health checks are reported to callers.
## Using gRPC Health Checks with the ABP Framework
In this article, I'm assuming you've used gRPC with ABP before. If you are still having problems with this, it may be good for you to review this article.
https://community.abp.io/posts/using-grpc-with-the-abp-framework-2dgaxzw3
### Set up gRPC Health Checks
In this solution, `*.HttpApi.Host` is the project that configures and runs the server-side application. So, we will make changes in that project.
* Add the `Grpc.AspNetCore.HealthChecks` package to your project.
```bash
dotnet add package Grpc.AspNetCore.HealthChecks
```
* `AddGrpcHealthChecks` to register services that enable health checks.
```csharp
public override void ConfigureServices(ServiceConfigurationContext context)
{
// Other configurations...
context.Services.AddGrpcHealthChecks()
.AddCheck("SampleHealthCheck", () => HealthCheckResult.Healthy());
}
```
* `MapGrpcHealthChecksService` to add a health check service endpoint.
```csharp
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
// Other middlewares...
app.UseConfiguredEndpoints(builder =>
{
builder.MapGrpcHealthChecksService();
});
}
```
### Calling Health Checks From a Client
Now that our server is configured for gRPC health checks, we can test it by creating a basic console client.
```csharp
var channel = GrpcChannel.ForAddress("https://localhost:44357");
var client = new Health.HealthClient(channel);
var response = await client.CheckAsync(new HealthCheckRequest());
var status = response.Status;
Console.WriteLine($"Health Status: {status}");
```
## References
- https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-7.0?view=aspnetcore-7.0#grpc-health-checks-in-aspnet-core

7
docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md

@ -2,6 +2,8 @@
[Dependency injection](https://docs.abp.io/en/abp/latest/Dependency-Injection) is a widely-used pattern of obtaining references to other services from our classes. It is a built-in feature when you develop ASP.NET Core applications. In this article, I will explain why we may need to have references to other services in an entity class and how we can implement Entity Framework Core's new `IMaterializationInterceptor` interface to provide these services to the entities using the standard dependency injection system.
> You can find the source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreEntityDependencyInjectionDemo).
## The Problem
While developing applications based on [Domain-Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design) (DDD) patterns, we typically write our business code inside [application services](https://docs.abp.io/en/abp/latest/Application-Services), [domain services](https://docs.abp.io/en/abp/latest/Domain-Services) and [entities](https://docs.abp.io/en/abp/latest/Entities). Since the application and domain service instances are created by the dependency injection system, they can inject services into their constructors.
@ -367,6 +369,11 @@ In this article, I tried to investigate all aspects of injecting services into e
Injecting services into entities seems a certain way of forcing some business rules in your entities. However, because of the current technical limitations, design issues and usage difficulties, I don't suggest to depend on services in your entities. Instead, create domain services when you need to implement a business rule that depends on external services and entities.
## The Source Code
* You can find the full source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreEntityDependencyInjectionDemo).
* You can see [this pull request](https://github.com/abpframework/abp-samples/pull/207/files) for the changes I've done after creating the application.
## See Also
* [What's new in EF Core 7.0](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew)

88
docs/en/Community-Articles/2022-11-28-Model-building-conventions-ef7/POST.md

@ -0,0 +1,88 @@
# Model building conventions in Entity Framework Core 7.0
In this article, I will show you one of the new features of EF Core 7 named "Model building conventions".
Entity Framework Core uses a metadata model to describe how entity types are mapped to the database. Before EF Core 7.0, it was not possible to remove or replace existing conventions or add new conventions. With EF Core 7.0, this is now possible. To read more about it, you can visit its [documentation](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#model-building-conventions).
EF Core uses many built-in conventions. You can see the full list of the conventions on `IConvetion` Interface API [documentation](https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.metadata.conventions.iconvention?view=efcore-7.0).
If you want to add, remove or replace a convention, you need to override `ConfigureConventions` method of your DbContext as shown below;
```csharp
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Conventions.Add(_ => new MyCustomConvention());
}
```
## Allowed Operations
### Removing an existing convention
Existing conventions provided by EF Core are well thought and useful, but sometimes some of them might not be a good candidate for your application. In such cases, you can remove an existing convention as shown below;
```csharp
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Conventions.Remove(typeof(ForeignKeyIndexConvention));
}
```
### Adding a new convention
Just like removing a convention, we can add a completely new convention as well. You can define many different conventions here. For example, you can specify a standard precision for all decimal fields in your entities.
```csharp
public class DecimalPrecisionConvention : IModelFinalizingConvention
{
public void ProcessModelFinalizing(IConventionModelBuilder modelBuilder, IConventionContext<IConventionModelBuilder> context)
{
foreach (var property in modelBuilder.Metadata.GetEntityTypes()
.SelectMany(
entityType => entityType.GetDeclaredProperties()
.Where(
property => property.ClrType == typeof(decimal))))
{
property.Builder.HasPrecision(2);
}
}
}
```
Note that, conventions are executed in the order they are added. So you need to be careful in which order they are added.
### Replacing an existing convention
Sometimes, a default convention might work slightly different than what your app expects. In such cases, you can create your own implementation by inheriting from that convention and replace the default one. For example, you can create a convention as shown below;
```csharp
public class MyCustomConvention : ADefaultEfCoreConvention
{
public MyCustomConvention(ProviderConventionSetBuilderDependencies dependencies)
: base(dependencies)
{
}
// override the methods you want to change.
}
```
Then, you can replace the default one with your implementation as shown below;
```csharp
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Conventions.Replace<ADefaultEfCoreConvention>(
serviceProvider => new MyCustomConvention(
serviceProvider.GetRequiredService<ProviderConventionSetBuilderDependencies>()));
}
```
As a final note, conventions never override configuration marked as **DataAnnotation** or **Explicit**. This means that, even if there is a convention, if the property has a `DataAnnotation` attribute or configuration in `OnModelCreating`, convetion will not be used. Here are the configuration types EF Core uses;
* **Explicit:** The model element was explicitly configured in OnModelCreating
* **DataAnnotation:** The model element was configured using a mapping attribute (aka data annotation) on the CLR type
* **Convention:** The model element was configured by a model building convention
## Using in ABP-based solution
Since ABP uses EF Core, you can use this feature in ABP as well.

71
docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md

@ -0,0 +1,71 @@
# Bulk Operations with Entity Framework Core 7.0
Entity Framework tracks all the entity changes and applies those changes to the database one by one when the `SaveChanges()` method is called. There was no way to execute bulk operations in Entity Framework Core without a dependency.
As you know the [Entity Framework Extensions](https://entityframework-extensions.net/bulk-savechanges) library was doing it but it was not free.
There was no other solution until now. [Bulk Operations](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#executeupdate-and-executedelete-bulk-updates) are now available in Entity Framework Core with .NET 7.
With .NET 7, there are two new methods such as `ExecuteUpdate` and `ExecuteDelete` available to execute bulk operations. It's a similar usage with the Entity Framework Core Extensions library if you're familiar with it.
You can visit the microsoft example [here](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#executeupdate-and-executedelete-bulk-updates) about how to use it.
It can be easily used with the DbContext.
```csharp
await context.Tags.Where(t => t.Text.Contains(".NET")).ExecuteDeleteAsync();
```
## Using with ABP Framework
ABP Framework provides an abstraction over database operations and implements generic repository pattern. So, DbContext can't be accessed outside of [repositories](https://docs.abp.io/en/abp/latest/Repositories).
You can use the `ExecuteUpdate` and `ExecuteDelete` methods inside a repository.
```csharp
public class BookEntityFrameworkCoreRepository : EfCoreRepository<BookStoreDbContext, Book, Guid>, IBookRepository
{
public BookEntityFrameworkCoreRepository(IDbContextProvider<BookStoreDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public async Task UpdateListingAsync()
{
var dbSet = await GetDbSetAsync();
await dbSet
.Where(x => x.IsListed && x.PublishedOn.Year <= 2022)
.ExecuteUpdateAsync(s => s.SetProperty(x => x.IsListed, x => false));
}
public async Task DeleteOldBooksAsync()
{
var dbSet = await GetDbSetAsync();
await dbSet
.Where(x => x.PublishedOn.Year <= 2000)
.ExecuteDeleteAsync();
}
}
```
There is no need to take an action for bulk inserting. You can use the `InsertManyAsync` method of the repository instead of creating a new method for it if you don't have custom logic. It'll use a new bulk inserting feature automatically since it's available in EF Core 7.0.
```csharp
public class MyDomainService : DomainService
{
protected IRepository<Book, Guid> BookRepository { get; }
public MyDomainService(IRepository<Book, Guid> bookRepository)
{
BookRepository = bookRepository;
}
public async Task CreateBooksAsync(List<Book> books)
{
// It'll use bulk inserting automatically.
await BookRepository.InsertManyAsync(books);
}
}
```
> If you use `ExecuteDeleteAsync` or `ExecuteUpdateAsync`, then ABP's soft delete and auditing features can not work. Because these ABP features work with EF Core's change tracking system and these new methods doesn't work with the change tracking system. So, use them carefully.

208
docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md

@ -0,0 +1,208 @@
# Value generation for DDD guarded types with Entity Framework Core 7.0
In domain-driven design (DDD), *guarded keys* can improve the type safety of key properties. This is achieved by wrapping the key type in another type which is specific to the use of the key. In this article, I will explain the cases why you may need to use guarded types and discuss the advantages and limitations when implementing to an ABP application.
> You can find the source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreGuardedTypeDemo).
## The Problem
While developing an applications, there are many cases where we manually assign foreign keys that can be in guid type or integer type, etc. This manual assignment mistakes can cause miss-match of unique identifiers, such as **assigning a product ID to a category**, that can be hard to detect in the future.
Here is a very simplified sample of wrong assignment when trying to update a product category:
````csharp
public class ProductAppService : MyProductStoreAppService, IProductAppService
{
private readonly IRepository<Product, Guid> _productRepository;
public ProductAppService(IRepository<Product, Guid> productRepository)
{
_productRepository = productRepository;
}
public async Task UpdateProductCategoryAsync(Guid productId, Guid categoryId)
{
var productToUpdate = await _productRepository.GetAsync(productId);
productToUpdate.CategoryId = productId; // Wrong assignment that causes error only at run-time
await _productRepository.UpdateAsync(productToUpdate);
}
}
````
While the sample demonstrates a very simple mistake, it is easier to come across similar mistakes when the business logic gets more complex especially when you are using methods with **multiple foreign key arguments**. The next section offers using guarded types to prevent these kind of problems as a solution to the problem.
## The Solution
Strongly-typed IDs (*guarded keys*) is a DDD approach to address this problem. One of the main problems with .NET users was handling the persisting these objects. With EFCore7, key properties can be guarded with type safety seamlessly.
To use guarded keys, update your aggregate root or entity unique identifier with a complex type to overcome *primitive obsession*:
````csharp
public readonly struct CategoryId
{
public CategoryId(Guid value) => Value = value;
public Guid Value { get; }
}
public readonly struct ProductId
{
public ProductId(Guid value) => Value = value;
public Guid Value { get; }
}
````
You can now use these keys for your aggregate roots or entities:
```csharp
public class Product : AggregateRoot<ProductId>
{
public ProductId Id { get; set; }
public string Name { get; set; }
public CategoryId CategoryId { get; set; }
private Product() { }
public Product(ProductId id, string name) : base(id)
{
Name = Check.NotNullOrEmpty(name, nameof(name));
}
}
public class Category : AggregateRoot<CategoryId>
{
public CategoryId Id { get; set; }
public string Name { get; set; }
public List<Product> Products { get; } = new();
private Category() { }
public Category(CategoryId id, string name) : base(id)
{
Name = Check.NotNullOrEmpty(name, nameof(name));
}
}
```
`ProductId` and `CategoryId` guarded key types shown in the sample use `Guid` key values, which means Guid values will be used in the mapped database tables. This is achieved by defining [value converters](https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions) for the types.
Override the `ConfigureConventions` method of your DbContext to use the value converters:
````csharp
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Properties<ProductId>().HaveConversion<ProductIdConverter>();
configurationBuilder.Properties<CategoryId>().HaveConversion<CategoryIdConverter>();
}
private class ProductIdConverter : ValueConverter<ProductId, Guid>
{
public ProductIdConverter()
: base(v => v.Value, v => new(v))
{
}
}
private class CategoryIdConverter : ValueConverter<CategoryId, Guid>
{
public CategoryIdConverter()
: base(v => v.Value, v => new(v))
{
}
}
````
> The code here uses `struct` types. This means they have appropriate value-type semantics for use as keys. If `class` types are used instead, then they need to either override equality semantics or also specify a [value comparer](https://learn.microsoft.com/en-us/ef/core/modeling/value-comparers).
Now, you can use generic (or custom) repositories of ABP using the guarded type as the key for the repository:
```csharp
public class ProductStoreDataSeedContributor : IDataSeedContributor, ITransientDependency
{
private readonly IRepository<Category, CategoryId> _categoryRepository;
private readonly IRepository<Product, ProductId> _productRepository;
public ProductStoreDataSeedContributor(
IRepository<Category, CategoryId> categoryRepository,
IRepository<Product, ProductId> productRepository
)
{
_categoryRepository = categoryRepository;
_productRepository = productRepository;
}
// ...
}
```
You can also use `integer` as guarded type for your key properties and use [Sequence-based key generation for SQL Server](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#sequence-based-key-generation-for-sql-server) for value generation.
## Discussions
In this section, I will discuss the use cases of guarded types and limitations when implementing to an ABP application.
### Do I need to use guarded types?
If you are already following the best practices of [Domain-Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design), you are aware that **updates** and **creations** of an aggregate are done **over** the aggregate root itself as a whole unit. And entity state changes of an aggregate root should be done using the [domain services](https://docs.abp.io/en/abp/latest/Domain-Services). Domain services should already validate the entity.
**Example: Using domain service to update product:**
````csharp
public class ProductManager : DomainService
{
private readonly IRepository<Product, Guid> _productRepository;
public ProductManager(IRepository<Product, Guid> productRepository)
{
_productRepository = productRepository;
}
public Task<Product> AssignCategory(Product product, Category category)
{
// ...
product.CategoryId = category.Id;
//..
}
}
````
In this sample, domain service validates that both **product** and the **category** entities, passed by the application layer, are valid objects since they are not key properties. However, manual assignment is already in place and more complex the domain logic, higher to miss out mistakes. At the end, it will depend on your tolerance level for developer errors comparing to the time you want to spend time on additional code base for guarded types.
### Limitations
One important limitation is automatic value generation when using `Guid` as guarded type for your key properties. The basic repository can not generate the unique identifier automatically by the time this article is written:
```csharp
public readonly struct ProductId
{
public ProductId(Guid value) => Value = value;
public Guid Value { get; }
}
```
you need to generate the unique identifier **manually**:
````csharp
var newProduct = await _productRepository.InsertAsync(
new Product(new ProductId(_guidGenerator.Create()), "New product")
);
````
## Conclusion
In this article, I tried to explain DDD guarded types for key properties and value generation for these properties using Entity Framework 7.0 and ABP.
Using strongly-typed key properties reduce the chance of unnoticed errors. Admittedly it increases the code complexity by adding new types to your solution with extra coding, especially if you are using classes as keys. Guarded types provide improved safety for your code base at the expense of additional code complexity as in many DDD concepts and patterns.
If you have a large team working on a large scale solution containing complex business logics where key assignments are abundant or if you are using methods with multiple foreign key arguments, I personally suggest using guarded types.
## The Source Code
* You can find the full source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreGuardedTypeDemo).
## See Also
* [What's new in EF Core 7.0](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew)
* [ABP Framework: Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design)

231
docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md

@ -0,0 +1,231 @@
# Rate Limiting with ASP.NET Core 7.0
Rate limiting is a way of controlling the traffic that a web application or API receives. In other words, rate limiting helps you control the amount of traffic each user has access to at any given time. This is extremely useful when you want to manage the load on your server or services, avoid going over your monthly data transfer limit and allow the system to continue to function and meet service level agreements, even when an increase in demand places an extreme load on resources.
In this article, we will look at what rate limiting is, why we need to use it, how the different rate limiting algorithms provided with .NET 7.0 work, and best practices for using rate limiting in your application.
## What is rate limiting?
Whether accidental or intentional, users may exhaust resources in a way that impacts others. When a number of requests are received on to resources for a long time, the server can run out of those resources. These resources can include memory, threads, connections, or anything else that is limited. To avoid this situation, set rate limiters. Rate limiters control the consumption of resources used by an instance of an application, a user, an individual tenant, or an entire service.
## Why do you need to use rate limiting?
A rate limiting system is crucial in any application where you have to control or throttle user requests or traffic. This is especially true in applications running on a cloud hosting platform because the user’s traffic can affect the whole server where the application is hosted.
Why do you need to implement rate limiting? Here are a few reasons:
- To ensure that a system continues to meet service level agreements (SLA).
- To prevent a single user, tenant, service, or so on from monopolizing the resources provided by an application.
- To help cost-optimize a system by limiting the maximum resource levels needed to keep it functioning.
## Rate limiter algorithms
The [`RateLimiterOptionsExtensions`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.ratelimiting.ratelimiteroptionsextensions) class provides the following extension methods for rate limiting:
- **[Fixed window](https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/#fixed-window-limit)**: Fixed-window limits—such as 3,000 requests per hour or 10 requests per day—are easy to state, but they are subject to spikes at the edges of the window, as available quota resets. Consider, for example, a limit of 3,000 requests per hour, which still allows for a spike of all 3,000 requests to be made in the first minute of the hour, which might overwhelm the service.
- [**Sliding window**:](https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/#sliding-window-limit) Sliding windows have the benefits of a fixed window, but the rolling window of time smoothes out bursts. Systems such as Redis facilitate this technique with expiring keys.
- [**Token bucket**](https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/#token-bucket-limit): A token bucket maintains a rolling and accumulating budget of usage as a balance of tokens. A token bucket adds tokens at some rate. When a service request is made, the service attempts to withdraw a token (decrementing the token count) to fulfill the request. If there are no tokens in the bucket, the service has reached its limit and responds with backpressure.
- [**Concurrency**](https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0#concurrency-limiter): A concurrency limiter is the simplest form of rate limiting. It doesn’t look at time, just at number of concurrent requests.
In order to be a more realistic example, instead of making an example with each rate limiter algorithm, we will implement the following three algorithms in an **ABP-based** application.
1. We will add a `SlidingWindowLimiter` with a partition for all anonymous users.
2. We will add a `TokenBucketRateLimiter` with a partition for each authenticated user.
3. We will add a `ConcurrencyLimiter` with a partition for each Tenant.
**Note:** The following sample isn't meant for production code but is an example of how to use the limiters in ABP-based applications.
### Limiter with `OnRejected`, `RetryAfter`, and `GlobalLimiter`
#### Add rate limiter
Let's create the following method in the `MyProjectNameWebModule.cs` class in the `MyProjectName.Web` project.
**Note:** If the `**.Web` project is not in your application, you can do the same in the project where your application is hosted.
```csharp
private void ConfigureRateLimiters(ServiceConfigurationContext context)
{
context.Services.AddRateLimiter(limiterOptions =>
{
limiterOptions.OnRejected = (context, cancellationToken) =>
{
if (context.Lease.TryGetMetadata(MetadataName.RetryAfter, out var retryAfter))
{
context.HttpContext.Response.Headers.RetryAfter =
((int) retryAfter.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo);
}
context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests;
context.HttpContext.RequestServices.GetService<ILoggerFactory>()?
.CreateLogger("Microsoft.AspNetCore.RateLimitingMiddleware")
.LogWarning("OnRejected: {RequestPath}", context.HttpContext.Request.Path);
return new ValueTask();
};
limiterOptions.AddPolicy("UserBasedRateLimiting", context =>
{
var currentUser = context.RequestServices.GetService<ICurrentUser>();
if (currentUser is not null && currentUser.IsAuthenticated)
{
return RateLimitPartition.GetTokenBucketLimiter(currentUser.UserName, _ => new TokenBucketRateLimiterOptions
{
TokenLimit = 10,
QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
QueueLimit = 3,
ReplenishmentPeriod = TimeSpan.FromMinutes(1),
TokensPerPeriod = 4,
AutoReplenishment = true
});
}
return RateLimitPartition.GetSlidingWindowLimiter("anonymous-user",
_ => new SlidingWindowRateLimiterOptions
{
PermitLimit = 2,
QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
QueueLimit = 1,
Window = TimeSpan.FromMinutes(1),
SegmentsPerWindow = 2
});
});
limiterOptions.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(context =>
{
var currentTenant = context.RequestServices.GetService<ICurrentTenant>();
if (currentTenant is not null && currentTenant.IsAvailable)
{
return RateLimitPartition.GetConcurrencyLimiter(currentTenant!.Name, _ => new ConcurrencyLimiterOptions
{
PermitLimit = 5,
QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
QueueLimit = 1
});
}
return RateLimitPartition.GetNoLimiter("host");
});
});
}
```
In the above example, the `TokenBucketLimiter` is used for each authenticated user, while the `SlidingWindowLimiter` is used for all anonymous users. Additionally, as a global limiter, the `ConcurrencyLimiter` is used for each tenant, while rate limiting is disabled for the host(tenant is not available). Also, for requests that are rejected when the limit is reached, sets the response status code to [429 Too Many Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) and the response mentions when to retry (if available from the rate-limiting metadata).
Let's call the `ConfigureRateLimiters` method that we created in the `ConfigureServices` method.
The final version of the `ConfigureServices` method:
```csharp
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
ConfigureBundles();
ConfigureUrls(configuration);
ConfigurePages(configuration);
ConfigureAuthentication(context);
ConfigureImpersonation(context, configuration);
ConfigureAutoMapper();
ConfigureVirtualFileSystem(hostingEnvironment);
ConfigureNavigationServices();
ConfigureAutoApiControllers();
ConfigureSwaggerServices(context.Services);
ConfigureExternalProviders(context);
ConfigureHealthChecks(context);
ConfigureCookieConsent(context);
ConfigureTheme();
Configure<PermissionManagementOptions>(options =>
{
options.IsDynamicPermissionStoreEnabled = true;
});
ConfigureRateLimiters(context); // added
}
```
#### Add RateLimiter middleware
Add the following line just before the `app.UseConfiguredEndpoints(...)` line to add the `RateLimiter` middleware to your ASP.NET Core request pipeline:
```csharp
app.UseRateLimiter();
```
#### Use rate limiter for all controllers
Let's edit the `ConfiguredEndpoints` middleware as follows:
```csharp
app.UseConfiguredEndpoints(endpoints =>
{
endpoints.MapRazorPages()
.DisableRateLimiting();
endpoints.MapControllers()
.RequireRateLimiting("UserBasedRateLimiting");
});
```
- **DisableRateLimiting:** It is used to disable the `ConcurrencyLimiter` for razor pages, which we set globally when the tenant is available.
- **RequireRateLimiting:** We have enabled the rate limiter, which we define according to whether the user is authenticated or not, for all controllers.
## `EnableRateLimiting` and `DisableRateLimiting` attributes
It's kind of unrealistic to always use rate limiting for all controllers or pages. Sometimes, we may want to throttle a particular endpoint or page. In such cases, we can use the `EnableRateLimiting` and `DisableRateLimiting` attributes. The `EnableRateLimiting` and `DisableRateLimiting` attributes can be applied to a controller, action method, or razor rage. Check [here](https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0#enableratelimiting-and-disableratelimiting-attributes) for more.
## Rate limit an HTTP handler
Rate limiting when sending an HTTP request can be a good practice, especially in service-to-service communication. Because, resources are consumed by apps that rely on them, and when an app makes too many requests for a single resource, it can lead to *resource contention*. Resource contention occurs when a resource is consumed by too many clients, and the resource is unable to serve all of the apps that are requesting it. This can result in a poor user experience, and in some cases, it can even lead to a denial of service (DoS) attack. Since there are similar codes, I will not mention an example in this article, but to avoid such situations, you can write your own HTTP handler as [here](https://learn.microsoft.com/en-us/dotnet/core/extensions/http-ratelimiter#implement-a-delegatinghandler-subclass).
## How does it work?
[System.Threading.RateLimiting](https://www.nuget.org/packages/System.Threading.RateLimiting) provides the primitives for writing rate limiters as well as providing a few commonly used algorithms built-in. The main type is the abstract base class [RateLimiter](https://github.com/dotnet/runtime/blob/main/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/RateLimiter.cs).
```csharp
public abstract class RateLimiter : IAsyncDisposable, IDisposable
{
public abstract int GetAvailablePermits();
public abstract TimeSpan? IdleDuration { get; }
public RateLimitLease Acquire(int permitCount = 1);
public ValueTask<RateLimitLease> WaitAsync(int permitCount = 1, CancellationToken cancellationToken = default);
public void Dispose();
public ValueTask DisposeAsync();
}
```
`RateLimiter` contains `Acquire` and `WaitAsync` as the core methods for trying to gain permits for a resource that is being protected. Depending on the application, the protected resource may need to acquire more than 1 permits, so `Acquire` and `WaitAsync` both accept an optional `permitCount` parameter. `Acquire` is a synchronous method that will check if enough permits are available or not and return a `RateLimitLease` which contains information about whether you successfully acquired the permits or not. `WaitAsync` is similar to `Acquire` except that it can support queuing permit requests which can be de-queued at some point in the future when the permits become available, which is why it’s asynchronous and accepts an optional `CancellationToken` to allow canceling the queued request.
`RateLimitLease` has an `IsAcquired` property which is used to see if the permits were acquired. Additionally, the `RateLimitLease` may contain metadata such as a suggested retry-after period if the lease failed. Finally, the `RateLimitLease` is disposable and should be disposed when the code is done using the protected resource. The disposal will let the `RateLimiter` know to update its limits based on how many permits were acquired.
## Limitations
In most cases, the rate-limiting middleware provided with ASP.NET 7.0 will meet your requirements. However, if you would want to return statistics about your limits (e.g. [the way GitHub does](https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#rate-limit-http-headers)), you’ll find out that the ASP.NET rate limiting middleware does not support this. You won’t have access to the “number of requests remaining” or other metadata. Not in `OnRejected`, and definitely not if you want to return this data as headers on every request.
## Best practices for rate limiting
In order to use rate limiting properly, you need to have a solid understanding of the types of limiting available, as well as the data rate and data volume of your service. You also need to have a clear idea of how many users you expect to use your service as well as how they will interact with it. The best practices for rate limiting are as follows:
- Find the right rate limiter algorithm for your endpoint. I mean, the cost of an endpoint should be considered when selecting a limiter. The cost of an endpoint includes the resources used, for example, time, data access, CPU, and I/O.
- Set realistic limits. Once you’ve figured out all the above, you need to set realistic limits for each service. Then, before deploying an app using rate limiting to production, stress test the app to validate the rate limiters and options used. For example, create a [JMeter script](https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html) with a tool like [BlazeMeter](https://guide.blazemeter.com/hc/articles/207421695-Writing-your-first-JMeter-script) or [Apache JMeter HTTP(S) Test Script Recorder](https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html) and load the script to [Azure Load Testing](https://learn.microsoft.com/en-us/azure/load-testing/overview-what-is-azure-load-testing).
- In response to rate-limiting, intermittent, or non-specific errors, a client should generally retry the request after a delay. It is a best practice for this delay to increase exponentially after each failed request, which is referred to as *exponential backoff*. When many clients might be making schedule-based requests (such as fetching results every hour), additional random time (*jitter*) should be applied to the request timing, the backoff period, or both of them to ensure that these multiple client instances don't become periodic [thundering herd](https://www.wikiwand.com/en/Thundering_herd_problem), and cause a form of DDoS themselves.
## Conclusion
In this article, we’ve covered what rate limiting is, why you need to use it and the best practices for doing so. We’ve also looked at how to use three rate-limiting algorithms that are provided with .NET 7.0 on ABP-based applications and how rate-limiting works. Now that you’re familiar with the concept of rate limiting, it’s time to start implementing rate limiting in your application. This will allow you to control the traffic and ensure that your application is running smoothly without any issues.
## References
- https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0
- https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/
- https://blog.maartenballiauw.be/post/2022/09/26/aspnet-core-rate-limiting-middleware.html
- https://learn.microsoft.com/en-us/dotnet/core/extensions/http-ratelimiter
- https://learn.microsoft.com/en-us/azure/architecture/patterns/rate-limiting-pattern
- https://learn.microsoft.com/en-us/azure/architecture/patterns/throttling
- https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet
- https://cloud.google.com/architecture/rate-limiting-strategies-techniques

BIN
docs/en/Community-Articles/2022-11-29-Rate-Limiting/cover-image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 KiB

68
docs/en/Community-Articles/2022-12-29-Use-Weixin-Authentication-for-MVC-Applications/Post.md

@ -0,0 +1,68 @@
# How to Use the Weixin Authentication for MVC / Razor Page Applications
This guide demonstrates how to integrate Weixin to an ABP application that enables users to sign in using OAuth 2.0 with credentials.
## Create a sandbox account
If you don't have a production account, you can create a sendbox account for testing: https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
In this article we will use the sandbox account.
> You should configure the callback domain name on the Weixin open platform
## AddWeixin
You need to install `AspNet.Security.OAuth.Weixin` package to your **.Web** project.
In your **.Web** project, locate your **ApplicationWebModule** and modify `ConfigureAuthentication` method with the following:
```csharp
private void ConfigureAuthentication(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme);
context.Services.AddAuthentication()
.AddWeixin(options =>
{
options.ClientId = configuration["Weixin:ClientId"];
options.ClientSecret = configuration["Weixin:ClientSecret"];
});
}
```
Updating `appsettings.json` to add `Weixin` section:
````json
"Weixin": {
"ClientId": "<your-app-id>",
"ClientSecret": "<your-app-secret>"
}
````
## Web page authorization
Now you can run the application to login with Weixin.
![login-with-weixin](login-with-weixin.jpg)
It will redirect to weixin platform to scan the QR code.
> The sandbox account lacks the necessary scope, so it may not work properly.
## Official account authorization
Updating `AddWeixin`:
```csharp
context.Services.AddAuthentication()
.AddWeixin(options =>
{
options.ClientId = configuration["Weixin:ClientId"];
options.ClientSecret = configuration["Weixin:ClientSecret"];
options.AuthorizationEndpoint = "https://open.weixin.qq.com/connect/oauth2/authorize";
});
```
Now you can use WeChat app to open the web application URL to login with weixin.
![offical-account](offical-account.jpg)

BIN
docs/en/Community-Articles/2022-12-29-Use-Weixin-Authentication-for-MVC-Applications/login-with-weixin.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
docs/en/Community-Articles/2022-12-29-Use-Weixin-Authentication-for-MVC-Applications/offical-account.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

300
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/POST.md

@ -0,0 +1,300 @@
# What's new with .NET 7?
In this article, I will highlight a few interesting features that are now available with the release of C# 11 and .NET 7.
> If you are considering using ABP 7.0, you should update your projects to .NET 7. There is a good community article you might want to check out 👉 "[Upgrade Your Existing Projects to .NET7](https://community.abp.io/posts/upgrade-your-existing-projects-to-.net7-nmx6vm9m)".
There are many new features coming with this release. We are going to examine new features within 4 sub-sections: ASP.NET Core, C#11, EF 7 and MAUI. Let's start with ASP.NET Core.
## ASP.NET Core
We will see the following features in this section:
* Rate Limiting
* Output Caching
* Built-in HTTP/3 Support
* gRPC - JSON Transcoding
* Blazor
* Custom Elements
* Improvements on JavaScript Interop for WASM
### Rate Limiting
Rate limiting is a way to limit request frequency for a limited time. Before .NET 7 we didn’t have built-in support so we would need to implement it ourselves, use some NuGet packages around or let the CDN provider do this on server level on behalf of us (like Cloudflare).
With .NET 7, built-in Rate Limiting support has been added and we can easily define rate-limiting policies and attach them to our endpoints.
*Defining rate-limiting policy and registering the required services to the DI container*:
![](rate-limiting-1.png)
*Adding the middleware to the request pipeline and using the defined policy*:
![](rate-limiting-2.png)
### Output Caching
Output Caching is a new middleware that provides a caching mechanism and allows you to store results from your web application and serve them from a cache rather than computing them every time. This improves performance and frees up resources for other tasks.
It’s pretty straightforward to use output caching in minimal APIs.
You just need to create an endpoint and use the `CacheOutput` method with an expiration time. Then when someone sends a request to your endpoint, it will be cached for a specified time and not calculate the result every time.
For the following example, the result will be the same for 10 minutes:
```csharp
app.MapGet("/cached-output", () => $"Minute: {DateTime.Now.Minute}")
.CacheOutput(options =>
{
output.Expire(TimeSpan.FromMinutes(10));
});
```
### Built-in HTTP/3 Support
In .NET 6, HTTP/3 was introduced for experimental purposes and now with .NET 7 it’s fully supported. But it's not enabled by default, it's understandable since it's still new and only %20 of the applications currently use it, on the other hand, HTTP/2 is used by almost every application.
To enable the HTTP/3 support, we need to configure it in our **Program.cs** file:
```csharp
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
```
### gRPC - JSON Transcoding
gRPC is a high-performance RPC framework and uses HTTP/2 and Protobuf. Despite the benefits that gRPC brings, REST APIs have an important place in modern web applications.
gRPC - JSON Transcoding is an extension for ASP.NET Core that creates RESTful JSON APIs for gRPC services.
![](json-transcoding.png)
It's a really good feature and allows us to expose our gRPC services as REST APIs. It's worth checking out 👉 [JSON Transcoding](https://learn.microsoft.com/en-us/aspnet/core/grpc/json-transcoding?view=aspnetcore-7.0).
> I've created a separate community article for this feature. Check it from [here](https://community.abp.io/posts/grpc-json-transcoding-16eai2zw).
### Blazor
We are going to cover two new features for Blazor:
* Custom Elements
* Improvements on JavaScript Interop for WASM
#### Custom Elements
Blazor Custom Elements provide a way to dynamically render Razor Components from other SPA frameworks/libraries such as Angular and React.
To be able to use custom elements, there are two steps that need to be done:
**1-) Registering a Razor Component as a Custom Element:**
```csharp
builder.Services.AddServerSideBlazor(options =>
{
options.RootComponents.RegisterCustomElement<Counter>("my-counter");
});
```
**2-) Using the Custom Element**
```html
<my-counter increment-amount={incrementAmount} />
```
#### Improvements on JavaScript Interop for WASM
JavaScript `[JsImport]` / `[JsExport]` interop API released with .NET 7.
* To import a JS function to call it from C# -> `[JsImport]`
* To export a .NET method so that it can be called from JavaScript -> `[JsExport]` attributes should be used.
## C# 11
There are great features that came with C# 11. In this article, we are going to only cover the following ones:
* Required Members
* Generic Attributes
* Raw String Literals
* List Patterns
### Required Members
C# 11 introduces a new **required** keyword to allow us to ensure property initialization on object creation.
We just need to use the **required** keyword before the property type. That’s it. Then if we try to create an object without initializing the required properties, compile-time errors will be shown:
![](required-members.png)
### Generic Attributes
Generic Attributes are also one of the good features that came with C# 11. Before C#11, creating a typed attribute was cumbersome. We would need to pass a **Type** object as an argument to our constructor and assign it to a property in our attribute class and do stuff with this **Type** property.
With C#11, Generic Attributes are introduced. Now, it’s possible to easily create generic attributes like creating generic classes:
```csharp
//defining a generic attribute
public class GenericAttribute<T> : Attribute { }
//using the attribute
[GenericAttribute<int>]
public int MyMethod() => default;
```
### Raw String Literals
Raw String Literals is a great syntactic sugar that came with C#11. It allows containing of arbitrary text without escaping.
By wrapping a string with three double quotes (”””...”””), we are free to put any string value into variables:
```csharp
var jsonContent = """
{
"name": ".NET 7",
"feature": "Raw String Literals"
}
""";
```
Also, we can use string interpolation with this new syntax. We just need to add a $ sign before the first triple quotes:
![](raw-string-literals.png)
### List Patterns
C# 11 introduces the “List Pattern”. It expands the pattern matching for lists and arrays. There are three different ways for list pattern matching:
#### 1-) Discard Pattern
This pattern can be helpful to match one or more elements from a sequence if we know the length of the sequence.
![](discard-pattern.png)
#### 2-) Range Pattern
If the length of the sequence is not known, then the range pattern may be useful. We can use this pattern to check the first or/and last element from a sequence.
![](range-pattern.png)
#### 3-) var Pattern
This pattern allows us to capture an element at that position and use the variable in our code.
![](var-pattern.png)
## Entity Framework Core 7
There are too many improvements and new features that were shipped with EF Core 7. Here's what we're going to cover in this article:
* JSON Columns
* Improvements on Bulk Updates & Deletes
* Performance Improvements on SaveChanges & SaveChangesAsync
### JSON Columns
EF 7 supports JSON Columns and this allows the mapping of aggregates built from .NET types to JSON documents.
Thus, it's kind of combines relational databases and document-based databases in a way.
We can easily mark a column as a JSON column on the `OnModelCreating` method of our `DbContext` class:
```csharp
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Author>().OwnsOne(
author => author.Contact, ownedNavigationBuilder =>
{
ownedNavigationBuilder.ToJson();
ownedNavigationBuilder.OwnsOne(contactDetails => contactDetails.Address);
});
}
```
Also with this version, LINQ JSON query support has been announced. So, we can query over JSON Columns using LINQ as below:
```csharp
var posts = await context.Posts
.AsNoTracking()
.Select(
post => new
{
post.Author!.Name,
post.Metadata!.Views,
Searches = post.Metadata.TopSearches,
Commits = post.Metadata.Updates
})
.ToListAsync();
```
### Improvements on Bulk Updates & Deletes
EF 7 introduces the new **ExecuteUpdateAsync** and **ExecuteDeleteAsync** methods. By using these methods while making bulk updates or deletes, we can take out the change tracker in this process and this brings great performance gains.
Example:
```csharp
await (await GetDbContextAsync()).Tags
.Where(tag => tag.Description.Contains("ABP"))
.ExecuteDeleteAsync();
```
### Performance Improvements on SaveChanges & SaveChangesAsync
With EF 7, there are significant performance improvements on SaveChanges & SaveChangesAsync methods. According to the EF Core team, in some cases, saving changes is now four times faster than EF 6. You can see a simple benchmark result from the EF Core blog post here.
![](benchmark.png)
Even after inserting just four records, there is a significant performance gain.
## .NET MAUI 7
As you know, .NET MAUI is a cross-platform framework for creating native mobile and desktop applications by using C# and XAML. By using the .NET MAUI, apps that can run on Android, IOS, macOS and Windows from a single-code base can be developed.
It’s a new technology, so it's evolving and the .NET MAUI team introduces good features with every release.
In this article, I will only mention a new feature called "Map Control" and some enhancements made with this release.
### Map Control
.NET MAUI 7 introduces **Map Control**. This provides us a good native map experience.
It supports pins, polygons, circles, geolocations and much more...
![](maui.png)
### Improvements on Mobile Rendering & Desktop Enhancements
.NET MAUI 7 came with optimized rendering for mobile applications and is much faster than .NET MAUI 6.
Also, there are some good enhancements on the desktop side:
* Window size and position,
* Context Menus (which there was a kind of bug and was not seen on some MAUI Controls for Windows applications),
* Tooltips,
* Gestures and more...
---
## Conclusion
In this article, I've highlighted some features that were shipped with .NET 7.
> I've added a references section down below, so you can check the references and see other features that came with this version.
Thanks for reading the article and I hope you find it helpful. See you in the next one!
## References
* https://devblogs.microsoft.com/dotnet/announcing-dotnet-7/
* https://devblogs.microsoft.com/dotnet/announcing-asp-net-core-in-dotnet-7
* https://devblogs.microsoft.com/dotnet/announcing-ef7
* https://devblogs.microsoft.com/dotnet/dotnet-maui-dotnet-7
* https://devblogs.microsoft.com/dotnet/welcome-to-csharp-11
* https://www.milanjovanovic.tech/blog/whats-new-in-dotnet-7

BIN
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/benchmark.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

BIN
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/discard-pattern.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

BIN
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/json-transcoding.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

BIN
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/maui.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/range-pattern.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/rate-limiting-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

BIN
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/rate-limiting-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/raw-string-literals.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/required-members.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
docs/en/Community-Articles/2022-18-11-whats-new-with-net7/var-pattern.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

86
docs/en/Community-Articles/2023-02-06-Converting-Create-Edit-Modal-To-Page/POST.md

@ -0,0 +1,86 @@
# Converting Create/Edit Modal to Page
In this document we will explain how to convert BookStore's `Books` create & edit modals to regular razor pages.
## Before
![before](images/old.gif)
## Now
![after](images/new.gif)
## Index page
Repalce `abp-button(NewBookButton)` buttom with `<a class="btn btn-primary" href="/Books/CreateModal"><i class="fa fa-plus"></i> @L["NewBook"].Value</a>`.
## Index js file
Remove the related codes of `createModal` and `editModal`.
Change the `Edit row action` with `location.href = "/Books/EditModal?id=" + data.record.id;`
## Create/Edit Book page
Remove `Layout = null;` and add some custom style and javascript code to `CreateModal.cshtml` & `EditModal.cshtml`.
```csharp
@section styles {
<style>
.abp-view-modal .modal {
position: static;
display: block;
opacity: inherit !important;
}
.abp-view-modal .modal.fade .modal-dialog {
transition: inherit !important;
transform: inherit !important;;
}
.abp-view-modal .modal-header .btn-close {
display: none;
}
</style>
}
@section scripts {
<script>
$(".abp-view-modal form").abpAjaxForm().on('abp-ajax-success', function () {
location.href = "/Books";
});
</script>
}
```
Add a `div` element with `abp-view-modal` class to wrap the `abp-dynamic-form`, Set size of `abp-modal` to `ExtraLarge` and remove the `AbpModalButtons.Cancel` button from `abp-modal-footer`.
### CreateModal
```csharp
<div class="abp-view-modal">
<abp-dynamic-form abp-model="Book" asp-page="/Books/CreateModal">
<abp-modal static="true" size="ExtraLarge">
<abp-modal-header title="@L["NewBook"].Value"></abp-modal-header>
<abp-modal-body>
<abp-form-content />
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal>
</abp-dynamic-form>
</div>
```
### EditModal
```csharp
<div class="abp-view-modal">
<abp-dynamic-form abp-model="Book" asp-page="/Books/EditModal">
<abp-modal size="ExtraLarge">
<abp-modal-header title="@L["Update"].Value"></abp-modal-header>
<abp-modal-body>
<abp-form-content />
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal>
</abp-dynamic-form>
</div>
```
You can check this Git commit for details.
https://github.com/abpframework/abp-samples/commit/f3014e0ec422cb2d8816d0e00dd6ab9cc1adfc21

BIN
docs/en/Community-Articles/2023-02-06-Converting-Create-Edit-Modal-To-Page/images/new.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

BIN
docs/en/Community-Articles/2023-02-06-Converting-Create-Edit-Modal-To-Page/images/old.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

68
docs/en/Distributed-Event-Bus.md

@ -296,6 +296,74 @@ This example;
> Distributed event system use the [object to object mapping](Object-To-Object-Mapping.md) system to map `Product` objects to `ProductEto` objects. So, you need to configure the object mapping (`Product` -> `ProductEto`) too. You can check the [object to object mapping document](Object-To-Object-Mapping.md) to learn how to do it.
## Entity Synchronizer
In a distributed (or microservice) system, it is typical to subscribe to change events for an [entity](Entities.md) type of another service, so you can get notifications when the subscribed entity changes. In that case, you can use ABP's Pre-Defined Events as explained in the previous section.
If your purpose is to store your local copies of a remote entity, you typically subscribe to create, update and delete events of the remote entity and update your local database in your event handler. ABP provides a pre-built `EntitySynchronizer` base class to make that operation easier for you.
Assume that there is a `Product` entity (probably an aggregate root entity) in a Catalog microservice, and you want to keep copies of the products in your Ordering microservice, with a local `OrderProduct` entity. In practice, properties of the `OrderProduct` class will be a subset of the `Product` properties, because not all the product data is needed in the Ordering microservice (however, you can make a full copy if you need). Also, the `OrderProduct` entity may have additional properties that are populated and used in the Ordering microservice.
The first step to establish the synchronization is to define an ETO (Event Transfer Object) class in the Catalog microservice that is used to transfer the event data. Assuming the `Product` entity has a `Guid` key, your ETO can be as shown below:
````csharp
[EventName("product")]
public class ProductEto : EntityEto<Guid>
{
// Your Product properties here...
}
````
`ProductEto` can be put in a shared project (DLL) that is referenced by the Catalog and the Ordering microservices. Alternatively, you can put a copy of the `ProductEto` class in the Ordering microservice if you don't want to introduce a common project dependency between the services. In this case, the `EventName` attribute becomes critical to map the `ProductEto` classes across two services (you should use the same event name).
Once you define an ETO class, you should configure the ABP Framework to publish auto (create, update and delete) events for the `Product` entity, as explained in the previous section:
````csharp
Configure<AbpDistributedEntityEventOptions>(options =>
{
options.AutoEventSelectors.Add<Product>();
options.EtoMappings.Add<Product, ProductEto>();
});
````
Finally, you should create a class in the Ordering microservice, that is derived from the `EntitySynchronizer` class:
````csharp
public class ProductSynchronizer : EntitySynchronizer<OrderProduct, Guid, ProductEto>
{
public ProductSynchronizer(
IObjectMapper objectMapper,
IRepository<OrderProduct, Guid> repository
) : base(objectMapper, repository)
{
}
}
````
The main point of this class is it subscribes to the create, update and delete events of the source entity and updates the local entity in the database. It uses the [Object Mapper](Object-To-Object-Mapping.md) system to create or update the `OrderProduct` objects from the `ProductEto` objects. So, you should also configure the object mapper to make it properly work. Otherwise, you should manually perform the object mapping by overriding the `MapToEntityAsync(TSourceEntityEto)` and `MapToEntityAsync(TSourceEntityEto,TEntity)` methods in your `ProductSynchronizer` class.
If your entity has a composite primary key (see the [Entities document](Entities.md)), then you should inherit from the `EntitySynchronizer<TEntity, TSourceEntityEto>` class (just don't use the `Guid` generic argument in the previous example) and implement `FindLocalEntityAsync` to find the entity in your local database using the `Repository`.
`EntitySynchronizer` is compatible with the *Entity Versioning* system (see the [Entities document](Entities.md)). So, it works as expected even if the events are received as disordered. If the entity's version in your local database is newer than the entity in the received event, then the event is ignored. You should implement the `IHasEntityVersion` interface for the entity and ETO classes (for this example, you should implement for the `Product`, `ProductEto` and `OrderProduct` classes).
If you want to ignore some type of change events, you can set `IgnoreEntityCreatedEvent`, `IgnoreEntityUpdatedEvent` and `IgnoreEntityDeletedEvent` in the constructor of your class. Example:
````csharp
public class ProductSynchronizer
: EntitySynchronizer<OrderProduct, Guid, ProductEto>
{
public ProductSynchronizer(
IObjectMapper objectMapper,
IRepository<OrderProduct, Guid> repository
) : base(objectMapper, repository)
{
IgnoreEntityDeletedEvent = true;
}
}
````
> Notice that the `EntitySynchronizer` can only create/update the entities after you use it. If you have an existing system with existing data, you should manually copy the data for one time, because the `EntitySynchronizer` starts to work.
## Transaction and Exception Handling
Distributed event bus works in-process (since default implementation is `LocalDistributedEventBus`) unless you configure an actual provider (e.g. [Kafka](Distributed-Event-Bus-Kafka-Integration.md) or [RabbitMQ](Distributed-Event-Bus-RabbitMQ-Integration.md)). In-process event bus always executes event handlers in the same [unit of work](Unit-Of-Work.md) scope that you publishes the events in. That means, if an event handler throws an exception, then the related unit of work (the database transaction) is rolled back. In this way, your application logic and event handling logic becomes transactional (atomic) and consistent. If you want to ignore errors in an event handler, you must use a `try-catch` block in your handler and shouldn't re-throw the exception.

15
docs/en/Entities.md

@ -324,6 +324,21 @@ It's designed as read-only and automatically invalidates a cached entity if the
> See the [Entity Cache](Entity-Cache.md) documentation for more information.
## Versioning Entities
ABP defines the `IHasEntityVersion` interface for automatic versioning of your entities. It only provides a single `EntityVersion` property, as shown in the following code block:
````csharp
public interface IHasEntityVersion
{
int EntityVersion { get; }
}
````
If you implement the `IHasEntityVersion` interface, ABP automatically increases the `EntityVersion` value whenever you update your entity. The initial `EntityVersion` value will be `0`, when you first create an entity and save to the database.
> ABP can not increase the version if you directly execute SQL `UPDATE` commands in the database. It is your responsibility to increase the `EntityVersion` value in that case. Also, if you are using the aggregate pattern and change sub-collections of an aggregate root, it is your responsibility if you want to increase the version of the aggregate root object.
## Extra Properties
ABP defines the `IHasExtraProperties` interface that can be implemented by an entity to be able to dynamically set and get properties for the entity. `AggregateRoot` base class already implements the `IHasExtraProperties` interface. If you've derived from this class (or one of the related audit class defined above), you can directly use the API.

20
docs/en/Entity-Framework-Core.md

@ -834,7 +834,7 @@ One advantage of using an interface for a DbContext is then it will be replaceab
Once you properly define and use an interface for DbContext, then any other implementation can use the following ways to replace it:
**ReplaceDbContextAttribute**
#### ReplaceDbContext Attribute
```csharp
[ReplaceDbContext(typeof(IBookStoreDbContext))]
@ -844,7 +844,7 @@ public class OtherDbContext : AbpDbContext<OtherDbContext>, IBookStoreDbContext
}
```
**ReplaceDbContext option**
#### ReplaceDbContext Option
````csharp
context.Services.AddAbpDbContext<OtherDbContext>(options =>
@ -856,6 +856,22 @@ context.Services.AddAbpDbContext<OtherDbContext>(options =>
In this example, `OtherDbContext` implements `IBookStoreDbContext`. This feature allows you to have multiple DbContext (one per module) on development, but single DbContext (implements all interfaces of all DbContexts) on runtime.
#### Replacing with Multi-Tenancy
It is also possible to replace a DbContext based on the [multi-tenancy](Multi-Tenancy.md) side. `ReplaceDbContext` attribute and `ReplaceDbContext` method can get a `MultiTenancySides` option with a default value of `MultiTenancySides.Both`.
**Example:** Replace DbContext only for tenants, using the `ReplaceDbContext` attribute
````csharp
[ReplaceDbContext(typeof(IBookStoreDbContext), MultiTenancySides.Tenant)]
````
**Example:** Replace DbContext only for the host side, using the `ReplaceDbContext` method
````csharp
options.ReplaceDbContext<IBookStoreDbContext>(MultiTenancySides.Host);
````
### Split Queries
ABP enables [split queries](https://docs.microsoft.com/en-us/ef/core/querying/single-split-queries) globally by default for better performance. You can change it as needed.

19
docs/en/Migration-Guides/Abp-7_1.md

@ -0,0 +1,19 @@
# ABP Version 7.1 Migration Guide
This document is a guide for upgrading ABP v7.0 solutions to ABP v7.1. There are a few changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application.
## Navigation Menu - `CustomData` type changed to `Dictionary<string, object>`
`ApplicationMenu` and `ApplicationMenuItem` classes' `CustomData` property type has been changed to `Dictionary<string, object>`. So, if you use the optional `CustomData` property of these classes, change it accordingly. See [#15608](https://github.com/abpframework/abp/pull/15608) for more information.
*Old usage:*
```csharp
var menu = new ApplicationMenu("Home", L["Home"], "/", customData: new MyCustomData());
```
*New usage:*
```csharp
var menu = new ApplicationMenu("Home", L["Home"], "/").WithCustomData("CustomDataKey", new MyCustomData());
```

1
docs/en/Migration-Guides/Index.md

@ -2,6 +2,7 @@
The following documents explain how to migrate your existing ABP applications. We write migration documents only if you need to take an action while upgrading your solution. Otherwise, you can easily upgrade your solution using the [abp update command](../Upgrading.md).
- [7.0 to 7.1](Abp-7_1.md)
- [6.0 to 7.0](Abp-7_0.md)
- [5.3 to 6.0](Abp-6_0.md)
- [5.2 to 5.3](Abp-5_3.md)

6
docs/en/Modules/Cms-Kit/Blogging.md

@ -2,6 +2,12 @@
The blogging feature provides the necessary UI to manage and render blogs and blog posts.
## Enabling the Blogging Feature
By default, CMS Kit features are disabled. Therefore, you need to enable the features you want, before starting to use it. You can use the [Global Feature](../../Global-Features.md) system to enable/disable CMS Kit features on development time. Alternatively, you can use the ABP Framework's [Feature System](https://docs.abp.io/en/abp/latest/Features) to disable a CMS Kit feature on runtime.
> Check the ["How to Install" section of the CMS Kit Module documentation](Index.md#how-to-install) to see how to enable/disable CMS Kit features on development time.
## User Interface
### Menu Items

25
docs/en/Modules/Cms-Kit/Comments.md

@ -1,10 +1,16 @@
# CMS Kit: Comments
CMS kit provides a **comment** system to add comments feature to any kind of resource, like blog posts, products, etc.
CMS kit provides a **comment** system to add the comment feature to any kind of resource, like blog posts, products, etc.
## Enabling the Comment Feature
By default, CMS Kit features are disabled. Therefore, you need to enable the features you want, before starting to use it. You can use the [Global Feature](../../Global-Features.md) system to enable/disable CMS Kit features on development time. Alternatively, you can use the ABP Framework's [Feature System](https://docs.abp.io/en/abp/latest/Features) to disable a CMS Kit feature on runtime.
> Check the ["How to Install" section of the CMS Kit Module documentation](Index.md#how-to-install) to see how to enable/disable CMS Kit features on development time.
## Options
The comment system provides a mechanism to group comment definitions by entity types. For example, if you want to use comment system for blog posts and products, you need to define two entity types named `BlogPosts` and `Product`, and add comments under these entity types.
The comment system provides a mechanism to group comment definitions by entity types. For example, if you want to use the comment system for blog posts and products, you need to define two entity types named `BlogPosts` and `Product`, and add comments under these entity types.
`CmsKitCommentOptions` can be configured in the domain layer, in the `ConfigureServices` method of your [module](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Example:
@ -12,14 +18,16 @@ The comment system provides a mechanism to group comment definitions by entity t
Configure<CmsKitCommentOptions>(options =>
{
options.EntityTypes.Add(new CommentEntityTypeDefinition("Product"));
options.IsRecaptchaEnabled = true; //false by default
});
```
> If you're using the blog feature, the ABP framework defines an entity type for the blog feature automatically. You can easily override or remove the predefined entity types in `Configure` method like shown above.
> If you're using the [Blogging Feature](Blogging.md), the ABP framework defines an entity type for the blog feature automatically. You can easily override or remove the predefined entity types in `Configure` method like shown above.
`CmsKitCommentOptions` properties:
- `EntityTypes`: List of defined entity types(`CmsKitCommentOptions`) in the comment system.
- `IsRecaptchaEnabled`: This flag enables or disables the reCaptcha for the comment system. You can set it as **true** if you want to use reCaptcha in your comment system.
`CommentEntityTypeDefinition` properties:
@ -33,11 +41,12 @@ The comment system provides a commenting [widget](../../UI/AspNetCore/Widgets.md
@await Component.InvokeAsync(typeof(CommentingViewComponent), new
{
entityType = "Product",
entityId = "..."
entityId = "...",
referralLinks = new [] {"nofollow"}
})
```
`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here.
`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. `referralLinks` is an optional parameter. You can use this parameter to add values (such as "nofollow", "noreferrer", or any other values) to the [rel attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel) of links.
## User Interface
@ -77,7 +86,7 @@ A comment represents a written comment from a user.
This module follows the [Repository Best Practices & Conventions](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories) guide.
Following custom repositories are defined for this feature:
The following custom repositories are defined for this feature:
- `ICommentRepository`
@ -93,8 +102,8 @@ This module follows the [Domain Services Best Practices & Conventions](https://d
#### Application services
- `CommentAdminAppService` (implements `ICommentAdminAppService`): Implements the use cases of comment management system, like listing or removing comments etc.
- `CommentPublicAppService` (implements `ICommentPublicAppService`): Implements the use cases of comment management on the public websites, like listing comments, adding comments etc.
- `CommentAdminAppService` (implements `ICommentAdminAppService`): Implements the use cases of the comment management system, like listing or removing comments etc.
- `CommentPublicAppService` (implements `ICommentPublicAppService`): Implements the use cases of the comment management on the public websites, like listing comments, adding comments etc.
### Database providers

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

Loading…
Cancel
Save