Browse Source

Merge branch 'dev' into AppUrlProvider

pull/18492/head
maliming 2 years ago
parent
commit
2cbd84ade8
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 1
      Directory.Packages.props
  2. 14
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/zh-Hans.json
  3. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
  4. 650
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json
  5. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json
  6. 230
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json
  7. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/zh-Hans.json
  8. 1481
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
  9. 672
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json
  10. 362
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json
  11. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/zh-Hans.json
  12. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hans.json
  13. 550
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json
  14. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hant.json
  15. 10
      docs/en/CLI.md
  16. 6
      docs/en/UI/AspNetCore/Tag-Helpers/Form-elements.md
  17. 13
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs
  18. 12
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs
  19. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOptions.cs
  20. 20
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs
  21. 13
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/IAbpDatePickerOptions.cs
  22. 22
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hans.json
  23. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs
  24. 562
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js
  25. 711
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js
  26. 12
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/zh-Hans.json
  27. 2
      framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj
  28. 4
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs
  29. 7
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  30. 42
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs
  31. 304
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/TranslateCommand.cs
  32. 4
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs
  33. 29
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs
  34. 4
      framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/zh-Hans.json
  35. 40
      framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/ExceptionHandling/Localization/zh-Hans.json
  36. 2
      framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/zh-Hans.json
  37. 4
      framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/Localization/zh-Hans.json
  38. 2
      framework/src/Volo.Abp.Ldap.Abstractions/Volo/Abp/Ldap/Localization/zh-Hans.json
  39. 2
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/zh-Hans.json
  40. 10
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/Localization/zh-Hans.json
  41. 4
      framework/src/Volo.Abp.Timing/Volo/Abp/Timing/Localization/zh-Hans.json
  42. 2
      framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/zh-Hans.json
  43. 10
      framework/test/Volo.Abp.Authorization.Tests/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions_Tests.cs
  44. 2
      framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/AbpGlobalFeatureNotEnableException_Localization_Test.cs
  45. 88
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json
  46. 19
      modules/account/src/Volo.Abp.Account.Web/Pages/Account/AccountPageModel.cs
  47. 4
      modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs
  48. 72
      modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json
  49. 2
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/Localization/zh-Hans.json
  50. 16
      modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/zh-Hans.json
  51. 238
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hans.json
  52. 8
      modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/zh-Hans.json
  53. 50
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/zh-Hans.json
  54. 14
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/zh-Hans.json
  55. 112
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json
  56. 125
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs
  57. 84
      modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs
  58. 4
      modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/LocalizationExtensions/zh-Hans.json
  59. 14
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hans.json
  60. 16
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/zh-Hans.json
  61. 4
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hans.json
  62. 10
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json
  63. 4
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hans.json
  64. 20
      modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/zh-Hans.json
  65. 4
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Localization/MyProjectName/zh-Hans.json
  66. 4
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Localization/MyProjectName/zh-Hans.json
  67. 4
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Shared/Localization/MyProjectName/zh-Hans.json
  68. 4
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Localization/MyProjectName/zh-Hans.json
  69. 4
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Localization/MyProjectName/zh-Hans.json
  70. 4
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Localization/MyProjectName/zh-Hans.json
  71. 4
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Localization/MyProjectName/zh-Hans.json
  72. 14
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/zh-Hans.json
  73. 2
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/zh-Hans.json

1
Directory.Packages.props

@ -30,6 +30,7 @@
<PackageVersion Include="Devart.Data.Oracle.EFCore" Version="10.1.151.7" />
<PackageVersion Include="DistributedLock.Core" Version="1.0.5" />
<PackageVersion Include="DistributedLock.Redis" Version="1.0.2" />
<PackageVersion Include="DeepL.net" Version="1.8.0" />
<PackageVersion Include="EphemeralMongo.Core" Version="1.1.3" />
<PackageVersion Include="EphemeralMongo6.runtime.linux-x64" Version="1.1.3" />
<PackageVersion Include="EphemeralMongo6.runtime.osx-x64" Version="1.1.3" />

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

@ -1,16 +1,16 @@
{
"culture": "zh-Hans",
"texts": {
"Account": "账户",
"Account": "ABP 账户 - 登录和注册 | ABP.IO",
"Welcome": "欢迎",
"UseOneOfTheFollowingLinksToContinue": "使用下面的链接继续",
"FrameworkHomePage": "框架页",
"UseOneOfTheFollowingLinksToContinue": "使用下链接之一继续",
"FrameworkHomePage": "框架页",
"FrameworkDocumentation": "框架文档",
"OfficialBlog": "官方博客",
"CommercialHomePage": "商业版首页",
"CommercialSupportWebSite": "商业支持网站",
"CommunityWebSite": "ABP社区网站",
"ManageAccount": "我的户 | ABP.IO",
"CommercialHomePage": "商业页",
"CommercialSupportWebSite": "商业支持网站",
"CommunityWebSite": "ABP 社区网站",
"ManageAccount": "我的户 | ABP.IO",
"ManageYourProfile": "管理您的个人资料",
"ReturnToApplication": "返回应用"
}

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

@ -562,6 +562,8 @@
"SponsorLogo": "Sponsor Logo",
"RegistrationUrl": "Registration Url",
"AllowAbpStudioBetaAccess": "Allow ABP Studio Beta Access",
"TotalQuestionCanNotBeNullMessage": "Total Question can not be null"
"TotalQuestionCanNotBeNullMessage": "Total Question can not be null",
"Permission:EditWinners": "Edit Winners",
"Permission:ChangeDrawingStatus": "Change Drawing Status"
}
}

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

@ -1,16 +1,16 @@
{
"culture": "zh-Hans",
"texts": {
"Permission:Organizations": "组织",
"Permission:Organizations": "组织机构",
"Permission:Manage": "管理组织",
"Permission:DiscountRequests": "折扣请",
"Permission:DiscountManage": "管理折扣请",
"Permission:DiscountRequests": "折扣请",
"Permission:DiscountManage": "管理折扣请",
"Permission:Disable": "禁用",
"Permission:Enable": "启",
"Permission:EnableSendEmail": "启用发送邮件",
"Permission:SendEmail": "发送邮件",
"Permission:NpmPackages": "NPM包",
"Permission:NugetPackages": "Nuget包",
"Permission:Enable": "启",
"Permission:EnableSendEmail": "启用发送电子邮件",
"Permission:SendEmail": "发送电子邮件",
"Permission:NpmPackages": "NPM 包",
"Permission:NugetPackages": "Nuget 包",
"Permission:Maintenance": "维护",
"Permission:Maintain": "维护",
"Permission:ClearCaches": "清除缓存",
@ -22,27 +22,27 @@
"Permission:Accounting": "账单",
"Permission:Accounting:Quotation": "报价",
"Permission:Accounting:Invoice": "发票",
"Menu:Organizations": "组织",
"Menu:Organizations": "组织机构",
"Menu:Accounting": "账单",
"Menu:Packages": "包",
"Menu:DiscountRequests": "折扣请",
"NpmPackageDeletionWarningMessage": "该NPM包将会被删除. 你确定吗?",
"NugetPackageDeletionWarningMessage": "该Nuget包将会被删除. 你确定吗?",
"ModuleDeletionWarningMessage": "该模块将会被删除. 你确定吗?",
"Menu:DiscountRequests": "折扣请",
"NpmPackageDeletionWarningMessage": "此 NPM 包将被删除。你确认吗?",
"NugetPackageDeletionWarningMessage": "此 Nuget 包将被删除。你确认吗?",
"ModuleDeletionWarningMessage": "本模块将被删除。您确认吗?",
"Name": "名称",
"DisplayName": "显示名称",
"ShortDescription": "简",
"ShortDescription": "简要说明",
"NameFilter": "名称",
"CreationTime": "创建时间",
"IsPro": "是否为专业版",
"IsFreeToActiveLicenseOwners": "许可证所有者免费",
"ShowOnModuleList": "展示模块列表",
"EfCoreConfigureMethodName": "配置方法",
"IsFreeToActiveLicenseOwners": "免费提供给许可证所有者",
"ShowOnModuleList": "显示在模块列表中",
"EfCoreConfigureMethodName": "配置方法名称",
"IsProFilter": "是否为专业版",
"ApplicationType": "应用程序类型",
"ApplicationType": "应用类型",
"Target": "目标",
"TargetFilter": "目标",
"ModuleClass": "模块类",
"ModuleClass": "模块类",
"NugetPackageTarget.DomainShared": "Domain Shared",
"NugetPackageTarget.Domain": "Domain",
"NugetPackageTarget.Application": "Application",
@ -55,260 +55,260 @@
"Edit": "编辑",
"Delete": "删除",
"Refresh": "刷新",
"NpmPackages": "NPM包",
"NugetPackages": "Nuget包",
"NpmPackageCount": "NPM包数量",
"NugetPackageCount": "Nuget包数量",
"NpmPackages": "NPM 包",
"NugetPackages": "Nuget 包",
"NpmPackageCount": "NPM 包数量",
"NugetPackageCount": "Nuget 包数量",
"Module": "模块",
"ModuleInfo": "模块信息",
"CreateANpmPackage": "创建NPM包",
"CreateANpmPackage": "创建 NPM 包",
"CreateAModule": "创建模块",
"CreateANugetPackage": "创建Nuget包",
"AddNew": "新建",
"PackageAlreadyExist{0}": "\"{0}\"已经被添加.",
"ModuleAlreadyExist{0}": "\"{0}\" 模块已经添加.",
"CreateANugetPackage": "创建 Nuget 包",
"AddNew": "添加新内容",
"PackageAlreadyExist{0}": "已添加\"{0}\"包。",
"ModuleAlreadyExist{0}": "已添加\"{0}\"模块。",
"ClearCache": "清除缓存",
"SuccessfullyCleared": "清除成功",
"Menu:NpmPackages": "NPM包",
"SuccessfullyCleared": "成功清除",
"Menu:NpmPackages": "NPM 包",
"Menu:Modules": "模块",
"Menu:Maintenance": "维护",
"Menu:NugetPackages": "Nuget包",
"CreateAnOrganization": "创建组织",
"Organizations": "组织",
"Menu:NugetPackages": "Nuget 包",
"CreateAnOrganization": "创建组织",
"Organizations": "组织机构",
"LongName": "完整名称",
"LicenseType": "授权类型",
"MissingLicenseTypeField": "许可证类型字段是必需的!",
"LicenseStartTime": "授权开始时间",
"LicenseEndTime": "授权结束时间",
"LicenseType": "许可证类型",
"MissingLicenseTypeField": "许可证类型字段为必填字段!",
"LicenseStartTime": "许可证开始时间",
"LicenseEndTime": "许可证结束时间",
"AllowedDeveloperCount": "允许的开发人员数量",
"UserNameOrEmailAddress": "用户名或电子邮件地址",
"AddOwner": "添加所有者",
"UserName": "用户名",
"Email": "电子邮件地址",
"Developers": "开发",
"AddDeveloper": "添加开发",
"Email": "电子邮件",
"Developers": "开发人员",
"AddDeveloper": "添加开发人员",
"Create": "创建",
"UserNotFound": "用户不存在",
"{0}WillBeRemovedFromDevelopers": "{0} 将从开发者中移除, 你确定吗?",
"{0}WillBeRemovedFromOwners": "{0} 将从所有者中移除, 你确定吗?",
"{0}WillBeRemovedFromMembers": "{0} 将从成员中删除, 你确定吗?",
"UserNotFound": "未找到用户",
"{0}WillBeRemovedFromDevelopers": "{0}将从开发人员中删除,您确认吗?",
"{0}WillBeRemovedFromOwners": "{0}将从所有者中删除,你确认吗?",
"{0}WillBeRemovedFromMembers": "{0}将从成员中删除,您确认吗?",
"Computers": "计算机",
"UniqueComputerId": "计算机唯一ID",
"LastSeenDate": "上次查看日期",
"UniqueComputerId": "唯一的计算机 ID",
"LastSeenDate": "最后出现日期",
"{0}Computer{1}WillBeRemovedFromRecords": "计算机 {0} ({1}) 将从记录中删除",
"OrganizationDeletionWarningMessage": "组织将被删除",
"DeletingLastOwnerWarningMessage": "一个组织必须至少有一个所有者!因此你不能删除此所有者",
"This{0}AlreadyExistInThisOrganization": "该组织中已经存在此 {0}",
"DeletingLastOwnerWarningMessage": "一个组织必须至少有一个所有者!因此,您不能删除该所有者",
"This{0}AlreadyExistInThisOrganization": "该{0}已经存在于该组织中",
"AreYouSureYouWantToDeleteAllComputers": "您确定要删除所有计算机吗?",
"DeleteAll": "删除所有",
"DoYouWantToCreateNewUser": "你想要创建一个新用户吗",
"DeleteAll": "全部删除",
"DoYouWantToCreateNewUser": "您想创建新用户吗?",
"MasterModules": "主模块",
"OrganizationName": "组织名称",
"CreationDate": "创建时间",
"LicenseStartDate": "许可开始时间",
"LicenseEndDate": "许可结束时间",
"CreationDate": "创建日期",
"LicenseStartDate": "许可证开始日期",
"LicenseEndDate": "许可证终止日期",
"OrganizationNamePlaceholder": "组织名称...",
"TotalQuestionCountPlaceholder": "问题总数...",
"RemainingQuestionCountPlaceholder": "剩下的问题数...",
"LicenseTypePlaceholder": "许可类型...",
"CreationDatePlaceholder": "创建时间...",
"LicenseStartDatePlaceholder": "许可开始时间...",
"LicenseEndDatePlaceholder": "许可结束时间...",
"UsernameOrEmail": "用户名或邮箱",
"UsernameOrEmailPlaceholder": "用户名或邮箱...",
"RemainingQuestionCountPlaceholder": "剩问题数...",
"LicenseTypePlaceholder": "许可类型...",
"CreationDatePlaceholder": "创建日期...",
"LicenseStartDatePlaceholder": "许可证开始日期...",
"LicenseEndDatePlaceholder": "许可证终止日期...",
"UsernameOrEmail": "用户名或电子邮件",
"UsernameOrEmailPlaceholder": "用户名或电子邮件...",
"Member": "成员",
"PurchaseOrderNo": "订单编号",
"PurchaseOrderNo": "订单编号",
"QuotationDate": "报价日期",
"CompanyName": "公司名称",
"CompanyAddress": "公司地址",
"Price": "价格",
"DiscountText": "折扣文",
"DiscountText": "折扣文",
"DiscountQuantity": "折扣数量",
"DiscountPrice": "折扣价",
"Quotation": "报价",
"ExtraText": "额外文字",
"DiscountPrice": "折扣价",
"Quotation": "报价",
"ExtraText": "附加文本",
"ExtraAmount": "额外金额",
"DownloadQuotation": "下载报价单",
"Invoice": "发票",
"TaxNumber": "税号",
"InvoiceNumber": "发票数字",
"InvoiceNumber": "发票号码",
"InvoiceDate": "发票日期",
"InvoiceNote": "发票说明",
"InvoiceNote": "发票附注",
"Quantity": "数量",
"AddProduct": "添加产品",
"AddProductWarning": "你需要添加产品",
"AddProductWarning": "您需要添加产品!",
"TotalPrice": "总价",
"Generate": "生成",
"MissingQuantityField": "数量字段为必填项!",
"MissingPriceField": "价格字段为必填项!",
"MissingQuantityField": "数量字段为必填字段!",
"MissingPriceField": "价格字段为必填字段!",
"CodeUsageStatus": "状态",
"Country": "国家",
"DeveloperCount": "开发数量",
"RequestCode": "请求码",
"DeveloperCount": "开发人员数量",
"RequestCode": "申请代码",
"WebSite": "网站",
"GithubUsername": "Github用户名",
"PhoneNumber": "手机号",
"ProjectDescription": "产品描述",
"GithubUsername": "Github 用户名",
"PhoneNumber": "电话号码",
"ProjectDescription": "项目说明",
"Referrer": "推荐人",
"DiscountRequests": "折扣请",
"Copylink": "拷贝链接",
"DiscountRequests": "折扣请",
"Copylink": "复制链接",
"Disable": "禁用",
"Enable": "启用",
"EnableSendEmail": "启用发送邮件",
"SendEmail": "发送邮件",
"SuccessfullyDisabled": "禁用成功",
"SuccessfullyEnabled": "启用成功",
"EmailSent": "邮件发送",
"SuccessfullySent": "发送成功",
"SuccessfullyDeleted": "删除成功",
"DiscountRequestDeletionWarningMessage": "折扣成功将被删除",
"BusinessType": "业类型",
"EnableSendEmail": "启用发送电子邮件",
"SendEmail": "发送电子邮件",
"SuccessfullyDisabled": "成功禁用",
"SuccessfullyEnabled": "成功启用",
"EmailSent": "发送电子邮件",
"SuccessfullySent": "成功发送",
"SuccessfullyDeleted": "成功删除",
"DiscountRequestDeletionWarningMessage": "折扣申请将被删除",
"BusinessType": "业类型",
"TotalQuestionCount": "问题总数",
"RemainingQuestionCount": "剩余问题数",
"TotalQuestionMustBeGreaterWarningMessage": "TotalQuestionCount必须大于RemainingQuestionCount!",
"QuestionCountsMustBeGreaterThanZero": "TotalQuestionCount和RemainingQuestionCount必须为0或大于0",
"UnlimitedQuestionCount": "无限的问题数",
"Notes": "笔记",
"TotalQuestionMustBeGreaterWarningMessage": "TotalQuestionCount 必须大于 RemainingQuestionCount!",
"QuestionCountsMustBeGreaterThanZero": "总问题数(TotalQuestionCount)和剩余问题数(RemainingQuestionCount)必须为零或大于零!",
"UnlimitedQuestionCount": "问题数量不限",
"Notes": "说明",
"Menu:Community": "社区",
"Menu:Posts": "文章",
"Wait": "等待",
"Approve": "批准",
"Reject": "拒绝",
"Details": "详",
"Url": "Url",
"Details": "详细信息",
"Url": "网址",
"Title": "标题",
"ContentSource": "内容源",
"ContentSource": "内容源",
"Status": "状态",
"ReadPost": "阅读文章",
"PostHasBeenWaiting": "文章在等待",
"PostHasBeenApproved": "文章已批准",
"PostHasBeenRejected": "文章已被拒绝",
"PostHasBeenWaiting": "文章一直在等待",
"PostHasBeenApproved": "文章已批准",
"PostHasBeenRejected": "帖子已被拒绝",
"Permission:Community": "社区",
"Permission:CommunityPost": "文",
"Permission:CommunityPost": "文",
"Link": "链接",
"Enum:ContentSource:0": "Github",
"Enum:ContentSource:1": "外部",
"Enum:Status:0": "等待",
"Enum:Status:1": "拒绝",
"Enum:Status:2": "批准",
"Summary": "要",
"AuthorName": "作者名",
"Enum:Status:0": "等待",
"Enum:Status:1": "拒绝",
"Enum:Status:2": "批准",
"Summary": "要",
"AuthorName": "作者名",
"CoverImage": "封面图片",
"RemoveCacheConfirmationMessage": "你确定要删除\"{0}\" 文章缓存?",
"SuccessfullyRemoved": "清除成功",
"RemoveCacheConfirmationMessage": "您确定删除了\"{0}\"文章的缓存吗?",
"SuccessfullyRemoved": "成功清除",
"RemoveCache": "删除缓存",
"Language": "语言",
"Optional": "可选",
"CreatePostLanguageInfo": "帖所用的语言",
"Enum:ContentSource:2": "视频发布",
"Optional": "可选",
"CreatePostLanguageInfo": "帖使用的语言",
"Enum:ContentSource:2": "视频",
"VideoPreview": "视频预览",
"VideoPreviewErrorMessage": "无法从YouTube获取给定的视频网址. 可能是由于视频是私有视频,或者给定的URL不可用.",
"VideoPreviewErrorMessage": "无法从 Youtube 获取给定的视频 URL。造成这种情况的原因可能是视频为私人视频或给定的 URL 不可用。",
"DeleteCoverImage": "删除封面图片",
"DeleteCoverImageConfirmationMessage": "你确定要删除封面图片吗",
"DeleteCoverImageSuccessMessage": "成功删除封面图片",
"PaymentsOf": "付款的",
"ShowPaymentsOfOrganization": "显示付款",
"DeleteCoverImageConfirmationMessage": "您确定要删除\"{0}\"的封面图像吗?",
"DeleteCoverImageSuccessMessage": "封面图像已成功删除",
"PaymentsOf": "付",
"ShowPaymentsOfOrganization": "付款",
"Date": "日期",
"Products": "品",
"Products": "品",
"TotalAmount": "总金额",
"Currency": "货币",
"Gateway": "网关",
"State": "状态",
"FailReason": "失败原因",
"ReIndexAllPosts": "重新索引所有帖子",
"ReIndexAllPostsConfirmationMessage": "你确定要重新索引所有的帖子吗",
"SuccessfullyReIndexAllPosts": "成功索引所有帖子",
"ReIndexAllPostsConfirmationMessage": "您确定要重新索引所有帖子吗?",
"SuccessfullyReIndexAllPosts": "所有帖子都已成功重新索引。",
"Permission:FullSearch": "全文检索",
"Menu:CliAnalytics": "客户端分析",
"Menu:Reports": "报",
"Menu:CliAnalytics": "Cli 分析",
"Menu:Reports": "报",
"TemplateName": "模板名称",
"TemplateVersion": "模板版本",
"DatabaseProvider": "数据库提供者",
"IsTiered": "是分层",
"ProjectName": "项目名",
"IsTiered": "是分层",
"ProjectName": "项目名",
"Username": "用户名",
"Tool": "工具",
"Command": "命令",
"UiFramework": "界面框架",
"UiFramework": "UI框架",
"Options": "选项",
"CliAnalytics": "客户端分析",
"Reports": "报",
"Permission:CliAnalyticses": "客户端分析",
"Permission:CliAnalytics": "客户端分析",
"Permission:Reports": "报",
"CliAnalytics": "Cli 分析",
"Reports": "报",
"Permission:CliAnalyticses": "Cli Analyticses",
"Permission:CliAnalytics": "Cli 分析",
"Permission:Reports": "报",
"Search": "搜索",
"ClearFilter": "清除过滤",
"LicensePrivateKey": "许可私有密钥",
"LicensePublicKey": "许可公有密钥",
"ApiKey": "NuGet API密钥",
"ShowInvoiceRequestsOfOrganization": "发票请",
"ClearFilter": "清除过滤",
"LicensePrivateKey": "许可私钥",
"LicensePublicKey": "许可公钥",
"ApiKey": "NuGet API 密钥",
"ShowInvoiceRequestsOfOrganization": "发票请",
"ShowQuestionsOfOrganization": "问题",
"Question": "问题",
"Open": "开",
"Open": "开",
"Questions": "问题",
"InvoiceRequests": "发票请",
"InvoiceRequests": "发票请",
"Address": "地址",
"TaxNo": "税号",
"Permission:InvoiceRequest": "发票请",
"Permission:InvoiceRequest": "发票请",
"Permission:Question": "问题",
"AddNoteSuccessMessage": "注释添加成功",
"NameSurname": "姓",
"Note": "注",
"AddNoteSuccessMessage": "成功添加注释",
"NameSurname": "姓",
"Note": "注",
"Add": "添加",
"ProjectDownloads": "项目下载",
"ShowProjectDownloadsOfOrganization": "项目下载",
"ShowAuditLogsOfOrganization": "审日志",
"Enum:EntityChangeType:0": "已建立",
"Enum:EntityChangeType:1": "更新",
"ShowAuditLogsOfOrganization": "审日志",
"Enum:EntityChangeType:0": "创建",
"Enum:EntityChangeType:1": "更新",
"Enum:EntityChangeType:2": "已删除",
"TenantId": "租户ID",
"ChangeTime": "更时间",
"TenantId": "租户编号",
"ChangeTime": "更时间",
"EntityTypeFullName": "实体类型全名",
"AuditLogsFor{0}Organization": "\"{0}\" 组织的审核日志",
"AuditLogsFor{0}Organization": "{0}\"组织的审计日志",
"Permission:EntityChange": "实体变更",
"Permission:ProjectDownload": "项目下载",
"Permission:PaymentRequest": "付请",
"CreatorEmailAddress": "创作者的电子邮件地址",
"Permission:PaymentRequest": "付款申请",
"CreatorEmailAddress": "创建者电子邮件地址",
"EmailSendDate": "电子邮件发送日期",
"PaymentRequestsFor{0}Organization": "\"{0}\" 组织的付款请",
"PaymentRequestsFor{0}Organization": "{0}\"组织的付款请",
"PaymentDetails": "付款详情",
"PaymentProduct": "付款产品",
"ProductName": "产品名称",
"Code": "代码",
"GenerateInvoice": "生成发票",
"ExportOrganizationsToExcel": "将组织导出到Excel",
"ThisExtensionIsNotAllowed": "不允许此扩展名.",
"TheFileIsTooLarge": "文件过大.",
"PostDeletionConfirmationMessage": "您确定要硬删除这篇文章吗?",
"ChooseCoverImage": "选项一张封面图片",
"Menu:Quotation": "引述",
"ExportOrganizationsToExcel": "导出到 Excel",
"ThisExtensionIsNotAllowed": "不允许延期。",
"TheFileIsTooLarge": "文件太大!",
"PostDeletionConfirmationMessage": "你确定要硬删掉这个帖子吗?",
"ChooseCoverImage": "选择封面图片...",
"Menu:Quotation": "报价",
"Menu:Invoice": "发票",
"Menu:PaymentRequests": "付款请",
"Permission:PaymentRequests": "付款请",
"PaymentRequests": "付款请",
"Creator": "创者",
"Menu:PaymentRequests": "付款请",
"Permission:PaymentRequests": "付款请",
"PaymentRequests": "付款请",
"Creator": "创者",
"ExtraProperties": "额外属性",
"Organization": "组织",
"Organization": "组织结构",
"Waiting": "等待",
"Completed": "完全的",
"Failed": "失败",
"PaymentRequestDeletionWarningMessage": "此付款请求将被删除。你确认吗?",
"Payment": "付",
"Completed": "已完成",
"Failed": "失败",
"PaymentRequestDeletionWarningMessage": "此付款申请将被删除。您确认吗?",
"Payment": "付款方式",
"AddPayment": "添加付款",
"Enum:PurchaseType:1": "新执照",
"Enum:PurchaseType:2": "许可证延长",
"Enum:PurchaseType:1": "新许可证",
"Enum:PurchaseType:2": "许可证扩展",
"Enum:PurchaseType:3": "许可证升级",
"Enum:PurchaseType:4": "附加开发人员",
"Enum:PurchaseType:4": "其他开发人员",
"LicenceType": "许可证类型",
"PurchaseType": "购买类型",
"ReceiptNo": "收据号",
"ReceiptNo": "收据号",
"PaymentTime": "付款时间",
"ProductPrice": "产品价格",
"AdditionalDeveloper": "附加开发人员",
"ThisPaymentHasBeenAlreadyUsed": "此付款已被使用",
"AdditionalDeveloper": "其他开发人员",
"ThisPaymentHasBeenAlreadyUsed": "该款项已被使用",
"PaymentTimeCannotBeFutureTime": "付款时间不能是未来时间!",
"SaveAndDownload": "保存下载",
"BillingInfo": "计费信息",
"SaveAndDownload": "保存下载",
"BillingInfo": "账单信息",
"DeleteInvoice": "删除发票",
"PaymentStateSetTo": "付款状态设置为 {0}",
"ChangeState": "更改状态",
@ -316,248 +316,248 @@
"Menu:TrialLicenses": "试用许可证",
"TrialLicenses": "试用许可证",
"UserNameFilter": "用户名",
"TrialLicenseStatusFilter": "地位",
"TrialLicenseStatusFilter": "状态",
"TrialLicenseStartDateFilter": "开始日期",
"TrialLicenseEndDateFilter": "结束日期",
"FirstName": "名",
"LastName": "姓",
"FirstName": "名",
"LastName": "姓",
"StartDate": "开始日期",
"EndDate": "结束日期",
"PurchasedDate": "购买日期",
"OrganizationDetail": "组织详情",
"OrganizationDetail": "机构详情",
"TrialLicenseStatus": "试用许可证状态",
"TrialLicenseDetail": "试用许可证详情",
"AcceptsMarketingCommunications": "营销传播",
"PurposeOfUsage": "使用目的",
"CountryName": "国家的名字",
"CountryName": "国家名称",
"CompanySize": "公司规模",
"DetailTrialLicense": "细节",
"Requested": "已请求",
"Activated": "活",
"DetailTrialLicense": "详细信息",
"Requested": "求",
"Activated": "已激活",
"PurchasedToNormalLicense": "已购买",
"Expired": "已期",
"TrialLicenseDeletionWarningMessage": "您确定要删除试用许可证吗?试用许可证、组织、支持帐户将被删除!",
"LicenseCategoryFilter": "执照类别",
"Permission:SendWelcomeEmail": "发送欢迎邮件",
"SendWelcomeEmail": "发送欢迎邮件",
"SendWelcomeEmailWarningMessage": "你确定要发送欢迎邮件给组织成员吗?",
"SendWelcomeEmailSuccessMessage": "欢迎邮件发送成功!",
"Expired": "已期",
"TrialLicenseDeletionWarningMessage": "您确定要删除试用许可证吗?试用版许可证、组织和支持账户将被删除!",
"LicenseCategoryFilter": "许可证类别",
"Permission:SendWelcomeEmail": "发送欢迎电子邮件",
"SendWelcomeEmail": "发送欢迎电子邮件",
"SendWelcomeEmailWarningMessage": "您确定要向组织成员发送欢迎电子邮件吗?",
"SendWelcomeEmailSuccessMessage": "欢迎电子邮件已成功发送!",
"Activate": "激活",
"ActivateTrialLicenseWarningMessage": "激活试用版权限后,将发送欢迎邮件给用户。你确定要激活吗?",
"ActivateTrialLicenseSuccessMessage": "激活成功,欢迎邮件已发送给组织成员。",
"PaymentRequestId": "付款请编号",
"AdditionalDeveloperCount": "额外开发者数量",
"LicensePrice": "版权价格",
"ActivateTrialLicenseWarningMessage": "激活试用许可证时,将向用户发送一封欢迎电子邮件。您要激活吗?",
"ActivateTrialLicenseSuccessMessage": "已成功激活,并向组织成员发送了欢迎电子邮件。",
"PaymentRequestId": "付款请编号",
"AdditionalDeveloperCount": "额外的开发人员数量",
"LicensePrice": "许可证价格",
"PurchaseDate": "购买日期",
"IsAbpBookDownloaded": "ABP书已下载",
"IsMasteringAbpBookDownloadEnabled": "ABP书下载已启用",
"IsAbpBookDownloaded": "掌握ABP书已下载",
"IsMasteringAbpBookDownloadEnabled": "已启用 ABP书下载",
"Permission:Accounting:CustomPaymentLinkGenerator": "自定义付款链接",
"CustomPaymentLink": "自定义付款链接",
"Menu:CustomPaymentLink": "自定义付款链接",
"Amount": "金额",
"GenerateCustomPaymentLink": "生成自定义付款链接",
"GeneratedPaymentLink": "生成付款链接",
"GeneratedPaymentLink": "生成付款链接",
"CopyText": "复制文本",
"Permission:CommunityEvents": "活动",
"Menu:Events": "活动",
"Events": "活动",
"EventType": "活动类型",
"Number": "数量",
"RegistrationURL": "报名网址",
"RegistrationURL": "注册网址",
"URL": "网址",
"EventDeletionConfirmationMessage": "你确定要删除这个活动吗?",
"Enum:EventType:0": "社区讲",
"CreateAnEvent": "创建一个活动",
"Permission:CommunitySpeakers": "演讲者",
"CreateASpeaker": "创建一个演讲者",
"Speakers": "演讲者",
"EventDeletionConfirmationMessage": "您确定要删除此事件吗?",
"Enum:EventType:0": "社区讲",
"CreateAnEvent": "创建活动",
"Permission:CommunitySpeakers": "讲师",
"CreateASpeaker": "创建讲师",
"Speakers": "讲师",
"Image": "图片",
"GithubURL": "Github网址",
"SpeakerDeletionConfirmationMessage": "你确定要删除这个演讲者吗?",
"Menu:Speakers": "演讲者",
"ChooseSpeakerImage": "选择一个演讲者图片...",
"SpeakerImage": "演讲者图片",
"AddSpeaker": "添加演讲者",
"GithubURL": "Github URL",
"SpeakerDeletionConfirmationMessage": "您确定要删除这个讲师吗?",
"Menu:Speakers": "讲师",
"ChooseSpeakerImage": "选择讲师图像...",
"SpeakerImage": "讲师图像",
"AddSpeaker": "添加讲师",
"ShowPurchaseItemsOfOrganizations": "购买项目",
"Enum:OrganizationPurchaseState:0": "未送达",
"Enum:OrganizationPurchaseState:1": "已送达",
"Enum:OrganizationPurchaseState:0": "未交付",
"Enum:OrganizationPurchaseState:1": "已交付",
"PurchaseItems": "购买项目",
"SuccessfullyUpdated": "成功更新",
"SuccessfullyAdded": "成功添加",
"PurchaseState": "购买状态",
"ShowBetweenDayCount": "显示之间的天数",
"PurchaseOrder": "购订单",
"ShowBetweenDayCount": "日间演出",
"PurchaseOrder": "购订单",
"ShowCreateInvoiceOfOrganization": "创建发票",
"ShowCreateQuotationOfOrganization": "创建报价单",
"BookDiscounts": "书折扣",
"Permission:BookDiscount": "书折扣",
"Menu:BookDiscounts": "书折扣",
"BookDiscounts": "书折扣",
"Permission:BookDiscount": "书折扣",
"Menu:BookDiscounts": "书折扣",
"BookType": "书籍类型",
"PurchasePlatform": "购买平台",
"StartTime": "开始时间",
"EndTime": "结束时间",
"CreateABookDiscount": "创建一个书籍折扣",
"BookDiscountDeletionConfirmationMessage": "你确定要删除这个书籍折扣吗?",
"CustomPaymentFlexSwitchDescription": "授权",
"AllowFeatureUpgradeOnLicenseExpire": "允许在授权过期时进行功能升级",
"Deleted{0}": "[删除 {0}]",
"CreateABookDiscount": "创建图书折扣",
"BookDiscountDeletionConfirmationMessage": "您确定要删除此图书折扣吗?",
"CustomPaymentFlexSwitchDescription": "有许可证",
"AllowFeatureUpgradeOnLicenseExpire": "许可证到期时允许功能升级",
"Deleted{0}": "[删除{0}]",
"Tags": "标签",
"SetTagsInfo": "标签使用逗号分隔,例如:CSharp, Entity Framework",
"RejectTrialLicenseWarningMessage": "您确定要拒绝这个试用许可证申请吗?",
"ExportToExcel": "导出Excel",
"SetTagsInfo": "标签应以逗号分隔。例如:CSharp、实体框架",
"RejectTrialLicenseWarningMessage": "您确定要拒绝此试用许可申请吗?",
"ExportToExcel": "导出Excel",
"OverallTotalPrice": "总价",
"OverallDiscountPrice": "折扣价",
"OverallDiscountText": "折扣内容",
"SelectReport": "- 选择报表 -",
"OverallDiscountPrice": "折扣价",
"OverallDiscountText": "整体折扣文本",
"SelectReport": "- 选择报",
"NoDataAvailable": "无数据",
"StatisticsOfCachedContents": "nuget.abp.io缓存的NuGet包内容统计",
"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": "缓存命中的总数,缓存未命中是指缓存中不包含请求的内容。",
"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": "发布日期",
"PublishDate": "发布 日期",
"IsStableVersion": "稳定版",
"IsActive": "活",
"IsActive": "活",
"NewVersion": "新版本",
"VersionHistoryDeletionConfirmationMessage": "您确定要删除此版本吗?",
"CreateAbpConsultantLogoInfo": "最大文件大小:<b>1MB</b> <br/> 支持的文件类型:<b>jpg, jpeg, png, SVG, WebP</b>",
"UrlCode": "许可证代码",
"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顾问",
"Permission:AbpConsultant": "ABP 顾问",
"Menu:AbpConsultants": "ABP 咨询公司",
"CreateAbpConsultant": "创建 ABP 顾问",
"UrlCodeIsNotAvailable": "Url 代码被另一位 ABP 顾问使用。",
"AbpConsultants": "ABP 咨询公司",
"AbpConsultant": "ABP 顾问",
"AbpConsultantEdit": "编辑 ABP 顾问",
"AbpConsultantCreate": "创建 ABP 顾问",
"WhoWeAreItem": "关于我们",
"FieldIsRequired": "{0}是必须的。",
"FieldIsNotValid": "{0}是无效的。",
"FieldIsRequired": "需要 {0}。",
"FieldIsNotValid": "{0} 无效。",
"InterestedLicenseType": "感兴趣的许可证类型",
"MoveWaitList": "移至候补名单",
"CommunityLinkTitle": "在社区网站上打开",
"CommunityLink": "在社区网站上打开",
"ReloadFromSource": "从源重新加载",
"ReloadFromSourceConfirmationMessage": "此帖子将从“{0}”刷新。 你想继续吗?",
"UnitPrice": "单价",
"OverallDiscountAmount": "整体折扣金额",
"CommunityLink": "社区链接",
"ReloadFromSource": "从源重新加载",
"ReloadFromSourceConfirmationMessage": "本帖将从\"{0}\"开始刷新。您想继续吗?",
"UnitPrice": "单",
"OverallDiscountAmount": "折扣总额",
"DiscountAmount": "折扣金额",
"FullChangeHistory": "完整的变更历史",
"FullChangeHistory": "全部更改历史",
"Permission:RefreshReleaseLogs": "刷新发布日志",
"ReleaseLogs": "发布日志",
"AuthorUserName": "作者用户名",
"Type": "类型",
"TotalDiscount": "折扣",
"TotalDiscount": "折扣总额",
"SubTotal": "小计",
"TotalDue": "应付总额",
"TotalDue": "应付总额",
"QuotationNo": "报价编号",
"ValidTill": "有效期至",
"QuotationNote": "报价备注",
"QuotationTemplate.Address:": "地址",
"QuotationTemplate.VATNo:": "增值税",
"QuotationTemplate.Phone:": "电话",
"QuotationNote": "报价说明",
"QuotationTemplate.Address:": "地址",
"QuotationTemplate.VATNo:": "增值税号",
"QuotationTemplate.Phone:": "电话",
"QuotationTemplate.E-mail:": "电子邮件:",
"QuotationTemplate.Quotation": "引述",
"QuotationTemplate.To": "",
"QuotationTemplate.Details": "细节",
"QuotationTemplate.QuotationNo:": "引述 #:",
"QuotationTemplate.IssueDate:": "发日期",
"QuotationTemplate.ValidTill:": "有效期至",
"QuotationTemplate.ValidDays": "{0} 天",
"QuotationTemplate.Description": "描述",
"QuotationTemplate.UnitPrice": "单价",
"QuotationTemplate.Quotation": "报价",
"QuotationTemplate.To": "",
"QuotationTemplate.Details": "详细信息",
"QuotationTemplate.QuotationNo:": "报价单 #:",
"QuotationTemplate.IssueDate:": "发日期",
"QuotationTemplate.ValidTill:": "有效期至",
"QuotationTemplate.ValidDays": "{0}天",
"QuotationTemplate.Description": "说明",
"QuotationTemplate.UnitPrice": "单",
"QuotationTemplate.Qty": "数量",
"QuotationTemplate.Discount": "折扣",
"QuotationTemplate.Total": "全部的",
"QuotationTemplate.Notes": "笔记",
"QuotationTemplate.SubTotal:": "小计:",
"QuotationTemplate.Tax/VAT:": "税/增值税 (%{0}):",
"QuotationTemplate.TotalDiscount:": "折扣:",
"QuotationTemplate.TOTALDUE:": "应付总额:",
"QuotationTemplate.BankAccount": "我们的银行帐户信息可以在 {0} 找到",
"Permission:Raffles": "莱佛士",
"Permission:Draw": "",
"Menu:Raffles": "莱佛士",
"RaffleIsNotDrawable": "抽奖不可抽",
"WinnerCountMustBeGreaterThanZero": "获胜者计数必须大于零",
"FullDescription": "详细描述",
"VisibilityStartDate": "可见开始日期",
"VisibilityEndDate": "可见结束日期",
"QuotationTemplate.Total": "总计",
"QuotationTemplate.Notes": "说明",
"QuotationTemplate.SubTotal:": "小计 :",
"QuotationTemplate.Tax/VAT:": "税 / 增值税 (%{0}) :",
"QuotationTemplate.TotalDiscount:": "折扣总额 :",
"QuotationTemplate.TOTALDUE:": "应付总额 :",
"QuotationTemplate.BankAccount": "我们的银行账户信息可在 {0} 找到。",
"Permission:Raffles": "抽奖",
"Permission:Draw": "绘制",
"Menu:Raffles": "抽奖",
"RaffleIsNotDrawable": "抽奖不可抽",
"WinnerCountMustBeGreaterThanZero": "优胜者人数必须大于零",
"FullDescription": "完整说明",
"VisibilityStartDate": "可见开始日期",
"VisibilityEndDate": "可见结束日期",
"RaffleDate": "抽奖日期",
"SubscriptionCode": "订阅代码",
"GroupCode": "集团代码",
"MaxWinnerCount": "最大获胜者数",
"ReDraw": "重",
"GroupCode": "组别代码",
"MaxWinnerCount": "最大赢家数量",
"ReDraw": "重新绘制",
"EditRaffle": "编辑抽奖",
"Raffles": "莱佛士",
"Raffles": "抽奖",
"CreateARaffle": "创建抽奖活动",
"Draw": "",
"Enum:RaffleStatus:0": "积极的",
"Enum:RaffleStatus:1": "下一",
"Enum:RaffleStatus:2": "过去",
"DrawDone": "抽奖完成",
"HomePageShowType": "页显示类型",
"None": "没有任何",
"Draw": "绘制",
"Enum:RaffleStatus:0": "活跃",
"Enum:RaffleStatus:1": "下一",
"Enum:RaffleStatus:2": "过去",
"DrawDone": "绘制完成",
"HomePageShowType": "页显示类型",
"None": "",
"Card": "卡片",
"Horizontal": "水平的",
"Horizontal": "横向",
"Winners": "获奖者",
"StartDateMustBeLessThanEndDate": "开始日期必须于结束日期",
"VisibilityStartDateMustBeLessThanVisibilityEndDate": "可见性开始日期必须于可见性结束日期",
"StartDateMustBeLessThanEndDate": "开始日期必须于结束日期",
"VisibilityStartDateMustBeLessThanVisibilityEndDate": "可见性开始日期必须于可见性结束日期",
"StartDateMustBeGreaterThanVisibilityStartDate": "开始日期必须大于可见性开始日期",
"EndDateMustBeLessThanVisibilityEndDate": "结束日期必须于可见性结束日期",
"EndDateMustBeLessThanVisibilityEndDate": "结束日期必须于可见性结束日期",
"DrawnDone": "绘制完成",
"AddColor": "添加颜色",
"Colors": "颜色",
"RemoveColor": "除颜色",
"MaxColorCountWarning": "最多可添加 {0} 种颜色",
"MinColorCountWarning": "您必须添加至少 {0} 种颜色",
"RaffleDeletionConfirmationMessage": "您确定要删除抽奖吗?",
"RemoveColor": "除颜色",
"MaxColorCountWarning": "最多可添加 {0} 种颜色",
"MinColorCountWarning": "您必须至少添加 {0} 种颜色",
"RaffleDeletionConfirmationMessage": "您确定要删除这次抽奖吗?",
"CreateRaffle": "创建抽奖活动",
"RemoveImage": "除图像",
"SuccessfullySaved": "保存成功",
"RemoveImage": "除图像",
"SuccessfullySaved": "成功保存",
"Menu:CommunityTalks": "社区讲座",
"Menu:Conferences": "会议",
"Menu:OtherLiveEvents": "其他现场活动",
"Menu:SponsoredConferences": "赞助会议",
"Logo": "标",
"Slug": "蛞蝓",
"Logo": "标",
"Slug": "Slug",
"CompanyUrl": "公司网址",
"TalkTitle": "演讲题",
"AbstractTopic": "摘要主题",
"TalkTitle": "演讲题",
"AbstractTopic": "摘要 主题",
"Bio": "简介",
"LinkedIn": "领英",
"Github": "吉图布",
"Twitch": "抽搐",
"Youtube": "YouTube",
"LinkedIn": "LinkedIn",
"Github": "Github",
"Twitch": "Twitch",
"Youtube": "Youtube",
"Twitter": "推特",
"PersonalWebsite": "个人网站",
"VideoId": "视频编号",
"Order": "命令",
"Image1x1": "图 1x1",
"Image16x9": "图 16x9",
"Banner": "横幅",
"Speaker": "扬声器",
"VideoId": "视频 Id",
"Order": "订购",
"Image1x1": "图 1x1",
"Image16x9": "图 16x9",
"Banner": "旗帜",
"Speaker": "讲师",
"SessionDate": "会议日期",
"AddSession": "添加会",
"AddSession": "添加会",
"AddSponsor": "添加赞助商",
"SponsorLogo": "赞助商标志",
"RegistrationUrl": "注册网址"

2
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json

@ -539,7 +539,7 @@
"Menu:OtherLiveEvents": "其他現場活動",
"Menu:SponsoredConferences": "贊助會議",
"Logo": "標識",
"Slug": "蛞蝓",
"Slug": "Slug",
"CompanyUrl": "公司網址",
"TalkTitle": "演講標題",
"AbstractTopic": "摘要主題",

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

@ -1,38 +1,38 @@
{
"culture": "zh-Hans",
"texts": {
"Volo.AbpIo.Domain:010004": "超过最大成员数!",
"Volo.AbpIo.Domain:010005": "超过最大所有者数!",
"Volo.AbpIo.Domain:010006": "用户已经是该组织的所有者!",
"Volo.AbpIo.Domain:010007": "该用户已经是该组织的开发者!",
"Volo.AbpIo.Domain:010008": "允许的开发者数量不能低于当前开发者数量!",
"Volo.AbpIo.Domain:010009": "允许的开发者数量不能小于零!",
"Volo.AbpIo.Domain:010010": "超出了最大mac地址数!",
"Volo.AbpIo.Domain:010011": "个人许可不允许超过1个开发者!",
"Volo.AbpIo.Domain:010012": "许可过期后许可不可延长1个月!",
"Volo.AbpIo.Domain:020001": "不能删除该NPM包因为\"{NugetPackages}\"Nuget包依赖此包.",
"Volo.AbpIo.Domain:020002": "不能删除该NPM包因为\"{Modules}\"模块正在使用此包.",
"Volo.AbpIo.Domain:020003": "不能删除该NPM包因为\"{Modules}\"模块正在使用此包并且\"{NugetPackages}\"Nuget包依赖此包.",
"Volo.AbpIo.Domain:020004": "不能删除该Nuget包因为\"{Modules}\"模块正在使用此包.",
"Volo.AbpIo.Domain:030000": "您已经完成了试用期。",
"Volo.AbpIo.Domain:030001": "此组织名称已存在。",
"Volo.AbpIo.Domain:030002": "一旦激活,您将无法将试用许可证切换到 -requested- 状态!",
"Volo.AbpIo.Domain:010004": "达到最大成员数!",
"Volo.AbpIo.Domain:010005": "达到最大所有者数量!",
"Volo.AbpIo.Domain:010006": "该用户已是该组织的所有者!",
"Volo.AbpIo.Domain:010007": "该用户已经是该组织的开发人员!",
"Volo.AbpIo.Domain:010008": "允许的开发人员数量不能少于当前的开发人员数量!",
"Volo.AbpIo.Domain:010009": "允许的开发人员数量不能少于 0!",
"Volo.AbpIo.Domain:010010": "超过最大 mac 地址数!",
"Volo.AbpIo.Domain:010011": "个人许可证不能超过 1 个开发人员!",
"Volo.AbpIo.Domain:010012": "许可证到期一个月后不能延期!",
"Volo.AbpIo.Domain:020001": "无法删除此 NPM 包,因为\"{NugetPackages}\"Nuget 包依赖于此包。",
"Volo.AbpIo.Domain:020002": "无法删除此 NPM 包,因为\"{Modules}\"模块正在使用此包。",
"Volo.AbpIo.Domain:020003": "无法删除此 NPM 包,因为\"{Modules}\"模块正在使用此包,且\"{NugetPackages}\"Nuget 包依赖于此包。",
"Volo.AbpIo.Domain:020004": "无法删除此 Nuget 包,因为 \"{Modules}\"模块正在使用此包。",
"Volo.AbpIo.Domain:030000": "您的试用期已经结束。",
"Volo.AbpIo.Domain:030001": "该组织名称已经存在。",
"Volo.AbpIo.Domain:030002": "一旦激活,就不能将试用版许可证切换为 \"请求 \"状态!",
"Volo.AbpIo.Domain:030003": "没有这种状态!",
"Volo.AbpIo.Domain:030004": "由于意外错误,无法更改状态!",
"Volo.AbpIo.Domain:030005": "试用许可证处于激活状态时可更新开始和结束日期!",
"Volo.AbpIo.Domain:030005": "试用许可证处于激活状态时可更新开始和结束日期!",
"Volo.AbpIo.Domain:030006": "结束日期必须大于开始日期!",
"Volo.AbpIo.Domain:030007": "试用许可证已激活!",
"Volo.AbpIo.Domain:030008": "只有状态为-purchased-时才能设置购买日期!",
"Volo.AbpIo.Domain:030009": "找到用户!",
"Volo.AbpIo.Domain:030010": "要购买试用许可证,首先需要激活您的试用许可证!",
"Volo.AbpIo.Domain:030011": "购买后不能删除试用许可证!",
"Volo.AbpIo.Domain:030012": "用户只有一个免费试用期。您已经使用了试用许可证。",
"Volo.AbpIo.Domain:030013": "已激活许可证的用户无法启动试用许可证。",
"Volo.AbpIo.Domain:040000": "遥测已经存在",
"Volo.AbpIo.Domain:030007": "试用许可证已激活!",
"Volo.AbpIo.Domain:030008": "只有当状态为 \"已购买 \"时,才能设置购买日期!",
"Volo.AbpIo.Domain:030009": "找到用户!",
"Volo.AbpIo.Domain:030010": "要购买试用许可证,首先需要激活试用许可证!",
"Volo.AbpIo.Domain:030011": "购买试用许可证后不能删除!",
"Volo.AbpIo.Domain:030012": "一个用户只能有一次免费试用期。您已经使用了试用许可证。",
"Volo.AbpIo.Domain:030013": "已激活许可证的用户不能启动试用许可证。",
"Volo.AbpIo.Domain:040000": "遥测技术已经存在",
"Volo.AbpIo.Domain:070000": "组织名称只能包含拉丁字母、数字、点和连字符!",
"Volo.AbpIo.Domain:070001": "公司名称只能包含拉丁字母、数字、点、空格和连字符!",
"WantToLearn?": "想学习吗?",
"ReadyToGetStarted?": "准备开始了吗?",
"WantToLearn?": "想学习吗",
"ReadyToGetStarted?": "准备好开始了吗?",
"JoinOurCommunity": "加入我们的社区",
"GetStartedUpper": "开始",
"ForkMeOnGitHub": "Fork me on GitHub",
@ -44,19 +44,19 @@
"Blog": "博客",
"Commercial": "商业版",
"MyAccount": "我的账户",
"Permission:License": "许可",
"Permission:License": "许可",
"Permission:UserInfo": "用户信息",
"SeeDocuments": "查看文档",
"SeeDocuments": "参见文档",
"Samples": "示例",
"Framework": "框架",
"Support": "支持",
"FreeDDDBook": "免费 DDD 电子书",
"New": "新",
"Volo.AbpIo.Domain:020005": "许可证延长年份不能低于 {MinExtendLicenseYear} 年和大于 {MaxExtendLicenseYear} 年",
"TrialLicensePeriodHasExpired": "您的试用许可期限已于 {0} 天前到期。",
"TrialLicensePeriodWillExpire": "您的试用许可期限将在 {0} 天后到期。",
"TrialLicensePeriodExpireToday": "您的试用许可将于今天到期。",
"PurchaseNow": "现在买!",
"FreeDDDBook": "免费电子书",
"New": "新",
"Volo.AbpIo.Domain:020005": "许可证扩展年份不能小于 {MinExtendLicenseYear} 年,也不能大于 {MaxExtendLicenseYear} 年。",
"TrialLicensePeriodHasExpired": "您的试用许可证已于 {0} 天前过期。",
"TrialLicensePeriodWillExpire": "您的试用许可将在 {0} 天后到期。",
"TrialLicensePeriodExpireToday": "您的试用许可将于今天到期。",
"PurchaseNow": "立即购买",
"LatestReleaseLogs": "最新发布日志",
"RoadMap": "路线图",
"FAQ": "常见问题",
@ -64,27 +64,27 @@
"SeeAllPosts": "查看所有帖子",
"Contribute": "贡献",
"LiveDemo": "在线演示",
"GetLicense": "获许可证",
"GetLicense": "获许可证",
"OpenSource": "开源",
"WebApplication": "Web应用程序",
"MeetTheABP": "认识 ABP",
"CompleteWebDevelopment": "一个完整的 Web 开发",
"Platform": "平台",
"ABPDescription": "ABP 框架是一个完整的基础架构,可通过遵循软件开发最佳实践和约定来创建现代 Web 应用程序。",
"ABPDescription": "ASP.NET Core Web应用程序开发的开源框架。它遵循软件开发的最佳实践,提供完整的基础架构。",
"StrongInfrastructure": "强大的基础设施",
"CompleteArchitecture": "完整的架构",
"DeveloperFocused": "以开发为中心",
"DeveloperFocused": "以开发人员为中心",
"ShareYourExperiences": "分享您使用 ABP 框架的经验",
"LatestPosts": "最新的帖子",
"LatestVideos": "最新视频",
"LatestPosts": "最新文章",
"LatestVideos": "最新视频",
"Views": "意见",
"LearnLatestNewsAboutABPFramework": "获取有关 ABP 的最新相关信息,如新版本、免费资源、帖子等。",
"DeveloperTools": "开发工具",
"LearnLatestNewsAboutABPFramework": "获取有关 ABP 的最新相关信息,如新版本、免费资源、帖子等。",
"DeveloperTools": "开发人员工具",
"StartupTemplates": "启动模板",
"ApplicationModules": "应用模块",
"UI": "UI",
"Themes": "主题",
"Premium": "高级",
"Premium": "高级",
"PrivacyPolicy": "隐私政策",
"TermsAndConditions": "条款 & 条件",
"WouldLikeToReceiveMarketingMaterials": "我想收到产品交易和特别优惠等市场推广材料。",
@ -93,46 +93,46 @@
"WouldLikeToReceiveNotification": "我想从 abp.io 网站接收最新消息。",
"CommercialNewsletterConfirmationMessage": "我同意<a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/TermsConditions\">条款 & 条件</a > 和 <a class=\"text-white fw-bolder text-decoration-underline\" href=\"https://commercial.abp.io/Privacy\">隐私政策</a>。",
"FreeDDDEBook": "免费 DDD 电子书",
"AdditionalServices": "额外服务",
"AdditionalServices": "附加服务",
"Learn": "学习",
"AccountOverview": "账户信息",
"AccountOverview": "账户概览",
"MyOrganizations": "我的组织",
"MySupportQuestions": "我的支持问题",
"MyProfile": "我的简介",
"Logout": "登出",
"Home": "页",
"Logout": "注销",
"Home": "页",
"Posts": "帖子",
"Videos": "视频",
"JoinTheABPCommunity": "加入 ABP 社区",
"SubmitYourPost": "提交您的帖子",
"Modules": "模块",
"Tools": "工具",
"Pricing": "价",
"Pricing": "价",
"ChangeLogs": "更改日志",
"SubscribeToNewsletter": "订阅时事通讯",
"SubscribeToNewsletterDescription": "获取有关 ABP 的最新相关信息,如新版本、免费资源、帖子等。",
"EmailAddress": "邮箱地址",
"SubscribeToNewsletterDescription": "获取有关 ABP 的最新相关信息,如新版本、免费资源、帖子等。",
"EmailAddress": "电子邮件地址",
"Subscribe": "订阅",
"WelcomeToABP": "欢迎来到 ABP",
"EULA": "最终用户许可协议",
"ABPCommercialIntroductionMessage": "预建应用程序模块、高级启动模板、快速应用程序开发工具、专业 UI 主题和高级支持。",
"EULA": "EULA",
"ABPCommercialIntroductionMessage": "预构建应用模块、高级启动模板、快速应用开发工具、专业UI主题和优质支持。",
"MasteringAbpFrameworkEBook": "掌握 ABP 框架",
"MasteringTheABPFrameworkExplanation": "本书由 ABP 框架的创建者撰写,将帮助您全面了解框架和现代 Web 应用程序开发技术。",
"Speakers": "发言",
"MasteringTheABPFrameworkExplanation": "本书由 ABP 框架的创建者撰写,将帮助你全面了解该框架和现代Web应用程序开发技术。",
"Speakers": "发言",
"PreviousEvents": "以往活动",
"WatchTheEvent": "观看活动",
"RegisterNow": "现在注册",
"RegisterNow": "立即注册",
"ThereIsNoEvent": "没有活动。",
"Events": "活动",
"Volo.AbpIo.Domain:080000": "已有一个名为 \"{Name}\" 的购项目",
"MasteringAbpFrameworkBook": "书籍掌握 ABP 框架",
"ABPIO-CommonPreferenceDefinition": "获取有关 ABP 平台的最新消息,如新帖子、活动等。",
"Volo.AbpIo.Domain:080000": "已有一个名为\"{Name}\"的购项目",
"MasteringAbpFrameworkBook": "书籍掌握 ABP 框架",
"ABPIO-CommonPreferenceDefinition": "获取有关 ABP 平台的最新消息,如新帖子、活动等。",
"BuiltOn": "建立在",
"AbpFramework": "ABP 框架",
"Volo.AbpIo.Domain:080001": "开始时间不能大于结束时间",
"Enum:BookType:0": "掌握 ABP 框架",
"Enum:PurchasePlatform:0": "亚马逊",
"Enum:PurchasePlatform:1": "Packt",
"Enum:PurchasePlatform:1": "包装",
"Copied": "已复制!",
"CouldNotCopy": "无法复制!",
"CopyNotSupportByYourBrowser": "此功能在您使用的浏览器中不起作用。",
@ -141,93 +141,93 @@
"Address": "地址",
"Homepage": "主页",
"Year": "年份",
"Year_Plural": "年",
"Year_Plural": "年",
"Copyright": "版权所有 © <a href=\"{0}\" target=\"_blank\">{1}</a>",
"DomainDrivenDesign": "领域驱动设计",
"CrossCuttingConcerns": "横切关注点",
"AbpCommunity": "ABP 社区",
"Footer_GithubStarCount": "{0} GitHub 上的星星",
"Footer_NugetDownloadCount": "{0} NuGet 下载",
"AbpDescription": "ABP 是一个开源应用程序框架,专注于基于 AspNet Core 的 Web 应用程序开发。 Don't repeat yourself,专注于自己的业务代码。",
"Layout_AbpFramework_MetaTitle": "ABP 框架 | ASP.NET Core 的开源 Web 应用程序框架",
"CommunityTalks_CountdownDays": "天",
"Footer_GithubStarCount": "{0} GitHub 上的 Star",
"Footer_NugetDownloadCount": "{0} NuGet 下载",
"AbpDescription": "ABP 是一个开源应用程序框架,专注于基于 AspNet Core 的Web应用程序开发。不要重复自己,专注于自己的业务代码。",
"Layout_AbpFramework_MetaTitle": "ABP Framework | 面向 ASP.NET Core 的开源Web应用框架",
"CommunityTalks_CountdownDays": "天",
"CommunityTalks_CountdownHours": "小时",
"CommunityTalks_CountdownMinutes": "分钟",
"CommunityTalks_CountdownSeconds": "秒",
"SeePreviousEvents": "查看以前的活动",
"SeePreviousEvents": "查看以活动",
"CookieConsent_Accept": "接受",
"CookieConsent_Explanation_1": "我们使用 cookie 为您提供在我们网站上的最佳体验。",
"CookieConsent_Explanation_2": "如果您继续浏览,则表示您同意我们的<a href=\"@Url.Page(\"/Privacy\")\">隐私政策和cookie 政策。</a>。",
"Error_Page_400_Title": "提供请求的页面时出现问题。",
"CookieConsent_Explanation_1": "我们使用 cookie 为您提供最佳的网站体验。",
"CookieConsent_Explanation_2": "如果您继续浏览,则表示您同意我们的<a href=\"@Url.Page(\"/Privacy\")\">隐私政策和 Cookie 政策。",
"Error_Page_400_Title": "请求的页面服务出现问题。",
"Error_Page_400_Description_1": "通常这意味着在处理您的请求时发生了意外错误。",
"Error_Page_400_Description_2": "如果问题仍然存在,请通过 <a href=\"mailto:info@abp.io\">info@abp.io</a> 联系我们,我们将帮助您开始。",
"GoToHomepage": "去首页",
"Error_Page_404_Title": "页面未找到!",
"Error_Page_404_Description_1": "这不是您要找的网页。",
"Error_Page_500_Title": "好像出了什么问题!",
"Error_Page_500_Description_1": "我们会自动跟踪这些错误,但如果问题仍然存在,请随时 <br /> 联系我们。 与此同时,尝试刷新。",
"Error_Page_500_Description_2": "通过 <a href=\"mailto:info@abp.io\" target=\"_blank\">info@abp.io</a> 与我们联系。",
"Error_Page_400_Description_2": "如果问题仍然存在,请通过<a href=\"mailto:info@abp.io\">info@abp.io</a>联系我们,我们将帮助您解决问题。",
"GoToHomepage": "转到主页",
"Error_Page_404_Title": "未找到页面!",
"Error_Page_404_Description_1": "这不是您要找的网页。",
"Error_Page_500_Title": "看来是出了什么问题!",
"Error_Page_500_Description_1": "我们会自动跟踪这些错误,但如果问题仍然存在,请随时 <br /> 联系我们。同时,尝试刷新。",
"Error_Page_500_Description_2": "通过 <a href=\"mailto:info@abp.io\" target=\"_blank\">info@abp.io</a> 与我们联系。",
"Books": "书籍",
"ABPDiscordServer": "ABP Discord 服务器",
"ABPCommunityTalks": "ABP社区讲话",
"ABPCommunityPosts": "ABP社区文章",
"BuyAndGetMonths": "购买 12 个月,<span>获得 14 个月!</span>",
"GetYourDeal": "得到你的交易",
"BuyOrRenewLicense": "立即购买或续订许可证并额外获得 2 个月!",
"BuyOrRenewLicenseToGetExtra2Months": "立即购买或续订 ABP 商业许可证(适用于所有版本)并额外获得 2 个月!",
"ABPCommunityTalks": "ABP 社区讲座",
"ABPCommunityPosts": "ABP 社区帖子",
"BuyAndGetMonths": "买 12 个月,<span>送 14 个月!</span",
"GetYourDeal": "获得优惠",
"BuyOrRenewLicense": "立即购买或更新许可证,可额外获得 2 个月的使用权!",
"BuyOrRenewLicenseToGetExtra2Months": "立即购买或更新许可证,即可获得 2 个月的额外优惠!抓紧时间!⏰ 最后一天:{0}",
"HurryUp": "赶快下单!",
"LastDay": "活动截止日期: {0}",
"BuyNewLicenseBetweenDatesToGetBenefit": "在 {0} 和 {1} 之间购买一个新的许可证以获得额外 2 个月的收益!",
"CheckAllCommunityTalks": "查所有社区帖子",
"ReadMore": "阅读更多",
"LastDay": "最后一天{0}",
"BuyNewLicenseBetweenDatesToGetBenefit": "在{0}和{1}之间购买新许可证,可享受额外 2 个月的优惠!",
"CheckAllCommunityTalks": "查所有社区帖子",
"ReadMore": "更多信息",
"ContinueReading": "继续阅读",
"Post": "邮政",
"ExploreTheContentsCreatedByTheCoreABPTeamAndTheABPCommunity": "探索核心 ABP 团队和 ABP 社区创建的内容。",
"Post": "帖子",
"ExploreTheContentsCreatedByTheCoreABPTeamAndTheABPCommunity": "探索 ABP 核心团队和 ABP 社区创建的内容。",
"WelcomeFallCampaign": "欢迎秋季活动!",
"GiveAwayForNewPurchases": "新购买将赠应用程序开发课堂培训!",
"BlackFriday": "<strong>黑色</strong> <span>星期五</span>",
"ValidForExistingCustomers": "也适用于 <br> 现有用户!",
"CampaignBetweenDates": "从 {0} <br> {1}",
"SaveUpTo": "<span>最多节省</span> 至<strong>${0}K</strong>",
"ImplementingDDD": "实领域驱动设计",
"ExploreTheEBook": "浏览电子书",
"ExploreTheBook": "浏览书籍",
"ConsultantType": "顾问类型",
"Expert": "ABP专家",
"Partner": "ABP合作伙伴",
"GiveAwayForNewPurchases": "新购买的产品赠应用开发课堂培训!",
"BlackFriday": "<strong>黑色</strong> <span>星期五</span",
"ValidForExistingCustomers": "同样适用于 <br> 现有客户!",
"CampaignBetweenDates": "从 {0} <br> {1}",
"SaveUpTo": "<span>节省</span>高达<strong>${0}K</strong>",
"ImplementingDDD": "实领域驱动设计",
"ExploreTheEBook": "探索电子书",
"ExploreTheBook": "探索图书",
"ConsultantType": "咨询类型",
"Expert": "ABP 专家",
"Partner": "ABP 合作伙伴",
"Industry": "行业",
"Location": "地点",
"Contact": "联系",
"Partner_Year": "合作年份",
"Contact": "联系方式",
"Partner_Year": "伙伴关系年",
"Info": "信息",
"SpokenLanguages": "语",
"SpokenLanguages": "语",
"SocialMedia": "社交媒体",
"Activity": "活动",
"Type": "类型",
"Contribution": "贡献",
"WhoWeAre": "关于我们",
"Icons": "图标",
"Url": "Url",
"Url": "网址",
"Icon": "图标",
"RecentActivities": "最近的活动",
"RecentActivities": "近期活动",
"SpringCampaign": "欢迎 <br>春季促销!",
"SpringCampaign2": "<span>限时优惠!<br></span>",
"SpringCampaign2": "<span>限时<br>优惠!</span",
"AboutUs": "关于我们",
"HowItWorks": "怎么运行的?",
"ReleaseNotes": "发说明",
"HowItWorks": "它是如何工作的?",
"ReleaseNotes": "发说明",
"DetailedChangeNotes": "详细变更说明",
"SeeTrainings": "查看培训",
"NoContent": "无内容",
"More": "更多",
"WhyABPIOPlatform": "为什么选择ABP.IO平台?",
"AbpStudio": "总部基地工作室",
"ExtraMonths": "{0}<span>额外月</span>",
"More": "更多信息",
"WhyABPIOPlatform": "为什么选择 ABP.IO 平台?",
"AbpStudio": "ABP Studio",
"ExtraMonths": "{0}<span>额外的一个月</span",
"RSS": "RSS",
"RSSFeed": "RSS订阅",
"RSSFeed": "RSS 订阅",
"Articles": "文章",
"Organizations": "组织机构",
"ManageAccount": "管理户",
"CommunityProfile": "社区简介",
"ManageAccount": "管理户",
"CommunityProfile": "社区概况",
"BlogProfile": "博客简介",
"Tickets": "门票"
}

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

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

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

File diff suppressed because it is too large

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

@ -352,7 +352,7 @@
"VolosoftMarketingInformationMessage": "我想要有關企業和組織解決方案以及其他 Volosoft 產品和服務的信息、提示和優惠。",
"VolosoftSharingInformationMessage": "我希望 Volosoft 與選定的合作夥伴共享我的信息,以便我可以收到有關他們的產品和服務的相關信息。",
"WeWillSendYouADownloadLink": "下載電子書的鏈接已發送至 {0}。<br/>檢查您的收件箱/垃圾箱/垃圾箱!",
"InvalidFormInputs": "請輸入表中指定的有效信息。",
"InvalidFormInputs": "請輸入表中指定的有效信息。",
"DDDBookEmailBody": "謝謝你。 <br />要下載您的圖書,請<a href=\"{0}\">點擊此處</a>。",
"FreeDDDEBook": "免費 DDD 電子書",
"StartFree": "免費開始",
@ -399,6 +399,674 @@
"LicenseTransferExplanation": "是的!購買許可證後,您將成為許可證持有者,因此您可以訪問組織管理頁面。組織具有所有者和開發者角色。所有者可以管理開發者席位並分配開發者。每個指定的開發人員將通過 ABP CLI 命令登錄到系統,並將擁有開發和支持權限。",
"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": "最酷的公司已經在使用<span class=\"fw-bold\">ABP Commercial。</span>",
"UserInterface": "使用者介面",
"APIGateway": "API網關",
"Microservice": "微服務",
"Database": "資料庫",
"Architecture": "建築學",
"MicroserviceArchitectureExplanation": "這是一個完整的解決方案架構,由多個應用程式、API網關、微服務和資料庫組成,利用最新技術建立可擴展的微服務解決方案。",
"BusinessLogic": "商業邏輯",
"DataAccessLayer": "資料存取層",
"Monolith": "巨石",
"ModularArchitectureExplanation": "此啟動範本提供了分層、模組化和基於DDD的解決方案架構,以建立乾淨且可維護的程式碼庫。",
"SeeDetails": "查看具體資訊",
"SeeDocumentation": "查看文件",
"Bs5Compatible": "Bootstrap 5 相容的專業主題,非常適合您的管理網站。",
"LeptonXTheme": "LeptonX主題",
"LeptonXDark": "LeptonX 黑暗",
"LeptonXLight": "輕子X光",
"LeptonXSemiDark": "LeptonX 半暗",
"BuiltOnBs5Library": "基於 Bootstrap 5 庫構建",
"FullyCompatibleWithBs5": "100% 相容於 Bootstrap 5 HTML 結構和 CSS 類",
"ResponsiveAndMobileCompatible": "響應靈敏、移動兼容、RTL 支持",
"ProvidesStylesForDatatables": "提供資料表的樣式",
"MultipleLayoutOptions": "多種佈局選項",
"EasilyInstallAndUpgrade": "輕鬆安裝和升級",
"SupportForum": "支援論壇",
"TrustedBy": "值得信賴",
"OurPricing": "我們的<span class=\"gradient-commercial\">定價</span>",
"Plans": "計劃",
"NameSurname": "名字姓",
"Unspecified": "未指定",
"LicenceType": "許可證類型",
"LicenseDiscountWarning": "此折扣頁面使用預設折扣代碼並適用於 VOLOSOFT 開發者。下面的購買連結不起作用。",
"DiscountedLicenseExplanation": "這些許可證價格適用於小型新創公司、個人開發者、學生、非營利組織和專案!",
"General": "一般的",
"License": "執照",
"Development": "發展",
"Payment": "支付",
"WatchExplainerVideo": "咱們見面吧!觀看講解視頻",
"LightDarkAndSemiDarkThemes": "淺色、深色和半深色",
"LeptonXThemeExplanation": "Lepton Theme可以根據您的系統設定更改您的主題。",
"PRO": "專業版",
"WelcomeToABPCommercial": "歡迎來到<span class=\"gradient-commercial\">ABP商業!</span>",
"YourAccountDetails": "您的帳戶詳細信息",
"OrganizationName": "機構名稱",
"AddDevelopers": "添加開發者",
"StartDevelopment": "開始開發",
"CreateAndRunApplicationUsingStartupTemplate": "了解如何使用 ABP Commercial 啟動範本建立和運行新的 Web 應用程式。",
"CommunityDescription2": "<span class=\"fw-6\">Community.abp.io</span>是一個人們可以分享 ABP 相關文章的地方。搜尋文章、教學、程式碼範例、案例研究並結識與您志同道合的人。",
"UseABPSuiteExplanation": "使用ABP Suite下載模組和主題的原始碼。",
"ManageModulesWithSuite": "您也可以使用 Suite 管理您的 ABP 模組。",
"LearnHowToInstallSuite": "了解如何安裝和使用 ABP Suite。",
"SeeMore": "看更多",
"SeeLess": "少看",
"LayeredSolutionStructure": "分層解決方案結構",
"LayeredSolutionStructureExplanation": "該解決方案基於領域驅動設計原則和模式進行分層,以將業務邏輯與基礎架構和整合隔離,並最大限度地提高程式碼可維護性和可重用性。 ABP 框架已經提供了抽象、基類和指南,以便為您的應用程式真正實現 DDD。",
"MultipleUIOptions": "多個使用者介面選項",
"MultipleUIOptionsExplanation": "我們喜歡用不同的方式來創建使用者介面。此啟動解決方案為您的業務應用程式提供了三種不同的 UI 框架選項。",
"MultipleDatabaseOptions": "多個資料庫選項",
"MultipleDatabaseOptionsExplanation": "您有兩個資料庫提供者選項(除了在單一應用程式中使用這兩個選項)。使用 Entity Framework Core 來處理任何關聯式資料庫,當您需要編寫低階查詢以獲得更好的效能時,可以選擇使用 Dapper。如果您需要使用基於文件的 NoSQL 資料庫,MongoDB 是另一個選擇。雖然這些提供者經過良好整合、抽象化和預先配置,但您實際上可以與可與 .NET 一起使用的任何資料庫系統進行互動。",
"ModularArchitectureExplanation2": "模組化是 ABP.IO 平台的一等公民。所有應用程式功能都分為隔離良好的選用模組。此啟動解決方案已經預先安裝了基本的<a href=\"/modules\" class=\"text-primary\">ABP Commercial 模組</a>。您也可以建立自己的模組,為您自己的應用程式建立模組化系統。",
"MultiTenancyForSaasBusiness": "SaaS 業務的多租戶",
"MultiTenancyForSaasBusinessExplanation": "ABP Commercial 提供完整的端對端多租用戶系統來建立您的 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": "欲了解更多信息,請點擊<a href='{0}'>此處。</a>",
"ForMoreInformationClickHereByClass": "<span class=\"{1}\">欲了解更多信息,請點擊</span><a href='{0}'>此處。</a>",
"IsGetOnboardingTraining": "您想接受入職和網路應用程式開發培訓嗎?",
"OnboardingWebApplicationDevelopmentTrainingMessage": "若要安排您的培訓日曆,請在建立組織後聯絡 {0}",
"CustomPurchaseMessage": "下一步,請點擊 {0} 與我們聯絡。",
"Note": "筆記",
"AdditionalNote": "附加說明",
"AddBasket": "加入購物籃",
"SendTrainingRequest": "發送培訓請求",
"OnlyEnglishVersionOfThisDocumentIsTheRecentAndValid": "* 本文檔英文版為最新版本,如有爭議,以英文版為準。",
"Pricing_Page_Title": "定價和計劃",
"Pricing_Page_Description": "選擇您目前的業務所需的特性和功能。購買 ABP 商業許可證並創建無限的項目。",
"Pricing_Page_HurryUp": "趕快!",
"Pricing_Page_BuyLicense": "在 1 月 16 日之前以<strong>2021 年價格</strong>購買許可證!",
"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 個月內交付了銀行級多租戶筒倉資料庫 SaaS 平台,以支援來自多個整合錨點的大額發票的應收帳款/應付帳款供應鏈融資。 ABP 的模組化使團隊能夠以創紀錄的時間交付、通過所有 VAPT,並透過完整的 CI/CD 和管道將容器化微服務堆疊部署到生產中。",
"Pricing_Page_Testimonial_2": "我們看到了使用 ABP Commercial 來減少客製化開發專案的開銷的價值。團隊能夠統一不同專案流中的程式碼模式。我們看到該框架具有更大的潛力,可以讓我們比以前更快地建立新功能。我們相信我們將不斷看到利用 ABP Commercial 的價值。",
"Pricing_Page_Testimonial_3": "我們愛 ABP。我們不必從頭開始編寫所有內容。我們從開箱即用的功能開始,只專注於我們真正需要編寫的內容。此外,ABP 架構良好,程式碼品質高,錯誤較少。如果我們必須自己編寫所需的所有內容,我們可能需要花費數年時間。我們喜歡的另一件事是,新版本、問題修復或改進每隔一周很快就會發布。我們不會等太久。",
"Pricing_Page_Testimonial_4": "ABP Commercial 是一款極佳的產品,值得推薦。在單一可配置平台上為我們的客戶推出商業產品。為任何團隊提供的框架和工具的快速啟動都是值得的。 ABP Commercial 最適合我們的需求。",
"Pricing_Page_Testimonial_5": "ABP Framework 不僅僅是一個框架,它也是專案開發/管理的指南,因為它提供了 DDD、GenericRepository、DI、微服務和模組化培訓。即使您不打算使用框架本身,您也可以使用經過充分且專業準備的 docs.abp.io 進行開發(OpenIddict、Redis、Quartz 等)。因為很多東西都是預先建立的,所以它大大縮短了專案開發時間(例如登入頁面、異常處理、資料過濾、播種、稽核日誌記錄、本地化、自動 API 控制器等)。作為我們應用程式的範例,我使用本地事件總線進行庫存控制。因此,我可以透過編寫庫存處理程序來管理訂單變更。不浪費時間給CreationTime、CreatorId真是太好了。它們會被自動填滿。",
"Pricing_Page_Testimonial_6": "ABP框架是一個很好的框架,但是它需要時間來理解它使用的不同層、類別和函式庫(尤其是ABP)。我花了很多時間閱讀程式碼庫,但 ABP Commercial 為我們節省了建立專案專業實體 (AR) 以及連結到每個實體的儲存庫的時間。我還喜歡 ABP 中使用的方法非常成熟;我們知道它是基於 DDD 和 monolith 的。",
"Pricing_Page_Testimonial_7": "作為一家新創公司,我們需要快速迭代,並在樣板和非核心功能上花費最少的時間。 \n我們的工程師既有經驗豐富的工程師,也有初級工程師,我們需要一種共同的理解和一種共享技術和領域知識的方法,ABP 憑藉其出色的指南和文件使我們能夠做到這一點。 \n有些事情我們不必擔心,因為它們與 ABP 一起開箱即用。 \n ABP 幫助我們簡化了快速原型設計和開發,從功能啟動到生產只花了不到 4 週的時間。憑藉許可證中包含的所有高級功能,ABP 為我們提供了軟體工程方面的「Startup in a Box」。",
"Pricing_Page_Testimonial_8": "我會向所有想要擴大客戶可用產品範圍的人推薦 ABP Commercial。當需要使用分散式企業環境(Angular、WPF、Win&amp;Linux)時,它非常棒。除了他們的產品之外,我們還喜歡他們的支持,這使我們的工作更快、更輕鬆。我們已經知道,我們已經找到了一個面向未來的優秀合作夥伴,他將支持我們拓展業務。",
"Pricing_Page_Testimonial_9": "我們是一家擁有 2 名員工的公司,已有 20 多年的經營歷史。 \n根據我們在 ABP Commercial 方面的經驗,一位客戶聯繫我們,要求我們在現代環境中開發一個新的人力資源應用程序,以取代他們使用了 25 年的 Access 應用程式。我們決定從桌面解決方案過渡到基於網路的解決方案。 \n \n當時,我們對 Web 應用和 .NET 的了解很少,但我們偶然發現了 ABP Commercial,在 ABP 框架、技術文件和 ABP Suite 的幫助下,我們不僅能夠將應用程式開發為一年之內,不僅滿足了客戶的規範,而且還成功地在.NET 環境中工作。",
"AbpBookDownloadArea_ClaimYourEBook": "領取您的<span class='gradient-framework'>掌握 ABP 框架</span>電子書",
"AddMemberModal_Warning_1": "如果系統中不存在您嘗試新增的<strong>使用者名</strong>,請讓您的團隊成員在<a href='{0}/Account/Register'>{0}</a>上註冊並與您共用他/她的帳戶使用者名稱。",
"MyOrganizations_Detail_WelcomeMessage": "歡迎加入您的組織,{0}",
"MyOrganizations_Detail_OrganizationManagement": "組織<span class=\"gradient-commercial\">管理</span>",
"OrganizationDisplayName": "組織顯示名稱",
"MyOrganizations_Detail_EditDisplayName": "編輯顯示名稱",
"MyOrganizations_Detail_UpgradeYourLicense": "升級您的許可證",
"MyOrganizations_Detail_LicenseStartAndExpiryDate": "許可證開始日期 - 到期日期",
"MyOrganizations_Detail_OwnerRightInfo": "您正在使用您的 {1} 項所有者權利中的 {0} 項。",
"MyOrganizations_Detail_CopyApiKey": "複製密鑰",
"MyOrganizations_Detail_ApiKeyDescription": "API 金鑰是<a href=\"{0}\" target=\"_blank\" class=\"text-primary\" rel=\"noopener\">{1} 上託管的 PRO 包的令牌。</a>",
"MyOrganizations_Detail_YourPrivateNugetSource": "您的私有 NuGet 來源是<a href=\"{0}\" target=\"_blank\" class=\"text-primary\" rel=\"noopener\">{0}</a>",
"MyOrganizations_Detail_PrivateNugetSourceWarning": "這會作為 feed 自動添加到 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": "如果您透過<i>{0}</i>網關購買了許可證,它會將 PDF 發票傳送到您的電子郵件地址,請參閱<a href=\"{1}\" target=\"_blank\">{0} 發票。</a>",
"MyOrganizations_Detail_PayUInfo": "如果您是透過<i>Iyzico</i>網關購買的,請點擊「索取發票」按鈕並填寫帳單資訊。",
"MyOrganizations_Detail_ConclusionInfo": "您的發票申請將在 {0} 個工作天內完成。",
"ExtendYourLicense": "延長您的<span class=\"text-primary\">{0}</span>許可",
"Continue": "繼續",
"DownloadInvoiceModal_DownloadInvoice": "下載發票",
"DownloadInvoiceModal_SaveInformationOnlyOnce": "您只能儲存一次帳單資訊。",
"InvoiceModal_EnterCompanyName": "輸入您的法定公司名稱...",
"InvoiceModal_EnterCompanyAddress": "輸入您的法定公司地址...",
"InvoiceModal_EnterTaxNumber": "輸入您的稅號/增值稅號(如果有)...",
"RequestInvoiceModal_EnterNotes": "輸入有關發票的額外資訊...",
"PrePayment_PayWithIyzico": "您將使用 Iyzico 付款",
"ContinueToCheckout": "繼續結帳",
"PrePayment_IyzicoRedirectionInfo": "您將被重定向到 Iyzico 支付網關以安全地完成購買。",
"PrePayment_IyzicoAcceptVisaAndMasterCard": "Iyzico 接受 Visa 和 MasterCard。",
"Purchase": "購買",
"AcceptTermsAndConditions": "我已閱讀、瞭解並接受<a href=\"{0}\" target=\"_blank\" class=\"text-primary\" rel=\"noopener\">隱私權政策</a>、<a href=\"{1}\" target=\"_blank\" class=\"text-primary\" rel=\"noopener\">條款與條件</a>以及<a href=\"{2}\" target=\"_blank\" class=\"text-primary\">EULA。</a>",
"AcceptTermsAndConditionsWarningMessage": "請接受隱私權政策以及條款與條件",
"SelectGatewayToContinue": "請選擇一個網關以繼續!",
"GatewaySelection_SelectGateway": "選擇支付網關",
"GatewaySelection_RedirectionMessage": "接下來,您將被重新導向到所選支付網關的網站進行交易。",
"PaymentSucceed_PaymentSuccessMessage": "支付成功",
"PaymentSucceed_ThanksForPurchase": "感謝您的購買!",
"PaymentSucceed_CreateYourOrganization": "建立您的組織",
"PaymentSucceed_AddMeAsDeveloper": "我也是開發人員,請將我作為開發人員加入我的組織。",
"PaymentSucceed_CreateOrganization": "創建組織",
"PaymentSucceed_OrganizationDescription": "組織由開發人員和所有者組成。開發者是在 ABP 專案上編寫程式碼的用戶,他們將從<a href=\"{0}\" target=\"_blank\">{1}</a>網站中受益。所有者是分配開發人員席位並管理許可的使用者。",
"PaymentSucceed_ViewOrganization": "點擊此處查看組織",
"Purchase_TotalAnnualPrice": "總計<small class=\"opacity-50\">(年費)</small>",
"Purchase_TrainingPrice": "培訓價格",
"Purchase_OnboardingTraining": "入職培訓和 Web 應用程式開發現場培訓",
"TotalDeveloperPrice": "開發商總價",
"Purchase_PricePerDeveloper": "每個開發者<span>{0} {1}</span>",
"Purchase_IncludedDeveloperInfo": "包括 {0} {1}。",
"Purchase_LicenseExtraDeveloperPurchaseMessage": "<span class=\"fw-bold\">{0} 許可證</span>包括 {1} 開發人員。您可以新增其他開發人員。",
"StartupTemplates_Page_Title": "ABP 啟動模板",
"StartupTemplates_Page_Description": "ABP Commercial 可讓您建立任何複雜程度的解決方案。它提供了兩個主要的預建啟動解決方案。您可以選擇最接近您的要求的解決方案,並在此基礎上建立您自己的自訂解決方案。",
"MicroserviceStartupSolutionForDotnet": ".NET 微服務啟動解決方案",
"MonolithSolutionForDotnet": ".NET 的整體(模組化)解決方案",
"TrainingDetailsHeaderInfo_TrainingHour": "{0} 小時",
"Trainings_Content": "培訓內容",
"Trial_Page_StartYourFreeTrial": "開始你的<span class=\"gradient-commercial\">免費試用</span>",
"TrialLicenseFeatures": "您將能夠受益於所有 ABP 商業功能",
"TrialPeriodDays": "您將擁有 {0} 天的團隊許可證",
"TrialForumSupportIncident": "您將有 {0} 個論壇支援事件",
"Contact_Page_Title": "聯絡ABP開發團隊",
"Contact_Page_Description": "如果您需要任何協助或分享您的想法和意見,請聯絡 ABP 開發團隊! ABP 支援團隊隨時準備提供協助。",
"Demo_Page_Title": "建立演示",
"Demo_Page_Description": "建立免費演示以查看使用 ABP Commercial 啟動範本建立的範例應用程式。不要重複常見的應用程式要求。",
"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": "對於其他貨幣,請查看<a href='{0}'>所有帳戶</a>",
"ProjectCreatedSuccess_Page_Title": "您的專案已創建",
"ProjectCreatedSuccess_Page_Description": "您的 ABP 專案創建成功!",
"Suite_Page_Title": "ABP 套件",
"Suite_Page_Description": "ABP Commercial 提供快速應用程式開發工具來提高開發人員的工作效率。 ABP Suite 讓您輕鬆建立 CRUD 頁面。",
"Themes_Page_Title": "總部基地主題",
"Themes_Page_Description": "ABP Commercial 提供多種專業、現代的 UI 主題。建立免費演示以快速查看 UI 的外觀。",
"Tools_Page_Title": "快速應用程式開發工具",
"Tools_Page_Description": "ABP Commercial 提供快速應用程式開發工具來提高開發人員的工作效率。 ABP Suite 讓您輕鬆建立 CRUD 頁面。",
"DeveloperPrice": "開發商價格",
"AdditionalDeveloperPaymentInfoSection_AdditionalDevelopers": "{0}<small>開發者</small>",
"LicenseRemainingDays": "<span>{0}</span>天",
"ExtendPaymentInfoSection_Description": "透過延長/更新您的許可證,您將繼續獲得<a href=\"{0}\" target=\"_blank\">高級支援</a>。您還可以獲得模組和主題的主要或次要更新。您將能夠繼續建立新專案。而且您仍然可以使用<a href=\"{1}\" target=\"_blank\">ABP Suite</a>來加快您的開發速度。",
"LicenseRenewalPrice": "許可證更新價格",
"LicensePrice": "許可價格",
"TrialLicensePaymentInfoSection_Description": "<strong>購買許可證:</strong>透過購買許可證,您將繼續獲得<a href=\"{0}\" target=\"_blank\" rel=\"noopener\">高級支援</a>。您還可以獲得模組和主題的主要或次要更新。您將能夠繼續建立新專案。而且您仍然可以使用<a href=\"{1}\" target=\"_blank\" rel=\"noopener\">ABP Suite</a>來加快您的開發速度。<br>請參閱<a href=\"{2}\" target=\"_blank\" rel=\"noopener\">許可證比較表</a>以檢查許可證類型之間的差異。",
"SelectTargetLicense": "選擇目標許可證",
"UpgradePaymentInfoSection_ExtendMyLicenseForOneYear": "是的,將我的許可證有效期延長 1 年。",
"UpgradePaymentInfoSection_WantToExtendLicense": "您想將您的駕照再延長一年嗎?",
"UpgradePaymentInfoSection_UpgradingWillNotExtendLicense": "升級不會延長您的許可證有效期限!",
"UpgradePaymentInfoSection_LicenseUpgradeDescription": "透過升級您的許可證,您將升級到更高的許可證類型,這將使您獲得額外的好處。請參閱<a href=\"/Pricing\" target=\"_blank\">許可證比較表</a>以檢查許可證類型之間的差異。",
"Landing_Page_CustomerStories": "客戶案例",
"Landing_Page_OurGreatCustomers": "我們的大客戶",
"Landing_Page_WebApplicationFramework": "網路應用框架",
"Landing_Page_WebDevelopmentPlatform": "網頁開發平台",
"Landing_Page_CompleteWebDevelopmentPlatform": "完整的網頁開發平台",
"Landing_Page_TryFreeDemo": "嘗試免費演示",
"Landing_Page_StartingPointForWebApplications": "基於 ASP.NET Core 的 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 Commercial 幫助 SC Ventures 在 9 個月內交付了銀行級多租戶筒倉資料庫 SaaS 平台,以支援來自多個整合錨點的大額發票的應收帳款/應付帳款供應鏈融資。 ABP 的模組化使團隊能夠以創紀錄的時間交付、通過所有 VAPT,並透過完整的 CI/CD 和管道將容器化微服務堆疊部署到生產中。",
"Landing_Page_CustomerStory_2": "我們看到了使用 ABP Commercial 來減少客製化開發專案的開銷的價值。團隊可以統一不同專案流中的程式碼模式。我們看到該框架具有更大的潛力,可以讓我們比以前更快地建立新功能。我們相信我們將不斷看到利用 ABP Commercial 的價值。",
"Landing_Page_CustomerStory_3": "我們愛 ABP。我們不必從頭開始編寫所有內容。我們從開箱即用的功能開始,只專注於我們真正需要編寫的內容。此外,ABP 架構良好,程式碼品質高,錯誤較少。如果我們必須自己編寫所需的所有內容,我們可能需要花費數年時間。我們喜歡的另一件事是新版本、問題修復或改進很快就會每隔一周推出\n 。我們不會等太久。",
"Landing_Page_CustomerStory_4": "ABP Commercial 是一款極佳的產品,值得推薦。在單一可配置平台上為我們的客戶推出商業產品。為任何團隊提供的框架和工具的快速啟動都是值得的。 ABP Commercial 最適合我們的需求。",
"Landing_Page_AdditionalServices": "定製或批量許可證、入職、現場培訓和支援、客製化專案開發、移植現有專案等等...",
"Landing_Page_IncludedDeveloperLicenses": "包含<strong>{0} 個</strong>開發者許可",
"Landing_Page_SeeOnDemo": "請參閱演示",
"Landing_Page_LeptonThemes": "輕子主題",
"Landing_Page_AccountModuleDescription_1": "該模組實現應用程式的身份驗證系統;",
"Landing_Page_AccountModuleDescription_2": "提供帶有使用者名稱和密碼的<strong>登入</strong>頁面",
"Landing_Page_AccountModuleDescription_3": "提供<strong>註冊</strong>頁面來建立新帳戶。",
"Landing_Page_AccountModuleDescription_4": "提供<strong>忘記密碼</strong>頁面,以透過電子郵件發送<strong>密碼重設</strong>連結。",
"Landing_Page_AccountModuleDescription_5": "透過 UI 提供<strong>電子郵件確認</strong>功能。",
"Landing_Page_AccountModuleDescription_6": "實施<strong>兩因素</strong>身份驗證(簡訊和電子郵件)。",
"Landing_Page_AccountModuleDescription_7": "實現<strong>使用者鎖定</strong>(在一定時間內因無效憑證而導致登入失敗達到一定次數時,將帳戶鎖定設定的時間)。",
"Landing_Page_AccountModuleDescription_8": "實作<strong>Identity Server</strong>身份驗證伺服器 UI 和功能。",
"Landing_Page_AccountModuleDescription_9": "允許在多租戶環境中<strong>在租戶之間切換</strong>。",
"Landing_Page_AccountModuleDescription_10": "允許更改應用程式的<strong>UI 語言</strong>。",
"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": "請參閱<a href=\"blog.abp.io\">blog.abp.io</a>網站作為部落格模組的即時範例。",
"Landing_Page_ChatModuleDescription_1": "此模組用於應用程式中使用者之間的即時訊息傳遞。",
"Landing_Page_ChatModuleDescription_2": "聊天頁面上的即時訊息傳遞。",
"Landing_Page_ChatModuleDescription_3": "在應用程式中搜尋用戶以獲取新對話。",
"Landing_Page_ChatModuleDescription_4": "最近對話的聯絡人清單。",
"Landing_Page_ChatModuleDescription_5": "當使用者查看另一個頁面時有新訊息通知。",
"Landing_Page_ChatModuleDescription_6": "選單圖示上的未讀訊息總數徽章。",
"Landing_Page_ChatModuleDescription_7": "每個對話的未讀訊息計數。",
"Landing_Page_ChatModuleDescription_8": "延遲載入對話。",
"Landing_Page_DocsModuleDescription_1": "此模組用於創建技術文件網站;",
"Landing_Page_DocsModuleDescription_2": "內建<strong>GitHub 整合</strong>:直接在 GitHub 上撰寫和管理文件。",
"Landing_Page_DocsModuleDescription_3": "<strong>版本控制</strong>支援直接整合到 GitHub 版本。",
"Landing_Page_DocsModuleDescription_4": "支援<strong>多語言</strong>(支援預設語言)。",
"Landing_Page_DocsModuleDescription_5": "支援<strong>Markdown</strong>和 HTML 格式。",
"Landing_Page_DocsModuleDescription_6": "提供<strong>導航</strong>和<strong>大綱</strong>部分。",
"Landing_Page_DocsModuleDescription_7": "允許在單一應用程式中託管<strong>多個專案</strong>文件。",
"Landing_Page_DocsModuleDescription_8": "GitHub 上文件的鏈接,因此任何人都可以通過單擊<strong>“編輯”鏈接</strong>輕鬆做出貢獻。",
"Landing_Page_DocsModuleDescription_9": "除了 GitHub 來源之外,還允許簡單地使用資料夾作為文件來源。",
"Landing_Page_FileManagementModuleDescription_1": "在分層資料夾結構中上傳、下載和組織文件。",
"Landing_Page_FileManagementModuleDescription_2": "此模組用於上傳、下載檔案並以分層資料夾結構組織檔案。它還與多租戶相容,您可以確定租戶的總大小限制。",
"Landing_Page_FileManagementModuleDescription_3": "此模組基於<a href=\"https://docs.abp.io/en/abp/latest/Blob-Storing\">BLOB儲存</a>系統,因此可以使用不同的儲存提供者來儲存檔案內容。",
"Landing_Page_IdentityModuleDescription_1": "該模組實現了應用程式的使用者和角色系統;",
"Landing_Page_IdentityModuleDescription_2": "基於<a href=\"https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity\">Microsoft 的 ASP.NET Core Identity</a>庫建置。",
"Landing_Page_IdentityModuleDescription_3": "管理系統中的<strong>角色</strong>和<strong>使用者</strong>。一個使用者可以擁有<strong>多個角色</strong>。",
"Landing_Page_IdentityModuleDescription_4": "設定角色和使用者層級的<strong>權限</strong>。",
"Landing_Page_IdentityModuleDescription_5": "啟用/停用每個使用者的<strong>兩因素身份驗證</strong>和使用者<strong>鎖定</strong>。",
"Landing_Page_IdentityModuleDescription_6": "管理基本<strong>使用者設定檔</strong>和<strong>密碼</strong>。",
"Landing_Page_IdentityModuleDescription_7": "管理系統中的<strong>聲明類型</strong>,為角色和使用者設定聲明。",
"Landing_Page_IdentityModuleDescription_8": "設定頁面來管理<strong>密碼複雜性</strong>、使用者登入、帳戶和鎖定。",
"Landing_Page_IdentityModuleDescription_9": "支援<strong>LDAP</strong>認證。",
"Landing_Page_IdentityModuleDescription_10": "提供<strong>電子郵件和電話號碼</strong>驗證。",
"Landing_Page_IdentityModuleDescription_11": "支援社交登入整合(Twitter、Facebook、GitHub 等)。",
"Landing_Page_IdentityModuleDescription_12": "管理系統中的<strong>組織單位</strong>。",
"Landing_Page_PaymentModuleDescription_1": "提供不同支付網關的整合。",
"Landing_Page_PaymentModuleDescription_2": "此模組提供支付網關的集成,因此您可以輕鬆地從客戶那裡獲得付款。",
"Landing_Page_PaymentModuleDescription_3": "此模組支援以下支付網關",
"Welcome_Page_UseSameCredentialForCommercialWebsites": "對<a href=\"https://commercial.abp.io\" class=\"text-primary\">Commercial.abp.io</a>和<a href=\"https://support.abp.io\" class=\"text-primary\">support.abp.io</a>使用相同的憑證。",
"WatchCrudPagesVideo": "觀看「使用 ABP Suite 建立 CRUD 頁面」影片!",
"WatchGeneratingFromDatabaseVideo": "觀看“ABP Suite:從現有資料庫表单產生 CRUD 頁面”影片!",
"WatchTakeCloserLookVideo": "觀看“仔細看看程式碼產生:ABP Suite”影片!",
"ConfirmedEmailAddressRequiredToStartTrial": "您應該有一個確認的電子郵件地址才能開始試用許可證。",
"EmailVerificationMailNotSent": "電子郵件驗證郵件無法傳送。",
"GetConfirmationEmail": "如果您之前沒有收到<a href=\"javascript:void(0);\" id=\"{0}\" class=\"text-decoration-underline\">驗證電子郵件,請按一下此處以取得驗證電子郵件</a>。",
"WhichLicenseTypeYouAreInterestedIn": "您對哪種許可證類型感興趣?",
"DontTakeOurWordForIt": "不要相信我們的話...",
"ReadAbpCommercialUsersWantYouToKnow": "閱讀 ABP Commercial 用戶想讓您了解的內容",
"Testimonial_ShortDescription_1": "ABP的模組化使得團隊及時交付成為可能。",
"Testimonial_ShortDescription_2": "比以前更快地建立新功能。",
"Testimonial_ShortDescription_3": "我們從開箱即用的功能開始,只專注於我們真正需要編寫的內容。",
"Testimonial_ShortDescription_4": "ABP Commercial 最適合我們的需求。",
"OnlineReviewersOnAbpCommercial": "ABP 商業線上評論",
"SeeWhatToldAboutAbpCommercial": "查看有關 ABP Commercial 的內容,並根據需要寫下您的想法。",
"ExtendPaymentInfoSection_DeveloperPrice": "{0}x 個額外開發者",
"ExtendPaymentInfoSection_DiscountRate": "折扣 {0}%",
"TotalNetPrice": "總淨價",
"EFCore": "實體框架核心",
"All": "全部",
"Mvc": "多維控制",
"DataBaseProvider": "數據提供者",
"UIFramework": "使用者介面框架",
"LeptonXThemeForDashboard": "您的管理儀表板的 LeptonX 主題",
"AbpPlatform": "總部基地平台",
"YouDeserveGoodUXUI": "您值得擁有良好的使用者介面和更好的使用者體驗。 ABP 的 LeptonX 主題就是為它服務的。",
"ViewLiveDemo": "查看即時主題演示",
"GetLeptonX": "立即取得 LeptonX",
"SeeLeptonXDocumentation": "請參閱 LeptonX 文檔",
"SeeLeptonDocumentation": "請參閱輕子文檔",
"SimplifiedMenu": "簡化選單",
"SimplifiedMenuDescription": "您可以透過篩選選單輕鬆找到您要找的頁面",
"YourFavoritePages": "您最喜歡的頁面觸手可及",
"YourFavoritePagesDescription": "透過點擊頁面右上角的星形圖標,可以輕鬆地從收藏夾中新增或刪除頁面。",
"BreadCrumbs": "用於無縫切換的麵包屑導航",
"BreadCrumbsDescription": "使用麵包屑,即使左側選單關閉,您也可以一鍵切換到相同等級的頁面,並且它適用於平板電腦和行動裝置回應!",
"YourMenu": "您的菜單如您所願",
"YourMenuDescription": "根據需要自訂使用者選單上可直接點選的圖示和下拉方塊。用戶選單可根據您的需求完全客製化",
"RtlSupport": "對您的語言的 RTL 支持",
"RtlSupportDescription": "LeptonX 主題支援您的語言的 RTL。語言選項位於設定選單中,供您更改語言。",
"YourColors": "您的管理儀表板 UI 上的顏色",
"YourColorsDescription": "LeptonX 主題根據您的系統偏好工作,並具有儀表板淺色主題、儀表板深色主題和儀表板半深色主題選項。",
"ArrangeContentWidth": "輕鬆安排內容寬度",
"ArrangeContentWidthDescription": "輕鬆變更內容區域的寬度。",
"LeptonXCompatibleWith": "LeptonX 主題相容",
"MobileResponsiveTemplate": "移動響應模板",
"MobileResponsiveTemplateDescription1": "從您喜歡的任何裝置存取您的 LeptonX 管理儀表板。",
"MobileResponsiveTemplateDescription2": "它專為您在您的每台設備上輕鬆使用而設計。它對行動裝置和平板電腦尺寸具有響應能力。",
"TopMenuLayoutOption": "頂部選單佈局選項",
"TopMenuLayoutOptionDescription1": "如果您想使用相同的管理儀表板設定您的網站,可以使用 LeptonX 主題來實現!",
"TopMenuLayoutOptionDescription2": "只需嘗試 LeptonX 頂部選單佈局即可實現這一目標!",
"EasilyCustomizable": "輕鬆客製化您的品牌顏色",
"EasilyCustomizableDescription1": "您只需使用幾個 SCSS 變數即可自訂 LeptonX 主題。無需覆蓋,無需額外的 CSS 負載!",
"EasilyCustomizableDescription2": "透過 LeptonX,您可以隨心所欲地安排管理儀表板。",
"IndependentLayout": "獨立的佈局和內容區域",
"IndependentLayoutDescription1": "LeptonX 的佈局基礎設施的設計與內容完全分開。",
"IndependentLayoutDescription2": "這意味著如果您願意,您可以使用 Bootstrap 以外的內容結構自由設計專案。",
"MostUsedLibraries": "最常用的庫與 LeptonX 集成",
"MostUsedLibrariesDescription1": "LeptonX 包含您最常用的函式庫。它允許您輕鬆使用 ApexCharts、DataTables、DropZone、FullCalender、JSTree、Select2 和 Toastr 等庫。",
"MostUsedLibrariesDescription2": "LeptonX 也支援 MVC Angular 和 Blazor 特定的函式庫。",
"CreateAndCustomize": "使用 LeptonX 自訂頁面在幾秒鐘內建立和自訂您需要的頁面",
"CreateAndCustomizeDescription": "透過使用 LeptonX 主題,您還可以存取許多預製的 HTML 頁面。其中包括許多頁面,例如登入頁面、部落格、常見問題、訂閱清單、發票、定價和文件管理。",
"LeptonThemeForAdmin": "您的管理儀表板的 Lepton 主題",
"LeptonThemeForAdminDescription": "Lepton 主題仍然可用並將得到維護。如果您想以 Lepton 主題使用者的身份切換到 LeptonX 主題,您可以查看文件以了解操作方法。",
"LeptonCompatibleWith": "Lepton 主題相容",
"UpgradePaymentInfoSection_DeveloperPrice": "{0}(另外 {1} 個開發者)",
"Upgrade": "升級",
"Renewal": "更新",
"UpgradePaymentInfoSection_LicensePrice": "{0}許可證",
"UpgradePaymentInfoSection_LicenseRenewalPrice": "執照更新",
"Total": "全部的",
"TotalDevelopers": "總共 {0} 個開發者",
"CustomPurchaseExplanation": "根據您的具體需求量身定制",
"WhereDidYouHearAboutUs": "你從哪裡知道我們的?",
"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 平台而不是從頭開始創建新的解決方案?",
"WhyUseAbpIoPlatformFaqExplanation": "請參閱<a href=\"/why-abp-io \">該頁面</a>,以詳細了解為什麼使用 ABP.IO 平台比自己做所有事情具有顯著優勢。",
"EulaPageTitle": "最終用戶許可協議 (EULA)",
"PrivacyPolicyPageTitle": "隱私權政策 - Cookie 政策",
"TermsConditionsPageTitle": "條款與條件",
"TrainingsPageTitle": "ABP 培訓包",
"ModulesPageTitle": "ABP 預建應用模組",
"Volo.AbpIo.Commercial:040001": "API 存取金鑰不正確。",
"GetLepton": "立即取得輕子",
"MyOrganizations_Detail_LicenseStartDate": "許可證開始日期",
"MyOrganizations_Detail_LicenseExpiryDate": "到期日",
"BlazoriseSupport": "如何從 Blazorise 團隊取得 Blazorise 授權金鑰和支援?",
"BlazoriseSupportExplanation": "請依照以下步驟取得 Blazorise 團隊的支援並取得您的 Blazorise 授權金鑰:",
"BlazoriseSupportExplanation1": "使用與您的 abp.io 帳戶相同的電子郵件地址在<a href=\"https://blazorise.com/support/register\">blazorise.com/support/register</a>註冊新帳戶。將「許可證密鑰」條目留空。<strong>它必須與您在 abp.io 上的電子郵件帳戶相同</strong>。",
"BlazoriseSupportExplanation2": "透過檢查您的電子郵件地址來驗證您的電子郵件地址。如果您在收件匣中沒有看到電子郵件,請檢查您的垃圾郵件匣!",
"BlazoriseSupportExplanation3": "登入 Blazorise 支援網站: <a href=\"https://blazorise.com/support/login\">blazorise.com/support/login</a> 。",
"BlazoriseSupportExplanation4": "如果您擁有有效的 ABP 商業許可證,您還將擁有 Blazorise PRO 授權。您可以在<a href=\"https://blazorise.com/support/user/manage/license\">blazorise.com/support/user/manage/license</a>取得 Blazorise 授權金鑰。",
"BlazoriseSupportExplanation5": "您可以在支援網站上發布您的問題並為您的應用程式產生產品代幣。",
"AbpLiveTrainingPackages": "ABP 現場培訓包",
"Releases": "發布",
"ReleasesDescription": "ABP商業發布日誌。",
"ReleaseDate": "發布日期",
"Labels": "標籤",
"PreRelease": "預發布",
"AllTypes": "所有類型",
"Enhancement": "強化",
"Bug": "漏洞",
"Feature": "特徵",
"AllUIs": "所有使用者介面",
"MVC": "多維控制",
"BlazorServer": "Blazor伺服器",
"MAUI": "模伊島",
"HowItWorks_Page_Title": "怎麼運作的?",
"HowItWorks_Page_Description": "ABP 架構擴充了.NET 平台。因此,使用普通 .NET 解決方案可以做的任何事情都可以透過 ABP 框架實現。這使得以較低的學習曲線輕鬆上手。",
"HowItWorks_Description1": "ABP 架構擴充了.NET 平台。因此,使用普通 .NET 解決方案可以做的任何事情都可以透過 ABP 框架實現。這使得以較低的學習曲線輕鬆上手。",
"HowItWorks_Description2": "一旦您開始學習和使用 ABP 框架功能,開發您的軟體將比以往更加愉快。",
"HowItWorks_Description3": "本頁主要解釋了作為 .NET 開發人員如何使用 ABP.IO 平台。",
"CreateANewSolution": "建立新的 .NET 解決方案",
"CreateANewSolution_Description1": "一切都從創建新的 ABP 整合 .NET 解決方案開始。",
"StartWithStartupTemplates": "啟動預先建置的<a href=\"/startup-templates\">啟動解決方案範本</a>之一",
"SimpleMonolithApplicationTemplate": "簡單的整體應用程式模板",
"LayeredApplicationTemplate": "分層應用模板",
"MicroserviceSolutionTemplate": "微服務解決方案模板",
"CreateEmptySolutionAndUseAbp": "或建立一個新的空 .NET 解決方案並自行安裝 ABP NuGet 和 NPM<a href=\"https://abp.io/packages\" target=\"_blank\">套件</a>。",
"CreatingSolutionWithMultipleOptions": "建立新解決方案時有多個使用者介面和資料庫選項。",
"UIFrameworkOptions": "UI 框架選項",
"DotnetSolutionWithoutDependency": "現在,您的本機電腦中有一個常規的 .NET 解決方案,不依賴雲端平台或外部服務。",
"CheckTheDocumentForDetails": "您可以查看<a href=\"{0}\" target=\"_blank\">{1}</a>文件以了解詳細資訊。",
"UIAndDatabaseIndependent": "ABP 可以與 .NET 支援的任何 UI 和任何資料庫提供者一起使用。 \n然而,這些 UI 和資料庫提供者是預先整合的並且有詳細記錄。",
"InstallAbpModules": "安裝 ABP 模組",
"DevelopYourSolution": "開發您的解決方案",
"DeployAnywhere": "隨處部署",
"InstallAbpModule_Description1": "ABP是一個模組化的應用程式開發框架。啟動解決方案範本已安裝了必要的模組。 \n但是您可能希望在解決方案中使用更多應用程式模組。",
"InstallAbpModule_Description2": "每個模組都由一些NuGet和NPM包組成,並有一個安裝文件。 <a href=\"/tools/suite\">ABP Suite</a>會自動完成大部分工作,然後您根據其文件手動配置或微調模組。",
"DevelopYourSolution_Description1": "ABP 的基礎設施透過自動化重複性工作並提供預先建置的基礎架構和應用程式<a href=\"https://abp.io/features\" target=\"_blank\">功能,</a>使您<b class=\"text-white\">能夠專注於自己的業務程式碼</b>。",
"DevelopYourSolution_Description2": "在下面的程式碼區塊中,您可以看到 ABP 框架如何無縫整合到您的程式碼中並自動為您執行重複性任務。",
"DevelopYourSolution_Description3": "即使在這個短代碼區塊中,ABP 也為您做了很多事情。",
"DevelopYourSolution_Description4": "它提供了應用約定的基類,例如\n<a href=\"https://docs.abp.io/en/abp/latest/Dependency-Injection\" target=\"_blank\">依賴注入</a>。通用\n<a href=\"https://docs.abp.io/en/abp/latest/Repositories\" target=\"_blank\">儲存庫</a>服務提供了一個方便的\n方式與資料庫互動。聲明式\n<a href=\"https://docs.abp.io/en/abp/latest/Authorization\" target=\"_blank\">授權</a>與微調的權限系統一起使用。",
"DevelopYourSolution_Description5": "ABP 完全自動化了\n<a href=\"https://docs.abp.io/en/abp/latest/Unit-Of-Work\" target=\"_blank\">工作單元</a>(用於資料庫連接和交易管理)、 \n<a href=\"https://docs.abp.io/en/abp/latest/Exception-Handling\" target=\"_blank\">異常處理</a>、 \n<a href=\"https://docs.abp.io/en/abp/latest/Validation\" target=\"_blank\">驗證</a>\n和<a href=\"https://docs.abp.io/en/abp/latest/Audit-Logging\" target=\"_blank\">審計日誌記錄</a>。它提供了更多構建塊來簡化您的日常開發任務並專注於您自己的程式碼,同時創建可用於生產的\n應用程式。",
"DevelopYourSolution_Description6": "您可以想像,如果您全部手動完成,該程式碼區塊會變得多麼長和複雜。",
"SuiteCrudGenerationInFewSeconds": "除了手動編碼解決方案之外,您還可以使用 ABP Suite 工具在幾分鐘內建立完全可用的高級 CRUD 頁面。它將程式碼產生到您的解決方案中,以便您可以根據您的自訂要求對其進行微調。",
"DeployAnywhere_Description1": "最終,您將擁有一個純 .NET 解決方案。您可以將解決方案部署到您自己的伺服器、雲端平台、Kubernetes 或您想要的任何地方。您可以根據需要部署到任意數量的伺服器。 ABP 是一個與部署環境無關的工具。",
"ExpertiseAbpFramework": "ABP 框架專業知識",
"ExpertiseAbpFramework_Description1": "想要超越基礎知識並獲得 ABP.IO 平台的專業知識嗎?",
"FreeDownload": "免費下載",
"Read": "讀",
"HavingTrouble": "遇到麻煩?",
"HavingTrouble_Description1": "您在開發解決方案時遇到問題嗎?我們在這裡!使用 ABP 支援平台\n或發送電子郵件直接從核心 ABP 框架團隊成員那裡獲取協助。",
"WeAreHereToHelp_Description1": "您可以瀏覽我們的說明主題或在常見問題、 \n中搜索,也可以使用聯絡表單向我們提問。",
"OtherModules": "其他模組",
"OtherModules_Description1": "帳戶、稽核日誌、聊天、CMS 套件、文件管理、表單、GDPR、身分、語言管理、付款、SaaS 等等...",
"HowItWorks_DatabaseProviderOptions": "資料庫提供者選項",
"SeeFAQ": "查看常見問題",
"ReleaseLogs": "發布日誌",
"ReleaseLogs_Tag": "{0} 發布日誌",
"ReleaseLogs_Pr": "拉取請求 #{0} - {1}",
"NoLabels": "無標籤",
"DoesTheSubscriptionRenewAutomatically": "許可會自動續費嗎?",
"DoesTheSubscriptionRenewAutomaticallyExplanation": "ABP 商業版沒有自動續費的計費模式。因此,在您的許可期結束時,<strong>您的訂閱將不會自動續訂</strong>。如果您希望繼續享受ABP商業版的服務,請在<a href=\"/my-organizations\">組織管理頁面</a>手動進行續費操作。如果您擁有多個組織,您可以點擊即將到期的組織上的\"管理\"按鈕,然後點擊\"立即續費\"按鈕來續訂您的許可。您還可以查看<a href=\"/faq#what-happens-when-license-ends\">許可到期後會發生什麼?</a>部分了解更多信息。",
"ExtraQuestionCreditsFaqTitle": "我可以購買額外的支援問題積分嗎?",
"ExtraQuestionCreditsFaqExplanation": "是的你可以。若要購買額外的問題積分,請發送電子郵件至<a href=\"mailto:info@abp.io\">info@abp.io</a> ,並註明您所在組織的名稱。以下是額外問題學分的價格表:<ul><li> 50 個問題包 999 美元</li><li>25 個問題包 625 美元</li><li>15 個問題包 450 美元</li></ul>",
"AlreadyBetaTester": "您已經加入了 Beta 測試員計劃。",
"AbpStudio": "總部基地工作室",
"AbpStudio_Description": "ABP Studio 仍在開發中。您可以填寫下面的表单,成為第一批使用者之一。",
"AbpStudio_Description1": "ABP Studio 是一款針對 ABP 開發人員的<span class=\"text-highlight-white\">跨平台桌面應用程式</span>。",
"AbpStudio_Description2": "它與 ABP 框架<span class=\"text-highlight-white\">很好地集成</span>,旨在透過<span class=\"text-highlight-white\">自動化為您提供一個舒適的開發環境,提供有關您的解決方案的見解</span>,使<span class=\"text-highlight-white\">開發、運行</span>和<span class=\"text-highlight-white\">部署</span>您的解決方案變得更加容易。",
"AbpStudio_ComingSoon": "即將推出<span class=\"opacity-50 ms-0 ms-md-3 d-block d-md-inline-block \">計劃測試版發布日期:2023 年第四季。</span>",
"AbpStudio_PlannedPreviewDate": "計畫預覽版發布日期:2023 年第四季。",
"BetaRequest": "測試版請求",
"CreateNewSolutions": "建立新的解決方案",
"CreateNewSolutions_Description1": "您可以透過多種選項輕鬆建立從簡單應用程式到模組化整體或微服務解決方案。您將獲得適合您企業的完整生產就緒基礎軟體解決方案。",
"ArchitectYourSolutions": "設計您的解決方案",
"ArchitectYourSolutions_Description1": "透過創建模組或服務並在它們之間建立關係,可以更輕鬆地建立整體模組化和微服務解決方案結構。您也可以安裝或解除安裝預先建置的應用程式模組。",
"ExploreYourSolution": "探索您的解決方案",
"ExploreYourSolution_Description1": "ABP Studio 顯示了解決方案中的元件以及解決方案所依賴的模組的高階視圖。您可以探索實體、服務、HTTP API 等,而無需開啟程式碼庫。",
"RunMultiApplicationOrMicroserviceSolutionsInABreeze": "輕鬆運行多應用程式或微服務解決方案",
"RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description1": "只需單擊即可運行一項、<span class=\"text-highlight-white\">多項</span>或<span class=\"text-highlight-white\">所有服務</span>。這樣,就可以輕易地停止一個服務,在 Visual Studio 中執行它來<span class=\"text-highlight-white\">測試</span>或<span class=\"text-highlight-white\">除錯</span>。",
"RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description2": "查看服務列表,查看每個服務的<span class=\"text-highlight-white\">即時 HTTP 請求</span>和<span class=\"text-highlight-white\">異常計數</span>。",
"RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description3": "查看傳入任何服務的所有<span class=\"text-highlight-white\">HTTP 請求</span>的所有詳細資訊。",
"RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description4": "在任何服務中即時探索<span class=\"text-highlight-white\">異常詳細信息</span>,輕鬆過濾和搜尋。",
"RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description5": "顯示<span class=\"text-highlight-white\">應用程式日誌</span>,按日誌等級過濾或按文字搜尋。",
"RunMultiApplicationOrMicroserviceSolutionsInABreeze_Description6": "無需離開解決方案運行器<span class=\"text-highlight-white\">即可瀏覽</span>應用程式的 UI。",
"IntegrateToYourKubernetesCluster": "整合到您的 Kubernetes 集群",
"IntegrateToYourKubernetesCluster_Description1": "<span class=\"text-highlight-white\">將本地開發環境連接到本地或遠端 Kubernetes 集群</span>,該集群已在其中運行您的微服務解決方案。",
"IntegrateToYourKubernetesCluster_Description2": "存取 Kubernetes 中的任何服務,其服務名稱為 DNS,就像它們在本機電腦中運作一樣。",
"IntegrateToYourKubernetesCluster_Description3": "<span class=\"text-highlight-white\">攔截該叢集中的任何服務</span>,因此<span class=\"text-highlight-white\">被攔截服務的所有流量都會自動重定向到本機電腦中執行的服務</span>。當您的服務需要使用 Kubernetes 中的任何服務時,流量會被重定向回集群,就像您的本機服務在 Kubernetes 內部運作一樣。",
"GetInformed": "獲取資訊",
"Studio_GetInformed_Description1": "留下您的聯絡訊息,以便在 ABP Studio 上線後第一時間<span class=\"text-highlight-white\">獲得通知</span>並<span class=\"text-highlight-white\">試用</span>。",
"Studio_GetInformed_Description2": "計畫預覽版發布日期:2023 年第三季。",
"ThankYou!": "謝謝你!",
"SendBetaRequest": "發送測試版請求",
"YouJoinedTheBetaTesterProgram": "您加入了 ABP Studio beta 測試員計畫。",
"PricingExplanation2": "30 天退款保證 —<a href=\"/faq#refund-policy\">了解更多</a>",
"MoneyBackGuaranteeText": "* 所有許可證均提供 30 天退款保證!團隊許可證 100% 退款,商業和企業許可證 30 天內退款 60%。",
"MobileApplicationStartupTemplates": "行動應用程式啟動模板",
"MobileApplicationStartupTemplates_Description1": "適用於您的 ABP 商業解決方案的整合式行動應用程式啟動範本。",
"CreatePowerfulLineOfBusinessApplicationsUsingABPMobileStartupTemplates": "使用 ABP 行動啟動範本建立強大的業務線應用程式",
"CreatePowerfulLineOfBusinessApplicationsUsingABPMobileStartupTemplates_Description1": "ABP Commercial 提供了兩個使用<span class=\"text-highlight\">React Native</span>和<span class=\"text-highlight\">.NET MAUI 實現的行動應用程式啟動範本。</span>當您建立新的基於 ABP 的解決方案時,您還將擁有連接到後端 API 的基本啟動應用程式。",
"CreatePowerfulLineOfBusinessApplicationsUsingABPMobileStartupTemplates_Description2": "該應用程式具有預先建置的身份驗證令牌週期、<span class=\"text-highlight\">多語言支援、多租戶支援、登入、忘記密碼、設定檔管理和使用者管理頁面</span>。您可以新增自己的業務邏輯並根據您的需求進行自訂。",
"TwoFrameworkOptions": "兩種框架選項",
"TwoFrameworkOptions_Description": "ABP 提供了<span class=\"text-highlight\">React Native</span>和<span class=\"text-highlight\">.NET MAUI</span>行動啟動範本。這樣,您就可以選擇最適合您需求的需求。這兩個應用程式的程式碼重用率在 iOS 和 Android 平台之間最高。",
"PreIntegratedToYourBackend": "預先整合到您的後端",
"PreIntegratedToYourBackend_Description": "ABP Mobile 應用程式已預先整合到您的後端 API。它從伺服器取得有效的身份驗證令牌並發出經過身份驗證的請求。",
"MultiLanguage": "多語言",
"MultiLanguage_Description": "它已經支援 10 多種開箱即用的語言。您也可以新增下一種語言。",
"Arabic": "阿拉伯",
"Czech": "捷克語",
"English": "英語",
"Hungarian": "匈牙利",
"Finnish": "芬蘭",
"French": "法語",
"Hindi": "印地語",
"Portuguese": "葡萄牙語",
"Italian": "義大利語",
"Russian": "俄文",
"Slovak": "斯洛伐克語",
"Turkish": "土耳其",
"EngageAndRetainYourCustomersWithABPMobileApps": "使用 ABP 行動應用程式吸引並留住客戶",
"EngageAndRetainYourCustomersWithABPMobileApps_Description1": "您的客戶希望隨時隨地管理他們的產品和訂閱。這需要組織創建行動應用程序,使客戶能夠快速、無縫地滿足他們的請求。",
"EngageAndRetainYourCustomersWithABPMobileApps_Description2": "透過 ABP Mobile 應用程序,您可以使用單一程式碼庫為 Android 和 iOS 創建高品質的本機行動應用程序,並且不會影響安全性、品質或可擴展性。",
"OneCodeBaseMultipleDevices": "一種程式碼庫支援多種設備",
"OneCodeBaseMultipleDevices_Description": "ABP Mobile 應用程式是跨平台的。它們可以在 iOS 和 Android 裝置上安裝和運行,並使用單一程式碼庫適應不同的外形尺寸。開發人員只需建立一次 UI 和前端程式碼,無需針對要支援的每個裝置調整程式碼。",
"ComesWithTheSourceCode": "附帶原始碼",
"ComesWithTheSourceCode_Description": "行動應用程式隨原始程式碼一起提供。輕鬆自訂應用程式的 UX/UI,以滿足品牌指南。",
"Purchase_OneYearPrice": "1 年價格",
"Purchase_DeveloperSeatCount": "開發者席位數",
"Purchase_DevelopersAlreadyIncluded": "已包含 {0} 個開發者",
"1Year": "1年",
"{0}Years": "{0} 年",
"1YearLicense": "1 年許可證",
"{0}YearsLicense": "{0} 年許可",
"1AdditionalDeveloper": "1 名額外開發人員",
"{0}AdditionalDevelopers": "{0} 其他開發者",
"Discount": "折扣 ({0}%)",
"Summary": "概括",
"TrainingPack": "訓練包",
"TrainingPackDiscount": "培訓包折扣",
"Purchase_OnboardingTraining_Description": "此現場培訓套餐適用於 8 名學生的班級,且此折扣僅在使用新許可證購買時有效。<a href=\"{0}\" class=\"text-white\">了解更多<i class=\"fa fa-external-link ms-1\"></i></a>",
"Purchase_Save": "<span class=\"save ms-1\">省 {0}% {1} {2}</span>",
"RemoveBasket": "從購物籃中取出",
"WhyABPIOPlatform?": "為什麼選擇<span class=\"gradient-commercial\">ABP.IO平台</span>?",
"DocumentAim": "本文檔旨在回答一個大問題:",
"DocumentAim_Description": "“為什麼應該使用 ABP.IO 平台而不是從頭開始創建新的解決方案?”",
"DocumentAim_Description2": "該文件介紹了建立現代軟體解決方案的挑戰,並解釋了 ABP 如何應對這些挑戰。",
"CreatingANewSolution": "建立新的解決方案",
"CreatingANewSolution_Description": "當您需要開始一個新的解決方案時,您需要問自己很多問題,並且在開始編寫第一個業務程式碼之前您應該花費大量時間。",
"CreatingAnEmptySolution": "創建一個空的解決方案",
"THEPROBLEM": "問題",
"CreatingAnEmptySolution_THEPROBLEM_Description": "即使創建一個幾乎空的解決方案也是具有挑戰性的;",
"CreatingAnEmptySolution_THEPROBLEM_Description2": "您如何跨專案組織程式碼庫?",
"CreatingAnEmptySolution_THEPROBLEM_Description3": "有哪些層以及它們如何相互作用?",
"CreatingAnEmptySolution_THEPROBLEM_Description4": "如何整合到第三方函式庫和系統?",
"CreatingAnEmptySolution_THEPROBLEM_Description5": "如何設定自動化測試?",
"ABPSOLUTION": "動態血壓解決方案",
"CreatingAnEmptySolution_ABPSOLUTION_Description": "ABP 基於<a href=\"https://docs.abp.io/en/abp/latest/Domain-Driven-Design\" target=\"_blank\">領域驅動設計</a>原則提供了一個架構良好、分層且可用於生產的<a href=\"https://docs.abp.io/en/abp/latest/Startup-Templates/Application\" target=\"_blank\">啟動解決方案</a>。該解決方案還包括每個層的預先配置單元和整合<a href=\"https://docs.abp.io/en/abp/latest/Testing\" target=\"_blank\">測試</a>項目。",
"CommonLibraries": "通用函式庫",
"CommonLibraries_THEPROBLEM_Description": "您應該使用哪些函式庫來實現常見需求?軟體開發生態系統是高度動態的,這使得跟上最新的工具、函式庫、趨勢和方法變得具有挑戰性。",
"CommonLibraries_ABPSOLUTION_Description": "ABP 將流行的、成熟的和最新的庫預先整合到解決方案中。您不需要花時間整合它們或使它們相互溝通。它們開箱即用,可以正常工作。",
"UITheme&Layout": "使用者介面主題和佈局",
"UITheme&Layout_THEPROBLEM_Description": "在解決 UI 問題時,會出現一系列挑戰。其中包括為響應式、現代且適應性強的 UI 套件奠定基礎,該套件具有一致的外觀和導航選單、頁首、工具列、頁腳、小部件等一系列功能。",
"UITheme&Layout_THEPROBLEM_Description2": "即使您選擇預先設計的主題,將其無縫整合到您的專案中也可能需要數天的開發時間。另一個障礙在於升級此類主題。通常,主題的 HTML/CSS 結構會與您的 UI 程式碼交織在一起,從而呈現未來的主題變更或升級複雜的任務。程式碼和設計的這種交織使後續調整的靈活性變得複雜。",
"UITheme&Layout_ABPSOLUTION_Description": "ABP 框架提供了一個獨特的主題系統,可以將您的 UI 程式碼從主題約束中解放出來。主題獨立存在,包裝為 NuGet 或 NPM 套件,使主題安裝或升級只需幾分鐘。雖然您保留開發自訂主題或整合現有主題的選項,但 ABP Commercial 提供了一系列精緻且現代的主題。",
"UITheme&Layout_ABPSOLUTION_Description2": "此外,還有 Telerik 和 DevExpress 等 UI 元件提供者。然而,這些提供者主要提供單獨的元件,讓您有責任建立自己的佈局系統。在基於 ABP 的專案中工作時,您可以無縫合併這些庫,就像在任何其他專案中一樣。",
"TestInfrastructure": "測試基礎設施",
"TestInfrastructure_THEPROBLEM_Description": "建立強大的測試環境是一項耗時的工作。它涉及在解決方案中設置專用測試項目,仔細選擇必要的工具,創建服務和資料庫模擬,製作必要的基類和實用服務以最大限度地減少測試中的冗餘程式碼,以及解決各種相關任務。",
"TestInfrastructure_ABPSOLUTION_Description": "ABP 啟動範本預先配備了已設定的測試項目,可為您簡化流程。這意味著從第一天起,您就可以立即開始編寫初始單元或整合測試程式碼。",
"CodingStandards&Training": "編碼標準和培訓",
"CodingStandards&Training_THEPROBLEM_Description": "設定開發解決方案後,您通常必須教導開發人員系統如何運作以及如何使用相同的商定方法來建構它。即使您為他們提供培訓,保持文件最新也可能很困難。隨著時間的推移,每個開發人員可能會以自己的方式編寫程式碼,導致編寫程式碼的規則變得彼此不同。",
"CodingStandards&Training_ABPSOLUTION_Description": "ABP 解決方案已經組織得很整齊,並且有明確的解釋。逐步教學和指南向您準確展示如何處理 ABP 專案。",
"KeepingYourSolutionUpToDate": "讓您的解決方案保持最新",
"KeepingYourSolutionUpToDate_THEPROBLEM_Description": "開始開發後,您必須追蹤用於升級和補丁的庫的新版本。",
"KeepingYourSolutionUpToDate_ABPSOLUTION_Description": "我們定期將所有軟體包更新到最新版本,並在穩定版本發布之前對其進行測試。當您更新 ABP 框架時,其所有相依性都會升級為邊緣技術。",
"DRY": "不要重複自己!",
"DRY_Description": "創建基礎解決方案需要大量時間並且需要良好的架構經驗。然而,這只是開始!當您開始開發時,您可能需要編寫大量重複的程式碼;如果所有這些都能自動處理,那就太好了。",
"DRY_Description2": "ABP 透過遵循約定優於配置的原則,盡可能地自動化和簡化重複程式碼。但是,當您需要切換到手排時,它不會限制您。控制權始終掌握在您手中。",
"Authentication": "驗證",
"Authentication_THEPROBLEM_Description": "單一登入、Active Directory / LDAP 整合、OpenIddict 整合、社群登入、雙重認證、忘記/重設密碼、電子郵件啟動、新使用者註冊、密碼複雜性控制、嘗試失敗時鎖定帳戶、顯示失敗的登入嘗試...等等。我們知道您對所有這些通用要求都很熟悉。你並不孤單!",
"Authentication_ABPSOLUTION_Description": "ABP 框架和商業版本提供了所有這些預先實現的標準內容作為可重複使用的帳戶模組。您只需啟用並配置您需要的內容即可。",
"CrossCuttingConcerns": "跨領域的關注點",
"CrossCuttingConcerns_THEPROBLEM_Description": "橫切關注點是應該為每個用例實現的基本重複邏輯。一些例子;",
"CrossCuttingConcerns_THEPROBLEM_Description2": "啟動事務,成功時提交,錯誤時回滾。",
"CrossCuttingConcerns_THEPROBLEM_Description3": "處理和報告異常,向客戶端傳回正確的錯誤回應並在客戶端處理錯誤情況。",
"CrossCuttingConcerns_THEPROBLEM_Description4": "實現授權和驗證,返回正確的回應並在客戶端處理這些回應。",
"CrossCuttingConcerns_ABPSOLUTION_Description": "ABP 框架自動化或簡化了所有常見的橫切關注點。您只需編寫對您的業務重要的程式碼,ABP 將按照慣例處理其餘部分。",
"ArchitecturalInfrastructure": "建築基礎設施",
"ArchitecturalInfrastructure_THEPROBLEM_Description": "您通常需要建立基礎架構才能正確實施您的架構。例如,您通常實作儲存庫模式。您定義一些基底類別來簡化和標準化建立實體、服務、控制器和其他物件。",
"ArchitecturalInfrastructure_ABPSOLUTION_Description": "ABP 框架提供了所有這些以及更多開箱即用的功能。它是成熟的並且有充分的記錄。",
"EnterpriseApplicationRequirements": "企業應用需求",
"EnterpriseApplicationRequirements_THEPROBLEM_Description": "在每個業務應用中都有很多需求需要重複實現;",
"EnterpriseApplicationRequirements_THEPROBLEM_Description2": "細緻的權限體系,依照角色和使用者對UI進行權限管理。",
"EnterpriseApplicationRequirements_THEPROBLEM_Description3": "寫入審核日誌和實體歷史記錄以追蹤使用者何時修改資料庫記錄。",
"EnterpriseApplicationRequirements_THEPROBLEM_Description4": "對您的實體進行軟刪除,以便將它們標記為已刪除,而不是從資料庫中物理刪除並在查詢中自動過濾已刪除的實體。",
"EnterpriseApplicationRequirements_THEPROBLEM_Description5": "建立抽象和包裝器以從前端程式碼使用後端 API。",
"EnterpriseApplicationRequirements_THEPROBLEM_Description6": "排隊並執行後台作業。",
"EnterpriseApplicationRequirements_THEPROBLEM_Description7": "處理全球系統中的多個時區。",
"EnterpriseApplicationRequirements_THEPROBLEM_Description8": "在伺服器和用戶端之間共用驗證、本地化、授權邏輯。",
"EnterpriseApplicationRequirements_ABPSOLUTION_Description": "ABP 提供了一個基礎設施來輕鬆實現此類需求。同樣,您不必花費寶貴的時間一次又一次地重新實現所有這些。",
"GeneratingInitialCode&Tooling": "產生初始程式碼和工具",
"GeneratingInitialCode&Tooling_THEPROBLEM_Description": "您將在典型的 Web 應用程式中建立許多類似的頁面。他們中的大多數都會執行類似的 CRUD 操作。重複建立這樣的頁面非常繁瑣,而且容易出錯。",
"GeneratingInitialCode&Tooling_ABPSOLUTION_Description": "<a href=\"/tools/suite\">ABP Suite</a>可以在幾秒鐘內為您的實體產生全端 CRUD 頁面。產生的程式碼是分層且乾淨的。所有標準驗證和授權要求均已實施。另外,也會產生單元測試類別。一旦獲得完全運行的頁面,您可以根據您的業務需求進行修改。",
"IntegratingTo3rdPartyLibrariesAndSystems": "整合到第三方函式庫和系統",
"IntegratingTo3rdPartyLibrariesAndSystems_THEPROBLEM_Description": "大多數庫都被設計為低級別,您通常會做一些工作來正確整合它們,而無需在解決方案中的各處重複相同的整合和配置程式碼。例如,假設您必須使用 RabbitMQ 來實現分散式事件匯流排。你想做的就是;將訊息傳送到佇列並處理傳入的訊息。但您需要了解訊息傳遞模式、佇列和交換細節。要編寫高效的程式碼,您必須建立一個池來管理連線、客戶端和通道。您還必須處理異常、ACK 訊息、失敗時重新連線到 RabbitMQ 等。",
"IntegratingTo3rdPartyLibrariesAndSystems_ABPSOLUTION_Description": "例如,ABP 的 RabbitMQ 分散式事件匯流排整合抽象化了所有這些細節。您可以輕鬆地發送和接收訊息。您需要編寫低階程式碼嗎?沒問題,您隨時都可以這樣做。當您需要使用正在使用的庫的低階功能時,ABP 不會限制您。",
"WhyNotBuildYourOwnFramework?": "為什麼不建構自己的框架?",
"WhyNotBuildYourOwnFramework_THEPROBLEM_Description": "所有基礎設施,即使是最簡單的方式,也需要花費大量時間來建造、維護和記錄。隨著時間的推移,它會變得越來越大,並且很難在解決方案中維護它。將它們分離成可重複使用的專案是建立您自己的內部框架的起點。",
"WhyNotBuildYourOwnFramework_THEPROBLEM_Description2": "建置、記錄、培訓和維護內部框架確實很困難。如果您沒有經驗豐富的專門框架團隊,您的內部框架很快就會變成無人能理解和維護的未記錄的遺留程式碼。另一方面,這些框架一般是由團隊中的一、兩個開發人員所開發的。這些人正在成為知識孤島。這對他們有利,但對公司不利,因為他們是專案的單點故障<a href=\"https://en.wikipedia.org/wiki/Single_point_of_failure\">-SPOF-</a> 。一旦他們離開公司,專案就會急劇下降。",
"WhyNotBuildYourOwnFramework_ABPSOLUTION_Description": "ABP框架是一個社群驅動的、文件齊全、成熟且通用的應用程式框架。由經驗豐富的開發人員組成的團隊正在努力使其保持最新、易於理解和舒適使用。使用這樣一個穩定的框架可以讓您專注於自己的業務程式碼,並在需要時獲得專家的框架協助。",
"ArchitecturalInfrastructure_Description": "SaaS 應用程式、模組化或微服務系統是最常用的企業軟體模式。建構這樣的系統不僅需要良好的理解和經驗,還需要強大的軟體基礎設施。否則,您會發現自己花費了大量精力來支援程式碼庫中的這些架構細節。",
"Modularity": "模組化",
"Modularity_THEPROBLEM_Description": "要建立真正的模組化系統並不容易!系統的所有方面(資料庫、實體、API、UI 頁面/元件)都可以拆分為模組,並且每個模組都可以重複使用,無需其他模組。普通的 ASP.NET Core 並不會提供這樣的模組化架構。如果你需要的話,你應該從頭開始考慮。",
"Modularity_ABPSOLUTION_Description": "ABP框架天生就是一個模組化的應用程式開發結構。框架中的每個功能都是為了與模組化相容而開發的。文件和指南解釋如何以標準方式開發可重複使用模組。",
"SaaSMultiTenancy": "SaaS/多租戶",
"SaaSMultiTenancy_THEPROBLEM_Description": "<a href=\"https://docs.abp.io/en/abp/latest/Multi-Tenancy\">多租戶</a>是實施 SaaS 系統的常用方法。然而,實施一致的多租戶基礎設施可能會變得複雜。",
"SaaSMultiTenancy_ABPSOLUTION_Description": "ABP 框架提供了完整的多租戶基礎設施,並從業務程式碼中抽像出複雜性。您的應用程式程式碼將主要是多租戶感知的,而 ABP 框架會自動將資料庫、快取和租戶的其他詳細資訊相互隔離。它支援單一資料庫、每個租戶資料庫和混合方法。它正確配置了 Microsoft Identity 和 OpenIddict 等程式庫,這些程式庫通常不相容於多租用戶。",
"Microservices": "微服務",
"Microservices_THEPROBLEM_Description": "建構微服務系統需要許多基礎設施細節:對應用程式和微服務進行身份驗證和授權以及在微服務之間實現非同步訊息傳遞和同步(Rest/GRPC)通訊模式是最基本的問題。",
"Microservices_ABPSOLUTION_Description": "ABP 框架提供服務、<a href=\"https://docs.abp.io/en/abp/latest/Microservice-Architecture\" target=\"_blank\">指南</a>和範例,協助您使用業界標準工具實施微服務解決方案。",
"Microservices_ABPSOLUTION_Description2": "ABP Commercial 甚至更進一步,提供了一個完整的<a href=\"https://docs.abp.io/en/commercial/latest/startup-templates/microservice/index\" target=\"_blank\">啟動範本</a>來啟動您的微服務解決方案。",
"PreBuiltModules": "預建模區塊",
"PreBuiltModules_THEPROBLEM_Description": "我們所有人都有相似但略有不同的業務需求。然而,我們都應該重新發明輪子,因為沒有人的程式碼可以直接在我們的解決方案中工作。它們都是更大解決方案的嵌入部分。",
"PreBuiltModules_ABPSOLUTION_Description": "ABP Commercial<a href=\"/modules\">模組</a>提供了大量可重複使用的應用模組,例如付款、聊天、檔案管理、稽核日誌報告等。所有這些模組都可以輕鬆安裝到您的解決方案中並直接運行。我們不斷添加更多模組。",
"PreBuiltModules_ABPSOLUTION_Description2": "所有模組均設計為可根據您的業務需求進行客製化。如果您需要完全控制,您可以下載任何模組的完整原始程式碼,並根據您的特定業務需求進行完全自訂。",
"ABPCommunity": "總部社區",
"ABPCommunity_Description": "最後,在一個每個人都遵循相似的編碼風格和原則並共享通用基礎設施的大社區中,當您遇到麻煩或需要設計決策幫助時,這會帶來力量。由於我們編寫的程式碼相似,因此我們可以更好地互相幫助。 ABP 是一個社區支持的項目,在 GitHub 上擁有超過 10K star。",
"ABPCommunity_Description2": "在 ABP 開發人員之間共用程式碼甚至可重複使用的程式庫很容易。適合您的程式碼片段也適用於其他人。有很多範例和教程,您可以直接為您的應用程式實現。",
"ABPCommunity_Description3": "當您聘請曾經使用過 ABP 架構的開發人員時,他會立即了解您的解決方案並在很短的時間內開始開發。",
"WhyAbpIo_Page_Title": "為什麼選擇ABP.IO平台?",
"AbpStudio_Page_Title": "總部基地工作室",
"CampaignInfo": "購買新許可證或續訂現有許可證即可<span class=\"text-white\">獲得額外 2 個月的有效期,</span>無需額外費用!此優惠對所有許可計劃均有效。確保您利用此限時促銷來擴大對高級功能和升級的存取範圍。",
"HurryUpLastDay": "趕快!最後一天:{0}",
"CreatingCRUDPagesWithABPSuite": "使用 ABP Suite 建立 CRUD 頁面",
"Testimonials": "感言",
"MultipleYearDiscount": "多年折扣",
"CampaignDiscountText": "黑色星期五折扣",
"CampaignDiscountName": "黑色星期五",
"CampaignName:BlackFriday": "黑色星期五",
"WhatHappensWhenLicenseEnds": "當我的許可期限結束時會發生什麼?",
"WhatHappensWhenLicenseEndsExplanation1": "ABP 商業許可是<a href=\"{0}\" target=\"_blank\">永久許可</a>。許可證到期後,您可以繼續開發您的項目。而且您沒有義務更新您的許可證。您的許可證附帶開箱即用的一年更新和支持計劃。為了繼續獲得新功能、性能增強、錯誤修復、支持和繼續使用 ABP Suite,您需要更新您的許可證。當您的許可證到期時;",
"WhatHappensWhenLicenseEndsExplanation2": "您無法使用 ABP Commercial 創建新的解決方案,但您可以永遠繼續開發現有的應用程序。",
@ -407,8 +1075,6 @@
"WhatHappensWhenLicenseEndsExplanation5": "您不能使用 ABP 套件。",
"WhatHappensWhenLicenseEndsExplanation6": "您無法再獲得<a href=\"{0}\">高級支持</a>。",
"WhatHappensWhenLicenseEndsExplanation7": "如果您想繼續獲得這些好處,您可以延長(更新)您的許可證。如果您在許可到期後 <strong>{3} 天</strong> 內延長許可,將應用以下折扣:團隊許可 {0};營業執照{1};企業許可證{2}。",
"DoesTheSubscriptionRenewAutomatically": "許可會自動續費嗎?",
"DoesTheSubscriptionRenewAutomaticallyExplanation": "ABP 商業版沒有自動續費的計費模式。因此,在您的許可期結束時,<strong>您的訂閱將不會自動續訂</strong>。如果您希望繼續享受ABP商業版的服務,請在<a href=\"/my-organizations\">組織管理頁面</a>手動進行續費操作。如果您擁有多個組織,您可以點擊即將到期的組織上的\"管理\"按鈕,然後點擊\"立即續費\"按鈕來續訂您的許可。您還可以查看<a href=\"/faq#what-happens-when-license-ends\">許可到期後會發生什麼?</a>部分了解更多信息。",
"MultipleOrganizationInfo": "查看您的所有組織",
"PaymentFailedInfo": "抱歉,支付失败!",
"UsedPayment": "该付款已被使用"

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

@ -2,259 +2,259 @@
"culture": "zh-Hans",
"texts": {
"Permission:CommunityPost": "社区文章",
"Permission:Edit": "修改",
"Waiting": "等待",
"Approved": "批准",
"Rejected": "拒绝",
"Permission:Edit": "编辑",
"Waiting": "等待",
"Approved": "批准",
"Rejected": "拒绝",
"Wait": "等待",
"Approve": "批准",
"Reject": "拒绝",
"ReadPost": "阅读文章",
"Status": "状态",
"ContentSource": "内容来源",
"Details": "详",
"Details": "详细信息",
"Title": "标题",
"CreationTime": "创建时间",
"Save": "保存",
"SameUrlAlreadyExist": "url已存在,如果你想要添加这篇文章,你需要更改url!",
"UrlIsNotValid": "Url无效.",
"UrlNotFound": "Url未找到.",
"UrlContentNotFound": "Url内容未找到.",
"SameUrlAlreadyExist": "相同的网址已经存在,如果您想添加这个文章,应该更改网址!",
"UrlIsNotValid": "Url 无效。",
"UrlNotFound": "未找到 Url。",
"UrlContentNotFound": "未找到 Url 内容。",
"Summary": "摘要",
"MostRead": "阅读最多",
"MostRead": "最多阅读",
"Latest": "最新",
"ContributeAbpCommunity": "为ABP社区做贡献",
"SubmitYourPost": "提交的文章",
"ContributeAbpCommunity": "为 ABP 社区做贡献",
"SubmitYourPost": "提交的文章",
"ContributionGuide": "贡献指南",
"BugReport": "Bug报告",
"SeeAllPosts": "查看所有文章",
"WelcomeToABP": "欢迎来到ABP",
"EmailNotValid": "请输入有效的电子邮箱地址.",
"BugReport": "错误报告",
"SeeAllPosts": "查看所有文章",
"WelcomeToABP": "欢迎来到 ABP",
"EmailNotValid": "请输入有效的电子邮件地址。",
"FeatureRequest": "功能请求",
"CreatePostTitleInfo": "文章标题显示在文章列表中.",
"CreatePostSummaryInfo": "文章的简短摘要将显示在文章列表中.",
"CreatePostCoverInfo": "要创建一个有效的帖子,需要添加封面图片. 上传16:9的图片获取最佳视觉效果. 文件最大支持: 1MB",
"ThisExtensionIsNotAllowed": "不允许此扩展名.",
"TheFileIsTooLarge": "文件过大.",
"GoToThePost": "转到文章",
"GoToTheVideo": "前往视频",
"Contribute": "贡献",
"OverallProgress": "总体流程",
"Done": "完成",
"Open": "开",
"CreatePostTitleInfo": "文章列表中要显示的文章标题。",
"CreatePostSummaryInfo": "文章的简短摘要,将显示在文章列表中。最大长度:<b>{0}</b",
"CreatePostCoverInfo": "为创建有效的文章,请添加封面照片。上传 16:9 宽高比的图片以获得最佳浏览效果:<b>1MB。",
"ThisExtensionIsNotAllowed": "不允许延期。",
"TheFileIsTooLarge": "文件太大。",
"GoToThePost": "前往文章",
"GoToTheVideo": "观看视频",
"Contribute": "投稿",
"OverallProgress": "总体进展",
"Done": "完成",
"Open": "开",
"Closed": "关闭",
"RecentQuestionFrom": "最近的问题来自 {0}",
"RecentQuestionFrom": "{0}最近提出的问题",
"Stackoverflow": "Stackoverflow",
"Votes": "数",
"Votes": "观看次数",
"Answer": "回答",
"Views": "观看次数",
"Views": "视图",
"Answered": "已回答",
"WaitingForYourAnswer": "等待你的回答",
"WaitingForYourAnswer": "等待您的答复",
"Asked": "提问",
"AllQuestions": "所有问题",
"NextVersion": "下一",
"MilestoneErrorMessage": "无法从Github获取当前的里程碑详细信息.",
"QuestionItemErrorMessage": "无法从Stackoverflow获取最新的问题详细信息.",
"Oops": "哎呀!",
"CreatePostSuccessMessage": "文章提交成功. 网站管理员审核通过后将被发布.",
"AllQuestions": "所有问题",
"NextVersion": "下一版",
"MilestoneErrorMessage": "无法从 Github 获取当前里程碑的详细信息。",
"QuestionItemErrorMessage": "无法从 Stackoverflow 获取最新问题的详细信息。",
"Oops": "哎呀",
"CreatePostSuccessMessage": "文章已成功提交。网站管理员审核后将予以发布。",
"Browse": "浏览",
"CoverImage": "封面图片",
"ShareYourExperiencesWithTheABPFramework": "分享你的ABP Framework经验!",
"Optional": "可选",
"UpdateUserWebSiteInfo": "示例: https://johndoe.com",
"UpdateUserTwitterInfo": "示例: johndoe",
"UpdateUserGithubInfo": "示例: johndoe",
"UpdateUserLinkedinInfo": "示例: https://www.linkedin.com/...",
"UpdateUserCompanyInfo": "示例v: Volosoft",
"UpdateUserJobTitleInfo": "示例: Software Developer",
"ShareYourExperiencesWithTheABPFramework": "分享您使用 ABP 框架的经验!",
"Optional": "可选",
"UpdateUserWebSiteInfo": "例如:https://johndoe.com",
"UpdateUserTwitterInfo": "示例johndoe",
"UpdateUserGithubInfo": "示例johndoe",
"UpdateUserLinkedinInfo": "例如: https://www.linkedin.com/...",
"UpdateUserCompanyInfo": "示例Volosoft",
"UpdateUserJobTitleInfo": "例如:软件开发人员软件开发人员",
"UserName": "用户名",
"Company": "公司",
"Company": "公司名称",
"PersonalWebsite": "个人网站",
"RegistrationDate": "注册时间",
"Social": "社",
"Biography": "传记",
"RegistrationDate": "注册日期",
"Social": "社",
"Biography": "简历",
"HasNoPublishedPostsYet": "尚未发表文章",
"Author": "作者",
"LatestGithubAnnouncements": "最新的Github公告",
"LatestGithubAnnouncements": "最新 Github 公告",
"SeeAllAnnouncements": "查看所有公告",
"LatestBlogPost": "最新博客文章",
"Edit": "修改",
"ProfileImageChange": "更改资料图片",
"BlogItemErrorMessage": "无法从ABP获取最新的博客文章详细信息.",
"Edit": "编辑",
"ProfileImageChange": "更改个人形象",
"BlogItemErrorMessage": "无法从 ABP 获取最新博文的详细信息。",
"PlannedReleaseDate": "计划发布日期",
"CommunityPostRequestErrorMessage": "无法从Github获取最新的文章请求.",
"PostRequestFromGithubIssue": "现在没有任何文章请求.",
"LatestPosts": "最新的帖子",
"ArticleRequests": "文章请求",
"ArticleRequestsDescription": "想在这里查看具体内容吗? 您可以要求社区创建它!",
"LatestContentRequests": "最新内容请",
"AllPostRequests": "查看所有文章请求",
"SubscribeToTheNewsletter": "订阅讯",
"NewsletterEmailDefinition": "获取有关ABP发生的信息,例如新版本,免费资源,文章等.",
"NoThanks": "不用了,谢谢",
"MaybeLater": "以后再说",
"JoinOurPostNewsletter": "加入我们的文章简讯",
"CommunityPostRequestErrorMessage": "无法从 Github 获取最新的发布请求。",
"PostRequestFromGithubIssue": "现在没有任何职位请求。",
"LatestPosts": "最新文章",
"ArticleRequests": "申请内容",
"ArticleRequestsDescription": "想在这里看到特定内容?您可以要求社区创建!",
"LatestContentRequests": "最新内容请",
"AllPostRequests": "查看所有职位申请",
"SubscribeToTheNewsletter": "订阅时事通讯",
"NewsletterEmailDefinition": "获取有关 ABP 发生的信息,如新版本、免费资源、文章等。",
"NoThanks": "不,谢谢",
"MaybeLater": "也许以后",
"JoinOurPostNewsletter": "加入我们的邮政通讯",
"Community": "社区",
"Marketing": "营销",
"CommunityPrivacyPolicyConfirmation": "我同意条款和条件以及<a href=\"https://commercial.abp.io/Privacy\">隐私政策</a>.",
"PostRequestMessageTitle": "<a href=\"https://github.com/abpframework/abp/issues/new\">在GitHub上创建一个Issue</a>,以请求你要在此网站上查看的文章/教程.",
"PostRequestMessageBody": "在这里,是社区请求的文章列表. 您要写一篇要求的文章吗? 请单击该请求并加入讨论.",
"Marketing": "市场营销",
"CommunityPrivacyPolicyConfirmation": "我同意条款和条件以及 <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">隐私政策</a>",
"PostRequestMessageTitle": "<a href=\"https://github.com/abpframework/abp/issues/new\">在 GitHub 上打开一个问题</a>,申请您希望在本网站上看到的文章/教程。",
"PostRequestMessageBody": "以下是社区要求撰写的文章列表。您想撰写要求发表的文章吗?请点击请求并加入讨论。",
"Language": "语言",
"CreatePostLanguageInfo": "本文所用的语言",
"CreatePostLanguageInfo": "文章内容的语言。",
"VideoPost": "视频",
"Post": "文章",
"Post": "职位",
"Read": "阅读",
"CreateGithubPostUrlInfo": "文章的原始GitHub链接.",
"CreateVideoContentUrlInfo": "文章的原始Youtube链接.",
"CreateExternalPostUrlInfo": "文的原始外部网址",
"VideoContentForm": "视频内容来源",
"GithubPostForm": "Github文章来源",
"ExternalPostForm": "外部文章来源",
"HowToPost": "如何发布",
"Posts": "文章",
"VideoUrl": "视频Url",
"GithubPostUrl": "Github文章Url",
"ExternalPostUrl": "外部文章Url",
"ThankYouForContribution": "感谢你对ABP社区的贡献",
"GithubPost": "Github文章",
"GithubPostSubmitStepOne": "<span class=\"font-weight-bold\">1.</span> 用Markdown格式在GitHub的任何公共存储库上写一篇文章. <a target=\"_blank\" href=\"https://github.com/abpframework/abp/blob/dev/docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md\">示例</a>",
"GithubPostSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span> 使用表单提交你的文章URL.",
"GithubPostSubmitStepThree": "<span class=\"font-weight-bold\">3.</span> 你的文章将在这个网站中呈现.",
"YoutubeVideo": "Youtube视频",
"YoutubeVideoSubmitStepOne": "<span class=\"font-weight-bold\">1.</span> 在YouTube上发布你的视频.",
"YoutubeVideoSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span> 使用表单提交视频URL.",
"YoutubeVideoSubmitStepThree": "<span class=\"font-weight-bold\">3.</span> 访客将能够在这个网站上直接观看你的视频内容.",
"CreateGithubPostUrlInfo": "GitHub 上 Markdown 文件的完整 URL(<a href=\"https://github.com/abpframework/abp/blob/dev/docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md\" target=\"blank\">示例</a>)。",
"CreateVideoContentUrlInfo": "文章的原始 Youtube URL。",
"CreateExternalPostUrlInfo": "文的原始外部网址",
"VideoContentForm": "在 YouTube 上提交视频",
"GithubPostForm": "在 GitHub 上提交文章",
"ExternalPostForm": "提交外部内容",
"HowToPost": "如何发布",
"Posts": "职位",
"VideoUrl": "视频网址",
"GithubPostUrl": "GitHub 发布网址",
"ExternalPostUrl": "外部链接",
"ThankYouForContribution": "感谢您为 ABP 社区做出贡献。",
"GithubPost": "GitHub 发布",
"GithubPostSubmitStepOne": "<span class=\"font-weight-bold\">1.</span>使用 Markdown 格式在任何公共 GitHub 仓库上撰写文章。<a target=\"_blank\" class=\"fw-6 text-white text-decoration-underline\" href=\"https://github.com/abpframework/abp/blob/dev/docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md\">示例</a>",
"GithubPostSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span>使用表单提交您的文章 URL。",
"GithubPostSubmitStepThree": "<span class=\"font-weight-bold\">3.</span>您的文章将在本网站显示。",
"YoutubeVideo": "Youtube 视频",
"YoutubeVideoSubmitStepOne": "<span class=\"font-weight-bold\">1.</span>在 YouTube 上发布视频。",
"YoutubeVideoSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span>使用表单提交视频 URL。",
"YoutubeVideoSubmitStepThree": "<span class=\"font-weight-bold\">3.</span>访问者可以直接在本网站上观看您的视频内容。",
"ExternalContent": "外部内容",
"ExternalContentSubmitStepOne": "<span class=\"font-weight-bold\">1.</span> 在任何公开的平台创建内容(medium, 你自己的博客或者任何你喜欢的).",
"ExternalContentSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span> 使用表单提交内容URL.",
"ExternalContentSubmitStepThree": "<span class=\"font-weight-bold\">3.</span> 访客被重定向到原网站的内容.",
"ChooseYourContentType": "请选择你想要添加内容的方式",
"PostContentViaGithub": "我想要使用<span class=\"font-weight-bold\"><i class=\"fa fa-github\"></i> GitHub</span>提交markdown格式的文章",
"PostContentViaYoutube": "我想要分享我在<span class=\"font-weight-bold\"><i class=\"fa fa-youtube\"></i> Youtube</span>的可用视频",
"PostContentViaExternalSource": "我想要添加我在<span class=\"font-weight-bold\">其他平台</span>发布的内容",
"GitHubUserNameValidationMessage": "您的Github用户名不能包含空格, 请确认你的Github用户名是正确的.",
"PersonalSiteUrlValidationMessage": "你的个人网站URL不能包含空格, 请确定你的个人网站URL是正确的.",
"TwitterUserNameValidationMessage": "你的Twitter用户名不能包含空格, 请确认你的Twitter用户名是正确的.",
"LinkedinUrlValidationMessage": "你的领英URL不能包含空格, 请确认你的领英URL是正确的",
"NoPostsFound": "没有发现帖子",
"SearchInPosts": "搜索帖子…",
"ExternalContentSubmitStepOne": "<span class=\"font-weight-bold\">1.</span>在任何公共平台(Medium、你自己的博客或任何你喜欢的地方)上创建内容。",
"ExternalContentSubmitStepTwo": "<span class=\"font-weight-bold\">2.</span>使用表单提交您的内容 URL。",
"ExternalContentSubmitStepThree": "<span class=\"font-weight-bold\">3.</span>访问者会被重定向到原始网站的内容。",
"ChooseYourContentType": "请选择添加内容的方式",
"PostContentViaGithub": "我想根据标记符规则,用 <span class=\"icon-with-text-github\"> GitHub</span> 添加我的文章。",
"PostContentViaYoutube": "我想在这里分享我在 <span class=\"icon-with-text-youtube\"> Youtube</span> 上提供的视频。",
"PostContentViaExternalSource": "我想在这里添加我在<b>另一个平台</b>上发布的内容。",
"GitHubUserNameValidationMessage": "您的 Github 用户名不能包含空格,请确保您的 Github 用户名正确无误。",
"PersonalSiteUrlValidationMessage": "您的个人网站 URL 不能包含空格,请确保您的个人网站 URL 正确无误。",
"TwitterUserNameValidationMessage": "您的 Twitter 用户名不能包含空格,请确保您的 Twitter 用户名正确无误。",
"LinkedinUrlValidationMessage": "您的 Linkedin URL 不能包含空格,请确保您的 Linkedin URL 正确无误。",
"NoPostsFound": "未找到文章!",
"SearchInPosts": "在文章中搜索...",
"MinimumSearchContent": "您必须输入至少 3 个字符!",
"Volo.AbpIo.Domain:060001": "源 URL(\"{PostUrl}\") 不是 Github URL",
"Volo.AbpIo.Domain:060002": "文章内容无法从 Github(\"{PostUrl}\") 资源中获得。",
"Volo.AbpIo.Domain:060003": "没有找到文章内容!",
"Volo.AbpIo.Domain:060002": "Github(\"{PostUrl}\") 资源中没有文章内容。",
"Volo.AbpIo.Domain:060003": "找到文章内容!",
"SeeMore": "查看更多",
"JoinTheABPCommunity": "加入 ABP 社区",
"ABPCommunityTalks": "ABP 社区会谈",
"LiveDemo": "现场演示",
"GetLicense": "获许可证",
"GetStarted": "开始使用",
"ABPCommunityTalks": "ABP 社区讲座",
"LiveDemo": "在线演示",
"GetLicense": "获许可证",
"GetStarted": "开始",
"SourceCode": "源代码",
"LeaveComment": "发表评论",
"ShowMore": "示更多",
"NoPublishedPostsYet": "还没有发布的帖子。",
"Name": "名",
"ShowMore": "示更多",
"NoPublishedPostsYet": "尚未发表文章。",
"Name": "名",
"Surname": "姓氏",
"WebSite": "网站",
"FullURL": "完整网址",
"JobTitle": "职称",
"JobTitle": "职位名称",
"Prev": "上一页",
"Previous": "前面的",
"Previous": "上一页",
"Next": "下一页",
"Share": "分享",
"SortBy": "排序方式",
"NoPublishedEventsYet": "尚未发布活动。",
"SubscribeYoutubeChannel": "订阅 Youtube 频道",
"Enum:EventType:0": "会谈",
"MemberNotPublishedPostYet": "该成员尚未发布任何帖子。",
"TimeAgo": "{0} 前",
"MemberNotPublishedPostYet": "该成员尚未发表任何文章。",
"TimeAgo": "{0}前",
"Discord_Page_JoinCommunityMessage": "加入 ABP Discord 社区",
"Discord_Page_Announce": "我们很高兴地宣布 ABP 社区 Discord 服务器!",
"Discord_Page_Description_1": "ABP 社区从第一天起就一直在壮大。 我们希望通过创建一个官方的 ABP Discord 服务器将其带入下一步,这样 ABP 社区就可以使用即时消息的功能彼此进行互动。",
"Discord_Page_Description_2": "ABP Community Discord Server 是您可以使用 ABP 框架来展示您的创作、分享对您有用的技巧、了解有关 ABP 框架的最新消息和公告、与社区成员聊天交流想法并玩得开心的地方!",
"Discord_Page_Description_3": "此 ABP 社区 Discord 服务器是 ABP 核心团队的官方服务器,存在于服务器上进行监控。",
"Discord_Page_Description_1": "ABP 社区从第一天起就一直在成长。我们希望通过创建一个官方 ABP Discord 服务器,让 ABP 社区可以利用即时信息的奇妙功能进行互动,从而更上一层楼。",
"Discord_Page_Description_2": "ABP 社区 Discord 服务器是您展示使用 ABP 框架创作的作品、分享对您有用的技巧、了解有关 ABP 框架的最新新闻和公告、与社区成员聊天以交流想法并享受乐趣的地方!",
"Discord_Page_Description_3": "这个 ABP 社区 Discord 服务器是官方服务器,ABP 核心团队会在服务器上进行监控。",
"Discord_Page_JoinToServer": "加入 ABP Discord 服务器",
"Events_Page_MetaTitle": "ABP 社区活动",
"Events_Page_MetaDescription": "现场活动由 ABP 团队主持,是充满社区内容、演示、问答和围绕 ABP 正在发生的事情的讨论的休闲会议。",
"Events_Page_Title": "ABP<span class=\"gradient-community\">社区</span>会谈",
"Members_Page_WritingFromUser": "阅读来自 ABP 社区的 {0} 的文章。",
"Post_Create_Page_MetaTitle": "最新帖子",
"Post_Create_Page_MetaDescription": "创建您的帖子以分享您对 ABP 框架的经验并为 ABP 社区做出贡献。",
"Post_Create_Page_CreateNewPost": "创建新帖子",
"Post_Index_Page_MetaDescription": "ABP 社区的目的是为使用 ABP 框架的开发人员创建一个贡献环境。",
"Layout_Title": "{0} | ABP 社区",
"Layout_MetaDescription": "ABP 社区是一个人们可以分享有关 ABP 框架的帖子并关注项目的环境。",
"Index_Page_CommunityIntroduction": "这是 ABP 框架、.NET 和软件开发的中心。 您可以阅读文章,观看视频教程,了解 ABP 的开发进度和 ABP 相关事件,帮助其他开发人员并与 ABP 社区分享您的专业知识。",
"Events_Page_MetaDescription": "现场表演由 ABP 团队主持,是充满社区内容、演示、问答和围绕 ABP 发生的事情进行讨论的休闲会议。",
"Events_Page_Title": "ABP<span class=\"gradient-community\"> 社区</span>讲座",
"Members_Page_WritingFromUser": "从 ABP Community 上的 {0} 读写。",
"Post_Create_Page_MetaTitle": "新职位",
"Post_Create_Page_MetaDescription": "创建您的文章,分享您关于 ABP 框架的经验并为 ABP 社区做出贡献。",
"Post_Create_Page_CreateNewPost": "创建新职位",
"Post_Index_Page_MetaDescription": "ABP 社区的宗旨是为使用 ABP 框架的开发人员创建一个贡献环境。",
"Layout_Title": "{0}| ABP 社区",
"Layout_MetaDescription": "ABP Framework、.NET 和软件开发的中心。访问文章、教程、新闻,并为 ABP 社区做出贡献。",
"Index_Page_CommunityIntroduction": "这里是 ABP 框架、.NET 和软件开发的中心。您可以阅读文章、观看视频教程、了解 ABP 的开发进度和 ABP 相关活动、帮助其他开发人员并与 ABP 社区分享您的专业知识。",
"TagsInArticle": "文章中的标签",
"IConsentToMedium": "我同意在 https://medium.com/volosoft 上发布这篇文章。",
"SearchResultsFor": " span class=\"fw-bold\">\"{0}\"</span>的搜索结果",
"IConsentToMedium": "我同意在 https://medium.com/volosoft 上发表此文。",
"SearchResultsFor": "<span class=\"fw-bold\">\"{0}\"</span>的搜索结果",
"SeeMoreVideos": "查看更多视频",
"DiscordPageTitle": "ABP Discord社区",
"DiscordPageTitle": "ABP Discord 社区",
"ViewVideo": "观看视频",
"AbpCommunityTitleContent": "ABP 社区 - 开源 ABP 框架",
"CommunitySlogan": "一个独特的<span class=\"d-inline-block d-md-block gradient-community\">ABP 爱好者</span>社区平台",
"AbpCommunityTitleContent": "ABP 社区 - 开 ABP 框架",
"CommunitySlogan": "<span class=\"d-inline-block d-md-block gradient-community\">ABP 爱好者的独特社区平台</span",
"RaffleIsNotActive": "抽奖未激活",
"YouAreAlreadyJoinedToThisRaffle": "您已经参加了本次抽奖",
"YouAreAlreadyJoinedToThisRaffle": "您已加入抽奖活动",
"InvalidSubscriptionCode": "订阅代码无效",
"Raffle:{0}": "抽奖:{0}",
"Join": "加入",
"Raffle:{0}": "抽奖:{0",
"Join": "加入我们",
"Leave": "离开",
"LoginToJoin": "登录加入",
"ToEnd:": "结束:",
"ToStart:": "开始",
"days": "天",
"hrs": "小时",
"ToStart:": "开始",
"days": "天",
"hrs": "rs",
"min": "分钟",
"sec": "秒",
"sec": "秒",
"Winners": "获奖者",
"To{0}LuckyWinners": "致 {0} 位幸运获奖者",
"ActiveRaffles": "活跃的<span class=\"gradient-community\">莱佛士</span>",
"UpcomingRaffles": "即将开业的<span class=\"gradient-community\">莱佛士酒店</span>",
"CompletedRaffles": "<span class=\"gradient-community\">莱佛士</span>竣工",
"NoActiveRaffleTitle": "目前没有有效的抽奖活动。",
"NoActiveRaffleDescription": "目前没有有效的抽奖活动。",
"RaffleSubscriptionCodeInputMessage": "本次抽奖需要注册码。请输入以下注册码:",
"RaffleSubscriptionCodeInputErrorMessage": "注册码不正确。请再试一次。",
"GoodJob!": "好工作!",
"RaffleJoinSuccessMessage": "您已成功注册参加抽奖。如果您获奖,我们将通过电子邮件通知您!",
"RaffleLoginAndRegisterMessage": "您应该登录才能参加抽奖。如果您尚未注册,可以免费创建一个帐户。",
"To{0}LuckyWinners": "赠送给 {0} 名幸运获奖者",
"ActiveRaffles": "活跃的 <span class=\"gradient-community\">来抽奖</span",
"UpcomingRaffles": "即将推出的 <span class=\"gradient-community\">抽奖</span",
"CompletedRaffles": "已完成 <span class=\"gradient-community\">抽奖</span",
"NoActiveRaffleTitle": "目前没有正在进行的抽奖活动。",
"NoActiveRaffleDescription": "目前没有正在进行的抽奖活动。",
"RaffleSubscriptionCodeInputMessage": "本次抽奖需要注册码。请在下面输入注册码:",
"RaffleSubscriptionCodeInputErrorMessage": "注册码不正确。请重试。",
"GoodJob!": "干得好",
"RaffleJoinSuccessMessage": "您已成功注册抽奖活动。如果您中奖,我们将通过电子邮件通知您!",
"RaffleLoginAndRegisterMessage": "您应该登录才能参加抽奖。如果您还没有注册,可以免费创建一个账户。",
"Ok": "好的",
"SeeDetails": "查看具体信息",
"WaitingForTheDraw": "等待抽",
"SeeDetails": "查看详情",
"WaitingForTheDraw": "等待抽",
"AllAttendees": "所有与会者",
"SeeRaffleDetail": "查看抽奖详情",
"SeeRaffle": "查看抽奖活动",
"ParticipationIsComplete!": "参与完毕!",
"ABPCoreDevelopmentTeam": "ABP核心开发团队",
"SeeRaffle": "参见抽奖",
"ParticipationIsComplete!": "参与已完成!",
"ABPCoreDevelopmentTeam": "ABP 核心开发团队",
"RegisterTheEvent": "注册活动",
"GoToConferencePage": "进入会议页面",
"BuyTicket": "票",
"SeeEvent": "看活动",
"PreviousEvents": "<span class=\"text-secondary\">往届</span>活动",
"GoToConferencePage": "转至会议页面",
"BuyTicket": "票",
"SeeEvent": "看活动",
"PreviousEvents": "<span class=\"text-secondary\">以前的</span>活动",
"OtherLiveEvents": "其他现场活动",
"SponsoredConferences": "赞助会议",
"SponsoredConferencesDescription": "我们很荣幸为软件开发人员支持 .NET 社区和活动。",
"SponsoredConferencesDescription": "我们很荣幸能为软件开发人员的 .NET 社区和活动提供支持。",
"UpcomingEvents": "<span class=\"text-info\">即将举行的</span>活动",
"UpcomingCommunityTalkEventDescription": "现场表演由 ABP 团队主持,是休闲会议,充满社区内容、演示、问答以及围绕 ABP 发生的事情的讨论。",
"UpcomingConferenceEventDescription": "ABP .NET 会议是 .NET 开发人员社区聚集在一起聆听有关 .NET 世界、常见软件开发实践和开源 ABP 框架的讨论的虚拟活动。",
"LastOneYear": "过去 1 年",
"AllTimes": "一直",
"TopContributors": "杰出贡献者",
"{0}Posts": "{0} 条帖子",
"LATESTPOSTS": "最新帖子",
"NoContributorsFound": "未找到贡献者!",
"LatestPost": "最新的帖子",
"MEMBERSINCE{0}": "自 {0} 起成为会员",
"UpcomingCommunityTalkEventDescription": "现场表演由 ABP 团队主持,是充满社区内容、演示、问答和围绕 ABP 发生的事情进行讨论的休闲会议。",
"UpcomingConferenceEventDescription": "ABP .NET 会议是.NET 开发人员社区的一次虚拟活动,他们可以齐聚一堂,聆听有关 .NET 世界、常用软件开发实践和开源 ABP 框架的讲座。",
"LastOneYear": "最近 1 年",
"AllTimes": "所有时间",
"TopContributors": "顶级贡献者",
"{0}Posts": "{0}职位",
"LATESTPOSTS": "最新文章",
"NoContributorsFound": "未找到撰稿人!",
"LatestPost": "最新职位",
"MEMBERSINCE{0}": "成员,因为{0}",
"CopyLink": "复制链接",
"ShareOnTwitter": "分享到Twitter",
"ShareOnLinkedIn": "在领英上分享",
"MoreFrom{0}": "来自{0}的更多内容",
"SeeAllFrom{0}": "查看来自{0}的全部内容",
"ShareOnTwitter": "在 Twitter 上分享",
"ShareOnLinkedIn": "在 LinkedIn 上分享",
"MoreFrom{0}": "来自 {0} 的更多信息",
"SeeAllFrom{0}": "查看来自 {0} 的所有内容",
"MostWatched": "最受关注",
"Articles({0})": "文章 ({0})",
"Videos({0})": "视频 ({0})",
"LatestArticles": "最新文章",
"RaffleHeader": "ABP 社区成员您好!",
"RafflesInfo": "<br>这是抽奖页面,旨在表达我们对您作为活跃社区成员的感谢。我们举办<a target=\"_blank\" class=\"fw-6 \" href=\"https://community.abp.io/events\">ABP 社区讲座</a><a target=\"_blank\" class=\"fw-6\" href=\"https://abp.io/conference/2023\">、ABP .NET 会议</a>、参加或赞助 .NET 相关活动,并在活动中赠送一些礼物。<br><br>您可以关注此页面查看即将举行的抽奖活动、参加抽奖活动或查看我们之前抽奖的抽奖活动(包括获奖者)。<br><br>感谢您成为活跃会员!在即将到来的抽奖活动中再见。",
"RafflesInfoTitle": "ABP 社区<span class=\"gradient-community\">莱佛士</span>"
"LatestArticles": "最新文章",
"RaffleHeader": "你好,ABP 社区成员!",
"RafflesInfo": "<br>这是一个抽奖页面,旨在感谢您成为活跃的社区成员。我们举办 <a target=\"_blank\" class=\"fw-6 \" href=\"https://community.abp.io/events\">ABP 社区讲座</a> <a target=\"_blank\" class=\"fw-6\" href=\"https://abp.io/conference/2023\">、ABP .NET 会议</a>,参加或赞助与 .NET 相关的活动,并在活动中赠送一些礼品。<br><br>您可以关注此页面,查看即将举行的抽奖活动、参加这些活动或查看我们以前举行的抽奖活动(包括获奖者)。<br><br>感谢您成为我们的活跃成员!在即将举行的抽奖活动中再见。",
"RafflesInfoTitle": "ABP 社区<span class=\"gradient-community\">来抽奖</span"
}
}

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

@ -3,7 +3,7 @@
"texts": {
"Buy": "购买",
"SeeBookDetails": "查看书籍详情",
"MasteringAbpFrameworkEBookDescription": "本书将帮助您全面了解框架和现代 Web 应用程序开发技术。",
"Feedback": "反馈"
"MasteringAbpFrameworkEBookDescription": "本书将帮助你全面了解框架和现代Web应用程序开发技术。",
"Feedback": "反馈意见"
}
}

2
abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hans.json

@ -1,6 +1,6 @@
{
"culture": "zh-Hans",
"texts": {
"FAQ": "常问题"
"FAQ": "常问题"
}
}

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

@ -3,60 +3,60 @@
"texts": {
"GetStarted": "开始",
"Create": "创建",
"NewProject": "新工程",
"NewProject": "新项目",
"DirectDownload": "直接下载",
"ProjectName": "项目名称",
"ProjectType": "项目类型",
"DatabaseProvider": "数据库提供者",
"DatabaseManagementSystem": "数据库管理系统",
"NTier": "N层",
"IncludeUserInterface": "包含用户界面",
"CreateNow": "现在创建",
"NTier": "N 层",
"IncludeUserInterface": "包括UI",
"CreateNow": "立即创建",
"TheStartupProject": "启动项目",
"Tutorial": "教程",
"UsingCLI": "使用CLI",
"SeeDetails": "见详细",
"AbpShortDescription": "ABP Framework 是一个完整的基础架构,用于创建基于 ASP.NET Core 平台的现代架构软件解决方案。",
"UsingCLI": "使用 CLI",
"SeeDetails": "查看详情",
"AbpShortDescription": "ABP Framework 是一个完整的基础架构,用于创建基于 ASP.NET Core 平台的现代架构软件解决方案。",
"SourceCodeUpper": "源代码",
"LatestReleaseLogs": "最新发布日志",
"Infrastructure": "基础设施",
"Architecture": "架构",
"Modular": "模块化",
"DontRepeatYourself": "不要重复工作",
"DeveloperFocused": "专注于开发者",
"FullStackApplicationInfrastructure": "全栈应用程序基础设施",
"DontRepeatYourself": "不要重复自己",
"DeveloperFocused": "以开发人员为重点",
"FullStackApplicationInfrastructure": "全栈应用程序基础设施",
"DomainDrivenDesign": "领域驱动设计",
"DomainDrivenDesignExplanation": "根据DDD模式和准则进行设计和开发. 为你的应用程序提供分层模型.",
"DomainDrivenDesignExplanation": "基于 DDD 模式和原则进行设计和开发。为您的应用程序提供分层模型。",
"Authorization": "授权",
"AuthorizationExplanation": "具有用户,角色和细粒度权限系统的高级授权. 建立在Microsoft Identity库上.",
"AuthorizationExplanation": "通过用户、角色和细粒度权限系统实现高级授权。基于Microsoft Identity。",
"MultiTenancy": "多租户",
"MultiTenancyExplanationShort": "SaaS应用程序变得简单! 从数据库到UI的多租户集成.",
"CrossCuttingConcerns": "横切关注点",
"CrossCuttingConcernsExplanationShort": "完整的基础架构,用于授权,验证,异常处理,缓存,审计日志记录,事务管理等.",
"BuiltInBundlingMinification": "内置Bundling & Minification",
"BuiltInBundlingMinificationExplanation": "无需使用外部工具进行Bundling & Minification. ABP提供了一种更简单,动态,功能强大,模块化和内置的方式!",
"MultiTenancyExplanationShort": "SaaS 应用程序变得简单!从数据库到UI都集成了多租户功能。",
"CrossCuttingConcerns": "横向关注问题",
"CrossCuttingConcernsExplanationShort": "用于授权、验证、异常处理、缓存、审计日志、事务管理等的完整基础设施。",
"BuiltInBundlingMinification": "内置捆绑 & 压缩功能",
"BuiltInBundlingMinificationExplanation": "无需使用外部工具进行捆绑和缩减。ABP 提供了一种更简单、动态、强大、模块化和内置的方式!",
"VirtualFileSystem": "虚拟文件系统",
"VirtualFileSystemExplanation": "将视图,脚本,样式,图像...嵌入到包/库中,并在不同的应用程序中重复使用.",
"VirtualFileSystemExplanation": "将视图、脚本、样式、图片......嵌入到包/库中,并在不同的应用程序中重用。",
"Theming": "主题",
"ThemingExplanationShort": "使用和定制基于bootstrap的标准UI主题,或创建自己的主题.",
"BootstrapTagHelpersDynamicForms": "Bootstrap Tag Helpers和动态表单",
"BootstrapTagHelpersDynamicFormsExplanation": "与其手动重复编写Bootstrap的组件,不如使用ABP的Tag Helpers利用智能感知来简化它. 动态表单可以从C#类创建完整的表单.",
"HTTPAPIsDynamicProxies": "HTTP APIs和动态代理",
"HTTPAPIsDynamicProxiesExplanation": "自动将应用程序服务公开为REST样式的HTTP API,并与动态JavaScript和C#代理一起使用.",
"CompleteArchitectureInfo": "现代架构用来创建可维护的软件解决方案.",
"DomainDrivenDesignBasedLayeringModelExplanation": "帮助你实现基于DDD的分层架构并构建可维护的代码库.",
"DomainDrivenDesignBasedLayeringModelExplanationCont": "提供启动模板,抽象,基类,服务,文档和指南以帮助你开发基于DDD模式和准则的应用程序.",
"MicroserviceCompatibleModelExplanation": "核心框架和预构建模块在设计时就考虑了微服务架构.",
"MicroserviceCompatibleModelExplanationCont": "提供基础结构,集成,示例和文档,以更轻松地实现微服务解决方案,而如果你要使用整体应用程序,也不会带来额外的复杂性.",
"ModularInfo": "ABP提供了完整的模块化系统,使你能够开发可重复使用的应用程序模块.",
"PreBuiltModulesThemes": "预建模块和主题",
"PreBuiltModulesThemesExplanation": "开源和商业模块和主题已准备好在你的业务应用程序中使用.",
"NuGetNPMPackages": "NuGet和NPM包",
"NuGetNPMPackagesExplanation": "作为NuGet和NPM包分发.易于安装和升级.",
"ThemingExplanationShort": "使用并定制基于Bootstrap的标准UI主题,或创建自己的主题。",
"BootstrapTagHelpersDynamicForms": "Bootstrap Tag helpers和动态表单",
"BootstrapTagHelpersDynamicFormsExplanation": "与其手动编写Bootstrap的重复细节,不如使用 ABP 的Tag helpers来简化这些细节并利用智能提示功能。使用动态表单Tag helpers,基于 C# 模型快速创建 UI 表单。",
"HTTPAPIsDynamicProxies": "HTTP API 和动态代理",
"HTTPAPIsDynamicProxiesExplanation": "自动将应用服务公开为 REST 风格的 HTTP API,并通过动态 JavaScript 和 C# 代理来使用它们。",
"CompleteArchitectureInfo": "创建可维护软件解决方案的现代架构。",
"DomainDrivenDesignBasedLayeringModelExplanation": "帮助实施基于 DDD 的分层架构,并建立可维护的代码库。",
"DomainDrivenDesignBasedLayeringModelExplanationCont": "提供启动模板、抽象概念、基类、服务、文档和指南,帮助您根据 DDD 模式和原则开发应用程序。",
"MicroserviceCompatibleModelExplanation": "核心框架和预建模块的设计考虑到了微服务架构。",
"MicroserviceCompatibleModelExplanationCont": "提供基础架构、集成、示例和文档,让您更轻松地实施微服务解决方案,同时,如果您想要单体应用程序,它也不会带来额外的复杂性。",
"ModularInfo": "ABP 提供了一个模块系统,使您能够开发可重用的应用程序模块,与应用程序生命周期事件相联系,并表达系统核心部分之间的依赖关系。",
"PreBuiltModulesThemes": "预建模块和主题",
"PreBuiltModulesThemesExplanation": "开放源代码和商业模块及主题可随时用于您的业务应用程序。",
"NuGetNPMPackages": "NuGet NPM 包",
"NuGetNPMPackagesExplanation": "以 NuGet 和 NPM 包的形式发布。易于安装和升级。",
"ExtensibleReplaceable": "可扩展/可替换",
"ExtensibleReplaceableExplanation": "所有服务和模块在设计时都考虑了可扩展性.您可以替换服务,页面,样式,组件...",
"CrossCuttingConcernsExplanation2": "保持代码整洁,专注于你自己的业务代码.",
"CrossCuttingConcernsExplanation3": "不要浪费时间一次又一次地实现通用的应用程序要求.",
"ExtensibleReplaceableExplanation": "所有服务和模块的设计都考虑到了可扩展性。您可以更换服务、页面、样式和组件。",
"CrossCuttingConcernsExplanation2": "保持较小的代码库,这样您就可以将精力集中在业务专用代码上。",
"CrossCuttingConcernsExplanation3": "不要花时间在多个项目上实施共同的应用要求。",
"AuthenticationAuthorization": "认证与授权",
"ExceptionHandling": "异常处理",
"Validation": "验证",
@ -66,379 +66,379 @@
"Caching": "缓存",
"Multitenancy": "多租户",
"DataFiltering": "数据过滤",
"ConventionOverConfiguration": "约定于配置",
"ConventionOverConfigurationExplanation": "默认情况下,ABP使用最小或零配置实现通用的应用程序约定.",
"ConventionOverConfigurationExplanationList1": "自动注册已知服务以进行依赖项注入.",
"ConventionOverConfigurationExplanationList2": "通过命名约定将应用程序服务公开为HTTP API.",
"ConventionOverConfigurationExplanationList3": "为C#和JavaScript创建动态HTTP客户端代理.",
"ConventionOverConfigurationExplanationList4": "为您的实体提供默认仓储库.",
"ConventionOverConfigurationExplanationList5": "根据Web请求或应用程序服务方法管理工作单元.",
"ConventionOverConfigurationExplanationList6": "为实体发布创建,更新和删除事件.",
"ConventionOverConfiguration": "约定于配置",
"ConventionOverConfigurationExplanation": "ABP 在默认情况下只需进行最小的配置或零配置即可实现常用的应用程序约定。",
"ConventionOverConfigurationExplanationList1": "自动将已知服务注册为依赖注入。",
"ConventionOverConfigurationExplanationList2": "通过命名约定将应用服务公开为 HTTP API。",
"ConventionOverConfigurationExplanationList3": "为 C# 和 JavaScript 创建动态 HTTP 客户端代理。",
"ConventionOverConfigurationExplanationList4": "为实体提供默认仓储。",
"ConventionOverConfigurationExplanationList5": "管理每个网络请求或应用服务方法的工作单元。",
"ConventionOverConfigurationExplanationList6": "为实体发布创建、更新和删除事件。",
"BaseClasses": "基类",
"BaseClassesExplanation": "通用应用程序模式的预构建基类.",
"DeveloperFocusedExplanation": "ABP是为了开发者",
"DeveloperFocusedExplanationCont": "它旨在简化你的日常软件开发,同时又不限制你在需要时进行底层工作。",
"BaseClassesExplanation": "为常见应用模式预置基类。",
"DeveloperFocusedExplanation": "ABP 适用于开发人员。",
"DeveloperFocusedExplanationCont": "它旨在简化您的日常软件开发,同时又不限制你在需要时进行底层工作。",
"SeeAllFeatures": "查看所有功能",
"CLI_CommandLineInterface": "CLI (命令行界面)",
"CLI_CommandLineInterfaceExplanation": "CLI会自动创建新项目并将模块添加到你的应用程序.",
"CLI_CommandLineInterface": "CLI(命令行界面)",
"CLI_CommandLineInterfaceExplanation": "包括 CLI,可帮助您自动创建新项目和添加新模块。",
"StartupTemplates": "启动模板",
"StartupTemplatesExplanation": "各种启动模板为你提供了完整配置的解决方案,以快速启动你的开发.",
"StartupTemplatesExplanation": "ABP 的应用程序启动模板提供了一个全面配置的解决方案,可帮助您快速启动开发。",
"BasedOnFamiliarTools": "基于熟悉的工具",
"BasedOnFamiliarToolsExplanation": "建立在你已经知道的流行工具之上并与之集成.学习曲线低,适应性强,舒适的开发.",
"ORMIndependent": "ORM独立",
"ORMIndependentExplanation": "核心框架独立于ORM/数据库,并且可以与任何数据源一起使用.Entity Framework Core和MongoDB提供程序已经可用.",
"Features": "功能",
"BasedOnFamiliarToolsExplanation": "基于您已经熟悉的常用工具并与之集成。学习曲线低、适应性强、开发方便。",
"ORMIndependent": "独立与ORM",
"ORMIndependentExplanation": "核心框架独立与ORM/数据库,可与任何数据源配合使用。Entity Framework Core 和 MongoDB 提供者已经可用。",
"Features": "探索 ABP 框架功能",
"ABPCLI": "ABP CLI",
"Modularity": "模块化",
"BootstrapTagHelpers": "Bootstrap 标签助手",
"BootstrapTagHelpers": "Bootstrap Tag helpers",
"DynamicForms": "动态表单",
"BundlingMinification": "Bundling & Minification",
"BundlingMinification": "捆绑 & 压缩",
"BackgroundJobs": "后台作业",
"BackgroundJobsExplanation": "定义简单的类以在队列中在后台执行作业. 使用内置的作业管理器或集成你自己的作业管理器. <a href=\"{0}\">Hangfire</a> & <a href=\"{1}\">RabbitMQ</a>集成已经可用.",
"DDDInfrastructure": "DDD基础设施",
"DomainDrivenDesignInfrastructure": "Domain Driven Design基础设施",
"AutoRESTAPIs": "自动REST APIs",
"BackgroundJobsExplanation": "定义简单的类,在后台执行排队作业。使用内置作业管理器或集成自己的作业管理器。<a href=\"{0}\">Hangfire</a> 和 <a href=\"{1}\">RabbitMQ</a> 集成已经可用。",
"DDDInfrastructure": "DDD 基础设施",
"DomainDrivenDesignInfrastructure": "领域驱动设计基础设施",
"AutoRESTAPIs": "自动 REST API",
"DynamicClientProxies": "动态客户端代理",
"DistributedEventBus": "分布式事件总线",
"DistributedEventBusWithRabbitMQIntegration": "具有RabbitMQ集成的分布式事件总线",
"DistributedEventBusWithRabbitMQIntegration": "集成 RabbitMQ 的分布式事件总线",
"TestInfrastructure": "测试基础设施",
"AuditLoggingEntityHistories": "审计日志和实体历史",
"ObjectToObjectMapping": "对象映射",
"ObjectToObjectMappingExplanation": "<a href=\"{0}\">对象到对象映射</a> 抽象AutoMapper集成.",
"ObjectToObjectMapping": "对象到对象映射",
"ObjectToObjectMappingExplanation": "<a href=\"{0}\">对象到对象映射</a>抽象与 AutoMapper 集成。",
"EmailSMSAbstractions": "电子邮件和短信抽象",
"EmailSMSAbstractionsWithTemplatingSupport": "具有模板支持的电子邮件和短信抽象",
"Localization": "本化",
"EmailSMSAbstractionsWithTemplatingSupport": "电子邮件和短信抽象,支持模板化",
"Localization": "本化",
"SettingManagement": "设置管理",
"ExtensionMethods": "扩展方法",
"ExtensionMethodsHelpers": "扩展方法和助手",
"AspectOrientedProgramming": "面向切面的编程",
"DependencyInjection": "依赖注入",
"DependencyInjectionByConventions": "依据约定的依赖注入",
"ABPCLIExplanation": "ABP CLI(命令行界面)是用于对ABP解决方案执行常见操作的命令行工具.",
"ModularityExplanation": "ABP提供了一个完整的基础设施来构建你自己的应用程序模块,这些模块可能具有实体,服务,数据库集成,API,UI组件等.",
"MultiTenancyExplanation": "ABP框架不仅支持开发多租户应用程序,而且使你的代码几乎无需知道多租户.",
"MultiTenancyExplanation2": "可以自动确定当前租户,将不同租户的数据相互隔离.",
"MultiTenancyExplanation3": "支持单一数据库,或每个租户单独数据库或者混合方式.",
"MultiTenancyExplanation4": "你专注于业务代码,并让该框架为你处理多租户.",
"BootstrapTagHelpersExplanation": "与其手动编写重复细节的bootstrap组件,不如使用ABP的tag helper来简化它并利用智能感知.你当然也可以在需要时直接使用Bootstrap.",
"DynamicFormsExplanation": "动态表单和tag helpers可从作为模型的C#类创建完整的表单.",
"AuthenticationAuthorizationExplanation": "集成到ASP.NET Core Identity和OpenIddict的丰富身份验证和授权选项.提供可扩展且详细的权限系统.",
"CrossCuttingConcernsExplanation": "不要重复自己一次又一次地实现所有这些常见的东西.专注于你的业务代码,并让ABP按照约定自动执行.",
"DependencyInjectionByConventions": "按约定进行依赖注入",
"ABPCLIExplanation": "ABP CLI(命令行界面)是一种命令行工具,用于自动执行基于 ABP 解决方案的一些常见操作。",
"ModularityExplanation": "ABP 提供了一个完整的基础架构,用于构建您自己的应用程序模块,这些模块可能包含实体、服务、数据库集成、API、UI组件等。",
"MultiTenancyExplanation": "ABP 框架不仅支持开发多租户应用程序,还能让你的代码在很大程度上不知道多租户的存在。",
"MultiTenancyExplanation2": "可自动判断当前租户,将不同租户的数据相互隔离。",
"MultiTenancyExplanation3": "支持单一数据库、每个租户数据库和混合方法。",
"MultiTenancyExplanation4": "您只需专注于业务代码,让框架代您处理多租户问题。",
"BootstrapTagHelpersExplanation": "与其手动编写 Bootstrap 组件的重复细节,不如使用 ABP 的Tag helpers来简化它,并利用 IntelliSense 的优势。你当然也可以在需要时直接使用Bootstrap。",
"DynamicFormsExplanation": "动态表单和输入Tag helpers可以从作为模型的 C# 类中创建完整的表单。",
"AuthenticationAuthorizationExplanation": "与 ASP.NET Core Identity 和 IdentityServer4 集成的丰富的身份验证和授权选项。提供可扩展的详细权限系统。",
"CrossCuttingConcernsExplanation": "不要重复实现所有这些常见的东西。专注于您的业务代码,让 ABP 按约定自动执行它们。",
"DatabaseConnectionTransactionManagement": "数据库连接和事务管理",
"CorrelationIdTracking": "关联ID跟踪",
"BundlingMinificationExplanation": "ABP提供了一个简单,动态,功能强大,模块化的内置Bundling & Minification系统.",
"VirtualFileSystemnExplanation": "虚拟文件系统使管理文件系统(磁盘)上不存在的文件成为可能.它主要用于将(js,css,image,cshtml...)文件嵌入到程序集中,并在运行时像物理文件一样使用它们.",
"ThemingExplanation": "主题系统允许通过基于最新的Bootstrap框架定义一组通用基础库和布局来独立开发应用程序和模块主题.",
"DomainDrivenDesignInfrastructureExplanation": "基于域驱动设计模式和准则构建分层应用程序的完整基础设施;",
"Specification": "规",
"CorrelationIdTracking": "相关标识跟踪",
"BundlingMinificationExplanation": "ABP 提供了一个简单、动态、强大、模块化和内置的捆绑与压缩系统。",
"VirtualFileSystemnExplanation": "虚拟文件系统可以管理不存在于文件系统(磁盘)上的文件。它主要用于将(js、css、图像、cshtml......)文件嵌入程序集,并在运行时像使用物理文件一样使用它们。",
"ThemingExplanation": "通过基于最新 Bootstrap 框架定义的一套通用基础库和布局,编辑系统允许开发独立于主题的应用程序和模块。",
"DomainDrivenDesignInfrastructureExplanation": "根据领域驱动设计模式和原则构建分层应用程序的完整基础架构;",
"Specification": "规",
"Repository": "仓储",
"DomainService": "领域服务",
"ValueObject": "值对象",
"ApplicationService": "应用程序服务",
"ApplicationService": "应用服务",
"DataTransferObject": "数据传输对象",
"AggregateRootEntity": "聚合根, 实体",
"AutoRESTAPIsExplanation": "ABP可以按照约定自动将你的应用程序服务配置为API控制器.",
"DynamicClientProxiesExplanation": "从JavaScript和C#客户端轻松使用你的API.",
"DistributedEventBusWithRabbitMQIntegrationExplanation": "使用带有RabbitMQ集成的内置分布式事件总线,可以轻松发布和使用分布式事件.",
"TestInfrastructureExplanation": "框架已经考虑了单元和集成测试.为你提供基类,使其更容易.启动模板已预先配置用于测试.",
"AuditLoggingEntityHistoriesExplanation": "针对关键业务应用程序的内置审计日志记录.请求,服务,方法级别的审计日志记录以及具有属性级别详细信息的实体历史记录.",
"EmailSMSAbstractionsWithTemplatingSupportExplanation": "IEmailSender和ISmsSender抽象使你的应用程序逻辑与基础设施解耦.先进的电子邮件模板系统允许创建和本地化电子邮件模板,并在需要时轻松使用.",
"LocalizationExplanation": "本地化系统允许在纯JSON文件中创建资源,并使用它们来本地化UI.它支持继承,扩展和JavaScript集成等高级方案,同时与AspNet Core的本地化系统完全兼容.",
"SettingManagementExplanation": "定义应用程序的设置,并根据当前配置,租户和用户在运行时获取值.",
"ExtensionMethodsHelpersExplanation": "即使是琐碎的代码部分,也不要重复.标准类型的扩展方法和助手使你的代码更加清晰和易于编写.",
"AspectOrientedProgrammingExplanation": "提供合适的基础设施来创建动态代理并实现面向切面的编程.拦截任何类,并在每次方法执行之前和之后执行代码.",
"DependencyInjectionByConventionsExplanation": "无需手动注册类以进行依赖项注入.按照约定自动注册常用服务类型.对于其他类型的服务,你可以使用接口和属性来使其变得更轻松和就位.",
"DataFilteringExplanation": "定义和使用数据过滤器,这些过滤器在你从数据库中查询实体时会自动应用.当你实现简单的接口时,可立即使用软删除功能和多租户过滤器.",
"AggregateRootEntity": "聚合根实体",
"AutoRESTAPIsExplanation": "ABP 可按约定自动将您的应用程序服务配置为 API 控制器。",
"DynamicClientProxiesExplanation": "从 JavaScript 和 C# 客户端轻松使用您的 API。",
"DistributedEventBusWithRabbitMQIntegrationExplanation": "使用内置的分布式事件总线(可与 RabbitMQ 集成)轻松发布和消费分布式事件。",
"TestInfrastructureExplanation": "该框架在开发过程中考虑了单元测试和集成测试。为您提供基类,让您更轻松地进行测试。启动模板已为测试预配置。",
"AuditLoggingEntityHistoriesExplanation": "针对关键业务应用程序的内置审计日志。请求、服务、方法级审计日志和包含属性级详细信息的实体历史记录。",
"EmailSMSAbstractionsWithTemplatingSupportExplanation": "IEmailSender 和 ISmsSender 抽象将应用程序逻辑与基础架构分离开来。先进的电子邮件模板系统允许创建和本地化电子邮件模板,并在需要时轻松使用。",
"LocalizationExplanation": "本地化系统允许在纯 JSON 文件中创建资源,并使用它们来本地化UI。它支持继承、扩展和 JavaScript 集成等高级方案,同时与 AspNet Core 的本地化系统完全兼容。",
"SettingManagementExplanation": "为应用程序定义设置,并在运行时根据当前配置、租户和用户获取值。",
"ExtensionMethodsHelpersExplanation": "即使是琐碎的代码部分也无需重复。标准类型的扩展和助手能让你的代码更加简洁易写。",
"AspectOrientedProgrammingExplanation": "为创建动态代理和实现面向切面的编程(Aspect Oriented Programming)提供舒适的基础架构。拦截任何类,并在每个方法执行前后执行代码。",
"DependencyInjectionByConventionsExplanation": "无需手动注册依赖注入类。按约定自动注册常见的服务类型。对于其他类型的服务,您可以使用接口和属性来简化注册过程并就地注册。",
"DataFilteringExplanation": "定义和使用数据过滤器,这些过滤器会在你从数据库中查询实体时自动应用。软删除和多租户过滤器是在您实现简单接口时提供的开箱即用的过滤器。",
"PublishEvents": "发布事件",
"HandleEvents": "处理事件",
"AndMore": "更多...",
"Code": "码",
"AndMore": "以及更多...",
"Code": "码",
"Result": "结果",
"SeeTheDocumentForMoreInformation": "查看<a href=\"{1}\">{0} 文档</a>获得更多信息",
"IndexPageHeroSection": "<span class=\"third-line shine2\"><strong>asp.net core的</strong></span><span class=\"first-line shine\"><strong>开源</strong></span><span class=\"second-line text-uppercase\">Web应用程序<br />框架 </span>",
"SeeTheDocumentForMoreInformation": "查看 <a target=\"_blank\" href=\"{1}\">{0} 文档</a>,了解更多信息",
"IndexPageHeroSection": "<span class=\"first-line shine\"><strong>open source</strong></span><span class=\"second-line text-uppercase\">Web Application<br />Framework</span><span class=\"third-line shine2\"><strong>for asp.net core</strong></span>",
"UiFramework": "UI框架",
"EmailAddress": "电子邮件地址",
"Mobile": "移动",
"Mobile": "移动电话",
"ReactNative": "React Native",
"Strong": "强大",
"Complete": "完整",
"Strong": "强大",
"Complete": "完整",
"BasedLayeringModel": "基于分层模型",
"Microservice": "微服务",
"Compatible": "兼容",
"MeeTTheABPCommunityInfo": "我们的使命是创建一个环境使开发人员可以在文章,教程,案例研究等方面互相帮助并结识志趣相投的人.",
"JoinTheABPCommunityInfo": "参与充满活力的社区并成为ABP框架的贡献者",
"AllPosts": "所有的文章",
"SubmitYourPost": "提交你的文章",
"DynamicClientProxyDocument": "参阅<a href=\"{0}\">JavaScript</a> & <a href=\"{1}\">C#</a>的动态客户端代理文档.",
"EmailSMSAbstractionsDocument": "参阅<a href=\"{0}\">emailing</a> 和 <a href=\"{1}\">SMS sending</a> 文档获得更多信息.",
"CreateProjectWizard": "此向导让你从启动模板创建一个新项目,该启动模板已正确配置为可以快速启动你的项目.",
"TieredOption": "创建一个分层解决方案,其中Web和Http API层在物理上是分离的. 如果没有选中则创建一个不那么复杂且适合大多数场景的分层解决方案.",
"SeparateIdentityServerOption": "将服务器端分离为两个应用程序:第一个应用程序用于身份服务器,第二个应用程序用于服务器端HTTP API.",
"SeparateAuthenticationServerOption": "将服务器端分为两个应用程序:第一个用于身份验证服务器,第二个用于服务器端 HTTP API。",
"ProgressiveWebApplicationOption": "将项目指定为渐进式 Web 应用程序",
"MeeTTheABPCommunityInfo": "我们的使命是创造一个环境,让开发人员可以通过帖子、教程、案例研究等方式互相帮助,并结识志同道合的朋友。",
"JoinTheABPCommunityInfo": "加入充满活力的社区,成为 ABP 框架的贡献者!",
"AllPosts": "所有帖子",
"SubmitYourPost": "提交您的帖子",
"DynamicClientProxyDocument": "查看<a href=\"{0}\">JavaScript</a>和<a href=\"{1}\">C#</a>的动态客户端代理文档。",
"EmailSMSAbstractionsDocument": "请查看 <a href=\"{0}\"> 电子邮件</a> 和 <a href=\"{1}\"> 短信发送</a> 文档,了解更多信息。",
"CreateProjectWizard": "该向导从启动模板中创建一个新项目,并对其进行适当配置以启动项目。",
"TieredOption": "创建分层解决方案,Web 层和 Http API 层物理上分开。如果不选中,则会创建一个分层解决方案,其复杂性较低,适合大多数情况。",
"SeparateIdentityServerOption": "将服务器端分为两个应用程序:第一个是身份服务器,第二个是服务器端 HTTP API。",
"SeparateAuthenticationServerOption": "将服务器端分为两个应用程序:第一个是身份验证服务器,第二个是服务器端 HTTP API。",
"ProgressiveWebApplicationOption": "指定项目为渐进式Web应用程序",
"UseslatestPreVersion": "使用最新的预发布版本",
"ReadTheDocumentation": "<span class=\"text-primary\">阅读</span><span class=\"text-success\">文档</span>",
"ReadTheDocumentation": "阅读文档",
"Documentation": "文档",
"GettingStartedTutorial": "入门教程",
"ApplicationDevelopmentTutorial": "应用程序开发教程",
"TheStartupTemplate": "启动模板",
"InstallABPCLIInfo": "ABP CLI是使用ABP框架启动新解决方案的最快方式. 使用命令行窗口安装ABP CLI:",
"DifferentLevelOfNamespaces": "你可以使用不同级别的名称空间. 例如 BookStore, Acme.BookStore 或 Acme.Retail.BookStore",
"ABPCLIExamplesInfo": "<strong>new</strong>命令创建一个 <strong>分层的MVC应用程序</strong> 使用 <strong>Entity Framework Core</strong> 做为数据库提供程序. 它还有其他选项. 示例:",
"SeeCliDocumentForMoreInformation": "参阅 <a href=\"{0}\">ABP CLI 文档</a> 获得更多选项或选择上方的 \"直接下载\" 标签.",
"Optional": "可选",
"LocalFrameworkRef": "保留框架包的本地项目引用.",
"BlobStoring": "BLOB存储",
"BlobStoringExplanation": "BLOB存储系统提供了BLOB的抽象. ABP提供了一些预构建的存储提供程序集成(Azure,AWS,文件系统,数据库等),你可以轻松的在你的应用程序中使用它们.",
"InstallABPCLIInfo": "ABP CLI 是使用 ABP 框架启动新解决方案的最快方法。使用命令行窗口安装 ABP CLI:",
"DifferentLevelOfNamespaces": "您可以使用不同级别的命名空间;例如,BookStore、Acme.BookStore 或 Acme.Retail.BookStore。",
"ABPCLIExamplesInfo": "<strong>new</strong> 命令创建了一个 <strong> 分层 MVC 应用程序</strong>,并将 <strong>Entity Framework Core</strong> 作为数据库提供程序。不过,它还有其他选项。",
"SeeCliDocumentForMoreInformation": "查看 <a target=\"_blank\" href=\"{0}\">ABP CLI 文档</a>,了解更多选项,或选择上面的 \"直接下载 \"选项卡。",
"Optional": "可选",
"LocalFrameworkRef": "为框架包保留本地项目引用。",
"BlobStoring": "BLOB 存储",
"BlobStoringExplanation": "BLOB 存储系统提供了一种处理 BLOB 的抽象方法。ABP 提供了一些预建的存储提供者集成(Azure、AWS、文件系统、数据库等),您可以在应用程序中轻松使用。",
"TextTemplating": "文本模板",
"TextTemplatingExplanation": "文本模板是基于模板和模型(数据对象)使用动态渲染内容. 例如你可以使用预构建的模板来创建动态的电子邮件内容.",
"MultipleUIOptions": "多UI选项",
"MultipleDBOptions": "多个数据库提供程序",
"MultipleUIOptionsExplanation": "核心框架设计为独立与UI,可以和任何类型的UI系统一起使用. 同时提供了多个开箱即用的预构建集成选项.",
"MultipleDBOptionsExplanation": "该框架可以使用任何数据源,并且以下提供程序已得到正式开发和支持;",
"TextTemplatingExplanation": "文本模板用于根据模板和模型(数据对象)动态呈现内容。例如,你可以用它来创建带有预置模板的动态电子邮件内容。",
"MultipleUIOptions": "多UI选项",
"MultipleDBOptions": "多个数据库提供",
"MultipleUIOptionsExplanation": "核心框架的设计与UI无关,可与任何类型的UI系统配合使用,同时还提供多种预建和集成选项。",
"MultipleDBOptionsExplanation": "该框架可与任何数据源协同工作,同时官方开发并支持以下提供者:",
"SelectLanguage": "选择语言",
"LatestPostOnCommunity": "关于ABP社区的最新文章",
"LatestPostOnCommunity": "关于 ABP 社区的最新文章",
"Register": "注册",
"IsDownloadable": "可下载",
"DatabaseOptions": "数据库选项",
"BackToPackagesPage": "回包页面",
"BackToPackagesPage": "回包页面",
"HowToInstall": "如何安装",
"SeeOnNpm": "在NPM查看",
"SeeOnNuget": "在Nuget查看",
"MVCGulpCommandExplanation": "如果你使用MVC (Razor Pages) UI,在包安装完成后运行 \"gulp\" 命令.",
"SeeOnNpm": "在 NPM 查看",
"SeeOnNuget": "在 Nuget查看",
"MVCGulpCommandExplanation": "如果使用的是 MVC(Razor Pages)UI,则在安装包后运行 \"gulp \"命令。",
"UsingABPCLI": "使用 <a href=\"https://docs.abp.io/en/abp/latest/CLI\">Abp CLI</a>",
"WithoutABPCLI": "不使用 ABP CLI",
"ABPCLIModuleDependency": "ABP CLI会自动添加模块依赖.",
"AddModuleDependency": "然后添加模块依赖",
"ABPCLIModuleDependency": "Abp Cli 自动添加模块依赖性。",
"AddModuleDependency": "然后添加模块依赖关系",
"Packages": "包",
"NugetPackages": "Nuget包",
"NPMPackages": "NPM包",
"NugetPackages": "Nuget 包",
"NPMPackages": "NPM 包",
"SeeDocs": "查看文档",
"None": "",
"None": "",
"Application": "应用程序",
"ApplicationExplanation": "基于领域驱动设计实践创建一个完全分层的解决方案。 推荐用于需要可维护和可扩展代码库的长期项目。",
"ApplicationExplanation": "基于领域驱动设计实践创建完全分层的解决方案。推荐用于需要可维护和可扩展代码库的长期项目。",
"ApplicationNoLayer": "应用程序(单层)",
"ApplicationNoLayerExplanation": "创建单层 Web 应用程序。 推荐用于构建具有更简单且易于理解的架构的应用程序。",
"ApplicationNoLayerExplanation": "创建单层Web应用程序。建议用于构建架构简单易懂的应用程序。",
"Module": "模块",
"ModuleExplanation": "创建可重用、完全分层的应用程序模块解决方案。 您可以使用此选项为您的模块化应用程序创建模块。",
"ModuleExplanation": "创建可重用、完全分层的应用程序模块解决方案。您可以使用该选项为模块化应用程序创建模块。",
"PackageName": "包名称",
"LicenseURL": "许可URL",
"License": "许可",
"ProjectCreationSuccessMessage": "你的项目创建成功",
"HowToRunSolution": "如何运行你的解决方案?",
"GettingStartedMessage": "查看入门文档了解如何配置和运行你的解决方案.",
"WebAppDevTutorial": "Web App 开发教程",
"WebAppDevTutorialMessage": "查看web应用程序开发教程文档,一步一步的开发示例.",
"CommunityPosts": "社区文档",
"CommunityPostMessage": "查看ABP社区平台来阅读关于ABP框架的文档.",
"InvestigateSolutionDetails": "调查解决方案细节",
"StartupTemplateDocumentationMessage": "查看应用程序启动模板文档来学习你的解决方案架构和结构.",
"ClientSideDevelopment": "客户端部分开发",
"ClientSideDevelopmentDocumentationMessage": "查看{0}文档来学习用户页面(客户端部分)开发.",
"DatabaseProviderDocumentationMessage": "查看{0}文档来学习用数据库层开发.",
"ABPCommercialExplanationMessage": "ABP商业版为ABP框架提供了高级模块,主题,工具和支持.",
"ImplementingDDD": "实领域驱动设计",
"DDDBookExplanation": "使用 ABP 框架实领域驱动设计的实用指南。",
"LicenseURL": "许可URL",
"License": "许可",
"ProjectCreationSuccessMessage": "您的项目已成功创建",
"HowToRunSolution": "如何运行解决方案?",
"GettingStartedMessage": "查看入门文档,了解如何配置和运行解决方案。",
"WebAppDevTutorial": "Web应用程序开发教程",
"WebAppDevTutorialMessage": "请查看Web应用程序开发教程文档,逐步了解开发示例。",
"CommunityPosts": "社区帖子",
"CommunityPostMessage": "查看 ABP 社区平台,阅读有关 ABP 框架的有用文章。",
"InvestigateSolutionDetails": "查看解决方案详情",
"StartupTemplateDocumentationMessage": "查看应用程序启动模板文档,了解解决方案的架构和结构。",
"ClientSideDevelopment": "客户端开发",
"ClientSideDevelopmentDocumentationMessage": "查看 {0} 文档,了解UI(客户端)开发的要点。",
"DatabaseProviderDocumentationMessage": "查看 {0} 文档,了解数据库层开发的要点。",
"ABPCommercialExplanationMessage": "ABP 商业版为 ABP 框架提供高级模块、主题、工具和支持。",
"ImplementingDDD": "实领域驱动设计",
"DDDBookExplanation": "使用 ABP 框架实领域驱动设计的实用指南。",
"Overview": "概述",
"DDDBookPracticalGuide": "这是实现领域驱动设计 (DDD) 的实用指南。虽然实现细节基于 ABP 框架基础设施,但基本概念、原则和模型可以应用于任何解决方案,即使它不是 .NET 解决方案。",
"DDDBookPracticalGuide": "这是一本实施领域驱动设计(DDD)的实用指南。虽然实施细节基于 ABP 框架基础架构,但基本概念、原则和模型可应用于任何解决方案,即使不是 .NET 解决方案。",
"TableOfContents": "目录",
"IntroductionToImplementingDDD": "实现领域驱动设计简介",
"IntroductionToImplementingDDD": "领域驱动设计实施简介",
"WhatIsDDD": "什么是领域驱动设计?",
"Implementation": "执行",
"Implementation": "实施",
"TheBigPicture": "大图",
"TheBuildingBlock": "积木",
"ExampleUseCase": "示例用例",
"DomainAndApplicationLogic": "领域逻辑应用逻辑",
"TheBuildingBlock": "构建模块",
"ExampleUseCase": "用例示例",
"DomainAndApplicationLogic": "领域逻辑应用逻辑",
"Author": "作者",
"Pages": "页面",
"PublishedOn": "发表于",
"FreeEBook": "免费电子书",
"Download": "下载",
"EBookSignInForDownload": "要下载电子书,请登录",
"SignIn": "登",
"SignIn": "登",
"Or": "或者",
"TellUsAboutYourself": "告诉我们一点关于你自己",
"Name": "名",
"Surname": "姓",
"CompanyName": "公司名",
"DoYouAgreePrivacyPolicy": "我同意<a href=\"https://account.abp.io/Account/TermsConditions\">条款和条件</a><a href=\"https://account.abp.io/Account/Privacy \">隐私政策</a>。",
"TellUsAboutYourself": "谈谈你自己吧",
"Name": "名",
"Surname": "姓",
"CompanyName": "公司名",
"DoYouAgreePrivacyPolicy": "我同意<a href=\"https://account.abp.io/Account/TermsConditions\">条款和条件</a>以及<a href=\"https://account.abp.io/Account/Privacy\">隐私政策</a>。",
"Free": "免费",
"DDDEBook": "DDD电子书",
"PracticalGuideForImplementingDDD": "本书是使用 ABP 框架实现领域驱动设计的实用指南。",
"IntroducingDDD": "介绍领域驱动设计",
"DDDLayersAndCleanArchitecture": "DDD 层和干净的架构",
"LayeringOfADotnetSolution": ".NET 解决方案的分层",
"ImplementingDDDBuildingBlocks": "实现 DDD 构建块",
"DDDEBook": "DDD 电子书",
"PracticalGuideForImplementingDDD": "本书是利用 ABP 框架实施领域驱动设计的实用指南。",
"IntroducingDDD": "领域驱动设计介绍",
"DDDLayersAndCleanArchitecture": "DDD 层与简洁架构",
"LayeringOfADotnetSolution": ".NET解决方案的分层",
"ImplementingDDDBuildingBlocks": "实施 DDD 构件",
"DomainVsApplicationLogic": "领域逻辑与应用逻辑",
"SamplesAndDiscussions": "示例讨论",
"SamplesAndDiscussions": "示例讨论",
"EmailNotValid": "请输入有效的电子邮件地址。",
"WeWillSendYouADownloadLink": "下载电子书的链接已发送至 {0}。检查您的收件箱、垃圾箱或垃圾邮件箱!",
"GoHome": "回",
"InvalidFormInputs": "请输入表中指定的有效信息。",
"DDDBookEmailBody": "谢谢 <br /> 要下载您的书,<a href=\"{0}\">点击此处</a>。",
"SubscribeToNewsletter": "订阅时事通讯以获取有关 ABP.IO 平台中发生的事件的信息,例如新版本、文章、优惠等。",
"WeWillSendYouADownloadLink": "电子书下载链接已发送至 {0}。请检查您的收件箱、垃圾邮件箱!",
"GoHome": "回到主页面",
"InvalidFormInputs": "请输入表中指定的有效信息。",
"DDDBookEmailBody": "谢谢。<br /> 要下载您的书,<a href=\"{0}\">点击此处</a>。",
"SubscribeToNewsletter": "订阅时事通讯,了解 ABP.IO 平台的最新动态,如新版本、文章、优惠等。",
"FirstEdition": "第一版",
"ThankYou": "谢谢!",
"CheckboxMandatory": "你需要检查这个才能继续!",
"UserInterface": "用户界面",
"APIGateway": "API 网关",
"CheckboxMandatory": "您需要检查这一点才能继续!",
"UserInterface": "UI",
"APIGateway": "API网关",
"Database": "数据库",
"Saas": "Saas",
"OpenSourceWebApp": "<span class=\"forever\">开源 </span> <br/> Web 应用程序",
"Framework": "框架",
"AuditLoggingExplanation": "自动跟踪系统中的所有操作和数据更改。",
"AuditLoggingExplanation": "自动跟踪系统中的所有操作和数据变化。",
"AbpNewCommandExplanation": "使用 ABP 启动模板创建新的解决方案。",
"AbpAddModuleCommandExplanation": "将预构建的应用程序模块安装到您的解决方案中",
"AbpAddModuleCommandExplanation": "在解决方案中安装预构建应用模块",
"AbpUpdateCommandExplanation": "自动更新解决方案中所有与 ABP 相关的 NuGet 和 NPM 包。",
"ExploreAllCLICommands": "探索所有 CLI 命令",
"ExploreDocumentationAndGuides": "探索全面的文档和指南。",
"Documentations": "文档",
"Views": "意见",
"EnterYouEmailToGetNews": "输入您的电子邮件以获取有关 ABP 框架的最新消息",
"EnterYouEmailToGetNews": "输入您的电子邮件以获取有关 ABP 框架的最新消息",
"Tiered": "分层",
"SeparateIdentityServer": "独立身份服务器",
"SeparateAuthenticationServer": "独的身份验证服务器",
"ProgressiveWebApplication": "渐进式 Web 应用程序",
"SeparateIdentityServer": "独立身份服务器",
"SeparateAuthenticationServer": "独的身份验证服务器",
"ProgressiveWebApplication": "渐进式Web应用程序",
"Preview": "预览",
"CreateANewSolution": "创建一个解决方案",
"ABPFrameworkFeatures": "ABP 框架 <span class=\"gradient-framework\">功能</span>",
"CreateANewSolution": "创建新解决方案",
"ABPFrameworkFeatures": "ABP 框架 <span class=\"gradient-framework\">特点</span",
"Commercial": "商业版",
"ThirdPartyTools": "第三方工具",
"Back": "后退",
"Back": "返回",
"Community": "社区",
"SeeMore": "查看更多",
"DetailsOfTheEBook": "电子书详情",
"JoinOurMarketingNewsletter": "加入我们的市场推广时事通讯",
"FrameworkNewsletterConfirmationMessage": "我同意<a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/TermsConditions\">条款和条件</a > 和 <a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">隐私政策</a>。",
"GetYourFreeEBook": "获取您的 <span class=\"gradient-framework d-block\">免费 DDD 电子书</span>",
"EverythingYouNeedToKnow": "您需要了解的一切。",
"PreOrderNow": "立即预",
"UITheming": "用户界面主题",
"UIThemingExplanation": "创建可重用的 UI 主题和布局,或使用预构建的 UI 主题之一。",
"DataFilteringExplanation2": "自动过滤来自数据库查询,轻松实现软删除和多租户等模式。",
"NeedHelp": "需要帮助吗?",
"GiveYourProjectAName": "给您的项目命名",
"JoinOurMarketingNewsletter": "加入我们的营销通讯",
"FrameworkNewsletterConfirmationMessage": "我同意<a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/TermsConditions\">条款和条件</a>以及<a class=\"text-white fw-6 text-decoration-underline opacity-50\" href=\"https://commercial.abp.io/Privacy\">隐私政策</a>。",
"GetYourFreeEBook": "获取<span class=\"gradient-framework d-block\">免费 DDD 电子书</span>",
"EverythingYouNeedToKnow": "你需要知道的一切",
"PreOrderNow": "立即预",
"UITheming": "UI设计",
"UIThemingExplanation": "创建可重用的UI主题和布局,或使用预置的UI主题。",
"DataFilteringExplanation2": "自动过滤数据库查询,轻松实现软删除和多租户等模式。",
"NeedHelp": "需要帮助吗?",
"GiveYourProjectAName": "项目命名",
"SelectProjectType": "选择项目类型",
"SelectUIFramework": "选择 UI 框架",
"SelectUIFramework": "选择UI框架",
"SelectDatabaseProvider": "选择数据库提供者",
"SelectDatabaseManagementSystem": "选择数据库管理系统",
"InstallingTheABPCLI": "安装 ABP CLI",
"CreateYourProjectNow": "立即创建您的项目",
"OrderOn": "在 {0} 订购",
"DownloadFreeDDDBook": "下载免费的 DDD 书",
"OrderOn": "在{0}上下单",
"DownloadFreeDDDBook": "下载免费的 DDD 书",
"WhatIsABPFramework": "什么是 ABP 框架?",
"TenantDatabase": "租户 {0} 数据库",
"SharedDatabase": "共享数据库",
"ConnectionResolver": "连接解析器",
"TenantBasedDataFilter": "基于租户的数据过滤器",
"ApplicationCode": "申请代码",
"TenantResolution": "租户决议",
"ApplicationCode": "应用代码",
"TenantResolution": "租户解析",
"TenantUser": "租户 {0} 用户",
"CardTitle": "卡片标题",
"View": "查看",
"Model": "模型",
"Email": "电子邮",
"Email": "电子邮",
"Password": "密码",
"Address": "地址",
"Gender": "性别",
"Male": "男",
"Female": "女",
"Female": "女",
"Submit": "提交",
"Unspecified": "未指定",
"Unspecified": "未说明",
"StaticFileMiddleware": "静态文件中间件",
"RazorViewEngine": "Razor 视图引擎",
"PhysicalFiles": "物理文件 (wwwroot)",
"EmbeddedFiles": "嵌入式文件(DDL) ",
"PhysicalFiles": "物理文件(wwwroot)",
"EmbeddedFiles": "嵌入式文件 (DLL)",
"DynamicFiles": "动态文件(内存)",
"BuildSolutionsWithAbp": "遵循使用 ABP 的软件开发最佳实践,构建可维护的 .NET 解决方案。",
"BuildSolutionsWithAbp": "使用 ABP,遵循软件开发最佳实践,构建可维护的 .NET 解决方案。",
"BuyOnAmazon": "在亚马逊上购买",
"BuyOnPackt": "在 Packt 购买",
"Discounted": "折",
"MasteringAbpFramework_Book_KeyFeatures": "主要特性",
"MasteringAbpFramework_Book_Key_Features_Description_1": "使用 ABP 框架构建强大、可维护、模块化和可扩展的软件解决方案。",
"MasteringAbpFramework_Book_Key_Features_Description_2": "了解如何在您的 Web 应用程序中实施 SOLID 原则和领域驱动设计。",
"MasteringAbpFramework_Book_Key_Features_Description_3": "了解 ABP 框架如何通过自动执行重复性任务来加快您的开发周期。",
"MasteringAbpFramework_Book_Description": "书籍说明",
"MasteringAbpFramework_Book_Description_Details_1": "ABP 框架是一个完整的基础架构,用于通过遵循软件 \n 开发最佳实践和约定来创建现代 Web 应用程序。 借助 ABP 的高级框架和生态系统,您可以 \n 实现 Don't Repeat Yourself (DRY) 原则并专注于您的业务代码。",
"MasteringAbpFramework_Book_Description_Details_2": "本书由 ABP 框架的创建者撰写,将帮助您全面了解该框架和现代 Web 应用程序开发技术。 通过对基本概念和实际示例的逐步解释,您将了解现代 Web 解决方案的要求以及 ABP\n 框架如何使开发您自己的解决方案变得轻松愉快。 您将发现\n 企业 Web 应用程序开发的常见需求,并探索 ABP 提供的基础架构。 在整本书中,您将掌握构建可维护和模块化 Web 解决方案的软件开发最佳实践。",
"MasteringAbpFramework_Book_Description_Details_3": "在本书结束时,您将能够创建一个易于开发、\n 维护和测试的完整 Web 解决方案。",
"MasteringAbpFramework_Book_WhatYouWillLearn": "你将学到什么",
"BuyOnPackt": "在 Packt 购买",
"Discounted": "折",
"MasteringAbpFramework_Book_KeyFeatures": "主要功能",
"MasteringAbpFramework_Book_Key_Features_Description_1": "使用 ABP 框架构建稳健、可维护、模块化和可扩展的软件解决方案。",
"MasteringAbpFramework_Book_Key_Features_Description_2": "了解如何在Web应用程序中实施 SOLID 原则和领域驱动设计。",
"MasteringAbpFramework_Book_Key_Features_Description_3": "了解 ABP Framework 如何通过自动化重复性任务加快开发周期。",
"MasteringAbpFramework_Book_Description": "图书简介",
"MasteringAbpFramework_Book_Description_Details_1": "ABP 框架是一个完整的基础架构,用于按照软件开发最佳实践和约定创建现代Web应用程序。\n 的最佳实践和约定,创建现代Web应用程序的完整基础架构。借助 ABP 的高级框架和生态系统,您可以\n 执行 \"不要重复\"(DRY)原则,专注于业务代码。",
"MasteringAbpFramework_Book_Description_Details_2": "本书由 ABP 框架的创建者撰写,将帮助你全面了解该框架和现代Web应用程序开发技术。\n 框架和现代Web应用程序开发技术。通过逐步解释基本\n 概念和实际示例,你将了解现代网络解决方案的要求,以及 ABP\n 框架如何让您愉快地开发自己的解决方案。您将发现\n 企业Web应用程序开发的常见要求,并探索 ABP 提供的基础架构。在整本书中\n 在本书中,你将掌握软件开发的最佳实践,以构建可维护的模块化\n 网络解决方案。",
"MasteringAbpFramework_Book_Description_Details_3": "在本书结束时,你将能够创建一个易于开发、维护和测试的完整网络解决方案、\n 维护和测试。",
"MasteringAbpFramework_Book_WhatYouWillLearn": "你将学到什么",
"MasteringAbpFramework_Book_What_You_Will_Learn_1": "设置开发环境并开始使用 ABP 框架。",
"MasteringAbpFramework_Book_What_You_Will_Learn_2": "使用 Entity Framework Core 和 MongoDB 开发您的数据访问层。",
"MasteringAbpFramework_Book_What_You_Will_Learn_2": "使用 Entity Framework Core 和 MongoDB 开发数据访问层。",
"MasteringAbpFramework_Book_What_You_Will_Learn_3": "了解横切关注点以及 ABP 如何自动执行重复性任务。",
"MasteringAbpFramework_Book_What_You_Will_Learn_4": "掌握使用 ABP 框架实施领域驱动设计。",
"MasteringAbpFramework_Book_What_You_Will_Learn_5": "使用 ASP.NET Core MVC (Razor Pages) 和 Blazor 构建 UI 页面和组件。",
"MasteringAbpFramework_Book_What_You_Will_Learn_6": "使用多租户创建模块化 Web 应用程序。",
"MasteringAbpFramework_Book_What_You_Will_Learn_7": "了解模块化并创建可重用的应用程序模块。",
"MasteringAbpFramework_Book_What_You_Will_Learn_8": "使用 ABP 框架编写单元、集成和 UI 测试。",
"MasteringAbpFramework_Book_WhoIsThisBookFor": "这本书是给谁看的",
"MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "本书适用于希望学习软件架构和最佳实践的 Web 开发人员,以使用 Microsoft 技术和 ABP 框架构建\n 可维护的基于 Web 的解决方案。 C#\n 和 ASP.NET Core 的基本知识是开始阅读本书所必需的。",
"MasteringAbpFramework_Book_What_You_Will_Learn_4": "使用 ABP 框架掌握领域驱动设计的实施方法。",
"MasteringAbpFramework_Book_What_You_Will_Learn_5": "使用 ASP.NET Core MVC(Razor Pages)和 Blazor 构建UI页面和组件。",
"MasteringAbpFramework_Book_What_You_Will_Learn_6": "使用多租户创建模块化Web应用程序。",
"MasteringAbpFramework_Book_What_You_Will_Learn_7": "了解模块化,创建可重用的应用模块。",
"MasteringAbpFramework_Book_What_You_Will_Learn_8": "使用 ABP 框架编写单元测试、集成测试和UI测试。",
"MasteringAbpFramework_Book_WhoIsThisBookFor": "这本书为谁而写",
"MasteringAbpFramework_Book_WhoIsThisBookFor_Description": "本书适用于希望学习软件架构和最佳实践的网络开发人员。\n 的最佳实践。要开始学习本书\n 和 ASP.NET Core 的基础知识。",
"ComputersAndTechnology": "计算机与技术",
"BuildingMicroserviceSolutions": "构建微服务解决方案",
"MicroserviceBookPracticalGuide": "本书是使用 ABP 框架开发和管理基于微服务的应用程序的参考指南。 它引用了 <strong>.NET 微服务示例参考应用程序</strong>:eShopOnContainers,并讨论了使用 ABP 框架的架构设计和实现方法。 读完本书,您将了解 ABP 如何处理常见的微服务复杂性,如授权、分布式事务、微服务间通信、部署等。",
"MicroserviceBookPracticalGuide": "本书是使用 ABP 框架开发和管理基于微服务的应用程序的参考指南。它参考了<strong>.NET 微服务示例参考应用程序</strong>:eShopOnContainers,并讨论了使用 ABP 框架的架构设计和实现方法。在本书结束时,您将了解 ABP 如何处理常见的微服务复杂性,如授权、分布式事务、微服务间通信、部署等。",
"IntroducingTheSolution": "介绍 eShopOnAbp 解决方案",
"RunningTheSolution": "运行解决方案",
"UnderstandingTheAuthenticationSystem": "了解身份验证系统",
"ExploringTheApplications": "探索应用",
"UnderstandingTheAPIGateways": "了解 API 网关",
"UnderstandingTheAPIGateways": "了解API网关",
"DevelopingTheMicroservices": "开发微服务",
"UnderstandingTheInfrastructure": "了解基础设施",
"DiggingInTheUseCases": "挖掘用例",
"DiggingInTheUseCases": "挖掘使例",
"DeployingTheSolution": "部署解决方案",
"ThisBookIsInDraftStageAndIsNotCompletedYet": "这本书正在草案阶段,还没有完成。",
"ThisBookIsInDraftStageAndIsNotCompletedYet": "本书目前处于草稿阶段,尚未完成。",
"Authors": "作者",
"MicroserviceEBook": "微服务电子书",
"SelectUITheme": "选择 UI 主题",
"SelectUITheme": "选择UI主题",
"LeptonXLiteTheme": "LeptonX Lite 主题",
"BasicTheme": "基本主题",
"LeptonXLiteThemeInfo": " 现代时尚的 Bootstrap UI 主题。 如果你想要一个生产就绪的 UI 主题,这是理想的选择。 这是最新的主题,也是默认主题。",
"BasicThemeInfo": "具有简单 Bootstrap 颜色和样式的极简 UI 主题。 如果您要构建自己的 UI 主题,则非常适合。",
"SeeDocumentation": "请参阅 <a href='{0}' target='_blank'>文档</a>.",
"SeeFullScreen": "<a href='{0}' target='_blank'>🖼️ 如截图所示</a>",
"LeptonXLiteThemeInfo": "一款现代时尚的 Bootstrap UI 主题。如果你想拥有一个可随时制作的UI主题,它将是你的理想之选。这是最新的主题,也是默认主题。",
"BasicThemeInfo": "极简UI主题,采用纯粹的 Bootstrap 颜色和样式。如果你想创建自己的UI主题,它将是你的理想之选。",
"SeeDocumentation": "请参阅<a href='{0}' target='_blank'>文档</a>",
"SeeFullScreen": "<a href='{0}' target='_blank'>🖼️ 查看截图</a>",
"BuildingMicroserviceSolutionsShortDescription": "本书是使用 ABP 框架开发和管理基于微服务的应用程序的参考指南。",
"InstallAbpCliMessage": "如果之前没有安装,请在命令行终端中安装 ABP CLI:",
"InstallAbpCliMessage": "如果之前未安装 ABP CLI,请在命令行终端中安装:",
"Terminal": "终端",
"Copy": "复制",
"RunTheFollowingCommand": "在命令行终端运行以下命令",
"RunTheFollowingCommand": "在命令行终端运行以下命令",
"ChangeSolutionOptionsBelow": "您可以更改下面的解决方案选项。",
"MultiLayerApplication": "多层<br>应用",
"MultiLayerApplicationExplanation1": "基于领域驱动设计实践创建完全分层的解决方案。",
"MultiLayerApplicationExplanation2": "推荐用于需要可维护和可扩展代码库的长期项目。",
"SingleLayerApplication": "单层<br>应用",
"SingleLayerApplicationExplanation1": "创建单层 Web 应用程序。 ",
"SingleLayerApplicationExplanation2": "推荐用于构建具有更简单且易于理解的体系结构的应用程序。",
"ApplicationModule": "应用程序模块",
"SeeTheScreenshot": "如截图所示",
"ApplicationModuleExplanation1": "创建可重用、完全分层的应用程序模块解决方案。",
"ApplicationModuleExplanation2": "您可以使用此选项为您的模块化应用程序创建模块。",
"MultiLayerApplicationExplanation1": "根据领域驱动设计实践,创建完全分层的解决方案。",
"MultiLayerApplicationExplanation2": "建议用于需要可维护和可扩展代码库的长期项目。",
"SingleLayerApplication": "单层 <br>应用",
"SingleLayerApplicationExplanation1": "创建单层Web应用程序。 ",
"SingleLayerApplicationExplanation2": "建议用于构建架构简单易懂的应用程序。",
"ApplicationModule": "应用程序 <br> 模块",
"SeeTheScreenshot": "请看截图",
"ApplicationModuleExplanation1": "创建一个可重用、完全分层的应用模块解决方案。",
"ApplicationModuleExplanation2": "您可以使用该选项为模块化应用程序创建模块。",
"Expert_": "专家",
"Partner_": "合作伙伴",
"WebSite": "网站",
"Expert_Year": "专业年",
"Expert_Year": "专业年",
"CompanyInfo": "公司信息",
"Date": "日期",
"WhoWeAre_Partner": "关于我们",
"WhoWeAre_Partner": "我们是谁",
"WhoWeAre_Expert": "关于我",
"CreateSolutionFolder": "创建解决方案文件夹",
"CreateSolutionFolderOption": "指定项目是位于输出文件夹中的新文件夹中,还是直接位于输出文件夹中。",
"BooksPageTitle": "ABP书",
"PackageDetailPage_NuGetPackageInstallationOptions": "可通过三种方式将<code>{0}</code> NuGet 包安装到您的项目中",
"PackageDetailPage_InstallingWithABPCLI": "1:使用ABP CLI安装",
"PackageDetailPage_InstallingWithABPCLIDescription1": "如果尚未安装<a href=\"https://docs.abp.io/en/abp/latest/CLI\">ABP CLI</a> ,请首先通过在命令行终端执行以下命令进行安装",
"PackageDetailPage_InstallingWithABPCLIDescription2": "安装 ABP CLI 后,在要安装的项目( <code>.csproj</code>文件)位置打开命令行终端并执行以下命令",
"PackageDetailPage_InstallingWithABPCLIDescription3": "它会将<code>{0}</code>包引用添加到您的项目,并将<code>{1}</code>依赖项添加到您的模块类。",
"PackageDetailPage_ManualInstallation": "2:使用Dotnet CLI安装",
"PackageDetailPage_ManualInstallationDescription1": "使用 IDE 或执行以下命令将<code>{0}</code> NuGet 包引用添加到您的项目",
"PackageDetailPage_ManualInstallationDescription2": "然后将<code>{0}</code>依赖项添加到您的<a href=\"https://docs.abp.io/en/abp/latest/Module-Development-Basics\">模块类</a>,如以下示例所示",
"PackageDetailPage_SeeDocumentation": "<a href=\"{0}\">请参阅文档</a>了解如何在应用程序中使用此包。",
"PackageDetailPage_InstallingUsingPMC": "3使用包管理器控制台安装",
"PackageDetailPage_InstallingUsingPMCDescription1": "在 Visual Studio 中打开<strong>包管理器控制台</strong>(工具 -&gt; Nuget 包管理器 -&gt; 包管理器控制台)并执行以下命令",
"UIOptions": "用户界面选项",
"Testimonials": "感言",
"CoolestCompaniesUseABPFramework": "最酷公司使用<span class=\"fw-bold\">ABP 框架</span>",
"Index_Page_Testimonial_1": "ABP 框架不仅仅是一个工具,更是加速我作为开发人员成长的催化剂。它使我能够比以往更快地构建新功能,让人想起其他用户的体验。统一的编码模式简化了我的项目,让我有更多的时间专注于创建而不是故障排除。 \n我想说 ABP 框架是我早期职业生涯的基石。它帮助我从一个有抱负的开发人员转变为一个自信的专业人士,准备在软件世界中留下自己的印记。我期待着等待着我的激动人心的项目,因为我知道 ABP 会在那里指导我。它不仅仅是一个产品;它更是一个产品。它是成功的伙伴。",
"Index_Page_Testimonial_2": "ABP Framework不仅仅是一个框架,它还是项目开发/管理的指南,因为它提供了DDD、GenericRepository、DI、Microservice、Modularity培训。即使您不打算使用框架本身,您也可以使用经过充分专业准备的 docs.abp.io 进行开发。 (OpenIddict、Redis、Quartz 等) \n由于许多东西是预先构建的,因此它大大缩短了项目开发时间。 (例如登录页面、异常处理、数据过滤播种、审核日志记录、本地化、自动 api 控制器等) \n作为我们应用程序的示例,我使用本地事件总线进行库存控制。因此,我可以通过编写库存处理程序来管理订单变动。 \n不为CreationTime、CreatorId浪费时间真是太好了。它们会自动填充。",
"VideosLoginAndRegisterMessage": "您必须登录才能观看视频。如果您还没有,您可以创建一个手表帐户。",
"CreateSolutionFolderOption": "指定项目是放在输出文件夹中的新文件夹中,还是直接放在输出文件夹中。",
"BooksPageTitle": "ABP书",
"PackageDetailPage_NuGetPackageInstallationOptions": "在项目中安装 <code>{0}</code> NuGet 包有三种方法",
"PackageDetailPage_InstallingWithABPCLI": "1: 使用 ABP CLI 安装",
"PackageDetailPage_InstallingWithABPCLIDescription1": "如果尚未安装 <a href=\"https://docs.abp.io/en/abp/latest/CLI\">ABP CLI</a>,请首先在命令行终端执行以下命令进行安装",
"PackageDetailPage_InstallingWithABPCLIDescription2": "安装 ABP CLI 后,在要安装的项目(<code>.csproj</code> 文件)位置打开命令行终端并执行以下命令",
"PackageDetailPage_InstallingWithABPCLIDescription3": "它将在项目中添加 <code>{0}</code> 包引用,并在模块类中添加 <code>{1}</code> 依赖关系。",
"PackageDetailPage_ManualInstallation": "2: 使用 Dotnet CLI 安装",
"PackageDetailPage_ManualInstallationDescription1": "使用IDE或执行以下命令在项目中添加 <code>{0}</code> NuGet 包引用",
"PackageDetailPage_ManualInstallationDescription2": "然后<a href=\"https://docs.abp.io/en/abp/latest/Module-Development-Basics\"> 模块类</a>中添加 <code>{0}</code> 依赖关系,如以下示例所示",
"PackageDetailPage_SeeDocumentation": "<a href=\"{0}\">请参阅文档</a>了解如何在应用程序中使用此包。",
"PackageDetailPage_InstallingUsingPMC": "3: 使用包管理器控制台安装",
"PackageDetailPage_InstallingUsingPMCDescription1": "在 Visual Studio 中打开 <strong>包管理器控制台</strong>(工具 -> Nuget 包管理器 -> 包管理器控制台)并执行以下命令",
"UIOptions": "UI选项",
"Testimonials": "客户感言",
"CoolestCompaniesUseABPFramework": "最酷公司使用<span class=\"fw-bold\">ABP框架</span",
"Index_Page_Testimonial_1": "ABP Framework 不仅仅是一个工具,更是一种催化剂,它加速了我作为开发人员的成长。它让我能够比以往更快地创建新功能,让我想起其他用户的经验。统一的编码模式简化了我的项目,让我有更多时间专注于创建而不是排除故障。\n我想说,ABP 框架是我早期职业旅程的基石。它帮助我从一名有抱负的开发人员转变为一名自信的专业人员,准备在软件世界大展拳脚。我期待着等待我的激动人心的项目,因为我知道ABP将在那里为我提供指导。它不仅仅是一个产品,更是成功的伙伴。",
"Index_Page_Testimonial_2": "ABP Framework 不仅仅是一个框架,它还是项目开发/管理的指南,因为它提供了 DDD、GenericRepository、DI、Microservice、Modularity 培训。即使你不打算使用框架本身,你也可以通过 docs.abp.io 进行自我开发,它为你提供了精心准备的专业培训。(OpenIddict、Redis、Quartz 等)。\n因为很多东西都是预置的,所以大大缩短了项目开发时间。(如登录页面、异常处理、数据过滤-播种、审计日志、本地化、自动 api 控制器等)。\n以我们的应用程序为例,我将本地事件总线用于库存控制。因此,我可以通过编写库存处理程序来管理订单的变动。\n创建时间、CreatorId 不会浪费时间,它们会自动填入。它们会自动填充。",
"VideosLoginAndRegisterMessage": "您必须登录后才能观看视频。如果您还没有注册,可以创建一个账户进行观看。",
"Filter": "筛选",
"VideoCourses": "视频课程"
}

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

@ -274,7 +274,7 @@
"EmailNotValid": "請輸入有效的電子郵件地址。",
"WeWillSendYouADownloadLink": "下載電子書的鏈接已發送至 {0}。檢查您的收件箱、垃圾箱或垃圾郵件箱!",
"GoHome": "回家",
"InvalidFormInputs": "請輸入表中指定的有效信息。",
"InvalidFormInputs": "請輸入表中指定的有效信息。",
"DDDBookEmailBody": "謝謝你。 <br />要下載您的圖書,請<a href=\"{0}\">點擊此處</a>。",
"SubscribeToNewsletter": "訂閱時事通訊以獲取有關 ABP.IO 平台中發生的事件的信息,例如新版本、文章、優惠等。",
"FirstEdition": "第一版",

10
docs/en/CLI.md

@ -527,6 +527,16 @@ Then review changes on your source control system to be sure that it has changed
* `--file` or `-f`: Default: `abp-translation.json`. The translation file (use only if you've used the `--output` option before).
#### Online DeepL translate
The `translate` command also supports online translation. You need to provide your [DeepL Authentication Key](https://support.deepl.com/hc/en-us/articles/360020695820-Authentication-Key).
It will search all the `en.json(reference-culture)` files in the directory and sub-directory and then translate and generate the corresponding `zh-Hans.json(culture)` files.
````bash
abp translate -c zh-Hans --online --deepl-auth-key <auth-key>
````
### login
Some features of the CLI requires to be logged in to abp.io platform. To login with your username write:

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

@ -364,7 +364,8 @@ You can set some of the attributes on your c# property, or directly on HTML tag.
* `single-open-and-clear-button`: Shows the open and clear buttons in a single button when it's `True`. The default value is `True`.
* `is-utc`: Converts the date to UTC when its `True`. The default value is `False`.
* `is-iso`: Converts the date to ISO format when its `True`. The default value is `False`.
* `date-format`: Sets the date format of the input. The default format is the user's culture date format. You need to provide a JavaScript date format convention. Eg: `YYYY-MM-DDTHH:MM:SSZ`.
* `visible-date-format`: Sets the date format of the input. The default format is the user's culture date format. You need to provide a JavaScript date format convention. Eg: `YYYY-MM-DDTHH:MM:SSZ`.
* `input-date-format`: Sets the date format of the hidden input for backend compatibility. The default format is `YYYY-MM-DD`. You need to provide a JavaScript date format convention. Eg: `YYYY-MM-DDTHH:MM:SSZ`.
* `date-separator`: Sets a character to separate start and end dates. The default value is `-`
* Other non-mapped attributes will be automatically added to the input element as is. See the available [datepicker options](https://www.daterangepicker.com/#options). Eg: `data-start-date="2020-01-01"`
@ -425,7 +426,8 @@ newPicker.insertAfter($('body'));
* `singleOpenAndClearButton`: Shows the open and clear buttons in a single button when it's `True`. The default value is `True`.
* `isUtc`: Converts the date to UTC when its `True`. The default value is `False`.
* `isIso`: Converts the date to ISO format when its `True`. The default value is `False`.
* `dateFormat`: Sets the date format of the input. The default format is the user's culture date format. You need to provide a JavaScript date format convention. Eg: `YYYY-MM-DDTHH:MM:SSZ`.
* `visibleDateFormat`: Sets the date format of the input. The default format is the user's culture date format. You need to provide a JavaScript date format convention. Eg: `YYYY-MM-DDTHH:MM:SSZ`.
* `inputDateFormat`: Sets the date format of the hidden input for backend compatibility. The default format is `YYYY-MM-DD`. You need to provide a JavaScript date format convention. Eg: `YYYY-MM-DDTHH:MM:SSZ`.
* `dateSeparator`: Sets a character to separate start and end dates. The default value is `-`.
* `startDateName`: Sets the name of the hidden start date input.
* `endDateName`: Sets the name of the hidden end date input.

13
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs

@ -185,17 +185,28 @@ public abstract class
set => _abpDatePickerOptionsImplementation.ParentEl = value;
}
[Obsolete("Use VisibleDateFormat instead.")]
public string? DateFormat {
get => _abpDatePickerOptionsImplementation.DateFormat;
set => _abpDatePickerOptionsImplementation.DateFormat = value;
}
public string? VisibleDateFormat {
get => _abpDatePickerOptionsImplementation.VisibleDateFormat;
set => _abpDatePickerOptionsImplementation.VisibleDateFormat = value;
}
public string? InputDateFormat {
get => _abpDatePickerOptionsImplementation.InputDateFormat;
set => _abpDatePickerOptionsImplementation.InputDateFormat = value;
}
public bool OpenButton {
get => _abpDatePickerOptionsImplementation.OpenButton;
set => _abpDatePickerOptionsImplementation.OpenButton = value;
}
public bool ClearButton {
public bool? ClearButton {
get => _abpDatePickerOptionsImplementation.ClearButton;
set => _abpDatePickerOptionsImplementation.ClearButton = value;
}

12
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs

@ -125,7 +125,7 @@ public abstract class AbpDatePickerBaseTagHelperService<TTagHelper> : AbpTagHelp
var openButtonContent = TagHelper.OpenButton
? await ProcessButtonAndGetContentAsync(context, output, "calendar", "open")
: "";
var clearButtonContent = TagHelper.ClearButton
var clearButtonContent = TagHelper.ClearButton == true || (!TagHelper.ClearButton.HasValue && TagHelper.AutoUpdateInput != true)
? await ProcessButtonAndGetContentAsync(context, output, "times", "clear", visible:!TagHelper.SingleOpenAndClearButton)
: "";
@ -382,6 +382,16 @@ public abstract class AbpDatePickerBaseTagHelperService<TTagHelper> : AbpTagHelp
{
attrList.Add("data-date-format", options.DateFormat);
}
if(!options.VisibleDateFormat.IsNullOrEmpty())
{
attrList.Add("data-visible-date-format", options.VisibleDateFormat);
}
if(!options.InputDateFormat.IsNullOrEmpty())
{
attrList.Add("data-input-date-format", options.InputDateFormat);
}
if(options.Ranges != null && options.Ranges.Any())
{

6
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOptions.cs

@ -31,9 +31,13 @@ public class AbpDatePickerOptions : IAbpDatePickerOptions
public bool? LinkedCalendars { get; set; }
public bool? AutoUpdateInput { get; set; }
public string? ParentEl { get; set; }
[Obsolete("Use VisibleDateFormat instead.")]
public string? DateFormat { get; set; }
public string? VisibleDateFormat { get; set; }
public string? InputDateFormat { get; set; }
public bool OpenButton { get; set; } = true;
public bool ClearButton { get; set; } = true;
public bool? ClearButton { get; set; }
public bool SingleOpenAndClearButton { get; set; } = true;
public bool? IsUtc { get; set; }
public bool? IsIso { get; set; }

20
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs

@ -84,18 +84,24 @@ public class AbpDateRangePickerTagHelperService : AbpDatePickerBaseTagHelperServ
protected override void AddBaseTagAttributes(TagHelperAttributeList attributes)
{
if (TagHelper.AspForStart != null &&
TagHelper.AspForStart.Model != null &&
if (TagHelper.AspForStart?.Model != null &&
SupportedInputTypes.TryGetValue(TagHelper.AspForStart.Metadata.ModelType, out var convertFuncStart))
{
attributes.Add("data-start-date", convertFuncStart(TagHelper.AspForStart.Model));
var convert = convertFuncStart(TagHelper.AspForStart.Model);
if(!convert.IsNullOrWhiteSpace())
{
attributes.Add("data-start-date", convert);
}
}
if (TagHelper.AspForEnd != null &&
TagHelper.AspForEnd.Model != null &&
if (TagHelper.AspForEnd?.Model != null &&
SupportedInputTypes.TryGetValue(TagHelper.AspForEnd.Metadata.ModelType, out var convertFuncEnd))
{
attributes.Add("data-end-date", convertFuncEnd(TagHelper.AspForEnd.Model));
var convert = convertFuncEnd(TagHelper.AspForEnd.Model);
if(!convert.IsNullOrWhiteSpace())
{
attributes.Add("data-end-date", convert);
}
}
}

13
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/IAbpDatePickerOptions.cs

@ -134,11 +134,22 @@ public interface IAbpDatePickerOptions
/// </summary>
string? ParentEl { get; set; }
[Obsolete("Use VisibleDateFormat instead.")]
string? DateFormat { get; set; }
/// <summary>
/// The date format string that will appear in the input element. For user input.
/// </summary>
string? VisibleDateFormat { get; set; }
/// <summary>
/// The date format string that will appear in the hidden input element. For backend compatibility.
/// </summary>
string? InputDateFormat { get; set; }
bool OpenButton { get; set; }
bool ClearButton { get; set; }
bool? ClearButton { get; set; }
bool SingleOpenAndClearButton { get; set; }

22
framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hans.json

@ -1,13 +1,13 @@
{
"culture": "zh-Hans",
"texts": {
"GivenTenantIsNotExist": "给定的租户不存在: {0}",
"GivenTenantIsNotAvailable": "给定的租户不可用: {0}",
"Tenant": "租户",
"Switch": "切换",
"Name": "名称",
"SwitchTenantHint": "将名称字段留空以切换到宿主端.",
"SwitchTenant": "切换租户",
"NotSelected": "未选中"
}
"culture": "zh-Hans",
"texts": {
"GivenTenantIsNotExist": "给定租户不存在:{0}",
"GivenTenantIsNotAvailable": "给定租户不可用:{0}",
"Tenant": "租户",
"Switch": "切换",
"Name": "名称",
"SwitchTenantHint": "将名称字段留空以切换到主机端。",
"SwitchTenant": "切换租户",
"NotSelected": "未选择"
}
}

3
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs

@ -48,7 +48,8 @@ public class SharedThemeGlobalScriptContributor : BundleContributor
"/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/modal-manager.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js"
"/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js"
});
}
}

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

@ -197,565 +197,7 @@
});
}
abp.libs.bootstrapDateRangePicker = {
packageName: "bootstrap-daterangepicker",
createDateRangePicker: function (options) {
options = options || {};
options.singleDatePicker = false;
return this.createDatePicker(options);
},
createSinglePicker: function (options) {
options = options || {};
options.singleDatePicker = true;
return this.createDatePicker(options);
},
createDatePicker: function (options) {
var $container = $('<div class="mb-3"></div>')
var label = $('<label class="form-label"></label>')
if (options.label) {
label.text(options.label)
}
$container.append(label)
var $datePicker = options.singleDatePicker ? $('<abp-date-picker></abp-date-picker>') : $('<abp-date-range-picker></abp-date-range-picker>');
$container.append($datePicker)
var $inputGroup = $('<div class="input-group"></div>');
var $dateInput = $('<input type="text" autocomplete="off" class="form-control" />');
if (options.placeholder) {
$dateInput.attr('placeholder', options.placeholder)
}
if (options.value) {
$dateInput.val(options.value)
}
if (options.name) {
$dateInput.attr('name', options.name)
}
if (options.id) {
$dateInput.attr('id', options.id)
}
if (options.required) {
$dateInput.attr('required', true)
}
if (options.disabled) {
$dateInput.attr('disabled', true)
}
if (options.readonly) {
$dateInput.attr('readonly', true)
}
if(options.placeholder) {
$dateInput.attr('placeholder', options.placeholder)
}
if (options.size) {
switch (options.size) {
case 'Small':
$dateInput.addClass('form-control-sm')
break;
case 'Medium':
$dateInput.addClass('form-control-md')
break;
case 'Large':
$dateInput.addClass('form-control-lg')
break;
default:
break;
}
}
$inputGroup.append($dateInput);
if (options.openButton !== false) {
var $openButton = $('<button type="button" class="btn btn-outline-secondary" tabindex="-1" data-type="open"><i class="fa fa-calendar"></i></button>');
$inputGroup.append($openButton);
if(options.disabled) {
$openButton.attr('disabled', 'disabled')
}
}
if (options.clearButton !== false) {
var $clearButton = $('<button type="button" class="btn btn-outline-secondary" tabindex="-1" data-type="clear"><i class="fa fa-times"></i></button>');
$inputGroup.append($clearButton);
if(options.disabled) {
$clearButton.attr('disabled', 'disabled')
}
}
$datePicker.append($inputGroup);
if (options.startDateName) {
var $hiddenStartDateElement = $('<input type="hidden" data-start-date="true" name="' + options.startDateName + '" />');
$datePicker.append($hiddenStartDateElement);
}
if (options.endDateName) {
var $hiddenEndDateElement = $('<input type="hidden" data-end-date="true" name="' + options.endDateName + '" />');
$datePicker.append($hiddenEndDateElement);
}
if (options.dateName) {
var $hiddenDateElement = $('<input type="hidden" data-date="true" name="' + options.dateName + '" />');
$datePicker.append($hiddenDateElement);
}
$datePicker.data('options', options);
abp.dom.initializers.initializeDateRangePickers($datePicker);
$container[0].datePicker = $datePicker[0];
return $container;
}
};
abp.dom.initializers.initializeDateRangePickers = function ($rootElement) {
function setOptions (options, $datePickerElement, singleDatePicker) {
options.singleDatePicker = singleDatePicker;
var defaultOptions = {
showDropdowns: true,
opens: "center",
drops: "down",
autoApply: true,
autoUpdateInput: false,
showTodayButton: true,
showClearButton: true,
minYear: parseInt(moment().subtract(100, 'year').locale('en').format('YYYY')),
maxYear: parseInt(moment().add(100, 'year').locale('en').format('YYYY')),
locale: {
direction: abp.localization.currentCulture.isRightToLeft ? 'rtl' : 'ltr',
todayLabel: abp.localization.localize('Today', 'AbpUi'),
clearLabel: abp.localization.localize('Clear', 'AbpUi'),
applyLabel: abp.localization.localize('Apply', 'AbpUi'),
},
singleOpenAndClearButton: true
};
var locale = defaultOptions.locale;
$.extend(options, defaultOptions);
$.extend(options, $datePickerElement.data());
if ($.isEmptyObject(options.locale)) {
options.locale = locale;
} else {
locale = options.locale;
}
$.extend(options, $datePickerElement.data("options"));
if ($.isEmptyObject(options.locale)) {
options.locale = locale;
}
if (options.timePicker && options.timePicker24Hour === undefined) {
options.timePicker24Hour = moment.localeData().longDateFormat('LT').indexOf('A') < 1;
}
if (options.dateFormat) {
options.locale = options.locale || {};
options.locale.format = options.dateFormat;
}
if (options.separator) {
options.locale = options.locale || {};
options.locale.separator = options.separator;
}
if (options.ranges) {
$.each(options.ranges, function (key, value) {
let start = value[0];
let end;
if (value.length > 1) {
end = value[1];
} else {
end = value[0];
}
options.ranges[key] = [getMoment(start, options), getMoment(end, options)];
});
}
if (typeof options.template !== 'string' && !(options.template instanceof $))
options.template =
'<div class="daterangepicker">' +
'<div class="ranges"></div>' +
'<div class="drp-calendar left">' +
'<div class="calendar-table"></div>' +
'<div class="calendar-time"></div>' +
'</div>' +
'<div class="drp-calendar right">' +
'<div class="calendar-table"></div>' +
'<div class="calendar-time"></div>' +
'</div>' +
'<div class="drp-buttons">' +
'<button class="applyBtn" disabled="disabled" type="button"></button> ' +
'</div>' +
'</div>';
}
function replaceOpenButton (hasDate,singleOpenAndClearButton, $openButton, $clearButton) {
var hiddenClass = 'd-none';
if (singleOpenAndClearButton) {
if (hasDate) {
$openButton.addClass(hiddenClass);
$clearButton.removeClass(hiddenClass);
$clearButton.insertAfter($openButton);
} else {
$openButton.removeClass(hiddenClass);
$clearButton.addClass(hiddenClass);
$openButton.insertAfter($clearButton);
}
}
}
function getMoment (date, options, dateFormat) {
var isUtc = options.isUtc;
dateFormat = dateFormat || options.dateFormat;
if (!date) {
return isUtc ? moment.utc().startOf('day') : moment().startOf('day');
}
if (isUtc) {
return moment.utc(date, dateFormat);
} else {
return moment(date, dateFormat);
}
}
function getStartDate(options, startDate){
startDate = startDate ? startDate : options.startDate;
startDate = startDate ? getMoment(startDate, options) : null;
if (options.singleDatePicker && !startDate) {
startDate = options.date ? getMoment(options.date, options) : null;
}
if(startDate && startDate.isValid()){
return startDate;
}
return null;
}
function getEndDate(options, endDate){
if (options.singleDatePicker) {
return null;
}
endDate = endDate ? endDate : options.endDate;
endDate = endDate ? getMoment(endDate, options) : null;
if(endDate && endDate.isValid()){
return endDate;
}
return null;
}
function getTodayButton(options, $input){
if (options.showTodayButton) {
var $todayBtn = $('<button type="button" class="btn btn-sm today-btn" data-action="today">' + options.locale.todayLabel + '</button>');
if(options.todayButtonClasses){
$todayBtn.addClass(options.todayButtonClasses);
}else{
$todayBtn.addClass('btn-default');
}
$todayBtn.on('click', function () {
var today = getMoment(undefined, options);
$input.data('daterangepicker').setStartDate(today);
$input.data('daterangepicker').setEndDate(today);
$input.data('daterangepicker').clickApply();
});
return $todayBtn;
}
return null;
}
function getClearButton(options, $input, $dateRangePicker){
if (options.showClearButton) {
var $clearBtn = $('<button type="button" class="btn btn-sm clear-btn" data-action="clear">' + options.locale.clearLabel + '</button>');
if(options.clearButtonClasses){
$clearBtn.addClass(options.clearButtonClasses);
}else{
$clearBtn.addClass('btn-default');
}
$clearBtn.on('click', function () {
$input.val('').trigger('change');
$dateRangePicker.hide();
});
return $clearBtn;
}
return null;
}
function addExtraButtons(options, $dateRangePicker, $input) {
var extraButtons = [getTodayButton(options, $input), getClearButton(options, $input, $dateRangePicker)];
if ($dateRangePicker.container.hasClass('auto-apply')) {
var $div = $('<div class="drp-buttons extra-buttons"></div>');
$div.css('display', 'block');
$.each(extraButtons, function (index, value) {
$div.prepend(value);
});
$div.insertAfter($dateRangePicker.container.find('.drp-buttons'));
} else {
$.each(extraButtons, function (index, value) {
$dateRangePicker.container.find('.drp-buttons').prepend(value);
});
}
}
function addOpenButtonClick($openButton, $dateRangePicker){
if(!$openButton){
return;
}
$dateRangePicker.outsideClick = function (e) {
var target = $(e.target);
// if the page is clicked anywhere except within the daterangerpicker/button itself then call this.hide()
if (
// ie modal dialog fix
e.type == "focusin" ||
target.closest(this.element).length ||
target.closest(this.container).length ||
target.closest('.calendar-table').length ||
target.closest($openButton).length
) {
return;
}
this.hide();
this.element.trigger('outsideClick.daterangepicker', this);
};
$openButton.on('click', function () {
$dateRangePicker.toggle();
});
}
function extendDateFormat (format,options) {
if (options.timePicker) {
if (options.timePicker24Hour) {
if (options.timePickerSeconds) {
format += " HH:mm:ss";
} else {
format += " HH:mm";
}
} else {
if (options.timePickerSeconds) {
format += ' ' + " hh:mm:ss A"
} else {
format += " hh:mm A";
}
}
}
return format;
}
function fillInput($input, startDate, endDate, options) {
if (options.singleDatePicker) {
if (startDate) {
$input.val(startDate.format(options.dateFormat));
}
} else {
if (startDate && endDate) {
$input.val(startDate.format(options.dateFormat) + options.separator + endDate.format(options.dateFormat));
}
}
}
$rootElement
.findWithSelf('abp-date-picker,abp-date-range-picker')
.each(function () {
var $this = $(this);
var $input = $this.find('.input-group input[type="text"]')
if ($input.data('daterangepicker')) {
return;
}
var $openButton = $this.find('button[data-type="open"]')
var $clearButton = $this.find('button[data-type="clear"]')
var singleDatePicker = $this.is('abp-date-picker')
var options = {};
setOptions(options, $this, singleDatePicker);
var isIso = options.isIso;
var dateFormat = options.dateFormat;
var separator = options.separator;
var defaultDateFormat = extendDateFormat("YYYY-MM-DD", options);
var singleOpenAndClearButton = options.singleOpenAndClearButton && $clearButton.length > 0 && $openButton.length > 0;
var startDate = getStartDate(options);
var endDate = getEndDate(options);
if (startDate) {
options.startDate = startDate;
}
if (endDate) {
options.endDate = endDate;
}
$input.daterangepicker(options);
var $dateRangePicker = $input.data('daterangepicker');
addExtraButtons(options, $dateRangePicker, $input);
addOpenButtonClick($openButton, $dateRangePicker);
if (!dateFormat) {
dateFormat = extendDateFormat(moment.localeData().longDateFormat('L'), options);
options.dateFormat = dateFormat;
}
if (!separator) {
separator = $dateRangePicker.locale.separator;
options.separator = separator;
}
fillInput($input, startDate, endDate, options);
$input.on('apply.daterangepicker', function (ev, picker) {
if (singleDatePicker) {
$(this).val(picker.startDate.format(dateFormat));
} else {
$(this).val(picker.startDate.format(dateFormat) + separator + picker.endDate.format(dateFormat));
}
$(this).trigger('change');
});
$input.on('cancel.daterangepicker', function (ev, picker) {
$(this).val('');
$(this).trigger('change');
});
$input.on('show.daterangepicker', function (ev, picker) {
var momentStartDate = getMoment(startDate, options);
var momentEndDate = getMoment(endDate, options);
if (momentStartDate.isValid()) {
picker.setStartDate(momentStartDate);
picker.setEndDate(momentEndDate);
}
if (momentEndDate.isValid() && !singleDatePicker) {
picker.setEndDate(momentEndDate);
}
});
$clearButton.on('click', function () {
$input.val('');
$input.trigger('change');
});
var firstTrigger = true;
$input.on('change', function () {
if ($(this).val() !== '') {
replaceOpenButton(true, singleOpenAndClearButton, $openButton, $clearButton);
} else {
replaceOpenButton(false, singleOpenAndClearButton, $openButton, $clearButton);
}
var dates = $(this).val().split(separator);
if (dates.length === 2) {
startDate = formatDate(getStartDate(options, dates[0]));
endDate = formatDate(getEndDate(options, dates[1]));
} else {
if (dates[0]) {
startDate = formatDate(getStartDate(options, dates[0]));
}
else {
if(!firstTrigger){
startDate = null;
}
}
if(!firstTrigger){
endDate = null;
}
}
if (!startDate) {
replaceOpenButton(false, singleOpenAndClearButton, $openButton, $clearButton);
$(this).val('');
}
if (!singleDatePicker) {
var input1 = $this.find("input[data-start-date]")
input1.val(startDate);
var input2 = $this.find("input[data-end-date]")
input2.val(endDate);
} else {
var input = $this.find("input[data-date]")
input.val(startDate);
}
if (singleDatePicker) {
$this.data('date', startDate);
$input.data('date', startDate);
} else {
$this.data('startDate', startDate);
$this.data('endDate', endDate);
$input.data('startDate', startDate);
$input.data('endDate', endDate);
}
firstTrigger = false;
});
function formatDate(date) {
if (date) {
if (isIso) {
return date.locale('en').format();
}
return date.locale('en').format(defaultDateFormat)
}
return null;
}
function getFormattedStartDate() {
if (startDate) {
return getMoment(startDate, options).format(dateFormat);
}
return null;
}
function getFormattedEndDate() {
if (endDate) {
return getMoment(endDate, options).format(dateFormat);
}
return null;
}
if (singleDatePicker) {
$this[0].getFormattedDate = getFormattedStartDate;
$input[0].getFormattedDate = getFormattedStartDate;
$dateRangePicker.getFormattedDate = getFormattedStartDate;
} else {
$dateRangePicker.getFormattedStartDate = getFormattedStartDate;
$dateRangePicker.getFormattedEndDate = getFormattedEndDate;
$this[0].getFormattedStartDate = getFormattedStartDate;
$this[0].getFormattedEndDate = getFormattedEndDate;
$input[0].getFormattedStartDate = getFormattedStartDate;
$input[0].getFormattedEndDate = getFormattedEndDate;
}
$input.trigger('change');
});
}
abp.dom.initializers.initializeAbpCspStyles = function ($abpCspStyles){
$abpCspStyles.attr("rel", "stylesheet");
@ -769,7 +211,6 @@
abp.dom.initializers.initializeScript(args.$el);
abp.dom.initializers.initializeAutocompleteSelects(args.$el.findWithSelf('.auto-complete-select'));
abp.dom.initializers.initializeAbpCspStyles($("link[abp-csp-style]"));
abp.dom.initializers.initializeDateRangePickers(args.$el);
});
abp.dom.onNodeRemoved(function (args) {
@ -788,7 +229,6 @@
abp.dom.initializers.initializePopovers($('[data-bs-toggle="popover"]'));
abp.dom.initializers.initializeTimeAgos($('.timeago'));
abp.dom.initializers.initializeDatepickers($(document));
abp.dom.initializers.initializeDateRangePickers($(document));
abp.dom.initializers.initializeForms($('form'));
abp.dom.initializers.initializeAutocompleteSelects($('.auto-complete-select'));
$('[data-auto-focus="true"]').first().findWithSelf('input,select').focus();

711
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js

@ -0,0 +1,711 @@
(function ($) {
abp.dom = abp.dom || {};
abp.dom.initializers = abp.dom.initializers || {};
abp.libs.bootstrapDateRangePicker = {
packageName: "bootstrap-daterangepicker",
createDateRangePicker: function (options) {
options = options || {};
options.singleDatePicker = false;
return this.createDatePicker(options);
},
createSinglePicker: function (options) {
options = options || {};
options.singleDatePicker = true;
return this.createDatePicker(options);
},
createDatePicker: function (options) {
var $container = $('<div class="mb-3"></div>')
var label = $('<label class="form-label"></label>')
if (options.label) {
label.text(options.label)
}
$container.append(label)
var $datePicker = options.singleDatePicker ? $('<abp-date-picker></abp-date-picker>') : $('<abp-date-range-picker></abp-date-range-picker>');
$container.append($datePicker)
var $inputGroup = $('<div class="input-group"></div>');
var $dateInput = $('<input type="text" autocomplete="off" class="form-control" />');
if (options.value) {
$dateInput.val(options.value)
}
const setAttribute = attr => {
if (options[attr]) {
$dateInput.attr(attr, options[attr])
}
}
setAttribute('placeholder');
setAttribute('name');
setAttribute('id');
setAttribute('required');
setAttribute('disabled');
setAttribute('readonly');
const sizeMap = {
'Small': 'form-control-sm',
'Medium': 'form-control-md',
'Large': 'form-control-lg'
};
if (options.size && sizeMap[options.size]) {
$dateInput.addClass(sizeMap[options.size])
}
$inputGroup.append($dateInput);
const addButton = (button, buttonHTML) => {
if (options[button] !== false) {
var $button = $(buttonHTML);
$inputGroup.append($button);
if (options.disabled) {
$button.attr('disabled', 'disabled')
}
}
}
addButton('openButton', '<button type="button" class="btn btn-outline-secondary" tabindex="-1" data-type="open"><i class="fa fa-calendar"></i></button>');
addButton('clearButton', '<button type="button" class="btn btn-outline-secondary" tabindex="-1" data-type="clear"><i class="fa fa-times"></i></button>');
$datePicker.append($inputGroup);
const addHiddenInput = (name, attributeName) => {
if (name) {
var $hiddenElement = $(`<input type="hidden" name="${name}" ${attributeName}="true" />`);
$datePicker.append($hiddenElement);
}
}
addHiddenInput(options.startDateName, 'data-start-date');
addHiddenInput(options.endDateName, 'data-end-date');
addHiddenInput(options.dateName, 'data-date');
$datePicker.data('options', options);
abp.dom.initializers.initializeDateRangePickers($datePicker);
$container[0].datePicker = $datePicker[0];
return $container;
}
};
function isEmptyDate(date, options) {
if(!date) {
return true;
}
if(typeof date === 'string') {
return date.trim() === '';
}
return !AbpDate(date, options).isValid();
}
function AbpDate(originalDate, options, format) {
var _moment = convertToMoment(originalDate, options, format);
function _clone() {
return AbpDate(_moment, options, format);
}
function _isSame(date) {
return _format(options.inputDateFormat) === AbpDate(date, options).format(options.inputDateFormat);
}
function _isValid() {
return _moment && _moment.isValid();
}
function _format(format) {
if (_isValid()) {
return _moment.format(format);
}
return '';
}
function _valueOf() {
return _isValid() ? _moment.valueOf() : undefined;
}
function _toString() {
return _moment.toString();
}
return {
_moment: _moment,
clone: _clone,
isSame: _isSame,
isValid: _isValid,
format: _format,
valueOf: _valueOf,
toString: _toString,
date: _moment.toISOString(),
isAbpDate: true
};
}
function replaceOpenButton(hasDate, singleOpenAndClearButton, $openButton, $clearButton) {
const hideButtonClass = 'd-none';
if (!singleOpenAndClearButton) {
return;
}
if (hasDate) {
$openButton.addClass(hideButtonClass);
$clearButton.removeClass(hideButtonClass);
$clearButton.insertAfter($openButton);
} else {
$openButton.removeClass(hideButtonClass);
$clearButton.addClass(hideButtonClass);
$openButton.insertAfter($clearButton);
}
}
function convertToMoment(value, options, dateFormat) {
if(!value) {
// invalid date
return moment('');
}
options = options || {};
var formats = new Set([dateFormat, options.visibleDateFormat, options.inputDateFormat, undefined]);
if (typeof value === 'string') {
for(var format of formats) {
var date = moment(value, format);
if(date.isValid()) {
return maybeUtc(date, options);
}
}
}
if (value.isAbpDate) {
return maybeUtc(value._moment.clone(), options);
}
if(value.isLuxonDateTime) {
return maybeUtc(moment(value.toISO()), options);
}
return maybeUtc(moment(value), options);
}
function maybeUtc(date, options) {
if (options.isUtc) {
date = date.utc();
}else{
date = date.local();
}
return date;
}
function getTodayButton(options, $dateRangePicker) {
if (options.showTodayButton) {
var $todayBtn = $('<button type="button" class="btn btn-sm today-btn" data-action="today">' + options.locale.todayLabel + '</button>');
if (options.todayButtonClasses) {
$todayBtn.addClass(options.todayButtonClasses);
} else {
$todayBtn.addClass('btn-default');
}
$todayBtn.on('click', function () {
var today = moment();
$dateRangePicker.setStartDate(today);
$dateRangePicker.setEndDate(today);
if(options.singleDatePicker && options.autoApply){
$dateRangePicker.clickApply();
}else{
$dateRangePicker.updateView();
}
});
return $todayBtn;
}
return null;
}
function getClearButton(options, $input, $dateRangePicker) {
if (options.showClearButton && options.autoUpdateInput !== true) {
var $clearBtn = $('<button type="button" class="btn btn-sm clear-btn" data-action="clear">' + options.locale.clearLabel + '</button>');
if (options.clearButtonClasses) {
$clearBtn.addClass(options.clearButtonClasses);
} else {
$clearBtn.addClass('btn-default');
}
$clearBtn.on('click', function () {
$input.trigger('cancel.daterangepicker', $dateRangePicker);
$dateRangePicker.hide();
});
return $clearBtn;
}
return null;
}
function addExtraButtons(options, $dateRangePicker, $input) {
var extraButtons = [getTodayButton(options, $dateRangePicker), getClearButton(options, $input, $dateRangePicker)];
if ($dateRangePicker.container.hasClass('auto-apply')) {
var $div = $('<div class="drp-buttons extra-buttons"></div>');
$div.css('display', 'block');
$.each(extraButtons, function (index, value) {
$div.prepend(value);
});
$div.insertAfter($dateRangePicker.container.find('.drp-buttons'));
} else {
$.each(extraButtons, function (index, value) {
$dateRangePicker.container.find('.drp-buttons').prepend(value);
});
}
}
function addOpenButtonClick($openButton, $dateRangePicker) {
if (!$openButton) {
return;
}
$dateRangePicker.outsideClick = function (e) {
var target = $(e.target);
// if the page is clicked anywhere except within the daterangerpicker/button itself then call this.hide()
if (
// ie modal dialog fix
e.type == "focusin" ||
target.closest(this.element).length ||
target.closest(this.container).length ||
target.closest('.calendar-table').length ||
target.closest($openButton).length
) {
return;
}
this.hide();
this.element.trigger('outsideClick.daterangepicker', this);
};
$openButton.on('click', function () {
$dateRangePicker.toggle();
});
}
function extendDateFormat(format, options) {
if (options.timePicker) {
if (options.timePicker24Hour) {
if (options.timePickerSeconds) {
format += " HH:mm:ss";
} else {
format += " HH:mm";
}
} else {
if (options.timePickerSeconds) {
format += ' ' + " hh:mm:ss A"
} else {
format += " hh:mm A";
}
}
}
return format;
}
function setOptions(options, $datePickerElement, singleDatePicker) {
options.singleDatePicker = singleDatePicker;
var defaultOptions = {
showDropdowns: true,
opens: "center",
drops: "down",
autoApply: true,
autoUpdateInput: false,
showTodayButton: true,
showClearButton: true,
minYear: parseInt(moment().subtract(100, 'year').locale('en').format('YYYY')),
maxYear: parseInt(moment().add(100, 'year').locale('en').format('YYYY')),
locale: {
direction: abp.localization.currentCulture.isRightToLeft ? 'rtl' : 'ltr',
todayLabel: abp.localization.localize('Today', 'AbpUi'),
clearLabel: abp.localization.localize('Clear', 'AbpUi'),
applyLabel: abp.localization.localize('Apply', 'AbpUi'),
},
singleOpenAndClearButton: true
};
var locale = defaultOptions.locale;
$.extend(options, defaultOptions);
$.extend(options, $datePickerElement.data());
if ($.isEmptyObject(options.locale)) {
options.locale = locale;
} else {
locale = options.locale;
}
$.extend(options, $datePickerElement.data("options"));
if ($.isEmptyObject(options.locale)) {
options.locale = locale;
}
if(options.timePickerSeconds === true && options.timePicker !== false) {
options.timePicker = true;
}
if (options.timePicker && options.timePicker24Hour === undefined) {
options.timePicker24Hour = moment.localeData().longDateFormat('LT').indexOf('A') < 1;
}
options.visibleDateFormat = options.visibleDateFormat || options.dateFormat || extendDateFormat(moment.localeData().longDateFormat('L'), options);
options.locale = options.locale || {};
options.locale.format = options.visibleDateFormat;
if (options.separator) {
options.locale = options.locale || {};
options.locale.separator = options.separator;
}
if (options.ranges) {
$.each(options.ranges, function (key, value) {
let start = value[0];
let end;
if (value.length > 1) {
end = value[1];
} else {
end = value[0];
}
options.ranges[key] = [AbpDate(start, options), AbpDate(end, options)];
});
}
if (typeof options.template !== 'string' && !(options.template instanceof $))
options.template =
'<div class="daterangepicker">' +
'<div class="ranges"></div>' +
'<div class="drp-calendar left">' +
'<div class="calendar-table"></div>' +
'<div class="calendar-time"></div>' +
'</div>' +
'<div class="drp-calendar right">' +
'<div class="calendar-table"></div>' +
'<div class="calendar-time"></div>' +
'</div>' +
'<div class="drp-buttons">' +
'<button class="applyBtn" disabled="disabled" type="button"></button> ' +
'</div>' +
'</div>';
}
function getAccessorDescriptor(obj, prop) {
if (!obj) {
return;
}
var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
if (descriptor) {
return descriptor;
}
return getAccessorDescriptor(Object.getPrototypeOf(obj), prop);
}
function addHiddenDateInputSetListener(obj, prop, listener, options) {
if (!obj) {
return;
}
var descriptor = getAccessorDescriptor(obj, prop);
if (!descriptor) {
return;
}
var originalSet = descriptor.set;
descriptor.set = function (value) {
originalSet.call(this, formatHiddenDate(value, options));
if (value.isAbpDate) {
return;
}
listener.call(this, value);
};
Object.defineProperty(obj, prop, descriptor);
}
function formatHiddenDate(date, options) {
date = convertToMoment(date, options, options.inputDateFormat);
if (date.isValid()) {
if (options.isIso) {
return date.toISOString();
}
return date.locale('en').format(options.inputDateFormat)
}
return '';
}
abp.dom.initializers.initializeDateRangePickers = function ($rootElement) {
$rootElement
.findWithSelf('abp-date-picker,abp-date-range-picker')
.each(function () {
var $this = $(this);
var $input = $this.find('.input-group input[type="text"]')
var $startDateInput = $this.find('input[data-start-date]');
var $endDateInput = $this.find('input[data-end-date]');
var $dateInput = $this.find('input[data-date]');
if ($input.data('daterangepicker')) {
return;
}
var $openButton = $this.find('button[data-type="open"]')
var $clearButton = $this.find('button[data-type="clear"]')
var singleDatePicker = $this.is('abp-date-picker')
var options = {};
setOptions(options, $this, singleDatePicker);
options.inputDateFormat = options.inputDateFormat || extendDateFormat("YYYY-MM-DD", options);
var singleOpenAndClearButton = options.singleOpenAndClearButton && $clearButton.length > 0 && $openButton.length > 0;
var startDate = AbpDate(options.startDate || options.date || (options.autoUpdateInput ? new Date() : undefined), options);
var oldStartDate = AbpDate(undefined, options);
var endDate = AbpDate(options.endDate || undefined, options);
var oldEndDate = AbpDate(undefined, options);
options.startDate = convertToMoment(startDate, options);
options.endDate = convertToMoment(endDate, options);
$input.daterangepicker(options);
var $dateRangePicker = $input.data('daterangepicker');
$input.data('format', options.visibleDateFormat);
$this.data('daterangepicker', $dateRangePicker);
$startDateInput.data('daterangepicker', $dateRangePicker);
$startDateInput.data('format', options.inputDateFormat);
$endDateInput.data('daterangepicker', $dateRangePicker);
$endDateInput.data('format', options.inputDateFormat);
$dateInput.data('daterangepicker', $dateRangePicker);
$dateInput.data('format', options.inputDateFormat);
addExtraButtons(options, $dateRangePicker, $input);
addOpenButtonClick($openButton, $dateRangePicker);
if (!options.separator) {
options.separator = $dateRangePicker.locale.separator;
}
function fillInput() {
if (options.singleDatePicker) {
if (!isEmptyDate(startDate, options)) {
$input.val(startDate.format(options.visibleDateFormat));
}
} else {
if (!isEmptyDate(startDate, options) && !isEmptyDate(endDate, options)) {
$input.val(startDate.format(options.visibleDateFormat) + options.separator + endDate.format(options.visibleDateFormat));
}
}
}
fillInput();
function changeDate(isTrigger = true, isInputTrigger = true, isDateRangePickerTrigger = true) {
if (singleDatePicker) {
if (oldStartDate.isSame(startDate)) {
return;
}
setDataDates(startDate, $dateInput, '');
$dateInput.val(startDate);
if (isTrigger) {
triggerDateChange($dateInput, startDate);
}
} else {
if (!oldStartDate.isSame(startDate)) {
setDataDates(startDate, $startDateInput, 'start');
$startDateInput.val(startDate);
if (isTrigger) {
triggerDateChange($startDateInput, startDate);
}
}
if (!oldEndDate.isSame(endDate)) {
setDataDates(endDate, $endDateInput, 'end');
$endDateInput.val(endDate);
if (isTrigger) {
triggerDateChange($endDateInput, endDate);
}
}
}
if (isTrigger && isInputTrigger) {
if (!oldStartDate.isSame(startDate) || !oldEndDate.isSame(endDate)) {
triggerDateChange($this, startDate, isDateRangePickerTrigger);
triggerDateChange($input, startDate, isDateRangePickerTrigger);
}
}
}
function setDataDates(date, $selfInput, prefix){
date = AbpDate(date, options).date;
$selfInput.data('date', date);
$this.data(prefix + 'date', date);
$input.data(prefix + 'date', date);
}
function triggerDateChange($selfInput, value, isDateRangePickerTrigger) {
$selfInput.trigger('change');
if(isDateRangePickerTrigger !== false){
if(isEmptyDate(value, options)) {
$selfInput.trigger('cancel.daterangepicker', $dateRangePicker);
}else {
$selfInput.trigger('apply.daterangepicker', $dateRangePicker);
}
}
}
$input.on('apply.daterangepicker', function (ev, picker) {
if(startDate.isSame(picker.startDate) && (singleDatePicker || endDate.isSame(picker.endDate))) {
fillInput();
picker.hide();
return;
}
setStartDateByMomentDate(picker.startDate);
setEndDateByMomentEndDate(picker.endDate);
fillInput();
inputChangeHandler(true, true, false);
});
$input.on('show.daterangepicker', function (ev, picker) {
const today = moment();
if(isEmptyDate(startDate, options)){
picker.setStartDate(today);
}else{
picker.setStartDate(convertToMoment(startDate, options, options.inputDateFormat));
}
if(singleDatePicker){
picker.setEndDate(picker.startDate);
}else if(isEmptyDate(endDate, options)){
picker.setEndDate(today);
}
else{
picker.setEndDate(convertToMoment(endDate, options, options.inputDateFormat));
}
picker.updateView();
});
$input.on('cancel.daterangepicker', function (ev, picker) {
if(!$input.val()){
picker.hide();
return;
}
$input.val('');
setStartDateByMomentDate();
setEndDateByMomentEndDate();
inputChangeHandler(true, true, false);
});
$clearButton.on('click', function (e) {
$input.trigger('cancel.daterangepicker', $dateRangePicker);
});
$input.on('change', function (e) {
var dates = $input.val().split(options.separator);
var newStartDate = convertToMoment(dates[0], options, options.visibleDateFormat);
var newEndDate = undefined;
if (dates.length === 2) {
newEndDate = convertToMoment(dates[1], options, options.visibleDateFormat);
}else{
newEndDate = convertToMoment(undefined, options, options.visibleDateFormat);
}
if (startDate.isSame(newStartDate) && (singleDatePicker || endDate.isSame(newEndDate))) {
fillInput();
return;
}
setStartDateByMomentDate(newStartDate);
setEndDateByMomentEndDate(newEndDate);
if(newStartDate.isValid()){
$dateRangePicker.setStartDate(newStartDate);
}else{
$dateRangePicker.setStartDate();
}
if(newEndDate.isValid()){
$dateRangePicker.setEndDate(newEndDate);
}else{
$dateRangePicker.setEndDate();
}
fillInput();
inputChangeHandler(undefined, false);
});
function inputChangeHandler(isTrigger, isInputTrigger, isDateRangePickerTrigger) {
var value = $input.val();
if (value !== '') {
replaceOpenButton(true, singleOpenAndClearButton, $openButton, $clearButton);
} else {
replaceOpenButton(false, singleOpenAndClearButton, $openButton, $clearButton);
}
if (isEmptyDate(startDate, options)) {
replaceOpenButton(false, singleOpenAndClearButton, $openButton, $clearButton);
$this.val('');
}
changeDate(isTrigger, isInputTrigger, isDateRangePickerTrigger);
}
const setStartDateByMomentDate = (momentDate) => {
oldStartDate = startDate;
startDate = AbpDate(momentDate, options);
}
const setEndDateByMomentEndDate = (momentDate) => {
if(singleDatePicker){
return;
}
oldEndDate = endDate;
endDate = AbpDate(momentDate, options);
}
function startDateInputHandler(value) {
value = convertToMoment(value, options);
if (startDate.isSame(value)) {
return;
}
setStartDateByMomentDate(value);
$dateRangePicker.setStartDate(value);
fillInput();
inputChangeHandler(false);
}
function endDateInputHandler(value) {
value = convertToMoment(value, options);
if (endDate.isSame(value)) {
return;
}
setEndDateByMomentEndDate(value);
$dateRangePicker.setEndDate(value);
fillInput();
inputChangeHandler(false);
}
addHiddenDateInputSetListener($startDateInput[0], 'value', startDateInputHandler, options);
addHiddenDateInputSetListener($endDateInput[0], 'value', endDateInputHandler, options);
addHiddenDateInputSetListener($dateInput[0], 'value', startDateInputHandler, options);
inputChangeHandler(false, false, false);
});
}
$(function () {
abp.dom.initializers.initializeDateRangePickers($('body'));
});
})(jQuery);

12
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/zh-Hans.json

@ -1,10 +1,10 @@
{
"culture": "zh-Hans",
"texts": {
"Volo.Authorization:010001": "授权失败! 提供的策略尚未授予.",
"Volo.Authorization:010002": "授权失败! 提供的策略尚未授予: {PolicyName}",
"Volo.Authorization:010003": "授权失败! 提供的策略未授予提供的资源: {ResourceName}",
"Volo.Authorization:010004": "授权失败! 提供的要求未授予提供的资源: {ResourceName}",
"Volo.Authorization:010005": "授权失败! 提供的要求未授予提供的资源: {ResourceName}"
"Volo.Authorization:010001": "授权失败!提供的策略尚未授予。",
"Volo.Authorization:010002": "授权失败!提供的策略尚未授予: {PolicyName}",
"Volo.Authorization:010003": "授权失败!提供的策略未授予提供的资源:{ResourceName}",
"Volo.Authorization:010004": "授权失败!提供的要求未授予提供的资源:{ResourceName}",
"Volo.Authorization:010005": "授权失败!提供的要求未授予提供的资源:{ResourceName}"
}
}
}

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

@ -24,6 +24,7 @@
<PackageReference Include="Polly.Extensions.Http" />
<PackageReference Include="LibGit2Sharp" />
<PackageReference Include="StackExchange.Redis" />
<PackageReference Include="DeepL.net" />
</ItemGroup>
<ItemGroup>
@ -31,6 +32,7 @@
<ProjectReference Include="..\Volo.Abp.Http\Volo.Abp.Http.csproj" />
<ProjectReference Include="..\Volo.Abp.IdentityModel\Volo.Abp.IdentityModel.csproj" />
<ProjectReference Include="..\Volo.Abp.Json\Volo.Abp.Json.csproj" />
<ProjectReference Include="..\Volo.Abp.Localization\Volo.Abp.Localization.csproj" />
<PackageReference Include="Newtonsoft.Json" />
</ItemGroup>
</Project>

4
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs

@ -10,6 +10,7 @@ using Volo.Abp.Domain;
using Volo.Abp.Http;
using Volo.Abp.IdentityModel;
using Volo.Abp.Json;
using Volo.Abp.Localization;
using Volo.Abp.Minify;
using Volo.Abp.Modularity;
@ -20,7 +21,8 @@ namespace Volo.Abp.Cli;
typeof(AbpJsonModule),
typeof(AbpIdentityModelModule),
typeof(AbpMinifyModule),
typeof(AbpHttpModule)
typeof(AbpHttpModule),
typeof(AbpLocalizationModule)
)]
public class AbpCliCoreModule : AbpModule
{

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

@ -19,6 +19,7 @@ using Volo.Abp.Cli.ProjectBuilding.Events;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
using Volo.Abp.Cli.ProjectModification;
using Volo.Abp.Cli.Utils;
using Volo.Abp.Cli.Version;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Local;
@ -44,7 +45,8 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien
IBundlingService bundlingService,
ITemplateInfoProvider templateInfoProvider,
TemplateProjectBuilder templateProjectBuilder,
AngularThemeConfigurer angularThemeConfigurer) :
AngularThemeConfigurer angularThemeConfigurer,
CliVersionService cliVersionService) :
base(connectionStringProvider,
solutionPackageVersionFinder,
cmdHelper,
@ -55,7 +57,8 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien
themePackageAdder,
eventBus,
bundlingService,
angularThemeConfigurer)
angularThemeConfigurer,
cliVersionService)
{
TemplateInfoProvider = templateInfoProvider;
TemplateProjectBuilder = templateProjectBuilder;

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

@ -22,6 +22,7 @@ using Volo.Abp.Cli.ProjectBuilding.Templates.Microservice;
using Volo.Abp.Cli.ProjectBuilding.Templates.Module;
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
using Volo.Abp.Cli.Utils;
using Volo.Abp.Cli.Version;
using Volo.Abp.EventBus.Local;
namespace Volo.Abp.Cli.Commands;
@ -42,6 +43,8 @@ public abstract class ProjectCreationCommandBase
public ThemePackageAdder ThemePackageAdder { get; }
public AngularThemeConfigurer AngularThemeConfigurer { get; }
public CliVersionService CliVersionService { get; }
public ProjectCreationCommandBase(
ConnectionStringProvider connectionStringProvider,
@ -54,7 +57,8 @@ public abstract class ProjectCreationCommandBase
ThemePackageAdder themePackageAdder,
ILocalEventBus eventBus,
IBundlingService bundlingService,
AngularThemeConfigurer angularThemeConfigurer)
AngularThemeConfigurer angularThemeConfigurer,
CliVersionService cliVersionService)
{
_bundlingService = bundlingService;
ConnectionStringProvider = connectionStringProvider;
@ -67,6 +71,7 @@ public abstract class ProjectCreationCommandBase
EventBus = eventBus;
ThemePackageAdder = themePackageAdder;
AngularThemeConfigurer = angularThemeConfigurer;
CliVersionService = cliVersionService;
Logger = NullLogger<NewCommand>.Instance;
}
@ -86,7 +91,7 @@ public abstract class ProjectCreationCommandBase
Logger.LogInformation("Preview: yes");
#if !DEBUG
var cliVersion = await CliService.GetCurrentCliVersionAsync(typeof(CliService).Assembly);
var cliVersion = await CliVersionService.GetCurrentCliVersionAsync();
if (!cliVersion.IsPrerelease)
{
@ -426,8 +431,17 @@ public abstract class ProjectCreationCommandBase
return;
}
var isModuleTemplate = ModuleTemplateBase.IsModuleTemplate(projectArgs.TemplateName);
var isWebassembly = projectArgs.UiFramework == UiFramework.Blazor;
var message = isWebassembly ? "Generating bundles for Blazor Wasm" : "Generating bundles for MAUI Blazor";
var message = isWebassembly || isModuleTemplate
? "Generating bundles for Blazor Wasm"
: "Generating bundles for MAUI Blazor";
var projectType = isWebassembly || isModuleTemplate
? BundlingConsts.WebAssembly
: BundlingConsts.MauiBlazor;
Logger.LogInformation(message + "...");
await EventBus.PublishAsync(new ProjectCreationProgressEvent
@ -435,19 +449,26 @@ public abstract class ProjectCreationCommandBase
Message = message
}, false);
var searchPattern = isWebassembly ? "*.Blazor.csproj" : "*.MauiBlazor.csproj";
var path = projectArgs.OutputFolder;
if (projectArgs.TemplateName == MicroserviceProTemplate.TemplateName)
if (isModuleTemplate)
{
path = Path.Combine(path, "host");
searchPattern = "*.Blazor.Host.csproj";
}
else if (MicroserviceTemplateBase.IsMicroserviceTemplate(projectArgs.TemplateName))
{
path = Path.Combine(path, "apps");
}
var directory = Path.GetDirectoryName(
Directory.GetFiles(path, isWebassembly ? "*.Blazor.csproj" : "*.MauiBlazor.csproj", SearchOption.AllDirectories).First()
Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories).First()
);
await _bundlingService.BundleAsync(directory, true, projectType: isWebassembly ? BundlingConsts.WebAssembly : BundlingConsts.MauiBlazor);
await _bundlingService.BundleAsync(directory, true, projectType);
}
protected virtual bool ShouldRunBundleCommand(ProjectBuildArgs projectArgs)
{
if ((AppTemplateBase.IsAppTemplate(projectArgs.TemplateName) || AppNoLayersTemplateBase.IsAppNoLayersTemplate(projectArgs.TemplateName))
@ -456,7 +477,12 @@ public abstract class ProjectCreationCommandBase
return true;
}
if (projectArgs.TemplateName == MicroserviceProTemplate.TemplateName && projectArgs.UiFramework is UiFramework.Blazor)
if (MicroserviceServiceTemplateBase.IsMicroserviceTemplate(projectArgs.TemplateName) && projectArgs.UiFramework is UiFramework.Blazor)
{
return true;
}
if (ModuleTemplateBase.IsModuleTemplate(projectArgs.TemplateName) && projectArgs.UiFramework != UiFramework.None)
{
return true;
}

304
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/TranslateCommand.cs

@ -5,75 +5,82 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DeepL;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Volo.Abp.Cli.Args;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization.Json;
namespace Volo.Abp.Cli.Commands;
public class TranslateCommand : IConsoleCommand, ITransientDependency
{
public const string Name = "translate";
public ILogger<TranslateCommand> Logger { get; set; }
public Task ExecuteAsync(CommandLineArgs commandLineArgs)
public async Task ExecuteAsync(CommandLineArgs commandLineArgs)
{
var currentDirectory = Directory.GetCurrentDirectory();
var apply = commandLineArgs.Options.ContainsKey(Options.Apply.Short) || commandLineArgs.Options.ContainsKey(Options.Apply.Long);
if (apply)
// Verify
if (commandLineArgs.Options.ContainsKey(Options.Verify.Long))
{
var inputFile = Path.Combine(currentDirectory,
commandLineArgs.Options.GetOrNull(Options.File.Short, Options.File.Long)
?? "abp-translation.json");
Logger.LogInformation("Abp translate apply...");
Logger.LogInformation("Input file: " + inputFile);
ApplyAbpTranslateInfo(currentDirectory, inputFile);
await VerifyJsonAsync(currentDirectory);
return;
}
else
{
var targetCulture = commandLineArgs.Options.GetOrNull(Options.Culture.Short, Options.Culture.Long);
if (targetCulture == null)
{
throw new CliUsageException(
"Target culture is missing!" +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
var referenceCulture = commandLineArgs.Options.GetOrNull(Options.ReferenceCulture.Short, Options.ReferenceCulture.Long)
?? "en";
var outputFile = Path.Combine(currentDirectory,
commandLineArgs.Options.GetOrNull(Options.Output.Short, Options.Output.Long)
?? "abp-translation.json");
var referenceCulture = commandLineArgs.Options.GetOrNull(Options.ReferenceCulture.Short, Options.ReferenceCulture.Long) ?? "en";
var allValues = commandLineArgs.Options.ContainsKey(Options.AllValues.Short) || commandLineArgs.Options.ContainsKey(Options.AllValues.Long);
var allValues = commandLineArgs.Options.ContainsKey(Options.AllValues.Short) ||
commandLineArgs.Options.ContainsKey(Options.AllValues.Long);
// Apply abp-translation.json file
if (commandLineArgs.Options.ContainsKey(Options.Apply.Short) || commandLineArgs.Options.ContainsKey(Options.Apply.Long))
{
var inputFile = Path.Combine(currentDirectory, commandLineArgs.Options.GetOrNull(Options.File.Short, Options.File.Long) ?? "abp-translation.json");
await ApplyAbpTranslateInfoAsync(currentDirectory, inputFile);
return;
}
Logger.LogInformation("Abp translate...");
Logger.LogInformation("Target culture: " + targetCulture);
Logger.LogInformation("Reference culture: " + referenceCulture);
Logger.LogInformation("Output file: " + outputFile);
var targetCulture = commandLineArgs.Options.GetOrNull(Options.Culture.Short, Options.Culture.Long);
if (targetCulture == null)
{
throw new CliUsageException("Target culture is missing!" + Environment.NewLine + Environment.NewLine + GetUsageInfo());
}
if (allValues)
// Translate online
if (commandLineArgs.Options.ContainsKey(Options.Online.Long))
{
var authKey = commandLineArgs.Options.GetOrNull(Options.DeepLAuthKey.Short, Options.DeepLAuthKey.Short);
if (authKey == null)
{
Logger.LogInformation("Include all keys");
throw new CliUsageException("DeepL auth key is missing!" + Environment.NewLine + Environment.NewLine + GetUsageInfo());
}
await TranslateAbpTranslateInfoAsync(currentDirectory, targetCulture, referenceCulture, allValues, authKey);
return;
}
var translateInfo = GetAbpTranslateInfo(currentDirectory, targetCulture, referenceCulture, allValues);
File.WriteAllText(outputFile, JsonConvert.SerializeObject(translateInfo, Formatting.Indented));
// Generate abp-translation.json file
var outputFile = Path.Combine(currentDirectory, commandLineArgs.Options.GetOrNull(Options.Output.Short, Options.Output.Long) ?? "abp-translation.json");
await GenerateAbpTranslateInfoAsync(currentDirectory, targetCulture, referenceCulture, allValues, outputFile);
}
Logger.LogInformation($"The translation file has been created.");
private Task GenerateAbpTranslateInfoAsync(string currentDirectory, string targetCulture, string referenceCulture, bool allValues, string outputFile)
{
Logger.LogInformation("Abp translate...");
Logger.LogInformation("Target culture: " + targetCulture);
Logger.LogInformation("Reference culture: " + referenceCulture);
Logger.LogInformation("Output file: " + outputFile);
if (allValues)
{
Logger.LogInformation("Include all keys");
}
var translateInfo = GetAbpTranslateInfo(currentDirectory, targetCulture, referenceCulture, allValues);
File.WriteAllText(outputFile, JsonConvert.SerializeObject(translateInfo, Formatting.Indented));
Logger.LogInformation($"The translation file has been created.");
return Task.CompletedTask;
}
@ -140,8 +147,154 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
return translateInfo;
}
private void ApplyAbpTranslateInfo(string directory, string filename)
private async Task TranslateAbpTranslateInfoAsync(string directory, string targetCulture, string referenceCulture, bool allValues, string authKey)
{
Logger.LogInformation("Abp translate online...");
Logger.LogInformation("Target culture: " + targetCulture);
Logger.LogInformation("Reference culture: " + referenceCulture);
if (allValues)
{
Logger.LogInformation("Include all keys");
}
var translateInfo = GetAbpTranslateInfo(directory, targetCulture, referenceCulture, allValues);
foreach (var resource in translateInfo.Resources)
{
var targetFile = Path.Combine(resource.ResourcePath, translateInfo.TargetCulture + ".json");
var targetLocalizationInfo = File.Exists(targetFile)
? GetAbpLocalizationInfoOrNull(targetFile)
: new AbpLocalizationInfo()
{
Culture = translateInfo.TargetCulture,
Texts = new List<NameValue>()
};
if (targetLocalizationInfo == null)
{
throw new CliUsageException(
$"Failed to get localization information from {targetFile} file." +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
var referenceFile = Path.Combine(resource.ResourcePath, translateInfo.ReferenceCulture + ".json");
if (!File.Exists(referenceFile))
{
throw new CliUsageException(
$"{referenceFile} file does not exist.." +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
var referenceLocalizationInfo = GetAbpLocalizationInfoOrNull(referenceFile);
if (referenceLocalizationInfo == null)
{
throw new CliUsageException(
$"Failed to get localization information from {referenceFile} file." +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
var translator = new Translator(authKey);
var texts = resource.Texts.Select(x => x.Reference);
var translations = await translator.TranslateTextAsync(texts, await GetDeeplLanguageCode(referenceCulture), await GetDeeplLanguageCode(targetCulture));
for (var i = 0; i < translations.Length; i++)
{
resource.Texts[i].Target = translations[i].Text;
}
foreach (var text in resource.Texts)
{
var targetText = targetLocalizationInfo.Texts.FirstOrDefault(x => x.Name == text.LocalizationKey);
if (targetText != null)
{
if (!text.Target.IsNullOrEmpty())
{
Logger.LogInformation($"Update translation: {targetText.Name} => " + text.Target);
targetText.Value = text.Target;
}
}
else
{
Logger.LogInformation($"Create translation: {text.LocalizationKey} => " + text.Target);
targetLocalizationInfo.Texts.Add(new NameValue(text.LocalizationKey, text.Target));
}
}
Logger.LogInformation($"Write translation json to {targetFile}.");
// sort keys
targetLocalizationInfo = SortLocalizedKeys(targetLocalizationInfo, referenceLocalizationInfo);
File.WriteAllText(targetFile, AbpLocalizationInfoToJsonFile(targetLocalizationInfo));
}
}
private Task<string> GetDeeplLanguageCode(string abpCulture)
{
var deeplLanguages = new List<string>()
{
LanguageCode.Bulgarian ,
LanguageCode.Czech ,
LanguageCode.Danish ,
LanguageCode.German ,
LanguageCode.Greek ,
LanguageCode.English ,
LanguageCode.EnglishBritish ,
LanguageCode.EnglishAmerican ,
LanguageCode.Spanish ,
LanguageCode.Estonian ,
LanguageCode.Finnish ,
LanguageCode.French ,
LanguageCode.Hungarian ,
LanguageCode.Indonesian ,
LanguageCode.Italian ,
LanguageCode.Japanese ,
LanguageCode.Korean ,
LanguageCode.Lithuanian ,
LanguageCode.Latvian ,
LanguageCode.Norwegian ,
LanguageCode.Dutch ,
LanguageCode.Polish ,
LanguageCode.Portuguese ,
LanguageCode.PortugueseBrazilian ,
LanguageCode.PortugueseEuropean ,
LanguageCode.Romanian ,
LanguageCode.Russian ,
LanguageCode.Slovak ,
LanguageCode.Slovenian ,
LanguageCode.Swedish ,
LanguageCode.Turkish ,
LanguageCode.Ukrainian,
LanguageCode.Chinese
};
if (abpCulture == "zh-Hans")
{
return Task.FromResult(LanguageCode.Chinese);
}
var deeplCulture = deeplLanguages.FirstOrDefault(x => x.Equals(abpCulture, StringComparison.OrdinalIgnoreCase));
if (deeplCulture == null)
{
throw new CliUsageException(
$"DeepL does not support {abpCulture} culture." +
Environment.NewLine + Environment.NewLine +
GetUsageInfo()
);
}
return Task.FromResult(deeplCulture);
}
private Task ApplyAbpTranslateInfoAsync(string directory, string filename)
{
Logger.LogInformation("Abp translate apply...");
Logger.LogInformation("Input file: " + filename);
var translateJsonPath = Path.Combine(directory, filename);
if (!File.Exists(translateJsonPath))
{
@ -220,22 +373,26 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
File.Delete(translateJsonPath);
Logger.LogInformation($"Delete the {translateJsonPath} file, if you need to translate again, please re-run the [abp translate] command.");
}
return Task.CompletedTask;
}
private static IEnumerable<string> GetCultureJsonFiles(string path, string cultureName)
private static IEnumerable<string> GetCultureJsonFiles(string path, string cultureName = null)
{
var excludeDirectory = new List<string>()
{
"node_modules",
Path.Combine("bin", "debug"),
Path.Combine("obj", "debug")
};
var allCultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures);
{
"node_modules",
"wwwroot",
".git",
"bin",
"obj"
};
var allCultureNames = CultureInfo.GetCultures(CultureTypes.AllCultures).Where(x => !x.Name.IsNullOrWhiteSpace()).Select(x => x.Name).ToList();
return Directory.GetFiles(path, "*.json", SearchOption.AllDirectories)
.Where(file => excludeDirectory.All(x => file.IndexOf(x, StringComparison.OrdinalIgnoreCase) == -1))
.Where(jsonFile => allCultureInfos.Any(culture => jsonFile.EndsWith($"{cultureName}.json", StringComparison.OrdinalIgnoreCase)));
.Where(file => allCultureNames.Any(x => Path.GetFileName(file).Equals($"{x}.json", StringComparison.OrdinalIgnoreCase)))
.WhereIf(!cultureName.IsNullOrWhiteSpace(), jsonFile => Path.GetFileName(jsonFile).Equals($"{cultureName}.json", StringComparison.OrdinalIgnoreCase));
}
private AbpLocalizationInfo GetAbpLocalizationInfoOrNull(string path)
@ -322,6 +479,29 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
return translateInfo;
}
private Task VerifyJsonAsync(string currentDirectory)
{
var jsonFiles = GetCultureJsonFiles(currentDirectory);
var hasInvalidJsonFile = false;
foreach (var jsonFile in jsonFiles)
{
try
{
var jsonString = File.ReadAllText(jsonFile);
_ = JsonLocalizationDictionaryBuilder.BuildFromJsonString(jsonString);
}
catch (Exception e)
{
Logger.LogError($"Invalid json file: {jsonFile}");
hasInvalidJsonFile = true;
}
}
Logger.LogInformation(!hasInvalidJsonFile ? "All json files are valid." : "Some json files are invalid.");
return Task.CompletedTask;
}
private static AbpLocalizationInfo SortLocalizedKeys(AbpLocalizationInfo targetLocalizationInfo, AbpLocalizationInfo referenceLocalizationInfo)
{
var sortedLocalizationInfo = new AbpLocalizationInfo
@ -357,13 +537,18 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
sb.AppendLine("--all-values|-all Include all keys. Default false");
sb.AppendLine("--apply|-a Creates or updates the file for the translated culture.");
sb.AppendLine("--file|-f <file-name> Default: abp-translation.json");
sb.AppendLine("--online Translate online.");
sb.AppendLine("--deepl-auth-key <auth-key> DeepL auth key for online translation.");
sb.AppendLine("--verify Verify that all localized files are correct JSON format.");
sb.AppendLine("");
sb.AppendLine("Examples:");
sb.AppendLine("");
sb.AppendLine(" abp translate -c zh-Hans");
sb.AppendLine(" abp translate -c zh-Hans -r en -a");
sb.AppendLine(" abp translate -c zh-Hans -r en");
sb.AppendLine(" abp translate --apply");
sb.AppendLine(" abp translate -a -f my-translation.json");
sb.AppendLine(" abp translate -c zh-Hans --online --deepl-auth-key <auth-key>");
sb.AppendLine(" abp translate -c zh-Hans -r tr --online --deepl-auth-key <auth-key>");
sb.AppendLine("");
sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI");
@ -412,6 +597,21 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
public const string Short = "f";
public const string Long = "file";
}
public static class Online
{
public const string Long = "online";
}
public static class DeepLAuthKey
{
public const string Short = "deepl-auth-key";
}
public static class Verify
{
public const string Long = "verify";
}
}
public class AbpTranslateInfo

4
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs

@ -79,7 +79,7 @@ public class UpdateCommand : IConsoleCommand, ITransientDependency
await _nugetPackagesVersionUpdater.UpdateSolutionAsync(solution, checkAll: checkAll, version: version);
Logger.LogInformation($"Volo packages are updated in {solutionName} solution.");
Logger.LogInformation("Volo packages are updated in {SolutionName} solution", solutionName);
}
return;
}
@ -92,7 +92,7 @@ public class UpdateCommand : IConsoleCommand, ITransientDependency
await _nugetPackagesVersionUpdater.UpdateProjectAsync(project, checkAll: checkAll, version: version);
Logger.LogInformation($"Volo packages are updated in {projectName} project.");
Logger.LogInformation("Volo packages are updated in {ProjectName} project", projectName);
return;
}

29
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs

@ -181,6 +181,11 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
packageId = package.Attributes["Include"].Value;
var versionAttribute = package.Attributes["Version"];
if (versionAttribute == null)
{
Logger.LogWarning("Package: {PackageId} uses central package management. Skipped!", packageId);
continue;
}
var currentVersion = versionAttribute.Value;
var isLeptonXPackage = packageId.Contains("LeptonX");
@ -194,17 +199,17 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
var isVersionParsed = SemanticVersion.TryParse(currentVersion, out var currentSemanticVersion);
if (!isVersionParsed)
{
Logger.LogWarning("Could not parse package \"{0}\" version v{1}. Skipped.", packageId, currentVersion);
Logger.LogWarning("Could not parse package \"{PackageId}\" version v{CurrentVersion}. Skipped!", packageId, currentVersion);
continue;
}
Logger.LogDebug("Checking package: \"{0}\" - Current version: {1}", packageId, currentSemanticVersion);
Logger.LogDebug("Checking package: \"{PackageId}\" - Current version: {CurrentSemanticVersion}", packageId, currentSemanticVersion);
if (!specifiedVersion.IsNullOrWhiteSpace())
{
if (isLeptonXPackage || isStudioPackage)
{
Logger.LogWarning("Package: {0} could not be updated. Please manually update the package version yourself to prevent version mismatches.", packageId);
Logger.LogWarning("Package: {PackageId} could not be updated. Please manually update the package version yourself to prevent version mismatches!", packageId);
continue;
}
@ -213,17 +218,17 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
var specifiedSemanticVersion = SemanticVersion.Parse(specifiedVersion);
if (specifiedSemanticVersion > currentSemanticVersion)
{
Logger.LogInformation("Updating package \"{0}\" from v{1} to v{2}.", packageId, currentVersion, specifiedVersion);
Logger.LogInformation("Updating package \"{PackageId}\" from v{CurrentVersion} to v{SpecifiedVersion}", packageId, currentVersion, specifiedVersion);
versionAttribute.Value = specifiedVersion;
}
else
{
Logger.LogWarning("Unable to update package \"{0}\" version v{1} to v{2}.", packageId, currentVersion, specifiedVersion);
Logger.LogWarning("Unable to update package \"{PackageId}\" version v{CurrentVersion} to v{SpecifiedVersion}", packageId, currentVersion, specifiedVersion);
}
}
else
{
Logger.LogWarning("Package \"{0}\" specified version v{1} does not exist.", packageId, specifiedVersion);
Logger.LogWarning("Package \"{PackageId}\" specified version v{SpecifiedVersion} does not exist!", packageId, specifiedVersion);
}
}
else
@ -253,18 +258,18 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
if(latestVersion == null)
{
Logger.LogWarning("Package: {0} could not be updated. Please manually update the package version yourself to prevent version mismatches.", packageId);
Logger.LogWarning("Package: {PackageId} could not be updated. Please manually update the package version yourself to prevent version mismatches!", packageId);
continue;
}
if (currentVersion != latestVersion)
{
Logger.LogInformation("Updating package \"{0}\" from v{1} to v{2}.", packageId, currentVersion, latestVersion);
Logger.LogInformation("Updating package \"{PackageId}\" from v{CurrentVersion} to v{LatestVersion}", packageId, currentVersion, latestVersion);
versionAttribute.Value = latestVersion;
}
else
{
Logger.LogDebug("Package: \"{0}-v{1}\" is up to date.", packageId, currentVersion);
Logger.LogDebug("Package: \"{PackageId}-v{CurrentVersion}\" is up to date", packageId, currentVersion);
}
}
else
@ -285,12 +290,12 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
if (latestVersion != null && (currentSemanticVersion < latestVersion || (currentSemanticVersion.IsPrerelease && switchToStable)))
{
Logger.LogInformation("Updating package \"{0}\" from v{1} to v{2}.", packageId, currentSemanticVersion.ToString(), latestVersion.ToString());
Logger.LogInformation("Updating package \"{PackageId}\" from v{CurrentSemanticVersion} to v{LatestVersion}", packageId, currentSemanticVersion.ToString(), latestVersion.ToString());
versionAttribute.Value = latestVersion.ToString();
}
else
{
Logger.LogInformation("Package: \"{0}-v{1}\" is up to date.", packageId, currentSemanticVersion);
Logger.LogInformation("Package: \"{PackageId}-v{CurrentSemanticVersion}\" is up to date", packageId, currentSemanticVersion);
}
}
}
@ -301,7 +306,7 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
}
catch (Exception ex)
{
Logger.LogError("Cannot update Volo.* packages! An error occurred while updating the package \"{0}\". Error: {1}", packageId, ex.Message);
Logger.LogError("Cannot update Volo.* packages! An error occurred while updating the package \"{PackageId}\". Error: {ErrorMessage}", packageId, ex.Message);
Logger.LogException(ex);
}

4
framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/zh-Hans.json

@ -1,6 +1,6 @@
{
"culture": "zh-Hans",
"texts": {
"MaxResultCountExceededExceptionMessage": "{0}不能超过 {1}! 在服务器端增加{2}.{3}以获得更多结果."
"MaxResultCountExceededExceptionMessage": "{0}不能多于{1}!在服务器端增加{2}.{3},以获得更多结果。"
}
}
}

40
framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/ExceptionHandling/Localization/zh-Hans.json

@ -1,26 +1,26 @@
{
"culture": "zh-Hans",
"texts": {
"InternalServerErrorMessage": "对不起,在处理你的请求期间,产生了一个服务器内部错误!",
"ValidationErrorMessage": "你的请求无效!",
"ValidationNarrativeErrorMessageTitle": "验证时发现以下错误.",
"DefaultErrorMessage": "发生错误!",
"DefaultErrorMessageDetail": "服务器未发送错误的详细信息.",
"DefaultErrorMessage401": "未通过身份验证!",
"DefaultErrorMessage401Detail": "你需要进行身份认证(登录)后再执行此操作.",
"DefaultErrorMessage403": "你没有权限!",
"DefaultErrorMessage403Detail": "你不能执行此操作!",
"DefaultErrorMessage404": "未找到资源!",
"DefaultErrorMessage404Detail": "未在服务中找到请求的资源!",
"EntityNotFoundErrorMessage": "实体 {0} 不存在,id = {1}!",
"AbpDbConcurrencyErrorMessage": "你提交的数据已经被其他用户/客户端修改.请放弃你所做的修改并再次尝试.",
"InternalServerErrorMessage": "对不起,在处理您的请求期间产生了一个服务器内部错误!!",
"ValidationErrorMessage": "您的请求无效!",
"ValidationNarrativeErrorMessageTitle": "验证过程中检测到以下错误。",
"DefaultErrorMessage": "发生错误",
"DefaultErrorMessageDetail": "服务器未发送错误详细信息。",
"DefaultErrorMessage401": "您未通过身份验证!",
"DefaultErrorMessage401Detail": "您需要进行身份认证(登录)后再执行此操作。",
"DefaultErrorMessage403": "您未获得授权!",
"DefaultErrorMessage403Detail": "不允许执行此操作!",
"DefaultErrorMessage404": "未找到资源",
"DefaultErrorMessage404Detail": "服务器上找不到所请求的资源!",
"EntityNotFoundErrorMessage": "不存在 id = {1} 的实体 {0}!",
"AbpDbConcurrencyErrorMessage": "您提交的数据已被其他用户/客户更改。请放弃您所做的更改并从头开始尝试。",
"Error": "错误",
"UnhandledException": "未处理的异常!",
"401Message": "未授权",
"403Message": "禁止访问",
"404Message": "网页未找到",
"UnhandledException": "未处理异常!",
"401Message": "未授权",
"403Message": "禁止",
"404Message": "未找到页面",
"500Message": "内部服务器错误",
"403MessageDetail": "您没有权限执行此操作",
"404MessageDetail": "抱歉, 这个地址是空的"
"403MessageDetail": "您无权执行此操作!",
"404MessageDetail": "抱歉,这个地址没有任何信息。"
}
}
}

2
framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/zh-Hans.json

@ -5,4 +5,4 @@
"Volo.Feature:010002": "必要的功能未启用. 这些功能需要启用: {FeatureNames}",
"Volo.Feature:010003": "必要的功能未启用. 需要启用这些功能中的一项:{FeatureNames}"
}
}
}

4
framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/Localization/zh-Hans.json

@ -1,6 +1,6 @@
{
"culture": "zh-Hans",
"texts": {
"Volo.GlobalFeature:010001": "'{ServiceName}'服务需要启用'{GlobalFeatureName}'功能."
"Volo.GlobalFeature:010001": "'{ServiceName}' 服务需要启用 '{GlobalFeatureName}'。"
}
}
}

2
framework/src/Volo.Abp.Ldap.Abstractions/Volo/Abp/Ldap/Localization/zh-Hans.json

@ -16,4 +16,4 @@
"DisplayName:Abp.Ldap.Password": "密码",
"Description:Abp.Ldap.Password": "密码"
}
}
}

2
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/zh-Hans.json

@ -2,6 +2,6 @@
"culture": "zh-Hans",
"texts": {
"DisplayName:Abp.Localization.DefaultLanguage": "默认语言",
"Description:Abp.Localization.DefaultLanguage": "应用程序的默认语言."
"Description:Abp.Localization.DefaultLanguage": "应用程序的默认语言"
}
}

10
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/Localization/zh-Hans.json

@ -1,9 +1,9 @@
{
"culture": "zh-Hans",
"texts": {
"TenantNotFoundMessage": "找不到租户!",
"TenantNotFoundDetails": "无法找到ID或名称为{0}的租户",
"TenantNotActiveMessage": "租户未启用!",
"TenantNotActiveDetails": "ID或名称为{0}的租户未启用"
"TenantNotFoundMessage": "未找到租户!",
"TenantNotFoundDetails": "没有租户的 ID 或名称为:{0}的租户。",
"TenantNotActiveMessage": "租户未启用",
"TenantNotActiveDetails": "租户未启用,租户 ID 或名称为:{0}。"
}
}
}

4
framework/src/Volo.Abp.Timing/Volo/Abp/Timing/Localization/zh-Hans.json

@ -2,6 +2,6 @@
"culture": "zh-Hans",
"texts": {
"DisplayName:Abp.Timing.Timezone": "时区",
"Description:Abp.Timing.Timezone": "应用程序的时区"
"Description:Abp.Timing.Timezone": "应用时区"
}
}
}

2
framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/zh-Hans.json

@ -36,4 +36,4 @@
"ThisFieldIsNotAValidFullyQualifiedHttpHttpsOrFtpUrl": "字段{0}不是有效的完全限定的http,https或ftp URL.",
"ThisFieldIsInvalid.": "该字段无效."
}
}
}

10
framework/test/Volo.Abp.Authorization.Tests/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions_Tests.cs

@ -22,27 +22,27 @@ public class AbpAuthorizationServiceExtensions_Tests : AuthorizationTestBase
{
var exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGranted);
var errorInfo = _exceptionToErrorInfoConverter.Convert(exception);
errorInfo.Message.ShouldBe("授权失败! 提供的策略尚未授予.");
errorInfo.Message.ShouldBe("授权失败!提供的策略尚未授予。");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedWithPolicyName)
.WithData("PolicyName", "my_policy_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception);
errorInfo.Message.ShouldBe("授权失败! 提供的策略尚未授予: my_policy_name");
errorInfo.Message.ShouldBe("授权失败!提供的策略尚未授予: my_policy_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception);
errorInfo.Message.ShouldBe("授权失败! 提供的策略未授予提供的资源: my_resource_name");
errorInfo.Message.ShouldBe("授权失败!提供的策略未授予提供的资源:my_resource_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception);
errorInfo.Message.ShouldBe("授权失败! 提供的要求未授予提供的资源: my_resource_name");
errorInfo.Message.ShouldBe("授权失败!提供的要求未授予提供的资源:my_resource_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementsHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception);
errorInfo.Message.ShouldBe("授权失败! 提供的要求未授予提供的资源: my_resource_name");
errorInfo.Message.ShouldBe("授权失败!提供的要求未授予提供的资源:my_resource_name");
}
}
}

2
framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/AbpGlobalFeatureNotEnableException_Localization_Test.cs

@ -23,7 +23,7 @@ public class AbpGlobalFeatureNotEnableException_Localization_Test : GlobalFeatur
.WithData("ServiceName", "MyService")
.WithData("GlobalFeatureName", "TestFeature"); ;
var errorInfo = _exceptionToErrorInfoConverter.Convert(exception);
errorInfo.Message.ShouldBe("'MyService'服务需要启用'TestFeature'功能.");
errorInfo.Message.ShouldBe("'MyService' 服务需要启用 'TestFeature'。");
}
}
}

88
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json

@ -2,72 +2,72 @@
"culture": "zh-Hans",
"texts": {
"Menu:Account": "账户",
"UserName": "用户名",
"EmailAddress": "邮箱地址",
"UserNameOrEmailAddress": "用户名称或邮箱地址",
"UserName": "用户名",
"EmailAddress": "电子邮件地址",
"UserNameOrEmailAddress": "用户名或电子邮件地址",
"Password": "密码",
"RememberMe": "记住我",
"UseAnotherServiceToLogin": "使用另一个服务登录",
"UserLockedOutMessage": "登录失败,用户账户已被锁定.请稍后再试.",
"InvalidUserNameOrPassword": "用户名或密码错误!",
"LoginIsNotAllowed": "无法登录!你的账号未激活或者需要验证邮箱地址/手机号.",
"SelfRegistrationDisabledMessage": "应用程序未开放注册,请联系管理员添加新用户.",
"LocalLoginDisabledMessage": "应用程序未开放本地账户登录.",
"UseAnotherServiceToLogin": "使用其他服务登录",
"UserLockedOutMessage": "由于尝试登录无效,用户账户已被锁定。请稍候再试。",
"InvalidUserNameOrPassword": "用户名或密码无效!",
"LoginIsNotAllowed": "您不能登录!您的帐户未激活或需要确认您的电子邮件/电话号码。",
"SelfRegistrationDisabledMessage": "应用程序未开放注册。请联系应用程序管理员注册新用户。",
"LocalLoginDisabledMessage": "应用程序禁用本地登录。",
"Login": "登录",
"Cancel": "取消",
"Register": "注册",
"AreYouANewUser": "你是新用户吗?",
"AlreadyRegistered": "已经注册过了?",
"AreYouANewUser": "您是新用户吗?",
"AlreadyRegistered": "已经注册",
"InvalidLoginRequest": "登录请求无效",
"ThereAreNoLoginSchemesConfiguredForThisClient": "没有为此客户端配置登录方案.",
"LogInUsingYourProviderAccount": "使用你的{0}帐户登录",
"ThereAreNoLoginSchemesConfiguredForThisClient": "该客户端未配置登录方案。",
"LogInUsingYourProviderAccount": "使用您的 {0} 账户登录",
"DisplayName:CurrentPassword": "当前密码",
"DisplayName:NewPassword": "新密码",
"DisplayName:NewPasswordConfirm": "确认新密码",
"PasswordChangedMessage": "你的密码已修改成功.",
"PasswordChangedMessage": "您的密码已成功更改。",
"DisplayName:UserName": "用户名",
"DisplayName:Email": "电子邮件",
"DisplayName:Name": "名",
"DisplayName:Surname": "姓",
"DisplayName:Name": "名",
"DisplayName:Surname": "姓",
"DisplayName:Password": "密码",
"DisplayName:EmailAddress": "电子邮件地址",
"DisplayName:PhoneNumber": "手机号码",
"DisplayName:PhoneNumber": "电话号码",
"PersonalSettings": "个人设置",
"PersonalSettingsSaved": "个人设置已保存",
"PersonalSettingsSaved": "保存个人设置",
"PersonalSettingsChangedConfirmationModalTitle": "个人信息已更改",
"PersonalSettingsChangedConfirmationModalDescription": "重新登录以应用这些更改,您要退出登录吗?",
"PasswordChanged": "修改密码",
"NewPasswordConfirmFailed": "请确认新密码",
"NewPasswordSameAsOld": "新密码不能与旧密码相同",
"PersonalSettingsChangedConfirmationModalDescription": "如果要应用这些更改,您必须先登录。要退出吗?",
"PasswordChanged": "密码已更改",
"NewPasswordConfirmFailed": "请确认新密码",
"NewPasswordSameAsOld": "新密码必须与旧密码不同。",
"Manage": "管理",
"MyAccount": "我的账户",
"DisplayName:Abp.Account.IsSelfRegistrationEnabled": "启用自行注册",
"Description:Abp.Account.IsSelfRegistrationEnabled": "是否允许用户自行注册帐户.",
"DisplayName:Abp.Account.EnableLocalLogin": "使用本地户进行身份验证",
"Description:Abp.Account.EnableLocalLogin": "服务器是否将允许用户使用本地帐户进行身份验证。",
"DisplayName:Abp.Account.IsSelfRegistrationEnabled": "是否启用自行注册",
"Description:Abp.Account.IsSelfRegistrationEnabled": "用户是否可以自己注册账户。",
"DisplayName:Abp.Account.EnableLocalLogin": "使用本地户进行身份验证",
"Description:Abp.Account.EnableLocalLogin": "表示服务器是否允许用户使用本地账户进行身份验证。",
"LoggedOutTitle": "注销",
"LoggedOutText": "你已成功注销并将马上返回.",
"ReturnToText": "单击此处返回应用程序",
"OrLoginWith": "或登录:",
"ForgotPassword": "忘记密码?",
"SendPasswordResetLink_Information": "密码重置链接将发送到您的电子邮件以重置密码. 如果您在几分钟内没有收到电子邮件,请重试.",
"PasswordResetMailSentMessage": "帐户恢复电子邮件已发送到您的电子邮件地址. 如果您在15分钟内未在收件箱中看到此电子邮件,请检查垃圾邮件,并标记为非垃圾邮件.",
"ResetPassword": "重密码",
"LoggedOutText": "您已注销,很快将重新定向。",
"ReturnToText": "单击此处返回应用",
"OrLoginWith": "或使用以下方式登录",
"ForgotPassword": "忘记密码",
"SendPasswordResetLink_Information": "您的电子邮件中将收到重置密码的链接。如果您在几分钟内没有收到电子邮件,请重试。",
"PasswordResetMailSentMessage": "帐户恢复电子邮件已发送到您的电子邮箱。如果您在 15 分钟内未在收件箱中看到此电子邮件,请在垃圾邮件文件夹中查找。如果在那里找到,请将其标记为 \"非垃圾邮件\"。",
"ResetPassword": "重密码",
"ConfirmPassword": "确认密码",
"ResetPassword_Information": "请输入您的新密码.",
"YourPasswordIsSuccessfullyReset": "您的密码已经被重置成功.",
"ResetPassword_Information": "请输入您的新密码",
"YourPasswordIsSuccessfullyReset": "您的密码重置成功。",
"GoToTheApplication": "转到应用程序",
"BackToLogin": "返回登录",
"ProfileTab:Password": "更改密码",
"ProfileTab:PersonalInfo": "个人信息",
"ReturnToApplication": "返回应用程序",
"Volo.Account:InvalidEmailAddress": "找到给定的电子邮件地址:{0}",
"PasswordReset": "重设密码",
"PasswordResetInfoInEmail": "我们收到了帐户恢复请求!如果你发起了此请求,请单击以下链接以重置密码.",
"ResetMyPassword": "重置我的密码",
"AccessDenied": "拒绝访问!",
"AccessDeniedMessage": "你无权访问此资源.",
"OrRegisterWith": "或注册:",
"RegisterUsingYourProviderAccount": "使用你的{0}帐户注册"
"ReturnToApplication": "返回应用",
"Volo.Account:InvalidEmailAddress": "无法找到给定的电子邮件地址:{0}",
"PasswordReset": "密码重置",
"PasswordResetInfoInEmail": "我们收到了账户恢复请求!如果您发起了该请求,请单击以下链接重置密码。",
"ResetMyPassword": "重置密码",
"AccessDenied": "拒绝访问",
"AccessDeniedMessage": "您无法访问此资源。",
"OrRegisterWith": "或注册",
"RegisterUsingYourProviderAccount": "使用您的 {0} 账户注册"
}
}

19
modules/account/src/Volo.Abp.Account.Web/Pages/Account/AccountPageModel.cs

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using Volo.Abp.Account.Localization;
@ -55,22 +54,4 @@ public abstract class AccountPageModel : AbpPageModel
return exception.Message;
}
protected virtual async Task<string> GetUserNameFromEmail(string email)
{
var userName = email.Split('@')[0];
var existUser = await UserManager.FindByNameAsync(userName);
while (existUser != null)
{
var randomUserName = userName + RandomHelper.GetRandom(1000, 9999);
existUser = await UserManager.FindByNameAsync(randomUserName);
if (existUser == null)
{
userName = randomUserName;
break;
}
}
return userName;
}
}

4
modules/account/src/Volo.Abp.Account.Web/Pages/Account/Register.cshtml.cs

@ -102,7 +102,7 @@ public class RegisterModel : AccountPageModel
return;
}
var userName = await GetUserNameFromEmail(emailClaim.Value);
var userName = await UserManager.GetUserNameFromEmailAsync(emailClaim.Value);
Input = new PostInput { UserName = userName, EmailAddress = emailClaim.Value };
}
}
@ -128,7 +128,7 @@ public class RegisterModel : AccountPageModel
}
if (Input.UserName.IsNullOrWhiteSpace())
{
Input.UserName = await GetUserNameFromEmail(Input.EmailAddress);
Input.UserName = await UserManager.GetUserNameFromEmailAsync(Input.EmailAddress);
}
await RegisterExternalUserAsync(externalLoginInfo, Input.UserName, Input.EmailAddress);
}

72
modules/audit-logging/src/Volo.Abp.AuditLogging.Domain.Shared/Volo/Abp/AuditLogging/Localization/zh-Hans.json

@ -5,45 +5,45 @@
"Permission:AuditLogs": "审计日志",
"Menu:AuditLogging": "审计日志",
"AuditLogs": "审计日志",
"HttpStatus": "Http状态",
"HttpMethod": "Http方法",
"HttpMethodFilter": "Http方法过滤",
"HttpRequest": "Http请求",
"HttpStatus": "HTTP 状态",
"HttpMethod": "HTTP 方法",
"HttpMethodFilter": "HTTP 方法过滤器",
"HttpRequest": "HTTP 请求",
"User": "用户",
"UserNameFilter": "用户过滤",
"HasException": "存在异常",
"IpAddress": "IP地址",
"UserNameFilter": "用户过滤",
"HasException": "有例外情况",
"IpAddress": "IP 地址",
"Time": "时间",
"Date": "日期",
"Duration": "持续时间",
"Detail": "详",
"Detail": "详细信息",
"Overall": "总体",
"Actions": "操作",
"ClientIpAddress": "客户端IP地址",
"ClientName": "客户名称",
"ClientIpAddress": "客户端 IP 地址",
"ClientName": "客户名称",
"BrowserInfo": "浏览器信息",
"Url": "Url",
"Url": "网址",
"UserName": "用户名",
"TenantImpersonator": "租户模拟",
"UserImpersonator": "用户模拟",
"UrlFilter": "Url过滤",
"UrlFilter": "URL 过滤器",
"Exceptions": "异常",
"Comments": "评论",
"HttpStatusCode": "Http状态码",
"HttpStatusCodeFilter": "Http状态码过滤",
"ServiceName": "服务名称",
"MethodName": "方法名称",
"CorrelationId": "关联Id",
"HttpStatusCode": "HTTP 状态代码",
"HttpStatusCodeFilter": "HTTP 状态代码过滤器",
"ServiceName": "服务",
"MethodName": "方法",
"CorrelationId": "相关标识",
"ApplicationName": "应用名称",
"ExecutionDuration": "持续时间",
"ExtraProperties": "额外属性",
"MaxDuration": "最大持续时间",
"MinDuration": "最小持续时间",
"MinMaxDuration": "持续时间(最小-最大)",
"{0}Milliseconds": "{0} 毫秒",
"MinDuration": "分钟持续时间",
"MinMaxDuration": "持续时间(最短 - 最长)",
"{0}Milliseconds": "{0}毫秒",
"ExecutionTime": "时间",
"Parameters": "参数",
"EntityTypeFullName": "实体类型全名",
"EntityTypeFullName": "实体类型 全名",
"Entity": "实体",
"ChangeType": "更改类型",
"ChangeTime": "时间",
@ -51,33 +51,33 @@
"OriginalValue": "原始值",
"PropertyName": "属性名称",
"PropertyTypeFullName": "属性类型全名",
"Yes": "Yes",
"No": "No",
"Yes": "",
"No": "没有",
"Changes": "变化",
"AverageExecutionDurationInLogsPerDay": "平均处理时间(每天日志)",
"AverageExecutionDurationInMilliseconds": "平均处理时间(毫秒)",
"AverageExecutionDurationInLogsPerDay": "平均执行时间",
"AverageExecutionDurationInMilliseconds": "平均执行时间(毫秒)",
"ErrorRateInLogs": "日志中的错误率",
"Success": "成功",
"Fault": "故障",
"NoChanges": "没有变化",
"EntityChanges": "实体变",
"EntityId": "实体Id",
"NoChanges": "变化",
"EntityChanges": "实体变",
"EntityId": "实体 ID",
"EntityChangeStartTime": "最小更改日期",
"EntityChangeEndTime": "最大更改日期",
"EntityHistory": "实体历史",
"DaysAgoTitle": "{0} {1}.",
"DaysAgoWithUserTitle": "{0} {1} 通过 {2}.",
"DaysAgoWithUserTitle": "{0} {1} by {2}。",
"Created": "创建",
"Updated": "更新",
"Updated": "更新",
"Deleted": "已删除",
"ChangeHistory": "变更记录",
"FullChangeHistory": "完整的变更记录",
"FullChangeHistory": "全部变更记录",
"ChangeDetails": "变更详情",
"DurationMs": "持续时间(毫秒)",
"StartDate": "开始时间",
"EndDate": "结束时间",
"DurationMs": "持续时间(毫秒)",
"StartDate": "开始日期",
"EndDate": "结束日期",
"Feature:AuditLoggingGroup": "审计日志",
"Feature:AuditLoggingEnable": "启用审计日志页面",
"Feature:AuditLoggingEnableDescription": "在应用程序中启用审计日志页面."
"Feature:AuditLoggingEnable": "启用审计记录页面",
"Feature:AuditLoggingEnableDescription": "在应用程序中启用审计日志页面"
}
}

2
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/Localization/zh-Hans.json

@ -1,6 +1,6 @@
{
"culture": "zh-Hans",
"texts": {
"MyAccount": "我的账户"
"MyAccount": "我的账户"
}
}

16
modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/zh-Hans.json

@ -43,9 +43,9 @@
"Posts": "帖子",
"Edit": "编辑",
"BLOG": "博客",
"CommentDeletionWarningMessage": "评论将被删除.",
"CommentDeletionWarningMessage": "评论将被删除",
"PostDeletionWarningMessage": "帖子将被删除",
"BlogDeletionWarningMessage": "博客将被删除.",
"BlogDeletionWarningMessage": "博客将被删除",
"AreYouSure": "你确定吗?",
"CommentWithCount": "{0}个评论",
"Comment": "评论",
@ -69,12 +69,12 @@
"PostDescriptionHint": "*将在文章链接预览中呈现,支持HTML",
"ReadMore": "继续阅读",
"MemberNotPublishedPostYet": "还没有帖子!",
"UpdateUserWebSiteInfo": "例:https://johndoe.com",
"UpdateUserTwitterInfo": "示例:约翰多",
"UpdateUserGithubInfo": "示例:约翰多",
"UpdateUserLinkedinInfo": "示例:https://www.linkedin.com/...",
"UpdateUserCompanyInfo": "示例:沃洛软件",
"UpdateUserJobTitleInfo": "例:软件开发人员",
"UpdateUserWebSiteInfo": "例:https://johndoe.com",
"UpdateUserTwitterInfo": "示例:johndoe",
"UpdateUserGithubInfo": "示例:johndoe",
"UpdateUserLinkedinInfo": "例如: https://www.linkedin.com/..。",
"UpdateUserCompanyInfo": "示例:Volosoft",
"UpdateUserJobTitleInfo": "例软件开发人员软件开发人员",
"WebSite": "网站",
"UserName": "用户名",
"FullURL": "完整网址",

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

@ -3,91 +3,91 @@
"texts": {
"AddSubMenuItem": "添加子菜单项",
"AreYouSure": "你确定吗?",
"BlogDeletionConfirmationMessage": "博客 '{0}' 将被删除. 你确定吗?",
"BlogFeatureNotAvailable": "这个功能目前不可用. 使用 `GlobalFeatureManager` 来启用它.",
"BlogDeletionConfirmationMessage": "博客'{0}'将被删除。你确定吗?",
"BlogFeatureNotAvailable": "此功能现在不可用。请使用 \"GlobalFeatureManager \"启用以使用该功能。",
"BlogId": "博客",
"BlogPostDeletionConfirmationMessage": "博客帖子 '{0}' 将被删除. 你确定吗?",
"BlogPosts": "博客帖子",
"BlogPostDeletionConfirmationMessage": "博文\"{0}\"将被删除。你确定吗?",
"BlogPosts": "博客文章",
"Blogs": "博客",
"ChoosePreference": "选择首选项...",
"ChoosePreference": "选择偏好...",
"Cms": "CMS",
"CmsKit.Comments": "评论",
"CmsKit.Ratings": "评分",
"CmsKit.Reactions": "反应",
"CmsKit.Tags": "标签",
"CmsKit:0002": "内容已经存在!",
"CmsKit:0003": "实体 {0} 不可标记.",
"CmsKit:Blog:0001": "给定的slug ({Slug}) 已经存在!",
"CmsKit:BlogPost:0001": "给定的slug已经存在!",
"CmsKit:Comments:0001": "实体不可 {0} 不可评论.",
"CmsKit:Media:0001": "'{Name}' 不是有效的媒体名称.",
"CmsKit:Media:0002": "实体不可以含有媒体",
"CmsKit:Page:0001": "给定的url ({0}) 已经存在.",
"CmsKit:Rating:0001": "无法对实体 {EntityType} 进行评。",
"CmsKit:0002": "内容已经存在",
"CmsKit:0003": "实体 {0} 不可标签。",
"CmsKit:Blog:0001": "给定的slug ({Slug}) 已经存在",
"CmsKit:BlogPost:0001": "给定的slug已经存在",
"CmsKit:Comments:0001": "实体 {EntityType} 不可注释。",
"CmsKit:Media:0001": "{Name}'不是有效的媒体名称。",
"CmsKit:Media:0002": "实体不能拥有媒体。",
"CmsKit:Page:0001": "给定的网址 ({Slug}) 已经存在。请尝试使用其他网址。",
"CmsKit:Rating:0001": "无法对实体 {EntityType} 进行评。",
"CmsKit:Reaction:0001": "实体 {EntityType} 不能有反应。",
"CmsKit:Tag:0002": "实体不可标记!",
"CommentAuthorizationExceptionMessage": "这些评论不允许公开显示",
"CommentDeletionConfirmationMessage": "此评论和所有回复将被删除!",
"CmsKit:Tag:0002": "实体不可标签!",
"CommentAuthorizationExceptionMessage": "这些评论不允许公开展示。",
"CommentDeletionConfirmationMessage": "此评论和所有回复将被删除",
"Comments": "评论",
"Content": "内容",
"ContentDeletionConfirmationMessage": "你确定要删除这个内容吗?",
"Contents": "内容",
"ContentDeletionConfirmationMessage": "您确定要删除这些内容吗?",
"Contents": "目录",
"CoverImage": "封面图片",
"CreateBlogPostPage": "新博客帖子",
"CreateBlogPostPage": "新博客文章",
"CreationTime": "创建时间",
"Delete": "删除",
"Detail": "详",
"Details": "详",
"Detail": "详细信息",
"Details": "详细信息",
"DisplayName": "显示名称",
"DoYouPreferAdditionalEmails": "你是否更喜欢额外的邮件?",
"Edit": "修改",
"EndDate": "结束时间",
"EntityId": "实体Id",
"DoYouPreferAdditionalEmails": "您希望收到更多电子邮件吗?",
"Edit": "编辑",
"EndDate": "结束日期",
"EntityId": "实体 ID",
"EntityType": "实体类型",
"ExportCSV": "导出CSV",
"ExportCSV": "导出 CSV",
"Features": "功能",
"GenericDeletionConfirmationMessage": "你确定删除 '{0}' 吗?",
"IsActive": "积极的",
"GenericDeletionConfirmationMessage": "您确定要删除\"{0}\"吗?",
"IsActive": "活跃",
"LastModification": "最后一次修改",
"LastModificationTime": "最后修改时间",
"LoginToAddComment": "登录添加评论",
"LoginToRate": "登录进行评分",
"LoginToReact": "登录作出反应",
"LoginToReply": "登录进行回复",
"LoginToAddComment": "登录添加评论",
"LoginToRate": "登录评分",
"LoginToReact": "登录作出反应",
"LoginToReply": "登录回复",
"MainMenu": "主菜单",
"MakeMainMenu": "制作主菜单",
"Menu:CMS": "CMS",
"Menus": "菜单",
"MenuDeletionConfirmationMessage": "菜单“{0}”将被删除。你确定吗?",
"MenuDeletionConfirmationMessage": "菜单\"{0}\"将被删除。你确定吗?",
"MenuItemDeletionConfirmationMessage": "确定要删除此菜单项吗?",
"MenuItemMoveConfirmMessage": "确定要将“{0}”移到“{1}”下吗?",
"MenuItems": "菜单项",
"Message": "消息",
"MessageDeletionConfirmationMessage": "这条评论将被完全删除",
"MenuItemMoveConfirmMessage": "您确定要将\"{0}\"移到\"{1}\"下面吗?",
"MenuItems": "菜单项",
"Message": "留言",
"MessageDeletionConfirmationMessage": "此评论将被彻底删除。",
"NewBlog": "新博客",
"NewBlogPost": "新博文",
"NewBlogPost": "新博",
"NewMenu": "新菜单",
"NewMenuItem": "新的根菜单项",
"NewPage": "新的一页",
"NewPage": "新页",
"NewTag": "新标签",
"NoMenuItems": "还没有菜单项!",
"OK": "OK",
"PageDeletionConfirmationMessage": "你确定删除这个页面吗?",
"PageId": "页",
"NoMenuItems": "目前还没有菜单项!",
"OK": "好的",
"PageDeletionConfirmationMessage": "您确定要删除此页面吗?",
"PageId": "页",
"Pages": "页面",
"PageSlugInformation": "Slug用于url. 你的url将是 '/{{slug}}'.",
"BlogSlugInformation": "Slug用于url. 你的url将是 '/{0}/{{slug}}'.",
"PageSlugInformation": "Slug 用于 URL。您的网址将是\"/{{slug}}\"。",
"BlogSlugInformation": "Slug 用于 URL。您的网址将是\"/{0}/{{slug}}\"。",
"Permission:BlogManagement": "博客管理",
"Permission:BlogManagement.Create": "创建",
"Permission:BlogManagement.Delete": "删除",
"Permission:BlogManagement.Features": "删除",
"Permission:BlogManagement.Features": "功能",
"Permission:BlogManagement.Update": "更新",
"Permission:BlogPostManagement": "博客帖子管理",
"Permission:BlogPostManagement": "博管理",
"Permission:BlogPostManagement.Create": "创建",
"Permission:BlogPostManagement.Delete": "删除",
"Permission:BlogPostManagement.Update": "更新",
"Permission:BlogPostManagement.Publish": "发布",
"Permission:CmsKit": "Cms工具包",
"Permission:CmsKit": "CmsKit 管理员",
"Permission:Comments": "评论管理",
"Permission:Comments.Delete": "删除",
"Permission:Contents": "内容管理",
@ -97,7 +97,7 @@
"Permission:MediaDescriptorManagement": "媒体管理",
"Permission:MediaDescriptorManagement:Create": "创建",
"Permission:MediaDescriptorManagement:Delete": "删除",
"Permission:MenuItemManagement": "菜单项管理",
"Permission:MenuItemManagement": "菜单项管理",
"Permission:MenuItemManagement.Create": "创建",
"Permission:MenuItemManagement.Delete": "删除",
"Permission:MenuItemManagement.Update": "更新",
@ -105,10 +105,10 @@
"Permission:MenuManagement.Create": "创建",
"Permission:MenuManagement.Delete": "删除",
"Permission:MenuManagement.Update": "更新",
"Permission:Menus": "Menu Management",
"Permission:Menus.Create": "Create",
"Permission:Menus.Delete": "Delete",
"Permission:Menus.Update": "Update",
"Permission:Menus": "菜单管理",
"Permission:Menus.Create": "创建",
"Permission:Menus.Delete": "删除",
"Permission:Menus.Update": "更新",
"Permission:PageManagement": "页面管理",
"Permission:PageManagement:Create": "创建",
"Permission:PageManagement:Delete": "删除",
@ -119,114 +119,114 @@
"Permission:TagManagement.Delete": "删除",
"Permission:TagManagement.Update": "更新",
"Permission:GlobalResources": "全局资源",
"Permission:CmsKitPublic": "CmsKit公共",
"Permission:Comments.DeleteAll": "删除全部",
"PickYourReaction": "选择你的应",
"Permission:CmsKitPublic": "CmsKit 公共",
"Permission:Comments.DeleteAll": "全部删除",
"PickYourReaction": "选择你的应",
"Rating": "评分",
"RatingUndoMessage": "您的评分将被撤",
"RatingUndoMessage": "您的评分将被撤销。",
"Reactions": "反应",
"Read": "阅读",
"RepliesToThisComment": "回复此评论",
"Reply": "复",
"ReplyTo": "复",
"SamplePageMessage": "Pro模块的示例页面",
"Reply": "复",
"ReplyTo": "复",
"SamplePageMessage": "专业模块的示例页面",
"SaveChanges": "保存更改",
"Script": "脚本",
"SelectAll": "选择所有",
"SelectAll": "全部选择",
"Send": "发送",
"SendMessage": "发送息",
"SendMessage": "发送息",
"SelectedAuthor": "作者",
"ShortDescription": "简",
"ShortDescription": "简要说明",
"Slug": "Slug",
"Source": "源",
"SourceUrl": "源URL",
"SourceUrl": "源网址",
"Star": "星",
"StartDate": "开始时间",
"StartDate": "开始日期",
"Style": "风格",
"Subject": "主题",
"SubjectPlaceholder": "请输入主题",
"Submit": "提交",
"Subscribe": "订阅",
"SuccessfullySaved": "保存成功!",
"TagDeletionConfirmationMessage": "你确定删除 '{0}' 标签吗?",
"SuccessfullySaved": "成功保存!",
"TagDeletionConfirmationMessage": "您确定要删除\"{0}\"标签吗?",
"Tags": "标签",
"Text": "文本",
"ThankYou": "谢谢",
"ThankYou": "谢谢",
"Title": "标题",
"Undo": "撤消",
"Update": "更新",
"UpdatePreferenceSuccessMessage": "您的首选项已保存",
"UpdateYourEmailPreferences": "更新你的邮件首选项",
"UnMakeMainMenu": "取消主菜单",
"UploadFailedMessage": "上传失败",
"UserId": "用户Id",
"Username": "用户名",
"YourComment": "你的评论",
"YourEmailAddress": "你的邮件地址",
"YourFullName": "你的全称",
"YourMessage": "你的消息",
"YourReply": "的回复",
"UpdatePreferenceSuccessMessage": "您的首选项已保存",
"UpdateYourEmailPreferences": "更新您的电子邮件首选项",
"UnMakeMainMenu": "取消制作主菜单",
"UploadFailedMessage": "上传失败",
"UserId": "用户",
"Username": "用户名",
"YourComment": "您的意见",
"YourEmailAddress": "您的电子邮件地址",
"YourFullName": "您的全名",
"YourMessage": "您的信息",
"YourReply": "的回复",
"MarkdownSupported": "<a href=\"https://www.markdownguide.org/basic-syntax/\">Markdown</a> 支持。",
"GlobalResources": "全局资源",
"GlobalResources": "全局",
"SavedSuccessfully": "保存成功",
"CmsKit.BlogPost.Status.0": "草稿",
"CmsKit.BlogPost.Status.1": "已发布",
"CmsKit.BlogPost.Status.2": "等待审核",
"BlogPostPublishConfirmationMessage": "你确定要发布博客文章“{0}”吗?",
"BlogPostPublishConfirmationMessage": "您确定要发布博文\"{0}\"吗?",
"SuccessfullyPublished": "成功发布!",
"Draft": "草稿",
"Draft": "草",
"Publish": "发布",
"BlogPostDraftConfirmationMessage": "你确定要将博客文章“{0}”设置为草稿吗?",
"BlogPostSendToReviewConfirmationMessage": "你确定要将博客文章“{0}”发送给管理员审核发布吗?",
"BlogPostDraftConfirmationMessage": "您确定将博文\"{0}\"设置为草稿吗?",
"BlogPostSendToReviewConfirmationMessage": "您确定要将博文\"{0}\"发送给管理员审核发布吗?",
"SaveAsDraft": "保存为草稿",
"SendToReview": "发送审核",
"SendToReviewToPublish": "核并发布",
"BlogPostSendToReviewSuccessMessage": "博客文章“{0}”已发送给管理员审核发布。",
"HasBlogPostWaitingForReviewMessage": "你有一篇博客文章等待审核。点击查看。",
"SelectAStatus": "选择一个状态",
"SendToReview": "发送审核",
"SendToReviewToPublish": "送审发布",
"BlogPostSendToReviewSuccessMessage": "博文\"{0}\"已送交管理员审核发布。",
"HasBlogPostWaitingForReviewMessage": "您有一篇博文等待审核。点击列表。",
"SelectAStatus": "选择状态",
"Status": "状态",
"CmsKit.BlogPost.ScrollIndex": "博客文章快速导航栏",
"CmsKit.BlogPost.PreventXssFeature": "防止XSS攻击",
"CmsKit.BlogPost.ScrollIndex": "博客文章中的快速导航栏",
"CmsKit.BlogPost.PreventXssFeature": "防止 XSS",
"Add": "添加",
"AddWidget": "添加组件",
"PleaseConfigureWidgets": "请配置件",
"SelectAnAuthor": "选择一个作者",
"InThisDocument": "在此文档",
"GoToTop": "跳至顶部",
"SetAsHomePage": "更改页状态",
"CompletedSettingAsHomePage": "设为首页",
"IsHomePage": "是否为首页",
"RemovedSettingAsHomePage": "删除页设置",
"Feature:CmsKitGroup": "Cms Kit",
"AddWidget": "添加小工具",
"PleaseConfigureWidgets": "请配置件",
"SelectAnAuthor": "选择作者",
"InThisDocument": "在本文档中",
"GoToTop": "返回页首",
"SetAsHomePage": "更改页状态",
"CompletedSettingAsHomePage": "设置为主页",
"IsHomePage": "是页",
"RemovedSettingAsHomePage": "删除了主页设置",
"Feature:CmsKitGroup": "内容管理系统套件",
"Feature:BlogEnable": "博客文章",
"Feature:BlogEnableDescription": "CMS Kit的博客文章系统,允许在应用程序中动态创建博客和文章。",
"Feature:BlogEnableDescription": "CMS Kit 的博客帖子系统可在应用程序中动态创建博客和帖子。",
"Feature:CommentEnable": "评论",
"Feature:CommentEnableDescription": "CMS Kit的评论系统允许对博客文章等实体进行评论。",
"Feature:GlobalResourceEnable": "全局资源",
"Feature:GlobalResourceEnableDescription": "CMS Kit的全局资源功能允许管理全局样式和脚本。",
"Feature:CommentEnableDescription": "CMS Kit 的评论系统允许对 BlogPost 等实体发表评论。",
"Feature:GlobalResourceEnable": "全局配置",
"Feature:GlobalResourceEnableDescription": "CMS Kit 的全局资源功能允许管理全局样式和脚本。",
"Feature:MenuEnable": "菜单",
"Feature:MenuEnableDescription": "CMS Kit的动态菜单系统,允许动态添加/删除应用程序菜单。",
"Feature:MenuEnableDescription": "CMS Kit 的动态菜单系统可动态添加/删除应用程序菜单。",
"Feature:PageEnable": "分页",
"Feature:PageEnableDescription": "CMS Kit的页面系统,允许使用特定URL创建静态页面。",
"Feature:PageEnableDescription": "CMS Kit 的页面系统可创建具有特定 URL 的静态页面。",
"Feature:RatingEnable": "评分",
"Feature:RatingEnableDescription": "CMS Kit的评分系统允许用户对博客文章等实体进行评分。",
"Feature:RatingEnableDescription": "CMS Kit 的评分系统允许用户对 BlogPost 等实体进行评分。",
"Feature:ReactionEnable": "反应",
"Feature:ReactionEnableDescription": "CMS Kit的反应系统允许用户对博客文章、评论等实体发送反应。",
"Feature:ReactionEnableDescription": "CMS Kit 的反应系统允许用户向 BlogPost、Comments 等实体发送反应。",
"Feature:TagEnable": "标签",
"Feature:TagEnableDescription": "CMS Kit的标签系统允许对博客文章等实体进行标记。",
"DeleteBlogPostMessage": "是否确认删除博客?",
"Feature:TagEnableDescription": "CMS Kit 的标签系统允许标签 BlogPost 等实体。",
"DeleteBlogPostMessage": "博客将被删除。你确定吗?",
"CaptchaCode": "验证码",
"CommentTextRequired": "请输入评论",
"CaptchaCodeErrorMessage": "验证码错误,请重试",
"CaptchaCodeMissingMessage": "请输入验证码!",
"UnAllowedExternalUrlMessage": "您包含了不允许的外部 URL。请在没有外部 URL 的情况下重试。",
"UnAllowedExternalUrlMessage": "您包含了一个不允许的外部 URL。请在不包含外部 URL 的情况下重试。",
"URL": "网址",
"PopularTags": "热门标签",
"RemoveCoverImageConfirmationMessage": "您确定要删除封面图片吗?",
"RemoveCoverImage": "删除封面图片",
"CssClass": "CSS类",
"TagsHelpText": "标签应以逗号分隔(例如:tag1、tag2、tag3)",
"ThisPartOfContentCouldntBeLoaded": "无法加载此部分内容",
"DuplicateCommentAttemptMessage": "检测到重复的评论帖子尝试。您的评论已经提交。"
"RemoveCoverImageConfirmationMessage": "您确定要移除封面图像吗?",
"RemoveCoverImage": "移除封面图像",
"CssClass": "CSS 类",
"TagsHelpText": "标签应以逗号分隔(例如:标签 1,标签 2,标签 3)",
"ThisPartOfContentCouldntBeLoaded": "这部分内容无法加载。",
"DuplicateCommentAttemptMessage": "检测到重复发表评论。您的评论已经提交。"
}
}

8
modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/zh-Hans.json

@ -2,9 +2,9 @@
"culture": "zh-Hans",
"texts": {
"DocsTitle": "VoloDocs",
"WelcomeVoloDocs": "欢迎使用VoloDocs!",
"NoProjectWarning": "当前没有定义的项目!",
"CreateYourFirstProject": "点击这里开始你的第一个项目",
"NoProject": "没有项目!"
"WelcomeVoloDocs": "欢迎来到 VoloDocs!",
"NoProjectWarning": "目前还没有确定的项目!",
"CreateYourFirstProject": "单击此处开始您的第一个项目",
"NoProject": "没有项目"
}
}

50
modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/zh-Hans.json

@ -2,41 +2,41 @@
"culture": "zh-Hans",
"texts": {
"Documents": "文档",
"BackToWebsite": "返回网站",
"BackToWebsite": "返回网站",
"Contributors": "贡献者",
"ShareOn": "分享到",
"Version": "版本",
"Edit": "编辑",
"LastEditTime": "上次编辑",
"LastEditTime": "最后编辑",
"Delete": "删除",
"ClearCache": "清除缓存",
"ClearCacheConfirmationMessage": "你确定清除 \"{0}\" 项目所有的缓存吗",
"ReIndexAllProjects": "重新索引所有项目",
"ClearCacheConfirmationMessage": "您确定要清除项目\"{0}\"的所有缓存吗?",
"ReIndexAllProjects": "重新索引所有项目",
"ReIndexProject": "重新索引项目",
"ReIndexProjectConfirmationMessage": "你确定重新索引 \"{0}\" 项目",
"SuccessfullyReIndexProject": "成功重新索引 \"{0}\" 项目",
"ReIndexAllProjectConfirmationMessage": "你确定重新索引所有的项目",
"SuccessfullyReIndexAllProject": "成功重新索引所有项目",
"InThisDocument": "在本文中",
"GoToTop": "到顶部",
"ReIndexProjectConfirmationMessage": "您确定要为项目\"{0}\"重新索引吗?",
"SuccessfullyReIndexProject": "成功重新索引:\"{0}\"",
"ReIndexAllProjectConfirmationMessage": "您确定要重新索引所有项目吗?",
"SuccessfullyReIndexAllProject": "成功重新索引所有项目",
"InThisDocument": "在本文中",
"GoToTop": "返回页首",
"Projects": "项目",
"NoProjectWarning": "还没有项目!",
"DocumentNotFound": "找不到请求的文档!",
"ProjectNotFound": "找不到请求的项目!",
"NavigationDocumentNotFound": "这个版本没有导航文件!",
"DocumentNotFoundInSelectedLanguage": "本文档不适用于所选语言, 将以默认语言显示文档.",
"FilterTopics": "过滤主题",
"FullSearch": "搜索文档",
"Volo.Docs.Domain:010001": "Elastic search未启用.",
"MultipleVersionDocumentInfo": "本文档有多个版本. 选择最适合你的选项",
"New": "新文档",
"Upd": "更新",
"NewExplanation": "在最近两周内创建.",
"UpdatedExplanation": "在最近两周内更新.",
"Volo.Docs.Domain:010002": "简称 {ShortName} 已经存在.",
"NoProjectWarning": "目前还没有任何项目!",
"DocumentNotFound": "哎呀,没有找到所需的文档!",
"ProjectNotFound": "哎呀,没有找到请求的项目!",
"NavigationDocumentNotFound": "该版本没有导航文档!",
"DocumentNotFoundInSelectedLanguage": "未找到所需语言的文档。显示默认语言的文档。",
"FilterTopics": "筛选主题",
"FullSearch": "在文档中搜索",
"Volo.Docs.Domain:010001": "未启用Elastic search。",
"MultipleVersionDocumentInfo": "本文档有多个版本。请选择最适合您的选项。",
"New": "新",
"Upd": "更新文档",
"NewExplanation": "最近两周创建。",
"UpdatedExplanation": "最近两周更新。",
"Volo.Docs.Domain:010002": "简称 {ShortName} 已经存在",
"Preview": "预览",
"Search": "搜索",
"SearchResults": "搜索结果",
"SearchInTheAllDocuments": "搜索所有文档"
"SearchInTheAllDocuments": "在所有文档中搜索"
}
}

14
modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/zh-Hans.json

@ -2,16 +2,16 @@
"culture": "zh-Hans",
"texts": {
"Features": "功能",
"NoFeatureFoundMessage": "没有可用的功能.",
"ManageHostFeatures": "管理Host功能",
"ManageHostFeaturesText": "您可以通过单击以下按钮来管理宿主功能。",
"NoFeatureFoundMessage": "没有任何可用的功能。",
"ManageHostFeatures": "管理主机功能",
"ManageHostFeaturesText": "点击以下按钮即可管理主机端功能。",
"Permission:FeatureManagement": "功能管理",
"Permission:FeatureManagement.ManageHostFeatures": "管理Host功能",
"Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0}功能的值无效!",
"Permission:FeatureManagement.ManageHostFeatures": "管理主机功能",
"Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0}功能值无效!",
"Menu:FeatureManagement": "功能管理",
"ResetToDefault": "重置为默认值",
"ResetedToDefault": "已重置为默认值",
"AreYouSure": "是否确认?",
"AreYouSureToResetToDefault": "你确定要重置为默认值吗?"
"AreYouSure": "你确定吗?",
"AreYouSureToResetToDefault": "您确定要重置为默认设置吗?"
}
}

112
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json

@ -16,8 +16,8 @@
"Password": "密码",
"PersonalInfo": " 个人信息",
"PersonalSettings": "个人设置",
"UserDeletionConfirmationMessage": "用户 '{0}' 将被删除. 你确定吗?",
"RoleDeletionConfirmationMessage": "角色 '{0}' 将被删除. 你确定吗?",
"UserDeletionConfirmationMessage": "用户 '{0}' 将被删除. 你确定吗",
"RoleDeletionConfirmationMessage": "角色 '{0}' 将被删除. 你确定吗",
"DisplayName:RoleName": "角色名称",
"DisplayName:UserName": "用户名称",
"DisplayName:Name": "名",
@ -35,49 +35,49 @@
"DisplayName:CurrentPassword": "当前密码",
"DisplayName:NewPassword": "新密码",
"DisplayName:NewPasswordConfirm": "确认新密码",
"PasswordChangedMessage": "你已成功更改密码.",
"PersonalSettingsSavedMessage": "你的个人设置保存成功.",
"Volo.Abp.Identity:DefaultError": "发生了一个未知错误.",
"Volo.Abp.Identity:ConcurrencyFailure": "乐观并发检查失败. 你正在处理的对象已被其他用户修改. 请放弃你的更改, 然后重试.",
"Volo.Abp.Identity:DuplicateEmail": "邮箱 '{0}' 已存在.",
"Volo.Abp.Identity:DuplicateRoleName": "角色名 '{0}' 已存在.",
"Volo.Abp.Identity:DuplicateUserName": "用户名 '{0}' 已存在.",
"Volo.Abp.Identity:InvalidEmail": "邮箱 '{0}' 无效.",
"Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "提供的 PasswordHasherCompatibilityMode 无效.",
"Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "迭代计数必须是正整数.",
"Volo.Abp.Identity:InvalidRoleName": "角色名 '{0}' 无效.",
"Volo.Abp.Identity:InvalidToken": "token无效.",
"Volo.Abp.Identity:InvalidUserName": "用户名 '{0}' 无效, 只能包含字母或数字.",
"InvalidUserName": "用户名 '{0}' 无效.",
"Volo.Abp.Identity:LoginAlreadyAssociated": "此登录名的用户已存在.",
"Volo.Abp.Identity:PasswordMismatch": "密码错误.",
"Volo.Abp.Identity:PasswordRequiresDigit": "密码至少包含一位数字 ('0'-'9').",
"Volo.Abp.Identity:PasswordRequiresLower": "密码至少包含一位小写字母 ('a'-'z').",
"Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "密码至少包含一位非字母数字字符.",
"Volo.Abp.Identity:PasswordRequiresUpper": "密码至少包含一位大写字母 ('A'-'Z').",
"Volo.Abp.Identity:PasswordTooShort": "密码至少为{0}个字符.",
"Volo.Abp.Identity:PasswordRequiresUniqueChars": "密码至少包含{0}个唯一字符.",
"Volo.Abp.Identity:RoleNotFound": "角色 {0} 不存在.",
"Volo.Abp.Identity:UserAlreadyHasPassword": "用户已设置密码.",
"Volo.Abp.Identity:UserAlreadyInRole": "用户已具有角色 '{0}'.",
"Volo.Abp.Identity:UserLockedOut": "用户被锁定.",
"Volo.Abp.Identity:UserLockoutNotEnabled": "该用户未启用锁定.",
"Volo.Abp.Identity:UserNameNotFound": "用户 {0} 不存在.",
"Volo.Abp.Identity:UserNotInRole": "用户不具有 '{0}' 角色.",
"Volo.Abp.Identity:PasswordConfirmationFailed": "密码或确认密码不一致.",
"Volo.Abp.Identity:NullSecurityStamp": "用户安全标识不能为空.",
"Volo.Abp.Identity:RecoveryCodeRedemptionFailed": "恢复代码兑换失败.",
"PasswordChangedMessage": "你已成功更改密码",
"PersonalSettingsSavedMessage": "你的个人设置保存成功",
"Volo.Abp.Identity:DefaultError": "发生了一个未知错误",
"Volo.Abp.Identity:ConcurrencyFailure": "乐观并发检查失败. 你正在处理的对象已被其他用户修改. 请放弃你的更改, 然后重试",
"Volo.Abp.Identity:DuplicateEmail": "邮箱 '{0}' 已存在",
"Volo.Abp.Identity:DuplicateRoleName": "角色名 '{0}' 已存在",
"Volo.Abp.Identity:DuplicateUserName": "用户名 '{0}' 已存在",
"Volo.Abp.Identity:InvalidEmail": "邮箱 '{0}' 无效",
"Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "提供的 PasswordHasherCompatibilityMode 无效",
"Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "迭代计数必须是正整数",
"Volo.Abp.Identity:InvalidRoleName": "角色名 '{0}' 无效",
"Volo.Abp.Identity:InvalidToken": "token无效",
"Volo.Abp.Identity:InvalidUserName": "用户名 '{0}' 无效, 只能包含字母或数字",
"InvalidUserName": "用户名 '{0}' 无效",
"Volo.Abp.Identity:LoginAlreadyAssociated": "此登录名的用户已存在",
"Volo.Abp.Identity:PasswordMismatch": "密码错误",
"Volo.Abp.Identity:PasswordRequiresDigit": "密码至少包含一位数字 ('0'-'9')",
"Volo.Abp.Identity:PasswordRequiresLower": "密码至少包含一位小写字母 ('a'-'z')",
"Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "密码至少包含一位非字母数字字符",
"Volo.Abp.Identity:PasswordRequiresUpper": "密码至少包含一位大写字母 ('A'-'Z')",
"Volo.Abp.Identity:PasswordTooShort": "密码至少为{0}个字符",
"Volo.Abp.Identity:PasswordRequiresUniqueChars": "密码至少包含{0}个唯一字符",
"Volo.Abp.Identity:RoleNotFound": "角色 {0} 不存在",
"Volo.Abp.Identity:UserAlreadyHasPassword": "用户已设置密码",
"Volo.Abp.Identity:UserAlreadyInRole": "用户已具有角色 '{0}'",
"Volo.Abp.Identity:UserLockedOut": "用户被锁定",
"Volo.Abp.Identity:UserLockoutNotEnabled": "该用户未启用锁定",
"Volo.Abp.Identity:UserNameNotFound": "用户 {0} 不存在",
"Volo.Abp.Identity:UserNotInRole": "用户不具有 '{0}' 角色",
"Volo.Abp.Identity:PasswordConfirmationFailed": "密码或确认密码不一致",
"Volo.Abp.Identity:NullSecurityStamp": "用户安全标识不能为空",
"Volo.Abp.Identity:RecoveryCodeRedemptionFailed": "恢复代码兑换失败",
"Volo.Abp.Identity:010001": "你无法删除自己的帐户!",
"Volo.Abp.Identity:010002": "不能为用户设置超过{MaxUserMembershipCount}个组织单位!",
"Volo.Abp.Identity:010003": "无法更改外部登录用户的密码!",
"Volo.Abp.Identity:010004": "已存在名为 {0} 的组织单位. 无法在同一级别创建相同名称的组织单位.",
"Volo.Abp.Identity:010005": "无法重命名静态角色.",
"Volo.Abp.Identity:010006": "无法删除静态角色.",
"Volo.Abp.Identity:010004": "已存在名为 {0} 的组织单位. 无法在同一级别创建相同名称的组织单位",
"Volo.Abp.Identity:010005": "无法重命名静态角色",
"Volo.Abp.Identity:010006": "无法删除静态角色",
"Volo.Abp.Identity:010007": "你不能修改你的双因素身份验证设置",
"Volo.Abp.Identity:010008": "不允许修改双因素身份验证设置.",
"Volo.Abp.Identity:010009": "你不能委托给自己.",
"Volo.Abp.Identity:010008": "不允许修改双因素身份验证设置",
"Volo.Abp.Identity:010009": "你不能委托给自己",
"Identity.OrganizationUnit.MaxUserMembershipCount": "组织单位最大允许的成员资格计数",
"ThisUserIsNotActiveMessage": "该用户不可用.",
"ThisUserIsNotActiveMessage": "该用户不可用",
"Permission:IdentityManagement": "身份标识管理",
"Permission:RoleManagement": "角色管理",
"Permission:Create": "创建",
@ -102,22 +102,22 @@
"DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "要求验证的手机号码",
"DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "启用用户名更新",
"DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "启用电子邮箱更新",
"Description:Abp.Identity.Password.RequiredLength": "密码的最小长度.",
"Description:Abp.Identity.Password.RequiredUniqueChars": "密码必须包含唯一字符的数量.",
"Description:Abp.Identity.Password.RequireNonAlphanumeric": "密码是否必须包含非字母数字.",
"Description:Abp.Identity.Password.RequireLowercase": "密码是否必须包含小写字母.",
"Description:Abp.Identity.Password.RequireUppercase": "密码是否必须包含大写字母.",
"Description:Abp.Identity.Password.RequireDigit": "密码是否必须包含数字.",
"Description:Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword": "是否强制用户定期更改密码.",
"Description:Abp.Identity.Password.PasswordChangePeriodDays": "用户必须更改密码的周期(天).",
"Description:Abp.Identity.Lockout.AllowedForNewUsers": "允许新用户被锁定.",
"Description:Abp.Identity.Lockout.LockoutDuration": "当锁定发生时用户被的锁定的时间(秒).",
"Description:Abp.Identity.Lockout.MaxFailedAccessAttempts": "如果启用锁定, 当用户被锁定前失败的访问尝试次数.",
"Description:Abp.Identity.SignIn.RequireConfirmedEmail": "登录时是否需要验证的电子邮箱.",
"Description:Abp.Identity.Password.RequiredLength": "密码的最小长度",
"Description:Abp.Identity.Password.RequiredUniqueChars": "密码必须包含唯一字符的数量",
"Description:Abp.Identity.Password.RequireNonAlphanumeric": "密码是否必须包含非字母数字",
"Description:Abp.Identity.Password.RequireLowercase": "密码是否必须包含小写字母",
"Description:Abp.Identity.Password.RequireUppercase": "密码是否必须包含大写字母",
"Description:Abp.Identity.Password.RequireDigit": "密码是否必须包含数字",
"Description:Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword": "是否强制用户定期更改密码",
"Description:Abp.Identity.Password.PasswordChangePeriodDays": "用户必须更改密码的周期(天)",
"Description:Abp.Identity.Lockout.AllowedForNewUsers": "允许新用户被锁定",
"Description:Abp.Identity.Lockout.LockoutDuration": "当锁定发生时用户被的锁定的时间(秒)",
"Description:Abp.Identity.Lockout.MaxFailedAccessAttempts": "如果启用锁定, 当用户被锁定前失败的访问尝试次数",
"Description:Abp.Identity.SignIn.RequireConfirmedEmail": "登录时是否需要验证的电子邮箱",
"Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "用户是否可以确认电话号码",
"Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "登录时是否需要验证的手机号码.",
"Description:Abp.Identity.User.IsUserNameUpdateEnabled": "是否允许用户更新用户名.",
"Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允许用户更新电子邮箱.",
"Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "登录时是否需要验证的手机号码",
"Description:Abp.Identity.User.IsUserNameUpdateEnabled": "是否允许用户更新用户名",
"Description:Abp.Identity.User.IsEmailUpdateEnabled": "是否允许用户更新电子邮箱",
"Details": "详情",
"CreatedBy": "创建者",
"ModifiedBy": "修改者",
@ -126,4 +126,4 @@
"LockoutEndTime": "锁定结束时间",
"FailedAccessCount": "访问失败次数"
}
}
}

125
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Threading;
using System.Threading.Tasks;
using JetBrains.Annotations;
@ -82,7 +83,7 @@ public class IdentityUserManager : UserManager<IdentityUser>, IDomainService
return await CreateAsync(user);
}
public async override Task<IdentityResult> DeleteAsync(IdentityUser user)
{
user.Claims.Clear();
@ -397,4 +398,126 @@ public class IdentityUserManager : UserManager<IdentityUser>, IDomainService
await UserRepository.UpdateOrganizationAsync(sourceOrganizationId, targetOrganizationId, CancellationToken);
}
public virtual async Task<bool> ValidateUserNameAsync(string userName, Guid? userId = null)
{
if (string.IsNullOrWhiteSpace(userName))
{
return false;
}
if (!string.IsNullOrEmpty(Options.User.AllowedUserNameCharacters) && userName.Any(c => !Options.User.AllowedUserNameCharacters.Contains(c)))
{
return false;
}
var owner = await FindByNameAsync(userName);
if (owner != null && owner.Id != userId)
{
return false;
}
return true;
}
public virtual Task<string> GetRandomUserNameAsync(int length)
{
var allowedUserNameCharacters = Options.User.AllowedUserNameCharacters;
if (allowedUserNameCharacters.IsNullOrWhiteSpace())
{
allowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
}
var randomUserName = string.Empty;
var random = new Random();
while (randomUserName.Length < length)
{
randomUserName += allowedUserNameCharacters[random.Next(0, allowedUserNameCharacters.Length)];
}
return Task.FromResult(randomUserName);
}
public virtual async Task<string> GetUserNameFromEmailAsync(string email)
{
const int maxTryCount = 20;
var tryCount = 0;
var userName = email.Split('@')[0];
if (await ValidateUserNameAsync(userName))
{
// The username is valid.
return userName;
}
if (Options.User.AllowedUserNameCharacters.IsNullOrWhiteSpace())
{
// The AllowedUserNameCharacters is not set. So, we are generating a random username.
tryCount = 0;
do
{
var randomUserName = userName + RandomHelper.GetRandom(1000, 9999);
if ( await ValidateUserNameAsync(randomUserName))
{
return randomUserName;
}
tryCount++;
} while (tryCount < maxTryCount);
}
else if (!userName.All(Options.User.AllowedUserNameCharacters.Contains))
{
// The username contains not allowed characters. So, we are generating a random username.
do
{
var randomUserName = await GetRandomUserNameAsync(userName.Length);
if ( await ValidateUserNameAsync(randomUserName))
{
return randomUserName;
}
tryCount++;
} while (tryCount < maxTryCount);
}
else if (Options.User.AllowedUserNameCharacters.Where(char.IsDigit).Distinct().Count() >= 4)
{
// The AllowedUserNameCharacters includes 4 numbers. So, we are generating 4 random numbers and appending to the username.
var numbers = Options.User.AllowedUserNameCharacters.Where(char.IsDigit).OrderBy(x => Guid.NewGuid()).Take(4).ToArray();
var minArray = numbers.OrderBy(x => x).ToArray();
if (minArray[0] == '0')
{
var secondItem = minArray[1];
minArray[0] = secondItem;
minArray[1] = '0';
}
var min = int.Parse(new string(minArray));
var max = int.Parse(new string(numbers.OrderByDescending(x => x).ToArray()));
tryCount = 0;
do
{
var randomUserName = userName + RandomHelper.GetRandom(min, max);
if ( await ValidateUserNameAsync(randomUserName))
{
return randomUserName;
}
tryCount++;
} while (tryCount < maxTryCount);
}
else
{
tryCount = 0;
do
{
// The AllowedUserNameCharacters does not include numbers. So, we are generating 4 random characters and appending to the username.
var randomUserName = userName + await GetRandomUserNameAsync(4);
if (await ValidateUserNameAsync(randomUserName))
{
return randomUserName;
}
tryCount++;
} while (tryCount < maxTryCount);
}
Logger.LogError($"Could not get a valid user name for the given email address: {email}, allowed characters: {Options.User.AllowedUserNameCharacters}, tried {maxTryCount} times.");
throw new AbpIdentityResultException(IdentityResult.Failed(new IdentityErrorDescriber().InvalidUserName(userName)));
}
}

84
modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs

@ -2,8 +2,10 @@
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
@ -378,6 +380,88 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase
}
}
[Fact]
public async Task ValidateUserNameAsync()
{
var result = await _identityUserManager.ValidateUserNameAsync("M_y+User-001@abp.io");
result.ShouldBeTrue();
var user = CreateRandomUser();
(await _identityUserManager.CreateAsync(user)).CheckErrors();
result = await _identityUserManager.ValidateUserNameAsync(user.UserName, user.Id);
result.ShouldBeTrue();
result = await _identityUserManager.ValidateUserNameAsync(user.UserName);
result.ShouldBeFalse();
result = await _identityUserManager.ValidateUserNameAsync("无效的字符");
result.ShouldBeFalse();
}
[Fact]
public async Task GetRandomUserNameAsync()
{
_identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
var username = await _identityUserManager.GetRandomUserNameAsync(15);
username.Length.ShouldBe(15);
username.All(c => _identityUserManager.Options.User.AllowedUserNameCharacters.Contains(c)).ShouldBeTrue();
_identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz0123456789";
username = await _identityUserManager.GetRandomUserNameAsync(15);
username.Length.ShouldBe(15);
username.All(c => _identityUserManager.Options.User.AllowedUserNameCharacters.Contains(c)).ShouldBeTrue();
_identityUserManager.Options.User.AllowedUserNameCharacters = "0123456789";
username = await _identityUserManager.GetRandomUserNameAsync(15);
username.Length.ShouldBe(15);
username.All(c => _identityUserManager.Options.User.AllowedUserNameCharacters.Contains(c)).ShouldBeTrue();
_identityUserManager.Options.User.AllowedUserNameCharacters = null!;
username = await _identityUserManager.GetRandomUserNameAsync(15);
username.Length.ShouldBe(15);
username.All(c => "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+".Contains(c)).ShouldBeTrue();
}
[Fact]
public async Task GetUserNameFromEmailAsync()
{
_identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz0123456789";
var username = await _identityUserManager.GetUserNameFromEmailAsync("Yönetici@abp.io");
username.Length.ShouldBe("Yönetici".Length); //random username
username.All(c => "abcdefghijklmnopqrstuvwxyz0123456789".Contains(c)).ShouldBeTrue();
_identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz0123456789";
username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io");
username.Length.ShouldBe(9); //admin and random 4 numbers
username.ShouldContain("admin");
Regex.IsMatch(username, @"\d{4}$").ShouldBeTrue();
_identityUserManager.Options.User.AllowedUserNameCharacters = "admin01234";
username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io");
username.Length.ShouldBe(9); //admin and random 4 numbers
username.ShouldContain("admin");
Regex.IsMatch(username, @"[0-4]{3}$").ShouldBeTrue();
_identityUserManager.Options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyz";
username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io");
username.Length.ShouldBe(9); //admin and random 4 characters
username.ShouldContain("admin");
Regex.IsMatch(username, @"[a-z]{4}$").ShouldBeTrue();
_identityUserManager.Options.User.AllowedUserNameCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
username = await _identityUserManager.GetUserNameFromEmailAsync("ADMIN@abp.io");
username.Length.ShouldBe(9); //admin and random 4 characters
username.ShouldContain("ADMIN");
Regex.IsMatch(username, @"[A-Z]{4}$").ShouldBeTrue();
_identityUserManager.Options.User.AllowedUserNameCharacters = null!;
username = await _identityUserManager.GetUserNameFromEmailAsync("admin@abp.io");
username.Length.ShouldBe(9); //admin and random 4 numbers
username.ShouldContain("admin");
Regex.IsMatch(username, @"[0-9]{4}$").ShouldBeTrue();
}
private async Task CreateRandomDefaultRoleAsync()
{
await _identityRoleRepository.InsertAsync(

4
modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/LocalizationExtensions/zh-Hans.json

@ -1,7 +1,7 @@
{
"culture": "zh-Hans",
"texts": {
"Volo.Abp.Identity:PasswordTooShort": "密码长度必须大于{0}字符. ",
"Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "密码必须至少包含一个非字母数字字符."
"Volo.Abp.Identity:PasswordTooShort": "密码长度必须大于 {0} 字符。",
"Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "密码必须至少包含一个非字母数字字符"
}
}

14
modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/zh-Hans.json

@ -6,11 +6,11 @@
"Volo.IdentityServer:DuplicateApiScopeName": "Api Scope已存在: {Name}",
"Volo.IdentityServer:DuplicateClientId": "ClientId已经存在: {ClientId}",
"UserLockedOut": "登录失败,用户账户已被锁定.请稍后再试.",
"InvalidUserNameOrPassword": "用户名或密码错误!",
"LoginIsNotAllowed": "无法登录!你的账号未激活或者需要验证邮箱地址/手机号.",
"InvalidUsername": "用户名或密码错误!",
"InvalidAuthenticatorCode": "验证码无效!",
"InvalidRecoveryCode": "恢复代码无效!",
"TheTargetUserIsNotLinkedToYou": "目标用户未和你有关联!"
"InvalidUserNameOrPassword": "用户名或密码错误",
"LoginIsNotAllowed": "无法登录你的账号未激活或者需要验证邮箱地址/手机号.",
"InvalidUsername": "用户名或密码错误",
"InvalidAuthenticatorCode": "验证码无效",
"InvalidRecoveryCode": "恢复代码无效",
"TheTargetUserIsNotLinkedToYou": "目标用户与您没有关联!"
}
}
}

16
modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Localization/OpenIddict/zh-Hans.json

@ -1,15 +1,15 @@
{
"culture": "zh-Hans",
"texts": {
"TheOpenIDConnectRequestCannotBeRetrieved": "无法检索 OpenID Connect 请求.",
"TheUserDetailsCannotBbeRetrieved" : "无法检索用户详细信息.",
"TheApplicationDetailsCannotBeFound": "找不到应用详情.",
"DetailsConcerningTheCallingClientApplicationCannotBeFound": "找到有关调用客户端应用程序的详细信息.",
"TheSpecifiedGrantTypeIsNotImplemented": "未实施指定的授权类型 {0}.",
"TheOpenIDConnectRequestCannotBeRetrieved": "无法检索 OpenID Connect 请求",
"TheUserDetailsCannotBbeRetrieved": "无法检索用户详细信息",
"TheApplicationDetailsCannotBeFound": "找不到应用详情",
"DetailsConcerningTheCallingClientApplicationCannotBeFound": "无法找到有关调用客户端应用程序的详细信息",
"TheSpecifiedGrantTypeIsNotImplemented": "指定的授权类型 {0} 未实现。",
"Authorization": "授权",
"DoYouWantToGrantAccessToYourData": "是否要授予 {0} 访问你的数据的权限?",
"DoYouWantToGrantAccessToYourData": "是否要授予 {0} 访问你的数据的权限",
"ScopesRequested": "要求的Scope",
"Accept": "同意",
"Accept": "接受",
"Deny": "拒绝"
}
}
}

4
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/zh-Hans.json

@ -2,10 +2,10 @@
"culture": "zh-Hans",
"texts": {
"Permissions": "权限",
"OnlyProviderPermissons": "只有这个提供",
"OnlyProviderPermissons": "只有这个提供",
"All": "所有",
"SelectAllInAllTabs": "授予所有权限",
"SelectAllInThisTab": "全选",
"SaveWithoutAnyPermissionsWarningMessage": "你确定要保存没有任何权限吗?"
"SaveWithoutAnyPermissionsWarningMessage": "您确定要在没有任何权限的情况下保存吗?"
}
}

10
modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json

@ -19,7 +19,7 @@
"Menu:Emailing": "邮件",
"Menu:TimeZone": "时区",
"DisplayName:Timezone": "时区",
"TimezoneHelpText": "此设置用于应用程序范围或基于租户.",
"TimezoneHelpText": "此设置用于应用程序范围或基于租户",
"SmtpHost": "主机",
"SmtpPort": "端口",
"SmtpUserName": "用户名",
@ -31,8 +31,8 @@
"DefaultFromDisplayName": "默认显示名称",
"Feature:SettingManagementGroup": "设置管理",
"Feature:SettingManagementEnable": "启用设置管理",
"Feature:SettingManagementEnableDescription": "在应用程序中启用设置管理系统.",
"Feature:AllowChangingEmailSettings": "允许更改邮件设置.",
"Feature:AllowChangingEmailSettingsDescription": "允许更改邮件设置."
"Feature:SettingManagementEnableDescription": "在应用程序中启用设置管理系统",
"Feature:AllowChangingEmailSettings": "允许更改邮件设置",
"Feature:AllowChangingEmailSettingsDescription": "允许更改邮件设置"
}
}
}

4
modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/zh-Hans.json

@ -1,13 +1,13 @@
{
"culture": "zh-Hans",
"texts": {
"Volo.Abp.TenantManagement:DuplicateTenantName": "租户名称已存在: {Name}",
"Volo.Abp.TenantManagement:DuplicateTenantName": "租户名称已存在{Name}",
"Menu:TenantManagement": "租户管理",
"Tenants": "租户",
"NewTenant": "新租户",
"TenantName": "租户名称",
"DisplayName:TenantName": "租户名称",
"TenantDeletionConfirmationMessage": "租户 '{0}' 将被删除. 你确定吗?",
"TenantDeletionConfirmationMessage": "租户'{0}'将被删除。您确认吗?",
"ConnectionStrings": "连接字符串",
"DisplayName:DefaultConnectionString": "默认连接字符串",
"DisplayName:UseSharedDatabase": "使用共享数据库",

20
modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/zh-Hans.json

@ -1,14 +1,14 @@
{
"culture": "zh-Hans",
"texts": {
"VirtualFileExplorer" : "虚拟文件浏览器",
"VirtualFileType" : "虚拟文件类型",
"Menu:VirtualFileExplorer" : "虚拟文件浏览器",
"LastUpdateTime" : "最后更新时间",
"VirtualFileName" : "虚拟文件名",
"FileContent" : "文件内容",
"Size" : "文件大小",
"BackToRoot" : "回根目录",
"EmptyFileInfoList" : "这里没有任何虚拟文件"
"VirtualFileExplorer": "虚拟文件资源管理器",
"VirtualFileType": "虚拟文件类型",
"Menu:VirtualFileExplorer": "虚拟文件资源管理器",
"LastUpdateTime": "最后更新时间",
"VirtualFileName": "虚拟文件名",
"FileContent": "文件内容",
"Size": "文件大小",
"BackToRoot": "回根目录",
"EmptyFileInfoList": "没有虚拟文件"
}
}
}

4
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Localization/MyProjectName/zh-Hans.json

@ -2,7 +2,7 @@
"culture": "zh-Hans",
"texts": {
"Welcome_Title": "欢迎",
"Welcome_Text": "这是ABP框架的极简单层应用程序启动模板.",
"Welcome_Text": "这是 ABP 框架的极简单层应用程序启动模板。",
"Menu:Home": "首页"
}
}
}

4
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Localization/MyProjectName/zh-Hans.json

@ -2,7 +2,7 @@
"culture": "zh-Hans",
"texts": {
"Welcome_Title": "欢迎",
"Welcome_Text": "这是ABP框架的极简单层应用程序启动模板.",
"Welcome_Text": "这是 ABP 框架的极简单层应用程序启动模板。",
"Menu:Home": "首页"
}
}
}

4
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Shared/Localization/MyProjectName/zh-Hans.json

@ -2,7 +2,7 @@
"culture": "zh-Hans",
"texts": {
"Welcome_Title": "欢迎",
"Welcome_Text": "这是ABP框架的极简单层应用程序启动模板.",
"Welcome_Text": "这是 ABP 框架的极简单层应用程序启动模板。",
"Menu:Home": "首页"
}
}
}

4
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Localization/MyProjectName/zh-Hans.json

@ -2,7 +2,7 @@
"culture": "zh-Hans",
"texts": {
"Welcome_Title": "欢迎",
"Welcome_Text": "这是ABP框架的极简单层应用程序启动模板.",
"Welcome_Text": "这是 ABP 框架的极简单层应用程序启动模板。",
"Menu:Home": "首页"
}
}
}

4
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Localization/MyProjectName/zh-Hans.json

@ -2,7 +2,7 @@
"culture": "zh-Hans",
"texts": {
"Welcome_Title": "欢迎",
"Welcome_Text": "这是ABP框架的极简单层应用程序启动模板.",
"Welcome_Text": "这是 ABP 框架的极简单层应用程序启动模板。",
"Menu:Home": "首页"
}
}
}

4
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Localization/MyProjectName/zh-Hans.json

@ -2,7 +2,7 @@
"culture": "zh-Hans",
"texts": {
"Welcome_Title": "欢迎",
"Welcome_Text": "这是ABP框架的极简单层应用程序启动模板.",
"Welcome_Text": "这是 ABP 框架的极简单层应用程序启动模板。",
"Menu:Home": "首页"
}
}
}

4
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Localization/MyProjectName/zh-Hans.json

@ -2,7 +2,7 @@
"culture": "zh-Hans",
"texts": {
"Welcome_Title": "欢迎",
"Welcome_Text": "这是ABP框架的极简单层应用程序启动模板.",
"Welcome_Text": "这是 ABP 框架的极简单层应用程序启动模板。",
"Menu:Home": "首页"
}
}
}

14
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/zh-Hans.json

@ -1,8 +1,8 @@
{
"culture": "zh-Hans",
"texts": {
"Menu:Home": "首页",
"Welcome": "欢迎",
"LongWelcomeMessage": "欢迎来到该应用程序. 这是一个基于ABP框架的启动项目. 有关更多信息, 请访问 abp.io."
}
}
"culture": "zh-Hans",
"texts": {
"Menu:Home": "首页",
"Welcome": "欢迎",
"LongWelcomeMessage": "欢迎使用本应用程序。这是一个基于 ABP 框架的启动项目。更多信息,请访问 abp.io。"
}
}

2
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/zh-Hans.json

@ -2,6 +2,6 @@
"culture": "zh-Hans",
"texts": {
"MyAccount": "我的账户",
"SamplePageMessage": "MyProjectName模块的示例页面"
"SamplePageMessage": "MyProjectName 模块的示例页面"
}
}
Loading…
Cancel
Save