diff --git a/adev-ja/src/content/guide/forms/dynamic-forms.en.md b/adev-ja/src/content/guide/forms/dynamic-forms.en.md
new file mode 100644
index 0000000000..60d0de0af3
--- /dev/null
+++ b/adev-ja/src/content/guide/forms/dynamic-forms.en.md
@@ -0,0 +1,143 @@
+# Building dynamic forms
+
+Many forms, such as questionnaires, can be very similar to one another in format and intent.
+To make it faster and easier to generate different versions of such a form, you can create a _dynamic form template_ based on metadata that describes the business object model.
+Then, use the template to generate new forms automatically, according to changes in the data model.
+
+The technique is particularly useful when you have a type of form whose content must change frequently to meet rapidly changing business and regulatory requirements.
+A typical use-case is a questionnaire.
+You might need to get input from users in different contexts.
+The format and style of the forms a user sees should remain constant, while the actual questions you need to ask vary with the context.
+
+In this tutorial you will build a dynamic form that presents a basic questionnaire.
+You build an online application for heroes seeking employment.
+The agency is constantly tinkering with the application process, but by using the dynamic form
+you can create the new forms on the fly without changing the application code.
+
+The tutorial walks you through the following steps.
+
+1. Enable reactive forms for a project.
+1. Establish a data model to represent form controls.
+1. Populate the model with sample data.
+1. Develop a component to create form controls dynamically.
+
+The form you create uses input validation and styling to improve the user experience.
+It has a Submit button that is only enabled when all user input is valid, and flags invalid input with color coding and error messages.
+
+The basic version can evolve to support a richer variety of questions, more graceful rendering, and superior user experience.
+
+## Enable reactive forms for your project
+
+Dynamic forms are based on reactive forms.
+
+To give the application access reactive forms directives, import `ReactiveFormsModule` from the `@angular/forms` library into the necessary components.
+
+The following code from the example shows the setup in the root module.
+
+
+
+
+
+
+## Create a form object model
+
+A dynamic form requires an object model that can describe all scenarios needed by the form functionality.
+The example hero-application form is a set of questions — that is, each control in the form must ask a question and accept an answer.
+
+The data model for this type of form must represent a question.
+The example includes the `DynamicFormQuestionComponent`, which defines a question as the fundamental object in the model.
+
+The following `QuestionBase` is a base class for a set of controls that can represent the question and its answer in the form.
+
+
+
+### Define control classes
+
+From this base, the example derives two new classes, `TextboxQuestion` and `DropdownQuestion`, that represent different control types.
+When you create the form template in the next step, you instantiate these specific question types in order to render the appropriate controls dynamically.
+
+The `TextboxQuestion` control type is represented in a form template using an `` element. It presents a question and lets users enter input. The `type` attribute of the element is defined based on the `type` field specified in the `options` argument (for example `text`, `email`, `url`).
+
+
+
+The `DropdownQuestion` control type presents a list of choices in a select box.
+
+
+
+### Compose form groups
+
+A dynamic form uses a service to create grouped sets of input controls, based on the form model.
+The following `QuestionControlService` collects a set of `FormGroup` instances that consume the metadata from the question model.
+You can specify default values and validation rules.
+
+
+
+## Compose dynamic form contents
+
+The dynamic form itself is represented by a container component, which you add in a later step.
+Each question is represented in the form component's template by an `` tag, which matches an instance of `DynamicFormQuestionComponent`.
+
+The `DynamicFormQuestionComponent` is responsible for rendering the details of an individual question based on values in the data-bound question object.
+The form relies on a [`[formGroup]` directive](api/forms/FormGroupDirective "API reference") to connect the template HTML to the underlying control objects.
+The `DynamicFormQuestionComponent` creates form groups and populates them with controls defined in the question model, specifying display and validation rules.
+
+
+
+
+
+
+The goal of the `DynamicFormQuestionComponent` is to present question types defined in your model.
+You only have two types of questions at this point but you can imagine many more.
+The `ngSwitch` statement in the template determines which type of question to display.
+The switch uses directives with the [`formControlName`](api/forms/FormControlName "FormControlName directive API reference") and [`formGroup`](api/forms/FormGroupDirective "FormGroupDirective API reference") selectors.
+Both directives are defined in `ReactiveFormsModule`.
+
+### Supply data
+
+Another service is needed to supply a specific set of questions from which to build an individual form.
+For this exercise you create the `QuestionService` to supply this array of questions from the hard-coded sample data.
+In a real-world app, the service might fetch data from a backend system.
+The key point, however, is that you control the hero job-application questions entirely through the objects returned from `QuestionService`.
+To maintain the questionnaire as requirements change, you only need to add, update, and remove objects from the `questions` array.
+
+The `QuestionService` supplies a set of questions in the form of an array bound to `@Input()` questions.
+
+
+
+## Create a dynamic form template
+
+The `DynamicFormComponent` component is the entry point and the main container for the form, which is represented using the `` in a template.
+
+The `DynamicFormComponent` component presents a list of questions by binding each one to an `` element that matches the `DynamicFormQuestionComponent`.
+
+
+
+
+
+
+### Display the form
+
+To display an instance of the dynamic form, the `AppComponent` shell template passes the `questions` array returned by the `QuestionService` to the form container component, ``.
+
+
+
+This separation of model and data lets you repurpose the components for any type of survey, as long as it's compatible with the _question_ object model.
+
+### Ensuring valid data
+
+The form template uses dynamic data binding of metadata to render the form without making any hardcoded assumptions about specific questions.
+It adds both control metadata and validation criteria dynamically.
+
+To ensure valid input, the _Save_ button is disabled until the form is in a valid state.
+When the form is valid, click _Save_ and the application renders the current form values as JSON.
+
+The following figure shows the final form.
+
+
+
+## Next steps
+
+
+
+
+
diff --git a/adev-ja/src/content/guide/forms/dynamic-forms.md b/adev-ja/src/content/guide/forms/dynamic-forms.md
index 60d0de0af3..216febb61d 100644
--- a/adev-ja/src/content/guide/forms/dynamic-forms.md
+++ b/adev-ja/src/content/guide/forms/dynamic-forms.md
@@ -1,143 +1,143 @@
-# Building dynamic forms
+# 動的フォームの作成
-Many forms, such as questionnaires, can be very similar to one another in format and intent.
-To make it faster and easier to generate different versions of such a form, you can create a _dynamic form template_ based on metadata that describes the business object model.
-Then, use the template to generate new forms automatically, according to changes in the data model.
+アンケートなどの多くのフォームは、フォーマットと意図において非常に類似している場合があります。
+このようなフォームの異なるバージョンをより速く簡単に生成できるように、ビジネスオブジェクトモデルを記述するメタデータに基づいて、_動的フォームテンプレート_を作成できます。
+その後、テンプレートを使用して、データモデルの変更に応じて、新しいフォームを自動的に生成します。
-The technique is particularly useful when you have a type of form whose content must change frequently to meet rapidly changing business and regulatory requirements.
-A typical use-case is a questionnaire.
-You might need to get input from users in different contexts.
-The format and style of the forms a user sees should remain constant, while the actual questions you need to ask vary with the context.
+このテクニックは、ビジネスや規制要件の急速な変化に対応するために、コンテンツを頻繁に変更する必要があるフォームの種類を持つ場合に特に役立ちます。
+一般的なユースケースはアンケートです。
+さまざまなコンテキストでユーザーからの入力を受け取る必要がある場合があります。
+ユーザーが見ているフォームのフォーマットとスタイルは一定に保つ必要がありますが、実際に尋ねる必要がある質問はコンテキストによって異なります。
-In this tutorial you will build a dynamic form that presents a basic questionnaire.
-You build an online application for heroes seeking employment.
-The agency is constantly tinkering with the application process, but by using the dynamic form
-you can create the new forms on the fly without changing the application code.
+このチュートリアルでは、基本的なアンケートを表示する動的フォームを作成します。
+雇用を求めるヒーローのためのオンラインアプリケーションを構築します。
+エージェンシーは常にアプリケーションプロセスをいじっていますが、
+動的フォームを使用することでアプリケーションコードを変更せずに新しいフォームをオンザフライで作成できます。
-The tutorial walks you through the following steps.
+このチュートリアルでは、次の手順について説明します。
-1. Enable reactive forms for a project.
-1. Establish a data model to represent form controls.
-1. Populate the model with sample data.
-1. Develop a component to create form controls dynamically.
+1. プロジェクトでリアクティブフォームを有効にする。
+1. フォームコントロールを表すデータモデルを確立する。
+1. サンプルデータでモデルを埋める。
+1. フォームコントロールを動的に作成するコンポーネントを開発する。
-The form you create uses input validation and styling to improve the user experience.
-It has a Submit button that is only enabled when all user input is valid, and flags invalid input with color coding and error messages.
+作成するフォームでは、入力検証とスタイリングを使用してユーザー体験を向上させます。
+すべてのユーザー入力が有効な場合にのみ有効になる送信ボタンがあり、無効な入力を色分けとエラーメッセージでフラグ付けします。
-The basic version can evolve to support a richer variety of questions, more graceful rendering, and superior user experience.
+この基本バージョンは、より多くの種類の質問、より洗練されたレンダリング、優れたユーザー体験をサポートするように進化させることができます。
-## Enable reactive forms for your project
+## プロジェクトでリアクティブフォームを有効にする
-Dynamic forms are based on reactive forms.
+動的フォームはリアクティブフォームに基づいています。
-To give the application access reactive forms directives, import `ReactiveFormsModule` from the `@angular/forms` library into the necessary components.
+アプリケーションにリアクティブフォームディレクティブへのアクセス権を与えるには、必要なコンポーネントに `@angular/forms` ライブラリから `ReactiveFormsModule` をインポートします。
-The following code from the example shows the setup in the root module.
+例からの次のコードは、ルートモジュールでのセットアップを示しています。
-## Create a form object model
+## フォームオブジェクトモデルを作成する
-A dynamic form requires an object model that can describe all scenarios needed by the form functionality.
-The example hero-application form is a set of questions — that is, each control in the form must ask a question and accept an answer.
+動的フォームには、フォーム機能に必要なすべてのシナリオを記述できるオブジェクトモデルが必要です。
+例のヒーローアプリケーションフォームは、一連の質問です。つまり、フォーム内の各コントロールは質問をし、回答を受け入れる必要があります。
-The data model for this type of form must represent a question.
-The example includes the `DynamicFormQuestionComponent`, which defines a question as the fundamental object in the model.
+このタイプのフォームのデータモデルは、質問を表す必要があります。
+例には、`DynamicFormQuestionComponent` が含まれており、質問をモデルの基本オブジェクトとして定義しています。
-The following `QuestionBase` is a base class for a set of controls that can represent the question and its answer in the form.
+次の `QuestionBase` は、フォーム内の質問とその回答を表すことができる一連のコントロールのベースクラスです。
-### Define control classes
+### コントロールクラスを定義する
-From this base, the example derives two new classes, `TextboxQuestion` and `DropdownQuestion`, that represent different control types.
-When you create the form template in the next step, you instantiate these specific question types in order to render the appropriate controls dynamically.
+このベースから、例では、異なるコントロールタイプを表す `TextboxQuestion` と `DropdownQuestion` の2つの新しいクラスを派生させます。
+次のステップでフォームテンプレートを作成するときは、適切なコントロールを動的にレンダリングするために、これらの特定の質問タイプをインスタンス化します。
-The `TextboxQuestion` control type is represented in a form template using an `` element. It presents a question and lets users enter input. The `type` attribute of the element is defined based on the `type` field specified in the `options` argument (for example `text`, `email`, `url`).
+`TextboxQuestion` コントロールタイプは、フォームテンプレートでは `` 要素を使用して表されます。質問を表示し、ユーザーが入力をできるようにします。要素の `type` 属性は、`options` 引数で指定された `type` フィールドに基づいて定義されます(例:`text`、`email`、`url`)。
-The `DropdownQuestion` control type presents a list of choices in a select box.
+`DropdownQuestion` コントロールタイプは、選択ボックスに選択肢のリストを表示します。
-
+
-### Compose form groups
+### フォームグループを構成する
-A dynamic form uses a service to create grouped sets of input controls, based on the form model.
-The following `QuestionControlService` collects a set of `FormGroup` instances that consume the metadata from the question model.
-You can specify default values and validation rules.
+動的フォームは、サービスを使用して、質問モデルのメタデータに基づいて、入力コントロールのグループ化されたセットを作成します。
+次の `QuestionControlService` は、質問モデルからメタデータを使用する `FormGroup` インスタンスのセットを収集します。
+デフォルト値と検証ルールを指定できます。
-## Compose dynamic form contents
+## 動的フォームコンテンツを構成する
-The dynamic form itself is represented by a container component, which you add in a later step.
-Each question is represented in the form component's template by an `` tag, which matches an instance of `DynamicFormQuestionComponent`.
+動的フォーム自体は、後で追加するコンテナーコンポーネントで表されます。
+各質問は、フォームコンポーネントのテンプレートで、`DynamicFormQuestionComponent` のインスタンスと一致する `` タグで表されます。
-The `DynamicFormQuestionComponent` is responsible for rendering the details of an individual question based on values in the data-bound question object.
-The form relies on a [`[formGroup]` directive](api/forms/FormGroupDirective "API reference") to connect the template HTML to the underlying control objects.
-The `DynamicFormQuestionComponent` creates form groups and populates them with controls defined in the question model, specifying display and validation rules.
+`DynamicFormQuestionComponent` は、データバインドされた質問オブジェクトの値に基づいて、個々の質問の詳細をレンダリングする責任があります。
+フォームは、[`[formGroup]` ディレクティブ](api/forms/FormGroupDirective "API リファレンス") に依存して、テンプレートHTMLを基礎となるコントロールオブジェクトに接続します。
+`DynamicFormQuestionComponent` は、フォームグループを作成し、質問モデルにより定義されたコントロールでそれらを埋め、表示と検証ルールを指定します。
-The goal of the `DynamicFormQuestionComponent` is to present question types defined in your model.
-You only have two types of questions at this point but you can imagine many more.
-The `ngSwitch` statement in the template determines which type of question to display.
-The switch uses directives with the [`formControlName`](api/forms/FormControlName "FormControlName directive API reference") and [`formGroup`](api/forms/FormGroupDirective "FormGroupDirective API reference") selectors.
-Both directives are defined in `ReactiveFormsModule`.
+`DynamicFormQuestionComponent` の目標は、モデルで定義された質問タイプを提示することです。
+現時点では質問タイプが2つしかありませんが、さらに多くのタイプが考えられます。
+テンプレートの `ngSwitch` ステートメントは、表示する質問タイプを決定します。
+スイッチは、[`formControlName`](api/forms/FormControlName "FormControlName ディレクティブ API リファレンス") と [`formGroup`](api/forms/FormGroupDirective "FormGroupDirective API リファレンス") セレクターを持つディレクティブを使用します。
+両方のディレクティブは `ReactiveFormsModule` で定義されています。
-### Supply data
+### データを供給する
-Another service is needed to supply a specific set of questions from which to build an individual form.
-For this exercise you create the `QuestionService` to supply this array of questions from the hard-coded sample data.
-In a real-world app, the service might fetch data from a backend system.
-The key point, however, is that you control the hero job-application questions entirely through the objects returned from `QuestionService`.
-To maintain the questionnaire as requirements change, you only need to add, update, and remove objects from the `questions` array.
+個々のフォームを構築するために、特定の質問セットを供給するサービスも必要です。
+この演習では、ハードコードされたサンプルデータからこの質問の配列を供給する `QuestionService` を作成します。
+実際のアプリケーションでは、サービスはバックエンドシステムからデータを取得する可能性があります。
+ただし、重要な点は、ヒーローの求人質問を `QuestionService` から返されるオブジェクトを通じて完全に制御できることです。
+要件が変更された場合にアンケートを維持するには、`questions` 配列からオブジェクトを追加、更新、削除するだけです。
-The `QuestionService` supplies a set of questions in the form of an array bound to `@Input()` questions.
+`QuestionService` は、`@Input()` questionsにバインドされた配列の形式で、質問セットを供給します。
-## Create a dynamic form template
+## 動的フォームテンプレートを作成する
-The `DynamicFormComponent` component is the entry point and the main container for the form, which is represented using the `` in a template.
+`DynamicFormComponent` コンポーネントは、テンプレートで `` を使用して表されるフォームのエントリポイントであり、メインコンテナーです。
-The `DynamicFormComponent` component presents a list of questions by binding each one to an `` element that matches the `DynamicFormQuestionComponent`.
+`DynamicFormComponent` コンポーネントは、各質問を、`DynamicFormQuestionComponent` と一致する `` 要素にバインドすることによって、質問のリストを表示します。
-### Display the form
+### フォームを表示する
-To display an instance of the dynamic form, the `AppComponent` shell template passes the `questions` array returned by the `QuestionService` to the form container component, ``.
+動的フォームのインスタンスを表示するには、`AppComponent` シェルテンプレートは、`QuestionService` から返された `questions` 配列を、フォームコンテナーコンポーネント `` に渡します。
-This separation of model and data lets you repurpose the components for any type of survey, as long as it's compatible with the _question_ object model.
+このモデルとデータの分離により、_質問_ オブジェクトモデルと互換性がある限り、あらゆるタイプのアンケートにコンポーネントを再利用できます。
-### Ensuring valid data
+### 有効なデータを確保する
-The form template uses dynamic data binding of metadata to render the form without making any hardcoded assumptions about specific questions.
-It adds both control metadata and validation criteria dynamically.
+フォームテンプレートは、特定の質問についてハードコードされた仮定を一切行わずに、メタデータの動的データバインドを使用してフォームをレンダリングします。
+コントロールメタデータと検証基準の両方を動的に追加します。
-To ensure valid input, the _Save_ button is disabled until the form is in a valid state.
-When the form is valid, click _Save_ and the application renders the current form values as JSON.
+有効な入力を確保するために、フォームが有効な状態になるまで、_保存_ ボタンは無効になっています。
+フォームが有効になったら、_保存_ をクリックすると、アプリケーションは現在のフォーム値をJSONとしてレンダリングします。
-The following figure shows the final form.
+次の図は、最終的なフォームを示しています。
-## Next steps
+## 次のステップ
-
-
+
+
diff --git a/adev-ja/src/content/guide/forms/form-validation.en.md b/adev-ja/src/content/guide/forms/form-validation.en.md
new file mode 100644
index 0000000000..f72fca26eb
--- /dev/null
+++ b/adev-ja/src/content/guide/forms/form-validation.en.md
@@ -0,0 +1,347 @@
+# Validating form input
+
+You can improve overall data quality by validating user input for accuracy and completeness.
+This page shows how to validate user input from the UI and display useful validation messages, in both reactive and template-driven forms.
+
+## Validating input in template-driven forms
+
+To add validation to a template-driven form, you add the same validation attributes as you would with [native HTML form validation](https://developer.mozilla.org/docs/Web/Guide/HTML/HTML5/Constraint_validation).
+Angular uses directives to match these attributes with validator functions in the framework.
+
+Every time the value of a form control changes, Angular runs validation and generates either a list of validation errors that results in an `INVALID` status, or null, which results in a VALID status.
+
+You can then inspect the control's state by exporting `ngModel` to a local template variable.
+The following example exports `NgModel` into a variable called `name`:
+
+
+
+Notice the following features illustrated by the example.
+
+* The `` element carries the HTML validation attributes: `required` and `minlength`.
+ It also carries a custom validator directive, `forbiddenName`.
+ For more information, see the [Custom validators](#defining-custom-validators) section.
+
+* `#name="ngModel"` exports `NgModel` into a local variable called `name`.
+ `NgModel` mirrors many of the properties of its underlying `FormControl` instance, so you can use this in the template to check for control states such as `valid` and `dirty`.
+ For a full list of control properties, see the [AbstractControl](api/forms/AbstractControl) API reference.
+
+ * The `*ngIf` on the `
` element reveals a set of nested message `divs` but only if the `name` is invalid and the control is either `dirty` or `touched`.
+
+ * Each nested `
` can present a custom message for one of the possible validation errors.
+ There are messages for `required`, `minlength`, and `forbiddenName`.
+
+HELPFUL: To prevent the validator from displaying errors before the user has a chance to edit the form, you should check for either the `dirty` or `touched` states in a control.
+
+* When the user changes the value in the watched field, the control is marked as "dirty"
+* When the user blurs the form control element, the control is marked as "touched"
+
+## Validating input in reactive forms
+
+In a reactive form, the source of truth is the component class.
+Instead of adding validators through attributes in the template, you add validator functions directly to the form control model in the component class.
+Angular then calls these functions whenever the value of the control changes.
+
+### Validator functions
+
+Validator functions can be either synchronous or asynchronous.
+
+| Validator type | Details |
+|:--- |:--- |
+| Sync validators | Synchronous functions that take a control instance and immediately return either a set of validation errors or `null`. Pass these in as the second argument when you instantiate a `FormControl`. |
+| Async validators | Asynchronous functions that take a control instance and return a Promise or Observable that later emits a set of validation errors or `null`. Pass these in as the third argument when you instantiate a `FormControl`. |
+
+For performance reasons, Angular only runs async validators if all sync validators pass.
+Each must complete before errors are set.
+
+### Built-in validator functions
+
+You can choose to [write your own validator functions](#defining-custom-validators), or you can use some of Angular's built-in validators.
+
+The same built-in validators that are available as attributes in template-driven forms, such as `required` and `minlength`, are all available to use as functions from the `Validators` class.
+For a full list of built-in validators, see the [Validators](api/forms/Validators) API reference.
+
+To update the actor form to be a reactive form, use some of the same
+built-in validators —this time, in function form, as in the following example.
+
+
+
+In this example, the `name` control sets up two built-in validators —`Validators.required` and `Validators.minLength(4)`— and one custom validator, `forbiddenNameValidator`.
+
+All of these validators are synchronous, so they are passed as the second argument.
+Notice that you can support multiple validators by passing the functions in as an array.
+
+This example also adds a few getter methods.
+In a reactive form, you can always access any form control through the `get` method on its parent group, but sometimes it's useful to define getters as shorthand for the template.
+
+If you look at the template for the `name` input again, it is fairly similar to the template-driven example.
+
+
+
+This form differs from the template-driven version in that it no longer exports any directives. Instead, it uses the `name` getter defined in the component class.
+
+Notice that the `required` attribute is still present in the template. Although it's not necessary for validation, it should be retained for accessibility purposes.
+
+## Defining custom validators
+
+The built-in validators don't always match the exact use case of your application, so you sometimes need to create a custom validator.
+
+Consider the `forbiddenNameValidator` function from the previous example.
+Here's what the definition of that function looks like.
+
+
+
+The function is a factory that takes a regular expression to detect a *specific* forbidden name and returns a validator function.
+
+In this sample, the forbidden name is "bob", so the validator rejects any actor name containing "bob".
+Elsewhere it could reject "alice" or any name that the configuring regular expression matches.
+
+The `forbiddenNameValidator` factory returns the configured validator function.
+That function takes an Angular control object and returns *either* null if the control value is valid *or* a validation error object.
+The validation error object typically has a property whose name is the validation key, `'forbiddenName'`, and whose value is an arbitrary dictionary of values that you could insert into an error message, `{name}`.
+
+Custom async validators are similar to sync validators, but they must instead return a Promise or observable that later emits null or a validation error object.
+In the case of an observable, the observable must complete, at which point the form uses the last value emitted for validation.
+
+### Adding custom validators to reactive forms
+
+In reactive forms, add a custom validator by passing the function directly to the `FormControl`.
+
+
+
+### Adding custom validators to template-driven forms
+
+In template-driven forms, add a directive to the template, where the directive wraps the validator function.
+For example, the corresponding `ForbiddenValidatorDirective` serves as a wrapper around the `forbiddenNameValidator`.
+
+Angular recognizes the directive's role in the validation process because the directive registers itself with the `NG_VALIDATORS` provider, as shown in the following example.
+`NG_VALIDATORS` is a predefined provider with an extensible collection of validators.
+
+
+
+The directive class then implements the `Validator` interface, so that it can easily integrate with Angular forms.
+Here is the rest of the directive to help you get an idea of how it all comes together.
+
+
+
+Once the `ForbiddenValidatorDirective` is ready, you can add its selector, `appForbiddenName`, to any input element to activate it.
+For example:
+
+
+
+HELPFUL: Notice that the custom validation directive is instantiated with `useExisting` rather than `useClass`.
+The registered validator must be *this instance* of the `ForbiddenValidatorDirective` —the instance in the form with its `forbiddenName` property bound to "bob".
+
+If you were to replace `useExisting` with `useClass`, then you'd be registering a new class instance, one that doesn't have a `forbiddenName`.
+
+## Control status CSS classes
+
+Angular automatically mirrors many control properties onto the form control element as CSS classes.
+Use these classes to style form control elements according to the state of the form.
+The following classes are currently supported.
+
+* `.ng-valid`
+* `.ng-invalid`
+* `.ng-pending`
+* `.ng-pristine`
+* `.ng-dirty`
+* `.ng-untouched`
+* `.ng-touched`
+* `.ng-submitted` \(enclosing form element only\)
+
+In the following example, the actor form uses the `.ng-valid` and `.ng-invalid` classes to
+set the color of each form control's border.
+
+
+
+## Cross-field validation
+
+A cross-field validator is a [custom validator](#defining-custom-validators "Read about custom validators") that compares the values of different fields in a form and accepts or rejects them in combination.
+For example, you might have a form that offers mutually incompatible options, so that if the user can choose A or B, but not both.
+Some field values might also depend on others; a user might be allowed to choose B only if A is also chosen.
+
+The following cross validation examples show how to do the following:
+
+* Validate reactive or template-based form input based on the values of two sibling controls,
+* Show a descriptive error message after the user interacted with the form and the validation failed.
+
+The examples use cross-validation to ensure that actors do not reuse the same name in their role by filling out the Actor Form.
+The validators do this by checking that the actor names and roles do not match.
+
+### Adding cross-validation to reactive forms
+
+The form has the following structure:
+
+
+
+const actorForm = new FormGroup({
+ 'name': new FormControl(),
+ 'role': new FormControl(),
+ 'skill': new FormControl()
+});
+
+
+
+Notice that the `name` and `role` are sibling controls.
+To evaluate both controls in a single custom validator, you must perform the validation in a common ancestor control: the `FormGroup`.
+You query the `FormGroup` for its child controls so that you can compare their values.
+
+To add a validator to the `FormGroup`, pass the new validator in as the second argument on creation.
+
+
+
+const actorForm = new FormGroup({
+ 'name': new FormControl(),
+ 'role': new FormControl(),
+ 'skill': new FormControl()
+}, { validators: unambiguousRoleValidator });
+
+
+
+The validator code is as follows.
+
+
+
+The `unambiguousRoleValidator` validator implements the `ValidatorFn` interface.
+It takes an Angular control object as an argument and returns either null if the form is valid, or `ValidationErrors` otherwise.
+
+The validator retrieves the child controls by calling the `FormGroup`'s [get](api/forms/AbstractControl#get) method, then compares the values of the `name` and `role` controls.
+
+If the values do not match, the role is unambiguous, both are valid, and the validator returns null.
+If they do match, the actor's role is ambiguous and the validator must mark the form as invalid by returning an error object.
+
+To provide better user experience, the template shows an appropriate error message when the form is invalid.
+
+
+
+This `*ngIf` displays the error if the `FormGroup` has the cross validation error returned by the `unambiguousRoleValidator` validator, but only if the user finished [interacting with the form](#control-status-css-classes).
+
+### Adding cross-validation to template-driven forms
+
+For a template-driven form, you must create a directive to wrap the validator function.
+You provide that directive as the validator using the [`NG_VALIDATORS` token](/api/forms/NG_VALIDATORS), as shown in the following example.
+
+
+
+You must add the new directive to the HTML template.
+Because the validator must be registered at the highest level in the form, the following template puts the directive on the `form` tag.
+
+
+
+To provide better user experience, an appropriate error message appears when the form is invalid.
+
+
+
+This is the same in both template-driven and reactive forms.
+
+## Creating asynchronous validators
+
+Asynchronous validators implement the `AsyncValidatorFn` and `AsyncValidator` interfaces.
+These are very similar to their synchronous counterparts, with the following differences.
+
+* The `validate()` functions must return a Promise or an observable,
+* The observable returned must be finite, meaning it must complete at some point.
+ To convert an infinite observable into a finite one, pipe the observable through a filtering operator such as `first`, `last`, `take`, or `takeUntil`.
+
+Asynchronous validation happens after the synchronous validation, and is performed only if the synchronous validation is successful.
+This check lets forms avoid potentially expensive async validation processes \(such as an HTTP request\) if the more basic validation methods have already found invalid input.
+
+After asynchronous validation begins, the form control enters a `pending` state.
+Inspect the control's `pending` property and use it to give visual feedback about the ongoing validation operation.
+
+A common UI pattern is to show a spinner while the async validation is being performed.
+The following example shows how to achieve this in a template-driven form.
+
+
+
+
+
+
+
+
+### Implementing a custom async validator
+
+In the following example, an async validator ensures that actors are cast for a role that is not already taken.
+New actors are constantly auditioning and old actors are retiring, so the list of available roles cannot be retrieved ahead of time.
+To validate the potential role entry, the validator must initiate an asynchronous operation to consult a central database of all currently cast actors.
+
+The following code creates the validator class, `UniqueRoleValidator`, which implements the `AsyncValidator` interface.
+
+
+
+The constructor injects the `ActorsService`, which defines the following interface.
+
+
+interface ActorsService {
+ isRoleTaken: (role: string) => Observable;
+}
+
+
+In a real world application, the `ActorsService` would be responsible for making an HTTP request to the actor database to check if the role is available.
+From the validator's point of view, the actual implementation of the service is not important, so the example can just code against the `ActorsService` interface.
+
+As the validation begins, the `UnambiguousRoleValidator` delegates to the `ActorsService` `isRoleTaken()` method with the current control value.
+At this point the control is marked as `pending` and remains in this state until the observable chain returned from the `validate()` method completes.
+
+The `isRoleTaken()` method dispatches an HTTP request that checks if the role is available, and returns `Observable` as the result.
+The `validate()` method pipes the response through the `map` operator and transforms it into a validation result.
+
+The method then, like any validator, returns `null` if the form is valid, and `ValidationErrors` if it is not.
+This validator handles any potential errors with the `catchError` operator.
+In this case, the validator treats the `isRoleTaken()` error as a successful validation, because failure to make a validation request does not necessarily mean that the role is invalid.
+You could handle the error differently and return the `ValidationError` object instead.
+
+After some time passes, the observable chain completes and the asynchronous validation is done.
+The `pending` flag is set to `false`, and the form validity is updated.
+
+### Adding async validators to reactive forms
+
+To use an async validator in reactive forms, begin by injecting the validator into the constructor of the component class.
+
+
+
+Then, pass the validator function directly to the `FormControl` to apply it.
+
+In the following example, the `validate` function of `UnambiguousRoleValidator` is applied to `roleControl` by passing it to the control's `asyncValidators` option and binding it to the instance of `UnambiguousRoleValidator` that was injected into `ActorFormReactiveComponent`.
+The value of `asyncValidators` can be either a single async validator function, or an array of functions.
+To learn more about `FormControl` options, see the [AbstractControlOptions](api/forms/AbstractControlOptions) API reference.
+
+
+
+### Adding async validators to template-driven forms
+
+To use an async validator in template-driven forms, create a new directive and register the `NG_ASYNC_VALIDATORS` provider on it.
+
+In the example below, the directive injects the `UniqueRoleValidator` class that contains the actual validation logic and invokes it in the `validate` function, triggered by Angular when validation should happen.
+
+
+
+Then, as with synchronous validators, add the directive's selector to an input to activate it.
+
+
+
+### Optimizing performance of async validators
+
+By default, all validators run after every form value change.
+With synchronous validators, this does not normally have a noticeable impact on application performance.
+Async validators, however, commonly perform some kind of HTTP request to validate the control.
+Dispatching an HTTP request after every keystroke could put a strain on the backend API, and should be avoided if possible.
+
+You can delay updating the form validity by changing the `updateOn` property from `change` (default) to `submit` or `blur`.
+
+With template-driven forms, set the property in the template.
+
+
+
+
+
+With reactive forms, set the property in the `FormControl` instance.
+
+
+new FormControl('', {updateOn: 'blur'});
+
+
+## Interaction with native HTML form validation
+
+By default, Angular disables [native HTML form validation](https://developer.mozilla.org/docs/Web/Guide/HTML/Constraint_validation) by adding the `novalidate` attribute on the enclosing `