From 5f75f4236a2f618073e058f99af76d0866c4048e Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 5 May 2020 23:19:43 +0800 Subject: [PATCH] Update document --- docs/zh-Hans/Localization.md | 52 +++++++++++++++- docs/zh-Hans/Object-Extensions.md | 100 ++++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Localization.md b/docs/zh-Hans/Localization.md index fce4b14407..1292655e62 100644 --- a/docs/zh-Hans/Localization.md +++ b/docs/zh-Hans/Localization.md @@ -86,6 +86,21 @@ JSON文件位于 "/Localization/Resources/Test" 项目文件夹下, 如下图所 * 每个本地化文件都需要定义 `culture` (文化) 代码 (例如 "en" 或 "en-US"). * `texts` 部分只包含本地化字符串的键值集合 (键也可能有空格). +### 默认资源 + +可以将 `AbpLocalizationOptions.DefaultResourceType` 设置为资源类型,在未指定本地化资源时使用: + +````csharp +Configure(options => +{ + options.DefaultResourceType = typeof(TestResource); +}); +```` + +> [启动模板]](Startup-Templates/Application.md) 设置 `DefaultResourceType` 为应用程序的本地化资源. + +请参阅下面的*客户端*部分获取用例 + ##### 简短的本地化资源名称 本地化资源也可以在客户端(JavaScript)使用. 因此, 为本地化资源设置一个简短的名称可以更方便的本地化文本. 例如: @@ -165,6 +180,10 @@ public class MyService } ```` +##### 格式参数 + +格式参数可以在本地化Key参数后传递,如果你的消息是 `Hello {0}, welcome!`,可以将 `{0}` 传递给localizer,例如: `_localizer["HelloMessage", "John"]`. + ###### 在Razor视图/Page中简单的用法 ````c# @@ -179,7 +198,9 @@ public class MyService ABP提供了JavaScript服务, 可以在客户端使用相同的本地化文本. -获取本地化资源: +#### getResource + +`abp.localization.getResource` 函数用于获取本地化资源: ````js var testResource = abp.localization.getResource('Test'); @@ -191,6 +212,33 @@ var testResource = abp.localization.getResource('Test'); var str = testResource('HelloWorld'); ```` -## See Also +#### 本地化 + +`abp.localization.localize` 函数用于获取本地化文本,你可以传递本地化Key和资源名称: + +````js +var str = abp.localization.localize('HelloWorld', 'Test'); +```` + +`HelloWorld` 是本地化文本的Key, `Test` 是本地化资源的名称. + +如果未指定本地化资源名称,它使用 `AbpLocalizationOptions` 中定义的默认本地化资源(参见上面的*默认资源*部分). 例: + +````js +var str = abp.localization.localize('HelloWorld'); //uses the default resource +```` + +##### 格式参数 + +如果本地化字符串包含参数, 例如 `Hello {0}, welcome!`. 你可以将参数传递给本地化方法. 例: + +````js +var str1 = abp.localization.getResource('Test')('HelloWelcomeMessage', 'John'); +var str2 = abp.localization.localize('HelloWorld', 'Test', 'John'); +```` + +上面的两个示例都会输出 `Hello John, welcome!`. + +## 另请参阅 * [Angular UI中的本地化](UI/Angular/Localization.md) \ No newline at end of file diff --git a/docs/zh-Hans/Object-Extensions.md b/docs/zh-Hans/Object-Extensions.md index a0f1e5534b..f925a8730a 100644 --- a/docs/zh-Hans/Object-Extensions.md +++ b/docs/zh-Hans/Object-Extensions.md @@ -176,6 +176,106 @@ ObjectExtensionManager.Instance `options` 有一个名为 `Configuration` 的字典,该字典存储对象扩展定义甚至可以扩展. EF Core使用它来将其他属性映射到数据库中的表字段. 请参阅[扩展实体文档](Customizing-Application-Modules-Extending-Entities.md). +#### CheckPairDefinitionOnMapping + +控制在映射两个可扩展对象时如何检查属性定义. 请参阅*对象到对象映射*部分,了解 `CheckPairDefinitionOnMapping` 选项. + +## Validation + +你可能要为你定义的额外属性添加一些 **验证规则**. `AddOrUpdateProperty` 方法选项允许进行验证的方法有两种: + +1. 你可以为属性添加 **数据注解 attributes**. +2. 你可以给定一个action(代码块)执行 **自定义验证**. + +当你在**自动验证**的方法(例如:控制器操作,页面处理程序方法,应用程序服务方法...)中使用对象时,验证会工作. 因此,每当扩展对象被验证时,所有额外的属性都会被验证. + +### 数据注解 Attributes + +所有标准的数据注解Attributes对于额外属性都是有效的. 例: + +````csharp +ObjectExtensionManager.Instance + .AddOrUpdateProperty( + "SocialSecurityNumber", + options => + { + options.Attributes.Add(new RequiredAttribute()); + options.Attributes.Add( + new StringLengthAttribute(32) { + MinimumLength = 6 + } + ); + }); +```` + +使用以上配置,如果没有提供有效的 `SocialSecurityNumber` 值, `IdentityUserCreateDto` 对象将是无效的. + +### 自定义验证 + +如果需要,可以添加一个自定义action验证额外属性. 例: + +````csharp +ObjectExtensionManager.Instance + .AddOrUpdateProperty( + "SocialSecurityNumber", + options => + { + options.Validators.Add(context => + { + var socialSecurityNumber = context.Value as string; + + if (socialSecurityNumber == null || + socialSecurityNumber.StartsWith("X")) + { + context.ValidationErrors.Add( + new ValidationResult( + "Invalid social security number: " + socialSecurityNumber, + new[] { "SocialSecurityNumber" } + ) + ); + } + }); + }); +```` + +`context.ServiceProvider` 可以解析服务. + +除了为单个属性添加自定义验证逻辑外,还可以添加在对象级执行的自定义验证逻辑. 例: + +````csharp +ObjectExtensionManager.Instance +.AddOrUpdate(objConfig => +{ + //Define two properties with their own validation rules + + objConfig.AddOrUpdateProperty("Password", propertyConfig => + { + propertyConfig.Attributes.Add(new RequiredAttribute()); + }); + + objConfig.AddOrUpdateProperty("PasswordRepeat", propertyConfig => + { + propertyConfig.Attributes.Add(new RequiredAttribute()); + }); + + //Write a common validation logic works on multiple properties + + objConfig.Validators.Add(context => + { + if (context.ValidatingObject.GetProperty("Password") != + context.ValidatingObject.GetProperty("PasswordRepeat")) + { + context.ValidationErrors.Add( + new ValidationResult( + "Please repeat the same password!", + new[] { "Password", "PasswordRepeat" } + ) + ); + } + }); +}); +```` + ## 对象到对象映射 假设你已向可扩展的实体对象添加了额外的属性并使用了自动[对象到对象的映射](Object-To-Object-Mapping.md)将该实体映射到可扩展的DTO类. 在这种情况下你需要格外小心,因为额外属性可能包含**敏感数据**,这些数据对于客户端不可用.