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:         embeddedContext.boundDirectives,
          [] /* providers */,
          null /* elementProviderUsage */,
          _visitChildren(astNode, i18nMetadata.forChildren, embeddedContext),
          _findNgContentIndexForTemplate(astNode, parentContext),
          astNode.sourceSpan,
          hasDeferredComponent: astNode.hasDeferredComponent);
  
negative.code:         templateContext,
          _templateElement,
          boundDirectives,
          parent.i18nEnabled,
          _maybeParseI18nMetadata(template.annotations, parent),
          true,
          _createSelector(firstComponent),
          _findWildcardIndex(firstComponent));
  