From 2e723d8a1d98b39eb49606e14b82c01e51dec979 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Wed, 29 Jun 2022 11:55:34 +0300 Subject: [PATCH 1/6] Add missing Chienese localizations --- .../Localization/Resources/zh-Hans.json | 353 +++++++++++++++++- 1 file changed, 342 insertions(+), 11 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json index 4fe47cb523..5930a69a6f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json @@ -9,9 +9,10 @@ "QuestionCount": "剩余/问题总数", "Unlimited": "无限制", "Owners": "所有者", + "Owner": "所有者", "AddMember": "添加成员", - "AddOwner": "添加所有者", - "AddDeveloper": "添加开发者", + "AddNewOwner": "添加新的所有者", + "AddNewDeveloper": "添加新的开发者", "UserName": "用户名", "Name": "名称", "EmailAddress": "电子邮件地址", @@ -62,8 +63,6 @@ "Themes": "主题", "JoinOurNewsletter": "加入我们的时事通讯", "Send": "发送", - "Learn": "学习", - "AdditionalServices": "额外的服务", "WhatIsABPFramework": "什么是ABP框架?", "OpenSourceBaseFramework": "开源的框架", "ABPFrameworkExplanation": "

ABP商业版基于ABP框架, 这是一个开源和社区驱动的ASP.NET Core web应用程序开发框架.

ABP框架提供了出色的基础设施, 使用最佳实践编写可维护,可扩展,可测试的代码.

基于你已经知道的流行工具. 低学习曲线,容易适应,舒适的开发体检.

", @@ -129,6 +128,8 @@ "TellUsWhatYouNeed": "告诉我们你需要什么.", "YourMessage": "你的消息", "YourFullName": "你的全名", + "FirstNameField": "名字", + "LastNameField": "姓氏", "EmailField": "E-mail地址", "YourEmailAddress": "你的e-mail地址", "HowMayWeHelpYou": "需要获得购买帮助?(提供中文服务)", @@ -159,6 +160,8 @@ "SearchQuestionPlaceholder": "搜索常见的问题", "WhatIsTheABPCommercial": "什么是ABP商业版?", "WhatAreDifferencesThanAbpFramework": "ABP框架与ABP商业版有什么不同?", + "AbpCommercialMetaTitle": "ABP 商业版 - 完整的网页开发平台 : {0} | ABP 商业版 ", + "AbpCommercialMetaDescription": "ABP 商业版是在开源ABP框架之上构建的一组预构建应用程序模块、快速开发工具、UI主题和服务架构", "ABPCommercialExplanation": "ABP商业版是一套基于开源ABP框架之上的高级模块,工具,主题和服务. ABP商业版由ABP框架背后的同一团队开发和支持.", "WhatAreDifferencesThanABPFrameworkExplanation": "

ABP框架是模块化,主题化,微服务兼容的ASP.NET Core应用程序开发框架. 它提供了一个完整的架构和强大的基础设施,让你专注于自己的业务代码而不是重复自己的每一个项目. 它基于软件开发的最佳实践和你已经知道的流行工具

ABP框架是完全免费,开源和由社区驱动的. 它还提供了一个免费的主题和一些预构建的模块 (如 identity管理和租户管理).

", "VisitTheFrameworkVSCommercialDocument": "访问以下链接,了解更多信息 {1} ", @@ -191,6 +194,7 @@ "IsSourceCodeIncludedExplanation4": "

将模块的源代码包含到解决方案中,可以最大程度地自定义该模块. 但是当新版本发布时,将无法自动升级模块.

这些许可均不包含ABP Suite源代码,该源代码是一个外部工具,可以为你生成代码并帮助你进行开发

有关许可类型之间的其它差异查看定价页面.

", "ChangingDevelopers": "我将来可以更改我组织的注册开发人员吗?", "ChangingDevelopersExplanation": "除了将新的开发人员添加到你的许可中之外,你还可以更改现有的开发人员(可以删除一个开发人员并将新的开发人员添加到同一位置),而无需任何额外费用.", + "WhatHappensWhenLicenseEndsExplanation8": "您生成的 ABP 项目未存储在我们的服务器上。 因此,您有责任保留下载的源代码。 当您的许可证到期时,将无法获取您生成的 ABP 项目源代码。", "WhenShouldIRenewMyLicense": "我什么时候应该续订我的许可?", "WhenShouldIRenewMyLicenseExplanation": "如果您在许可证到期后 1 个月内续订许可证,将享受以下折扣:团队许可证 {0}% 折扣、商业许可证 {1}% 折扣、企业许可证 {2}% 折扣 . 如果您在许可证到期后 1 个月续订许可证,续订价格将与许可证购买价格相同,并且续订不会有折扣。", "TrialPlan": "你们有试用计划吗?", @@ -350,7 +354,6 @@ "WeWillSendYouADownloadLink": "下载电子书的链接已发送至{0}。
检查您的收件箱/垃圾箱/垃圾邮件箱!", "InvalidFormInputs": "请输入表格中指定的有效信息。", "DDDBookEmailBody": "谢谢你。
要下载您的图书,请点击此处。", - "FreeDDDEBook": "免费 DDD 电子书", "StartFree": "免费开始", "FreeTrial": "免费试用", "AcceptsMarketingCommunications": " 是的,我想接收 ABP 商业营销通讯。", @@ -361,7 +364,6 @@ "CompanySize": "公司规模", "Next": "下一个", "StartTrial": "开始我的免费试用", - "ContactUsIssues": "如果您有任何问题,请联系我们", "TrialActivatedWarning": "亲爱的{0},用户只能享受 1 个免费试用期。您已经使用了试用期。", "SaveAndDownload": "保存和下载", "CompanyNameValidationMessage": "公司名称太长!", @@ -369,17 +371,346 @@ "TaxNoValidationMessage": "TAX/VAT No 太长了!", "NotesValidationMessage": "备注字段太长!", "CheckYourBillingInfo": "您只能创建一次发票!在创建发票之前检查您的帐单信息。", - "Volo.AbpIo.Commercial:030000": "您已经使用了试用期。", - "Volo.AbpIo.Commercial:030001": "此组织名称已存在。", "StartYourFreeTrial": "开始你的免费试用", "TrialLicenseModelInvalidErrorMessage": "以下字段之一无效:国家名称、公司规模、行业或使用目的。", "Trial": "审判", "Purchased": "已购买", - "PurchaseLicense": "购买许可证", + "PurchaseNow": "立即购买", "PurchaseTrialLicenseMessage": "您的许可证到期日期是 {0}。
如果您想继续使用您在免费试用期内创建的项目,您需要更改 appsettings.secrets.json 文件中的许可证密钥。这是您的许可证密钥:", "TrialLicenseExpireMessage": "您正在使用试用许可证,您的试用许可证将于 {0}到期。", "TryForFree": "免费试用", "TrialLicenseExpiredInfo": "您的试用许可期限已过!", - "CommercialNewsletterConfirmationMessage": "我同意条款和条件隐私政策。" + "DowngradeLicensePlan": "我将来可以降级到较低的许可版本吗?", + "DowngradeLicensePlanExplanation": "您不能降级现有的许可版本。 但是您可以购买新的较低许可版本并继续使用新许可证进行开发。 购买较低的许可版本后,您只需通过 ABP CLI 命令登录到新的许可版本:` abp login -o `。", + "LicenseTransfer": "许可证可以从一个开发者转移到另一个开发者吗?", + "LicenseTransferExplanation": "是的! 购买许可证后,您将成为许可证持有者,因此您可以访问组织管理页面。 组织具有所有者和开发者角色。 业主可以管理开发者席位和分配开发者。 每个分配的开发者都将通过 ABP CLI 命令登录系统,并拥有开发和支持权限。", + "UserOwnerDescription": "组织的“所有者”是此帐户的管理员。 他/她通过购买许可证和分配开发者来管理组织。 “所有者”不能在 ABP 商业项目中编写代码,不能下载 ABP 示例项目,也不能在支持的网站上进行提问。 如果你想拥有这些操作权限,你必须也将自己添加为开发人员。", + "UserDeveloperDescription": "“开发人员”可以在 ABP 商业版项目中编写代码,下载 ABP 示例项目,并在支持的网站上进行提问。 然而另一方面,“开发者”无法管理这个组织。", + "RemoveCurrentUserFromOrganizationWarningMessage": "您正在将自己从自己的组织中移除。 您将无法再管理此组织,您确定吗?", + "RenewExistingOrganizationOrCreateNewOneMessage": "您可以通过单击下面的 \"立即延长\"按钮来更新您组织的许可证,因此您可以将许可证到期日期延长 1 年。 如果您继续结帐,您将拥有一个新的组织。 您想继续开始新的组织许可吗?", + "ExtendNow": "立即延长", + "CreateNewOrganization": "建立新的组织", + "RenewLicenseEarly": "如果我提前更新我的许可证,我会得到一整年吗?", + "RenewLicenseEarylExplanation": "当您在许可证到期日期之前续订许可证时,您的许可证到期日期仍将增加 1 年。 例如,如果您的许可在 {0}-06-06 到期,而您在 {0}-01-01 续订,那么您的新许可到期日期仍将是 {1}-06-06。", + "OpenSourceWebApplication": "开源网络应用程序", + "CompleteWebDevelopment": "一个完整的网络开发", + "ABPFrameworkDescription": "ABP 框架是一个完整的基础架构,可通过遵循软件开发和约定的最佳实践来创建现代 Web 应用程序。", + "CommunityDescription": "分享您使用 ABP 框架的经验!", + "GetStarted": "开始使用", + "Views": "意见", + "LatestPosts": "最新的帖子", + "PreBuiltApplication": "预构建应用程序", + "DatabaseProviders": "数据库提供者", + "UIFrameworks": "用户界面框架", + "UsefulLinks": "有用的链接", + "Platform": "平台", + "CoolestCompaniesUseABPCommercial": "最酷的公司都已经在使用 ABP Commercial。", + "UserInterface": "用户界面", + "APIGateway": "网关", + "Microservice": "微服务", + "Database": "数据库", + "Architecture": "结构", + "MicroserviceArchitectureExplanation": "这是一个完整的解决方案架构,由多个应用程序、API 网关、微服务和数据库组成,使用最新技术构建可扩展的微服务解决方案。", + "BusinessLogic": "业务逻辑", + "DataAccessLayer": "数据访问层", + "Monolith": "单体", + "ModularArchitectureExplanation": "此启动模板提供了分层、模块化和基于 DDD 的解决方案架构,以构建清晰且可维护的代码库。", + "SeeDetails": "阅读详情", + "SeeDocumentation": "查看文档", + "Bs5Compatible": "Bootstrap 5 兼容的专业主题,非常适合您的管理网站。", + "LeptonXTheme": "LeptonX 主题", + "LeptonXDark": "LeptonX 深色", + "LeptonXLight": "LeptonX 浅色", + "LeptonXSemiDark": "LeptonX 半深色", + "BuiltOnBs5Library": "基于 Bootstrap 5 库构建", + "FullyCompatibleWithBs5": "100% 兼容 Bootstrap 5 HTML 结构和 CSS 类", + "ResponsiveAndMobileCompatible": "响应式、移动兼容、RTL 支持", + "ProvidesStylesForDatatables": "为数据表提供样式", + "MultipleLayoutOptions": "多种布局选项", + "EasilyInstallAndUpgrade": "轻松安装和升级", + "SupportForum": "支持论坛", + "TrustedBy": "授信于", + "OurPricing": "我们的 价格", + "Plans": "计划", + "NameSurname": "姓名", + "Unspecified": "未指定的", + "LicenceType": "许可证类型", + "LicenseDiscountWarning": "此折扣页面使用默认折扣代码并适用于 VOLOSOFT 开发人员。 下面的购买链接不起作用。", + "DiscountedLicenseExplanation": "这些许可价格适用于小型初创公司、个人开发者、学生、非营利组织和项目!", + "General": "一般的", + "License": "许可证", + "Development": "开发", + "Payment": "支付", + "WatchExplainerVideo": "让我们见面吧! 观看解说视频", + "LightDarkAndSemiDarkThemes": "浅色、深色和半深色", + "LeptonXThemeExplanation": "Lepton Theme 可以根据您的系统设置更改您的主题。", + "PRO": "专业版", + "WelcomeToABPCommercial": "欢迎来到 ABP 商业版!", + "YourAccountDetails": "您的帐户详细信息", + "OrganizationName": "组织名称", + "AddDevelopers": "添加开发者", + "StartDevelopment": "开始开发", + "CreateAndRunApplicationUsingStartupTemplate": "了解如何使用 ABP Commercial 启动模板创建和运行新的 Web 应用程序。", + "CommunityDescription2": "community.abp.io 是人们可以分享 ABP 相关文章的地方。 搜索文章、教程、代码示例、案例研究并结识与您同路的人。", + "UseABPSuiteExplanation": "使用 ABP Suite 下载模块和主题的源代码。", + "ManageModulesWithSuite": "您还可以使用 Suite 管理您的 ABP 模块。", + "LearnHowToInstallSuite": "了解如何安装和使用 ABP 套件。", + "SeeMore": "查看更多", + "SeeLess": "收起全文", + "LayeredSolutionStructure": "分层解决方案结构", + "LayeredSolutionStructureExplanation": "该解决方案基于领域驱动设计原则和模式进行分层,以将您的业务逻辑与基础架构和集成隔离开来,并最大限度地提高代码的可维护性和可重用性。 ABP 框架已经提供了抽象、基类和指南来真正为您的应用程序实现 DDD。", + "MultipleUIOptions": "多个用户界面选项", + "MultipleUIOptionsExplanation": "我们喜欢不同的方式来创建用户界面。 此启动解决方案为您的业务应用程序提供了三种不同的 UI 框架选项。", + "MultipleDatabaseOptions": "多个数据库选项", + "MultipleDatabaseOptionsExplanation": "您有两个数据库提供程序选项(除了在单个应用程序中使用两者)。 使用 Entity Framework Core 处理任何关系数据库,当您需要编写低级查询以获得更好的性能时,可以选择使用 Dapper。 如果您需要使用基于文档的 NoSQL 数据库,MongoDB 是另一种选择。 虽然这些提供程序是良好集成、抽象和预配置的,但您实际上可以与任何可与 .NET 一起使用的数据库系统进行交互。", + "ModularArchitectureExplanation2": "模块化是 ABP.IO 平台的一等公民。 所有应用程序功能都被拆分为隔离良好的可选模块。 启动解决方案已经预装了基本的 ABP 商业模块。 您还可以创建自己的模块来为自己的应用程序构建模块化系统。", + "MultiTenancyForSaasBusiness": "SaaS 业务的多租户", + "MultiTenancyForSaasBusinessExplanation": "ABP 商业版 提供完整的端到端多租户系统来创建您的 SaaS(软件即服务)系统。 它允许租户通过动态数据库创建和迁移系统共享或拥有自己的数据库。", + "MicroserviceStartupSolution": "微服务启动解决方案", + "MicroserviceArchitectureExplanation2": "您可以将它用于您的下一个微服务系统,以利用预先构建的基础解决方案和提炼的经验。", + "PreIntegratedTools": "预集成到流行工具", + "PreIntegratedToolsExplanation": "该解决方案已集成到行业标准工具和技术中,而您可以随时更改它们并集成到您喜欢的工具中。", + "SingleSignOnAuthenticationServer": "单点登录认证服务器", + "SingleSignOnAuthenticationServerExplanation": "该解决方案有一个身份验证服务器应用程序,其他应用程序将其用作具有 API 访问管理功能的单点登录服务器。 它基于 IdentityServer。", + "WebAppsWithGateways": "2 个 Web 应用程序和 2 个 API 网关", + "WebAppsWithGatewaysExplanation": "该解决方案包含两个 Web 应用程序,每个应用程序都有一个专用的 API 网关(BFF - Backend For Frontend 模式)。", + "BackOfficeApplication": "后台应用程序", + "BackOfficeApplicationExplanation": "系统的实际 Web 应用程序,具有多个 UI 框架选项。 您可以创建任何类型的业务应用程序。", + "LandingWebsite": "登陆网站", + "LandingWebsiteExplanation": "可用于多种目的的通用登陆/公共网站,例如介绍您的公司、销售您的产品等。", + "ABPFrameworkEBook": "掌握 ABP 框架电子书", + "MasteringAbpFrameworkEBookDescription": "包含在您的 ABP 商业许可证中", + "FullName": "全名", + "LicenseTypeNotCorrect": "许可类型不正确!", + "Trainings": "培训", + "ChooseTrainingPlaceholder": "选择培训...", + "DoYouNeedTrainings": "您需要这些培训之一吗?", + "DoYouNeedTraining": "您需要 {0} 培训吗?", + "GetInTouchUs": "请与我们联系", + "ForMoreInformationClickHere": "如需更多信息,请点击此处。", + "IsGetOnboardingTraining": "您想获得入职和 Web 应用程序开发培训吗?", + "OnboardingWebApplicationDevelopmentTrainingMessage": "要安排您的培训日历,请在创建组织后联系 {0}", + "CustomPurchaseMessage": "对于下一步,单击 {0} 与我们联系。", + "Note": "说明", + "AdditionalNote": "附加说明", + "OnboardingTrainingFaqTitle": "你有 ABP 熟练使用培训吗?", + "OnboardingTrainingFaqExplanation": "是的,我们有 ABP 培训服务来帮助您快速启动您的 ABP 项目。 您将从 ABP 核心团队成员那里了解 ABP,并获得开始您的 ABP 项目的技能。 在 ABP 培训中,我们将解释如何设置开发环境、安装所需工具、创建功能齐全的 CRUD 页面。 培训将会以直播的形式并使用 Zoom 应用程序,我们也对使用其他在线会议平台持开放态度。 主要培训语言为英语。 您也可以在会议期间询问有关 ABP 的问题。 我们将安排一个方便双方的时间和日期。 要获取更多信息,请通过 info@abp.io 联系我们。", + "AddBasket": "添加到购物车", + "SendTrainingRequest": "发送培训请求", + "OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* 本文件的英文版本为最新版本,如有任何争议,以英文版本为准。", + "Pricing_Page_Title": "计划 & 定价", + "Pricing_Page_Description": "现在就选择您的业务及需要的特性和功能。 购买 ABP 商业许可证创建无限量项目。", + "Pricing_Page_HurryUp": "赶快行动吧!", + "Pricing_Page_BuyLicense": "在 1 月 16 日前以 2021 年价格 购买许可证!", + "Pricing_Page_ValidForExistingCustomers": "也适用于现有客户和许可证续订。", + "Pricing_Page_Hint1": "许可价格包括一定数量的开发者席位。 如果您有更多的开发人员,您可以随时购买额外的席位。", + "Pricing_Page_Hint2": "您现在或将来都可以购买更多的开发者许可证。 许可证是基于席位的,因此您可以将席位从开发人员转移到另一个开发人员。", + "Pricing_Page_Hint3": "您可以使用您的许可证开发无限数量的不同产品。", + "Pricing_Page_Hint4": "ABP Suite 是帮助您开发以提高生产力的工具。 它支持生成 CRUD 页面和创建新项目。", + "Pricing_Page_Hint5": "您可以在应用程序中使用所有预构建的模块。", + "Pricing_Page_Hint6": "您可以在应用程序中使用所有预构建的主题。", + "Pricing_Page_Hint7": "启动模板是一种 Visual Studio 解决方案,可让您快速启动项目。 所有基本模块都为您添加和预配置。", + "Pricing_Page_Hint8": "掌握 ABP 框架电子书解释了如何使用最佳实践实施 .NET 解决方案。它在 Amazon.com 上出售,您可以在许可证范围内免费下载该书。", + "Pricing_Page_Hint9": "您可以下载任何模块的源代码。 您可能希望将源代码添加到您的解决方案中以进行彻底的更改,或者出于安全原因将其自己保留。", + "Pricing_Page_Hint10": "许可证是终身的。 这意味着您可以永远继续开发您的应用程序。 在许可期限内(1 年,除非您续订)授予访问最新版本并获得支持。", + "Pricing_Page_Hint11": "部署没有限制! 您可以根据需要部署到任意数量的服务器,包括云服务或本地。", + "Pricing_Page_Hint12": "您可以在有效许可期内将模块、主题和工具更新到最新版本。 在您的许可证到期后,您需要对其进行续订,以继续获取错误修复、新功能和增强功能的更新。", + "Pricing_Page_Hint13": "您可以获得一年的高级支持(您可以续订许可证以延长它)。", + "Pricing_Page_Hint14": "团队和营业许可有事件/问题计数限制。 如果您购买额外的开发者许可,您的事件限制会按开发人员增加 {0}(对于团队许可)或 {1}(对于商业许可)每个开发者增加。", + "Pricing_Page_Hint15": "只有企业许可证包括私人支持。 您可以直接向 ABP 团队发送电子邮件或在 support.abp.io 上使用私人门票选项提问。 私人门票对公众不可见。", + "Pricing_Page_Hint16": "您可以下载所有 ABP 主题的源代码。 您可能希望将源代码添加到您的解决方案中以进行彻底的更改,或者出于安全原因将其自己保留。", + "Pricing_Page_Testimonial_1": "ABP Commercial 允许 SC Ventures 在 9 个月内交付银行级多租户silo数据库 SaaS 平台,以支持来自多个集成锚点的大额发票的应收账款/应付账款供应链融资。 ABP 的模块化使团队能够在创纪录的时间内交付,通过所有 VAPT,并通过完整的 CI/CD 和管道将容器化的微服务码部署到生产中。", + "Pricing_Page_Testimonial_2": "我们看到了使用 ABP Commercial 能减少定制开发项目开销的价值。 并且团队能够在不同的项目流中统一代码模式。 我们在框架中看到了能比以前更快地构建新功能的更多潜力。 我们相信我们将会持续地看到使用 ABP Commercial 的价值。", + "Pricing_Page_Testimonial_3": "我们大爱 ABP。 我们不必从头开始编写所有内容。 我们从\"开箱即用\"的功能开始,只需关注我们真正需要编写的内容。 此外,ABP 架构良好,代码质量高,错误少。 如果我们需要自己来编写所需的一切,我们可能需要花费数年时间。 另一点让我们喜欢的是新版本、问题修复或改进每隔一周很快地就会出现。 我们不会等太久。", + "Pricing_Page_Testimonial_4": "ABP 商业版 是一款很值得推荐的出色产品。 是在一个可配置的平台上为我们的客户推向市场的商业产品。 其框架和工具为任何团队提供的快速启动值得每一分钱。 ABP 商业版 最适合我们的需求。", + "AbpBookDownloadArea_ClaimYourEBook": "领取您的掌握ABP框架电子书", + "AddMemberModal_Warning_1": "如果您尝试添加的用户名在系统中不存在,请让您的团队成员在 {0} 并与您分享他/她帐户的用户名。", + "MyOrganizations_Detail_WelcomeMessage": "欢迎加入您的组织,{0}", + "MyOrganizations_Detail_OrganizationManagement": "组织管理", + "OrganizationDisplayName": "组织显示名称", + "MyOrganizations_Detail_EditDisplayName": "编辑显示名称", + "MyOrganizations_Detail_UpgradeYourLicense": "升级您的许可证", + "MyOrganizations_Detail_LicenseStartAndExpiryDate": "许可证开始日期 - 到期日期", + "MyOrganizations_Detail_OwnerRightInfo": "您正在使用您的 {1} 所有者权利中的 {0}。", + "MyOrganizations_Detail_CopyApiKey": "复制密钥", + "MyOrganizations_Detail_ApiKeyDescription": "API 密钥是托管在 {1} 上的 PRO 包的令牌。 ", + "MyOrganizations_Detail_YourPrivateNugetSource": "您的私有 NuGet 源是 {0}", + "MyOrganizations_Detail_PrivateNugetSourceWarning": "这将自动添加一个源到您的 ABP 解决方案中的 NuGet.Config。 不要与未经授权的用户共享您的私钥!", + "MyOrganizations_Detail_DeveloperSeatInfo": "您正在使用您的 {1} 个开发者席位中的 {0} 个。", + "NeedMoreSeatsForYourTeam": "您的团队需要更多席位吗?", + "MyOrganizations_Detail_PricePerYear": "{0} / 每年", + "MyOrganizations_Detail_PurchaseDeveloperSeats": "购买开发者席位", + "Invoices": "发票", + "RequestInvoice": "索取发票", + "OrderNumber": "订单号", + "Date": "日期", + "Products": "产品", + "TotalPrice": "总价格", + "ThereIsNoInvoice": "没有发票", + "MyOrganizations_Detail_PaymentProviderInfo": "如果您通过 {0} 网关购买了许可证,PDF 发票会被发送到您的电子邮件地址,请参阅 { 0} 发票。", + "MyOrganizations_Detail_PayUInfo": "如果您是通过PayU网关购买的,请点击\"索取发票\"按钮并填写账单信息。", + "MyOrganizations_Detail_ConclusionInfo": "您的发票申请将在 {0} 个工作日内完成。", + "ExtendYourLicense": "延长您的 {0} 许可", + "Continue": "继续", + "PurchaseLicense": "购买许可证", + "DownloadInvoiceModal_DownloadInvoice": "下载发票", + "DownloadInvoiceModal_SaveInformationOnlyOnce": "您只能保存一次账单信息。", + "InvoiceModal_EnterCompanyName": "请输入您的法定公司名称...", + "InvoiceModal_EnterCompanyAddress": "请输入您的法定公司地址...", + "InvoiceModal_EnterTaxNumber": "请输入您的税号/增值税号(如果有)...", + "RequestInvoiceModal_EnterNotes": "请输入您的有关发票的额外信息...", + "PrePayment_PayWithIyzico": "您将使用 Iyzico 付款", + "ContinueToCheckout": "继续结帐", + "PrePayment_IyzicoRedirectionInfo": "您将被重定向到 Iyzico 支付网关以安全地完成您的购买。", + "PrePayment_IyzicoAcceptVisaAndMasterCard": "Iyzico 接受 Visa 和 MasterCard。", + "Purchase": "购买", + "AcceptTermsAndConditions": "我已阅读、理解并接受隐私政策条款和条件 EULA。", + "AcceptTermsAndConditionsWarningMessage": "请接受隐私政策和条款和条件", + "SelectGatewayToContinue": "请选择一个网关以继续!", + "GatewaySelection_SelectGateway": "选择支付网关", + "GatewaySelection_RedirectionMessage": "接下来,您将被重定向到所选支付网关的交易网站。", + "PaymentSucceed_PaymentSuccessMessage": "支付成功", + "PaymentSucceed_ThanksForPurchase": "感谢您的购买!", + "PaymentSucceed_CreateYourOrganization": "创建您的组织", + "PaymentSucceed_AddMeAsDeveloper": "我是开发人员,请将我作为开发人员添加到我的组织中。", + "PaymentSucceed_CreateOrganization": "创建组织", + "PaymentSucceed_OrganizationDescription": "一个组织由开发人员和所有者组成。 开发人员是在 ABP 项目上编写代码的用户,将受益于 {1} 网站。 所有者是分配开发者席位和管理许可的用户。", + "PaymentSucceed_ViewOrganization": "点击这里查看组织", + "Purchase_TotalAnnualPrice": "总计 (年费)", + "Purchase_TrainingPrice": "培训价格", + "Purchase_OnboardingTraining": "ABP 熟悉使用和 Web 应用程序开发现场培训", + "TotalDeveloperPrice": "开发商总价", + "Purchase_PricePerDeveloper": "{0} {1} 每个开发者", + "Purchase_IncludedDeveloperInfo": "{0} {1} 包括在内。", + "Purchase_LicenseExtraDeveloperPurchaseMessage": "{0} 许可 包含 {1} 个开发者。 您可以现在或以后添加其他开发人员。", + "StartupTemplates_Page_Title": "启动模板", + "StartupTemplates_Page_Description": "ABP 商业版 允许您构建任何复杂程度的解决方案。 它提供了两种主要的预构建启动解决方案。 您可以选择最接近您要求的解决方案,并在此基础上构建您自己的定制解决方案。", + "MicroserviceStartupSolutionForDotnet": ".NET 微服务启动解决方案", + "MonolithSolutionForDotnet": ".NET 的单体(模块化)解决方案", + "TrainingDetailsHeaderInfo_TrainingHour": "{0} 小时", + "Trainings_Content": "培训内容", + "Trial_Page_StartYourFreeTrial": "开始您的免费试用", + "Contact_Page_Title": "联系 ABP 开发团队", + "Contact_Page_Description": "如果您需要任何帮助或分享您的想法和意见,请与 ABP 开发团队联系! ABP 支持团队随时准备提供帮助。", + "Demo_Page_Title": "创建演示", + "Demo_Page_Description": "创建免费演示以查看使用 ABP 商业版 启动模板创建的示例应用程序。 不要重复自己的常见应用程序要求。", + "Discounted_Page_Title": "折扣价", + "Discounted_Page_Description": "现在就选择您的业务及需要的特性和功能。 购买 ABP 商业许可证并创建无限量项目", + "Faq_Page_Title": "常见问题 (FAQ)", + "Faq_Page_Description": "您有任何问题吗? 搜索常见问题或使用联系表向我们提问。", + "Faq_Page_SwiftCode": "SWIFT代码", + "Faq_Page_BankName": "银行名称", + "Faq_Page_AccountName": "账户名称", + "Faq_Page_AccountNumber": "账号", + "Faq_Page_Currency": "货币", + "Faq_Page_VatNumber": "增值税号", + "Faq_Page_OtherCurrenciesInfo": "对于其他货币,请参阅所有账户", + "ModuleDetail_Page_Title": "模块详细信息 - {0}", + "ProjectCreatedSuccess_Page_Title": "您的项目已创建", + "ProjectCreatedSuccess_Page_Description": "您的 ABP 项目创建成功!", + "Suite_Page_Title": "ABP 套件 - 创建 CRUD 页面", + "Suite_Page_Description": "ABP Commercial 提供快速应用程序开发工具以提高开发人员的工作效率。 ABP 套件 允许您轻松创建 CRUD 页面。", + "Themes_Page_Title": "现代和实用的 UI 主题", + "Themes_Page_Description": "ABP 商业版 提供多种专业、现代的 UI 主题。 创建免费演示以快速查看 UI 的外观。", + "Tools_Page_Title": "快速应用程序开发工具", + "Tools_Page_Description": "ABP 商业版 提供快速应用程序开发工具以提高开发人员的工作效率。 ABP 套件 允许您轻松创建 CRUD 页面。", + "DeveloperPrice": "开发者价格", + "AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0} 开发者", + "LicenseRemainingDays": " {0} 天", + "ExtendPaymentInfoSection_Description": "通过延长/续订您的许可,您将继续获得高级支持。 您还将能够获得模块和主题的重大更新。 您将能够继续创建新项目。 您仍然可以使用 ABP 套件 来加速您的开发。", + "LicenseRenewalPrice": "许可证续订价格", + "LicensePrice": "许可证价格", + "TrialLicensePaymentInfoSection_Description": "购买许可证:通过购买许可证,您将继续获得高级支持。 您还将能够获得模块和主题的重大更新。 您将能够继续创建新项目。 而且您仍然可以使用 ABP 套件 加速您的开发。
请参阅 许可证比较表来查看许可证类型之间的差异。", + "SelectTargetLicense": "选择目标许可证", + "UpgradePaymentInfoSection_ExtendMyLicenseForOneYear": "是的,将我的许可证到期日期延长 1 年。", + "UpgradePaymentInfoSection_WantToExtendLicense": "您想将许可证再延长 {0} 年吗?", + "UpgradePaymentInfoSection_UpgradingWillNotExtendLicense": "升级不会延长您的许可证到期日期!", + "UpgradePaymentInfoSection_LicenseUpgradeDescription": "通过升级您的许可证,您将升级到更高的许可证类型,这将使您获得额外的好处。 请参阅许可证比较表以查看许可证类型之间的差异。", + "Landing_Page_CustomerStories": "客户故事", + "Landing_Page_OurGreatCustomers": "我们的大客户", + "Landing_Page_WebApplicationFramework": "网络应用框架", + "Landing_Page_WebDevelopmentPlatform": "网页开发平台", + "Landing_Page_CompleteWebDevelopmentPlatform": "完整的网页开发平台", + "Landing_Page_TryFreeDemo": "试用免费演示", + "Landing_Page_StartingPointForWebApplications": "基于 ASP.NET Core 的 Web 应用程序的起点! 它是基于最佳 Web 开发的 ABP 框架。", + "Landing_Page_AbpProvidesSoftwareInfrastructure": "ABP 框架提供了一个软件基础架构来开发基于最佳实践的优秀 Web 应用程序。", + "Landing_Page_MicroserviceCompatibleArchitecture": "微服务兼容架构", + "Landing_Page_PreBuiltApplicationModulesAndThemes": "预建的应用程序模块和主题", + "Landing_Page_MultiTenantArchitecture": "多租户架构", + "Landing_Page_MultiTenancyDescription": "SaaS 应用程序变得简单! 从数据库到 UI 的集成多租户。", + "Landing_Page_DDDIntroduction": "基于 DDD 模式和原则设计和开发。 为您的应用程序提供分层模型。", + "Landing_Page_CrossCuttingConcernsInfo": "用于授权、验证、异常处理、缓存、审计日志记录、事务管理等的完整基础架构。", + "Landing_Page_PreBuiltApplicationModules": "预建应用程序模块,其中包括最常见的 Web 应用程序要求。", + "Landing_Page_ChatModule": "聊天", + "Landing_Page_DocsModule": "文档", + "Landing_Page_FileManagementModule": "文档", + "Landing_Page_CustomerStory_1": "ABP 商业版 允许 SC Ventures 在 9 个月内交付银行级多租户silo数据库 SaaS 平台,以支持来自多个集成锚点的大额发票的应收账款/应付账款供应链融资。 ABP 的模块化使团队能够在创纪录的时间内交付,通过所有 VAPT,并通过完整的 CI/CD 和管道将容器化的微服务码部署到生产中。", + "Landing_Page_CustomerStory_2": "我们看到了使用 ABP 商业版 来减少定制开发项目开销的价值。 并且团队能够在不同的项目流中统一代码模式。 我们在框架中看到了比以前更快地构建新功能的更多潜力。 我们相信我们将不断看到使用 ABP 商业版 的价值。", + "Landing_Page_CustomerStory_3": "我们很爱 ABP。 我们不必从头开始编写所有内容。 我们从\"开箱即用\"的功能开始,只关注我们真正需要编写的内容。 此外,ABP 架构良好,代码质量高,错误少。 如果我们必须自己编写所需的一切,我们可能需要花费数年时间。 另一件事是我们喜欢的是新版本、问题修复或改进每隔一周就很快会出现\n。 我们不会等太久。", + "Landing_Page_CustomerStory_4": "ABP 商业版 是一款值得推荐的出色产品。 在一个可配置的平台上为我们的客户推向市场的商业产品。 为任何团队提供的框架和工具的快速启动都值得每一分钱。 ABP 商业版 最适合我们的需求。", + "Landing_Page_AdditionalServices": "定制或批量许可、熟悉使用培训、网上培训和支持、定制项目开发、移植现有项目等等...", + "Landing_Page_IncludedDeveloperLicenses": "包含 {0} 开发者许可", + "Landing_Page_SeeOnDemo": "见演示", + "Landing_Page_LeptonThemes": "Lepton主题", + "Landing_Page_AccountModuleDescription_1": "该模块实现了应用程序的认证系统;", + "Landing_Page_AccountModuleDescription_2": "提供带有用户名和密码的登录页面", + "Landing_Page_AccountModuleDescription_3": "提供一个注册页面来创建一个新账户。", + "Landing_Page_AccountModuleDescription_4": "提供忘记密码页面,以电子邮件形式发送密码重置链接。", + "Landing_Page_AccountModuleDescription_5": "通过 UI 提供电子邮件确认功能。", + "Landing_Page_AccountModuleDescription_6": "实现双重身份验证(短信和电子邮件)。", + "Landing_Page_AccountModuleDescription_7": "实现用户锁定(当在一定时间间隔内由于无效凭据发生一定次数的登录失败时,将账户锁定设定的时间)。", + "Landing_Page_AccountModuleDescription_8": "实现 身份验证 身份验证服务器 UI 和功能。", + "Landing_Page_AccountModuleDescription_9": "允许在多租户环境中在租户之间切换。", + "Landing_Page_AccountModuleDescription_10": "允许更改应用程序的UI 语言。", + "Landing_Page_AuditLoggingModuleDescription_1": "此模块为审计基础设施提供审计日志报告 UI。 允许搜索、过滤和显示审计日志条目和实体更改日志。", + "Landing_Page_AuditLoggingModuleDescription_2": "审核日志条目包含有关每个客户端请求的关键数据:", + "Landing_Page_AuditLoggingModuleDescription_3": "URL、浏览器、IP 地址、客户端名称", + "Landing_Page_AuditLoggingModuleDescription_4": "用户", + "Landing_Page_AuditLoggingModuleDescription_5": "HTTP方法,HTTP返回状态码", + "Landing_Page_AuditLoggingModuleDescription_6": "成功/失败,异常详细信息(如果有)", + "Landing_Page_AuditLoggingModuleDescription_7": "请求执行时长", + "Landing_Page_AuditLoggingModuleDescription_8": "此请求中已创建、删除或更新实体(具有更改的属性)。", + "Landing_Page_BloggingModuleDescription_1": "该模块将一个简单的博客添加到您的 ABP 应用程序;", + "Landing_Page_BloggingModuleDescription_2": "允许在单个应用程序中创建多个博客。", + "Landing_Page_BloggingModuleDescription_3": "支持 Markdown 格式。", + "Landing_Page_BloggingModuleDescription_4": "允许为帖子写评论。", + "Landing_Page_BloggingModuleDescription_5": "允许为博客文章分配标签。", + "Landing_Page_BloggingModuleDescription_6": "请参阅 blog.abp.io 网站作为博客模块的实时示例。", + "Landing_Page_ChatModuleDescription_1": "该模块用于应用程序中用户之间的实时消息传递。", + "Landing_Page_ChatModuleDescription_2": "聊天页面上的实时消息。", + "Landing_Page_ChatModuleDescription_3": "在应用程序中搜索用户以获取新对话。", + "Landing_Page_ChatModuleDescription_4": "最近对话的联系人列表。", + "Landing_Page_ChatModuleDescription_5": "当用户正在查看另一个页面时的新消息通知。", + "Landing_Page_ChatModuleDescription_6": "菜单图标上的未读消息总数徽章。", + "Landing_Page_ChatModuleDescription_7": "每个对话的未读消息计数。", + "Landing_Page_ChatModuleDescription_8": "延迟加载的对话。", + "Landing_Page_DocsModuleDescription_1": "该模块用于创建技术文档网站;", + "Landing_Page_DocsModuleDescription_2": "内置 GitHub 集成:直接在 GitHub 上编写和管理文档。", + "Landing_Page_DocsModuleDescription_3": "版本控制支持直接集成到 GitHub 版本。", + "Landing_Page_DocsModuleDescription_4": "支持多语言(回退支持默认语言)。", + "Landing_Page_DocsModuleDescription_5": "支持 Markdown 和 HTML 格式。", + "Landing_Page_DocsModuleDescription_6": "提供导航大纲部分。", + "Landing_Page_DocsModuleDescription_7": "允许在单个应用程序中托管多个项目文档。", + "Landing_Page_DocsModuleDescription_8": "GitHub 上文件的链接,因此任何人都可以通过单击编辑链接轻松贡献。", + "Landing_Page_DocsModuleDescription_9": "除了 GitHub 源之外,还允许简单地使用文件夹作为文档源。", + "Landing_Page_FileManagementModuleDescription_1": "在分层文件夹结构中上传、下载和组织文件。", + "Landing_Page_FileManagementModuleDescription_2": "该模块用于上传、下载和组织分层文件夹结构中的文件。 它还兼容多租户,您可以确定租户的总大小限制。", + "Landing_Page_FileManagementModuleDescription_3": "本模块基于BLOB Storing系统,因此可以使用不同的存储供应商存储文件内容。", + "Landing_Page_IdentityModuleDescription_1": "该模块实现了应用程序的用户和角色系统;", + "Landing_Page_IdentityModuleDescription_2": "基于 Microsoft 的 ASP.NET Core Identity 库构建。", + "Landing_Page_IdentityModuleDescription_3": "管理系统中的角色用户。 一个用户可以拥有多个角色。", + "Landing_Page_IdentityModuleDescription_4": "在角色和用户级别设置权限。", + "Landing_Page_IdentityModuleDescription_5": "为每个用户启用/禁用双重身份验证和用户锁定。", + "Landing_Page_IdentityModuleDescription_6": "管理基本的用户个人资料密码。", + "Landing_Page_IdentityModuleDescription_7": "管理系统中的声明类型,为角色和用户设置声明。,", + "Landing_Page_IdentityModuleDescription_8": "设置页面以管理密码复杂性、用户登录、账户和锁定。", + "Landing_Page_IdentityModuleDescription_9": "支持 LDAP 身份验证。", + "Landing_Page_IdentityModuleDescription_10": "提供电子邮件和电话号码验证。", + "Landing_Page_IdentityModuleDescription_11": "支持社交登录集成(Twitter、Facebook、GitHub 等)。", + "Landing_Page_IdentityModuleDescription_12": "管理系统中的组织单位。", + "Landing_Page_PaymentModuleDescription_1": "为不同的支付网关提供集成。", + "Landing_Page_PaymentModuleDescription_2": "该模块提供支付网关的集成,因此您可以轻松地从客户那里获得付款。", + "Landing_Page_PaymentModuleDescription_3": "该模块支持以下支付网关", + "Welcome_Page_UseSameCredentialForCommercialWebsites": "commercial.abp.iosupport.abp.io使用相同的凭据。" } -} +} \ No newline at end of file From bc688e537f986e9faa46b22066612d3c63323ed5 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 29 Jun 2022 18:24:18 +0800 Subject: [PATCH 2/6] Forward Identity authentication for `Bearer`. --- .../MyProjectNameModule.cs | 7 +++++++ .../MyProjectNameModule.cs | 9 ++++++++- .../MyProjectNameModule.cs | 7 +++++++ .../MyProjectNameModule.cs | 7 +++++++ .../MyProjectNameModule.cs | 9 ++++++++- .../MyProjectNameModule.cs | 7 +++++++ .../MyProjectNameBlazorModule.cs | 7 +++++++ .../MyProjectNameHttpApiHostModule.cs | 7 +++++++ .../MyProjectNameAuthServerModule.cs | 4 ++++ .../MyProjectNameBlazorHostModule.cs | 3 +++ 10 files changed, 65 insertions(+), 2 deletions(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs index 0e5d86e4c7..f234a8b833 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs @@ -6,6 +6,7 @@ using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Menus; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -139,6 +140,7 @@ public class MyProjectNameModule : AbpModule context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureUrls(configuration); ConfigureBundles(); ConfigureAutoMapper(context); @@ -152,6 +154,11 @@ public class MyProjectNameModule : AbpModule ConfigureMongoDB(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureUrls(IConfiguration configuration) { Configure(options => diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs index b9d407572b..3f46aea839 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs @@ -6,6 +6,7 @@ using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Menus; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -63,7 +64,7 @@ namespace MyCompanyName.MyProjectName; typeof(AbpAspNetCoreSerilogModule), typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule), typeof(AbpAspNetCoreComponentsServerLeptonXLiteThemeModule), - + // Account module packages typeof(AbpAccountApplicationModule), typeof(AbpAccountHttpApiModule), @@ -140,6 +141,7 @@ public class MyProjectNameModule : AbpModule context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureUrls(configuration); ConfigureBundles(); ConfigureAutoMapper(context); @@ -153,6 +155,11 @@ public class MyProjectNameModule : AbpModule ConfigureEfCore(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureUrls(IConfiguration configuration) { Configure(options => diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs index b9e6fe7590..45e5006b8a 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -127,6 +128,7 @@ public class MyProjectNameModule : AbpModule context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureBundles(); ConfigureMultiTenancy(); ConfigureUrls(configuration); @@ -140,6 +142,11 @@ public class MyProjectNameModule : AbpModule ConfigureMongoDB(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureBundles() { Configure(options => diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs index 043d86a923..74e564c94b 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -129,6 +130,7 @@ public class MyProjectNameModule : AbpModule context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureBundles(); ConfigureMultiTenancy(); ConfigureUrls(configuration); @@ -142,6 +144,11 @@ public class MyProjectNameModule : AbpModule ConfigureEfCore(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureBundles() { Configure(options => diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs index 5344e574bf..f097d8d434 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs @@ -4,6 +4,7 @@ using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Menus; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -57,7 +58,7 @@ namespace MyCompanyName.MyProjectName; typeof(AbpSwashbuckleModule), typeof(AbpAspNetCoreSerilogModule), typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule), - + // Account module packages typeof(AbpAccountApplicationModule), typeof(AbpAccountHttpApiModule), @@ -133,6 +134,7 @@ public class MyProjectNameModule : AbpModule context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureMultiTenancy(); ConfigureUrls(configuration); ConfigureBundles(); @@ -145,6 +147,11 @@ public class MyProjectNameModule : AbpModule ConfigureMongoDB(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureMultiTenancy() { Configure(options => diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs index 7fede74c7a..ba26323705 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs @@ -4,6 +4,7 @@ using Microsoft.OpenApi.Models; using MyCompanyName.MyProjectName.Data; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Menus; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -134,6 +135,7 @@ public class MyProjectNameModule : AbpModule context.Services.Replace(ServiceDescriptor.Singleton()); } + ConfigureAuthentication(context); ConfigureMultiTenancy(); ConfigureUrls(configuration); ConfigureBundles(); @@ -146,6 +148,11 @@ public class MyProjectNameModule : AbpModule ConfigureEfCore(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureMultiTenancy() { Configure(options => diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs index 2e251e86e9..e919342fe9 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs @@ -12,6 +12,7 @@ using MyCompanyName.MyProjectName.Blazor.Server.Menus; using MyCompanyName.MyProjectName.EntityFrameworkCore; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.MultiTenancy; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme; @@ -88,6 +89,7 @@ public class MyProjectNameBlazorModule : AbpModule var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + ConfigureAuthentication(context); ConfigureUrls(configuration); ConfigureBundles(); ConfigureAutoMapper(); @@ -100,6 +102,11 @@ public class MyProjectNameBlazorModule : AbpModule ConfigureMenu(context); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureUrls(IConfiguration configuration) { Configure(options => diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs index a981a370a8..49ee9d6b03 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs @@ -13,6 +13,7 @@ using MyCompanyName.MyProjectName.MultiTenancy; using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite; using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling; using Microsoft.OpenApi.Models; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -61,6 +62,7 @@ public class MyProjectNameHttpApiHostModule : AbpModule var configuration = context.Services.GetConfiguration(); var hostingEnvironment = context.Services.GetHostingEnvironment(); + ConfigureAuthentication(context); ConfigureBundles(); ConfigureUrls(configuration); ConfigureConventionalControllers(); @@ -70,6 +72,11 @@ public class MyProjectNameHttpApiHostModule : AbpModule ConfigureSwaggerServices(context, configuration); } + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + } + private void ConfigureBundles() { Configure(options => diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs index 9fca370381..8d5967e361 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs @@ -4,12 +4,14 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using MyCompanyName.MyProjectName.MultiTenancy; using StackExchange.Redis; using Microsoft.OpenApi.Models; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -100,6 +102,8 @@ public class MyProjectNameAuthServerModule : AbpModule var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + Configure(options => { options.UseSqlServer(); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs index 1c4acef254..46bb89e1b8 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs @@ -13,6 +13,7 @@ using MyCompanyName.MyProjectName.Blazor.Server.Host.Menus; using MyCompanyName.MyProjectName.EntityFrameworkCore; using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.MultiTenancy; +using OpenIddict.Validation.AspNetCore; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web; @@ -113,6 +114,8 @@ public class MyProjectNameBlazorHostModule : AbpModule var hostingEnvironment = context.Services.GetHostingEnvironment(); var configuration = context.Services.GetConfiguration(); + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + Configure(options => { options.UseSqlServer(); From 98849328f0bb93774b03ef82d2cdd99120a6ac96 Mon Sep 17 00:00:00 2001 From: icagatay Date: Wed, 29 Jun 2022 15:14:59 +0300 Subject: [PATCH 3/6] fix DefaultFromAddress localization fix DefaultFromDisplayName localization --- .../Localization/Resources/AbpSettingManagement/tr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json index 57397659f1..925825e3cc 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json @@ -23,8 +23,8 @@ "SmtpDomain": "Domain", "SmtpEnableSsl": "Ssl'i aktif et", "SmtpUseDefaultCredentials": "Varsayılan yetkilendirmeleri kullan", - "DefaultFromAddress": "Varsayılan gönderici görünen isim", - "DefaultFromDisplayName": "Varsayılan gönderici email adresi", + "DefaultFromAddress": "Varsayılan gönderici email adresi", + "DefaultFromDisplayName": "Varsayılan gönderici görünen isim", "Feature:SettingManagementGroup": "Ayar yönetimi", "Feature:SettingManagementEnable": "Ayar yönetimini etkinleştir", "Feature:SettingManagementEnableDescription": "Uygulamada ayar yönetim sistemini etkinleştirin.", From 0bd830e5635a24e706c26de09a5330d9a85960bd Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Wed, 29 Jun 2022 15:15:31 +0300 Subject: [PATCH 4/6] Docs: Fix concurrency exception --- .../Volo/Docs/Documents/DocumentAppService.cs | 3 +-- .../Volo/Docs/Documents/IDocumentRepository.cs | 1 + .../Volo/Docs/Documents/EFCoreDocumentRepository.cs | 4 ++-- .../Volo/Docs/Documents/MongoDocumentRepository.cs | 5 ++--- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs index 570c8590b0..228648f2fb 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs @@ -404,8 +404,7 @@ namespace Volo.Docs.Documents var sourceDocument = await source.GetDocumentAsync(project, documentName, languageCode, version, oldDocument?.LastSignificantUpdateTime); - await _documentRepository.DeleteAsync(project.Id, sourceDocument.Name, sourceDocument.LanguageCode, - sourceDocument.Version); + await _documentRepository.DeleteAsync(project.Id, sourceDocument.Name, sourceDocument.LanguageCode, sourceDocument.Version, autoSave: true); await _documentRepository.InsertAsync(sourceDocument, true); Logger.LogInformation($"Document retrieved: {documentName}"); diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentRepository.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentRepository.cs index 6b911c6e36..740d6921b3 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentRepository.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentRepository.cs @@ -23,6 +23,7 @@ namespace Volo.Docs.Documents string name, string languageCode, string version, + bool autoSave = false, CancellationToken cancellationToken = default); Task> GetListAsync( diff --git a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs index d1d78cc24a..7656975f16 100644 --- a/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs +++ b/modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs @@ -141,11 +141,11 @@ namespace Volo.Docs.Documents GetCancellationToken(cancellationToken)); } - public async Task DeleteAsync(Guid projectId, string name, string languageCode, string version, CancellationToken cancellationToken = default) + public async Task DeleteAsync(Guid projectId, string name, string languageCode, string version, bool autoSave = false, CancellationToken cancellationToken = default) { await DeleteAsync(x => x.ProjectId == projectId && x.Name == name && x.LanguageCode == languageCode && - x.Version == version, cancellationToken: cancellationToken); + x.Version == version, autoSave, cancellationToken: cancellationToken); } public async Task GetAsync(Guid id, CancellationToken cancellationToken = default) diff --git a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs index c812947388..0086624d43 100644 --- a/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs +++ b/modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs @@ -49,12 +49,11 @@ namespace Volo.Docs.Documents x.Version == version, GetCancellationToken(cancellationToken)); } - public async Task DeleteAsync(Guid projectId, string name, string languageCode, string version, - CancellationToken cancellationToken = default) + public async Task DeleteAsync(Guid projectId, string name, string languageCode, string version, bool autoSave = false, CancellationToken cancellationToken = default) { await DeleteAsync(x => x.ProjectId == projectId && x.Name == name && x.LanguageCode == languageCode && - x.Version == version, cancellationToken: cancellationToken); + x.Version == version, autoSave, cancellationToken: cancellationToken); } public async Task> GetListAsync(Guid? projectId, string version, string name, CancellationToken cancellationToken = default) From cd8b553d12ecb0e63baac6b0d959edd8e1698d84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 29 Jun 2022 22:22:38 +0300 Subject: [PATCH 5/6] Make SolutionRenamer public. --- .../Building/Steps/SolutionRenameStep.cs | 65 +------------------ .../Building/Steps/SolutionRenamer.cs | 63 ++++++++++++++++++ .../Cli/ProjectBuilding/Files/FileEntry.cs | 7 +- 3 files changed, 71 insertions(+), 64 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs index d584611186..0b8e115dfb 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenameStep.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using Volo.Abp.Cli.ProjectBuilding.Files; -using Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; +using Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; @@ -46,62 +43,4 @@ public class SolutionRenameStep : ProjectBuildPipelineStep ).Run(); } } - - private class SolutionRenamer - { - private readonly List _entries; - private readonly string _companyNamePlaceHolder; - private readonly string _projectNamePlaceHolder; - - private readonly string _companyName; - private readonly string _projectName; - - public SolutionRenamer(List entries, string companyNamePlaceHolder, string projectNamePlaceHolder, string companyName, string projectName) - { - if (string.IsNullOrWhiteSpace(companyName)) - { - companyName = null; - } - - if (companyNamePlaceHolder == null && companyName != null) - { - throw new UserFriendlyException($"Can not set {nameof(companyName)} if {nameof(companyNamePlaceHolder)} is null."); - } - - _entries = entries; - - _companyNamePlaceHolder = companyNamePlaceHolder; - _projectNamePlaceHolder = projectNamePlaceHolder ?? throw new ArgumentNullException(nameof(projectNamePlaceHolder)); - - _companyName = companyName; - _projectName = projectName ?? throw new ArgumentNullException(nameof(projectName)); - } - - public void Run() - { - if (_companyNamePlaceHolder != null) - { - if (_companyName != null) - { - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder, _companyName); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase(), _companyName.ToCamelCase()); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase(), _companyName.ToKebabCase()); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToLowerInvariant(), _companyName.ToLowerInvariant()); - } - else - { - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder + "." + _projectNamePlaceHolder, _projectNamePlaceHolder); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase() + "." + _projectNamePlaceHolder.ToCamelCase(), _projectNamePlaceHolder.ToCamelCase()); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToLowerInvariant() + "." + _projectNamePlaceHolder.ToLowerInvariant(), _projectNamePlaceHolder.ToLowerInvariant()); - RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase() + "/" + _projectNamePlaceHolder.ToKebabCase(), _projectNamePlaceHolder.ToKebabCase()); - } - } - - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder, _projectName); - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToCamelCase(), _projectName.ToCamelCase()); - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToKebabCase(), _projectName.ToKebabCase()); - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToLowerInvariant(), _projectName.ToLowerInvariant()); - RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToSnakeCase().ToUpper(), _projectName.ToSnakeCase().ToUpper()); - } - } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs new file mode 100644 index 0000000000..36006ecd18 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SolutionRenamer.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.Cli.ProjectBuilding.Files; + +namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; + +public class SolutionRenamer +{ + private readonly List _entries; + private readonly string _companyNamePlaceHolder; + private readonly string _projectNamePlaceHolder; + + private readonly string _companyName; + private readonly string _projectName; + + public SolutionRenamer(List entries, string companyNamePlaceHolder, string projectNamePlaceHolder, string companyName, string projectName) + { + if (string.IsNullOrWhiteSpace(companyName)) + { + companyName = null; + } + + if (companyNamePlaceHolder == null && companyName != null) + { + throw new UserFriendlyException($"Can not set {nameof(companyName)} if {nameof(companyNamePlaceHolder)} is null."); + } + + _entries = entries; + + _companyNamePlaceHolder = companyNamePlaceHolder; + _projectNamePlaceHolder = projectNamePlaceHolder ?? throw new ArgumentNullException(nameof(projectNamePlaceHolder)); + + _companyName = companyName; + _projectName = projectName ?? throw new ArgumentNullException(nameof(projectName)); + } + + public void Run() + { + if (_companyNamePlaceHolder != null) + { + if (_companyName != null) + { + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder, _companyName); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase(), _companyName.ToCamelCase()); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase(), _companyName.ToKebabCase()); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToLowerInvariant(), _companyName.ToLowerInvariant()); + } + else + { + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder + "." + _projectNamePlaceHolder, _projectNamePlaceHolder); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToCamelCase() + "." + _projectNamePlaceHolder.ToCamelCase(), _projectNamePlaceHolder.ToCamelCase()); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToLowerInvariant() + "." + _projectNamePlaceHolder.ToLowerInvariant(), _projectNamePlaceHolder.ToLowerInvariant()); + RenameHelper.RenameAll(_entries, _companyNamePlaceHolder.ToKebabCase() + "/" + _projectNamePlaceHolder.ToKebabCase(), _projectNamePlaceHolder.ToKebabCase()); + } + } + + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder, _projectName); + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToCamelCase(), _projectName.ToCamelCase()); + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToKebabCase(), _projectName.ToKebabCase()); + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToLowerInvariant(), _projectName.ToLowerInvariant()); + RenameHelper.RenameAll(_entries, _projectNamePlaceHolder.ToSnakeCase().ToUpper(), _projectName.ToSnakeCase().ToUpper()); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs index 799c2e2755..c634f09fa8 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs @@ -33,10 +33,15 @@ public class FileEntry IsDirectory = isDirectory; Encoding = CalculateEncoding(); - Content = Encoding.GetString(bytes); + Content = GetContent(); IsBinaryFile = CalculateIsBinaryFile(); } + private string GetContent() + { + return Bytes == null ? null : Encoding.GetString(Bytes); + } + public void SetContent(string fileContent) { Content = fileContent; From eef2e295fc7ca29be65213a95b23da4b2b2dd753 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 30 Jun 2022 10:30:03 +0800 Subject: [PATCH 6/6] Enhance MongoDbRepository --- .../Repositories/MongoDB/IMongoDbRepository.cs | 4 ++-- .../Repositories/MongoDB/MongoDbRepository.cs | 16 ++++++++-------- .../MongoDbCoreRepositoryExtensions.cs | 8 ++++---- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs index a0cd792b21..eeac0dc2e2 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepository.cs @@ -23,9 +23,9 @@ public interface IMongoDbRepository : IRepository [Obsolete("Use GetMongoQueryableAsync method.")] IMongoQueryable GetMongoQueryable(); - Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default); + Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default, AggregateOptions options = null); - Task> GetAggregateAsync(CancellationToken cancellationToken = default); + Task> GetAggregateAsync(CancellationToken cancellationToken = default, AggregateOptions options = null); } public interface IMongoDbRepository : IMongoDbRepository, IRepository diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index 102564f8c9..0485dd74bc 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -518,12 +518,12 @@ public class MongoDbRepository ); } - public virtual Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default) + public virtual Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default, AggregateOptions aggregateOptions = null) { - return GetMongoQueryableAsync(cancellationToken); + return GetMongoQueryableAsync(cancellationToken, aggregateOptions); } - protected virtual async Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default) + protected virtual async Task> GetMongoQueryableAsync(CancellationToken cancellationToken = default, AggregateOptions aggregateOptions = null) { cancellationToken = GetCancellationToken(cancellationToken); @@ -532,12 +532,12 @@ public class MongoDbRepository return ApplyDataFilters, TOtherEntity>( dbContext.SessionHandle != null - ? collection.AsQueryable(dbContext.SessionHandle) - : collection.AsQueryable() + ? collection.AsQueryable(dbContext.SessionHandle, aggregateOptions) + : collection.AsQueryable(aggregateOptions) ); } - public virtual async Task> GetAggregateAsync(CancellationToken cancellationToken = default) + public virtual async Task> GetAggregateAsync(CancellationToken cancellationToken = default, AggregateOptions aggregateOptions = null) { cancellationToken = GetCancellationToken(cancellationToken); @@ -545,8 +545,8 @@ public class MongoDbRepository var collection = await GetCollectionAsync(cancellationToken); var aggregate = dbContext.SessionHandle != null - ? collection.Aggregate(dbContext.SessionHandle) - : collection.Aggregate(); + ? collection.Aggregate(dbContext.SessionHandle, aggregateOptions) + : collection.Aggregate(aggregateOptions); if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) && DataFilter.IsEnabled()) { diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs index 6a59640c70..c71c3e991d 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDbCoreRepositoryExtensions.cs @@ -43,16 +43,16 @@ public static class MongoDbCoreRepositoryExtensions return repository.ToMongoDbRepository().GetMongoQueryable(); } - public static Task> GetMongoQueryableAsync(this IReadOnlyBasicRepository repository, CancellationToken cancellationToken = default) + public static Task> GetMongoQueryableAsync(this IReadOnlyBasicRepository repository, CancellationToken cancellationToken = default, AggregateOptions aggregateOptions = null) where TEntity : class, IEntity { - return repository.ToMongoDbRepository().GetMongoQueryableAsync(cancellationToken); + return repository.ToMongoDbRepository().GetMongoQueryableAsync(cancellationToken, aggregateOptions); } - public static Task> GetAggregateAsync(this IReadOnlyBasicRepository repository, CancellationToken cancellationToken = default) + public static Task> GetAggregateAsync(this IReadOnlyBasicRepository repository, CancellationToken cancellationToken = default, AggregateOptions aggregateOptions = null) where TEntity : class, IEntity { - return repository.ToMongoDbRepository().GetAggregateAsync(cancellationToken); + return repository.ToMongoDbRepository().GetAggregateAsync(cancellationToken, aggregateOptions); } public static IMongoDbRepository ToMongoDbRepository(this IReadOnlyBasicRepository repository)