anchor.diff:      // We return the directives in the same order that they are present in the
       // Component, not the order that they match in the html.
       return directives.where(matchedDirectives.contains).toList();
  +  }
  +
  +  // TODO(leonsenft): remove when @i18n is enabled by default.
  +  /// A helper to handle conditionally parsing i18n metadata.
  +  ///
  +  /// Returns empty metadata when i18n is disabled.
  +  static I18nMetadataBundle _maybeParseI18nMetadata(
  +      List<ast.AnnotationAst> annotations, _ParseContext parent) {
  +    return parent.i18nEnabled
  +        ? parseI18nMetadata(annotations, parent.templateContext)
  +        : I18nMetadataBundle.empty();
     }
   
     static SelectorMatcher _selectorMatcher(
  
positive.code:       CompileDirectiveMetadata compMeta,
        List<ast.TemplateAst> filteredAst,
        AstExceptionHandler exceptionHandler) {
      final visitor = _BindDirectivesVisitor(flags.i18nEnabled);
      final context = _ParseContext.forRoot(TemplateContext(
          parser: parser,
          schemaRegistry: schemaRegistry,
          directives: removeDuplicates(directives),
          exports: compMeta.exports,
          exceptionHandler: exceptionHandler));
      return visitor._visitAll(filteredAst, context);
    }
  
  
negative.code:         templateContext,
          element.name,
          boundDirectives,
          parent.i18nEnabled,
          _maybeParseI18nMetadata(element.annotations, parent),
          false,
          _createSelector(firstComponent),
          _findWildcardIndex(firstComponent));
    }
  
    factory _ParseContext.forTemplate(
        ast.EmbeddedTemplateAst template, _ParseContext parent) {
      var templateContext = parent.templateContext;
      var boundDirectives = _toAst(
          _matchTemplateDirectives(templateContext.directives, template),
          template.sourceSpan,
  