Browse Source

Merge branch 'dev' into onurdeniz/L

pull/18691/head
honurbu 3 years ago
parent
commit
dc6fa69a14
  1. 3
      Directory.Packages.props
  2. 14
      abp_io/AbpIoLocalization/AbpIoLocalization/Account/Localization/Resources/zh-Hans.json
  3. 650
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json
  4. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json
  5. 230
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/zh-Hans.json
  6. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Blog/Localization/Resources/zh-Hans.json
  7. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json
  8. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json
  9. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json
  10. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json
  11. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  12. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json
  13. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json
  14. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json
  15. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json
  16. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hr.json
  17. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json
  18. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json
  19. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json
  20. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json
  21. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json
  22. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json
  23. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json
  24. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json
  25. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json
  26. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json
  27. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
  28. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json
  29. 1485
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
  30. 676
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json
  31. 362
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/zh-Hans.json
  32. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Docs/Localization/Resources/zh-Hans.json
  33. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Support/Localization/Resources/zh-Hans.json
  34. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ar.json
  35. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/cs.json
  36. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/de.json
  37. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en-GB.json
  38. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
  39. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/es.json
  40. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/fi.json
  41. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/fr.json
  42. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hr.json
  43. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/hu.json
  44. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/is.json
  45. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/it.json
  46. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/nl.json
  47. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/pl-PL.json
  48. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/pt-BR.json
  49. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ro-RO.json
  50. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/ru.json
  51. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/sk.json
  52. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/sl.json
  53. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json
  54. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/vi.json
  55. 550
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json
  56. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hant.json
  57. 10
      docs/en/CLI.md
  58. 130
      docs/en/UI/Angular/Authorization.md
  59. 134
      docs/en/UI/Angular/Component-Replacement.md
  60. 6
      docs/en/UI/AspNetCore/Tag-Helpers/Form-elements.md
  61. 7
      framework/Volo.Abp.sln
  62. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientCacheOptions.cs
  63. 1
      framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientModule.cs
  64. 118
      framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcRemoteTenantStore.cs
  65. 13
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs
  66. 12
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs
  67. 6
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOptions.cs
  68. 20
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs
  69. 13
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/IAbpDatePickerOptions.cs
  70. 22
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/zh-Hans.json
  71. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs
  72. 562
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js
  73. 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
  74. 22
      framework/src/Volo.Abp.AspNetCore.Mvc/Microsoft/Extensions/DependencyInjection/AbpApiVersioningExtensions.cs
  75. 2
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj
  76. 5
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs
  77. 1
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpConventionalApiControllerSpecification.cs
  78. 13
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalControllerSetting.cs
  79. 12
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/zh-Hans.json
  80. 1
      framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj
  81. 46
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs
  82. 7
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  83. 9
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs
  84. 250
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/TranslateCommand.cs
  85. 4
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs
  86. 69
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs
  87. 29
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs
  88. 9
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/Angular/AngularServiceProxyGenerator.cs
  89. 49
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs
  90. 4
      framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/zh-Hans.json
  91. 40
      framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/ExceptionHandling/Localization/zh-Hans.json
  92. 2
      framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/zh-Hans.json
  93. 4
      framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/Localization/zh-Hans.json
  94. 2
      framework/src/Volo.Abp.Ldap.Abstractions/Volo/Abp/Ldap/Localization/zh-Hans.json
  95. 2
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/zh-Hans.json
  96. 9
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/IMultiTenantUrlProvider.cs
  97. 10
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/Localization/zh-Hans.json
  98. 43
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConfigurationCacheItem.cs
  99. 78
      framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantUrlProvider.cs
  100. 1
      framework/src/Volo.Abp.RemoteServices/Volo.Abp.RemoteServices.csproj

3
Directory.Packages.props

@ -11,6 +11,7 @@
<PackageVersion Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" /> <PackageVersion Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />
<PackageVersion Include="Autofac.Extras.DynamicProxy" Version="7.1.0" /> <PackageVersion Include="Autofac.Extras.DynamicProxy" Version="7.1.0" />
<PackageVersion Include="AutoMapper" Version="12.0.1" /> <PackageVersion Include="AutoMapper" Version="12.0.1" />
<PackageVersion Include="Asp.Versioning.Mvc" Version="7.1.0" />
<PackageVersion Include="AWSSDK.S3" Version="3.7.300.2" /> <PackageVersion Include="AWSSDK.S3" Version="3.7.300.2" />
<PackageVersion Include="AWSSDK.SecurityToken" Version="3.7.300.2" /> <PackageVersion Include="AWSSDK.SecurityToken" Version="3.7.300.2" />
<PackageVersion Include="Azure.Messaging.ServiceBus" Version="7.17.0" /> <PackageVersion Include="Azure.Messaging.ServiceBus" Version="7.17.0" />
@ -29,6 +30,7 @@
<PackageVersion Include="Devart.Data.Oracle.EFCore" Version="10.1.151.7" /> <PackageVersion Include="Devart.Data.Oracle.EFCore" Version="10.1.151.7" />
<PackageVersion Include="DistributedLock.Core" Version="1.0.5" /> <PackageVersion Include="DistributedLock.Core" Version="1.0.5" />
<PackageVersion Include="DistributedLock.Redis" Version="1.0.2" /> <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="EphemeralMongo.Core" Version="1.1.3" />
<PackageVersion Include="EphemeralMongo6.runtime.linux-x64" Version="1.1.3" /> <PackageVersion Include="EphemeralMongo6.runtime.linux-x64" Version="1.1.3" />
<PackageVersion Include="EphemeralMongo6.runtime.osx-x64" Version="1.1.3" /> <PackageVersion Include="EphemeralMongo6.runtime.osx-x64" Version="1.1.3" />
@ -60,7 +62,6 @@
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.0" /> <PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="8.0.0" /> <PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="8.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.0" /> <PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.1.0" />
<PackageVersion Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.25" /> <PackageVersion Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.25" />
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="8.0.0" /> <PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="8.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.WebUtilities" Version="8.0.0" /> <PackageVersion Include="Microsoft.AspNetCore.WebUtilities" Version="8.0.0" />

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

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

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

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

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

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

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

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

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

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

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

@ -792,6 +792,8 @@
"TermsConditionsPageTitle": "الأحكام والشروط", "TermsConditionsPageTitle": "الأحكام والشروط",
"TrainingsPageTitle": "حزم تدريب ABP", "TrainingsPageTitle": "حزم تدريب ABP",
"ModulesPageTitle": "وحدات تطبيق ABP سابقة البناء", "ModulesPageTitle": "وحدات تطبيق ABP سابقة البناء",
"MultipleOrganizationInfo": "شاهد جميع مؤسساتك" "MultipleOrganizationInfo": "شاهد جميع مؤسساتك",
"PaymentFailedInfo": "عذرا، فشل الدفع! ",
"UsedPayment": "لقد تم استخدام هذه الدفعة بالفعل"
} }
} }

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

@ -406,6 +406,8 @@
"WhatHappensWhenLicenseEndsExplanation7": "Pokud chcete i nadále využívat tyto výhody, můžete svou licenci prodloužit (obnovit). Pokud prodloužíte licenci do <strong>{3} dní</strong> po vypršení platnosti licence, budou uplatněny následující slevy: Týmová licence {0}; Obchodní licence {1}; Enterprise Licence {2}.", "WhatHappensWhenLicenseEndsExplanation7": "Pokud chcete i nadále využívat tyto výhody, můžete svou licenci prodloužit (obnovit). Pokud prodloužíte licenci do <strong>{3} dní</strong> po vypršení platnosti licence, budou uplatněny následující slevy: Týmová licence {0}; Obchodní licence {1}; Enterprise Licence {2}.",
"BlazoriseLicense": "Musíme si koupit licenci Blazorise?", "BlazoriseLicense": "Musíme si koupit licenci Blazorise?",
"BlazoriseLicenseExplanation": "Máme dohodu mezi společnostmi Volosoft a Megabit, na základě této dohody je licence Blazorise přibalena k produktům ABP Commercial, proto si naši zákazníci nemusí kupovat další licenci Blazorise.", "BlazoriseLicenseExplanation": "Máme dohodu mezi společnostmi Volosoft a Megabit, na základě této dohody je licence Blazorise přibalena k produktům ABP Commercial, proto si naši zákazníci nemusí kupovat další licenci Blazorise.",
"MultipleOrganizationInfo": "Podívejte se na všechny vaše organizace" "MultipleOrganizationInfo": "Podívejte se na všechny vaše organizace",
"PaymentFailedInfo": "Omlouváme se, platba se nezdařila! ",
"UsedPayment": "Tato platba již byla použita"
} }
} }

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

@ -387,6 +387,8 @@
"RenewLicenseEarly": "Erhalte ich das ganze Jahr, wenn ich meine Lizenz vorzeitig erneuere?", "RenewLicenseEarly": "Erhalte ich das ganze Jahr, wenn ich meine Lizenz vorzeitig erneuere?",
"RenewLicenseEarylExplanation": "Wenn Sie Ihre Lizenz vor dem Ablaufdatum Ihrer Lizenz erneuern, wird Ihr Lizenzablaufdatum um 1 Jahr verlängert. Wenn Ihre Lizenz beispielsweise am {0}-06-06 abläuft und Sie sie am {0}-01-01 erneuern, ist das neue Ablaufdatum der Lizenz der {1}-06-06.", "RenewLicenseEarylExplanation": "Wenn Sie Ihre Lizenz vor dem Ablaufdatum Ihrer Lizenz erneuern, wird Ihr Lizenzablaufdatum um 1 Jahr verlängert. Wenn Ihre Lizenz beispielsweise am {0}-06-06 abläuft und Sie sie am {0}-01-01 erneuern, ist das neue Ablaufdatum der Lizenz der {1}-06-06.",
"BlackFridayDiscount": "Black Friday Rabatt", "BlackFridayDiscount": "Black Friday Rabatt",
"MultipleOrganizationInfo": "Alle Ihre Organisationen anzeigen" "MultipleOrganizationInfo": "Alle Ihre Organisationen anzeigen",
"PaymentFailedInfo": "Entschuldigung, die Zahlung ist fehlgeschlagen! ",
"UsedPayment": "Diese Zahlung wurde bereits verwendet"
} }
} }

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

@ -111,6 +111,8 @@
"RenewLicenseEarylExplanation": "When you renew your license before your license expiry date, 1 year will be added to your license expiry date. For example, if your license expires on {0}-06-06 and you renew it on {0}-01-01, your new license expiry date will be {1}-06-06.", "RenewLicenseEarylExplanation": "When you renew your license before your license expiry date, 1 year will be added to your license expiry date. For example, if your license expires on {0}-06-06 and you renew it on {0}-01-01, your new license expiry date will be {1}-06-06.",
"LicenseTypeNotCorrect": "The license type is not correct!", "LicenseTypeNotCorrect": "The license type is not correct!",
"BlackFridayDiscount": "Black Friday Discount", "BlackFridayDiscount": "Black Friday Discount",
"MultipleOrganizationInfo": "See All Your Organizations" "MultipleOrganizationInfo": "See All Your Organizations",
"PaymentFailedInfo": "Sorry, payment failed! This could be due to insufficient funds, invalid credit card numbers or invalid pin",
"UsedPayment": "This payment has been already used"
} }
} }

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

@ -50,7 +50,7 @@
"AbpCommercialShortDescription": "ABP Commercial provides pre-built application modules, rapid application development tooling, professional UI themes, premium support and more.", "AbpCommercialShortDescription": "ABP Commercial provides pre-built application modules, rapid application development tooling, professional UI themes, premium support and more.",
"LiveDemo": "Live Demo", "LiveDemo": "Live Demo",
"LiveDemoLead": "<a href=\"{0}\">{1}</a> using your ABP account, <a href=\"{2}\">{3}</a> to abp.io <br/> or fill the form below to create a live demo now", "LiveDemoLead": "<a href=\"{0}\">{1}</a> using your ABP account, <a href=\"{2}\">{3}</a> to abp.io <br/> or fill the form below to create a live demo now",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "There is already an account with the given email address: <b>{0}</b><br/> You can login with your account to proceed.", "ThereIsAlreadyAnAccountWithTheGivenEmailAddress": "There is already an account with the given email address: <b>{0}</b><br/> You should login with your account to proceed.",
"GetLicence": "Get a License", "GetLicence": "Get a License",
"Application": "Application", "Application": "Application",
"StartupTemplates": "Startup Templates", "StartupTemplates": "Startup Templates",
@ -1089,6 +1089,8 @@
"MultipleOrganizationInfo": "See All Your Organizations", "MultipleOrganizationInfo": "See All Your Organizations",
"AbpStudioBetaAccessInfoTitle": "ABP Studio Beta Access", "AbpStudioBetaAccessInfoTitle": "ABP Studio Beta Access",
"AbpStudioBetaAccessInfoText": "We're thrilled to share with you the <span class=\"text-highlight-white\">beta</span> version of <span class=\"text-highlight-white\">ABP Studio</span>! This release marks a significant milestone in our development journey, and we're eager to gather your feedback to make the application even better.", "AbpStudioBetaAccessInfoText": "We're thrilled to share with you the <span class=\"text-highlight-white\">beta</span> version of <span class=\"text-highlight-white\">ABP Studio</span>! This release marks a significant milestone in our development journey, and we're eager to gather your feedback to make the application even better.",
"YouAreNotAuthorizedToDownloadStudio": "You are not authorized to download ABP Studio." "YouAreNotAuthorizedToDownloadStudio": "You are not authorized to download ABP Studio.",
"PaymentFailedInfo": "Sorry, payment failed! This could be due to insufficient funds, invalid credit card numbers or invalid pin",
"UsedPayment": "This payment has been already used"
} }
} }

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

@ -387,6 +387,8 @@
"RenewLicenseEarly": "Si renuevo mi licencia antes, ¿obtendré el año completo?", "RenewLicenseEarly": "Si renuevo mi licencia antes, ¿obtendré el año completo?",
"RenewLicenseEarylExplanation": "Cuando renueve su licencia antes de la fecha de vencimiento de su licencia, se agregará 1 año a la fecha de vencimiento de su licencia. Por ejemplo, si su licencia vence el {0} -06-06 y la renueva el {0} -01-01, la fecha de vencimiento de su nueva licencia será {1} -06-06.", "RenewLicenseEarylExplanation": "Cuando renueve su licencia antes de la fecha de vencimiento de su licencia, se agregará 1 año a la fecha de vencimiento de su licencia. Por ejemplo, si su licencia vence el {0} -06-06 y la renueva el {0} -01-01, la fecha de vencimiento de su nueva licencia será {1} -06-06.",
"BlackFridayDiscount": "Descuento de viernes negro", "BlackFridayDiscount": "Descuento de viernes negro",
"MultipleOrganizationInfo": "Vea todas sus organizaciones" "MultipleOrganizationInfo": "Vea todas sus organizaciones",
"PaymentFailedInfo": "Lo sentimos, ¡el pago falló! ",
"UsedPayment": "Este pago ya ha sido utilizado."
} }
} }

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

@ -828,6 +828,8 @@
"SpringCampaignDiscount": "Kevään kampanja-alennus", "SpringCampaignDiscount": "Kevään kampanja-alennus",
"WhyUseAbpIoPlatform": "Miksi minun pitäisi käyttää ABP.IO-alustaa sen sijaan, että luon uuden ratkaisun tyhjästä?", "WhyUseAbpIoPlatform": "Miksi minun pitäisi käyttää ABP.IO-alustaa sen sijaan, että luon uuden ratkaisun tyhjästä?",
"WhyUseAbpIoPlatformFaqExplanation": "Katso <a href=\"https://docs.abp.io/en/commercial/latest/why-abp-io-platform \"> kyseisestä asiakirjasta </a> yksityiskohtainen selitys siitä, miksi ABP.IO Platformin käyttäminen on huomattavasti edullisempaa kuin kaiken tekeminen itse.", "WhyUseAbpIoPlatformFaqExplanation": "Katso <a href=\"https://docs.abp.io/en/commercial/latest/why-abp-io-platform \"> kyseisestä asiakirjasta </a> yksityiskohtainen selitys siitä, miksi ABP.IO Platformin käyttäminen on huomattavasti edullisempaa kuin kaiken tekeminen itse.",
"MultipleOrganizationInfo": "Katso kaikki organisaatiosi" "MultipleOrganizationInfo": "Katso kaikki organisaatiosi",
"PaymentFailedInfo": "Anteeksi, maksu epäonnistui! ",
"UsedPayment": "Tämä maksu on jo käytetty"
} }
} }

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

@ -406,6 +406,8 @@
"WhatHappensWhenLicenseEndsExplanation7": "Vous pouvez prolonger (renouveler) votre licence si vous souhaitez continuer à bénéficier de ces avantages. Si vous prolongez votre licence dans <strong>{3} jours</strong> après l'expiration de votre licence, les remises suivantes seront appliquées : Licence d'équipe {0} ; Licence commerciale {1} ; Licence Entreprise {2}.", "WhatHappensWhenLicenseEndsExplanation7": "Vous pouvez prolonger (renouveler) votre licence si vous souhaitez continuer à bénéficier de ces avantages. Si vous prolongez votre licence dans <strong>{3} jours</strong> après l'expiration de votre licence, les remises suivantes seront appliquées : Licence d'équipe {0} ; Licence commerciale {1} ; Licence Entreprise {2}.",
"BlazoriseLicense": "Faut-il acheter une licence Blazorise ?", "BlazoriseLicense": "Faut-il acheter une licence Blazorise ?",
"BlazoriseLicenseExplanation": "Nous avons conclu un accord entre Volosoft et Megabit, dans le cadre duquel la licence Blazorise est intégrée aux produits ABP Commercial, de sorte que nos clients n'ont pas besoin d'acheter une licence Blazorise supplémentaire.", "BlazoriseLicenseExplanation": "Nous avons conclu un accord entre Volosoft et Megabit, dans le cadre duquel la licence Blazorise est intégrée aux produits ABP Commercial, de sorte que nos clients n'ont pas besoin d'acheter une licence Blazorise supplémentaire.",
"MultipleOrganizationInfo": "Voir toutes vos organisations" "MultipleOrganizationInfo": "Voir toutes vos organisations",
"PaymentFailedInfo": "Désolé, le paiement a échoué! ",
"UsedPayment": "Ce paiement a déjà été utilisé"
} }
} }

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

@ -405,6 +405,8 @@
"WhatHappensWhenLicenseEndsExplanation7": "यदि आप इन लाभों को प्राप्त करना जारी रखना चाहते हैं तो आप अपने लाइसेंस का विस्तार (नवीनीकरण) कर सकते हैं। यदि आप अपना लाइसेंस समाप्त होने के बाद <strong>{3} दिन</strong> के भीतर अपना लाइसेंस बढ़ाते हैं, तो निम्नलिखित छूट लागू होंगी: टीम लाइसेंस {0}; व्यवसाय लाइसेंस {1}; उद्यम लाइसेंस {2}।", "WhatHappensWhenLicenseEndsExplanation7": "यदि आप इन लाभों को प्राप्त करना जारी रखना चाहते हैं तो आप अपने लाइसेंस का विस्तार (नवीनीकरण) कर सकते हैं। यदि आप अपना लाइसेंस समाप्त होने के बाद <strong>{3} दिन</strong> के भीतर अपना लाइसेंस बढ़ाते हैं, तो निम्नलिखित छूट लागू होंगी: टीम लाइसेंस {0}; व्यवसाय लाइसेंस {1}; उद्यम लाइसेंस {2}।",
"BlazoriseLicense": "क्या हमें ब्लेज़ोराइज़ लाइसेंस खरीदने की ज़रूरत है?", "BlazoriseLicense": "क्या हमें ब्लेज़ोराइज़ लाइसेंस खरीदने की ज़रूरत है?",
"BlazoriseLicenseExplanation": "हमारे पास Volosoft और Megabit के बीच एक समझौता है, इस समझौते के साथ Blazorise लाइसेंस को ABP वाणिज्यिक उत्पादों के साथ बंडल किया गया है, इसलिए हमारे ग्राहकों को एक अतिरिक्त Blazorise लाइसेंस खरीदने की आवश्यकता नहीं है।", "BlazoriseLicenseExplanation": "हमारे पास Volosoft और Megabit के बीच एक समझौता है, इस समझौते के साथ Blazorise लाइसेंस को ABP वाणिज्यिक उत्पादों के साथ बंडल किया गया है, इसलिए हमारे ग्राहकों को एक अतिरिक्त Blazorise लाइसेंस खरीदने की आवश्यकता नहीं है।",
"MultipleOrganizationInfo": "अपने सभी संगठन देखें" "MultipleOrganizationInfo": "अपने सभी संगठन देखें",
"PaymentFailedInfo": "क्षमा करें, भुगतान विफल रहा! ",
"UsedPayment": "इस भुगतान का उपयोग पहले ही किया जा चुका है"
} }
} }

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

@ -1084,6 +1084,8 @@
"MultipleYearDiscount": "Višegodišnji popust", "MultipleYearDiscount": "Višegodišnji popust",
"CampaignDiscountText": "Crni petak popust", "CampaignDiscountText": "Crni petak popust",
"CampaignDiscountName": "Crni petak", "CampaignDiscountName": "Crni petak",
"CampaignName:BlackFriday": "Crni petak" "CampaignName:BlackFriday": "Crni petak",
"PaymentFailedInfo": "Nažalost, plaćanje nije uspjelo! ",
"UsedPayment": "Ovo plaćanje je već iskorišteno"
} }
} }

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

@ -754,6 +754,8 @@
"ExtendPaymentInfoSection_DiscountRate": "Kedvezmény: {0}%", "ExtendPaymentInfoSection_DiscountRate": "Kedvezmény: {0}%",
"TotalNetPrice": "Total Net Price", "TotalNetPrice": "Total Net Price",
"BlackFridayDiscount": "Black Friday Kedvezmény", "BlackFridayDiscount": "Black Friday Kedvezmény",
"MultipleOrganizationInfo": "Tekintse meg az összes szervezetét" "MultipleOrganizationInfo": "Tekintse meg az összes szervezetét",
"PaymentFailedInfo": "Sajnos a fizetés sikertelen! ",
"UsedPayment": "Ezt a fizetést már felhasználták"
} }
} }

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

@ -384,6 +384,8 @@
"TrialLicenseExpiredInfo": "Prófunartímabil þitt er útrunnið!", "TrialLicenseExpiredInfo": "Prófunartímabil þitt er útrunnið!",
"CommercialNewsletterConfirmationMessage": "Ég samþykki <a href=\"https://commercial.abp.io/TermsConditions\">skilmálana</a> og <a href=\"https://commercial.abp.io/Privacy\">persónuverndarstefnuna </a>.", "CommercialNewsletterConfirmationMessage": "Ég samþykki <a href=\"https://commercial.abp.io/TermsConditions\">skilmálana</a> og <a href=\"https://commercial.abp.io/Privacy\">persónuverndarstefnuna </a>.",
"BlackFridayDiscount": "Black Friday afsláttur", "BlackFridayDiscount": "Black Friday afsláttur",
"MultipleOrganizationInfo": "Sjá öll samtök þín" "MultipleOrganizationInfo": "Sjá öll samtök þín",
"PaymentFailedInfo": "Því miður, greiðsla mistókst! ",
"UsedPayment": "Þessi greiðsla hefur þegar verið notuð"
} }
} }

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

@ -405,6 +405,8 @@
"WhatHappensWhenLicenseEndsExplanation7": "Puoi estendere (rinnovare) la tua licenza se desideri continuare a ottenere questi vantaggi. Se estendi la licenza entro <strong>{3} giorni</strong> dalla scadenza della licenza, verranno applicati i seguenti sconti: Licenza Team {0}; Licenza commerciale {1}; Licenza aziendale {2}.", "WhatHappensWhenLicenseEndsExplanation7": "Puoi estendere (rinnovare) la tua licenza se desideri continuare a ottenere questi vantaggi. Se estendi la licenza entro <strong>{3} giorni</strong> dalla scadenza della licenza, verranno applicati i seguenti sconti: Licenza Team {0}; Licenza commerciale {1}; Licenza aziendale {2}.",
"BlazoriseLicense": "Dobbiamo acquistare la licenza di Blazorise?", "BlazoriseLicense": "Dobbiamo acquistare la licenza di Blazorise?",
"BlazoriseLicenseExplanation": "Abbiamo un accordo tra Volosoft e Megabit, con il quale la licenza di Blazorise viene fornita in bundle con i prodotti commerciali ABP, pertanto i nostri clienti non hanno bisogno di acquistare una licenza Blazorise aggiuntiva.", "BlazoriseLicenseExplanation": "Abbiamo un accordo tra Volosoft e Megabit, con il quale la licenza di Blazorise viene fornita in bundle con i prodotti commerciali ABP, pertanto i nostri clienti non hanno bisogno di acquistare una licenza Blazorise aggiuntiva.",
"MultipleOrganizationInfo": "Visualizza tutte le tue organizzazioni" "MultipleOrganizationInfo": "Visualizza tutte le tue organizzazioni",
"PaymentFailedInfo": "Siamo spiacenti, pagamento non riuscito! ",
"UsedPayment": "Questo pagamento è già stato utilizzato"
} }
} }

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

@ -384,6 +384,8 @@
"TrialLicenseExpiredInfo": "Uw proeflicentieperiode is verlopen!", "TrialLicenseExpiredInfo": "Uw proeflicentieperiode is verlopen!",
"CommercialNewsletterConfirmationMessage": "Ik ga akkoord met de <a href=\"https://commercial.abp.io/TermsConditions\">Algemene voorwaarden</a> en het <a href=\"https://commercial.abp.io/Privacy\">Privacybeleid </a>.", "CommercialNewsletterConfirmationMessage": "Ik ga akkoord met de <a href=\"https://commercial.abp.io/TermsConditions\">Algemene voorwaarden</a> en het <a href=\"https://commercial.abp.io/Privacy\">Privacybeleid </a>.",
"BlackFridayDiscount": "Black Friday korting", "BlackFridayDiscount": "Black Friday korting",
"MultipleOrganizationInfo": "Bekijk al uw organisaties" "MultipleOrganizationInfo": "Bekijk al uw organisaties",
"PaymentFailedInfo": "Excuses, betaling mislukt! ",
"UsedPayment": "Deze betaling is al gebruikt"
} }
} }

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

@ -384,6 +384,8 @@
"TrialLicenseExpiredInfo": "Twoja licencja próbna wygasła!", "TrialLicenseExpiredInfo": "Twoja licencja próbna wygasła!",
"CommercialNewsletterConfirmationMessage": "Wyrażam zgodę na <a href=\"https://commercial.abp.io/TermsConditions\">Warunki</a> i <a href=\"https://commercial.abp.io/Privacy\">Politykę prywatności </a>.", "CommercialNewsletterConfirmationMessage": "Wyrażam zgodę na <a href=\"https://commercial.abp.io/TermsConditions\">Warunki</a> i <a href=\"https://commercial.abp.io/Privacy\">Politykę prywatności </a>.",
"BlackFridayDiscount": "Zniżka Black Friday", "BlackFridayDiscount": "Zniżka Black Friday",
"MultipleOrganizationInfo": "Zobacz wszystkie swoje organizacje" "MultipleOrganizationInfo": "Zobacz wszystkie swoje organizacje",
"PaymentFailedInfo": "Przepraszamy, płatność nie powiodła się! ",
"UsedPayment": "Ta płatność została już wykorzystana"
} }
} }

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

@ -407,6 +407,8 @@
"WhatHappensWhenLicenseEndsExplanation5": "Você não pode usar o ABP Suite", "WhatHappensWhenLicenseEndsExplanation5": "Você não pode usar o ABP Suite",
"WhatHappensWhenLicenseEndsExplanation6": "Você não pode mais obter o <a href==\"{0}\">apoio de premium</a>.", "WhatHappensWhenLicenseEndsExplanation6": "Você não pode mais obter o <a href==\"{0}\">apoio de premium</a>.",
"WhatHappensWhenLicenseEndsExplanation7": "Você pode estender (renovar) sua licença se quiser continuar obtendo esses benefícios. Se você estender sua licença dentro de <strong>{3} dias</strong> após a expiração de sua licença, os seguintes descontos serão aplicados: Licença de equipe {0}; Licença Comercial {1}; Licença empresarial {2}.", "WhatHappensWhenLicenseEndsExplanation7": "Você pode estender (renovar) sua licença se quiser continuar obtendo esses benefícios. Se você estender sua licença dentro de <strong>{3} dias</strong> após a expiração de sua licença, os seguintes descontos serão aplicados: Licença de equipe {0}; Licença Comercial {1}; Licença empresarial {2}.",
"MultipleOrganizationInfo": "Veja todas as suas organizações" "MultipleOrganizationInfo": "Veja todas as suas organizações",
"PaymentFailedInfo": "Desculpe, o pagamento falhou! ",
"UsedPayment": "Este pagamento já foi usado"
} }
} }

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

@ -384,6 +384,8 @@
"TrialLicenseExpiredInfo": "Perioada de licență de probă a expirat!", "TrialLicenseExpiredInfo": "Perioada de licență de probă a expirat!",
"CommercialNewsletterConfirmationMessage": "Sunt de acord cu <a href=\"https://commercial.abp.io/TermsConditions\">Termenii și condițiile</a> și cu <a href=\"https://commercial.abp.io/Privacy\">Politica de confidențialitate </a>.", "CommercialNewsletterConfirmationMessage": "Sunt de acord cu <a href=\"https://commercial.abp.io/TermsConditions\">Termenii și condițiile</a> și cu <a href=\"https://commercial.abp.io/Privacy\">Politica de confidențialitate </a>.",
"BlackFridayDiscount": "Black Friday Discount", "BlackFridayDiscount": "Black Friday Discount",
"MultipleOrganizationInfo": "Vedeți toate organizațiile dvs" "MultipleOrganizationInfo": "Vedeți toate organizațiile dvs",
"PaymentFailedInfo": "Ne pare rău, plata nu a reușit! ",
"UsedPayment": "Această plată a fost deja utilizată"
} }
} }

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

@ -1085,6 +1085,8 @@
"CampaignDiscountText": "Скидка на Черную пятницу", "CampaignDiscountText": "Скидка на Черную пятницу",
"CampaignDiscountName": "Черная пятница", "CampaignDiscountName": "Черная пятница",
"CampaignName:BlackFriday": "Черная пятница", "CampaignName:BlackFriday": "Черная пятница",
"MultipleOrganizationInfo": "Просмотреть все ваши организации" "MultipleOrganizationInfo": "Просмотреть все ваши организации",
"PaymentFailedInfo": "Извините, оплата не удалась! ",
"UsedPayment": "Этот платеж уже использован"
} }
} }

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

@ -403,6 +403,8 @@
"WhatHappensWhenLicenseEndsExplanation7": "Ak chcete naďalej využívať tieto výhody, môžete si licenciu predĺžiť (obnoviť). Ak predĺžite svoju licenciu do <strong>30 dní</strong> po vypršaní platnosti licencie, budú sa uplatňovať nasledujúce zľavy: Tímová licencia {0}; Obchodná licencia {1}; Podniková licencia {2}", "WhatHappensWhenLicenseEndsExplanation7": "Ak chcete naďalej využívať tieto výhody, môžete si licenciu predĺžiť (obnoviť). Ak predĺžite svoju licenciu do <strong>30 dní</strong> po vypršaní platnosti licencie, budú sa uplatňovať nasledujúce zľavy: Tímová licencia {0}; Obchodná licencia {1}; Podniková licencia {2}",
"BlazoriseLicense": "Musíme si kúpiť licenciu Blazorise?", "BlazoriseLicense": "Musíme si kúpiť licenciu Blazorise?",
"BlazoriseLicenseExplanation": "Máme dohodu medzi spoločnosťami Volosoft a Megabit, na základe ktorej je licencia Blazorise pribalená k produktom ABP Commercial, preto si naši zákazníci nemusia kupovať ďalšiu licenciu Blazorise.", "BlazoriseLicenseExplanation": "Máme dohodu medzi spoločnosťami Volosoft a Megabit, na základe ktorej je licencia Blazorise pribalená k produktom ABP Commercial, preto si naši zákazníci nemusia kupovať ďalšiu licenciu Blazorise.",
"MultipleOrganizationInfo": "Pozrite si všetky vaše organizácie" "MultipleOrganizationInfo": "Pozrite si všetky vaše organizácie",
"PaymentFailedInfo": "Ľutujeme, platba zlyhala! ",
"UsedPayment": "Táto platba už bola použitá"
} }
} }

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

@ -384,6 +384,8 @@
"TrialLicenseExpiredInfo": "Vaša preizkusna licenca je potekla!", "TrialLicenseExpiredInfo": "Vaša preizkusna licenca je potekla!",
"CommercialNewsletterConfirmationMessage": "Strinjam se s <a href=\"https://commercial.abp.io/TermsConditions\">pogoji in določili</a> in <a href=\"https://commercial.abp.io/Privacy\">pravilnikom o zasebnosti </a>.", "CommercialNewsletterConfirmationMessage": "Strinjam se s <a href=\"https://commercial.abp.io/TermsConditions\">pogoji in določili</a> in <a href=\"https://commercial.abp.io/Privacy\">pravilnikom o zasebnosti </a>.",
"BlackFridayDiscount": "Popust Black Friday", "BlackFridayDiscount": "Popust Black Friday",
"MultipleOrganizationInfo": "Oglejte si vse svoje organizacije" "MultipleOrganizationInfo": "Oglejte si vse svoje organizacije",
"PaymentFailedInfo": "Žal plačilo ni uspelo! ",
"UsedPayment": "To plačilo je že bilo uporabljeno"
} }
} }

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

@ -843,6 +843,8 @@
"ComesWithTheSourceCode": "Kaynak Koduyla Birlikte Geliyor", "ComesWithTheSourceCode": "Kaynak Koduyla Birlikte Geliyor",
"ComesWithTheSourceCode_Description": "Mobil uygulamalar kaynak koduyla birlikte sağlanır. Marka yönergelerini karşılamak için uygulamalarınızın UX/UI'sini kolayca özelleştirin.", "ComesWithTheSourceCode_Description": "Mobil uygulamalar kaynak koduyla birlikte sağlanır. Marka yönergelerini karşılamak için uygulamalarınızın UX/UI'sini kolayca özelleştirin.",
"MultipleOrganizationInfo": "Tüm Organizasyonlarınızı Görün", "MultipleOrganizationInfo": "Tüm Organizasyonlarınızı Görün",
"PaymentFailedInfo": "Üzgünüz, Ödeme başarısız oldu! Bu hata, yatersiz bakiye, yanlış kredi kartı numarası veya yanlış PIN numarasından dolayı olabilir.",
"UsedPayment": "Bu ödeme zaten kullanımda.",
"TestimonialText": "Referans Yazınız", "TestimonialText": "Referans Yazınız",
"Position": "Poziyonunuz", "Position": "Poziyonunuz",
"ExperienceYear": "Yazılım Sektöründeki Tecrübeniz (Yıl)", "ExperienceYear": "Yazılım Sektöründeki Tecrübeniz (Yıl)",

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

@ -384,6 +384,8 @@
"TrialLicenseExpiredInfo": "Thời gian cấp phép dùng thử của bạn đã hết hạn!", "TrialLicenseExpiredInfo": "Thời gian cấp phép dùng thử của bạn đã hết hạn!",
"CommercialNewsletterConfirmationMessage": "Tôi đồng ý với <a href=\"https://commercial.abp.io/TermsConditions\"> Điều khoản & điều kiện </a> và <a href=\"https://commercial.abp.io/Privacy\"> Chính sách quyền riêng tư </a>.", "CommercialNewsletterConfirmationMessage": "Tôi đồng ý với <a href=\"https://commercial.abp.io/TermsConditions\"> Điều khoản & điều kiện </a> và <a href=\"https://commercial.abp.io/Privacy\"> Chính sách quyền riêng tư </a>.",
"BlackFridayDiscount": "Giảm giá Black Friday", "BlackFridayDiscount": "Giảm giá Black Friday",
"MultipleOrganizationInfo": "Xem tất cả các tổ chức của bạn" "MultipleOrganizationInfo": "Xem tất cả các tổ chức của bạn",
"PaymentFailedInfo": "Rất tiếc, thanh toán không thành công! ",
"UsedPayment": "Khoản thanh toán này đã được sử dụng"
} }
} }

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

File diff suppressed because it is too large

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

@ -352,7 +352,7 @@
"VolosoftMarketingInformationMessage": "我想要有關企業和組織解決方案以及其他 Volosoft 產品和服務的信息、提示和優惠。", "VolosoftMarketingInformationMessage": "我想要有關企業和組織解決方案以及其他 Volosoft 產品和服務的信息、提示和優惠。",
"VolosoftSharingInformationMessage": "我希望 Volosoft 與選定的合作夥伴共享我的信息,以便我可以收到有關他們的產品和服務的相關信息。", "VolosoftSharingInformationMessage": "我希望 Volosoft 與選定的合作夥伴共享我的信息,以便我可以收到有關他們的產品和服務的相關信息。",
"WeWillSendYouADownloadLink": "下載電子書的鏈接已發送至 {0}。<br/>檢查您的收件箱/垃圾箱/垃圾箱!", "WeWillSendYouADownloadLink": "下載電子書的鏈接已發送至 {0}。<br/>檢查您的收件箱/垃圾箱/垃圾箱!",
"InvalidFormInputs": "請輸入表中指定的有效信息。", "InvalidFormInputs": "請輸入表中指定的有效信息。",
"DDDBookEmailBody": "謝謝你。 <br />要下載您的圖書,請<a href=\"{0}\">點擊此處</a>。", "DDDBookEmailBody": "謝謝你。 <br />要下載您的圖書,請<a href=\"{0}\">點擊此處</a>。",
"FreeDDDEBook": "免費 DDD 電子書", "FreeDDDEBook": "免費 DDD 電子書",
"StartFree": "免費開始", "StartFree": "免費開始",
@ -399,6 +399,674 @@
"LicenseTransferExplanation": "是的!購買許可證後,您將成為許可證持有者,因此您可以訪問組織管理頁面。組織具有所有者和開發者角色。所有者可以管理開發者席位並分配開發者。每個指定的開發人員將通過 ABP CLI 命令登錄到系統,並將擁有開發和支持權限。", "LicenseTransferExplanation": "是的!購買許可證後,您將成為許可證持有者,因此您可以訪問組織管理頁面。組織具有所有者和開發者角色。所有者可以管理開發者席位並分配開發者。每個指定的開發人員將通過 ABP CLI 命令登錄到系統,並將擁有開發和支持權限。",
"RenewLicenseEarly": "如果我提前更新我的駕照,我會得到一整年嗎?", "RenewLicenseEarly": "如果我提前更新我的駕照,我會得到一整年嗎?",
"RenewLicenseEarylExplanation": "當您在許可證到期日期之前續訂許可證時,您的許可證到期日期將增加 1 年。例如,如果您的許可證在 {0}-06-06 到期,而您在 {0}-01-01 續簽,則新的許可證到期日期將為 {1}-06-06。", "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": "當我的許可期限結束時會發生什麼?", "WhatHappensWhenLicenseEnds": "當我的許可期限結束時會發生什麼?",
"WhatHappensWhenLicenseEndsExplanation1": "ABP 商業許可是<a href=\"{0}\" target=\"_blank\">永久許可</a>。許可證到期後,您可以繼續開發您的項目。而且您沒有義務更新您的許可證。您的許可證附帶開箱即用的一年更新和支持計劃。為了繼續獲得新功能、性能增強、錯誤修復、支持和繼續使用 ABP Suite,您需要更新您的許可證。當您的許可證到期時;", "WhatHappensWhenLicenseEndsExplanation1": "ABP 商業許可是<a href=\"{0}\" target=\"_blank\">永久許可</a>。許可證到期後,您可以繼續開發您的項目。而且您沒有義務更新您的許可證。您的許可證附帶開箱即用的一年更新和支持計劃。為了繼續獲得新功能、性能增強、錯誤修復、支持和繼續使用 ABP Suite,您需要更新您的許可證。當您的許可證到期時;",
"WhatHappensWhenLicenseEndsExplanation2": "您無法使用 ABP Commercial 創建新的解決方案,但您可以永遠繼續開發現有的應用程序。", "WhatHappensWhenLicenseEndsExplanation2": "您無法使用 ABP Commercial 創建新的解決方案,但您可以永遠繼續開發現有的應用程序。",
@ -407,8 +1075,8 @@
"WhatHappensWhenLicenseEndsExplanation5": "您不能使用 ABP 套件。", "WhatHappensWhenLicenseEndsExplanation5": "您不能使用 ABP 套件。",
"WhatHappensWhenLicenseEndsExplanation6": "您無法再獲得<a href=\"{0}\">高級支持</a>。", "WhatHappensWhenLicenseEndsExplanation6": "您無法再獲得<a href=\"{0}\">高級支持</a>。",
"WhatHappensWhenLicenseEndsExplanation7": "如果您想繼續獲得這些好處,您可以延長(更新)您的許可證。如果您在許可到期後 <strong>{3} 天</strong> 內延長許可,將應用以下折扣:團隊許可 {0};營業執照{1};企業許可證{2}。", "WhatHappensWhenLicenseEndsExplanation7": "如果您想繼續獲得這些好處,您可以延長(更新)您的許可證。如果您在許可到期後 <strong>{3} 天</strong> 內延長許可,將應用以下折扣:團隊許可 {0};營業執照{1};企業許可證{2}。",
"DoesTheSubscriptionRenewAutomatically": "許可會自動續費嗎?", "MultipleOrganizationInfo": "查看您的所有組織",
"DoesTheSubscriptionRenewAutomaticallyExplanation": "ABP 商業版沒有自動續費的計費模式。因此,在您的許可期結束時,<strong>您的訂閱將不會自動續訂</strong>。如果您希望繼續享受ABP商業版的服務,請在<a href=\"/my-organizations\">組織管理頁面</a>手動進行續費操作。如果您擁有多個組織,您可以點擊即將到期的組織上的\"管理\"按鈕,然後點擊\"立即續費\"按鈕來續訂您的許可。您還可以查看<a href=\"/faq#what-happens-when-license-ends\">許可到期後會發生什麼?</a>部分了解更多信息。", "PaymentFailedInfo": "抱歉,支付失败!",
"MultipleOrganizationInfo": "查看您的所有組織" "UsedPayment": "该付款已被使用"
} }
} }

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

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

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

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

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

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

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "أنت تركز على رمز عملك وتدع إطار العمل للتعامل مع عقود الإيجار المتعددة نيابة عنك.", "MultiTenancyExplanation4": "أنت تركز على رمز عملك وتدع إطار العمل للتعامل مع عقود الإيجار المتعددة نيابة عنك.",
"BootstrapTagHelpersExplanation": "بدلاً من كتابة التفاصيل المتكررة لمكونات التمهيد يدويًا، استخدم مساعدي علامات ABP لتبسيطها والاستفادة من IntelliSense. يمكنك بالتأكيد استخدام Bootstrap متى احتجت إليه.", "BootstrapTagHelpersExplanation": "بدلاً من كتابة التفاصيل المتكررة لمكونات التمهيد يدويًا، استخدم مساعدي علامات ABP لتبسيطها والاستفادة من IntelliSense. يمكنك بالتأكيد استخدام Bootstrap متى احتجت إليه.",
"DynamicFormsExplanation": "يمكن لمساعدي النموذج الديناميكي وعلامات الإدخال إنشاء النموذج الكامل من فئة C # كنموذج.", "DynamicFormsExplanation": "يمكن لمساعدي النموذج الديناميكي وعلامات الإدخال إنشاء النموذج الكامل من فئة C # كنموذج.",
"AuthenticationAuthorizationExplanation": "خيارات المصادقة والرخصة الغنية المدمجة في ASP.NET Core Identity & IdentityServer4. يوفر نظام إذن موسع ومفصل.", "AuthenticationAuthorizationExplanation": "خيارات المصادقة والرخصة الغنية المدمجة في ASP.NET Core Identity & OpenIddict. يوفر نظام إذن موسع ومفصل.",
"CrossCuttingConcernsExplanation": "لا تكرر نفسك لتنفيذ كل هذه الأشياء الشائعة مرارًا وتكرارًا. ركز على كود عملك ودع ABP يقوم بأتمتة ذلك من خلال الاتفاقيات.", "CrossCuttingConcernsExplanation": "لا تكرر نفسك لتنفيذ كل هذه الأشياء الشائعة مرارًا وتكرارًا. ركز على كود عملك ودع ABP يقوم بأتمتة ذلك من خلال الاتفاقيات.",
"DatabaseConnectionTransactionManagement": "اتصال قاعدة البيانات وإدارة المعاملات", "DatabaseConnectionTransactionManagement": "اتصال قاعدة البيانات وإدارة المعاملات",
"CorrelationIdTracking": "تتبع معرف الارتباط", "CorrelationIdTracking": "تتبع معرف الارتباط",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Soustředíte se na svůj obchodní kód a necháte framework, aby za vás zpracovával multi-tenancy.", "MultiTenancyExplanation4": "Soustředíte se na svůj obchodní kód a necháte framework, aby za vás zpracovával multi-tenancy.",
"BootstrapTagHelpersExplanation": "Místo ručního psaní opakujících se podrobností o komponentách bootstrapu použijte pomocníky značek ABP, abyste to zjednodušili a využili výhody intellisense. Bootstrap můžete určitě použít, kdykoli budete potřebovat.", "BootstrapTagHelpersExplanation": "Místo ručního psaní opakujících se podrobností o komponentách bootstrapu použijte pomocníky značek ABP, abyste to zjednodušili a využili výhody intellisense. Bootstrap můžete určitě použít, kdykoli budete potřebovat.",
"DynamicFormsExplanation": "Pomocníci dynamického formuláře a vstupní značky mohou vytvořit kompletní formulář z třídy C# jako model.", "DynamicFormsExplanation": "Pomocníci dynamického formuláře a vstupní značky mohou vytvořit kompletní formulář z třídy C# jako model.",
"AuthenticationAuthorizationExplanation": "Bohaté možnosti ověřování a autorizace integrované do ASP.NET Core Identity & IdentityServer4. Poskytuje rozšiřitelný a podrobný systém oprávnění.", "AuthenticationAuthorizationExplanation": "Bohaté možnosti ověřování a autorizace integrované do ASP.NET Core Identity & OpenIddict. Poskytuje rozšiřitelný a podrobný systém oprávnění.",
"CrossCuttingConcernsExplanation": "Neopakujte se, abyste zavedli všechny tyto běžné věci znovu a znovu. Zaměřte se na svůj obchodní kód a nechte je ABP automatizovat podle konvencí.", "CrossCuttingConcernsExplanation": "Neopakujte se, abyste zavedli všechny tyto běžné věci znovu a znovu. Zaměřte se na svůj obchodní kód a nechte je ABP automatizovat podle konvencí.",
"DatabaseConnectionTransactionManagement": "Připojení k databázi a správa transakcí", "DatabaseConnectionTransactionManagement": "Připojení k databázi a správa transakcí",
"CorrelationIdTracking": "Correlation-Id Tracking", "CorrelationIdTracking": "Correlation-Id Tracking",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Sie konzentrieren sich auf Ihren geschäftsspezifischen Code und lassen das Framework die Mandantenfähigkeit für Sie übernehmen.", "MultiTenancyExplanation4": "Sie konzentrieren sich auf Ihren geschäftsspezifischen Code und lassen das Framework die Mandantenfähigkeit für Sie übernehmen.",
"BootstrapTagHelpersExplanation": "Anstatt die sich wiederholenden Details von Bootstrap-Komponenten manuell zu schreiben, verwenden Sie die Tag-Helper von ABP, um diese zu vereinfachen und dabei die Vorteile von Intellisense zu nutzen. Sie können Bootstrap weitherhin verwenden, wann immer Sie es benötigen.", "BootstrapTagHelpersExplanation": "Anstatt die sich wiederholenden Details von Bootstrap-Komponenten manuell zu schreiben, verwenden Sie die Tag-Helper von ABP, um diese zu vereinfachen und dabei die Vorteile von Intellisense zu nutzen. Sie können Bootstrap weitherhin verwenden, wann immer Sie es benötigen.",
"DynamicFormsExplanation": "Helfer für dynamische Formular- und Input-Tags können das vollständige Formular anhand einer C#-Klasse als Model erstellen.", "DynamicFormsExplanation": "Helfer für dynamische Formular- und Input-Tags können das vollständige Formular anhand einer C#-Klasse als Model erstellen.",
"AuthenticationAuthorizationExplanation": "Umfangreiche Authentifizierungs- und Autorisierungsoptionen, die in ASP.NET Core Identity & IdentityServer4 integriert sind. Bietet ein erweiterbares und detailliertes Berechtigungssystem.", "AuthenticationAuthorizationExplanation": "Umfangreiche Authentifizierungs- und Autorisierungsoptionen, die in ASP.NET Core Identity & OpenIddict integriert sind. Bietet ein erweiterbares und detailliertes Berechtigungssystem.",
"CrossCuttingConcernsExplanation": "Wiederholen Sie sich nicht, um all diese allgemeinen Dinge immer wieder zu implementieren. Konzentrieren Sie sich auf Ihren geschäftsspezifischen Code und lassen Sie ihn von ABP durch Konventionen automatisieren.", "CrossCuttingConcernsExplanation": "Wiederholen Sie sich nicht, um all diese allgemeinen Dinge immer wieder zu implementieren. Konzentrieren Sie sich auf Ihren geschäftsspezifischen Code und lassen Sie ihn von ABP durch Konventionen automatisieren.",
"DatabaseConnectionTransactionManagement": "Datenbankverbindungs- und Transaktionsmanagement", "DatabaseConnectionTransactionManagement": "Datenbankverbindungs- und Transaktionsmanagement",
"CorrelationIdTracking": "Correlation-ID-Verfolgung", "CorrelationIdTracking": "Correlation-ID-Verfolgung",

2
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en-GB.json

@ -121,7 +121,7 @@
"MultiTenancyExplanation4": "You focus on your business code and let the framework to handle multi-tenancy on behalf of you.", "MultiTenancyExplanation4": "You focus on your business code and let the framework to handle multi-tenancy on behalf of you.",
"BootstrapTagHelpersExplanation": "Instead of manually writing the repeating details of bootstrap components, use ABP's tag helpers to simplify and take advantage of intellisense. You can use Bootstrap whenever you need it.", "BootstrapTagHelpersExplanation": "Instead of manually writing the repeating details of bootstrap components, use ABP's tag helpers to simplify and take advantage of intellisense. You can use Bootstrap whenever you need it.",
"DynamicFormsExplanation": "Dynamic form & input tag helpers can create the complete form from a C# class as the model.", "DynamicFormsExplanation": "Dynamic form & input tag helpers can create the complete form from a C# class as the model.",
"AuthenticationAuthorizationExplanation": "Rich authentication & authorization options integrated to ASP.NET Core Identity & IdentityServer4. Provides an extensible & detailed permission system.", "AuthenticationAuthorizationExplanation": "Rich authentication & authorization options integrated to ASP.NET Core Identity & OpenIddict. Provides an extensible & detailed permission system.",
"CrossCuttingConcernsExplanation": "Don't repeat yourself when implementing common features. Instead, focus on your business logic and let ABP automate by convention.", "CrossCuttingConcernsExplanation": "Don't repeat yourself when implementing common features. Instead, focus on your business logic and let ABP automate by convention.",
"DatabaseConnectionTransactionManagement": "Database Connection & Transaction Management", "DatabaseConnectionTransactionManagement": "Database Connection & Transaction Management",
"CorrelationIdTracking": "Correlation-Id Tracking", "CorrelationIdTracking": "Correlation-Id Tracking",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "You focus on your business code and let the framework handle multi-tenancy on behalf of you.", "MultiTenancyExplanation4": "You focus on your business code and let the framework handle multi-tenancy on behalf of you.",
"BootstrapTagHelpersExplanation": "Instead of manually writing the repeating details of bootstrap components, use ABP's tag helpers to simplify it and take advantage of the IntelliSense. You can definitely use Bootstrap whenever you need it.", "BootstrapTagHelpersExplanation": "Instead of manually writing the repeating details of bootstrap components, use ABP's tag helpers to simplify it and take advantage of the IntelliSense. You can definitely use Bootstrap whenever you need it.",
"DynamicFormsExplanation": "Dynamic form & input tag helpers can create the complete form from a C# class as the model.", "DynamicFormsExplanation": "Dynamic form & input tag helpers can create the complete form from a C# class as the model.",
"AuthenticationAuthorizationExplanation": "Rich authentication & authorization options integrated to ASP.NET Core Identity & IdentityServer4. Provides an extensible & detailed permission system.", "AuthenticationAuthorizationExplanation": "Rich authentication & authorization options integrated to ASP.NET Core Identity & OpenIddict. Provides an extensible & detailed permission system.",
"CrossCuttingConcernsExplanation": "Don't repeat yourself to implement all this common stuff again & again. Focus on your business code and let ABP automate them by conventions.", "CrossCuttingConcernsExplanation": "Don't repeat yourself to implement all this common stuff again & again. Focus on your business code and let ABP automate them by conventions.",
"DatabaseConnectionTransactionManagement": "Database Connection & Transaction Management", "DatabaseConnectionTransactionManagement": "Database Connection & Transaction Management",
"CorrelationIdTracking": "Correlation-Id Tracking", "CorrelationIdTracking": "Correlation-Id Tracking",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Enfocate en tu código y deja al framework que maneje multi-inquilino en tu nombre.", "MultiTenancyExplanation4": "Enfocate en tu código y deja al framework que maneje multi-inquilino en tu nombre.",
"BootstrapTagHelpersExplanation": "En vez de escribir repetidamente los detalle de componentes bootstrap, usa ABP's tag helpers para simplificarlo y obtener ventaja de intellisence. Tu puedes definitivamente usar Bootstrp cuando tu lo necesites.", "BootstrapTagHelpersExplanation": "En vez de escribir repetidamente los detalle de componentes bootstrap, usa ABP's tag helpers para simplificarlo y obtener ventaja de intellisence. Tu puedes definitivamente usar Bootstrp cuando tu lo necesites.",
"DynamicFormsExplanation": "Los formularios dinámicos y tag helpers de entrada pueden crear el formulario completo a partir de una clase de C# como modelo. ", "DynamicFormsExplanation": "Los formularios dinámicos y tag helpers de entrada pueden crear el formulario completo a partir de una clase de C# como modelo. ",
"AuthenticationAuthorizationExplanation": "Autenticación enriquecidad y opciones de autorización integradas con ASP.NET Core Identity & IdentityServer4. Proporciona un extensible y detallado sistema de permisos.", "AuthenticationAuthorizationExplanation": "Autenticación enriquecidad y opciones de autorización integradas con ASP.NET Core Identity & OpenIddict. Proporciona un extensible y detallado sistema de permisos.",
"CrossCuttingConcernsExplanation": "No te repitas tu mismo al implementar todas esas cosas comunes una y otra vez. Enfocate en tu negocio y permite a ABP automatizarlos por convención.", "CrossCuttingConcernsExplanation": "No te repitas tu mismo al implementar todas esas cosas comunes una y otra vez. Enfocate en tu negocio y permite a ABP automatizarlos por convención.",
"DatabaseConnectionTransactionManagement": "Conexión de base de datos y gestión de transacciones", "DatabaseConnectionTransactionManagement": "Conexión de base de datos y gestión de transacciones",
"CorrelationIdTracking": "Correlation-Id de seguimiento", "CorrelationIdTracking": "Correlation-Id de seguimiento",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Keskity yrityksesi koodiin ja annat kehyksen hoitamaan monivuokrausta puolestasi.", "MultiTenancyExplanation4": "Keskity yrityksesi koodiin ja annat kehyksen hoitamaan monivuokrausta puolestasi.",
"BootstrapTagHelpersExplanation": "Sen sijaan, että kirjoittaisit manuaalisesti uudelleenkäynnistyskomponenttien yksityiskohtia, käytä ABP: n tunnisteita yksinkertaistaaksesi sitä ja hyödyntäksesi älykkäitä ominaisuuksia. Voit ehdottomasti käyttää Bootstrapia milloin tahansa.", "BootstrapTagHelpersExplanation": "Sen sijaan, että kirjoittaisit manuaalisesti uudelleenkäynnistyskomponenttien yksityiskohtia, käytä ABP: n tunnisteita yksinkertaistaaksesi sitä ja hyödyntäksesi älykkäitä ominaisuuksia. Voit ehdottomasti käyttää Bootstrapia milloin tahansa.",
"DynamicFormsExplanation": "Dynaamiset lomake- ja syöttötunnisteiden apurit voivat luoda täydellisen lomakkeen mallina C# -luokasta.", "DynamicFormsExplanation": "Dynaamiset lomake- ja syöttötunnisteiden apurit voivat luoda täydellisen lomakkeen mallina C# -luokasta.",
"AuthenticationAuthorizationExplanation": "ASP.NET Core Identity & IdentityServer4 -palveluun integroidut monipuoliset todennus- ja todennusvaihtoehdot. Tarjoaa laajennettavan ja yksityiskohtaisen lupajärjestelmän.", "AuthenticationAuthorizationExplanation": "ASP.NET Core Identity & OpenIddict -palveluun integroidut monipuoliset todennus- ja todennusvaihtoehdot. Tarjoaa laajennettavan ja yksityiskohtaisen lupajärjestelmän.",
"CrossCuttingConcernsExplanation": "Älä toista itseäsi kaikkien näiden yleisten asioiden toteuttamiseksi uudelleen ja uudelleen. Keskity yrityskoodiin ja anna ABP: n automatisoida ne käytäntöjen mukaan.", "CrossCuttingConcernsExplanation": "Älä toista itseäsi kaikkien näiden yleisten asioiden toteuttamiseksi uudelleen ja uudelleen. Keskity yrityskoodiin ja anna ABP: n automatisoida ne käytäntöjen mukaan.",
"DatabaseConnectionTransactionManagement": "Tietokantayhteys ja tapahtumien hallinta", "DatabaseConnectionTransactionManagement": "Tietokantayhteys ja tapahtumien hallinta",
"CorrelationIdTracking": "Korrelaatio-Id-seuranta", "CorrelationIdTracking": "Korrelaatio-Id-seuranta",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Vous vous concentrez sur votre code métier et laissez le framework gérer la multi-souscrivants en votre nom.", "MultiTenancyExplanation4": "Vous vous concentrez sur votre code métier et laissez le framework gérer la multi-souscrivants en votre nom.",
"BootstrapTagHelpersExplanation": "Au lieu d'écrire manuellement les détails répétitifs des composants Boostrap, utilisez les aides de balises d'ABP pour le simplifier et tirer parti d'intellisense. Vous pouvez certainement utiliser Bootstrap chaque fois que vous en avez besoin.", "BootstrapTagHelpersExplanation": "Au lieu d'écrire manuellement les détails répétitifs des composants Boostrap, utilisez les aides de balises d'ABP pour le simplifier et tirer parti d'intellisense. Vous pouvez certainement utiliser Bootstrap chaque fois que vous en avez besoin.",
"DynamicFormsExplanation": "Les assistants dynamiques de formulaire et de balise d'entrée peuvent créer le formulaire complet à partir d'une classe C# comme modèle.", "DynamicFormsExplanation": "Les assistants dynamiques de formulaire et de balise d'entrée peuvent créer le formulaire complet à partir d'une classe C# comme modèle.",
"AuthenticationAuthorizationExplanation": "Options d'authentification et d'autorisation riches intégrées à ASP.NET Core Identity & IdentityServer4. Fournit un système d'autorisation extensible et détaillé.", "AuthenticationAuthorizationExplanation": "Options d'authentification et d'autorisation riches intégrées à ASP.NET Core Identity & OpenIddict. Fournit un système d'autorisation extensible et détaillé.",
"CrossCuttingConcernsExplanation": "Ne vous répétez pas pour mettre en œuvre toutes ces choses courantes encore et encore. Concentrez-vous sur votre code métier et laissez ABP les automatiser par des conventions.", "CrossCuttingConcernsExplanation": "Ne vous répétez pas pour mettre en œuvre toutes ces choses courantes encore et encore. Concentrez-vous sur votre code métier et laissez ABP les automatiser par des conventions.",
"DatabaseConnectionTransactionManagement": "Connexion à la base de données et gestion des transactions", "DatabaseConnectionTransactionManagement": "Connexion à la base de données et gestion des transactions",
"CorrelationIdTracking": "Suivi des identifiants de corrélation", "CorrelationIdTracking": "Suivi des identifiants de corrélation",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Fokusirate se na svoj poslovni kod i prepuštate okviru da umjesto vas upravlja multi-stanarstvom.", "MultiTenancyExplanation4": "Fokusirate se na svoj poslovni kod i prepuštate okviru da umjesto vas upravlja multi-stanarstvom.",
"BootstrapTagHelpersExplanation": "Umjesto ručnog pisanja ponavljajućih detalja komponenti pokretanja sustava, upotrijebite ABP-ove pomoćnike oznaka da to pojednostavite i iskoristite IntelliSense. Definitivno možete koristiti Bootstrap kad god vam zatreba.", "BootstrapTagHelpersExplanation": "Umjesto ručnog pisanja ponavljajućih detalja komponenti pokretanja sustava, upotrijebite ABP-ove pomoćnike oznaka da to pojednostavite i iskoristite IntelliSense. Definitivno možete koristiti Bootstrap kad god vam zatreba.",
"DynamicFormsExplanation": "Pomoćnici dinamičkih obrazaca i oznaka za unos mogu stvoriti potpuni obrazac iz C# klase kao modela.", "DynamicFormsExplanation": "Pomoćnici dinamičkih obrazaca i oznaka za unos mogu stvoriti potpuni obrazac iz C# klase kao modela.",
"AuthenticationAuthorizationExplanation": "Bogate opcije provjere autentičnosti i autorizacije integrirane u ASP.NET Core Identity &amp; IdentityServer4. Omogućuje proširiv i detaljan sustav dopuštenja.", "AuthenticationAuthorizationExplanation": "Bogate opcije provjere autentičnosti i autorizacije integrirane u ASP.NET Core Identity &amp; OpenIddict. Omogućuje proširiv i detaljan sustav dopuštenja.",
"CrossCuttingConcernsExplanation": "Nemojte se ponavljati kako biste iznova i iznova implementirali sve ove uobičajene stvari. Usredotočite se na svoj poslovni kod i dopustite ABP-u da ih automatizira prema konvencijama.", "CrossCuttingConcernsExplanation": "Nemojte se ponavljati kako biste iznova i iznova implementirali sve ove uobičajene stvari. Usredotočite se na svoj poslovni kod i dopustite ABP-u da ih automatizira prema konvencijama.",
"DatabaseConnectionTransactionManagement": "Povezivanje baze podataka i upravljanje transakcijama", "DatabaseConnectionTransactionManagement": "Povezivanje baze podataka i upravljanje transakcijama",
"CorrelationIdTracking": "Praćenje ID-a korelacije", "CorrelationIdTracking": "Praćenje ID-a korelacije",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Ön az üzleti kódjára összpontosít, és hagyja, hogy a keretrendszer kezelje a több bérlést az Ön nevében.", "MultiTenancyExplanation4": "Ön az üzleti kódjára összpontosít, és hagyja, hogy a keretrendszer kezelje a több bérlést az Ön nevében.",
"BootstrapTagHelpersExplanation": "A bootstrap komponensek ismétlődő részleteinek manuális megírása helyett használja az ABP címkesegédjét az egyszerűsítéshez és az intellisense előnyeinek kihasználásához. Határozottan használhatja a Bootstrapet, amikor csak szüksége van rá.", "BootstrapTagHelpersExplanation": "A bootstrap komponensek ismétlődő részleteinek manuális megírása helyett használja az ABP címkesegédjét az egyszerűsítéshez és az intellisense előnyeinek kihasználásához. Határozottan használhatja a Bootstrapet, amikor csak szüksége van rá.",
"DynamicFormsExplanation": "A dinamikus űrlap- és beviteli címke-segítők modellként létrehozhatják a teljes űrlapot egy C# osztályból.", "DynamicFormsExplanation": "A dinamikus űrlap- és beviteli címke-segítők modellként létrehozhatják a teljes űrlapot egy C# osztályból.",
"AuthenticationAuthorizationExplanation": "Az ASP.NET Core Identity & IdentityServer4-be integrált gazdag hitelesítési és engedélyezési lehetőségek. Bővíthető és részletes engedélyezési rendszert biztosít.", "AuthenticationAuthorizationExplanation": "Az ASP.NET Core Identity & OpenIddict-be integrált gazdag hitelesítési és engedélyezési lehetőségek. Bővíthető és részletes engedélyezési rendszert biztosít.",
"CrossCuttingConcernsExplanation": "Ne ismételje magát, hogy újra és újra végrehajtsa ezeket a gyakori dolgokat. Koncentráljon az üzleti kódjára, és hagyja, hogy az ABP konvenciók szerint automatizálja azokat.", "CrossCuttingConcernsExplanation": "Ne ismételje magát, hogy újra és újra végrehajtsa ezeket a gyakori dolgokat. Koncentráljon az üzleti kódjára, és hagyja, hogy az ABP konvenciók szerint automatizálja azokat.",
"DatabaseConnectionTransactionManagement": "Adatbázis-kapcsolat és tranzakciókezelés", "DatabaseConnectionTransactionManagement": "Adatbázis-kapcsolat és tranzakciókezelés",
"CorrelationIdTracking": "Korreláció-azonosító követés", "CorrelationIdTracking": "Korreláció-azonosító követés",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Þú leggur áherslu á viðskiptakóðann þinn og lætur umgjörðina annast tenata virknina fyrir þína hönd.", "MultiTenancyExplanation4": "Þú leggur áherslu á viðskiptakóðann þinn og lætur umgjörðina annast tenata virknina fyrir þína hönd.",
"BootstrapTagHelpersExplanation": "Í stað þess að skrifa handvirkt að endurtaka upplýsingar um bootstrap íhluti skaltu nota merkimiðla ABP til að einfalda það og nýta þér intellisense. Þú getur örugglega notað Bootstrap hvenær sem þú þarft á því að halda.", "BootstrapTagHelpersExplanation": "Í stað þess að skrifa handvirkt að endurtaka upplýsingar um bootstrap íhluti skaltu nota merkimiðla ABP til að einfalda það og nýta þér intellisense. Þú getur örugglega notað Bootstrap hvenær sem þú þarft á því að halda.",
"DynamicFormsExplanation": "Dynamísk form og input tag hjálp getur búið til fullbúið form úr C# klasa sem fyrirmynd", "DynamicFormsExplanation": "Dynamísk form og input tag hjálp getur búið til fullbúið form úr C# klasa sem fyrirmynd",
"AuthenticationAuthorizationExplanation": "Ríkur auðkenningar- og heimildarmöguleiki samþættur með ASP.NET Core Identity & IdentityServer4. Veitir stækkanlegt og ítarlegt leyfiskerfi.", "AuthenticationAuthorizationExplanation": "Ríkur auðkenningar- og heimildarmöguleiki samþættur með ASP.NET Core Identity & OpenIddict. Veitir stækkanlegt og ítarlegt leyfiskerfi.",
"CrossCuttingConcernsExplanation": "Ekki endurtaka sjálfan þig við að innleiða alla þessu sameiginlegu hluti aftur og aftur. Einbeittu þér að viðskiptakóðanum þínum og láttu ABP þá gera þau sjálfvirt með venjum.", "CrossCuttingConcernsExplanation": "Ekki endurtaka sjálfan þig við að innleiða alla þessu sameiginlegu hluti aftur og aftur. Einbeittu þér að viðskiptakóðanum þínum og láttu ABP þá gera þau sjálfvirt með venjum.",
"DatabaseConnectionTransactionManagement": "Tengistrengir og færsluyfirlit", "DatabaseConnectionTransactionManagement": "Tengistrengir og færsluyfirlit",
"CorrelationIdTracking": "Samþættingar auðkennis yfirlit", "CorrelationIdTracking": "Samþættingar auðkennis yfirlit",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Ti concentri sul tuo codice aziendale e lasci che il framework gestisca il multi-tenancy per tuo conto.", "MultiTenancyExplanation4": "Ti concentri sul tuo codice aziendale e lasci che il framework gestisca il multi-tenancy per tuo conto.",
"BootstrapTagHelpersExplanation": "Invece di scrivere manualmente i dettagli ripetuti dei componenti bootstrap, usa gli helper tag di ABP per semplificarlo e sfruttare intellisense. Puoi sicuramente usare Bootstrap ogni volta che ne hai bisogno.", "BootstrapTagHelpersExplanation": "Invece di scrivere manualmente i dettagli ripetuti dei componenti bootstrap, usa gli helper tag di ABP per semplificarlo e sfruttare intellisense. Puoi sicuramente usare Bootstrap ogni volta che ne hai bisogno.",
"DynamicFormsExplanation": "Gli helper dei moduli dinamici e dei tag di input possono creare il modulo completo da una classe C# come modello.", "DynamicFormsExplanation": "Gli helper dei moduli dinamici e dei tag di input possono creare il modulo completo da una classe C# come modello.",
"AuthenticationAuthorizationExplanation": "Ricche opzioni di autenticazione e autorizzazione integrate in ASP.NET Core Identity & IdentityServer4. Fornisce un sistema di autorizzazione estensibile e dettagliato.", "AuthenticationAuthorizationExplanation": "Ricche opzioni di autenticazione e autorizzazione integrate in ASP.NET Core Identity & OpenIddict. Fornisce un sistema di autorizzazione estensibile e dettagliato.",
"CrossCuttingConcernsExplanation": "Non ripetere te stesso per implementare tutte queste cose comuni ancora e ancora. Concentrati sul tuo codice aziendale e lascia che ABP li automatizzi secondo le convenzioni.", "CrossCuttingConcernsExplanation": "Non ripetere te stesso per implementare tutte queste cose comuni ancora e ancora. Concentrati sul tuo codice aziendale e lascia che ABP li automatizzi secondo le convenzioni.",
"DatabaseConnectionTransactionManagement": "Connessione al database e gestione delle transazioni", "DatabaseConnectionTransactionManagement": "Connessione al database e gestione delle transazioni",
"CorrelationIdTracking": "Monitoraggio dell'ID di correlazione", "CorrelationIdTracking": "Monitoraggio dell'ID di correlazione",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "U concentreert zich op uw bedrijfscode en laat het framework multi-tenancy voor u afhandelen.", "MultiTenancyExplanation4": "U concentreert zich op uw bedrijfscode en laat het framework multi-tenancy voor u afhandelen.",
"BootstrapTagHelpersExplanation": "In plaats van handmatig de herhalende details van bootstrap-componenten te schrijven, gebruikt u de tag-helpers van ABP om het te vereenvoudigen en te profiteren van intellisense. Je kunt Bootstrap zeker gebruiken wanneer je het nodig hebt.", "BootstrapTagHelpersExplanation": "In plaats van handmatig de herhalende details van bootstrap-componenten te schrijven, gebruikt u de tag-helpers van ABP om het te vereenvoudigen en te profiteren van intellisense. Je kunt Bootstrap zeker gebruiken wanneer je het nodig hebt.",
"DynamicFormsExplanation": "Dynamische formulier- en invoertaghelpers kunnen het volledige formulier maken vanuit een C#-klasse als model.", "DynamicFormsExplanation": "Dynamische formulier- en invoertaghelpers kunnen het volledige formulier maken vanuit een C#-klasse als model.",
"AuthenticationAuthorizationExplanation": "Uitgebreide authenticatie- en autorisatie-opties geïntegreerd in ASP.NET Core Identity & IdentityServer4. Biedt een uitbreidbaar en gedetailleerd toestemmingssysteem.", "AuthenticationAuthorizationExplanation": "Uitgebreide authenticatie- en autorisatie-opties geïntegreerd in ASP.NET Core Identity & OpenIddict. Biedt een uitbreidbaar en gedetailleerd toestemmingssysteem.",
"CrossCuttingConcernsExplanation": "Herhaal jezelf niet om al deze veelvoorkomende dingen keer op keer te implementeren. Concentreer u op uw bedrijfscode en laat ABP ze automatiseren volgens conventies.", "CrossCuttingConcernsExplanation": "Herhaal jezelf niet om al deze veelvoorkomende dingen keer op keer te implementeren. Concentreer u op uw bedrijfscode en laat ABP ze automatiseren volgens conventies.",
"DatabaseConnectionTransactionManagement": "Databaseverbinding en transactiebeheer", "DatabaseConnectionTransactionManagement": "Databaseverbinding en transactiebeheer",
"CorrelationIdTracking": "Correlatie-ID-tracking", "CorrelationIdTracking": "Correlatie-ID-tracking",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Skupiasz się na kodzie biznesowym i pozwalasz, by framework obsługiwał wielodostępność w Twoim imieniu.", "MultiTenancyExplanation4": "Skupiasz się na kodzie biznesowym i pozwalasz, by framework obsługiwał wielodostępność w Twoim imieniu.",
"BootstrapTagHelpersExplanation": "Zamiast ręcznie pisać powtarzające się szczegóły komponentów ładowania początkowego, użyj pomocników tagów ABP, aby to uprościć i wykorzystać intellisense. Zdecydowanie możesz używać Bootstrapa, kiedy tylko tego potrzebujesz.", "BootstrapTagHelpersExplanation": "Zamiast ręcznie pisać powtarzające się szczegóły komponentów ładowania początkowego, użyj pomocników tagów ABP, aby to uprościć i wykorzystać intellisense. Zdecydowanie możesz używać Bootstrapa, kiedy tylko tego potrzebujesz.",
"DynamicFormsExplanation": "Pomocnicy dynamicznych formularzy i tagów wejściowych mogą tworzyć kompletny formularz z klasy C# jako modelu.", "DynamicFormsExplanation": "Pomocnicy dynamicznych formularzy i tagów wejściowych mogą tworzyć kompletny formularz z klasy C# jako modelu.",
"AuthenticationAuthorizationExplanation": "Bogate opcje uwierzytelniania i autoryzacji zintegrowane z ASP.NET Core Identity & IdentityServer4. Zapewnia rozszerzalny i szczegółowy system uprawnień.", "AuthenticationAuthorizationExplanation": "Bogate opcje uwierzytelniania i autoryzacji zintegrowane z ASP.NET Core Identity & OpenIddict. Zapewnia rozszerzalny i szczegółowy system uprawnień.",
"CrossCuttingConcernsExplanation": "Nie powtarzaj się, aby ciągle wdrażać te wszystkie typowe rzeczy. Skoncentruj się na kodzie biznesowym i pozwól ABP zautomatyzować je zgodnie z konwencjami.", "CrossCuttingConcernsExplanation": "Nie powtarzaj się, aby ciągle wdrażać te wszystkie typowe rzeczy. Skoncentruj się na kodzie biznesowym i pozwól ABP zautomatyzować je zgodnie z konwencjami.",
"DatabaseConnectionTransactionManagement": "Połączenie z bazą danych i zarządzanie transakcjami", "DatabaseConnectionTransactionManagement": "Połączenie z bazą danych i zarządzanie transakcjami",
"CorrelationIdTracking": "Śledzenie identyfikatora korelacji", "CorrelationIdTracking": "Śledzenie identyfikatora korelacji",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Você se concentra no seu código comercial e deixa o framework lidar com a multilocação em seu nome.", "MultiTenancyExplanation4": "Você se concentra no seu código comercial e deixa o framework lidar com a multilocação em seu nome.",
"BootstrapTagHelpersExplanation": "Em vez de escrever manualmente os detalhes repetidos dos componentes do bootstrap, use os tag helpers da ABP para simplificá-lo e tirar proveito do intellisense. Você pode definitivamente usar o Bootstrap sempre que precisar.", "BootstrapTagHelpersExplanation": "Em vez de escrever manualmente os detalhes repetidos dos componentes do bootstrap, use os tag helpers da ABP para simplificá-lo e tirar proveito do intellisense. Você pode definitivamente usar o Bootstrap sempre que precisar.",
"DynamicFormsExplanation": "Formulário dinâmico e entrada de tag helpers pode criar o formulário completo a partir de uma classe C# como modelo.", "DynamicFormsExplanation": "Formulário dinâmico e entrada de tag helpers pode criar o formulário completo a partir de uma classe C# como modelo.",
"AuthenticationAuthorizationExplanation": "Opções avançadas de autenticação e autorização integradas ao ASP.NET Core Identity & IdentityServer4. Fornece um sistema de permissões extensível e detalhado.", "AuthenticationAuthorizationExplanation": "Opções avançadas de autenticação e autorização integradas ao ASP.NET Core Identity & OpenIddict. Fornece um sistema de permissões extensível e detalhado.",
"CrossCuttingConcernsExplanation": "Não se repita para implementar todas essas coisas comuns repetidamente. Concentre-se no seu código comercial e permita que a ABP os automatize por convenções.", "CrossCuttingConcernsExplanation": "Não se repita para implementar todas essas coisas comuns repetidamente. Concentre-se no seu código comercial e permita que a ABP os automatize por convenções.",
"DatabaseConnectionTransactionManagement": "Gerenciamento de conexão e transação de banco de dados", "DatabaseConnectionTransactionManagement": "Gerenciamento de conexão e transação de banco de dados",
"CorrelationIdTracking": "Rastreamento de ID de correlação", "CorrelationIdTracking": "Rastreamento de ID de correlação",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Vă focusaţi pe codul dumneavoastră şi lăsaţi framework-ul să se ocupe de multi-tenancy pentru dumneavoastră.", "MultiTenancyExplanation4": "Vă focusaţi pe codul dumneavoastră şi lăsaţi framework-ul să se ocupe de multi-tenancy pentru dumneavoastră.",
"BootstrapTagHelpersExplanation": "În loc să scrieţi manual detaliile repetate ale componentelor bootstrap, folosiţi tag helperele ABP pentru a simplifica şi profita de inteligenţă. Puteţi folosi cu siguranţă Bootstrap ori de câte ori aveţi nevoie de el.", "BootstrapTagHelpersExplanation": "În loc să scrieţi manual detaliile repetate ale componentelor bootstrap, folosiţi tag helperele ABP pentru a simplifica şi profita de inteligenţă. Puteţi folosi cu siguranţă Bootstrap ori de câte ori aveţi nevoie de el.",
"DynamicFormsExplanation": "Formulare dinamice & tag helpere de intrare pot crea formularul complet dintr-o clasă C# ca model.", "DynamicFormsExplanation": "Formulare dinamice & tag helpere de intrare pot crea formularul complet dintr-o clasă C# ca model.",
"AuthenticationAuthorizationExplanation": "Opţiuni variate de autentificare şi autorizare integrate cu ASP.NET Core Identity & IdentityServer4. Furnizează un sistem de permisiuni extensibil şi detaliat.", "AuthenticationAuthorizationExplanation": "Opţiuni variate de autentificare şi autorizare integrate cu ASP.NET Core Identity & OpenIddict. Furnizează un sistem de permisiuni extensibil şi detaliat.",
"CrossCuttingConcernsExplanation": "Nu vă repetaţi pentru a implementa din nou şi din nou toate aceste lucruri obişniuite. Concentraţi-vă pe codul dumneavoastră de business şi lăsaţi ABP să le automatizeze prin convenţii.", "CrossCuttingConcernsExplanation": "Nu vă repetaţi pentru a implementa din nou şi din nou toate aceste lucruri obişniuite. Concentraţi-vă pe codul dumneavoastră de business şi lăsaţi ABP să le automatizeze prin convenţii.",
"DatabaseConnectionTransactionManagement": "Conectare la baza de date & Gestionarea tranzacţiilor", "DatabaseConnectionTransactionManagement": "Conectare la baza de date & Gestionarea tranzacţiilor",
"CorrelationIdTracking": "Correlation-Id Tracking", "CorrelationIdTracking": "Correlation-Id Tracking",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Вы сосредотачиваетесь на своем бизнес-коде и позволяете фреймворку обрабатывать мультитенантность от вашего имени.", "MultiTenancyExplanation4": "Вы сосредотачиваетесь на своем бизнес-коде и позволяете фреймворку обрабатывать мультитенантность от вашего имени.",
"BootstrapTagHelpersExplanation": "Вместо того, чтобы вручную писать повторяющиеся детали компонентов начальной загрузки, используйте помощники тегов ABP, чтобы упростить его и воспользоваться преимуществами intellisense. Вы определенно можете использовать Bootstrap, когда вам это нужно.", "BootstrapTagHelpersExplanation": "Вместо того, чтобы вручную писать повторяющиеся детали компонентов начальной загрузки, используйте помощники тегов ABP, чтобы упростить его и воспользоваться преимуществами intellisense. Вы определенно можете использовать Bootstrap, когда вам это нужно.",
"DynamicFormsExplanation": "Помощники динамических форм и тегов ввода могут создавать полную форму из класса C # в качестве модели.", "DynamicFormsExplanation": "Помощники динамических форм и тегов ввода могут создавать полную форму из класса C # в качестве модели.",
"AuthenticationAuthorizationExplanation": "Расширенные возможности аутентификации и авторизации, интегрированные в ASP.NET Core Identity и IdentityServer4. Предоставляет расширяемую и подробную систему разрешений.", "AuthenticationAuthorizationExplanation": "Расширенные возможности аутентификации и авторизации, интегрированные в ASP.NET Core Identity и OpenIddict. Предоставляет расширяемую и подробную систему разрешений.",
"CrossCuttingConcernsExplanation": "Не повторяйте себя, чтобы реализовать все эти обычные вещи снова и снова. Сосредоточьтесь на своем бизнес-коде и позвольте ABP автоматизировать их по соглашениям.", "CrossCuttingConcernsExplanation": "Не повторяйте себя, чтобы реализовать все эти обычные вещи снова и снова. Сосредоточьтесь на своем бизнес-коде и позвольте ABP автоматизировать их по соглашениям.",
"DatabaseConnectionTransactionManagement": "Подключение к базе данных и управление транзакциями", "DatabaseConnectionTransactionManagement": "Подключение к базе данных и управление транзакциями",
"CorrelationIdTracking": "Отслеживание корреляционных идентификаторов", "CorrelationIdTracking": "Отслеживание корреляционных идентификаторов",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Sústreďte sa na svoj biznis kód a nechajte framework, aby sa vo vašom mene postaral o multitenantnosť.", "MultiTenancyExplanation4": "Sústreďte sa na svoj biznis kód a nechajte framework, aby sa vo vašom mene postaral o multitenantnosť.",
"BootstrapTagHelpersExplanation": "Namiesto ručného písania opakujúcich sa bootstrap komponentov, použite ABP tag pomocníka na zjednodušenie a využitie výhod intellisense. Bootstrap určite využijete vždy, keď ho budete potrebovať.", "BootstrapTagHelpersExplanation": "Namiesto ručného písania opakujúcich sa bootstrap komponentov, použite ABP tag pomocníka na zjednodušenie a využitie výhod intellisense. Bootstrap určite využijete vždy, keď ho budete potrebovať.",
"DynamicFormsExplanation": "Dynamické formuláre & vstup Tag pomocníka môžu vytvoriť kompletný formulár z C# triedy ako modelu.", "DynamicFormsExplanation": "Dynamické formuláre & vstup Tag pomocníka môžu vytvoriť kompletný formulár z C# triedy ako modelu.",
"AuthenticationAuthorizationExplanation": "Bohaté možnosti overovania & autorizácie integrované do ASP.NET Core Identity & IdentityServer4. Poskytuje rozšíriteľný a podrobný systém oprávnení.", "AuthenticationAuthorizationExplanation": "Bohaté možnosti overovania & autorizácie integrované do ASP.NET Core Identity & OpenIddict. Poskytuje rozšíriteľný a podrobný systém oprávnení.",
"CrossCuttingConcernsExplanation": "Neopakujte sa pri implementácii všetkých týchto bežných vecí znova a znova. Zamerajte sa na svoj biznis kód a nechajte ich automatizovať pomocou konvencií.", "CrossCuttingConcernsExplanation": "Neopakujte sa pri implementácii všetkých týchto bežných vecí znova a znova. Zamerajte sa na svoj biznis kód a nechajte ich automatizovať pomocou konvencií.",
"DatabaseConnectionTransactionManagement": "Pripojenie k databáze & správa transakcií", "DatabaseConnectionTransactionManagement": "Pripojenie k databáze & správa transakcií",
"CorrelationIdTracking": "Sledovanie korelačnej identifikácie", "CorrelationIdTracking": "Sledovanie korelačnej identifikácie",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Osredotočite se na svojo poslovno kodo in dovolite, da okvir obravnava večnajemne storitve v vašem imenu.", "MultiTenancyExplanation4": "Osredotočite se na svojo poslovno kodo in dovolite, da okvir obravnava večnajemne storitve v vašem imenu.",
"BootstrapTagHelpersExplanation": "Namesto ročnega pisanja ponavljajočih se podrobnosti komponent zagonskega zagona, uporabite pomočnike oznak ABP, da ga poenostavite in izkoristite prednosti intellisense. Vsekakor lahko uporabite Bootstrap, kadar koli ga potrebujete.", "BootstrapTagHelpersExplanation": "Namesto ročnega pisanja ponavljajočih se podrobnosti komponent zagonskega zagona, uporabite pomočnike oznak ABP, da ga poenostavite in izkoristite prednosti intellisense. Vsekakor lahko uporabite Bootstrap, kadar koli ga potrebujete.",
"DynamicFormsExplanation": "Pomočniki za dinamične oblike in oznake za vnos lahko ustvarijo celoten obrazec iz razreda C# kot model.", "DynamicFormsExplanation": "Pomočniki za dinamične oblike in oznake za vnos lahko ustvarijo celoten obrazec iz razreda C# kot model.",
"AuthenticationAuthorizationExplanation": "Bogate možnosti preverjanja pristnosti in avtorizacije, integrirane v ASP.NET Core Identity & IdentityServer4. Zagotavlja razširljiv in podroben sistem dovoljenj.", "AuthenticationAuthorizationExplanation": "Bogate možnosti preverjanja pristnosti in avtorizacije, integrirane v ASP.NET Core Identity & OpenIddict. Zagotavlja razširljiv in podroben sistem dovoljenj.",
"CrossCuttingConcernsExplanation": "Ne ponavljajte se, da bi vedno znova izvajali vse te običajne stvari. Osredotočite se na svojo poslovno kodo in dovolite, da jih ABP avtomatizira po dogovorih.", "CrossCuttingConcernsExplanation": "Ne ponavljajte se, da bi vedno znova izvajali vse te običajne stvari. Osredotočite se na svojo poslovno kodo in dovolite, da jih ABP avtomatizira po dogovorih.",
"DatabaseConnectionTransactionManagement": "Povezava z bazo podatkov in upravljanje transakcij", "DatabaseConnectionTransactionManagement": "Povezava z bazo podatkov in upravljanje transakcij",
"CorrelationIdTracking": "Sledenje korelacijskim ID-jem", "CorrelationIdTracking": "Sledenje korelacijskim ID-jem",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Sen kendi uygulama kodunu odaklan ve bırak framework sizin adınıza multi-tenancy üstesinden gelsin.", "MultiTenancyExplanation4": "Sen kendi uygulama kodunu odaklan ve bırak framework sizin adınıza multi-tenancy üstesinden gelsin.",
"BootstrapTagHelpersExplanation": "Bootstrap komponentlerinin tekrar eden detaylarını manuel olarak yazmak yerine, Bu işlemi basitleştirmek ve iyileştirme avantajından faydalanmak için ABP'nin tag helperlarını kullanın. Dinamik form bir C# sınıfından model olarak eksiksik form oluşturabilir.", "BootstrapTagHelpersExplanation": "Bootstrap komponentlerinin tekrar eden detaylarını manuel olarak yazmak yerine, Bu işlemi basitleştirmek ve iyileştirme avantajından faydalanmak için ABP'nin tag helperlarını kullanın. Dinamik form bir C# sınıfından model olarak eksiksik form oluşturabilir.",
"DynamicFormsExplanation": "Dinamik form & input tag helpers bir C# sınıfından model olarak eksiksik form oluşturabilir.", "DynamicFormsExplanation": "Dinamik form & input tag helpers bir C# sınıfından model olarak eksiksik form oluşturabilir.",
"AuthenticationAuthorizationExplanation": "ASP.NET Core Identity & IdentityServer4 ile entegre edilmiş zengin kimlik doğrulama ve yetkilendirme opsiyonları. Genişletilebilir ve detaylandırılabilr bir izin sistemi sunar.", "AuthenticationAuthorizationExplanation": "ASP.NET Core Identity & OpenIddict ile entegre edilmiş zengin kimlik doğrulama ve yetkilendirme opsiyonları. Genişletilebilir ve detaylandırılabilr bir izin sistemi sunar.",
"CrossCuttingConcernsExplanation": "Tüm bu ortak şeyleri geliştirmek için kendini sürekli tekrar etme. Kendi iş koduna odaklan ve bırak ABP bunları kurallar ile otomatik hale getirsin.", "CrossCuttingConcernsExplanation": "Tüm bu ortak şeyleri geliştirmek için kendini sürekli tekrar etme. Kendi iş koduna odaklan ve bırak ABP bunları kurallar ile otomatik hale getirsin.",
"DatabaseConnectionTransactionManagement": "Veritabanı Bğlantısı & İşlem Yönetimi", "DatabaseConnectionTransactionManagement": "Veritabanı Bğlantısı & İşlem Yönetimi",
"CorrelationIdTracking": "Correlation-Id Tracking", "CorrelationIdTracking": "Correlation-Id Tracking",

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "Bạn tập trung vào mã doanh nghiệp của mình và để khuôn khổ xử lý việc thuê nhiều người thay cho bạn.", "MultiTenancyExplanation4": "Bạn tập trung vào mã doanh nghiệp của mình và để khuôn khổ xử lý việc thuê nhiều người thay cho bạn.",
"BootstrapTagHelpersExplanation": "Thay vì viết thủ công các chi tiết lặp lại của các thành phần bootstrap, hãy sử dụng trình trợ giúp thẻ của ABP để đơn giản hóa nó và tận dụng lợi thế của intellisense. Bạn chắc chắn có thể sử dụng Bootstrap bất cứ khi nào bạn cần.", "BootstrapTagHelpersExplanation": "Thay vì viết thủ công các chi tiết lặp lại của các thành phần bootstrap, hãy sử dụng trình trợ giúp thẻ của ABP để đơn giản hóa nó và tận dụng lợi thế của intellisense. Bạn chắc chắn có thể sử dụng Bootstrap bất cứ khi nào bạn cần.",
"DynamicFormsExplanation": "Trình trợ giúp biểu mẫu động & thẻ nhập có thể tạo biểu mẫu hoàn chỉnh từ lớp C # làm mô hình.", "DynamicFormsExplanation": "Trình trợ giúp biểu mẫu động & thẻ nhập có thể tạo biểu mẫu hoàn chỉnh từ lớp C # làm mô hình.",
"AuthenticationAuthorizationExplanation": "Các tùy chọn xác thực & ủy quyền phong phú được tích hợp vào ASP.NET Core Identity & IdentityServer4. Cung cấp hệ thống quyền chi tiết và có thể mở rộng.", "AuthenticationAuthorizationExplanation": "Các tùy chọn xác thực & ủy quyền phong phú được tích hợp vào ASP.NET Core Identity & OpenIddict. Cung cấp hệ thống quyền chi tiết và có thể mở rộng.",
"CrossCuttingConcernsExplanation": "Đừng lặp lại chính mình để thực hiện lại tất cả những thứ phổ biến này. Tập trung vào mã doanh nghiệp của bạn và để ABP tự động hóa chúng theo quy ước.", "CrossCuttingConcernsExplanation": "Đừng lặp lại chính mình để thực hiện lại tất cả những thứ phổ biến này. Tập trung vào mã doanh nghiệp của bạn và để ABP tự động hóa chúng theo quy ước.",
"DatabaseConnectionTransactionManagement": "Kết nối cơ sở dữ liệu & Quản lý giao dịch", "DatabaseConnectionTransactionManagement": "Kết nối cơ sở dữ liệu & Quản lý giao dịch",
"CorrelationIdTracking": "Theo dõi Id tương quan", "CorrelationIdTracking": "Theo dõi Id tương quan",

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

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

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

@ -122,7 +122,7 @@
"MultiTenancyExplanation4": "您專注於業務邏輯,並讓該框架為您處理多租戶.", "MultiTenancyExplanation4": "您專注於業務邏輯,並讓該框架為您處理多租戶.",
"BootstrapTagHelpersExplanation": "與其手動撰寫重複細節的bootstrap組件,不如使用ABP的tag helper來簡化它並利用自動完成.您當然也可以在需要時直接使用Bootstrap.", "BootstrapTagHelpersExplanation": "與其手動撰寫重複細節的bootstrap組件,不如使用ABP的tag helper來簡化它並利用自動完成.您當然也可以在需要時直接使用Bootstrap.",
"DynamicFormsExplanation": "動態表單和tag helpers可以利用C#類別做為模型來建立完整的表單.", "DynamicFormsExplanation": "動態表單和tag helpers可以利用C#類別做為模型來建立完整的表單.",
"AuthenticationAuthorizationExplanation": "整合到ASP.NET Core Identity和IdentityServer4的豐富身份驗證和授權選項.提供可擴展且詳細的權限系統.", "AuthenticationAuthorizationExplanation": "整合到ASP.NET Core Identity和OpenIddict的豐富身份驗證和授權選項.提供可擴展且詳細的權限系統.",
"CrossCuttingConcernsExplanation": "部要重複資幾一次又一次地實作所有這寫常見的東西.專注於您的業務邏輯,並讓ABP按照習慣自動執行.", "CrossCuttingConcernsExplanation": "部要重複資幾一次又一次地實作所有這寫常見的東西.專注於您的業務邏輯,並讓ABP按照習慣自動執行.",
"DatabaseConnectionTransactionManagement": "資料庫連接和交易管理", "DatabaseConnectionTransactionManagement": "資料庫連接和交易管理",
"CorrelationIdTracking": "關聯ID追蹤", "CorrelationIdTracking": "關聯ID追蹤",
@ -274,7 +274,7 @@
"EmailNotValid": "請輸入有效的電子郵件地址。", "EmailNotValid": "請輸入有效的電子郵件地址。",
"WeWillSendYouADownloadLink": "下載電子書的鏈接已發送至 {0}。檢查您的收件箱、垃圾箱或垃圾郵件箱!", "WeWillSendYouADownloadLink": "下載電子書的鏈接已發送至 {0}。檢查您的收件箱、垃圾箱或垃圾郵件箱!",
"GoHome": "回家", "GoHome": "回家",
"InvalidFormInputs": "請輸入表中指定的有效信息。", "InvalidFormInputs": "請輸入表中指定的有效信息。",
"DDDBookEmailBody": "謝謝你。 <br />要下載您的圖書,請<a href=\"{0}\">點擊此處</a>。", "DDDBookEmailBody": "謝謝你。 <br />要下載您的圖書,請<a href=\"{0}\">點擊此處</a>。",
"SubscribeToNewsletter": "訂閱時事通訊以獲取有關 ABP.IO 平台中發生的事件的信息,例如新版本、文章、優惠等。", "SubscribeToNewsletter": "訂閱時事通訊以獲取有關 ABP.IO 平台中發生的事件的信息,例如新版本、文章、優惠等。",
"FirstEdition": "第一版", "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). * `--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 ### login
Some features of the CLI requires to be logged in to abp.io platform. To login with your username write: Some features of the CLI requires to be logged in to abp.io platform. To login with your username write:

130
docs/en/UI/Angular/Authorization.md

@ -1,9 +1,9 @@
## Authorization in Angular UI ## Authorization in Angular UI
OAuth is preconfigured in Angular application templates. So, when you start a project using the CLI (or Suite, for that matter), authorization already works. ABP Angular UI packages are using [angular-oauth2-oidc library](https://github.com/manfredsteyer/angular-oauth2-oidc#logging-in) for managing OAuth in the Angular client. OAuth is preconfigured in Angular application templates. So, when you start a project using the CLI (or Suite, for that matter), authorization already works. ABP Angular UI packages are using [angular-oauth2-oidc library](https://github.com/manfredsteyer/angular-oauth2-oidc#logging-in) for managing OAuth in the Angular client.
You can find **OAuth configuration** in the _environment.ts_ files. You can find **OAuth configuration** in the _environment.ts_ files.
### Authorization Code Flow ### Authorization Code Flow
```js ```js
import { Config } from '@abp/ng.core'; import { Config } from '@abp/ng.core';
@ -29,7 +29,6 @@ export const environment = {
This configuration results in an [OAuth authorization code flow with PKCE](https://tools.ietf.org/html/rfc7636). This configuration results in an [OAuth authorization code flow with PKCE](https://tools.ietf.org/html/rfc7636).
According to this flow, the user is redirected to an external login page which is built with MVC. So, if you need **to customize the login page**, please follow [this community article](https://community.abp.io/articles/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd). According to this flow, the user is redirected to an external login page which is built with MVC. So, if you need **to customize the login page**, please follow [this community article](https://community.abp.io/articles/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd).
### Resource Owner Password Flow ### Resource Owner Password Flow
If you have used the [Angular UI account module](./Account-Module) in your project, you can switch to the resource owner password flow by changing the OAuth configuration in the _environment.ts_ files as shown below: If you have used the [Angular UI account module](./Account-Module) in your project, you can switch to the resource owner password flow by changing the OAuth configuration in the _environment.ts_ files as shown below:
@ -52,3 +51,128 @@ export const environment = {
``` ```
According to this flow, the user is redirected to the login page in the account module. According to this flow, the user is redirected to the login page in the account module.
### Error Filtering
In [AuthFlowStrategy](https://github.com/abpframework/abp/blob/21e70fd66154d4064d03b1a438f20a2e4318715e/npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts#L24) class, there is a method called `listenToOauthErrors` that listens to `OAuthErrorEvent` errors. This method clears the localStorage for OAuth keys. However, in certain cases, we might want to skip this process. To achieve this, we can use the `AuthErrorFilterService`.
The `AuthErrorFilterService` is an abstract service that needs to be replaced with a custom implementation
> By default, this service is replaced in the `@abp/ng.oauth` package
**Usage**
1.Create an auth-filter.provider
```js
import { APP_INITIALIZER, inject } from '@angular/core';
import { AuthErrorFilter, AuthErrorEvent, AuthErrorFilterService } from '@abp/ng.core';
import { eCustomersAuthFilterNames } from '../enums';
export const CUSTOMERS_AUTH_FILTER_PROVIDER = [
{ provide: APP_INITIALIZER, useFactory: configureAuthFilter, multi: true },
];
type Reason = object & { error: { grant_type: string | undefined } };
function configureAuthFilter() {
const errorFilterService = inject(
AuthErrorFilterService<AuthErrorFilter<AuthErrorEvent>, AuthErrorEvent>,
);
const filter: AuthErrorFilter = {
id: eCustomersAuthFilterNames.LinkedUser,
executable: true,
execute: (event: AuthErrorEvent) => {
const { reason } = event;
const {
error: { grant_type },
} = <Reason>(reason || {});
return !!grant_type && grant_type === eCustomersAuthFilterNames.LinkedUser;
},
};
return () => errorFilterService.add(filter);
}
```
- `AuthErrorFilter:` is a model for filter object and it have 3 properties
- `id:` a unique key in the list for the filter object
- `executable:` a status for the filter object. If it's false then it won't work, yet it'll stay in the list
- `execute:` a function that stores the skip logic
2.Add to the FeatureConfigModule
```js
import { ModuleWithProviders, NgModule } from "@angular/core";
import { CUSTOMERS_AUTH_FILTER_PROVIDER } from "./providers/auth-filter.provider";
@NgModule()
export class CustomersConfigModule {
static forRoot(): ModuleWithProviders<CustomersConfigModule> {
return {
ngModule: CustomersConfigModule,
providers: [CUSTOMERS_AUTH_FILTER_PROVIDER],
};
}
}
```
Now it'll skip the clearing of OAuth storage keys for `LinkedUser` grant_type if any `OAuthErrorEvent` occurs
**Replace with custom implementation**
- Use the `AbstractAuthErrorFilter<T,E>` class for signs of process.
**Example**
`my-auth-error-filter.service.ts`
```js
import { Injectable, signal } from '@angular/core';
import { MyAuthErrorEvent } from 'angular-my-auth-oidc';
import { AbstractAuthErrorFilter, AuthErrorFilter } from '@abp/ng.core';
@Injectable({ providedIn: 'root' })
export class OAuthErrorFilterService extends AbstractAuthErrorFilter<
AuthErrorFilter<MyAuthErrorEvent>,
MyAuthErrorEvent
> {
protected readonly _filters = signal<Array<AuthErrorFilter<MyAuthErrorEvent>>>([]);
readonly filters = this._filters.asReadonly();
get(id: string): AuthErrorFilter<MyAuthErrorEvent> {
return this._filters().find(({ id: _id }) => _id === id);
}
add(filter: AuthErrorFilter<MyAuthErrorEvent>): void {
this._filters.update(items => [...items, filter]);
}
patch(item: Partial<AuthErrorFilter<MyAuthErrorEvent>>): void {
const _item = this.filters().find(({ id }) => id === item.id);
if (!_item) {
return;
}
Object.assign(_item, item);
}
remove(id: string): void {
const item = this.filters().find(({ id: _id }) => _id === id);
if (!item) {
return;
}
this._filters.update(items => items.filter(({ id: _id }) => _id !== id));
}
run(event: MyAuthErrorEvent): boolean {
return this.filters()
.filter(({ executable }) => !!executable)
.map(({ execute }) => execute(event))
.some(item => item);
}
}
```

134
docs/en/UI/Angular/Component-Replacement.md

@ -77,6 +77,140 @@ export class AppComponent {
![Layout Components](./images/layout-components.png) ![Layout Components](./images/layout-components.png)
### How to Add a New Layout Component
To add a new layout component, you need to follow these steps:
#### Step 1: Create a New Angular Component
This component should have a 'router-outlet' for dynamic content loading. You can create a new component using the Angular CLI. Run the following command in your terminal:
```bash
ng generate component new-layout
```
This command will create a new component named `new-layout`. Now, open the new-layout.component.html file and add a `router-outlet` to it:
```html
<router-outlet></router-outlet>
```
This 'router-outlet' will act as a placeholder that Angular dynamically fills based on the current router state.
note: (don't forget: you should add the app in the app.module.ts file)
#### Step 2: Define a Variable for the Layout Component
Although this step is optional, it can be useful if you're going to use the layout component's value multiple times. You can define a variable for the layout component like this:
```javascript
export const eCustomLayout = {
key: 'CustomLayout',
component: 'CustomLayoutComponent',
};
```
In this variable, `key` is a unique identifier for the layout component, and `component` is the name of the layout component.
You can use this variable when you need to refer to the layout component.
#### Step 3: Add the Layout Component to the ABP Replaceable-System
Next, you need to add the new layout component to the `ReplaceableComponentsService`. This service allows you to replace a component with another one dynamically.
You can do this by defining a provider for `APP_INITIALIZER` that uses a factory function. In this function, you inject the `ReplaceableComponentsService` and use its `add` method to add the new layout component.
Here's how you can do it:
```javascript
export const CUSTOM_LAYOUT_PROVIDERS = [
{ provide: APP_INITIALIZER, useFactory: configureLayoutFn, deps: [ReplaceableComponentsService], multi: true },
];
function configureLayoutFn() {
const service= inject( ReplaceableComponentsService)
return () =>{
service.add({
key: eCustomLayout.component,
component: CustomLayoutComponent,
})
}
}
```
In this code, `configureLayoutFn` is a factory function that adds the new layout component to the `ReplaceableComponentsService`. The `APP_INITIALIZER` provider runs this function when the application starts.
note: (don't forget: you should add the CUSTOM_LAYOUT_PROVIDERS in the app.module.ts file)
#### Step 4: Define the Application's Dynamic Layouts
Finally, you need to define the application's dynamic layouts. This is a map where the keys are the layout keys and the values are the layout components.
You can add the new layout to the existing layouts like this:
```javascript
export const myDynamicLayouts = new Map<string, string>([...DEFAULT_DYNAMIC_LAYOUTS, [eCustomLayout.key, eCustomLayout.component]]);
```
#### Step 5: Pass the Dynamic Layouts to the CoreModule
The final step is to pass the dynamic layouts to the `CoreModule` using the `forRoot` method. This method allows you to configure the module with a static method.
Here's how you can do it:
```javascript
@NgModule({
declarations: [AppComponent],
imports: [
// other imports...
CoreModule.forRoot({
dynamicLayouts: myDynamicLayouts,
environment,
registerLocaleFn: registerLocale(),
}),
// other imports...
NewLayoutComponent
],
providers: [APP_ROUTE_PROVIDER, CUSTOM_LAYOUT_PROVIDERS],
bootstrap: [AppComponent],
})
export class AppModule {}
```
In this code, `myDynamicLayouts` is the map of dynamic layouts you defined earlier. We pass this map to the `CoreModule` using the `forRoot` method.
Now that you have defined the new layout, you can use it in the router definition. You do this by adding a new route that uses the new layout.
Here's how you can do it:
```javascript
// route.provider.ts
import { eCustomLayout } from './custom-layout/custom-layout.provider';
import { RoutesService, eLayoutType } from '@abp/ng.core';
import { APP_INITIALIZER } from '@angular/core';
export const APP_ROUTE_PROVIDER = [
{ provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true },
];
function configureRoutes(routes: RoutesService) {
return () => {
routes.add([
{
path: '/',
name: '::Menu:Home',
iconClass: 'fas fa-home',
order: 1,
layout: eLayoutType.application,
},
{
path: '/dashboard',
name: '::Menu:Dashboard',
iconClass: 'fas fa-chart-line',
order: 2,
layout: eCustomLayout.key as eLayoutType,
requiredPolicy: 'MyProjectName.Dashboard.Host || MyProjectName.Dashboard.Tenant',
},
]);
};
}
```
#### How to Replace LogoComponent #### How to Replace LogoComponent
![LogoComponent](./images/logo-component.png) ![LogoComponent](./images/logo-component.png)

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`. * `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-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`. * `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 `-` * `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"` * 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`. * `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`. * `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`. * `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 `-`. * `dateSeparator`: Sets a character to separate start and end dates. The default value is `-`.
* `startDateName`: Sets the name of the hidden start date input. * `startDateName`: Sets the name of the hidden start date input.
* `endDateName`: Sets the name of the hidden end date input. * `endDateName`: Sets the name of the hidden end date input.

7
framework/Volo.Abp.sln

@ -463,6 +463,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.SkiaSharp"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.SkiaSharp.Tests", "test\Volo.Abp.Imaging.SkiaSharp.Tests\Volo.Abp.Imaging.SkiaSharp.Tests.csproj", "{DFAF8763-D1D6-4EB4-B459-20E31007FE2F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.SkiaSharp.Tests", "test\Volo.Abp.Imaging.SkiaSharp.Tests\Volo.Abp.Imaging.SkiaSharp.Tests.csproj", "{DFAF8763-D1D6-4EB4-B459-20E31007FE2F}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.RemoteServices.Tests", "test\Volo.Abp.RemoteServices.Tests\Volo.Abp.RemoteServices.Tests.csproj", "{DACD4485-61BE-4DE5-ACAE-4FFABC122500}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -1381,6 +1383,10 @@ Global
{DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Debug|Any CPU.Build.0 = Debug|Any CPU {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|Any CPU.ActiveCfg = Release|Any CPU {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|Any CPU.Build.0 = Release|Any CPU {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|Any CPU.Build.0 = Release|Any CPU
{DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -1614,6 +1620,7 @@ Global
{F19A6E0C-F719-4ED9-A024-14E4B8D40883} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {F19A6E0C-F719-4ED9-A024-14E4B8D40883} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{198683D0-7DC6-40F2-B81B-8E446E70A9DE} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {198683D0-7DC6-40F2-B81B-8E446E70A9DE} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{DFAF8763-D1D6-4EB4-B459-20E31007FE2F} = {447C8A77-E5F0-4538-8687-7383196D04EA} {DFAF8763-D1D6-4EB4-B459-20E31007FE2F} = {447C8A77-E5F0-4538-8687-7383196D04EA}
{DACD4485-61BE-4DE5-ACAE-4FFABC122500} = {447C8A77-E5F0-4538-8687-7383196D04EA}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}

3
framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientCacheOptions.cs

@ -4,13 +4,10 @@ namespace Volo.Abp.AspNetCore.Mvc.Client;
public class AbpAspNetCoreMvcClientCacheOptions public class AbpAspNetCoreMvcClientCacheOptions
{ {
public TimeSpan TenantConfigurationCacheAbsoluteExpiration { get; set; }
public TimeSpan ApplicationConfigurationDtoCacheAbsoluteExpiration { get; set; } public TimeSpan ApplicationConfigurationDtoCacheAbsoluteExpiration { get; set; }
public AbpAspNetCoreMvcClientCacheOptions() public AbpAspNetCoreMvcClientCacheOptions()
{ {
TenantConfigurationCacheAbsoluteExpiration = TimeSpan.FromMinutes(5);
ApplicationConfigurationDtoCacheAbsoluteExpiration = TimeSpan.FromSeconds(300); ApplicationConfigurationDtoCacheAbsoluteExpiration = TimeSpan.FromSeconds(300);
} }
} }

1
framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/AbpAspNetCoreMvcClientModule.cs

@ -18,7 +18,6 @@ public class AbpAspNetCoreMvcClientModule : AbpModule
{ {
Configure<AbpAspNetCoreMvcClientCacheOptions>(options => Configure<AbpAspNetCoreMvcClientCacheOptions>(options =>
{ {
options.TenantConfigurationCacheAbsoluteExpiration = TimeSpan.FromSeconds(5);
options.ApplicationConfigurationDtoCacheAbsoluteExpiration = TimeSpan.FromSeconds(5); options.ApplicationConfigurationDtoCacheAbsoluteExpiration = TimeSpan.FromSeconds(5);
}); });
} }

118
framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcRemoteTenantStore.cs

@ -1,10 +1,8 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Pages.Abp.MultiTenancy.ClientProxies; using Pages.Abp.MultiTenancy.ClientProxies;
using Volo.Abp.AspNetCore.Mvc.MultiTenancy;
using Volo.Abp.Caching; using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
@ -16,13 +14,13 @@ public class MvcRemoteTenantStore : ITenantStore, ITransientDependency
{ {
protected AbpTenantClientProxy TenantAppService { get; } protected AbpTenantClientProxy TenantAppService { get; }
protected IHttpContextAccessor HttpContextAccessor { get; } protected IHttpContextAccessor HttpContextAccessor { get; }
protected IDistributedCache<TenantConfiguration> Cache { get; } protected IDistributedCache<TenantConfigurationCacheItem> Cache { get; }
protected AbpAspNetCoreMvcClientCacheOptions Options { get; } protected AbpAspNetCoreMvcClientCacheOptions Options { get; }
public MvcRemoteTenantStore( public MvcRemoteTenantStore(
AbpTenantClientProxy tenantAppService, AbpTenantClientProxy tenantAppService,
IHttpContextAccessor httpContextAccessor, IHttpContextAccessor httpContextAccessor,
IDistributedCache<TenantConfiguration> cache, IDistributedCache<TenantConfigurationCacheItem> cache,
IOptions<AbpAspNetCoreMvcClientCacheOptions> options) IOptions<AbpAspNetCoreMvcClientCacheOptions> options)
{ {
TenantAppService = tenantAppService; TenantAppService = tenantAppService;
@ -33,129 +31,101 @@ public class MvcRemoteTenantStore : ITenantStore, ITransientDependency
public async Task<TenantConfiguration?> FindAsync(string name) public async Task<TenantConfiguration?> FindAsync(string name)
{ {
var cacheKey = CreateCacheKey(name); var cacheKey = TenantConfigurationCacheItem.CalculateCacheKey(name);
var httpContext = HttpContextAccessor?.HttpContext; var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext != null && httpContext.Items[cacheKey] is TenantConfiguration tenantConfiguration) if (httpContext != null && httpContext.Items[cacheKey] is TenantConfigurationCacheItem tenantConfigurationInHttpContext)
{ {
return tenantConfiguration; return tenantConfigurationInHttpContext?.Value;
} }
tenantConfiguration = (await Cache.GetOrAddAsync( var tenantConfiguration = await Cache.GetAsync(cacheKey);
cacheKey, if (tenantConfiguration == null)
async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name))!, {
() => new DistributedCacheEntryOptions await TenantAppService.FindTenantByNameAsync(name);
{ tenantConfiguration = await Cache.GetAsync(cacheKey);
AbsoluteExpirationRelativeToNow = Options.TenantConfigurationCacheAbsoluteExpiration }
}
))!;
if (httpContext != null) if (httpContext != null)
{ {
httpContext.Items[cacheKey] = tenantConfiguration; httpContext.Items[cacheKey] = tenantConfiguration;
} }
return tenantConfiguration; return tenantConfiguration?.Value;
} }
public async Task<TenantConfiguration?> FindAsync(Guid id) public async Task<TenantConfiguration?> FindAsync(Guid id)
{ {
var cacheKey = CreateCacheKey(id); var cacheKey = TenantConfigurationCacheItem.CalculateCacheKey(id);
var httpContext = HttpContextAccessor?.HttpContext; var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext != null && httpContext.Items[cacheKey] is TenantConfiguration tenantConfiguration) if (httpContext != null && httpContext.Items[cacheKey] is TenantConfigurationCacheItem tenantConfigurationInHttpContext)
{ {
return tenantConfiguration; return tenantConfigurationInHttpContext?.Value;
} }
tenantConfiguration = (await Cache.GetOrAddAsync( var tenantConfiguration = await Cache.GetAsync(cacheKey);
cacheKey, if (tenantConfiguration == null)
async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id))!, {
() => new DistributedCacheEntryOptions await TenantAppService.FindTenantByIdAsync(id);
{ tenantConfiguration = await Cache.GetAsync(cacheKey);
AbsoluteExpirationRelativeToNow = Options.TenantConfigurationCacheAbsoluteExpiration }
}
))!;
if (httpContext != null) if (httpContext != null)
{ {
httpContext.Items[cacheKey] = tenantConfiguration; httpContext.Items[cacheKey] = tenantConfiguration;
} }
return tenantConfiguration; return tenantConfiguration?.Value;
} }
public TenantConfiguration Find(string name) public TenantConfiguration? Find(string name)
{ {
var cacheKey = CreateCacheKey(name); var cacheKey = TenantConfigurationCacheItem.CalculateCacheKey(name);
var httpContext = HttpContextAccessor?.HttpContext; var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext != null && httpContext.Items[cacheKey] is TenantConfiguration tenantConfiguration) if (httpContext != null && httpContext.Items[cacheKey] is TenantConfigurationCacheItem tenantConfigurationInHttpContext)
{ {
return tenantConfiguration; return tenantConfigurationInHttpContext?.Value;
} }
tenantConfiguration = Cache.GetOrAdd( var tenantConfiguration = Cache.Get(cacheKey);
cacheKey, if (tenantConfiguration == null)
() => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name))!), {
() => new DistributedCacheEntryOptions AsyncHelper.RunSync(async () => await TenantAppService.FindTenantByNameAsync(name));
{ tenantConfiguration = Cache.Get(cacheKey);
AbsoluteExpirationRelativeToNow = Options.TenantConfigurationCacheAbsoluteExpiration }
}
)!;
if (httpContext != null) if (httpContext != null)
{ {
httpContext.Items[cacheKey] = tenantConfiguration; httpContext.Items[cacheKey] = tenantConfiguration;
} }
return tenantConfiguration; return tenantConfiguration?.Value;
} }
public TenantConfiguration Find(Guid id) public TenantConfiguration? Find(Guid id)
{ {
var cacheKey = CreateCacheKey(id); var cacheKey = TenantConfigurationCacheItem.CalculateCacheKey(id);
var httpContext = HttpContextAccessor?.HttpContext; var httpContext = HttpContextAccessor?.HttpContext;
if (httpContext != null && httpContext.Items[cacheKey] is TenantConfiguration tenantConfiguration) if (httpContext != null && httpContext.Items[cacheKey] is TenantConfigurationCacheItem tenantConfigurationInHttpContext)
{ {
return tenantConfiguration; return tenantConfigurationInHttpContext?.Value;
} }
tenantConfiguration = Cache.GetOrAdd( var tenantConfiguration = Cache.Get(cacheKey);
cacheKey, if (tenantConfiguration == null)
() => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id))!),
() => new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = Options.TenantConfigurationCacheAbsoluteExpiration
}
)!;
if (httpContext != null)
{ {
httpContext.Items[cacheKey] = tenantConfiguration; AsyncHelper.RunSync(async () => await TenantAppService.FindTenantByIdAsync(id));
tenantConfiguration = Cache.Get(cacheKey);
} }
return tenantConfiguration; if (httpContext != null)
}
protected virtual TenantConfiguration? CreateTenantConfiguration(FindTenantResultDto tenantResultDto)
{
if (!tenantResultDto.Success || tenantResultDto.TenantId == null)
{ {
return null; httpContext.Items[cacheKey] = tenantConfiguration;
} }
return new TenantConfiguration(tenantResultDto.TenantId.Value, tenantResultDto.Name!); return tenantConfiguration?.Value;
}
protected virtual string CreateCacheKey(string tenantName)
{
return $"RemoteTenantStore_Name_{tenantName}";
}
protected virtual string CreateCacheKey(Guid tenantId)
{
return $"RemoteTenantStore_Id_{tenantId:N}";
} }
} }

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; set => _abpDatePickerOptionsImplementation.ParentEl = value;
} }
[Obsolete("Use VisibleDateFormat instead.")]
public string? DateFormat { public string? DateFormat {
get => _abpDatePickerOptionsImplementation.DateFormat; get => _abpDatePickerOptionsImplementation.DateFormat;
set => _abpDatePickerOptionsImplementation.DateFormat = value; 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 { public bool OpenButton {
get => _abpDatePickerOptionsImplementation.OpenButton; get => _abpDatePickerOptionsImplementation.OpenButton;
set => _abpDatePickerOptionsImplementation.OpenButton = value; set => _abpDatePickerOptionsImplementation.OpenButton = value;
} }
public bool ClearButton { public bool? ClearButton {
get => _abpDatePickerOptionsImplementation.ClearButton; get => _abpDatePickerOptionsImplementation.ClearButton;
set => _abpDatePickerOptionsImplementation.ClearButton = value; 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 var openButtonContent = TagHelper.OpenButton
? await ProcessButtonAndGetContentAsync(context, output, "calendar", "open") ? 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) ? 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); 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()) 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? LinkedCalendars { get; set; }
public bool? AutoUpdateInput { get; set; } public bool? AutoUpdateInput { get; set; }
public string? ParentEl { get; set; } public string? ParentEl { get; set; }
[Obsolete("Use VisibleDateFormat instead.")]
public string? DateFormat { get; set; } public string? DateFormat { get; set; }
public string? VisibleDateFormat { get; set; }
public string? InputDateFormat { get; set; }
public bool OpenButton { get; set; } = true; 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 SingleOpenAndClearButton { get; set; } = true;
public bool? IsUtc { get; set; } public bool? IsUtc { get; set; }
public bool? IsIso { 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) protected override void AddBaseTagAttributes(TagHelperAttributeList attributes)
{ {
if (TagHelper.AspForStart != null && if (TagHelper.AspForStart?.Model != null &&
TagHelper.AspForStart.Model != null &&
SupportedInputTypes.TryGetValue(TagHelper.AspForStart.Metadata.ModelType, out var convertFuncStart)) 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 && if (TagHelper.AspForEnd?.Model != null &&
TagHelper.AspForEnd.Model != null &&
SupportedInputTypes.TryGetValue(TagHelper.AspForEnd.Metadata.ModelType, out var convertFuncEnd)) 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> /// </summary>
string? ParentEl { get; set; } string? ParentEl { get; set; }
[Obsolete("Use VisibleDateFormat instead.")]
string? DateFormat { get; set; } 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 OpenButton { get; set; }
bool ClearButton { get; set; } bool? ClearButton { get; set; }
bool SingleOpenAndClearButton { 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", "culture": "zh-Hans",
"texts": { "texts": {
"GivenTenantIsNotExist": "给定的租户不存在: {0}", "GivenTenantIsNotExist": "给定租户不存在:{0}",
"GivenTenantIsNotAvailable": "给定的租户不可用: {0}", "GivenTenantIsNotAvailable": "给定租户不可用:{0}",
"Tenant": "租户", "Tenant": "租户",
"Switch": "切换", "Switch": "切换",
"Name": "名称", "Name": "名称",
"SwitchTenantHint": "将名称字段留空以切换到宿主端.", "SwitchTenantHint": "将名称字段留空以切换到主机端。",
"SwitchTenant": "切换租户", "SwitchTenant": "切换租户",
"NotSelected": "未选中" "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/bootstrap/modal-manager.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.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/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){ abp.dom.initializers.initializeAbpCspStyles = function ($abpCspStyles){
$abpCspStyles.attr("rel", "stylesheet"); $abpCspStyles.attr("rel", "stylesheet");
@ -769,7 +211,6 @@
abp.dom.initializers.initializeScript(args.$el); abp.dom.initializers.initializeScript(args.$el);
abp.dom.initializers.initializeAutocompleteSelects(args.$el.findWithSelf('.auto-complete-select')); abp.dom.initializers.initializeAutocompleteSelects(args.$el.findWithSelf('.auto-complete-select'));
abp.dom.initializers.initializeAbpCspStyles($("link[abp-csp-style]")); abp.dom.initializers.initializeAbpCspStyles($("link[abp-csp-style]"));
abp.dom.initializers.initializeDateRangePickers(args.$el);
}); });
abp.dom.onNodeRemoved(function (args) { abp.dom.onNodeRemoved(function (args) {
@ -788,7 +229,6 @@
abp.dom.initializers.initializePopovers($('[data-bs-toggle="popover"]')); abp.dom.initializers.initializePopovers($('[data-bs-toggle="popover"]'));
abp.dom.initializers.initializeTimeAgos($('.timeago')); abp.dom.initializers.initializeTimeAgos($('.timeago'));
abp.dom.initializers.initializeDatepickers($(document)); abp.dom.initializers.initializeDatepickers($(document));
abp.dom.initializers.initializeDateRangePickers($(document));
abp.dom.initializers.initializeForms($('form')); abp.dom.initializers.initializeForms($('form'));
abp.dom.initializers.initializeAutocompleteSelects($('.auto-complete-select')); abp.dom.initializers.initializeAutocompleteSelects($('.auto-complete-select'));
$('[data-auto-focus="true"]').first().findWithSelf('input,select').focus(); $('[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);

22
framework/src/Volo.Abp.AspNetCore.Mvc/Microsoft/Extensions/DependencyInjection/AbpApiVersioningExtensions.cs

@ -1,8 +1,7 @@
using System; using System;
using System.Linq; using System.Linq;
using Microsoft.AspNetCore.Mvc; using Asp.Versioning;
using Microsoft.AspNetCore.Mvc.ApplicationModels; using Asp.Versioning.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Versioning;
using Volo.Abp.ApiVersioning; using Volo.Abp.ApiVersioning;
using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.Conventions; using Volo.Abp.AspNetCore.Mvc.Conventions;
@ -12,32 +11,37 @@ namespace Microsoft.Extensions.DependencyInjection;
public static class AbpApiVersioningExtensions public static class AbpApiVersioningExtensions
{ {
public static IServiceCollection AddAbpApiVersioning(this IServiceCollection services, Action<ApiVersioningOptions> setupAction) public static IServiceCollection AddAbpApiVersioning(
this IServiceCollection services,
Action<ApiVersioningOptions>? apiVersioningOptionsSetupAction = null,
Action<MvcApiVersioningOptions>? mvcApiVersioningOptionsSetupAction = null)
{ {
services.AddTransient<IRequestedApiVersion, HttpContextRequestedApiVersion>(); services.AddTransient<IRequestedApiVersion, HttpContextRequestedApiVersion>();
services.AddTransient<IApiControllerSpecification, AbpConventionalApiControllerSpecification>(); services.AddTransient<IApiControllerSpecification, AbpConventionalApiControllerSpecification>();
services.AddApiVersioning(setupAction); apiVersioningOptionsSetupAction ??= _ => { };
mvcApiVersioningOptionsSetupAction ??= _ => { };
services.AddApiVersioning(apiVersioningOptionsSetupAction).AddMvc(mvcApiVersioningOptionsSetupAction);
return services; return services;
} }
public static void ConfigureAbp(this ApiVersioningOptions options, AbpAspNetCoreMvcOptions mvcOptions) public static void ConfigureAbp(this MvcApiVersioningOptions options, AbpAspNetCoreMvcOptions mvcOptions)
{ {
foreach (var setting in mvcOptions.ConventionalControllers.ConventionalControllerSettings) foreach (var setting in mvcOptions.ConventionalControllers.ConventionalControllerSettings)
{ {
if (setting.ApiVersionConfigurer == null) if (setting.MvcApiVersioningConfigurer == null)
{ {
ConfigureApiVersionsByConvention(options, setting); ConfigureApiVersionsByConvention(options, setting);
} }
else else
{ {
setting.ApiVersionConfigurer.Invoke(options); setting.MvcApiVersioningConfigurer.Invoke(options);
} }
} }
} }
private static void ConfigureApiVersionsByConvention(ApiVersioningOptions options, ConventionalControllerSetting setting) private static void ConfigureApiVersionsByConvention(MvcApiVersioningOptions options, ConventionalControllerSetting setting)
{ {
foreach (var controllerType in setting.ControllerTypes) foreach (var controllerType in setting.ControllerTypes)
{ {

2
framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj

@ -31,7 +31,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" /> <PackageReference Include="Asp.Versioning.Mvc" />
</ItemGroup> </ItemGroup>
</Project> </Project>

5
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs

@ -2,19 +2,16 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text; using Asp.Versioning;
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Versioning;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.Application.Services;
using Volo.Abp.AspNetCore.Mvc.Conventions; using Volo.Abp.AspNetCore.Mvc.Conventions;
using Volo.Abp.AspNetCore.Mvc.Utils; using Volo.Abp.AspNetCore.Mvc.Utils;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;

1
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpConventionalApiControllerSpecification.cs

@ -1,3 +1,4 @@
using Asp.Versioning.ApplicationModels;
using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;

13
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalControllerSetting.cs

@ -1,12 +1,11 @@
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Versioning;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Asp.Versioning;
using Volo.Abp.Reflection; using Volo.Abp.Reflection;
namespace Volo.Abp.AspNetCore.Mvc.Conventions; namespace Volo.Abp.AspNetCore.Mvc.Conventions;
@ -60,7 +59,7 @@ public class ConventionalControllerSetting
public List<ApiVersion> ApiVersions { get; } public List<ApiVersion> ApiVersions { get; }
public Action<ApiVersioningOptions>? ApiVersionConfigurer { get; set; } public Action<MvcApiVersioningOptions>? MvcApiVersioningConfigurer { get; set; }
public ConventionalControllerSetting( public ConventionalControllerSetting(
[NotNull] Assembly assembly, [NotNull] Assembly assembly,
@ -87,7 +86,7 @@ public class ConventionalControllerSetting
ControllerTypes.Add(type); ControllerTypes.Add(type);
} }
} }
public IReadOnlyList<Type> GetControllerTypes() public IReadOnlyList<Type> GetControllerTypes()
{ {
return ControllerTypes.ToImmutableList(); return ControllerTypes.ToImmutableList();
@ -113,14 +112,14 @@ public class ConventionalControllerSetting
return false; return false;
} }
private bool IsPreferredApplicationServiceType(Type type) private bool IsPreferredApplicationServiceType(Type type)
{ {
if (ApplicationServiceTypes == ApplicationServiceTypes.ApplicationServices) if (ApplicationServiceTypes == ApplicationServiceTypes.ApplicationServices)
{ {
return !IntegrationServiceAttribute.IsDefinedOrInherited(type); return !IntegrationServiceAttribute.IsDefinedOrInherited(type);
} }
if (ApplicationServiceTypes == ApplicationServiceTypes.IntegrationServices) if (ApplicationServiceTypes == ApplicationServiceTypes.IntegrationServices)
{ {
return IntegrationServiceAttribute.IsDefinedOrInherited(type); return IntegrationServiceAttribute.IsDefinedOrInherited(type);
@ -128,4 +127,4 @@ public class ConventionalControllerSetting
return true; return true;
} }
} }

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

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

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

@ -24,6 +24,7 @@
<PackageReference Include="Polly.Extensions.Http" /> <PackageReference Include="Polly.Extensions.Http" />
<PackageReference Include="LibGit2Sharp" /> <PackageReference Include="LibGit2Sharp" />
<PackageReference Include="StackExchange.Redis" /> <PackageReference Include="StackExchange.Redis" />
<PackageReference Include="DeepL.net" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

46
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs

@ -29,6 +29,7 @@ public class CliService : ITransientDependency
protected IServiceScopeFactory ServiceScopeFactory { get; } protected IServiceScopeFactory ServiceScopeFactory { get; }
protected PackageVersionCheckerService PackageVersionCheckerService { get; } protected PackageVersionCheckerService PackageVersionCheckerService { get; }
public ICmdHelper CmdHelper { get; } public ICmdHelper CmdHelper { get; }
protected CliVersionService CliVersionService { get; }
public CliService( public CliService(
ICommandLineArgumentParser commandLineArgumentParser, ICommandLineArgumentParser commandLineArgumentParser,
@ -36,7 +37,8 @@ public class CliService : ITransientDependency
IServiceScopeFactory serviceScopeFactory, IServiceScopeFactory serviceScopeFactory,
PackageVersionCheckerService nugetService, PackageVersionCheckerService nugetService,
ICmdHelper cmdHelper, ICmdHelper cmdHelper,
MemoryService memoryService) MemoryService memoryService,
CliVersionService cliVersionService)
{ {
_memoryService = memoryService; _memoryService = memoryService;
CommandLineArgumentParser = commandLineArgumentParser; CommandLineArgumentParser = commandLineArgumentParser;
@ -44,13 +46,14 @@ public class CliService : ITransientDependency
ServiceScopeFactory = serviceScopeFactory; ServiceScopeFactory = serviceScopeFactory;
PackageVersionCheckerService = nugetService; PackageVersionCheckerService = nugetService;
CmdHelper = cmdHelper; CmdHelper = cmdHelper;
CliVersionService = cliVersionService;
Logger = NullLogger<CliService>.Instance; Logger = NullLogger<CliService>.Instance;
} }
public async Task RunAsync(string[] args) public async Task RunAsync(string[] args)
{ {
var currentCliVersion = await GetCurrentCliVersionInternalAsync(typeof(CliService).Assembly); var currentCliVersion = await CliVersionService.GetCurrentCliVersionAsync();
Logger.LogInformation($"ABP CLI {currentCliVersion}"); Logger.LogInformation($"ABP CLI {currentCliVersion}");
var commandLineArgs = CommandLineArgumentParser.Parse(args); var commandLineArgs = CommandLineArgumentParser.Parse(args);
@ -248,41 +251,6 @@ public class CliService : ITransientDependency
return assembly.Location.Substring(0, assembly.Location.IndexOf(".store", StringComparison.Ordinal)); return assembly.Location.Substring(0, assembly.Location.IndexOf(".store", StringComparison.Ordinal));
} }
public async Task<SemanticVersion> GetCurrentCliVersionAsync(Assembly assembly)
{
return await GetCurrentCliVersionInternalAsync(assembly);
}
private async Task<SemanticVersion> GetCurrentCliVersionInternalAsync(Assembly assembly)
{
SemanticVersion currentCliVersion = default;
var consoleOutput = new StringReader(CmdHelper.RunCmdAndGetOutput($"dotnet tool list -g", out int exitCode));
string line;
while ((line = await consoleOutput.ReadLineAsync()) != null)
{
if (line.StartsWith("volo.abp.cli", StringComparison.InvariantCultureIgnoreCase))
{
var version = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)[1];
SemanticVersion.TryParse(version, out currentCliVersion);
break;
}
}
if (currentCliVersion == null)
{
// If not a tool executable, fallback to assembly version and treat as dev without updates
// Assembly revisions are not supported by SemVer scheme required for NuGet, trim to {major}.{minor}.{patch}
var assemblyVersion = string.Join(".", assembly.GetFileVersion().Split('.').Take(3));
return SemanticVersion.Parse(assemblyVersion + "-dev");
}
return currentCliVersion;
}
private UpdateChannel GetUpdateChannel(SemanticVersion currentCliVersion) private UpdateChannel GetUpdateChannel(SemanticVersion currentCliVersion)
{ {
if (!currentCliVersion.IsPrerelease) if (!currentCliVersion.IsPrerelease)
@ -332,12 +300,12 @@ public class CliService : ITransientDependency
var toolPathArg = IsGlobalTool(toolPath) ? "-g" : $"--tool-path {toolPath}"; var toolPathArg = IsGlobalTool(toolPath) ? "-g" : $"--tool-path {toolPath}";
Logger.LogWarning($"A newer {updateChannel.ToString().ToLowerInvariant()} version of the ABP CLI is available: {latestVersion}."); Logger.LogWarning($"A newer {updateChannel.ToString().ToLowerInvariant()} version of the ABP CLI is available: {latestVersion}.");
if (!string.IsNullOrWhiteSpace(message)) if (!string.IsNullOrWhiteSpace(message))
{ {
Logger.LogWarning(message); Logger.LogWarning(message);
} }
Logger.LogWarning(string.Empty); Logger.LogWarning(string.Empty);
Logger.LogWarning("Update Command: "); Logger.LogWarning("Update Command: ");

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

9
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.Module;
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule; using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
using Volo.Abp.Cli.Utils; using Volo.Abp.Cli.Utils;
using Volo.Abp.Cli.Version;
using Volo.Abp.EventBus.Local; using Volo.Abp.EventBus.Local;
namespace Volo.Abp.Cli.Commands; namespace Volo.Abp.Cli.Commands;
@ -42,6 +43,8 @@ public abstract class ProjectCreationCommandBase
public ThemePackageAdder ThemePackageAdder { get; } public ThemePackageAdder ThemePackageAdder { get; }
public AngularThemeConfigurer AngularThemeConfigurer { get; } public AngularThemeConfigurer AngularThemeConfigurer { get; }
public CliVersionService CliVersionService { get; }
public ProjectCreationCommandBase( public ProjectCreationCommandBase(
ConnectionStringProvider connectionStringProvider, ConnectionStringProvider connectionStringProvider,
@ -54,7 +57,8 @@ public abstract class ProjectCreationCommandBase
ThemePackageAdder themePackageAdder, ThemePackageAdder themePackageAdder,
ILocalEventBus eventBus, ILocalEventBus eventBus,
IBundlingService bundlingService, IBundlingService bundlingService,
AngularThemeConfigurer angularThemeConfigurer) AngularThemeConfigurer angularThemeConfigurer,
CliVersionService cliVersionService)
{ {
_bundlingService = bundlingService; _bundlingService = bundlingService;
ConnectionStringProvider = connectionStringProvider; ConnectionStringProvider = connectionStringProvider;
@ -67,6 +71,7 @@ public abstract class ProjectCreationCommandBase
EventBus = eventBus; EventBus = eventBus;
ThemePackageAdder = themePackageAdder; ThemePackageAdder = themePackageAdder;
AngularThemeConfigurer = angularThemeConfigurer; AngularThemeConfigurer = angularThemeConfigurer;
CliVersionService = cliVersionService;
Logger = NullLogger<NewCommand>.Instance; Logger = NullLogger<NewCommand>.Instance;
} }
@ -86,7 +91,7 @@ public abstract class ProjectCreationCommandBase
Logger.LogInformation("Preview: yes"); Logger.LogInformation("Preview: yes");
#if !DEBUG #if !DEBUG
var cliVersion = await CliService.GetCurrentCliVersionAsync(typeof(CliService).Assembly); var cliVersion = await CliVersionService.GetCurrentCliVersionAsync();
if (!cliVersion.IsPrerelease) if (!cliVersion.IsPrerelease)
{ {

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

@ -5,6 +5,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using DeepL;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
@ -16,64 +17,61 @@ namespace Volo.Abp.Cli.Commands;
public class TranslateCommand : IConsoleCommand, ITransientDependency public class TranslateCommand : IConsoleCommand, ITransientDependency
{ {
public const string Name = "translate"; public const string Name = "translate";
public ILogger<TranslateCommand> Logger { get; set; } public ILogger<TranslateCommand> Logger { get; set; }
public Task ExecuteAsync(CommandLineArgs commandLineArgs) public async Task ExecuteAsync(CommandLineArgs commandLineArgs)
{ {
var currentDirectory = Directory.GetCurrentDirectory(); var currentDirectory = Directory.GetCurrentDirectory();
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 apply = commandLineArgs.Options.ContainsKey(Options.Apply.Short) || commandLineArgs.Options.ContainsKey(Options.Apply.Long); // Apply abp-translation.json file
if (apply) if (commandLineArgs.Options.ContainsKey(Options.Apply.Short) || commandLineArgs.Options.ContainsKey(Options.Apply.Long))
{ {
var inputFile = Path.Combine(currentDirectory, var inputFile = Path.Combine(currentDirectory, commandLineArgs.Options.GetOrNull(Options.File.Short, Options.File.Long) ?? "abp-translation.json");
commandLineArgs.Options.GetOrNull(Options.File.Short, Options.File.Long) await ApplyAbpTranslateInfoAsync(currentDirectory, inputFile);
?? "abp-translation.json"); return;
Logger.LogInformation("Abp translate apply...");
Logger.LogInformation("Input file: " + inputFile);
ApplyAbpTranslateInfo(currentDirectory, inputFile);
} }
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 allValues = commandLineArgs.Options.ContainsKey(Options.AllValues.Short) || var targetCulture = commandLineArgs.Options.GetOrNull(Options.Culture.Short, Options.Culture.Long);
commandLineArgs.Options.ContainsKey(Options.AllValues.Long); if (targetCulture == null)
{
Logger.LogInformation("Abp translate..."); throw new CliUsageException("Target culture is missing!" + Environment.NewLine + Environment.NewLine + GetUsageInfo());
Logger.LogInformation("Target culture: " + targetCulture); }
Logger.LogInformation("Reference culture: " + referenceCulture);
Logger.LogInformation("Output file: " + outputFile);
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); // Generate abp-translation.json file
var outputFile = Path.Combine(currentDirectory, commandLineArgs.Options.GetOrNull(Options.Output.Short, Options.Output.Long) ?? "abp-translation.json");
File.WriteAllText(outputFile, JsonConvert.SerializeObject(translateInfo, Formatting.Indented)); 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; return Task.CompletedTask;
} }
@ -140,8 +138,154 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
return translateInfo; 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); var translateJsonPath = Path.Combine(directory, filename);
if (!File.Exists(translateJsonPath)) if (!File.Exists(translateJsonPath))
{ {
@ -220,6 +364,8 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
File.Delete(translateJsonPath); File.Delete(translateJsonPath);
Logger.LogInformation($"Delete the {translateJsonPath} file, if you need to translate again, please re-run the [abp translate] command."); 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)
@ -357,13 +503,17 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
sb.AppendLine("--all-values|-all Include all keys. Default false"); 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("--apply|-a Creates or updates the file for the translated culture.");
sb.AppendLine("--file|-f <file-name> Default: abp-translation.json"); sb.AppendLine("--file|-f <file-name> Default: abp-translation.json");
sb.AppendLine("--online|-o Translate online.");
sb.AppendLine("--deepl-auth-key <auth-key> DeepL auth key for online translation.");
sb.AppendLine(""); sb.AppendLine("");
sb.AppendLine("Examples:"); sb.AppendLine("Examples:");
sb.AppendLine(""); sb.AppendLine("");
sb.AppendLine(" abp translate -c zh-Hans"); 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 --apply");
sb.AppendLine(" abp translate -a -f my-translation.json"); 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("");
sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI"); sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI");
@ -412,6 +562,16 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
public const string Short = "f"; public const string Short = "f";
public const string Long = "file"; 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 class AbpTranslateInfo 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); 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; return;
} }
@ -92,7 +92,7 @@ public class UpdateCommand : IConsoleCommand, ITransientDependency
await _nugetPackagesVersionUpdater.UpdateProjectAsync(project, checkAll: checkAll, version: version); 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; return;
} }

69
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

@ -12,6 +12,7 @@ using System.Text.Json;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using NuGet.Versioning;
using Volo.Abp.Cli.GitHub; using Volo.Abp.Cli.GitHub;
using Volo.Abp.Cli.Http; using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding.Templates.App; using Volo.Abp.Cli.ProjectBuilding.Templates.App;
@ -19,6 +20,7 @@ using Volo.Abp.Cli.ProjectBuilding.Templates.Console;
using Volo.Abp.Cli.ProjectBuilding.Templates.Maui; using Volo.Abp.Cli.ProjectBuilding.Templates.Maui;
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule; using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
using Volo.Abp.Cli.ProjectBuilding.Templates.Wpf; using Volo.Abp.Cli.ProjectBuilding.Templates.Wpf;
using Volo.Abp.Cli.Version;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Http; using Volo.Abp.Http;
using Volo.Abp.IO; using Volo.Abp.IO;
@ -37,18 +39,21 @@ public class AbpIoSourceCodeStore : ISourceCodeStore, ITransientDependency
protected ICancellationTokenProvider CancellationTokenProvider { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; }
private readonly CliHttpClientFactory _cliHttpClientFactory; private readonly CliHttpClientFactory _cliHttpClientFactory;
protected CliVersionService CliVersionService { get; }
public AbpIoSourceCodeStore( public AbpIoSourceCodeStore(
IOptions<AbpCliOptions> options, IOptions<AbpCliOptions> options,
IJsonSerializer jsonSerializer, IJsonSerializer jsonSerializer,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler, IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
ICancellationTokenProvider cancellationTokenProvider, ICancellationTokenProvider cancellationTokenProvider,
CliHttpClientFactory cliHttpClientFactory) CliHttpClientFactory cliHttpClientFactory,
CliVersionService cliVersionService)
{ {
JsonSerializer = jsonSerializer; JsonSerializer = jsonSerializer;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler; RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
CancellationTokenProvider = cancellationTokenProvider; CancellationTokenProvider = cancellationTokenProvider;
_cliHttpClientFactory = cliHttpClientFactory; _cliHttpClientFactory = cliHttpClientFactory;
CliVersionService = cliVersionService;
Options = options.Value; Options = options.Value;
Logger = NullLogger<AbpIoSourceCodeStore>.Instance; Logger = NullLogger<AbpIoSourceCodeStore>.Instance;
@ -63,8 +68,8 @@ public class AbpIoSourceCodeStore : ISourceCodeStore, ITransientDependency
bool skipCache = false) bool skipCache = false)
{ {
DirectoryHelper.CreateIfNotExists(CliPaths.TemplateCache); DirectoryHelper.CreateIfNotExists(CliPaths.TemplateCache);
var userSpecifiedVersion = version != null;
var latestVersion = version ?? await GetLatestSourceCodeVersionAsync(name, type, null, includePreReleases); var latestVersion = version ?? await GetLatestSourceCodeVersionAsync(name, type, null, includePreReleases);
if (version == null) if (version == null)
{ {
if (latestVersion == null) if (latestVersion == null)
@ -86,14 +91,68 @@ public class AbpIoSourceCodeStore : ISourceCodeStore, ITransientDependency
version = latestVersion; version = latestVersion;
} }
else
var currentCliVersion = await CliVersionService.GetCurrentCliVersionAsync();
var templateVersion = SemanticVersion.Parse(version);
var outputWarning = false;
if (currentCliVersion.Major != templateVersion.Major || currentCliVersion.Minor != templateVersion.Minor)
{
// major and minor version are different
outputWarning = true;
}
else if (currentCliVersion.Major == templateVersion.Major &&
currentCliVersion.Minor == templateVersion.Minor &&
currentCliVersion.Patch < templateVersion.Patch)
{ {
if (!await IsVersionExists(name, version)) // major and minor version are same but patch version is lower
outputWarning = true;
}
else if(currentCliVersion.Major == templateVersion.Major &&
currentCliVersion.Minor == templateVersion.Minor &&
currentCliVersion.Patch == templateVersion.Patch &&
currentCliVersion.IsPrerelease && templateVersion.IsPrerelease)
{
// major and minor and patch version are same but prerelease version may be lower
var cliRcVersion = currentCliVersion.ReleaseLabels.LastOrDefault();
var templateRcVersion = templateVersion.ReleaseLabels.LastOrDefault();
if (cliRcVersion != null && templateRcVersion != null)
{ {
throw new Exception("There is no version found with given version: " + version); if (int.TryParse(cliRcVersion, out var cliRcVersionNumber) && int.TryParse(templateRcVersion, out var templateRcVersionNumber))
{
if (cliRcVersionNumber < templateRcVersionNumber)
{
outputWarning = true;
}
}
} }
} }
if (outputWarning)
{
version = currentCliVersion.ToString();
Logger.LogWarning(userSpecifiedVersion
? $"The specified template version ({templateVersion}) is different than the CLI version ({currentCliVersion}). This may cause compatibility issues."
: $"The latest template version ({templateVersion}) is different than the CLI version ({currentCliVersion}). This may cause compatibility issues.");
Logger.LogWarning("Please upgrade/downgrade the CLI version to the template version.");
Logger.LogWarning($"> dotnet tool uninstall -g volo.abp.cli");
Logger.LogWarning(!templateVersion.IsPrerelease
? $"> dotnet tool install -g volo.abp.cli --version \"{templateVersion.Major}.{templateVersion.Minor}.*\""
: $"> dotnet tool install -g volo.abp.cli --version {templateVersion}");
if (!userSpecifiedVersion)
{
version = currentCliVersion.ToString();
Logger.LogWarning($"We have changed the template version as the cli version.");
Logger.LogWarning($"New version: {version}");
}
}
if (!await IsVersionExists(name, version))
{
throw new Exception("There is no version found with given version: " + version);
}
var nugetVersion = (await GetTemplateNugetVersionAsync(name, type, version)) ?? version; var nugetVersion = (await GetTemplateNugetVersionAsync(name, type, version)) ?? version;
if (!string.IsNullOrWhiteSpace(templateSource) && !IsNetworkSource(templateSource)) if (!string.IsNullOrWhiteSpace(templateSource) && !IsNetworkSource(templateSource))

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; packageId = package.Attributes["Include"].Value;
var versionAttribute = package.Attributes["Version"]; var versionAttribute = package.Attributes["Version"];
if (versionAttribute == null)
{
Logger.LogWarning("Package: {PackageId} uses central package management. Skipped!", packageId);
continue;
}
var currentVersion = versionAttribute.Value; var currentVersion = versionAttribute.Value;
var isLeptonXPackage = packageId.Contains("LeptonX"); var isLeptonXPackage = packageId.Contains("LeptonX");
@ -194,17 +199,17 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
var isVersionParsed = SemanticVersion.TryParse(currentVersion, out var currentSemanticVersion); var isVersionParsed = SemanticVersion.TryParse(currentVersion, out var currentSemanticVersion);
if (!isVersionParsed) 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; 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 (!specifiedVersion.IsNullOrWhiteSpace())
{ {
if (isLeptonXPackage || isStudioPackage) 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; continue;
} }
@ -213,17 +218,17 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
var specifiedSemanticVersion = SemanticVersion.Parse(specifiedVersion); var specifiedSemanticVersion = SemanticVersion.Parse(specifiedVersion);
if (specifiedSemanticVersion > currentSemanticVersion) 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; versionAttribute.Value = specifiedVersion;
} }
else 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 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 else
@ -253,18 +258,18 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
if(latestVersion == null) 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; continue;
} }
if (currentVersion != latestVersion) 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; versionAttribute.Value = latestVersion;
} }
else 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 else
@ -285,12 +290,12 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
if (latestVersion != null && (currentSemanticVersion < latestVersion || (currentSemanticVersion.IsPrerelease && switchToStable))) 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(); versionAttribute.Value = latestVersion.ToString();
} }
else 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) 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); Logger.LogException(ex);
} }

9
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/Angular/AngularServiceProxyGenerator.cs

@ -7,6 +7,7 @@ using NuGet.Versioning;
using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.Commands;
using Volo.Abp.Cli.Http; using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.Utils; using Volo.Abp.Cli.Utils;
using Volo.Abp.Cli.Version;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Json; using Volo.Abp.Json;
@ -16,18 +17,18 @@ public class AngularServiceProxyGenerator : ServiceProxyGeneratorBase<AngularSer
{ {
public const string Name = "NG"; public const string Name = "NG";
private readonly CliService _cliService; private readonly CliVersionService _cliVersionService;
private readonly ICmdHelper _cmdhelper; private readonly ICmdHelper _cmdhelper;
public AngularServiceProxyGenerator( public AngularServiceProxyGenerator(
CliHttpClientFactory cliHttpClientFactory, CliHttpClientFactory cliHttpClientFactory,
IJsonSerializer jsonSerializer, IJsonSerializer jsonSerializer,
ICmdHelper cmdhelper, ICmdHelper cmdhelper,
CliService cliService) : CliVersionService cliVersionService) :
base(cliHttpClientFactory, jsonSerializer) base(cliHttpClientFactory, jsonSerializer)
{ {
_cmdhelper = cmdhelper; _cmdhelper = cmdhelper;
_cliService = cliService; _cliVersionService = cliVersionService;
} }
public async override Task GenerateProxyAsync(GenerateProxyArgs args) public async override Task GenerateProxyAsync(GenerateProxyArgs args)
@ -123,7 +124,7 @@ public class AngularServiceProxyGenerator : ServiceProxyGeneratorBase<AngularSer
return; return;
} }
var cliVersion = await _cliService.GetCurrentCliVersionAsync(typeof(CliService).Assembly); var cliVersion = await _cliVersionService.GetCurrentCliVersionAsync();
if (semanticSchematicsVersion < cliVersion) if (semanticSchematicsVersion < cliVersion)
{ {
Logger.LogWarning("\"@abp/ng.schematics\" version is lower than ABP Cli version."); Logger.LogWarning("\"@abp/ng.schematics\" version is lower than ABP Cli version.");

49
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

@ -0,0 +1,49 @@
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using NuGet.Versioning;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.Version;
public class CliVersionService : ITransientDependency
{
private CmdHelper CmdHelper { get; }
public CliVersionService(CmdHelper cmdHelper)
{
CmdHelper = cmdHelper;
}
public async Task<SemanticVersion> GetCurrentCliVersionAsync()
{
SemanticVersion currentCliVersion = default;
var consoleOutput = new StringReader(CmdHelper.RunCmdAndGetOutput($"dotnet tool list -g", out int exitCode));
string line;
while ((line = await consoleOutput.ReadLineAsync()) != null)
{
if (line.StartsWith("volo.abp.cli", StringComparison.InvariantCultureIgnoreCase))
{
var version = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)[1];
SemanticVersion.TryParse(version, out currentCliVersion);
break;
}
}
if (currentCliVersion == null)
{
// If not a tool executable, fallback to assembly version and treat as dev without updates
// Assembly revisions are not supported by SemVer scheme required for NuGet, trim to {major}.{minor}.{patch}
var assemblyVersion = string.Join(".", Assembly.GetExecutingAssembly().GetFileVersion().Split('.').Take(3));
return SemanticVersion.Parse(assemblyVersion + "-dev");
}
return currentCliVersion;
}
}

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

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

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

@ -5,4 +5,4 @@
"Volo.Feature:010002": "必要的功能未启用. 这些功能需要启用: {FeatureNames}", "Volo.Feature:010002": "必要的功能未启用. 这些功能需要启用: {FeatureNames}",
"Volo.Feature:010003": "必要的功能未启用. 需要启用这些功能中的一项:{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", "culture": "zh-Hans",
"texts": { "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": "密码", "DisplayName:Abp.Ldap.Password": "密码",
"Description: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", "culture": "zh-Hans",
"texts": { "texts": {
"DisplayName:Abp.Localization.DefaultLanguage": "默认语言", "DisplayName:Abp.Localization.DefaultLanguage": "默认语言",
"Description:Abp.Localization.DefaultLanguage": "应用程序的默认语言." "Description:Abp.Localization.DefaultLanguage": "应用程序的默认语言"
} }
} }

9
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/IMultiTenantUrlProvider.cs

@ -0,0 +1,9 @@
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.MultiTenancy;
public interface IMultiTenantUrlProvider
{
Task<string> GetUrlAsync(string templateUrl);
}

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

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

43
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantConfigurationCacheItem.cs

@ -0,0 +1,43 @@
using System;
namespace Volo.Abp.MultiTenancy;
[Serializable]
[IgnoreMultiTenancy]
public class TenantConfigurationCacheItem
{
private const string CacheKeyFormat = "i:{0},n:{1}";
public TenantConfiguration? Value { get; set; }
public TenantConfigurationCacheItem()
{
}
public TenantConfigurationCacheItem(TenantConfiguration? value)
{
Value = value;
}
public static string CalculateCacheKey(Guid? id, string? name)
{
if (id == null && name.IsNullOrWhiteSpace())
{
throw new AbpException("Both id and name can't be invalid.");
}
return string.Format(CacheKeyFormat,
id?.ToString() ?? "null",
(name.IsNullOrWhiteSpace() ? "null" : name));
}
public static string CalculateCacheKey(Guid id)
{
return string.Format(CacheKeyFormat, id.ToString(), "null" );
}
public static string CalculateCacheKey(string name)
{
return string.Format(CacheKeyFormat, "null", name);
}
}

78
framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantUrlProvider.cs

@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.MultiTenancy;
public class MultiTenantUrlProvider : IMultiTenantUrlProvider , ITransientDependency
{
public const string TenantPlaceHolder = "{0}";
public const string TenantIdPlaceHolder = "{{tenantId}}";
public const string TenantNamePlaceHolder = "{{tenantName}}";
protected ICurrentTenant CurrentTenant { get; }
protected ITenantStore TenantStore { get; }
public MultiTenantUrlProvider(
ICurrentTenant currentTenant,
ITenantStore tenantStore)
{
CurrentTenant = currentTenant;
TenantStore = tenantStore;
}
public virtual async Task<string> GetUrlAsync(string templateUrl)
{
return await ReplacePlaceHoldersAsync(templateUrl);
}
protected virtual async Task<string> ReplacePlaceHoldersAsync(string templateUrl)
{
templateUrl = await ReplacePlaceHolderAsync(templateUrl, TenantIdPlaceHolder);
templateUrl = await ReplacePlaceHolderAsync(templateUrl, TenantNamePlaceHolder);
templateUrl = await ReplacePlaceHolderAsync(templateUrl, TenantPlaceHolder);
return templateUrl;
}
protected virtual async Task<string> ReplacePlaceHolderAsync(string templateUrl, string placeHolder)
{
if (!templateUrl.Contains(placeHolder))
{
return templateUrl;
}
var placeHolderValue = string.Empty;
if (CurrentTenant.IsAvailable)
{
placeHolderValue = (placeHolder == TenantIdPlaceHolder ? CurrentTenant.Id!.Value.ToString() : await GetCurrentTenantNameAsync()) + ".";
}
if (templateUrl.Contains(placeHolder + '.'))
{
placeHolder += '.';
}
templateUrl = templateUrl.Replace(
placeHolder,
placeHolderValue
);
return templateUrl;
}
protected virtual async Task<string> GetCurrentTenantNameAsync()
{
if (CurrentTenant.Id.HasValue && CurrentTenant.Name.IsNullOrEmpty())
{
var tenantConfiguration = await TenantStore.FindAsync(CurrentTenant.Id.Value);
return tenantConfiguration!.Name;
}
return CurrentTenant.Name!;
}
}

1
framework/src/Volo.Abp.RemoteServices/Volo.Abp.RemoteServices.csproj

@ -18,6 +18,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" /> <ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy.Abstractions\Volo.Abp.MultiTenancy.Abstractions.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

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

Loading…
Cancel
Save