diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index aab5850ada178d044a4a1bff339947c2dad1c8d4..60270222e4ae9641e3c1c82d1bf8166593e94291 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -8,11 +8,11 @@
 use Drupal\Core\DependencyInjection\DependencySerializationTrait;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Plugin\DefaultPluginManager;
-use Drupal\Core\TypedData\Validation\ExecutionContextFactory;
 use Drupal\Core\TypedData\Validation\RecursiveValidator;
 use Drupal\Core\Validation\ConstraintManager;
 use Drupal\Core\Validation\ConstraintValidatorFactory;
 use Drupal\Core\Validation\DrupalTranslator;
+use Symfony\Component\Validator\Context\ExecutionContextFactory;
 use Symfony\Component\Validator\Validator\ValidatorInterface;
 
 /**
diff --git a/core/lib/Drupal/Core/TypedData/Validation/ConstraintViolationBuilder.php b/core/lib/Drupal/Core/TypedData/Validation/ConstraintViolationBuilder.php
index a3e62d0b9757c51681752d9e2c9e5be7c6b95cfa..9d5cdff7fe678be72d3b01cd19821b91a20a0349 100644
--- a/core/lib/Drupal/Core/TypedData/Validation/ConstraintViolationBuilder.php
+++ b/core/lib/Drupal/Core/TypedData/Validation/ConstraintViolationBuilder.php
@@ -17,6 +17,10 @@
  *
  * We do not use the builder provided by Symfony as it is marked internal.
  *
+ * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the class
+ *   \Symfony\Component\Validator\Violation\ConstraintViolationBuilder instead.
+ *
+ * @see https://www.drupal.org/node/3238432
  */
 class ConstraintViolationBuilder implements ConstraintViolationBuilderInterface {
 
@@ -121,6 +125,7 @@ class ConstraintViolationBuilder implements ConstraintViolationBuilderInterface
    */
   public function __construct(ConstraintViolationList $violations, Constraint $constraint, $message, array $parameters, $root, $propertyPath, $invalidValue, TranslatorInterface $translator, $translationDomain = null)
     {
+      @trigger_error(__CLASS__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the class \Symfony\Component\Validator\Violation\ConstraintViolationBuilder instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
       $this->violations = $violations;
       $this->message = $message;
       $this->parameters = $parameters;
@@ -134,9 +139,16 @@ public function __construct(ConstraintViolationList $violations, Constraint $con
 
     /**
      * {@inheritdoc}
+     *
+     * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+     *   \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::atPath()
+     *   instead.
+     *
+     * @see https://www.drupal.org/node/3238432
      */
     public function atPath($path)
     {
+      @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::atPath() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
       $this->propertyPath = PropertyPath::append($this->propertyPath, $path);
 
       return $this;
@@ -144,9 +156,16 @@ public function atPath($path)
 
     /**
      * {@inheritdoc}
+     *
+     * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+     *   \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setParameter()
+     *   instead.
+     *
+     * @see https://www.drupal.org/node/3238432
      */
     public function setParameter($key, $value)
     {
+      @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setParameter() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
       $this->parameters[$key] = $value;
 
       return $this;
@@ -154,9 +173,16 @@ public function setParameter($key, $value)
 
     /**
      * {@inheritdoc}
+     *
+     * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+     *   \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setParameters()
+     *   instead.
+     *
+     * @see https://www.drupal.org/node/3238432
      */
     public function setParameters(array $parameters)
     {
+      @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setParameters() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
       $this->parameters = $parameters;
 
       return $this;
@@ -164,9 +190,16 @@ public function setParameters(array $parameters)
 
     /**
      * {@inheritdoc}
+     *
+     * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+     *   \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setTranslationDomain()
+     *   instead.
+     *
+     * @see https://www.drupal.org/node/3238432
      */
     public function setTranslationDomain($translationDomain)
     {
+      @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setTranslationDomain() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
       $this->translationDomain = $translationDomain;
 
       return $this;
@@ -174,9 +207,16 @@ public function setTranslationDomain($translationDomain)
 
     /**
      * {@inheritdoc}
+     *
+     * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+     *   \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setInvalidValue()
+     *   instead.
+     *
+     * @see https://www.drupal.org/node/3238432
      */
     public function setInvalidValue($invalidValue)
     {
+      @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setInvalidValue() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
       $this->invalidValue = $invalidValue;
 
       return $this;
@@ -184,9 +224,16 @@ public function setInvalidValue($invalidValue)
 
     /**
      * {@inheritdoc}
+     *
+     * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+     *   \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setPlural()
+     *   instead.
+     *
+     * @see https://www.drupal.org/node/3238432
      */
     public function setPlural($number)
     {
+      @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setPlural() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
       $this->plural = $number;
 
       return $this;
@@ -194,9 +241,16 @@ public function setPlural($number)
 
     /**
      * {@inheritdoc}
+     *
+     * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+     *   \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setCode()
+     *   instead.
+     *
+     * @see https://www.drupal.org/node/3238432
      */
     public function setCode($code)
     {
+      @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setCode() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
       $this->code = $code;
 
       return $this;
@@ -204,9 +258,16 @@ public function setCode($code)
 
     /**
      * {@inheritdoc}
+     *
+     * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+     *   \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setCause()
+     *   instead.
+     *
+     * @see https://www.drupal.org/node/3238432
      */
     public function setCause($cause)
     {
+      @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::setCause() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
       $this->cause = $cause;
 
       return $this;
@@ -214,9 +275,16 @@ public function setCause($cause)
 
     /**
      * {@inheritdoc}
+     *
+     * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+     *   \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::addViolation()
+     *   instead.
+     *
+     * @see https://www.drupal.org/node/3238432
      */
     public function addViolation()
     {
+      @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Violation\ConstraintViolationBuilder::addViolation() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
       if (null === $this->plural) {
         $translatedMessage = $this->translator->trans(
           $this->message,
diff --git a/core/lib/Drupal/Core/TypedData/Validation/ExecutionContext.php b/core/lib/Drupal/Core/TypedData/Validation/ExecutionContext.php
index 1d409b72998f46319ecf41ca5169be2f00be5109..34eda6a71ecbbcc719d7cd94f890dd7f4753c8e7 100644
--- a/core/lib/Drupal/Core/TypedData/Validation/ExecutionContext.php
+++ b/core/lib/Drupal/Core/TypedData/Validation/ExecutionContext.php
@@ -18,6 +18,11 @@
  * We do not use the context provided by Symfony as it is marked internal, so
  * this class is pretty much the same, but has some code style changes as well
  * as exceptions for methods we don't support.
+ *
+ * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the class
+ *   \Symfony\Component\Validator\Context\ExecutionContext instead.
+ *
+ * @see https://www.drupal.org/node/3238432
  */
 class ExecutionContext implements ExecutionContextInterface {
 
@@ -122,6 +127,7 @@ class ExecutionContext implements ExecutionContextInterface {
    *    Should not be used in user code.
    */
   public function __construct(ValidatorInterface $validator, $root, TranslatorInterface $translator, $translationDomain = NULL) {
+    @trigger_error(__CLASS__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the class \Symfony\Component\Validator\Context\ExecutionContext instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     $this->validator = $validator;
     $this->root = $root;
     $this->translator = $translator;
@@ -131,8 +137,15 @@ public function __construct(ValidatorInterface $validator, $root, TranslatorInte
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::setNode()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function setNode($value, $object, MetadataInterface $metadata = NULL, $propertyPath) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::setNode() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     $this->value = $value;
     $this->data = $object;
     $this->metadata = $metadata;
@@ -141,22 +154,43 @@ public function setNode($value, $object, MetadataInterface $metadata = NULL, $pr
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::setGroup()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function setGroup($group) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::setGroup() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     $this->group = $group;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::setConstraint()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function setConstraint(Constraint $constraint) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::setConstraint() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     $this->constraint = $constraint;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::addViolation()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function addViolation($message, array $parameters = [], $invalidValue = NULL, $plural = NULL, $code = NULL) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::addViolation() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     // The parameters $invalidValue and following are ignored by the new
     // API, as they are not present in the new interface anymore.
     // You should use buildViolation() instead.
@@ -169,148 +203,295 @@ public function addViolation($message, array $parameters = [], $invalidValue = N
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::buildViolation()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function buildViolation($message, array $parameters = []): ConstraintViolationBuilderInterface {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::buildViolation() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return new ConstraintViolationBuilder($this->violations, $this->constraint, $message, $parameters, $this->root, $this->propertyPath, $this->value, $this->translator, $this->translationDomain);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getViolations()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getViolations() {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getViolations() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return $this->violations;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getValidator()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getValidator() {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getValidator() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return $this->validator;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getRoot()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getRoot() {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getRoot() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return $this->root;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getValue()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getValue() {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getValue() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return $this->value;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getObject()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getObject(): ?object {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getObject() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return $this->data;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getMetadata()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getMetadata(): ?MetadataInterface {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getMetadata() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return $this->metadata;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getGroup()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getGroup(): ?string {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getGroup() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return Constraint::DEFAULT_GROUP;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getClassName()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getClassName(): ?string {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getClassName() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return get_class($this->data);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getPropertyName()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getPropertyName(): ?string {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getPropertyName() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return $this->data->getName();
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getPropertyPath()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getPropertyPath($sub_path = ''): string {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getPropertyPath() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return PropertyPath::append($this->propertyPath, $sub_path);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::addViolationAt()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function addViolationAt($subPath, $message, array $parameters = [], $invalidValue = NULL, $plural = NULL, $code = NULL) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::addViolationAt() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     throw new \LogicException('Legacy validator API is unsupported.');
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::validate()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function validate($value, $subPath = '', $groups = NULL, $traverse = FALSE, $deep = FALSE) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::validate() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     throw new \LogicException('Legacy validator API is unsupported.');
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::markConstraintAsValidated()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function markConstraintAsValidated($cache_key, $constraint_hash) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::markConstraintAsValidated() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     $this->validatedConstraints[$cache_key . ':' . $constraint_hash] = TRUE;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::isConstraintValidated()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function isConstraintValidated($cache_key, $constraint_hash) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::isConstraintValidated() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return isset($this->validatedConstraints[$cache_key . ':' . $constraint_hash]);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::validateValue()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function validateValue($value, $constraints, $subPath = '', $groups = NULL) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::validateValue() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     throw new \LogicException('Legacy validator API is unsupported.');
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::markGroupAsValidated()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function markGroupAsValidated($cache_key, $group_hash) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::markGroupAsValidated() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     $this->validatedObjects[$cache_key][$group_hash] = TRUE;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::isGroupValidated()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function isGroupValidated($cache_key, $group_hash) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::isGroupValidated() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return isset($this->validatedObjects[$cache_key][$group_hash]);
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::markObjectAsInitialized()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function markObjectAsInitialized($cache_key) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::markObjectAsInitialized() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     // Not supported, so nothing todo.
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::isObjectInitialized()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function isObjectInitialized($cache_key) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::isObjectInitialized() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     // Not supported, so nothing todo.
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContext::getMetadataFactory()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function getMetadataFactory() {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContext::getMetadataFactory() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     throw new \LogicException('Legacy validator API is unsupported.');
   }
 
diff --git a/core/lib/Drupal/Core/TypedData/Validation/ExecutionContextFactory.php b/core/lib/Drupal/Core/TypedData/Validation/ExecutionContextFactory.php
index 5c6a8264cd9c25fc53b04f2073414a05301e2229..32cb2abb5bfc46750c7fe57962e5aaea7a95a9fe 100644
--- a/core/lib/Drupal/Core/TypedData/Validation/ExecutionContextFactory.php
+++ b/core/lib/Drupal/Core/TypedData/Validation/ExecutionContextFactory.php
@@ -11,6 +11,11 @@
  * Defines an execution factory for the Typed Data validator.
  *
  * We do not use the factory provided by Symfony as it is marked internal.
+ *
+ * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the class
+ *   \Symfony\Component\Validator\Context\ExecutionContextFactory instead.
+ *
+ * @see https://www.drupal.org/node/3238432
  */
 class ExecutionContextFactory implements ExecutionContextFactoryInterface {
 
@@ -33,14 +38,22 @@ class ExecutionContextFactory implements ExecutionContextFactoryInterface {
    *   (optional) The translation domain.
    */
   public function __construct(TranslatorInterface $translator, $translationDomain = NULL) {
+    @trigger_error(__CLASS__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the class \Symfony\Component\Validator\Context\ExecutionContextFactory instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     $this->translator = $translator;
     $this->translationDomain = $translationDomain;
   }
 
   /**
    * {@inheritdoc}
+   *
+   * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use
+   *   \Symfony\Component\Validator\Context\ExecutionContextFactory::createContext()
+   *   instead.
+   *
+   * @see https://www.drupal.org/node/3238432
    */
   public function createContext(ValidatorInterface $validator, $root): ExecutionContextInterface {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Validator\Context\ExecutionContextFactory::createContext() instead. See https://www.drupal.org/node/3238432', E_USER_DEPRECATED);
     return new ExecutionContext(
       $validator,
       $root,
diff --git a/core/lib/Drupal/Core/Validation/DrupalTranslator.php b/core/lib/Drupal/Core/Validation/DrupalTranslator.php
index 4025feda37fd6326d137174257adf309f871ba04..3003c1737c5b34323ab8387aaf4804a2c212e10d 100644
--- a/core/lib/Drupal/Core/Validation/DrupalTranslator.php
+++ b/core/lib/Drupal/Core/Validation/DrupalTranslator.php
@@ -4,6 +4,7 @@
 
 use Drupal\Component\Render\MarkupInterface;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Symfony\Contracts\Translation\TranslatorInterface;
 
 /**
  * Translates strings using Drupal's translation system.
@@ -28,6 +29,15 @@ public function trans($id, array $parameters = [], $domain = NULL, $locale = NUL
     if ($id instanceof TranslatableMarkup) {
       return $id;
     }
+
+    // Symfony violation messages may separate singular and plural versions
+    // with "|".
+    $ids = explode('|', $id);
+    if (count($ids) > 1) {
+      $number = $parameters['%count%'] ?? 1;
+      return \Drupal::translation()->formatPlural($number, $ids[0], $ids[1], $this->processParameters($parameters), $this->getOptions($domain, $locale));
+    }
+
     return new TranslatableMarkup($id, $this->processParameters($parameters), $this->getOptions($domain, $locale));
   }
 
diff --git a/core/lib/Drupal/Core/Validation/TranslatorInterface.php b/core/lib/Drupal/Core/Validation/TranslatorInterface.php
index e59e766ffdb6631809a3036cfb421df3ac3585f0..bc679ca2191c1e595f5c8354b842cf18b8c24ab3 100644
--- a/core/lib/Drupal/Core/Validation/TranslatorInterface.php
+++ b/core/lib/Drupal/Core/Validation/TranslatorInterface.php
@@ -9,6 +9,10 @@
  * to indicate that the Drupal code is actually independent from the
  * Symfony translation component.
  *
+ * @deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the
+ *   interface \Symfony\Contracts\Translation\TranslatorInterface instead.
+ *
+ * @see https://www.drupal.org/node/3238432
  * @see https://github.com/symfony/symfony/pull/6189
  * @see https://github.com/symfony/symfony/issues/15714
  */
diff --git a/core/tests/Drupal/Tests/Core/TypedData/RecursiveContextualValidatorTest.php b/core/tests/Drupal/Tests/Core/TypedData/RecursiveContextualValidatorTest.php
index 25703e7b734c3123439fda339c1e2936e1fa7c2c..7153be5a57e0d31d60fa8496e183e9a748f0ca18 100644
--- a/core/tests/Drupal/Tests/Core/TypedData/RecursiveContextualValidatorTest.php
+++ b/core/tests/Drupal/Tests/Core/TypedData/RecursiveContextualValidatorTest.php
@@ -12,11 +12,11 @@
 use Drupal\Core\TypedData\DataDefinition;
 use Drupal\Core\TypedData\MapDataDefinition;
 use Drupal\Core\TypedData\TypedDataManager;
-use Drupal\Core\TypedData\Validation\ExecutionContextFactory;
 use Drupal\Core\TypedData\Validation\RecursiveValidator;
 use Drupal\Core\Validation\ConstraintManager;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\Validator\ConstraintValidatorFactory;
+use Symfony\Component\Validator\Context\ExecutionContextFactory;
 use Symfony\Component\Validator\Context\ExecutionContextInterface;
 
 /**
@@ -49,7 +49,7 @@ class RecursiveContextualValidatorTest extends UnitTestCase {
   /**
    * The execution context factory.
    *
-   * @var \Drupal\Core\TypedData\Validation\ExecutionContextFactory
+   * @var \Symfony\Component\Validator\Context\ExecutionContextFactory
    */
   protected $contextFactory;
 
@@ -80,7 +80,7 @@ protected function setUp(): void {
     $container->set('typed_data_manager', $this->typedDataManager);
     \Drupal::setContainer($container);
 
-    $translator = $this->createMock('Drupal\Core\Validation\TranslatorInterface');
+    $translator = $this->createMock('Symfony\Contracts\Translation\TranslatorInterface');
     $translator->expects($this->any())
       ->method('trans')
       ->willReturnCallback(function ($id) {
diff --git a/core/tests/Drupal/Tests/Core/TypedData/ValidationLegacyTest.php b/core/tests/Drupal/Tests/Core/TypedData/ValidationLegacyTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..90f626aa0adad5e903c1fad732bdb21cbfd348e9
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/TypedData/ValidationLegacyTest.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Drupal\Tests\Core\TypedData;
+
+use Drupal\Core\TypedData\Validation\ConstraintViolationBuilder;
+use Drupal\Core\TypedData\Validation\ExecutionContext;
+use Drupal\Core\TypedData\Validation\ExecutionContextFactory;
+use Drupal\Core\Validation\TranslatorInterface;
+use Drupal\Tests\UnitTestCase;
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintViolationList;
+use Symfony\Component\Validator\Validator\ValidatorInterface;
+
+/**
+ * Test the deprecation of TypedData classes.
+ * @group typedData
+ * @group legacy
+ */
+class ValidationLegacyTest extends UnitTestCase {
+
+  /**
+   * @covers Drupal\Core\TypedData\Validation\ConstraintViolationBuilder::__construct
+   */
+  public function testConstraintViolationBuilderDeprecated() {
+    $this->expectDeprecation("Drupal\Core\TypedData\Validation\ConstraintViolationBuilder is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the class \Symfony\Component\Validator\Violation\ConstraintViolationBuilder instead. See https://www.drupal.org/node/3238432");
+    $constraint_violation_list = $this->prophesize(ConstraintViolationList::class)->reveal();
+    $constraint = $this->prophesize(Constraint::class)->reveal();
+    $translator = $this->prophesize(TranslatorInterface::class)->reveal();
+    $this->assertInstanceOf(ConstraintViolationBuilder::class, new ConstraintViolationBuilder($constraint_violation_list, $constraint, '', [], '', '', '', $translator));
+  }
+
+  /**
+   * @covers Drupal\Core\TypedData\Validation\ExecutionContext::__construct
+   */
+  public function testExecutionContextDeprecated() {
+    $this->expectDeprecation("Drupal\Core\TypedData\Validation\ExecutionContext is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the class \Symfony\Component\Validator\Context\ExecutionContext instead. See https://www.drupal.org/node/3238432");
+    $validator = $this->prophesize(ValidatorInterface::class)->reveal();
+    $translator = $this->prophesize(TranslatorInterface::class)->reveal();
+    $this->assertInstanceOf(ExecutionContext::class, new ExecutionContext($validator, '', $translator));
+  }
+
+  /**
+   * @covers Drupal\Core\TypedData\Validation\ExecutionContextFactory::__construct
+   */
+  public function testExecutionContextFactoryDeprecated() {
+    $this->expectDeprecation("Drupal\Core\TypedData\Validation\ExecutionContextFactory is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use the class \Symfony\Component\Validator\Context\ExecutionContextFactory instead. See https://www.drupal.org/node/3238432");
+    $translator = $this->prophesize(TranslatorInterface::class)->reveal();
+    $this->assertInstanceOf(ExecutionContextFactory::class, new ExecutionContextFactory($translator));
+  }
+
+}