Browse Source

Merge branch 'dev' into auto-merge/rel-7-1/1815

pull/16028/head
Enis Necipoglu 3 years ago
committed by GitHub
parent
commit
a4c8d7e503
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/zh-Hans.json
  2. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
  3. 57
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json
  4. 5
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
  5. 29
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json
  6. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/en.json
  7. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/zh-Hans.json
  8. 5
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json
  9. 21
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json
  10. 9
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  11. 23
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json
  12. 20
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json
  13. 20
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json
  14. 22
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json
  15. 24
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json
  16. 20
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json
  17. 23
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
  18. 20
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json
  19. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
  20. 7
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json
  21. 1
      abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/zh-Hans.json
  22. 12
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json
  23. 2
      common.props
  24. 36
      docs/en/Background-Jobs.md
  25. 37
      docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/POST.md
  26. BIN
      docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/citext-1.jpg
  27. BIN
      docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/citext-2.jpg
  28. BIN
      docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/citext-3.jpg
  29. BIN
      docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/db-converter.jpg
  30. BIN
      docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/mssql-postges.png
  31. BIN
      docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/mssql.png
  32. BIN
      docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/sql-server-to-postgres.jpg
  33. 49
      docs/en/Blog-Posts/2023-03-16-Migration-Abp.io-Azure/POST.md
  34. BIN
      docs/en/Blog-Posts/2023-03-16-Migration-Abp.io-Azure/images/abpio-azure.png
  35. BIN
      docs/en/Blog-Posts/2023-03-16-Migration-Abp.io-Azure/images/az-infra.png
  36. BIN
      docs/en/Blog-Posts/2023-03-16-Migration-Abp.io-Azure/images/speed.png
  37. BIN
      docs/en/Blog-Posts/2023-03-16-Migration-Abp.io-Azure/images/terra-wire.png
  38. 44
      docs/en/Community-Articles/2023-02-22-Streamline-Localization-In-Your-ABP-Project/POST.md
  39. BIN
      docs/en/Community-Articles/2023-02-22-Streamline-Localization-In-Your-ABP-Project/images/Part1.gif
  40. BIN
      docs/en/Community-Articles/2023-02-22-Streamline-Localization-In-Your-ABP-Project/images/Part2.gif
  41. BIN
      docs/en/Community-Articles/2023-02-22-Streamline-Localization-In-Your-ABP-Project/images/Part3.gif
  42. 37
      docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/POST.md
  43. BIN
      docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/images/citext-1.jpg
  44. BIN
      docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/images/citext-2.jpg
  45. BIN
      docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/images/citext-3.jpg
  46. BIN
      docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/images/db-converter.jpg
  47. BIN
      docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/images/sql-server-to-postgres.jpg
  48. 309
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/Post.md
  49. BIN
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/database-tables.png
  50. BIN
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/identification-number.png
  51. BIN
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/open-terminal.png
  52. BIN
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/run-dbmigrator.png
  53. BIN
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/solution-image.png
  54. BIN
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/user-department.png
  55. BIN
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/users-page-department.png
  56. BIN
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/users-page.png
  57. BIN
      docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/users-table.png
  58. 10
      docs/en/Dependency-Injection.md
  59. 36
      docs/en/Multi-Tenancy.md
  60. 2
      docs/en/Tutorials/Part-10.md
  61. 52
      docs/en/UI/Angular/Card-Component.md
  62. 2
      docs/en/UI/Angular/Quick-Start.md
  63. BIN
      docs/en/UI/Angular/images/abp-card-component.png
  64. 54
      docs/en/UI/AspNetCore/Navigation-Menu.md
  65. 6
      docs/en/UI/AspNetCore/Tag-Helpers/Form-elements.md
  66. 21
      docs/en/UI/Blazor/Basic-Theme.md
  67. 53
      docs/en/UI/Blazor/Navigation-Menu.md
  68. 2
      docs/en/UI/Blazor/Overall.md
  69. 2
      docs/en/UI/Blazor/Theming.md
  70. 10
      docs/zh-Hans/Dependency-Injection.md
  71. 2
      docs/zh-Hans/Tutorials/Part-10.md
  72. 56
      framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs
  73. 12
      framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj
  74. 23
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/Configuration/BlazorWebAssemblyCurrentApplicationConfigurationCacheResetService.cs
  75. 9
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/FlagIconCss/FlagIconCssStyleContributor.cs
  76. 14
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Select2/Select2ScriptContributor.cs
  77. 2
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js
  78. 2
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/AbpAspNetCoreMvcUiWidgetsModule.cs
  79. 16
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
  80. 2
      framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs
  81. 2
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingModule.cs
  82. 4
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingOptions.cs
  83. 4
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs
  84. 2
      framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj
  85. 2
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobsAbstractionsModule.cs
  86. 5
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AsyncBackgroundJob.cs
  87. 3
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJob.cs
  88. 19
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs
  89. 3
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAsyncBackgroundJob.cs
  90. 4
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJob.cs
  91. 10
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs
  92. 8
      framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs
  93. 9
      framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs
  94. 2
      framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs
  95. 3
      framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs
  96. 22
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs
  97. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/IAuthService.cs
  98. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/LoginInfo.cs
  99. 30
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs
  100. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginInfoCommand.cs

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

@ -11,6 +11,7 @@
"CommercialSupportWebSite": "商业版支持网站",
"CommunityWebSite": "ABP社区网站",
"ManageAccount": "我的帐户 | ABP.IO",
"ManageYourProfile": "管理您的个人资料"
"ManageYourProfile": "管理您的个人资料",
"ReturnToApplication": "返回应用"
}
}

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

@ -421,7 +421,7 @@
"ContentCacheSlidingExpirationByDay": "Content Cache Sliding Expiration By Day",
"MaxDaysForCaching": "Max Days For Caching",
"Enabled": "Enabled",
"Menu:NugetPackagesContentCache": "NuGet Packages Content Cache",
"Menu:NugetPackagesContentCache": "NuGet 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.",

57
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json

@ -220,6 +220,7 @@
"SuccessfullyReIndexAllPosts": "成功索引所有的帖子",
"Permission:FullSearch": "全文检索",
"Menu:CliAnalytics": "客户端分析",
"Menu:Reports": "报表",
"TemplateName": "模板名称",
"TemplateVersion": "模板版本",
"DatabaseProvider": "数据库提供者",
@ -231,8 +232,10 @@
"UiFramework": "界面框架",
"Options": "选项",
"CliAnalytics": "客户端分析",
"Reports": "报表",
"Permission:CliAnalyticses": "客户端分析",
"Permission:CliAnalytics": "客户端分析",
"Permission:Reports": "报表",
"Search": "搜索",
"ClearFilter": "清除过滤",
"LicensePrivateKey": "许可私有密钥",
@ -397,6 +400,58 @@
"BookDiscountDeletionConfirmationMessage": "你确定要删除这个书籍折扣吗?",
"CustomPaymentFlexSwitchDescription": "授权",
"AllowFeatureUpgradeOnLicenseExpire": "允许在授权过期时进行功能升级",
"Deleted{0}": "[已删除 {0}]"
"Deleted{0}": "[已删除 {0}]",
"Tags": "标签",
"SetTagsInfo": "标签使用逗号分隔,例如:CSharp, Entity Framework",
"RejectTrialLicenseWarningMessage": "您确定要拒绝这个试用许可证申请吗?",
"ExportToExcel": "导出Excel",
"OverallTotalPrice": "总价",
"OverallDiscountPrice": "折扣价",
"OverallDiscountText": "折扣内容",
"SelectReport": "- 选择报表 -",
"NoDataAvailable": "无数据",
"StatisticsOfCachedContents": "nuget.abp.io缓存的NuGet包内容统计",
"Compact": "紧凑型",
"EditSettings": "编辑设置",
"CurrentEstimatedSize": "当前预计规模",
"CurrentEntryCount": "当前数量",
"TotalHits": "点击量",
"TotalMisses": "未命中总数",
"NoResponseFrom": "没有收到任何答复",
"ContentCacheSlidingExpirationByDay": "内容缓存按天滑动过期",
"MaxDaysForCaching": "缓存的最大天数",
"Enabled": "启用",
"Menu:NugetPackagesContentCache": "NuGet包缓存",
"NugetPackagesContentCache": "NuGet内容缓存",
"SlidingExpritionByDayInfo": "获取或设置一个缓存在多长时间内不活动(例如,不被访问)才会被删除。这不会使期超过绝对到期时间。",
"MaxDaysForCachingInfo": "获取或设置相对于当前时间的绝对过期时间。",
"CurrentEstimatedSizeInfo": "当前在内存缓存中的所有NuGet包的内容大小的估计总和",
"CurrentEntryCountInfo": "当前在内存缓存中的实例数量。",
"TotalHitsInfo": "缓存未命中总数,当从缓存请求文件并且缓存能够满足该请求时,就会发生缓存命中。。",
"TotalMissesInfo": "缓存命中的总数,缓存未命中是指缓存中不包含请求的内容。",
"Permission:VersionHistory": "版本历史",
"Caches": "缓存",
"VersionHistories": "版本历史",
"Version": "版本",
"PublishDate": "发布日期",
"IsStableVersion": "稳定版",
"IsActive": "激活",
"NewVersion": "新版本",
"VersionHistoryDeletionConfirmationMessage": "您确定要删除此版本吗?",
"CreateAbpConsultantLogoInfo": "最大文件大小:<b>1MB</b> <br/> 支持的文件类型:<b>jpg, jpeg, png, SVG, WebP</b>",
"UrlCode": "许可证代码",
"Clear": "清除",
"Permission:AbpConsultant": "ABP顾问",
"Menu:AbpConsultants": "ABP顾问",
"CreateAbpConsultant": "创建ABP顾问",
"UrlCodeIsNotAvailable": "Url代码已被其他ABP顾问使用。",
"AbpConsultants": "ABP顾问",
"AbpConsultant": "ABP顾问",
"AbpConsultantEdit": "编辑ABP顾问",
"AbpConsultantCreate": "创建ABP顾问",
"WhoWeAreItem": "关于我们",
"FieldIsRequired": "{0}是必须的。",
"FieldIsNotValid": "{0}是无效的。",
"InterestedLicenseType": "感兴趣的许可证类型"
}
}

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

@ -27,6 +27,7 @@
"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:030013": "A user with an active license cannot start a 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?",
@ -205,6 +206,8 @@
"Icons": "Icons",
"Url": "Url",
"Icon": "Icon",
"RecentActivities": "Recent Activities"
"RecentActivities": "Recent Activities",
"SpringCampaign": "Welcome <br>Spring Sale!",
"SpringCampaign2": "<span>Limited <br> Time Offer!</span>"
}
}

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

@ -26,6 +26,8 @@
"Volo.AbpIo.Domain:030009": "找不到用户!",
"Volo.AbpIo.Domain:030010": "要购买试用许可证,您首先需要激活您的试用许可证!",
"Volo.AbpIo.Domain:030011": "购买后不能删除试用许可证!",
"Volo.AbpIo.Domain:030012": "用户只有一个免费试用期。您已经使用了试用许可证。",
"Volo.AbpIo.Domain:030013": "已激活许可证的用户无法启动试用许可证。",
"Volo.AbpIo.Domain:070000": "组织名称只能包含拉丁字母、数字、点和连字符!",
"Volo.AbpIo.Domain:070001": "公司名称只能包含拉丁字母、数字、点、空格和连字符!",
"WantToLearn?": "想学习吗?",
@ -183,6 +185,29 @@
"BlackFriday": "<strong>黑色</strong> <span>星期五</span>",
"ValidForExistingCustomers": "也适用于 <br> 现有用户!",
"CampaignBetweenDates": "从 {0} <br>至 {1}",
"SaveUpTo": "<span>最多节省</span> 至<strong>${0}K</strong>"
"SaveUpTo": "<span>最多节省</span> 至<strong>${0}K</strong>",
"ImplementingDDD": "实现领域驱动设计",
"ExploreTheEBook": "浏览电子书",
"ExploreTheBook": "浏览书籍",
"ConsultantType": "顾问类型",
"Expert": "ABP专家",
"Partner": "ABP合作伙伴",
"Industry": "行业",
"Location": "地点",
"Contact": "联系",
"Partner_Year": "合作年份",
"Info": "信息",
"SpokenLanguages": "母语",
"SocialMedia": "社交媒体",
"Activity": "活动",
"Type": "类型",
"Contribution": "贡献",
"WhoWeAre": "关于我们",
"Icons": "图标",
"Url": "Url",
"Icon": "图标",
"RecentActivities": "最近的活动",
"SpringCampaign": "欢迎 <br>春季促销!",
"SpringCampaign2": "<span>限时优惠!<br></span>"
}
}
}

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

@ -2,6 +2,7 @@
"culture": "en",
"texts": {
"AbpTitle": "ABP Framework - Open Source Web Application Framework",
"AbpDescription": "ABP is an open source application framework focused on AspNet Core based web application development. Don't repeat yourself, focus on your own business code."
"AbpDescription": "ABP is an open source application framework focused on AspNet Core based web application development. Don't repeat yourself, focus on your own business code.",
"AbpDefinition": "ABP blog for .NET development, cross-platform, ASP.NET application templates, ABP-related news and more..."
}
}

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

@ -2,6 +2,7 @@
"culture": "zh-Hans",
"texts": {
"AbpTitle": "ABP 框架 - 开源 Web 应用程序框架",
"AbpDescription": "ABP 是一个开源应用程序框架,专注于基于 AspNet Core 的 Web 应用程序开发。 Don't repeat yourself,专注于自己的业务代码。"
"AbpDescription": "ABP 是一个开源应用程序框架,专注于基于 AspNet Core 的 Web 应用程序开发。 Don't repeat yourself,专注于自己的业务代码。",
"AbpDefinition": ".NET开发的ABP博客,跨平台,ASP.NET应用程序模板,ABP相关新闻等..."
}
}

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

@ -779,6 +779,9 @@
"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. لدينا أيضًا دعم خاص بالبريد الإلكتروني ، وهو متاح فقط لحاملي تراخيص المؤسسة."
"SupportPolicyFaqExplanation": "نحن ندعم فقط الإصدار الرئيسي النشط والسابق. لا نضمن إصدار تصحيح للإصدارات الرئيسية الثالثة والأقدم. على سبيل المثال ، إذا كان الإصدار النشط هو 7.0.0 ، فسنصدر إصدارات تصحيح لكل من 6.x.x و 7.x.x. إلى جانب ذلك ، نحن نقدم الدعم فقط لإطار عمل ABP والقضايا التجارية المتعلقة بـ ABP. هذا يعني أنه لا يتم تقديم أي دعم لتطبيقات الطرف الثالث والخدمات السحابية والمكتبات الطرفية الأخرى التي تستخدمها منتجات ABP. سنبذل جهودًا معقولة تجاريًا لتزويد عملائنا بالدعم الفني خلال ساعات العمل الرسمية لـ \"Volosoft Bilisim A.S\". من ناحية أخرى ، نحن لا نلتزم بوقت استجابة اتفاقية مستوى الخدمة (SLA) ، لكننا سنحاول الرد على المشكلات الفنية في أسرع وقت ممكن خلال ساعات العمل الرسمية لدينا. ما لم يتم إبرام اتفاقية خاصة مع العميل ، فإننا نقدم الدعم فقط على https://support.abp.io. لدينا أيضًا دعم خاص بالبريد الإلكتروني ، وهو متاح فقط لحاملي تراخيص المؤسسة.",
"WhyUseAbpIoPlatform": "لماذا يجب علي استخدام منصة ABP.IO بدلاً من إنشاء حل جديد من البداية؟",
"WhyUseAbpIoPlatformFaqExplanation": "انظر الى <a href=\"https://docs.abp.io/en/commercial/latest/why-abp-io-platform \"> هذا المستند </a> للحصول على شرح مفصل لسبب استخدام ABP.IO Platform لفائدته الكبيرة بدلًا من القيام بكل شيء بنفسك."
}
}

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

@ -383,6 +383,25 @@
"RenewLicenseEarly": "Pokud si předčasně obnovím licenci, dostanu celý rok?",
"RenewLicenseEarylExplanation": "Když obnovíte licenci před datem vypršení platnosti licence, bude k datu vypršení platnosti licence přidán 1 rok. Pokud například platnost vaší licence vyprší dne {0}-06-06 a obnovíte ji dne {0}-01-01, bude vaše nové datum vypršení platnosti licence {1}-06-06.",
"discountForYears": "{0}% sleva po dobu {1} let",
"BlackFridayDiscount": "Black Friday sleva"
"BlackFridayDiscount": "Black Friday sleva",
"OnboardingTrainingFaqTitle": "Máte školení ABP onboarding?",
"OnboardingTrainingFaqExplanation": "Ano, máme školicí služby ABP, které vám pomohou rychle zahájit váš projekt ABP. Dozvíte se o ABP od hlavního člena týmu ABP a získáte dovednosti pro zahájení vašeho projektu ABP. Na onboarding školení si vysvětlíme, jak nastavit vaše vývojové prostředí, nainstalovat požadované nástroje, vytvořit plně funkční stránku CRUD. Školení bude probíhat živě a bude se používat aplikace Zoom a jsme otevřeni využití dalších online platforem pro setkávání. Jazykem školení bude angličtina. Během sezení můžete také klást otázky týkající se ABP. Pro obě strany bude naplánován vhodný čas a datum. Chcete-li získat další informace, kontaktujte nás na adrese <a href=\"mailto:info@abp.io\">info@abp.io</a>.",
"SupportPolicyFaqTitle": "Jaká je vaše politika podpory?",
"SupportPolicyFaqExplanation": "Podporujeme pouze aktivní a předchozí hlavní verzi. Nezaručujeme vydání opravy pro třetí a starší hlavní verzi. Například pokud je aktivní verze 7.0.0, vydáme opravné verze pro verzi 6.x.x i 7.x.x. Kromě toho poskytujeme podporu pouze pro problémy související s ABP Framework a ABP Commercial. To znamená, že neposkytujeme žádnou podporu aplikacím třetích stran, cloudovým službám a dalším periferním knihovnám používaným produkty ABP. Vynaložíme komerčně přiměřené úsilí, abychom našim zákazníkům poskytli technickou podporu během oficiální pracovní doby společnosti \"Volosoft Bilisim A.S\". Na druhou stranu se nezavazujeme k době odezvy podle dohody o úrovni služeb (SLA), ale budeme se snažit reagovat na technické problémy co nejrychleji v rámci naší oficiální pracovní doby. Pokud není se zákazníkem uzavřena zvláštní dohoda, poskytujeme podporu pouze na adrese https://support.abp.io. Máme také soukromou e-mailovou podporu, která je k dispozici pouze držitelům licence Enterprise.",
"DowngradeLicensePlan": "Mohu v budoucnu přejít na nižší licenční plán?",
"DowngradeLicensePlanExplanation": "Stávající licenční plán nelze snížit. Můžete si však zakoupit nový nižší licenční plán a pokračovat ve vývoji s novou licencí. Po zakoupení nižší licence se stačí přihlásit k novému licenčnímu plánu pomocí příkazu ABP CLI: abp login <uživatelské jméno> -o <organizace> `.",
"LicenseTransfer": "Lze licenci převést z jednoho vývojáře na druhého?",
"LicenseTransferExplanation": "Ano! Zakoupením licence se stáváte jejím držitelem, a proto budete mít přístup na stránku pro správu organizace. Organizace má role vlastníka a vývojáře. Vlastníci mohou spravovat místa pro vývojáře a přiřazovat vývojáře. Každý přidělený vývojář se do systému přihlásí pomocí příkazu ABP CLI a bude mít oprávnění k vývoji a podpoře.",
"WhatHappensWhenLicenseEnds": "Co se stane po skončení licenčního období?",
"WhatHappensWhenLicenseEndsExplanation1": "Komerční licence ABP je <a href=\"{0}\" target=\"_blank\">trvalá licence</a>. Po vypršení platnosti licence můžete pokračovat ve vývoji svého projektu. A nejste povinni licenci obnovovat. Vaše licence je dodávána s ročním plánem aktualizací a podpory již v balení. Abyste mohli i nadále získávat nové funkce, vylepšení výkonu, opravy chyb, podporu a pokračovat v používání sady ABP Suite, musíte svou licenci obnovit. Po vypršení platnosti licence;",
"WhatHappensWhenLicenseEndsExplanation2": "Pomocí ABP Commercial nemůžete vytvářet nová řešení, ale můžete navždy pokračovat ve vývoji stávajících aplikací.",
"WhatHappensWhenLicenseEndsExplanation3": "Aktualizace modulů a témat budete moci získat v rámci své verze MINOR (kromě verzí RC nebo Preview). Například: pokud používáte modul ve verzi 3.2.0, můžete stále získávat aktualizace pro verzi 3.2.x (v3.2.1, v3.2.5... atd.) tohoto modulu. Nemůžete však získat aktualizace pro další hlavní nebo vedlejší verzi (např. v3.3.0, v3.3.3, 4.x.x... atd.). Například když vám vypršela licence, poslední verze byla v4.4.3 a později byla zveřejněna jak verze 4.4.4, tak verze 4.5.0, měli byste přístup k verzi v4.4.X, ale k verzi v4.5.X byste přístup neměli.",
"WhatHappensWhenLicenseEndsExplanation4": "Po skončení platnosti licence nelze instalovat nové moduly a motivy přidané do platformy ABP Commercial.",
"WhatHappensWhenLicenseEndsExplanation5": "Sadu ABP Suite nelze použít.",
"WhatHappensWhenLicenseEndsExplanation6": "Již nelze získat <a href=\"{0}\">prémiovou podporu</a>.",
"WhatHappensWhenLicenseEndsExplanation7": "Pokud chcete i nadále využívat tyto výhody, můžete svou licenci prodloužit (obnovit). Pokud prodloužíte licenci do <strong>1 měsíce</strong> po vypršení platnosti licence, budou uplatněny následující slevy: Týmová licence {0}; Obchodní licence {1}; Enterprise Licence {2}.",
"BlazoriseLicense": "Musíme si koupit licenci Blazorise?",
"BlazoriseLicenseExplanation": "Máme dohodu mezi společnostmi Volosoft a Megabit, na základě této dohody je licence Blazorise přibalena k produktům ABP Commercial, proto si naši zákazníci nemusí kupovat další licenci Blazorise."
}
}

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

@ -196,7 +196,7 @@
"ChangingDevelopers": "Can I change the registered developers of my organization in the future?",
"ChangingDevelopersExplanation": "In addition to adding new developers to your license, you can also change the existing developers (you can remove a developer and add a new one to the same seat) without any additional cost.",
"WhatHappensWhenLicenseEnds": "What happens when my license period ends?",
"WhatHappensWhenLicenseEndsExplanation1": "The ABP Commercial license is a <a href=\"{0}\" target=\"_blank\">perpetual license</a>. After your license expires, you can continue developing your project. And you are not obliged to renew your license. Your license comes with a one-year update and support plan out of the box. In order to continue to get new features, performance enhancements, bug fixes, support and continue using ABP Suite, you need to renew your license. When your license expires, you will not get the following benefits:",
"WhatHappensWhenLicenseEndsExplanation1": "The ABP Commercial license is a <a href=\"{0}\" target=\"_blank\">perpetual license</a>. After your license expires, you can continue developing your project. And you are not obliged to renew your license. Your license comes with a one-year update and support plan out of the box. In order to continue to get new features, performance enhancements, bug fixes, support and continue using ABP Suite, you need to renew your license. When your license expires;",
"WhatHappensWhenLicenseEndsExplanation2": "You can not create new solutions using the ABP Commercial, but you can continue developing your existing applications forever.",
"WhatHappensWhenLicenseEndsExplanation3": "You will be able to get updates for the modules and themes within your MINOR version (except RC or Preview versions). For example: if you are using v3.2.0 of a module, you can still get updates for v3.2.x (v3.2.1, v3.2.5... etc.) of that module. But you cannot get updates for the next major or minor version (like v3.3.0, v3.3.3, 4.x.x.. etc.). For example, when your license expired, the latest release was v4.4.3, and later, it published both 4.4.4 version and 4.5.0 version, you would be able to access the v4.4.X but you wouldn't be access the v4.5.X.",
"WhatHappensWhenLicenseEndsExplanation4": "You can not install new modules and themes added to the ABP Commercial platform after your license ends.",
@ -208,7 +208,7 @@
"WhenShouldIRenewMyLicense": "When should I renew my license?",
"WhenShouldIRenewMyLicenseExplanation": "If you renew your license within <strong>1 month</strong> after your license expires, the following discounts will be applied: Team License {0}; Business License {1}; Enterprise License {2}. However, if you renew your license after <strong>1 month</strong> since the expiry date of your license, the renewal price will be the same as the license purchase price and there will be no discount on your renewal.",
"TrialPlan": "Do you have a trial plan?",
"TrialPlanExplanation": "It has a 14 days trial period for the ABP Commercial team license. For more information visit <a href={0} target='_blank'>here</a>. Furthermore, for the Team licenses we provide a 30 days money-back guarantee. You can just request a refund in the first 30 days. For the Business and Enterprise licenses, we provide 60% refund in 30 days. This is because Business and Enterprise licenses include the full source code of all the modules and the themes.",
"TrialPlanExplanation": "No, there is no trial version for ABP Commercial. You can check the community edition to understand the code quality and approaches. We also offer a 30-day money-back guarantee for the Team license, no questions asked! You can request a refund within the first 30 days. We provide a 60% refund within 30 days for Business and Enterprise licenses. This is because the Business and Enterprise licenses contain the full source-code of all the modules and 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@volosoft.com.<br/>Our international bank account information:",
"HowToUpgrade": "How to upgrade existing applications when a new version is available?",
@ -818,6 +818,9 @@
"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"
"ExpirationDate": "Expiration Date",
"SpringCampaignDiscount": "Spring Campaign Discount",
"WhyUseAbpIoPlatform": "Why should I use the ABP.IO Platform instead of creating a new solution from scratch?",
"WhyUseAbpIoPlatformFaqExplanation": "See <a href=\"https://docs.abp.io/en/commercial/latest/why-abp-io-platform \"> that document </a> for a detailed explanation of why using ABP.IO Platform has a significant advantage over doing everything yourself."
}
}

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

@ -383,6 +383,27 @@
"RenewLicenseEarly": "Jos uusin ajokorttini etuajassa, saanko koko vuoden?",
"RenewLicenseEarylExplanation": "Kun uusit lisenssisi ennen lisenssin vanhenemispäivää, lisenssin voimassaolopäivään lisätään 1 vuosi. Jos lisenssisi vanhenee esimerkiksi {0}-06-06 ja uusit sen {0}-01-01, uusi lisenssisi päättymispäivä on {1}-06-06.",
"discountForYears": "{0}% de remise pendant {1} an(s)",
"BlackFridayDiscount": "Black Friday -alennus"
"BlackFridayDiscount": "Black Friday -alennus",
"WhyUseAbpIoPlatform": "Miksi minun pitäisi käyttää ABP.IO-alustaa sen sijaan, että luon uuden ratkaisun tyhjästä?",
"WhyUseAbpIoPlatformFaqExplanation": "Katso <a href=\"https://docs.abp.io/en/commercial/latest/why-abp-io-platform \"> kyseisestä asiakirjasta </a> yksityiskohtainen selitys siitä, miksi ABP.IO Platformin käyttäminen on huomattavasti edullisempaa kuin kaiken tekeminen itse.",
"OnboardingTrainingFaqTitle": "Onko teillä ABP onboarding -koulutusta?",
"OnboardingTrainingFaqExplanation": "Kyllä, meillä on ABP-koulutuspalvelut, jotka auttavat sinua saamaan ABP-projektisi käyntiin nopeasti. Opit ABP:stä ABP:n ydintiimin jäseneltä ja saat valmiudet aloittaa ABP-projektisi. Perehdytyskoulutuksessa kerromme kuinka perustat kehitysympäristösi, asennat tarvittavat työkalut ja luot täysin toimivan CRUD-sivun. Koulutus toteutetaan livenä ja Zoom-sovellusta käytetään ja olemme avoimia muiden online-kokousalustojen käyttöön. Koulutuksen kieli on englanti. Voit myös esittää kysymyksiäsi ABP:stä istuntojen aikana. Molemmille osapuolille suunnitellaan sopiva aika ja päivämäärä. Saat lisätietoja ottamalla yhteyttä meihin osoitteessa <a href=\"mailto:info@abp.io\">info@abp.io</a>.",
"SupportPolicyFaqTitle": "Mikä on tukipolitiikkanne?",
"SupportPolicyFaqExplanation": "Tuemme vain aktiivista ja edellistä pääversiota. Emme takaa korjausjulkaisua 3. ja vanhemmille pääversioille. Jos aktiivinen versio on esimerkiksi 7.0.0, julkaisemme korjaustiedostoja sekä versioista 6.x.x että 7.x.x. Lisäksi tarjoamme tukea vain ABP Frameworkiin ja ABP Commercialiin liittyville ongelmille. Tämä tarkoittaa, että tukea ei anneta kolmannen osapuolen sovelluksille, pilvipalveluille ja muille ABP-tuotteiden käyttämille oheiskirjastoille. Käytämme kaupallisesti kohtuullisia keinoja tarjotaksemme asiakkaillemme teknistä tukea \"Volosoft Bilisim A.S\"-yhtiön virallisina työaikoina. Toisaalta emme sitoudu palvelutasosopimuksen (SLA) mukaiseen vastausaikaan, mutta pyrimme vastaamaan teknisiin ongelmiin mahdollisimman nopeasti virallisten työaikojemme puitteissa. Ellei asiakkaan kanssa ole tehty erityistä sopimusta, tarjoamme tukea vain osoitteessa https://support.abp.io. Meillä on myös yksityinen sähköpostituki, joka on vain Enterprise-lisenssin haltijoiden käytettävissä.",
"DowngradeLicensePlan": "Voinko tulevaisuudessa vaihtaa alempaan lisenssisuunnitelmaan?",
"DowngradeLicensePlanExplanation": "Et voi alentaa olemassa olevaa lisenssisuunnitelmaa. Voit kuitenkin ostaa uuden alemman lisenssisuunnitelman ja jatkaa kehitystyötäsi uudella lisenssillä. Kun olet ostanut alemman lisenssin, sinun tarvitsee vain kirjautua uuteen lisenssisuunnitelmaan ABP CLI -komennolla: ` abp login <käyttäjätunnus> -o <organisaatio> `.",
"LicenseTransfer": "Voiko lisenssin siirtää kehittäjältä toiselle?",
"LicenseTransferExplanation": "Kyllä! Kun ostat lisenssin, sinusta tulee lisenssin haltija, joten sinulla on pääsy organisaation hallintasivulle. Organisaatiolla on omistaja- ja kehittäjäroolit. Omistajat voivat hallita kehittäjäpaikkoja ja määrittää kehittäjiä. Kukin nimetty kehittäjä kirjautuu ABP CLI -komennolla järjestelmään, ja sillä on kehitys- ja tukioikeudet.",
"WhatHappensWhenLicenseEnds": "Mitä tapahtuu, kun lisenssikauteni päättyy?",
"WhatHappensWhenLicenseEndsExplanation1": "ABP Commercial -lisenssi on <a href=\"{0}\" target=\"_blank\">ikuinen lisenssi</a>. Kun lisenssi päättyy, voit jatkaa projektisi kehittämistä. Etkä ole velvollinen uusimaan lisenssiäsi. Lisenssisi mukana tulee yhden vuoden päivitys- ja tukisuunnitelma suoraan pakkauksesta. Jotta voit jatkossakin saada uusia ominaisuuksia, suorituskykyparannuksia, vikakorjauksia, tukea ja jatkaa ABP Suiten käyttöä, sinun on uusittava lisenssi. Kun lisenssi päättyy;",
"WhatHappensWhenLicenseEndsExplanation2": "Et voi luoda uusia ratkaisuja ABP Commercialin avulla, mutta voit jatkaa olemassa olevien sovellusten kehittämistä ikuisesti.",
"WhatHappensWhenLicenseEndsExplanation3": "Voit saada päivityksiä moduuleihin ja teemoihin MINOR-versiossasi (lukuun ottamatta RC- tai Preview-versioita). Esimerkiksi: jos käytät moduulin v3.2.0 versiota, voit silti saada päivityksiä kyseisen moduulin v3.2.x versiolle (v3.2.1, v3.2.5... jne.). Mutta et voi saada päivityksiä seuraavaan pää- tai pienempään versioon (kuten v3.3.0, v3.3.3.3, 4.x.x.. jne.). Esimerkiksi, kun lisenssisi päättyi, uusin julkaisu oli v4.4.3, ja myöhemmin julkaistiin sekä 4.4.4.4 että 4.5.0-versio, voit käyttää v4.4.X-versiota, mutta et v4.5.X-versiota.",
"WhatHappensWhenLicenseEndsExplanation4": "Et voi asentaa uusia moduuleja ja teemoja, jotka on lisätty ABP Commercial -alustaan lisenssisi päätyttyä.",
"WhatHappensWhenLicenseEndsExplanation5": "Et voi käyttää ABP Suitea.",
"WhatHappensWhenLicenseEndsExplanation6": "Et voi enää saada <a href=\"{0}\">premium-tukea</a>.",
"WhatHappensWhenLicenseEndsExplanation7": "Voit jatkaa (uusia) lisenssiäsi, jos haluat jatkaa näiden etujen saamista. Jos jatkat lisenssiäsi <strong>yhden kuukauden</strong> kuluessa lisenssin vanhenemisesta, seuraavat alennukset sovelletaan: Tiimilisenssi {0}; Toimilupa {1}; Yrityslisenssi {2}.",
"BlazoriseLicense": "Pitääkö meidän ostaa Blazorise-lisenssi?",
"BlazoriseLicenseExplanation": "Meillä on Volosoftin ja Megabitin välinen sopimus, jonka mukaan Blazorise-lisenssi on niputettu ABP Commercial -tuotteisiin, joten asiakkaidemme ei tarvitse ostaa ylimääräistä Blazorise-lisenssiä."
}
}

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

@ -383,6 +383,24 @@
"RenewLicenseEarly": "Si je renouvelle ma licence plus tôt, obtiendrai-je l'année complète ?",
"RenewLicenseEarylExplanation": "Lorsque vous renouvelez votre licence avant la date d'expiration de votre licence, 1 an sera ajouté à la date d'expiration de votre licence. Par exemple, si votre licence expire le {0}-06-06 et que vous la renouvelez le {0}-01-01, la nouvelle date d'expiration de votre licence sera le {1}-06-06.",
"discountForYears": "{0} % de remise pendentif {1} an(s)",
"BlackFridayDiscount": "Remise Black Friday"
"BlackFridayDiscount": "Remise Black Friday",
"OnboardingTrainingFaqTitle": "Avez-vous une formation d'accueil ABP ?",
"OnboardingTrainingFaqExplanation": "Oui, nous avons des services de formation ABP pour vous aider à démarrer rapidement votre projet ABP. Vous en apprendrez plus sur l'ABP auprès d'un membre de l'équipe principale d'ABP et vous acquerrez les compétences nécessaires pour commencer votre projet ABP. Dans la formation d'intégration, nous vous expliquerons comment configurer votre environnement de développement, installer les outils requis, créer une page CRUD entièrement fonctionnelle. La formation sera en direct et l'application Zoom sera utilisée, et nous sommes ouverts à l'utilisation d'autres plateformes de réunion en ligne. La langue de la formation sera l'anglais. Vous pouvez également poser vos questions sur l'ABP pendant les séances. Une heure et une date convenables seront prévues pour les deux parties. Pour obtenir plus d'informations, contactez-nous à <a href=\"mailto:info@abp.io\">info@abp.io</a>.",
"SupportPolicyFaqTitle": "Quelle est votre politique de soutien ?",
"SupportPolicyFaqExplanation": "Nous ne prenons en charge que la version active et la version majeure précédente. Nous ne garantissons pas la publication d'un correctif pour la troisième version majeure et la version majeure antérieure. Par exemple, si la version active est 7.0.0, nous publierons des correctifs pour les versions 6.x.x et 7.x.x. En outre, nous n'assurons le support que pour les problèmes liés à ABP Framework et ABP Commercial. Cela signifie qu'aucun support n'est fourni pour les applications tierces, les services cloud et les autres bibliothèques périphériques utilisées par les produits ABP. Nous ferons des efforts commercialement raisonnables pour fournir à nos clients une assistance technique pendant les heures de bureau officielles de \"Volosoft Bilisim A.S\". D'autre part, nous ne nous engageons pas à respecter un accord de niveau de service (SLA) sur le temps de réponse, mais nous essaierons de répondre aux problèmes techniques aussi rapidement que possible pendant nos heures de travail officielles. Sauf accord spécial avec le client, nous ne fournissons une assistance qu'à l'adresse https://support.abp.io. Nous disposons également d'une assistance privée par courrier électronique, qui n'est accessible qu'aux détenteurs d'une licence d'entreprise.",
"DowngradeLicensePlan": "Puis-je passer à un plan de licence inférieur à l'avenir ?",
"DowngradeLicensePlanExplanation": "Vous ne pouvez pas rétrograder votre plan de licence existant. Mais vous pouvez acheter un nouveau plan de licence inférieur et continuer votre développement sur la nouvelle licence. Après avoir acheté une licence inférieure, il vous suffit de vous connecter à votre nouveau plan de licence via la commande CLI d'ABP : ` abp login <nom d'utilisateur> -o <organisation> `.",
"LicenseTransfer": "Une licence peut-elle être transférée d'un développeur à un autre ?",
"LicenseTransferExplanation": "Oui ! Lorsque vous achetez une licence, vous en devenez le détenteur et vous avez donc accès à la page de gestion de l'organisation. Une organisation a des rôles de propriétaire et de développeur. Les propriétaires peuvent gérer les sièges des développeurs et leur assigner des développeurs. Chaque développeur assigné se connectera au système via la commande ABP CLI et disposera d'autorisations de développement et de support.",
"WhatHappensWhenLicenseEnds": "Que se passe-t-il à la fin de la période de validité de ma licence ?",
"WhatHappensWhenLicenseEndsExplanation1": "La licence commerciale ABP est une <a href=\"{0}\" target=\"_blank\">licence perpétuelle</a>. Après l'expiration de votre licence, vous pouvez continuer à développer votre projet. Vous n'êtes pas obligé de renouveler votre licence. Votre licence est livrée avec un plan de mise à jour et d'assistance d'un an. Pour continuer à bénéficier des nouvelles fonctionnalités, des améliorations de performance, des corrections de bogues, de l'assistance et continuer à utiliser ABP Suite, vous devez renouveler votre licence. Lorsque votre licence expire ;",
"WhatHappensWhenLicenseEndsExplanation2": "Vous ne pouvez pas créer de nouvelles solutions à l'aide d'ABP Commercial, mais vous pouvez continuer à développer vos applications existantes pour toujours.",
"WhatHappensWhenLicenseEndsExplanation3": "Vous pourrez obtenir des mises à jour pour les modules et thèmes de votre version MINOR (à l'exception des versions RC ou Preview). Par exemple : si vous utilisez la version 3.2.0 d'un module, vous pouvez toujours obtenir des mises à jour pour la version 3.2.x (v3.2.1, v3.2.5... etc.) de ce module. Mais vous ne pouvez pas obtenir de mises à jour pour la prochaine version majeure ou mineure (comme v3.3.0, v3.3.3, 4.x.x.. etc.). Par exemple, lorsque votre licence a expiré, la dernière version était la v4.4.3, et plus tard, la version 4.4.4 et la version 4.5.0 ont été publiées, vous pourrez accéder à la v4.4.X mais vous ne pourrez pas accéder à la v4.5.X.",
"WhatHappensWhenLicenseEndsExplanation4": "Vous ne pouvez pas installer les nouveaux modules et thèmes ajoutés à la plateforme ABP Commercial après l'expiration de votre licence.",
"WhatHappensWhenLicenseEndsExplanation5": "Vous ne pouvez pas utiliser la suite ABP.",
"WhatHappensWhenLicenseEndsExplanation6": "Vous ne pouvez plus bénéficier du <a href=\"{0}\">support premium</a>.",
"WhatHappensWhenLicenseEndsExplanation7": "Vous pouvez prolonger (renouveler) votre licence si vous souhaitez continuer à bénéficier de ces avantages. Si vous prolongez votre licence dans <strong>1 mois</strong> après l'expiration de votre licence, les remises suivantes seront appliquées : Licence d'équipe {0} ; Licence commerciale {1} ; Licence Entreprise {2}.",
"BlazoriseLicense": "Faut-il acheter une licence Blazorise ?",
"BlazoriseLicenseExplanation": "Nous avons conclu un accord entre Volosoft et Megabit, dans le cadre duquel la licence Blazorise est intégrée aux produits ABP Commercial, de sorte que nos clients n'ont pas besoin d'acheter une licence Blazorise supplémentaire."
}
}

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

@ -381,5 +381,25 @@
"CommercialNewsletterConfirmationMessage": "मैं <a href=\"https://commercial.abp.io/TermsConditions\">नियम और शर्तों</a> और <a href=\"https://commercial.abp.io/Privacy\">गोपनीयता नीति से सहमत हूं </a>.",
"discountForYears": "{1}वर्ष(वर्षों) के लिए {0}% छूट",
"BlackFridayDiscount": "ब्लैक फ्राइडे छूट",
"OnboardingTrainingFaqTitle": "क्या आपके पास एबीपी ऑनबोर्डिंग प्रशिक्षण है?",
"OnboardingTrainingFaqExplanation": "हां, आपके एबीपी प्रोजेक्ट को तेजी से शुरू करने में आपकी मदद करने के लिए हमारे पास एबीपी प्रशिक्षण सेवाएं हैं। आप ABP कोर टीम के सदस्य से ABP के बारे में जानेंगे और आपको अपना ABP प्रोजेक्ट शुरू करने का कौशल प्राप्त होगा। ऑनबोर्डिंग प्रशिक्षण में, हम समझाएंगे कि अपने विकास के माहौल को कैसे स्थापित करें, आवश्यक उपकरण कैसे स्थापित करें, पूरी तरह कार्यात्मक CRUD पेज कैसे बनाएं। प्रशिक्षण लाइव होगा और जूम एप्लिकेशन का उपयोग किया जाएगा, और हम अन्य ऑनलाइन मीटिंग प्लेटफॉर्म का उपयोग करने के लिए तैयार हैं। प्रशिक्षण की भाषा अंग्रेजी होगी। आप सत्रों के दौरान ABP के बारे में अपने प्रश्न भी पूछ सकते हैं। दोनों पक्षों के लिए एक सुविधाजनक समय और तारीख की योजना बनाई जाएगी। अधिक जानकारी प्राप्त करने के लिए, <a href=\"mailto:info@abp.io\">info@abp.io</a> पर हमसे संपर्क करें।",
"SupportPolicyFaqTitle": "आपकी समर्थन नीति क्या है?",
"SupportPolicyFaqExplanation": "हम केवल सक्रिय और पिछले प्रमुख संस्करण का समर्थन करते हैं। हम तीसरे और पुराने प्रमुख संस्करणों के लिए पैच रिलीज़ की गारंटी नहीं देते हैं। उदाहरण के लिए, यदि सक्रिय संस्करण 7.0.0 है, तो हम 6.x.x और 7.x.x दोनों के लिए पैच रिलीज़ जारी करेंगे। इसके अलावा, हम केवल ABP फ्रेमवर्क और ABP कमर्शियल संबंधित मुद्दों के लिए समर्थन प्रदान करते हैं। इसका मतलब है कि तीसरे पक्ष के अनुप्रयोगों, क्लाउड सेवाओं और एबीपी उत्पादों द्वारा उपयोग किए जाने वाले अन्य परिधीय पुस्तकालयों के लिए कोई समर्थन नहीं दिया गया है। हम अपने ग्राहकों को \"Volosoft Bilisim A.S\" के आधिकारिक व्यावसायिक घंटों के दौरान तकनीकी सहायता प्रदान करने के लिए व्यावसायिक रूप से उचित प्रयासों का उपयोग करेंगे। दूसरी ओर, हम सर्विस-लेवल एग्रीमेंट (SLA) प्रतिक्रिया समय के लिए प्रतिबद्ध नहीं हैं, लेकिन हम अपने आधिकारिक कामकाजी घंटों के भीतर जितनी जल्दी हो सके तकनीकी मुद्दों पर प्रतिक्रिया देने का प्रयास करेंगे। जब तक ग्राहक के साथ कोई विशेष समझौता नहीं किया जाता है, हम केवल https://support.abp.io पर सहायता प्रदान करते हैं। हमारे पास निजी ईमेल समर्थन भी है, जो केवल एंटरप्राइज़ लाइसेंस धारकों के लिए उपलब्ध है।",
"DowngradeLicensePlan": "क्या मैं भविष्य में कम लाइसेंस योजना में डाउनग्रेड कर सकता हूँ?",
"DowngradeLicensePlanExplanation": "आप अपनी मौजूदा लाइसेंस योजना को डाउनग्रेड नहीं कर सकते। लेकिन आप नया लोअर लाइसेंस प्लान खरीद सकते हैं और नए लाइसेंस पर अपना विकास जारी रख सकते हैं। आपके द्वारा कम लाइसेंस खरीदने के बाद, आपको एबीपी सीएलआई कमांड के माध्यम से अपनी नई लाइसेंस योजना में प्रवेश करने की आवश्यकता है: `एबीपी लॉगिन <उपयोगकर्ता नाम> -ओ <संगठन>`।",
"LicenseTransfer": "क्या लाइसेंस एक डेवलपर से दूसरे डेवलपर को ट्रांसफर किया जा सकता है?",
"LicenseTransferExplanation": "हाँ! जब आप लाइसेंस खरीदते हैं, तो आप लाइसेंस धारक बन जाते हैं, इसलिए आपके पास संगठन प्रबंधन पृष्ठ तक पहुंच होगी। एक संगठन में मालिक और डेवलपर की भूमिकाएँ होती हैं। मालिक डेवलपर सीटों का प्रबंधन कर सकते हैं और डेवलपर्स को असाइन कर सकते हैं। प्रत्येक असाइन किया गया डेवलपर सिस्टम में ABP CLI कमांड के माध्यम से लॉगिन करेगा और उसके पास विकास और समर्थन अनुमतियाँ होंगी।",
"RenewLicenseEarly": "अगर मैं अपना लाइसेंस जल्दी रिन्यू करता हूं, तो क्या मुझे पूरा साल मिलेगा?",
"RenewLicenseEarylExplanation": "जब आप अपनी लाइसेंस समाप्ति तिथि से पहले अपने लाइसेंस का नवीनीकरण करते हैं, तो आपकी लाइसेंस समाप्ति तिथि में 1 वर्ष जोड़ दिया जाएगा। उदाहरण के लिए, यदि आपका लाइसेंस {0}-06-06 को समाप्त हो रहा है और आप इसे {0}-01-01 को नवीनीकृत करते हैं, तो आपकी नई लाइसेंस समाप्ति तिथि {1}-06-06 होगी।",
"WhatHappensWhenLicenseEnds": "मेरी लाइसेंस अवधि समाप्त होने पर क्या होता है?",
"WhatHappensWhenLicenseEndsExplanation1": "ABP वाणिज्यिक लाइसेंस एक <a href=\"{0}\" target=\"_blank\">स्थायी लाइसेंस</a> है। आपका लाइसेंस समाप्त होने के बाद, आप अपना प्रोजेक्ट विकसित करना जारी रख सकते हैं। और आप अपने लाइसेंस को नवीनीकृत करने के लिए बाध्य नहीं हैं। आपका लाइसेंस एक साल के अपडेट और आउट ऑफ बॉक्स सपोर्ट प्लान के साथ आता है। नई सुविधाएँ, प्रदर्शन संवर्द्धन, बग फिक्स, समर्थन और ABP सूट का उपयोग जारी रखने के लिए, आपको अपने लाइसेंस को नवीनीकृत करने की आवश्यकता है। जब आपका लाइसेंस समाप्त हो जाता है;",
"WhatHappensWhenLicenseEndsExplanation2": "आप ABP कमर्शियल का उपयोग करके नए समाधान नहीं बना सकते, लेकिन आप अपने मौजूदा एप्लिकेशन को हमेशा के लिए विकसित करना जारी रख सकते हैं।",
"WhatHappensWhenLicenseEndsExplanation3": "आप अपने लघु संस्करण (आरसी या पूर्वावलोकन संस्करणों को छोड़कर) के भीतर मॉड्यूल और थीम के लिए अपडेट प्राप्त करने में सक्षम होंगे। उदाहरण के लिए: यदि आप किसी मॉड्यूल के v3.2.0 का उपयोग कर रहे हैं, तब भी आप उस मॉड्यूल के v3.2.x (v3.2.1, v3.2.5... आदि) के लिए अपडेट प्राप्त कर सकते हैं। लेकिन आप अगले प्रमुख या लघु संस्करण (जैसे v3.3.0, v3.3.3, 4.x.x.. आदि) के लिए अपडेट प्राप्त नहीं कर सकते। उदाहरण के लिए, जब आपका लाइसेंस समाप्त हो गया था, तो नवीनतम रिलीज़ v4.4.3 थी, और बाद में, इसने 4.4.4 संस्करण और 4.5.0 संस्करण दोनों को प्रकाशित किया, आप v4.4.X का उपयोग करने में सक्षम होंगे, लेकिन आप नहीं होंगे v4.5.X तक पहुंचें।",
"WhatHappensWhenLicenseEndsExplanation4": "आपका लाइसेंस समाप्त होने के बाद आप ABP कमर्शियल प्लेटफॉर्म में जोड़े गए नए मॉड्यूल और थीम इंस्टॉल नहीं कर सकते।",
"WhatHappensWhenLicenseEndsExplanation5": "आप एबीपी सूट का उपयोग नहीं कर सकते।",
"WhatHappensWhenLicenseEndsExplanation6": "अब आप <a href=\"{0}\">प्रीमियम समर्थन</a> प्राप्त नहीं कर सकते।",
"WhatHappensWhenLicenseEndsExplanation7": "यदि आप इन लाभों को प्राप्त करना जारी रखना चाहते हैं तो आप अपने लाइसेंस का विस्तार (नवीनीकरण) कर सकते हैं। यदि आप अपना लाइसेंस समाप्त होने के बाद <strong>1 महीने</strong> के भीतर अपना लाइसेंस बढ़ाते हैं, तो निम्नलिखित छूट लागू होंगी: टीम लाइसेंस {0}; व्यवसाय लाइसेंस {1}; उद्यम लाइसेंस {2}।",
"BlazoriseLicense": "क्या हमें ब्लेज़ोराइज़ लाइसेंस खरीदने की ज़रूरत है?",
"BlazoriseLicenseExplanation": "हमारे पास Volosoft और Megabit के बीच एक समझौता है, इस समझौते के साथ Blazorise लाइसेंस को ABP वाणिज्यिक उत्पादों के साथ बंडल किया गया है, इसलिए हमारे ग्राहकों को एक अतिरिक्त Blazorise लाइसेंस खरीदने की आवश्यकता नहीं है।"
}
}

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

@ -380,6 +380,26 @@
"TrialLicenseExpiredInfo": "Il periodo della tua licenza di prova è scaduto!",
"CommercialNewsletterConfirmationMessage": "Accetto i <a href=\"https://commercial.abp.io/TermsConditions\">Termini e condizioni</a> e la <a href=\"https://commercial.abp.io/Privacy\">Informativa sulla privacy </a>.",
"discountForYears": "{0}% di sconto per {1} anno/i",
"BlackFridayDiscount": "Sconto Black Friday"
"BlackFridayDiscount": "Sconto Black Friday",
"OnboardingTrainingFaqTitle": "Avete un corso di formazione ABP per l'onboarding?",
"OnboardingTrainingFaqExplanation": "Sì, abbiamo i servizi di formazione ABP per aiutarti a far partire rapidamente il tuo progetto ABP. Imparerai a conoscere ABP da un membro del core team ABP e otterrai le competenze per iniziare il tuo progetto ABP. Nella formazione onboarding, spiegheremo come configurare il tuo ambiente di sviluppo, installare gli strumenti richiesti, creare una pagina CRUD completamente funzionante. La formazione sarà in diretta e verrà utilizzata l'applicazione Zoom e siamo aperti all'utilizzo di altre piattaforme di riunioni online. La lingua della formazione sarà l'inglese. Puoi anche porre le tue domande sull'ABP durante le sessioni. Verrà pianificata una data e un orario convenienti per entrambe le parti. Per ulteriori informazioni, contattaci all'indirizzo <a href=\"mailto:info@abp.io\">info@abp.io</a>.",
"SupportPolicyFaqTitle": "Qual è la vostra politica di assistenza?",
"SupportPolicyFaqExplanation": "Supportiamo solo la versione principale attiva e quella precedente. Non garantiamo il rilascio di patch per la terza e la precedente versione principale. Ad esempio, se la versione attiva è la 7.0.0, rilasceremo patch sia per la 6.x.x che per la 7.x.x. Inoltre, forniamo supporto solo per i problemi relativi ad ABP Framework e ABP Commercial. Ciò significa che non viene fornito alcun supporto per le applicazioni di terze parti, i servizi cloud e altre librerie periferiche utilizzate dai prodotti ABP. Faremo tutto il possibile per fornire ai nostri clienti assistenza tecnica durante gli orari di lavoro ufficiali di Volosoft Bilisim A.S.. D'altra parte, non ci impegniamo a rispettare i tempi di risposta di un accordo sul livello di servizio (SLA), ma cercheremo di rispondere ai problemi tecnici il più rapidamente possibile entro i nostri orari di lavoro ufficiali. A meno che non venga stipulato un accordo speciale con il cliente, forniamo assistenza solo all'indirizzo https://support.abp.io. Disponiamo anche di un supporto privato via e-mail, disponibile solo per i titolari di licenza Enterprise.",
"DowngradeLicensePlan": "Posso passare a un piano di licenza inferiore in futuro?",
"DowngradeLicensePlanExplanation": "Non è possibile effettuare il downgrade del piano di licenza esistente. È però possibile acquistare un nuovo piano di licenza inferiore e continuare lo sviluppo con la nuova licenza. Dopo aver acquistato una licenza inferiore, è sufficiente effettuare il login al nuovo piano di licenza tramite il comando ABP CLI: abp login <nome utente> -o <organizzazione> `.",
"LicenseTransfer": "È possibile trasferire una licenza da uno sviluppatore a un altro?",
"LicenseTransferExplanation": "Sì! Quando si acquista una licenza, si diventa il titolare della licenza e quindi si ha accesso alla pagina di gestione dell'organizzazione. Un'organizzazione ha ruoli di proprietario e di sviluppatore. I proprietari possono gestire i posti di sviluppatore e assegnare gli sviluppatori. Ogni sviluppatore assegnato accederà al sistema tramite il comando ABP CLI e avrà i permessi di sviluppo e di assistenza.",
"RenewLicenseEarly": "Se rinnovo la mia licenza in anticipo, avrò l'intero anno?",
"RenewLicenseEarylExplanation": "Quando si rinnova la licenza prima della data di scadenza, viene aggiunto 1 anno alla data di scadenza della licenza. Ad esempio, se la licenza scade il {0}-06-06 e viene rinnovata il {0}-01-01, la nuova data di scadenza della licenza sarà {1}-06-06.",
"WhatHappensWhenLicenseEnds": "Cosa succede quando termina il periodo di licenza?",
"WhatHappensWhenLicenseEndsExplanation1": "La licenza commerciale ABP è una <a href=\"{0}\" target=\"_blank\">licenza perpetua</a>. Dopo la scadenza della licenza, potete continuare a sviluppare il vostro progetto. Non siete obbligati a rinnovare la licenza. La licenza viene fornita con un piano di aggiornamento e supporto di un anno. Per continuare a ottenere nuove funzionalità, miglioramenti delle prestazioni, correzioni di bug, supporto e continuare a utilizzare ABP Suite, è necessario rinnovare la licenza. Quando la licenza scade;",
"WhatHappensWhenLicenseEndsExplanation2": "Non è possibile creare nuove soluzioni utilizzando ABP Commercial, ma è possibile continuare a sviluppare le applicazioni esistenti per sempre.",
"WhatHappensWhenLicenseEndsExplanation3": "Sarà possibile ottenere gli aggiornamenti per i moduli e i temi della propria versione MINOR (ad eccezione delle versioni RC o Preview). Ad esempio, se si utilizza la versione 3.2.0 di un modulo, è ancora possibile ottenere gli aggiornamenti per la versione 3.2.x (v3.2.1, v3.2.5... ecc.) di quel modulo. Ma non è possibile ottenere aggiornamenti per la versione maggiore o minore successiva (come v3.3.0, v3.3.3, 4.x.x... ecc.). Ad esempio, quando la vostra licenza è scaduta, l'ultima release era la v4.4.3 e in seguito sono state pubblicate sia la versione 4.4.4 che la versione 4.5.0, sarete in grado di accedere alla v4.4.X ma non alla v4.5.X.",
"WhatHappensWhenLicenseEndsExplanation4": "Non è possibile installare nuovi moduli e temi aggiunti alla piattaforma ABP Commercial dopo la scadenza della licenza.",
"WhatHappensWhenLicenseEndsExplanation5": "Non è possibile utilizzare la suite ABP.",
"WhatHappensWhenLicenseEndsExplanation6": "Non è più possibile ottenere il <a href=\"{0}\">supporto premium</a>.",
"WhatHappensWhenLicenseEndsExplanation7": "Puoi estendere (rinnovare) la tua licenza se desideri continuare a ottenere questi vantaggi. Se estendi la licenza entro <strong>1 mese</strong> dalla scadenza della licenza, verranno applicati i seguenti sconti: Licenza Team {0}; Licenza commerciale {1}; Licenza aziendale {2}.",
"BlazoriseLicense": "Dobbiamo acquistare la licenza di Blazorise?",
"BlazoriseLicenseExplanation": "Abbiamo un accordo tra Volosoft e Megabit, con il quale la licenza di Blazorise viene fornita in bundle con i prodotti commerciali ABP, pertanto i nostri clienti non hanno bisogno di acquistare una licenza Blazorise aggiuntiva."
}
}

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

@ -178,6 +178,7 @@
"ChangingLicenseType": "Posso atualizar meu tipo de licença mais tarde?",
"ChangingLicenseTypeExplanation": "Você pode atualizar para uma licença superior pagando a diferença dentro do período de sua licença ativa. Ao atualizar para um plano de licença superior, você obtém os benefícios do novo plano, mas a atualização da licença não altera a data de expiração da licença. Além disso, você também pode adicionar novas licenças de desenvolvedor à sua licença existente, consulte \"Quantos desenvolvedores podem trabalhar no comercial ABP?\"",
"LicenseExtendUpgradeDiff": "Qual é a diferença entre extensão de licença e atualização?",
"LicenseExtendUpgradeDiffExplanation": "<strong>Extensão:</strong> ao estender/renovar sua licença, você continuará a obter suporte premium e obter atualizações principais ou secundárias para os módulos e temas. Além disso, você poderá continuar criando novos projetos. E você ainda poderá utilizar o ABP Suite que agiliza seu desenvolvimento. Ao estender sua licença, 1 ano é adicionado à data de expiração da licença. <hr/><strong>Atualização:</strong> Ao atualizar sua licença, você será promovido para um plano de licença superior que lhe permitirá obter benefícios adicionais. Confira a <a href=\"/pricing\">tabela de comparação de licenças</a> para ver as diferenças entre os planos de licença. <strong>Por outro lado, quando você atualizar, a data de expiração de sua licença não será alterada!</strong> Para estender a data de término de sua licença, você precisa estender sua licença.",
"LicenseRenewalCost": "Qual é o custo de renovação da licença após 1 ano?",
"LicenseRenewalCostExplanation": "O preço de renovação (extensão) da Licença de equipe padrão é $ {0}, a Licença comercial padrão é $ {1} e a Licença corporativa padrão é $ {2}. Se você já é um cliente, <a href='{3}' target='_blank'> faça login em sua conta </a> para verificar os preços de renovação disponíveis.",
"HowDoIRenewMyLicense": "Como eu renovo minha licença?",
@ -380,6 +381,27 @@
"TrialLicenseExpiredInfo": "Seu período de licença de teste expirou!",
"CommercialNewsletterConfirmationMessage": "Eu concordo com os <a href=\"https://commercial.abp.io/TermsConditions\"> Termos e Condições </a> e a <a href=\"https://commercial.abp.io/Privacy\"> Política de Privacidade </a>",
"discountForYears": "{0}% de desconto por {1} ano(s)",
"BlackFridayDiscount": "Desconto de Black Friday"
"BlackFridayDiscount": "Desconto de Black Friday",
"WhyUseAbpIoPlatform": "Por que devo usar a plataforma ABP.IO em vez de criar uma nova solução a partir do zero?",
"WhyUseAbpIoPlatformFaqExplanation": "Veja <a href=\"https://docs.abp.io/en/commercial/latest/why-abp-io-platform \"> esse documento </a> para uma explicação detalhada do porquê de usar a Plataforma ABP.IO tem uma vantagem significativa sobre fazer tudo você mesmo.",
"OnboardingTrainingFaqTitle": "Você tem treinamento de ABP a bordo?",
"SupportPolicyFaqTitle": "Qual é sua política de apoio?",
"SupportPolicyFaqExplanation": "Nós apoiamos apenas a versão ativa e a versão principal anterior. Não garantimos o lançamento de um patch para a 3ª e mais antigas versões principais. Por exemplo, se a versão ativa for a 7.0.0, lançaremos correções tanto para a 6.x.x como para a 7.x.x.x. Além disso, fornecemos suporte somente para questões relacionadas ao ABP Framework e ABP Commercial. Isso significa que nenhum suporte é dado para as aplicações de terceiros, serviços de nuvem e outras bibliotecas periféricas usadas pelos produtos ABP. Usaremos esforços comercialmente razoáveis para fornecer suporte técnico a nossos clientes durante o horário comercial oficial da \"Volosoft Bilisim A.S\". Por outro lado, não nos comprometemos com um acordo de nível de serviço (SLA) de tempo de resposta, mas tentaremos responder às questões técnicas o mais rápido possível dentro de nosso horário oficial de trabalho. A menos que um acordo especial seja feito com o cliente, fornecemos suporte somente em https://support.abp.io. Também temos suporte privado por e-mail, que só está disponível para os detentores de licenças empresariais.",
"DowngradeLicensePlan": "Posso baixar para um plano de licença mais baixo no futuro?",
"DowngradeLicensePlanExplanation": "Você não pode rebaixar seu plano de licença existente. Mas você pode adquirir um novo plano de licença inferior e continuar seu desenvolvimento com a nova licença. Após adquirir uma licença inferior, você só precisa fazer o login em seu novo plano de licença via comando ABP CLI: abp login <nome do usuário> -o <organização> `.",
"LicenseTransfer": "Uma licença pode ser transferida de um desenvolvedor para outro?",
"LicenseTransferExplanation": "Sim! Ao adquirir uma licença, você se torna o detentor da licença, portanto, você terá acesso à página de gerenciamento da organização. Uma organização tem funções de proprietário e desenvolvedor. Os proprietários podem gerenciar os cargos de desenvolvedor e designar desenvolvedores. Cada desenvolvedor designado fará login via comando ABP CLI no sistema e terá permissões de desenvolvimento e suporte.",
"BlazoriseLicense": "Precisamos comprar a licença Blazorise?",
"BlazoriseLicenseExplanation": "Temos um acordo entre a Volosoft e a Megabit, com este acordo a licença Blazorise é agregada aos produtos comerciais da ABP, portanto, nossos clientes não precisam comprar uma licença Blazorise extra.",
"RenewLicenseEarly": "Se eu renovar minha licença mais cedo, terei o ano todo",
"RenewLicenseEarylExplanation": "Quando você renovar sua licença antes da data de expiração, 1 ano será adicionado à data de expiração de sua licença. Por exemplo, se sua licença expirar em {0}-06-06 e você a renovar em {0}-01-01, sua nova data de expiração será {1}-06-06.",
"WhatHappensWhenLicenseEnds": "O que acontece quando meu período de licença termina?",
"WhatHappensWhenLicenseEndsExplanation1": "A licença comercial da ABP é uma <a href=\"{0}\" target=\"_blank=\">licença perpétua</a>. Após a expiração de sua licença, você pode continuar desenvolvendo seu projeto. E você não é obrigado a renovar sua licença. Sua licença vem com uma atualização de um ano e um plano de suporte fora da caixa. A fim de continuar a obter novos recursos, melhorias de desempenho, correção de bugs, suporte e continuar usando o ABP Suite, você precisa renovar sua licença. Quando sua licença expirar;",
"WhatHappensWhenLicenseEndsExplanation2": "Você não pode criar novas soluções usando o ABP Commercial, mas pode continuar desenvolvendo suas aplicações existentes para sempre.",
"WhatHappensWhenLicenseEndsExplanation3": "Você poderá obter atualizações para os módulos e temas dentro de sua versão MINOR (exceto as versões RC ou Preview). Por exemplo: se você estiver usando a v3.2.0 de um módulo, você ainda poderá obter atualizações para a v3.2.x (v3.2.1, v3.2.5... etc.) desse módulo. Mas você não pode obter atualizações para a próxima versão maior ou menor (como v3.3.0, v3.3.3, 4.x.x... etc.). Por exemplo, quando sua licença expirou, a última versão foi a v4.4.3, e mais tarde, publicou tanto a versão 4.4.4 quanto a 4.5.0, você poderia acessar a v4.4.X, mas não poderia acessar a v4.5.X.",
"WhatHappensWhenLicenseEndsExplanation4": "Você não pode instalar novos módulos e temas adicionados à plataforma comercial da ABP após o término de sua licença.",
"WhatHappensWhenLicenseEndsExplanation5": "Você não pode usar o ABP Suite",
"WhatHappensWhenLicenseEndsExplanation6": "Você não pode mais obter o <a href==\"{0}\">apoio de premium</a>.",
"WhatHappensWhenLicenseEndsExplanation7": "Você pode estender (renovar) sua licença se quiser continuar obtendo esses benefícios. Se você estender sua licença dentro de <strong>1 mês</strong> após a expiração de sua licença, os seguintes descontos serão aplicados: Licença de equipe {0}; Licença Comercial {1}; Licença empresarial {2}."
}
}

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

@ -380,6 +380,24 @@
"TrialLicenseExpiredInfo": "Vaše skúšobné licenčné obdobie vypršalo!",
"CommercialNewsletterConfirmationMessage": "I agree to the <a href=\"https://commercial.abp.io/TermsConditions\">Terms & Conditions</a> and <a href=\"https://commercial.abp.io/Privacy\">Privacy Policy</a>.",
"discountForYears": "{0} % odpusteného prívesku {1} an(ov)",
"BlackFridayDiscount": "Black Friday zľava"
"BlackFridayDiscount": "Black Friday zľava",
"OnboardingTrainingFaqTitle": "Máte školenie ABP onboarding?",
"OnboardingTrainingFaqExplanation": "Áno, máme školiace služby ABP, ktoré vám pomôžu rýchlo spustiť váš projekt ABP. Dozviete sa o ABP od hlavného člena tímu ABP a získate zručnosti na začatie vášho projektu ABP. Na onboardingovom školení vám vysvetlíme, ako nastaviť vaše vývojové prostredie, nainštalovať požadované nástroje, vytvoriť plne funkčnú stránku CRUD. Školenie bude prebiehať naživo a bude sa používať aplikácia Zoom a sme otvorení využívaniu ďalších platforiem online stretnutí. Jazykom školenia bude angličtina. Svoje otázky o ABP môžete klásť aj počas sedení. Pre obe strany bude naplánovaný vhodný čas a dátum. Ak chcete získať ďalšie informácie, kontaktujte nás na adrese <a href=\"mailto:info@abp.io\">info@abp.io</a>.",
"SupportPolicyFaqTitle": "Aká je vaša politika podpory?",
"SupportPolicyFaqExplanation": "Podporujeme iba aktívnu a predchádzajúcu hlavnú verziu. Nezaručujeme vydanie opravy pre 3. a staršiu hlavnú verziu. Napríklad, ak je aktívna verzia 7.0.0, vydáme opravné verzie pre 6.x.x aj 7.x.x. Okrem toho poskytujeme podporu len pre problémy súvisiace s ABP Framework a ABP Commercial. To znamená, že neposkytujeme podporu pre aplikácie tretích strán, cloudové služby a iné periférne knižnice používané produktmi ABP. Vynaložíme komerčne primerané úsilie, aby sme našim zákazníkom poskytli technickú podporu počas oficiálnej pracovnej doby spoločnosti \"Volosoft Bilisim A.S\". Na druhej strane sa nezaväzujeme k času odozvy podľa dohody o úrovni služieb (SLA), ale budeme sa snažiť reagovať na technické problémy čo najrýchlejšie v rámci našej oficiálnej pracovnej doby. Ak sa so zákazníkom nedohodnete inak, poskytujeme podporu len na adrese https://support.abp.io. Máme aj súkromnú e-mailovú podporu, ktorá je k dispozícii len držiteľom licencie Enterprise.",
"DowngradeLicensePlan": "Môžem v budúcnosti prejsť na nižší licenčný plán?",
"DowngradeLicensePlanExplanation": "Existujúci licenčný plán nemôžete znížiť. Môžete si však zakúpiť nový nižší licenčný plán a pokračovať vo vývoji s novou licenciou. Po zakúpení nižšej licencie sa stačí prihlásiť do nového licenčného plánu prostredníctvom príkazu ABP CLI: abp login <užívateľské meno> -o <organizácia> `.",
"LicenseTransfer": "Môže sa licencia preniesť z jedného vývojára na druhého?",
"LicenseTransferExplanation": "Áno! Keď si zakúpite licenciu, stanete sa jej držiteľom, a teda budete mať prístup na stránku správy organizácie. Organizácia má roly vlastníka a vývojára. Vlastníci môžu spravovať miesta pre vývojárov a priraďovať vývojárov. Každý pridelený vývojár sa prihlási do systému prostredníctvom príkazu ABP CLI a bude mať oprávnenia na vývoj a podporu.",
"WhatHappensWhenLicenseEnds": "Čo sa stane po skončení licenčného obdobia?",
"WhatHappensWhenLicenseEndsExplanation1": "Komerčná licencia ABP je <a href=\"{0}\" target=\"_blank\">trvalá licencia</a>. Po skončení platnosti licencie môžete pokračovať vo vývoji svojho projektu. A nie ste povinní licenciu obnovovať. Vaša licencia sa dodáva s ročným plánom aktualizácií a podpory už v balení. Ak chcete naďalej získavať nové funkcie, vylepšenia výkonu, opravy chýb, podporu a pokračovať v používaní balíka ABP Suite, musíte svoju licenciu obnoviť. Keď vaša licencia vyprší;",
"WhatHappensWhenLicenseEndsExplanation2": "Pomocou ABP Commercial nemôžete vytvárať nové riešenia, ale môžete navždy pokračovať vo vývoji existujúcich aplikácií.",
"WhatHappensWhenLicenseEndsExplanation3": "Budete môcť získať aktualizácie modulov a tém v rámci svojej verzie MINOR (okrem verzií RC alebo Preview). Napríklad: ak používate modul vo verzii 3.2.0, stále môžete získať aktualizácie pre verziu 3.2.x (v3.2.1, v3.2.5... atď.) tohto modulu. Nemôžete však získať aktualizácie pre ďalšiu hlavnú alebo vedľajšiu verziu (napríklad v3.3.0, v3.3.3, 4.x.x... atď.). Napríklad, keď vám vypršala licencia, posledná verzia bola v4.4.3 a neskôr bola zverejnená verzia 4.4.4 aj 4.5.0, budete mať prístup k verzii v4.4.X, ale nebudete mať prístup k verzii v4.5.X.",
"WhatHappensWhenLicenseEndsExplanation4": "Po skončení platnosti vašej licencie nemôžete inštalovať nové moduly a témy pridané do platformy ABP Commercial.",
"WhatHappensWhenLicenseEndsExplanation5": "Balík ABP Suite nemôžete používať.",
"WhatHappensWhenLicenseEndsExplanation6": "Už nemôžete získať <a href=\"{0}\">prémiovú podporu</a>.",
"WhatHappensWhenLicenseEndsExplanation7": "Ak chcete naďalej využívať tieto výhody, môžete si licenciu predĺžiť (obnoviť). Ak predĺžite svoju licenciu do <strong>1 mesiaca</strong> po vypršaní platnosti licencie, budú sa uplatňovať nasledujúce zľavy: Tímová licencia {0}; Obchodná licencia {1}; Podniková licencia {2}",
"BlazoriseLicense": "Musíme si kúpiť licenciu Blazorise?",
"BlazoriseLicenseExplanation": "Máme dohodu medzi spoločnosťami Volosoft a Megabit, na základe ktorej je licencia Blazorise pribalená k produktom ABP Commercial, preto si naši zákazníci nemusia kupovať ďalšiu licenciu Blazorise."
}
}

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

@ -369,7 +369,6 @@
"FreeTrial": "免费试用",
"AcceptsMarketingCommunications": " 是的,我想接收 ABP 商业营销通讯。",
"PurposeOfUsage": "使用目的",
"Industry": "行业",
"Choose": "- 选择 -",
"CompanyOrganizationName": "公司/组织名称",
"CompanySize": "公司规模",
@ -804,6 +803,24 @@
"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 上提供支持。 我们还提供私人电子邮件支持,仅适用于企业许可证持有者。"
"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 上提供支持。 我们还提供私人电子邮件支持,仅适用于企业许可证持有者。",
"TotalDevelopers": "{0}位开发者",
"CustomPurchaseExplanation": "定制您的特定需求",
"WhereDidYouHearAboutUs": "您是从哪里了解到我们的?",
"Twitter": "Twitter",
"Facebook": "Facebook",
"Youtube": "YouTube",
"Google": "Google",
"Github": "GitHub",
"Friend": "朋友介绍",
"Other": "其他",
"WhereDidYouHearAboutUs_explain": "请说明...",
"DeletingMemberWarningMessage": "\"{0}\"将从开发者列表中删除。如果您愿意,您可以将此空位分配给另一个开发者。",
"AdditionalInfo": "如果开发者席位高于您的要求,您可以减少它们。您可以发送电子邮件至<a href=\"mailto:info@abp.io\">info@abp.io</a>以删除一些开发人员席位。清理未使用的开发人员席位将降低许可证续期成本。如果您愿意,您可以在有效许可期内重新购买额外的开发人员席位。请注意,由于此许可证包中有{0}个开发人员,因此无法减少此数量。",
"LinkExpiredErrorMessage": "您正在尝试访问的链接已过期。",
"ExpirationDate": "过期时间",
"SpringCampaignDiscount": "春季促销折扣",
"WhyUseAbpIoPlatform": "为什么我应该使用 ABP.IO 平台而不是从头开始创建新的解决方案?\n",
"WhyUseAbpIoPlatformFaqExplanation": "请参阅<a href=\"https://docs.abp.io/en/commercial/latest/why-abp-io-platform\">该文件</a>以详细解释为什么使用ABP.IO平台比自己做所有事情有显著的优势。"
}
}
}

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

@ -384,6 +384,24 @@
"BlazoriseLicense": "我们是否需要购买Blazorise许可证?",
"BlazoriseLicenseExplanation": "我公司Volosoft和公司Megabit之间有合作协议,根据此协议,购买将同时包含了Blazorise许可证与ABP商业产品,因此我们的客户不需要再额外购买Blazorise许可证。",
"discountForYears": "{0}% 折扣 {1} 年",
"BlackFridayDiscount": "黑色星期五折扣"
"BlackFridayDiscount": "黑色星期五折扣",
"OnboardingTrainingFaqTitle": "你們有 ABP 入職培訓嗎?",
"OnboardingTrainingFaqExplanation": "是的,我們有 ABP 培訓服務來幫助您快速啟動 ABP 項目。您將從 ABP 核心團隊成員那裡了解 ABP,並獲得開始您的 ABP 項目的技能。在入職培訓中,我們將解釋如何設置您的開發環境、安裝所需的工具、創建功能齊全的 CRUD 頁面。培訓將進行直播並使用 Zoom 應用程序,我們對使用其他在線會議平台持開放態度。培訓語言為英語。您也可以在會議期間提出有關 ABP 的問題。將為雙方計劃一個方便的時間和日期。要獲取更多信息,請通過 <a href=\"mailto:info@abp.io\">info@abp.io</a> 聯繫我們。",
"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 上提供支持。我們還提供私人電子郵件支持,僅適用於企業許可證持有者。",
"DowngradeLicensePlan": "我以後可以降級到更低的許可計劃嗎?",
"DowngradeLicensePlanExplanation": "您不能降級現有的許可計劃。但是您可以購買新的較低許可計劃並在新許可上繼續您的開發。購買較低的許可證後,您只需通過 ABP CLI 命令登錄到新的許可證計劃:`abp login <username> -o <organization> `。",
"LicenseTransfer": "許可證可以從一個開發商轉讓給另一個開發商嗎?",
"LicenseTransferExplanation": "是的!購買許可證後,您將成為許可證持有者,因此您可以訪問組織管理頁面。組織具有所有者和開發者角色。所有者可以管理開發者席位並分配開發者。每個指定的開發人員將通過 ABP CLI 命令登錄到系統,並將擁有開發和支持權限。",
"RenewLicenseEarly": "如果我提前更新我的駕照,我會得到一整年嗎?",
"RenewLicenseEarylExplanation": "當您在許可證到期日期之前續訂許可證時,您的許可證到期日期將增加 1 年。例如,如果您的許可證在 {0}-06-06 到期,而您在 {0}-01-01 續簽,則新的許可證到期日期將為 {1}-06-06。",
"WhatHappensWhenLicenseEnds": "當我的許可期限結束時會發生什麼?",
"WhatHappensWhenLicenseEndsExplanation1": "ABP 商業許可是<a href=\"{0}\" target=\"_blank\">永久許可</a>。許可證到期後,您可以繼續開發您的項目。而且您沒有義務更新您的許可證。您的許可證附帶開箱即用的一年更新和支持計劃。為了繼續獲得新功能、性能增強、錯誤修復、支持和繼續使用 ABP Suite,您需要更新您的許可證。當您的許可證到期時;",
"WhatHappensWhenLicenseEndsExplanation2": "您無法使用 ABP Commercial 創建新的解決方案,但您可以永遠繼續開發現有的應用程序。",
"WhatHappensWhenLicenseEndsExplanation3": "您將能夠在您的次要版本(RC 或預覽版除外)中獲取模塊和主題的更新。例如:如果您正在使用模塊的 v3.2.0,您仍然可以獲得該模塊的 v3.2.x(v3.2.1、v3.2.5...等)的更新。但是您無法獲得下一個主要或次要版本的更新(如 v3.3.0、v3.3.3、4.x.x.. 等)。比如你的license過期了,最新發布的是v4.4.3,後來又發布了4.4.4和4.5.0兩個版本,你可以訪問v4.4.X,但是你就不行了訪問 v4.5.X。",
"WhatHappensWhenLicenseEndsExplanation4": "許可證到期後,您將無法安裝添加到 ABP 商業平台的新模塊和主題。",
"WhatHappensWhenLicenseEndsExplanation5": "您不能使用 ABP 套件。",
"WhatHappensWhenLicenseEndsExplanation6": "您無法再獲得<a href=\"{0}\">高級支持</a>。",
"WhatHappensWhenLicenseEndsExplanation7": "如果您想繼續獲得這些好處,您可以延長(更新)您的許可證。如果您在許可到期後 <strong>1 個月</strong> 內延長許可,將應用以下折扣:團隊許可 {0};營業執照{1};企業許可證{2}。"
}
}

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

@ -184,6 +184,8 @@
"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",
"IConsentToMedium": "I consent to the publication of this post at https://medium.com/volosoft."
"IConsentToMedium": "I consent to the publication of this post at https://medium.com/volosoft.",
"SearchResultsFor": "Search results for <span class=\"fw-bold\">\"{0}\"</span>",
"SeeMoreVideos": "See more videos"
}
}

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

@ -13,7 +13,6 @@
"Status": "状态",
"ContentSource": "内容来源",
"Details": "详情",
"Url": "url",
"Title": "标题",
"CreationTime": "创建时间",
"Save": "保存",
@ -185,6 +184,8 @@
"Layout_MetaDescription": "ABP 社区是一个人们可以分享有关 ABP 框架的帖子并关注项目的环境。",
"Index_Page_CommunityIntroduction": "这是 ABP 框架、.NET 和软件开发的中心。 您可以阅读文章,观看视频教程,了解 ABP 的开发进度和 ABP 相关事件,帮助其他开发人员并与 ABP 社区分享您的专业知识。",
"TagsInArticle": "文章中的标签",
"IConsentToMedium": "我同意在 https://medium.com/volosoft 上发布这篇文章。"
"IConsentToMedium": "我同意在 https://medium.com/volosoft 上发布这篇文章。",
"SearchResultsFor": " span class=\"fw-bold\">\"{0}\"</span>的搜索结果",
"SeeMoreVideos": "查看更多视频"
}
}
}

1
abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/zh-Hans.json

@ -1,5 +1,6 @@
{
"culture": "zh-Hans",
"texts": {
"Buy": "购买"
}
}

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

@ -408,6 +408,14 @@
"ApplicationModule": "应用程序模块",
"SeeTheScreenshot": "如截图所示",
"ApplicationModuleExplanation1": "创建可重用的、完全分层的应用程序模块解决方案。",
"ApplicationModuleExplanation2": "您可以使用此选项为您的模块化应用程序创建模块。"
"ApplicationModuleExplanation2": "您可以使用此选项为您的模块化应用程序创建模块。",
"Expert_": "专家",
"Partner_": "合作伙伴",
"WebSite": "网站",
"Expert_Year": "专业年限",
"CompanyInfo": "公司信息",
"Date": "日期",
"WhoWeAre_Partner": "关于我们",
"WhoWeAre_Expert": "关于我"
}
}
}

2
common.props

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

36
docs/en/Background-Jobs.md

@ -75,6 +75,42 @@ This job simply uses `IEmailSender` to send emails (see [email sending document]
A background job should not hide exceptions. If it throws an exception, the background job is automatically re-tried after a calculated waiting time. Hide exceptions only if you don't want to re-run the background job for the current argument.
#### Cancelling Background Jobs
If your background task is cancellable, then you can use the standard [Cancellation Token](Cancellation-Token-Provider.md) system to obtain a `CancellationToken` to cancel your job when requested. See the following example that uses the `ICancellationTokenProvider` to obtain the cancellation token:
```csharp
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
namespace MyProject
{
public class LongRunningJob : AsyncBackgroundJob<LongRunningJobArgs>, ITransientDependency
{
private readonly ICancellationTokenProvider _cancellationTokenProvider;
public LongRunningJob(ICancellationTokenProvider cancellationTokenProvider)
{
_cancellationTokenProvider = cancellationTokenProvider;
}
public override async Task ExecuteAsync(LongRunningJobArgs args)
{
foreach (var id in args.Ids)
{
_cancellationTokenProvider.Token.ThrowIfCancellationRequested();
await ProcessAsync(id); // code omitted for brevity
}
}
}
}
```
> A cancellation operation might be needed if the application is shutting down and we don't want to block the application in the background job. This example throws an exception if the cancellation is requested. So, the job will be retried the next time the application starts. If you don't want that, just return from the `ExecuteAsync` method without throwing any exception (you can simply check the `_cancellationTokenProvider.Token.IsCancellationRequested` property).
#### Job Name
Each background job has a name. Job names are used in several places. For example, RabbitMQ provider uses job names to determine the RabbitMQ Queue names.

37
docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/POST.md

@ -0,0 +1,37 @@
# Migrating from MS-SQL to Postgresql
![sql-server-to-postgres](images/sql-server-to-postgres.jpg)
## Introduction
Database migration is a common practice for organizations that want to move from one database system to another. This can be for a variety of reasons, including cost, performance, and features. In this article, we will discuss the process of migrating a database from MS-SQL to PostgreSQL, the challenges that may arise during the migration, and how to overcome them. And we recently moved the main database of https://abp.io platform from MS-SQL to PostgreSQL.
In our case, we decided to switch our database from Microsoft SQL Server (MS-SQL) to PostgreSQL because we wanted to move our on-premise platform to Azure. We’ve also found out that the cost of the license for MS-SQL on Azure was significantly higher than PostgreSQL. After conducting a cost-benefit analysis, we decided to migrate our database to PostgreSQL to save costs.
Before migrating to Azure, we decided to switch our database from MS-SQL to PostgreSQL on-premise first. This gave us the opportunity to test and fine-tune the migration process before making the final switch to Azure.
## Challenges
Despite using a third-party tool(DBConvert for MySQL & PostgreSQL) for the migration, we faced three main problems when exporting data to PostgreSQL. Firstly, some tables with plain text had utf-8 encoding problems. We overcame this problem by dump-restoring these tables.
![db-converter](images/db-converter.jpg)
Secondly, our database had to be case-insensitive, but PostgreSQL does not have this as a default configuration. We handled it using `citext` with the ABP migration service.
![citext-1](images/citext-1.jpg)
![citext-2](images/citext-2.jpg)
![citext-3](images/citext-3.jpg)
While everything was proceeding very smooth, we faced one last problem: importing binary data, such as the content of the NuGet packages. It was hard to understand that the binaries of the NuGet packages were different. Our paid commercial NuGet packages are being stored as binary data in the database. Therefore, it was the most compelling part of this migration to transfer the NuGet packages. Fortunately, we overcame the binary error. And we decided to write a custom .NET tool to move only the binary data from MS-SQL to PostgreSQL, thanks to the ABP Core team!
## Conclusion
One of the benefits of using PostgreSQL is the low license costs of the Azure platform. As the main contributors of ABP, we also use ABP Framework under the hood of our abp.io websites, we could easily switch to PostgreSQL. For those who want to switch their ABP project to PostgreSQL, check out [docs.abp.io/en/abp/latest/Entity-Framework-Core-PostgreSQL](https://docs.abp.io/en/abp/latest/Entity-Framework-Core-PostgreSQL). We had not used any MS-SQL specific function, therefore there was no need to make any changes in the repository classes. This means that the applications that were previously using MS-SQL can seamlessly switch to PostgreSQL without any modifications.
Thanks to the flexibility of ABP, it has [PostgreSQL package](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.PostgreSql) which is 100% compatible with PostgreSQL. This helped us to make this migration very smooth and seamless.
In conclusion, migrating a database from MS-SQL to PostgreSQL can be challenging, but it can bring significant cost savings in the long run. By testing and fine-tuning the migration process before making the final switch, we were able to overcome the challenges we’d faced during the migration process. Thanks to the flexibility of ABP, we were able to make the transition with minimal code changes. Also we didn't see any big performance differences between MS-SQL and PostgreSQL.

BIN
docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/citext-1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/citext-2.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/citext-3.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/db-converter.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 KiB

BIN
docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/mssql-postges.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/mssql.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
docs/en/Blog-Posts/2023-03-15-Migration-Mssql-Postgresql/images/sql-server-to-postgres.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

49
docs/en/Blog-Posts/2023-03-16-Migration-Abp.io-Azure/POST.md

@ -0,0 +1,49 @@
# On-Prem to Azure: Migration of abp.io Platform to Azure
![abpio-azure](images/abpio-azure.png)
Migrating a Kubernetes platform with a database from our own dedicated servers to Azure can be a compelling task, but it can be a necessary one to take advantage of the benefits that the cloud service offers. In this post, we will discuss the reasons for migrating from a on-premise platform to Azure, the steps taken to create and configure the [abp.io platform](https://abp.io) on Azure, and the benefits gained from the migration.
### On-Premise Server: The old platform
There were several reasons for migrating from the old on-premise platform to Azure. First, the Kubernetes cluster and the database were on the same Windows server. Additionally, the Linux virtual machines in Kubernetes were on the Windows server and had limited resources. Furthermore, the Kubernetes maintenance was quite challenging, which was another reason for the migration.
### Reasons for Moving to Azure: The new platform
The decision to move to the cloud was made to eliminate the disadvantages of the old platform. The migration to Azure meant that the resources would be independent of each other but faster in terms of communicating with each other. The platform would also take advantage of cloud security and availability. The managed Kubernetes service that Azure offers comes with autoscaling and loadbalancing, which makes the platform more reliable. Finally, the migration to Azure would provide a better quality service to global customers and the community.
### Before Moving to Azure
Before migrating to Azure, we decided to switch our database from MS-SQL to PostgreSQL on-premise first. This gave us the opportunity to test and fine-tune the migration process before making the final switch to Azure.You can check the details of database migration from this article [Migrating from MS-SQL to Postgresql](https://community.abp.io/posts/migrating-from-mssql-to-postgresql-lbi5anlv).
The platform was tested in a staging environment created on Azure with the same resources as the production environment. The staging environment was used to test and optimize the migration process, including the migration of data from the old platform to Azure, which was tested multiple times to ensure success.
### Creating and Configuring the abp.io Platform on Azure
Several steps were taken to create and configure the abp.io platform on Azure. [Terraform](https://www.terraform.io/) was used to create the infrastructure (VM, Private Network, AKS, Postgresql Flexible Server...), while [Ansible](https://www.ansible.com/) was used to configure the Azure resources like Terraform, Helm, Kubectl, Docker, VPN, Redis, Prometheus, Grafana, ElasticSearch, Kibana and so on.... Azure DevOps pipelines and release were used for AKS deployment. The most time-consuming part in this process was to prepare, test and optimize the terraform and ansible settings files.
To access our platform, which is configured on a private network in Azure, we require a VPN connection. To enable this, we have installed [Wireguard](https://www.wireguard.com/) - an open source VPN service - by creating a virtual machine using Terraform and configuring it with Ansible in Azure. This approach has made the process efficient and streamlined.
![terra-wire](images/terra-wire.png)
The most important step was to transfer the data in both the database and Kubernetes of the volumes. rsync (remote sync commands) were used to transfer the data from Kubernetes volumes to Azure NFS through the VPN machine. Additionally, `pg_dump` and `pg_restore` were used to transfer the PostgreSQL database through the machine with VPN.
Before the production environment, the data migration was tested many times for the staging environment. We estimated this migration to take max 1.5 hours. The ABP community was informed that there may be interruptions during the hours designated for the transition to Azure. To inform our customers and community, we created a status page before this migration. The new status page is [status.abp.io](https://status.abp.io). From now on we wil make all the infrastructural announcements on [status.abp.io](https://status.abp.io). We used [Upptime](https://upptime.js.org) which is an open-source uptime monitor and status page provider. During the migration of the production environment, the websites and databases were still up and running. After the data transfer, the only remaining step was to direct the traffic of the already standing abp.io sites to the Azure Kubernetes service via Cloudflare.
We would like to happily state that **we were offline for only 4 minutes** during this transition.
![az-infra](images/az-infra.png)
### Benefits of Moving to Azure
The migration to Azure resulted in several benefits. The platform is now more reliable, scalable, secure, solid with built-in one-click backup and recovery capabilities for abp.io. Additionally, the critical resources are in a private network, making them more secure than the old environment. When we initially compared the speed of our abp.io sites before and after migrating to Azure, we were pleasantly surprised by the significant improvement in performance. To be honest, we did not expect such a speed increase.
![speed](images/speed.png)
In conclusion, migrating a Kubernetes platform with a database from on-premise to Azure is a complex process that requires careful planning and execution. However, the benefits gained from the migration make the process worthwhile. By moving to Azure, the abp.io platform now has a more reliable and available infrastructure that is more secure than the old environment. The migration also resulted in significant improvements in connection speeds, which ultimately provides a better service to global customers and the community.

BIN
docs/en/Blog-Posts/2023-03-16-Migration-Abp.io-Azure/images/abpio-azure.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

BIN
docs/en/Blog-Posts/2023-03-16-Migration-Abp.io-Azure/images/az-infra.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

BIN
docs/en/Blog-Posts/2023-03-16-Migration-Abp.io-Azure/images/speed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

BIN
docs/en/Blog-Posts/2023-03-16-Migration-Abp.io-Azure/images/terra-wire.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

44
docs/en/Community-Articles/2023-02-22-Streamline-Localization-In-Your-ABP-Project/POST.md

@ -0,0 +1,44 @@
## Streamline Localization in Your ABP Project
Making localization changes to an ABP project can be a daunting task, especially if you're dealing with multiple languages and translations. During development, it's easy to overlook some changes and that leads to inconsistencies across different languages. Fortunately, I have developed a tool that can help streamline the localization process and ensure consistency across different languages.
The tool is a console application that uses JSON files to manage localization keys and their translations. It addresses three common scenarios that can arise during localization:
1. When the argument count of a key changes, it can be difficult to update the translations for all languages. My tool solves this problem by scanning all JSON files in the project folder and identifying any keys that have mismatched argument counts. It then offers two options to the user: delete the mismatched translations or export them as a JSON file for manual editing.
2. When a new key is added to the project, forgetting to add its translations to all the other languages is easy. My tool helps to avoid this issue by scanning the default language's JSON file and identifying any keys that don't have translations in other languages. It then exports these keys as a JSON file that can be used to add missing translations.
3. When a key's name is changed, it's important to update its translations in all the other languages. My tool makes this task simple by scanning all the JSON files in the project folder and updating any translations of the old key name with the new one.
The tool also includes an export feature that allows users to modify translations outside of the application and import them back into the JSON files.
## How it Helps
With my Localization Key Synchronizer tool, you can perform complex localization changes more quickly and easily than by manually sifting through files and making changes one-by-one. This can save you significant time and effort, especially if you're working with a large number of languages or translations.
## How it Works
When you run the Localization Key Synchronizer tool, it presents you with three options:
1. Find Asynchronous Keys
2. Apply Changes in the Exported File
3. Replace Keys
If you select "Find Asynchronous Keys," the tool prompts you to enter the default language path. Once you've entered the path, the tool displays all of the JSON files in the same folder as a multi-select list. After selecting one or more files, you are asked whether you want to find keys that do not match the number of arguments, missing keys, or both. If you select "Missing Keys," the tool prompts you to enter the absolute path to export the missing keys. After you've entered the path, the export process starts, and the tool closes.
![](./images/Part1.gif)
If you select "Apply Changes in the Exported File" at the main menu, the tool prompts you to enter the path to the exported file. After you've entered the path, the import process starts, and the tool closes.
![](./images/Part2.gif)
If you select "Replace Keys," the tool prompts you to enter the localization folder path, the old key, the new key, and the JSON files to apply the changes to. Once you've entered all the required information and made your selections, the tool performs the replacements and closes.
![](./images/Part3.gif)
## Conclusion
If you're struggling to manage localization changes in an ABP project, give my Localization Key Synchronizer tool a try. It can help streamline your workflow and make the process much more manageable. You can find the tool on [GitHub](https://github.com/abpframework/abp/tree/dev/tools/localization-key-synchronizer).
To use the tool, simply run the console application and follow the prompts. It's a user-friendly solution that helps to ensure localization consistency in your ABP project. Give it a try and let me know what you think!

BIN
docs/en/Community-Articles/2023-02-22-Streamline-Localization-In-Your-ABP-Project/images/Part1.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

BIN
docs/en/Community-Articles/2023-02-22-Streamline-Localization-In-Your-ABP-Project/images/Part2.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

BIN
docs/en/Community-Articles/2023-02-22-Streamline-Localization-In-Your-ABP-Project/images/Part3.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

37
docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/POST.md

@ -0,0 +1,37 @@
# Migrating from MS-SQL to Postgresql
![sql-server-to-postgres](images/sql-server-to-postgres.jpg)
## Introduction
Database migration is a common practice for organizations that want to move from one database system to another. This can be for a variety of reasons, including cost, performance, and features. In this article, we will discuss the process of migrating a database from MS-SQL to PostgreSQL, the challenges that may arise during the migration, and how to overcome them. And we recently moved the main database of https://abp.io platform from MS-SQL to PostgreSQL.
In our case, we decided to switch our database from Microsoft SQL Server (MS-SQL) to PostgreSQL because we wanted to move our on-premise platform to Azure. We’ve also found out that the cost of the license for MS-SQL on Azure was significantly higher than PostgreSQL. After conducting a cost-benefit analysis, we decided to migrate our database to PostgreSQL to save costs.
Before migrating to Azure, we decided to switch our database from MS-SQL to PostgreSQL on-premise first. This gave us the opportunity to test and fine-tune the migration process before making the final switch to Azure.
## Challenges
Despite using a third-party tool(DBConvert for MySQL & PostgreSQL) for the migration, we faced three main problems when exporting data to PostgreSQL. Firstly, some tables with plain text had utf-8 encoding problems. We overcame this problem by dump-restoring these tables.
![db-converter](images/db-converter.jpg)
Secondly, our database had to be case-insensitive, but PostgreSQL does not have this as a default configuration. We handled it using `citext` with the ABP migration service.
![citext-1](images/citext-1.jpg)
![citext-2](images/citext-2.jpg)
![citext-3](images/citext-3.jpg)
While everything was proceeding very smooth, we faced one last problem: importing binary data, such as the content of the NuGet packages. It was hard to understand that the binaries of the NuGet packages were different. Our paid commercial NuGet packages are being stored as binary data in the database. Therefore, it was the most compelling part of this migration to transfer the NuGet packages. Fortunately, we overcame the binary error. And we decided to write a custom .NET tool to move only the binary data from MS-SQL to PostgreSQL, thanks to the ABP Core team!
## Conclusion
One of the benefits of using PostgreSQL is the low license costs of the Azure platform. As the main contributors of ABP, we also use ABP Framework under the hood of our abp.io websites, we could easily switch to PostgreSQL. For those who want to switch their ABP project to PostgreSQL, check out [docs.abp.io/en/abp/latest/Entity-Framework-Core-PostgreSQL](https://docs.abp.io/en/abp/latest/Entity-Framework-Core-PostgreSQL). We had not used any MS-SQL specific function, therefore there was no need to make any changes in the repository classes. This means that the applications that were previously using MS-SQL can seamlessly switch to PostgreSQL without any modifications.
Thanks to the flexibility of ABP, it has [PostgreSQL package](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.PostgreSql) which is 100% compatible with PostgreSQL. This helped us to make this migration very smooth and seamless.
In conclusion, migrating a database from MS-SQL to PostgreSQL can be challenging, but it can bring significant cost savings in the long run. By testing and fine-tuning the migration process before making the final switch, we were able to overcome the challenges we’d faced during the migration process. Thanks to the flexibility of ABP, we were able to make the transition with minimal code changes. Also we didn't see any big performance differences between MS-SQL and PostgreSQL.

BIN
docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/images/citext-1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/images/citext-2.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/images/citext-3.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/images/db-converter.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 KiB

BIN
docs/en/Community-Articles/2023-03-15-Migration-Mssql-Postgresql/images/sql-server-to-postgres.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

309
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/Post.md

@ -0,0 +1,309 @@
## Introduction
In this article, I will talk about the relationships of IdentityUser in every web application that can be created with the ABP framework. When you read this article, you will learn how to extend the user entity in the applications you develop using the ABP framework with a primitive type, extending the user by associating the user with another entity (User-many-to-one-X).
## Creating the Solution
>For the source code of the application: https://github.com/onurpicakci/Abp-Identity-Relationship
In this article we will use EF Core as the database provider and MVC as the user interface framework. But Angular, Blazor Server and Blazor WebAssembly also work. ABP Framework offers starter templates to get started faster. We can create a new starter template using the ABP CLI:
```bash
abp new IdentityRelationship
```
After the project is created, you can run the `IdentityRelationship.DbMigrator` project to create the database and seed the initial data. You can then run the `IdentityRelationship.Web` project to see our application run.
> The default admin username is **admin** and the password is **1q2w3E\***
![solution-image](images/solution-image.png)
## Module Entity Extensions
The module entity extension system is a high level extension system that allows you to define new properties for existing entities of the depended modules. It automatically adds properties to the entity, database, HTTP API and the user interface in a single point.
### Extending the User Entity With a Primitive Type
Open the `IdentityRelationshipModuleExtensionConfigurator` class inside the `Domain.Shared` project of your solution and change the `ConfigureExtraProperties` method as shown below to add an `IdentificationNumber` property to the `IdentityUser` entity of the [Identity Module](https://docs.abp.io/en/abp/latest/Modules/Identity).
```csharp
public static void ConfigureExtraProperties()
{
OneTimeRunner.Run(() =>
{
ObjectExtensionManager.Instance.Modules()
.ConfigureIdentity(identity =>
{
identity.ConfigureUser(user =>
{
user.AddOrUpdateProperty<string>( //property type: string
"IdentificationNumber", //property name
property =>
{
//validation rules
property.Attributes.Add(string.Empty);
property.Attributes.Add(
new StringLengthAttribute(64) {
MinimumLength = 4
}
);
//...other configurations for this property
}
);
});
});
});
}
```
> This method is called inside the IdentityRelationshipDomainSharedModule at the beginning of the application. OneTimeRunner is a utility class that guarantees to execute this code only one time per application, since multiple calls are unnecessary.
If you want to localize, open the `IdentityRelationship.Domain.Shared` project and create a new localization in your `/Localization/IdentityRelationship/en.json` file.
```json
"IdentificationNumber": "Identification Number"
```
Once you define a property, it appears in the create and update forms of the related entity:
![identification-number](images/identification-number.png)
New properties also appear in the data table of the related page:
![users-page](images/users-page.png)
## Navigation Properties / Foreign Keys
It is supported to add an extension property to an entity that is the Id of another entity (foreign key).
### Example: Let's associate a department in the database with a user
First, create a `Departments` folder in the `IdentityRelationship.Domain` project and add the `Department` class inside:
```csharp
using System;
using Volo.Abp.Domain.Entities;
namespace IdentityRelationship.Departments;
public class Department : AggregateRoot<Guid>
{
public string Name { get; set; }
}
```
EF Core requires that you relate the entities with your `DbContext`. The easiest way to do so is adding a DbSet property to the `IdentityRelationshipDbContext` class in the `IdentityRelationship.EntityFrameworkCore` project, as shown below:
```csharp
public DbSet<Department> Departments { get; set; }
```
Then in the `IdentityRelationship.EntityFrameworkCore` project of your solution, open the `/EntityFrameworkCore/IdentityRelationshipEfCoreEntityExtensionMappings` class and update your code:
```csharp
public static class IdentityRelationshipEfCoreEntityExtensionMappings
{
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
public static void Configure()
{
IdentityRelationshipGlobalFeatureConfigurator.Configure();
IdentityRelationshipModuleExtensionConfigurator.Configure();
OneTimeRunner.Run(() =>
{
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, Guid>(
"DepartmentId",
(entityBuilder, propertyBuilder) => { propertyBuilder.HasMaxLength(128); }
);
});
}
}
```
This class can be used to map these extra properties to table fields in the database. Please read [this](https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities?_ga=2.21022651.140118448.1679289046-1173891759.1672473062) document to improve your understanding of what we are doing.
We need to create a new migration to see the changes in the database. Open your `EntityFrameworkCore` project in the terminal and run the following command (this depends on the IDE you are using).
![terminal-image](images/open-terminal.png)
```bash
dotnet ef migrations add Create_Department_Entity
```
Finally, run the `IdentityRelationship.DbMigrator` project to update the database.
When you look at your database, you can see that the `Department` table has been added and `DepartmentId` has been added to your `AbpUsers` table.
![database-tables](images/database-tables.png)
![users-table](images/users-table.png)
> It's good to have some initial data in the database before running the application. This section introduces the [Data Seeding](https://docs.abp.io/en/abp/latest/Data-Seeding) system of the ABP framework. You can skip this section if you don't want to create the data seeding, but it is suggested to follow along and learn this useful ABP Framework feature.
Create a class deriving from the `IDataSeedContributor` in the `IdentityRelationship.Domain` project by copying the following code:
```csharp
using System;
using System.Threading.Tasks;
using IdentityRelationship.Departments;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
namespace IdentityRelationship;
public class IdentityRelationshipDataSeederContributor
: IDataSeedContributor, ITransientDependency
{
private readonly IRepository<Department, Guid> _departmentRepository;
public IdentityRelationshipDataSeederContributor(IRepository<Department, Guid> departmentRepository)
{
_departmentRepository = departmentRepository;
}
public async Task SeedAsync(DataSeedContext context)
{
if (await _departmentRepository.GetCountAsync() <= 0)
{
await _departmentRepository.InsertAsync(
new Department
{
Name = "Human Resources"
},
autoSave: true
);
await _departmentRepository.InsertAsync(
new Department
{
Name = "Production"
},
autoSave: true
);
}
}
}
```
- This code simply uses the `IRepository<Department, Guid>` (the default [repository](https://docs.abp.io/en/abp/latest/Repositories)) to insert two books to the database in case there weren't any books in it.
Run the `IdentityRelationship.DbMigrator` application to update the database:
![run-dbmigrator](images/run-dbmigrator.png)
Again, open the `IdentityRelationshipModuleExtensionConfigurator` class in the Domain.Shared project and add the following code:
```csharp
user.AddOrUpdateProperty<Guid>(
"DepartmentId",
property =>
{
property.UI.Lookup.Url = "/api/app/department";
property.UI.Lookup.DisplayPropertyName = "name";
}
);
```
The `UI.Lookup.Url` option takes a URL to get the list of departments to select on the edit/create forms. This endpoint can be a typical controller, an auto API controller or any type of endpoint that returns a proper JSON response.
To localize, open the `IdentityRelationship.Domain.Shared` project and add it to your `/Localization/IdentityRelationship/en.json` file:
```json
"DepartmentId": "Department"
```
Create a `Departments` folder in the `IdentityRelationship.Application.Contracts` project of your solution and add the `DepartmentDto` class in it
```csharp
using System;
using Volo.Abp.Application.Dtos;
namespace IdentityRelationship.Departments;
public class DepartmentDto : EntityDto<Guid>
{
public string Name { get; set; }
}
```
Now let's create an `IDepartmentAppService` interface in the `Departments` folder
```csharp
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace IdentityRelationship.Departments;
public interface IDepartmentAppService : IApplicationService
{
public Task<PagedResultDto<DepartmentDto>> GetAsync();
}
```
Time to implement the `IDepartmentAppService` interface. Create a `Departments` folder in your `IdentityRelationship.Application` project and add the `DepartmentAppService` class inside.
```csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using IdentityRelationship.Departments;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Repositories;
namespace IdentityRelationship.Department;
public class DepartmentAppService : IdentityRelationshipAppService, IDepartmentAppService
{
private readonly IRepository<Departments.Department, Guid> _departmentRepository;
public DepartmentAppService(IRepository<Departments.Department, Guid> departmentRepository)
{
_departmentRepository = departmentRepository;
}
public async Task<PagedResultDto<DepartmentDto>> GetAsync()
{
var departments = await _departmentRepository.GetListAsync();
var totalCount = await _departmentRepository.GetCountAsync();
return new PagedResultDto<DepartmentDto>(totalCount,
ObjectMapper.Map<List<Departments.Department>, List<DepartmentDto>>(departments));
}
}
```
`DepartmentAppService `is using the `ObjectMapper` to convert the `Department` objects to `DepartmentDto` objects. So, we need to define this mapping in the AutoMapper configuration.
Open the `IdentityRelationshipApplicationAutoMapperProfile` class inside the `IdentityRelationship.Application` project and add the following line to the constructor:
```csharp
using AutoMapper;
using IdentityRelationship.Departments;
namespace IdentityRelationship;
public class IdentityRelationshipApplicationAutoMapperProfile : Profile
{
public IdentityRelationshipApplicationAutoMapperProfile()
{
CreateMap<Departments.Department, DepartmentDto>();
}
}
```
Run your `IdentityRelationship.Web` project and add a department to one of your users.
![user-department-image](images/user-department.png)
And it shows the department name on the data table:
![users-page-department-image](images/users-page-department.png)
## Conclusion
In this article I talked about the use of the IdentityUser relationship and how to extend it. Thank you for reading the article, I hope it was useful. See you soon!
## References
- https://docs.abp.io/en/abp/latest/Module-Entity-Extensions
- https://learn.microsoft.com/en-us/ef/core/modeling/relationships
- https://community.abp.io/posts/how-to-add-custom-properties-to-the-user-entity-rixchoha

BIN
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/database-tables.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

BIN
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/identification-number.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/open-terminal.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

BIN
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/run-dbmigrator.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/solution-image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/user-department.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/users-page-department.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

BIN
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/users-page.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
docs/en/Community-Articles/2023-03-20- IdentityUser-Relationships/images/users-table.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

10
docs/en/Dependency-Injection.md

@ -440,16 +440,16 @@ Use `ICachedServiceProvider` (instead of `ITransientCachedServiceProvider`) unle
## Advanced Features
### IServiceCollection.OnRegistred Event
### IServiceCollection.OnRegistered Event
You may want to perform an action for every service registered to the dependency injection. In the `PreConfigureServices` method of your module, register a callback using the `OnRegistred` method as shown below:
You may want to perform an action for every service registered to the dependency injection. In the `PreConfigureServices` method of your module, register a callback using the `OnRegistered` method as shown below:
````csharp
public class AppModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
context.Services.OnRegistred(ctx =>
context.Services.OnRegistered(ctx =>
{
var type = ctx.ImplementationType;
//...
@ -465,7 +465,7 @@ public class AppModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
context.Services.OnRegistred(ctx =>
context.Services.OnRegistered(ctx =>
{
if (ctx.ImplementationType.IsDefined(typeof(MyLogAttribute), true))
{
@ -478,7 +478,7 @@ public class AppModule : AbpModule
This example simply checks if the service class has `MyLogAttribute` attribute and adds `MyLogInterceptor` to the interceptor list if so.
> Notice that `OnRegistred` callback might be called multiple times for the same service class if it exposes more than one service/interface. So, it's safe to use `Interceptors.TryAdd` method instead of `Interceptors.Add` method. See [the documentation](Dynamic-Proxying-Interceptors.md) of dynamic proxying / interceptors.
> Notice that `OnRegistered` callback might be called multiple times for the same service class if it exposes more than one service/interface. So, it's safe to use `Interceptors.TryAdd` method instead of `Interceptors.Add` method. See [the documentation](Dynamic-Proxying-Interceptors.md) of dynamic proxying / interceptors.
## 3rd-Party Providers

36
docs/en/Multi-Tenancy.md

@ -32,25 +32,6 @@ Configure<AbpMultiTenancyOptions>(options =>
> Multi-Tenancy is disabled in the ABP Framework by default. However, it is **enabled by default** when you create a new solution using the [startup template](Startup-Templates/Application.md). `MultiTenancyConsts` class in the solution has a constant to control it in a single place.
### AbpMultiTenancyOptions: Handle inactive and non-existent tenants.
The `MultiTenancyMiddlewareErrorPageBuilder` of `AbpMultiTenancyOptions` is used to handle inactive and non-existent tenants.
It will respond to an error page by default, you can change it if you want, eg: only output the error log and continue ASP NET Core's request pipeline.
```csharp
Configure<AbpMultiTenancyOptions>(options =>
{
options.MultiTenancyMiddlewareErrorPageBuilder = async (context, exception) =>
{
// Handle the exception.
// Return true to stop the pipeline, false to continue.
return true;
};
});
```
### Database Architecture
ABP Framework supports all the following approaches to store the tenant data in the database;
@ -273,6 +254,23 @@ class SomeComponent {
> However, we don't suggest to change this value since some clients may assume the the `__tenant` as the parameter name and they might need to manually configure then.
The `MultiTenancyMiddlewareErrorPageBuilder` is used to handle inactive and non-existent tenants.
It will respond to an error page by default, you can change it if you want, eg: only output the error log and continue ASP NET Core's request pipeline.
```csharp
Configure<AbpAspNetCoreMultiTenancyOptions>(options =>
{
options.MultiTenancyMiddlewareErrorPageBuilder = async (context, exception) =>
{
// Handle the exception.
// Return true to stop the pipeline, false to continue.
return true;
};
});
```
##### Domain/Subdomain Tenant Resolver
In a real application, most of times you will want to determine current tenant either by subdomain (like mytenant1.mydomain.com) or by the whole domain (like mytenant.com). If so, you can configure the `AbpTenantResolveOptions` to add the domain tenant resolver.

2
docs/en/Tutorials/Part-10.md

@ -361,7 +361,7 @@ public class BookAppService :
GetListPolicyName = BookStorePermissions.Books.Default;
CreatePolicyName = BookStorePermissions.Books.Create;
UpdatePolicyName = BookStorePermissions.Books.Edit;
DeletePolicyName = BookStorePermissions.Books.Create;
DeletePolicyName = BookStorePermissions.Books.Delete;
}
public override async Task<BookDto> GetAsync(Guid id)

52
docs/en/UI/Angular/Card-Component.md

@ -0,0 +1,52 @@
# Card Component
The ABP Card Component is a wrapper component for the Bootstrap card class.
## Usage
ABP Card Component is a part of the `ThemeSharedModule` module. If you've imported that module into your module, you don't need to import it again. If not, first import it as shown below:
```ts
// my-feature.module.ts
import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { CardDemoComponent } from './chart-demo.component';
@NgModule({
imports: [
ThemeSharedModule ,
// ...
],
declarations: [CardDemoComponent],
// ...
})
export class MyFeatureModule {}
```
Then, the `abp-card` component can be used. See the example below:
```ts
// card-demo.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-card-demo',
template: `
<abp-card [cardStyle]="{width: '18rem'}">
<abp-card-body>
<abp-card-title>Lorem Ipsum</abp-card-title>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla commodo condimentum ligula, sed varius nibh eleifend sit amet. Maecenas facilisis vel arcu nec maximus.
</abp-card-body>
</abp-card>
`,
})
export class CardDemoComponent { }
```
See the result below:
![abp-card-component](./images/abp-card-component.png)
As you can see in the example above, you can customize your card component's style with the `cardStyle` input. You can also add your custom classes with the `cardClass` input.

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

@ -179,7 +179,7 @@ This command will download and start a simple static server, a browser window at
Of course, you need your application to run on an optimized web server and become available to everyone. This is quite straight-forward:
1. Create a new static web server instance. You can use a service like [Azure App Service](https://azure.microsoft.com/tr-tr/services/app-service/web/), [Firebase](https://firebase.google.com/docs/hosting), [Netlify](https://www.netlify.com/), [Vercel](https://vercel.com/), or even [GitHub Pages](https://angular.io/guide/deployment#deploy-to-github-pages). Another option is maintaining own web server with [NGINX](https://www.nginx.com/), [IIS](https://www.iis.net/), [Apache HTTP Server](https://httpd.apache.org/), or equivalent.
1. Create a new static web server instance. You can use a service like [Azure App Service](https://azure.microsoft.com/en-us/services/app-service/web/), [Firebase](https://firebase.google.com/docs/hosting), [Netlify](https://www.netlify.com/), [Vercel](https://vercel.com/), or even [GitHub Pages](https://angular.io/guide/deployment#deploy-to-github-pages). Another option is maintaining own web server with [NGINX](https://www.nginx.com/), [IIS](https://www.iis.net/), [Apache HTTP Server](https://httpd.apache.org/), or equivalent.
2. Copy the files from `dist/MyProjectName` <sup id="a-dist-folder-name">[1](#f-dist-folder-name)</sup> to a publicly served destination on the server via CLI of the service provider, SSH, or FTP (whichever is available). This step would be defined as a job if you have a CI/CD flow.
3. [Configure the server](https://angular.io/guide/deployment#server-configuration) to redirect all requests to the _index.html_ file. Some services do that automatically. Others require you [to add a file to the bundle via assets](https://angular.io/guide/workspace-config#assets-configuration) which describes the server how to do the redirections. Occasionally, you may need to do manual configuration.

BIN
docs/en/UI/Angular/images/abp-card-component.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

54
docs/en/UI/AspNetCore/Navigation-Menu.md

@ -104,6 +104,7 @@ There are more options of a menu item (the constructor of the `ApplicationMenuIt
* `target` (`string`): Target of the menu item. Can be `null` (default), "\_*blank*", "\_*self*", "\_*parent*", "\_*top*" or a frame name for web applications.
* `elementId` (`string`): Can be used to render the element with a specific HTML `id` attribute.
* `cssClass` (`string`): Additional string classes for the menu item.
* `groupName` (`string`): Can be used to group menu items.
### Authorization
@ -179,6 +180,58 @@ userMenu.Icon = "fa fa-users";
> `context.Menu` gives you ability to access to all the menu items those have been added by the previous menu contributors.
### Menu Groups
You can define groups and associate menu items with a group.
Example:
```csharp
using System.Threading.Tasks;
using MyProject.Localization;
using Volo.Abp.UI.Navigation;
namespace MyProject.Web.Menus
{
public class MyProjectMenuContributor : IMenuContributor
{
public async Task ConfigureMenuAsync(MenuConfigurationContext context)
{
if (context.Menu.Name == StandardMenus.Main)
{
await ConfigureMainMenuAsync(context);
}
}
private async Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{
var l = context.GetLocalizer<MyProjectResource>();
context.Menu.AddGroup(
new ApplicationMenuGroup(
name: "Main",
displayName: l["Main"]
)
)
context.Menu.AddItem(
new ApplicationMenuItem("MyProject.Crm", l["Menu:CRM"], groupName: "Main")
.AddItem(new ApplicationMenuItem(
name: "MyProject.Crm.Customers",
displayName: l["Menu:Customers"],
url: "/crm/customers")
).AddItem(new ApplicationMenuItem(
name: "MyProject.Crm.Orders",
displayName: l["Menu:Orders"],
url: "/crm/orders")
)
);
}
}
}
```
> The UI theme will decide whether to render the groups or not, and if it decides to render, the way it's rendered is up to the theme. Only the LeptonX theme implements the menu group.
## Standard Menus
A menu is a **named** component. An application may contain more than one menus with different, unique names. There are two pre-defined standard menus:
@ -233,4 +286,3 @@ namespace MyProject.Web.Pages
}
}
```

6
docs/en/UI/AspNetCore/Tag-Helpers/Form-elements.md

@ -10,7 +10,7 @@ See the [form elements demo page](https://bootstrap-taghelpers.abp.io/Components
## abp-input
`abp-input` tag creates a Bootstrap form input for a given c# property. It uses [Asp.Net Core Input Tag Helper](https://docs.microsoft.com/tr-tr/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-3.1#the-input-tag-helper) in background, so every data annotation attribute of `input` tag helper of Asp.Net Core is also valid for `abp-input`.
`abp-input` tag creates a Bootstrap form input for a given c# property. It uses [Asp.Net Core Input Tag Helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-7.0#the-input-tag-helper) in background, so every data annotation attribute of `input` tag helper of Asp.Net Core is also valid for `abp-input`.
Usage:
@ -88,7 +88,7 @@ You can set some of the attributes on your c# property, or directly on html tag.
* `label`: Sets the label for input.
* `display-required-symbol`: Adds the required symbol (*) to label if input is required. Default `True`.
`asp-format`, `name` and `value` attributes of [Asp.Net Core Input Tag Helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-3.1#the-input-tag-helper) are also valid for `abp-input` tag helper.
`asp-format`, `name` and `value` attributes of [Asp.Net Core Input Tag Helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-7.0#the-input-tag-helper) are also valid for `abp-input` tag helper.
### Label & Localization
@ -100,7 +100,7 @@ You can set label of your input in different ways:
## abp-select
`abp-select` tag creates a Bootstrap form select for a given c# property. It uses [Asp.Net Core Select Tag Helper](https://docs.microsoft.com/tr-tr/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-3.1#the-select-tag-helper) in background, so every data annotation attribute of `select` tag helper of Asp.Net Core is also valid for `abp-select`.
`abp-select` tag creates a Bootstrap form select for a given c# property. It uses [Asp.Net Core Select Tag Helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-7.0#the-select-tag-helper) in background, so every data annotation attribute of `select` tag helper of Asp.Net Core is also valid for `abp-select`.
`abp-select` tag needs a list of `Microsoft.AspNetCore.Mvc.Rendering.SelectListItem ` to work. It can be provided by `asp-items` attriube on the tag or `[SelectItems()]` attribute on c# property. (if you are using [abp-dynamic-form](Dynamic-forms.md), c# attribute is the only way.)

21
docs/en/UI/Blazor/Basic-Theme.md

@ -85,6 +85,27 @@ You can simply override the styles in the Global Styles file of your application
See the [Customization / Overriding Components](Customization-Overriding-Components.md) to learn how you can replace components, customize and extend the user interface.
### Overriding the Menu Item
Basic theme supports overriding a single menu item with a custom component. You can create a custom component and call `UseComponent` extension method of Basic Theme in the **MenuContributor**.
```csharp
using Volo.Abp.AspNetCore.Components.Web.BasicTheme.Navigation;
//...
context.Menu.Items.Add(
new ApplicationMenuItem("Custom.1", "My Custom Menu", "#")
.UseComponent(typeof(MyMenuItemComponent)));
```
```html
<li class="nav-item">
<a href="#" class="nav-link">
My Custom Menu
</a>
</li>
```
### Copy & Customize
You can run the following [ABP CLI](../../CLI.md) command in **Blazor{{if UI == "Blazor"}}WebAssembly{{else}} Server{{end}}** project directory to copy the source code to your solution:

53
docs/en/UI/Blazor/Navigation-Menu.md

@ -104,6 +104,7 @@ There are more options of a menu item (the constructor of the `ApplicationMenuIt
* `target` (`string`): Target of the menu item. Can be `null` (default), "\_*blank*", "\_*self*", "\_*parent*", "\_*top*" or a frame name for web applications.
* `elementId` (`string`): Can be used to render the element with a specific HTML `id` attribute.
* `cssClass` (`string`): Additional string classes for the menu item.
* `groupName` (`string`): Can be used to group menu items.
### Authorization
@ -160,6 +161,58 @@ userMenu.Icon = "fa fa-users";
> `context.Menu` gives you ability to access to all the menu items those have been added by the previous menu contributors.
### Menu Groups
You can define groups and associate menu items with a group.
Example:
```csharp
using System.Threading.Tasks;
using MyProject.Localization;
using Volo.Abp.UI.Navigation;
namespace MyProject.Web.Menus
{
public class MyProjectMenuContributor : IMenuContributor
{
public async Task ConfigureMenuAsync(MenuConfigurationContext context)
{
if (context.Menu.Name == StandardMenus.Main)
{
await ConfigureMainMenuAsync(context);
}
}
private async Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{
var l = context.GetLocalizer<MyProjectResource>();
context.Menu.AddGroup(
new ApplicationMenuGroup(
name: "Main",
displayName: l["Main"]
)
)
context.Menu.AddItem(
new ApplicationMenuItem("MyProject.Crm", l["Menu:CRM"], groupName: "Main")
.AddItem(new ApplicationMenuItem(
name: "MyProject.Crm.Customers",
displayName: l["Menu:Customers"],
url: "/crm/customers")
).AddItem(new ApplicationMenuItem(
name: "MyProject.Crm.Orders",
displayName: l["Menu:Orders"],
url: "/crm/orders")
)
);
}
}
}
```
> The UI theme will decide whether to render the groups or not, and if it decides to render, the way it's rendered is up to the theme. Only the LeptonX theme implements the menu group.
## Standard Menus
A menu is a **named** component. An application may contain more than one menus with different, unique names. There are two pre-defined standard menus:

2
docs/en/UI/Blazor/Overall.md

@ -88,7 +88,7 @@ There are a set of standard libraries that comes pre-installed and supported by
* [Twitter Bootstrap](https://getbootstrap.com/) as the fundamental HTML/CSS framework.
* [Blazorise](https://github.com/stsrki/Blazorise) as a component library that supports the Bootstrap and adds extra components like Data Grid and Tree.
* [FontAwesome](https://fontawesome.com/) as the fundamental CSS font library.
* [Flag Icon](https://github.com/lipis/flag-icon-css) as a library to show flags of countries.
* [Flag Icon](https://github.com/lipis/flag-icons) as a library to show flags of countries.
These libraries are selected as the base libraries and available to the applications and modules.

2
docs/en/UI/Blazor/Theming.md

@ -48,7 +48,7 @@ All the themes must depend on the [Volo.Abp.AspNetCore.Components.Server.Theming
* [Twitter Bootstrap](https://getbootstrap.com/) as the fundamental HTML/CSS framework.
* [Blazorise](https://github.com/stsrki/Blazorise) as a component library that supports the Bootstrap and adds extra components like Data Grid and Tree.
* [FontAwesome](https://fontawesome.com/) as the fundamental CSS font library.
* [Flag Icon](https://github.com/lipis/flag-icon-css) as a library to show flags of countries.
* [Flag Icon](https://github.com/lipis/flag-icons) as a library to show flags of countries.
These libraries are selected as the base libraries and available to the applications and modules.

10
docs/zh-Hans/Dependency-Injection.md

@ -270,16 +270,16 @@ using (var scope = _serviceProvider.CreateScope())
## 高级特性
### IServiceCollection.OnRegistred 事件
### IServiceCollection.OnRegistered 事件
你可能想在注册到依赖注入的每个服务上执行一个操作, 在你的模块的 `PreConfigureServices` 方法中, 使用 `OnRegistred` 方法注册一个回调(callback) , 如下所示:
你可能想在注册到依赖注入的每个服务上执行一个操作, 在你的模块的 `PreConfigureServices` 方法中, 使用 `OnRegistered` 方法注册一个回调(callback) , 如下所示:
````csharp
public class AppModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
context.Services.OnRegistred(ctx =>
context.Services.OnRegistered(ctx =>
{
var type = ctx.ImplementationType;
//...
@ -295,7 +295,7 @@ public class AppModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
context.Services.OnRegistred(ctx =>
context.Services.OnRegistered(ctx =>
{
if (ctx.ImplementationType.IsDefined(typeof(MyLogAttribute), true))
{
@ -308,7 +308,7 @@ public class AppModule : AbpModule
这个示例判断一个服务类是否具有 `MyLogAttribute` 特性, 如果有的话就添加一个 `MyLogInterceptor` 到拦截器集合中.
> 注意, 如果服务类公开了多于一个服务或接口, `OnRegistred` 回调(callback)可能被同一服务类多次调用. 因此, 较安全的方法是使用 `Interceptors.TryAdd` 方法而不是 `Interceptors.Add` 方法. 请参阅动态代理(dynamic proxying)/拦截器 [文档](Dynamic-Proxying-Interceptors.md).
> 注意, 如果服务类公开了多于一个服务或接口, `OnRegistered` 回调(callback)可能被同一服务类多次调用. 因此, 较安全的方法是使用 `Interceptors.TryAdd` 方法而不是 `Interceptors.Add` 方法. 请参阅动态代理(dynamic proxying)/拦截器 [文档](Dynamic-Proxying-Interceptors.md).
## 第三方提供程序

2
docs/zh-Hans/Tutorials/Part-10.md

@ -367,7 +367,7 @@ namespace Acme.BookStore.Books
GetListPolicyName = BookStorePermissions.Books.Default;
CreatePolicyName = BookStorePermissions.Books.Create;
UpdatePolicyName = BookStorePermissions.Books.Edit;
DeletePolicyName = BookStorePermissions.Books.Create;
DeletePolicyName = BookStorePermissions.Books.Delete;
}
public override async Task<BookDto> GetAsync(Guid id)

56
framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs

@ -0,0 +1,56 @@
using System;
using IdentityModel.Client;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Authentication.Cookies;
public static class CookieAuthenticationOptionsExtensions
{
/// <summary>
/// Introspect access token on validating the principal.
/// </summary>
/// <param name="options"></param>
/// <param name="oidcAuthenticationScheme"></param>
/// <returns></returns>
public static CookieAuthenticationOptions IntrospectAccessToken(this CookieAuthenticationOptions options, string oidcAuthenticationScheme = "oidc")
{
var originalHandler = options.Events.OnValidatePrincipal;
options.Events.OnValidatePrincipal = async principalContext =>
{
originalHandler?.Invoke(principalContext);
if (principalContext.Principal != null && principalContext.Principal.Identity != null && principalContext.Principal.Identity.IsAuthenticated)
{
var accessToken = principalContext.Properties.GetTokenValue("access_token");
if (!accessToken.IsNullOrWhiteSpace())
{
var openIdConnectOptions = principalContext.HttpContext.RequestServices.GetRequiredService<IOptionsMonitor<OpenIdConnectOptions>>().Get(oidcAuthenticationScheme);
if (openIdConnectOptions.Configuration == null && openIdConnectOptions.ConfigurationManager != null)
{
openIdConnectOptions.Configuration = await openIdConnectOptions.ConfigurationManager.GetConfigurationAsync(principalContext.HttpContext.RequestAborted);
}
var response = await openIdConnectOptions.Backchannel.IntrospectTokenAsync(new TokenIntrospectionRequest
{
Address = openIdConnectOptions.Configuration?.IntrospectionEndpoint ?? openIdConnectOptions.Authority.EnsureEndsWith('/') + "connect/introspect",
ClientId = openIdConnectOptions.ClientId,
ClientSecret = openIdConnectOptions.ClientSecret,
Token = accessToken
});
if (response.IsActive)
{
return;
}
}
principalContext.RejectPrincipal();
await principalContext.HttpContext.SignOutAsync(principalContext.Scheme.Name);
}
};
return options;
}
}

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

@ -12,11 +12,13 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.AspNetCore.Components.Web\Volo.Abp.AspNetCore.Components.Web.csproj" />
<ProjectReference Include="..\Volo.Abp.AspNetCore.Mvc.Contracts\Volo.Abp.AspNetCore.Mvc.Contracts.csproj" />
<ProjectReference Include="..\Volo.Abp.EventBus\Volo.Abp.EventBus.csproj" />
<ProjectReference Include="..\Volo.Abp.Http.Client\Volo.Abp.Http.Client.csproj" />
<ProjectReference Include="..\Volo.Abp.AspNetCore.SignalR\Volo.Abp.AspNetCore.SignalR.csproj" />
<ProjectReference Include="..\Volo.Abp.AspNetCore.Components.Web\Volo.Abp.AspNetCore.Components.Web.csproj" />
<ProjectReference Include="..\Volo.Abp.AspNetCore.Mvc.Contracts\Volo.Abp.AspNetCore.Mvc.Contracts.csproj" />
<ProjectReference Include="..\Volo.Abp.EventBus\Volo.Abp.EventBus.csproj" />
<ProjectReference Include="..\Volo.Abp.Http.Client\Volo.Abp.Http.Client.csproj" />
<ProjectReference Include="..\Volo.Abp.AspNetCore.SignalR\Volo.Abp.AspNetCore.SignalR.csproj" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageReference Include="IdentityModel" Version="6.0.0" />
</ItemGroup>
</Project>

23
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/Configuration/BlazorWebAssemblyCurrentApplicationConfigurationCacheResetService.cs

@ -0,0 +1,23 @@
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Components.Web.Configuration;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Configuration;
[Dependency(ReplaceServices = true)]
public class BlazorWebAssemblyCurrentApplicationConfigurationCacheResetService :
ICurrentApplicationConfigurationCacheResetService,
ITransientDependency
{
private readonly WebAssemblyCachedApplicationConfigurationClient _webAssemblyCachedApplicationConfigurationClient;
public BlazorWebAssemblyCurrentApplicationConfigurationCacheResetService(WebAssemblyCachedApplicationConfigurationClient webAssemblyCachedApplicationConfigurationClient)
{
_webAssemblyCachedApplicationConfigurationClient = webAssemblyCachedApplicationConfigurationClient;
}
public async Task ResetAsync()
{
await _webAssemblyCachedApplicationConfigurationClient.InitializeAsync();
}
}

9
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/FlagIconCss/FlagIconCssStyleContributor.cs

@ -7,6 +7,13 @@ public class FlagIconCssStyleContributor : BundleContributor
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.AddIfNotContains("/libs/flag-icon-css/css/flag-icons.min.css");
if (context.FileProvider.GetFileInfo("/libs/flag-icons/css/flag-icons.min.css").Exists)
{
context.Files.AddIfNotContains("/libs/flag-icons/css/flag-icons.min.css");
}
else if (context.FileProvider.GetFileInfo("/libs/flag-icon-css/css/flag-icons.min.css").Exists)
{
context.Files.AddIfNotContains("/libs/flag-icon-css/css/flag-icons.min.css");
}
}
}

14
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Select2/Select2ScriptContributor.cs

@ -1,16 +1,28 @@
using System.Collections.Generic;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.Core;
using Volo.Abp.Modularity;
using Volo.Abp.Localization;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.Select2;
[DependsOn(typeof(CoreScriptContributor))]
public class Select2ScriptContributor : BundleContributor
{
public const string PackageName = "select2";
public override void ConfigureBundle(BundleConfigurationContext context)
{
//TODO: Add select2.full.min.js or localize!
//TODO: Add select2.full.min.js
context.Files.AddIfNotContains("/libs/select2/js/select2.min.js");
}
public override void ConfigureDynamicResources(BundleConfigurationContext context)
{
var fileName = context.LazyServiceProvider.LazyGetRequiredService<IOptions<AbpLocalizationOptions>>().Value.GetCurrentUICultureLanguageFilesMap(PackageName);
var filePath = $"/libs/select2/js/i18n/{fileName}.js";
if (context.FileProvider.GetFileInfo(filePath).Exists)
{
context.Files.AddIfNotContains(filePath);
}
}
}

2
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js

@ -108,6 +108,7 @@
$select.select2({
ajax: {
url: url,
delay: 250,
dataType: "json",
data: function (params) {
let query = {};
@ -135,6 +136,7 @@
width: '100%',
dropdownParent: parentSelector ? $(parentSelector) : $('body'),
allowClear: allowClear,
language: abp.localization.currentCulture.cultureName,
placeholder: {
id: '-1',
text: placeholder

2
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/AbpAspNetCoreMvcUiWidgetsModule.cs

@ -39,7 +39,7 @@ public class AbpAspNetCoreMvcUiWidgetsModule : AbpModule
{
var widgetTypes = new List<Type>();
services.OnRegistred(context =>
services.OnRegistered(context =>
{
if (WidgetAttribute.IsWidget(context.ImplementationType))
{

16
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs

@ -43,6 +43,7 @@ using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.UI;
using Volo.Abp.UI.Navigation;
using Volo.Abp.Validation.Localization;
namespace Volo.Abp.AspNetCore.Mvc;
@ -174,10 +175,17 @@ public class AbpAspNetCoreMvcModule : AbpModule
context.Services.Replace(ServiceDescriptor.Singleton<IValidationAttributeAdapterProvider, AbpValidationAttributeAdapterProvider>());
context.Services.AddSingleton<ValidationAttributeAdapterProvider>();
Configure<MvcOptions>(mvcOptions =>
{
mvcOptions.AddAbp(context.Services);
});
context.Services.AddOptions<MvcOptions>()
.Configure<IServiceProvider>((mvcOptions, serviceProvider) =>
{
mvcOptions.AddAbp(context.Services);
// serviceProvider is root service provider.
var stringLocalizer = serviceProvider.GetRequiredService<IStringLocalizer<AbpValidationResource>>();
mvcOptions.ModelBindingMessageProvider.SetValueIsInvalidAccessor(_ => stringLocalizer["The value '{0}' is invalid."]);
mvcOptions.ModelBindingMessageProvider.SetNonPropertyValueMustBeANumberAccessor(() => stringLocalizer["The field must be a number."]);
mvcOptions.ModelBindingMessageProvider.SetValueMustBeANumberAccessor(value => stringLocalizer["The field {0} must be a number.", value]);
});
Configure<AbpEndpointRouterOptions>(options =>
{

2
framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs

@ -91,7 +91,7 @@ public class AbpAspNetCoreSignalRModule : AbpModule
{
var hubTypes = new List<Type>();
services.OnRegistred(context =>
services.OnRegistered(context =>
{
if (IsHubClass(context) && !IsDisabledForAutoMap(context))
{

2
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingModule.cs

@ -24,7 +24,7 @@ public class AbpAuditingModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
context.Services.OnRegistred(AuditingInterceptorRegistrar.RegisterIfNeeded);
context.Services.OnRegistered(AuditingInterceptorRegistrar.RegisterIfNeeded);
}
public override void ConfigureServices(ServiceConfigurationContext context)

4
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingOptions.cs

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
namespace Volo.Abp.Auditing;
@ -76,7 +77,8 @@ public class AbpAuditingOptions
IgnoredTypes = new List<Type>
{
typeof(Stream),
typeof(Expression)
typeof(Expression),
typeof(CancellationToken)
};
EntityHistorySelectors = new EntityHistorySelectorList();

4
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs

@ -22,7 +22,7 @@ public class AbpAuthorizationModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
context.Services.OnRegistred(AuthorizationInterceptorRegistrar.RegisterIfNeeded);
context.Services.OnRegistered(AuthorizationInterceptorRegistrar.RegisterIfNeeded);
AutoAddDefinitionProviders(context.Services);
}
@ -64,7 +64,7 @@ public class AbpAuthorizationModule : AbpModule
{
var definitionProviders = new List<Type>();
services.OnRegistred(context =>
services.OnRegistered(context =>
{
if (typeof(IPermissionDefinitionProvider).IsAssignableFrom(context.ImplementationType))
{

2
framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj

@ -15,7 +15,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Autofac" Version="6.4.0" />
<PackageReference Include="Autofac" Version="7.0.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.1" />
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="$(MicrosoftPackageVersion)" />

2
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobsAbstractionsModule.cs

@ -21,7 +21,7 @@ public class AbpBackgroundJobsAbstractionsModule : AbpModule
{
var jobTypes = new List<Type>();
services.OnRegistred(context =>
services.OnRegistered(context =>
{
if (ReflectionHelper.IsAssignableToGenericType(context.ImplementationType, typeof(IBackgroundJob<>)) ||
ReflectionHelper.IsAssignableToGenericType(context.ImplementationType, typeof(IAsyncBackgroundJob<>)))

5
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AsyncBackgroundJob.cs

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
@ -6,7 +7,7 @@ namespace Volo.Abp.BackgroundJobs;
public abstract class AsyncBackgroundJob<TArgs> : IAsyncBackgroundJob<TArgs>
{
//TODO: Add UOW, Localization and other useful properties..?
//TODO: Add UOW, Localization, CancellationTokenProvider and other useful properties..?
public ILogger<AsyncBackgroundJob<TArgs>> Logger { get; set; }

3
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJob.cs

@ -1,3 +1,4 @@
using System.Threading;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
@ -5,7 +6,7 @@ namespace Volo.Abp.BackgroundJobs;
public abstract class BackgroundJob<TArgs> : IBackgroundJob<TArgs>
{
//TODO: Add UOW, Localization and other useful properties..?
//TODO: Add UOW, Localization, CancellationTokenProvider and other useful properties..?
public ILogger<BackgroundJob<TArgs>> Logger { get; set; }

19
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs

@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
namespace Volo.Abp.BackgroundJobs;
@ -46,13 +47,19 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc
{
using(CurrentTenant.Change(GetJobArgsTenantId(context.JobArgs)))
{
if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob<object>.ExecuteAsync))
{
await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs }));
}
else
var cancellationTokenProvider =
context.ServiceProvider.GetRequiredService<ICancellationTokenProvider>();
using (cancellationTokenProvider.Use(context.CancellationToken))
{
jobExecuteMethod.Invoke(job, new[] { context.JobArgs });
if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob<object>.ExecuteAsync))
{
await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs }));
}
else
{
jobExecuteMethod.Invoke(job, new[] { context.JobArgs });
}
}
}

3
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAsyncBackgroundJob.cs

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
namespace Volo.Abp.BackgroundJobs;

4
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJob.cs

@ -1,4 +1,6 @@
namespace Volo.Abp.BackgroundJobs;
using System.Threading;
namespace Volo.Abp.BackgroundJobs;
/// <summary>
/// Defines interface of a background job.

10
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs

@ -1,4 +1,5 @@
using System;
using System.Threading;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.BackgroundJobs;
@ -11,10 +12,17 @@ public class JobExecutionContext : IServiceProviderAccessor
public object JobArgs { get; }
public JobExecutionContext(IServiceProvider serviceProvider, Type jobType, object jobArgs)
public CancellationToken CancellationToken { get; }
public JobExecutionContext(
IServiceProvider serviceProvider,
Type jobType,
object jobArgs,
CancellationToken cancellationToken = default)
{
ServiceProvider = serviceProvider;
JobType = jobType;
JobArgs = jobArgs;
CancellationToken = cancellationToken;
}
}

8
framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs

@ -12,22 +12,22 @@ namespace Volo.Abp.BackgroundJobs.Hangfire;
public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDependency
{
protected AbpBackgroundJobOptions Options { get; }
public HangfireBackgroundJobManager(IOptions<AbpBackgroundJobOptions> options)
{
Options = options.Value;
}
public virtual Task<string> EnqueueAsync<TArgs>(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal,
TimeSpan? delay = null)
{
return Task.FromResult(delay.HasValue
? BackgroundJob.Schedule<HangfireJobExecutionAdapter<TArgs>>(
adapter => adapter.ExecuteAsync(GetQueueName(typeof(TArgs)),args),
adapter => adapter.ExecuteAsync(GetQueueName(typeof(TArgs)), args, default),
delay.Value
)
: BackgroundJob.Enqueue<HangfireJobExecutionAdapter<TArgs>>(
adapter => adapter.ExecuteAsync(GetQueueName(typeof(TArgs)) ,args)
adapter => adapter.ExecuteAsync(GetQueueName(typeof(TArgs)), args, default)
));
}

9
framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs

@ -1,4 +1,5 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
using Hangfire;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
@ -21,8 +22,8 @@ public class HangfireJobExecutionAdapter<TArgs>
Options = options.Value;
}
[Queue("{0}")]
public async Task ExecuteAsync(string queue, TArgs args)
[Queue("{0}")]
public async Task ExecuteAsync(string queue, TArgs args, CancellationToken cancellationToken = default)
{
if (!Options.IsJobExecutionEnabled)
{
@ -38,7 +39,7 @@ public class HangfireJobExecutionAdapter<TArgs>
using (var scope = ServiceScopeFactory.CreateScope())
{
var jobType = Options.GetJob(typeof(TArgs)).JobType;
var context = new JobExecutionContext(scope.ServiceProvider, jobType, args);
var context = new JobExecutionContext(scope.ServiceProvider, jobType, args, cancellationToken: cancellationToken);
await JobExecuter.ExecuteAsync(context);
}
}

2
framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs

@ -40,7 +40,7 @@ public class QuartzJobExecutionAdapter<TArgs> : IJob
{
var args = JsonSerializer.Deserialize<TArgs>(context.JobDetail.JobDataMap.GetString(nameof(TArgs)));
var jobType = Options.GetJob(typeof(TArgs)).JobType;
var jobContext = new JobExecutionContext(scope.ServiceProvider, jobType, args);
var jobContext = new JobExecutionContext(scope.ServiceProvider, jobType, args, cancellationToken: context.CancellationToken);
try
{
await JobExecuter.ExecuteAsync(jobContext);

3
framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs

@ -68,7 +68,8 @@ public class BackgroundJobWorker : AsyncPeriodicBackgroundWorkerBase, IBackgroun
var context = new JobExecutionContext(
workerContext.ServiceProvider,
jobConfiguration.JobType,
jobArgs);
jobArgs,
workerContext.CancellationToken);
try
{

22
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs

@ -58,7 +58,7 @@ public class AuthService : IAuthService, ITransientDependency
{
if (!response.IsSuccessStatusCode)
{
Logger.LogError("Remote server returns '{response.StatusCode}'");
Logger.LogError($"Remote server returns '{response.StatusCode}'");
return null;
}
@ -127,6 +127,26 @@ public class AuthService : IAuthService, ITransientDependency
}
}
public async Task<bool> CheckMultipleOrganizationsAsync(string username)
{
var url = $"{CliUrls.WwwAbpIo}api/license/check-multiple-organizations?username={username}";
var client = CliHttpClientFactory.CreateClient();
using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, Logger))
{
if (!response.IsSuccessStatusCode)
{
throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'");
}
await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
var responseContent = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<bool>(responseContent);
}
}
private async Task LogoutAsync(string accessToken)
{
try

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/IAuthService.cs

@ -9,4 +9,6 @@ public interface IAuthService
Task LoginAsync(string userName, string password, string organizationName = null);
Task LogoutAsync();
Task<bool> CheckMultipleOrganizationsAsync(string username);
}

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/LoginInfo.cs

@ -1,8 +1,11 @@

using System;
namespace Volo.Abp.Cli.Auth;
public class LoginInfo
{
public Guid? Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }

30
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs

@ -2,13 +2,11 @@
using Microsoft.Extensions.Logging.Abstractions;
using System;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.Auth;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
@ -26,17 +24,13 @@ public class LoginCommand : IConsoleCommand, ITransientDependency
public ICancellationTokenProvider CancellationTokenProvider { get; }
public IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; }
private readonly CliHttpClientFactory _cliHttpClientFactory;
public LoginCommand(AuthService authService,
ICancellationTokenProvider cancellationTokenProvider,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
CliHttpClientFactory cliHttpClientFactory)
IRemoteServiceExceptionHandler remoteServiceExceptionHandler)
{
AuthService = authService;
CancellationTokenProvider = cancellationTokenProvider;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
_cliHttpClientFactory = cliHttpClientFactory;
Logger = NullLogger<LoginCommand>.Instance;
}
@ -111,7 +105,7 @@ public class LoginCommand : IConsoleCommand, ITransientDependency
private async Task<bool> HasMultipleOrganizationAndThisNotSpecified(CommandLineArgs commandLineArgs, string organization)
{
if (string.IsNullOrWhiteSpace(organization) &&
await CheckMultipleOrganizationsAsync(commandLineArgs.Target))
await AuthService.CheckMultipleOrganizationsAsync(commandLineArgs.Target))
{
Logger.LogError($"You have multiple organizations, please specify your organization with `--organization` parameter.");
return true;
@ -168,26 +162,6 @@ public class LoginCommand : IConsoleCommand, ITransientDependency
return false;
}
private async Task<bool> CheckMultipleOrganizationsAsync(string username)
{
var url = $"{CliUrls.WwwAbpIo}api/license/check-multiple-organizations?username={username}";
var client = _cliHttpClientFactory.CreateClient();
using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, Logger))
{
if (!response.IsSuccessStatusCode)
{
throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'");
}
await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
var responseContent = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<bool>(responseContent);
}
}
public string GetUsageInfo()
{
var sb = new StringBuilder();

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

@ -1,5 +1,4 @@
using System;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using System.Text;
using System.Threading.Tasks;
@ -41,7 +40,7 @@ public class LoginInfoCommand : IConsoleCommand, ITransientDependency
var sb = new StringBuilder();
sb.AppendLine("");
sb.AppendLine($"Login info:");
sb.AppendLine("Login info:");
sb.AppendLine($"Name: {loginInfo.Name}");
sb.AppendLine($"Surname: {loginInfo.Surname}");
sb.AppendLine($"Username: {loginInfo.Username}");

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

Loading…
Cancel
Save