diff --git a/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizer.cs b/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizer.cs index 1cbf91ed29..ceaa04de02 100644 --- a/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizer.cs +++ b/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizer.cs @@ -4,8 +4,6 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.Text; -using System.Text.Encodings.Web; using Microsoft.Extensions.Localization; namespace Microsoft.AspNet.Mvc.Localization @@ -17,27 +15,19 @@ namespace Microsoft.AspNet.Mvc.Localization public class HtmlLocalizer : IHtmlLocalizer { private IStringLocalizer _localizer; - private readonly HtmlEncoder _encoder; /// /// Creates a new . /// /// The to read strings from. - /// The . - public HtmlLocalizer(IStringLocalizer localizer, HtmlEncoder encoder) + public HtmlLocalizer(IStringLocalizer localizer) { if (localizer == null) { throw new ArgumentNullException(nameof(localizer)); } - if (encoder == null) - { - throw new ArgumentNullException(nameof(encoder)); - } - _localizer = localizer; - _encoder = encoder; } /// @@ -80,7 +70,7 @@ namespace Microsoft.AspNet.Mvc.Localization throw new ArgumentNullException(nameof(culture)); } - return new HtmlLocalizer(_localizer.WithCulture(culture), _encoder); + return new HtmlLocalizer(_localizer.WithCulture(culture)); } /// @@ -95,7 +85,7 @@ namespace Microsoft.AspNet.Mvc.Localization throw new ArgumentNullException(nameof(culture)); } - return new HtmlLocalizer(_localizer.WithCulture(culture), _encoder); + return new HtmlLocalizer(_localizer.WithCulture(culture)); } /// @@ -143,9 +133,7 @@ namespace Microsoft.AspNet.Mvc.Localization throw new ArgumentNullException(nameof(key)); } - var stringValue = _localizer[key].Value; - - return ToHtmlString(new LocalizedString(key, EncodeArguments(stringValue, arguments))); + return ToHtmlString(_localizer.GetString(key), arguments); } /// @@ -155,118 +143,7 @@ namespace Microsoft.AspNet.Mvc.Localization protected virtual LocalizedHtmlString ToHtmlString(LocalizedString result) => new LocalizedHtmlString(result.Name, result.Value, result.ResourceNotFound); - /// - /// Encodes the arguments based on the object type. - /// - /// The resourceString whose arguments need to be encoded. - /// The array of objects to encode. - /// The string with encoded arguments. - protected virtual string EncodeArguments(string resourceString, object[] arguments) - { - if (resourceString == null) - { - throw new ArgumentNullException(nameof(resourceString)); - } - - if (arguments == null) - { - throw new ArgumentNullException(nameof(arguments)); - } - - var position = 0; - var length = resourceString.Length; - char currentCharacter; - StringBuilder tokenBuffer = null; - var outputBuffer = new StringBuilder(); - var isToken = false; - - while (position < length) - { - currentCharacter = resourceString[position]; - - position++; - if (currentCharacter == '}') - { - if (position < length && resourceString[position] == '}') // Treat as escape character for }} - { - if (isToken) - { - tokenBuffer.Append("}}"); - } - else - { - outputBuffer.Append("}"); - } - - position++; - } - else - { - AppendToBuffer(isToken, '}', tokenBuffer, outputBuffer); - - if (position == length) - { - break; - } - AppendToOutputBuffer(arguments, tokenBuffer, outputBuffer); - - isToken = false; - tokenBuffer = null; - } - } - else if (currentCharacter == '{') - { - if (position < length && resourceString[position] == '{') // Treat as escape character for {{ - { - if (isToken) - { - tokenBuffer.Append("{{"); - } - else - { - outputBuffer.Append("{"); - } - position++; - } - else - { - tokenBuffer = new StringBuilder(); - tokenBuffer.Append("{"); - isToken = true; - } - } - else - { - AppendToBuffer(isToken, currentCharacter, tokenBuffer, outputBuffer); - } - } - AppendToOutputBuffer(arguments, tokenBuffer, outputBuffer); - - return outputBuffer.ToString(); - } - - private void AppendToBuffer( - bool isToken, - char value, - StringBuilder tokenBuffer, - StringBuilder outputBuffer) - { - if (isToken) - { - tokenBuffer.Append(value); - } - else - { - outputBuffer.Append(value); - } - } - - private void AppendToOutputBuffer(object[] arguments, StringBuilder tokenBuffer, StringBuilder outputBuffer) - { - if (tokenBuffer != null && tokenBuffer.Length > 0) - { - outputBuffer.Append(_encoder.Encode(string.Format(tokenBuffer.ToString(), arguments))); - } - } + protected virtual LocalizedHtmlString ToHtmlString(LocalizedString result, object[] arguments) => + new LocalizedHtmlString(result.Name, result.Value, result.ResourceNotFound, arguments); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizerFactory.cs b/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizerFactory.cs index 81e8d8f74a..8ad004bb67 100644 --- a/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizerFactory.cs +++ b/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizerFactory.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Text.Encodings.Web; using Microsoft.Extensions.Localization; namespace Microsoft.AspNet.Mvc.Localization @@ -13,27 +12,19 @@ namespace Microsoft.AspNet.Mvc.Localization public class HtmlLocalizerFactory : IHtmlLocalizerFactory { private readonly IStringLocalizerFactory _factory; - private readonly HtmlEncoder _encoder; /// /// Creates a new . /// /// The . - /// The . - public HtmlLocalizerFactory(IStringLocalizerFactory localizerFactory, HtmlEncoder encoder) + public HtmlLocalizerFactory(IStringLocalizerFactory localizerFactory) { if (localizerFactory == null) { throw new ArgumentNullException(nameof(localizerFactory)); } - if (encoder == null) - { - throw new ArgumentNullException(nameof(encoder)); - } - _factory = localizerFactory; - _encoder = encoder; } /// @@ -49,7 +40,7 @@ namespace Microsoft.AspNet.Mvc.Localization throw new ArgumentNullException(nameof(resourceSource)); } - return new HtmlLocalizer(_factory.Create(resourceSource), _encoder); + return new HtmlLocalizer(_factory.Create(resourceSource)); } /// @@ -71,7 +62,7 @@ namespace Microsoft.AspNet.Mvc.Localization } var localizer = _factory.Create(baseName, location); - return new HtmlLocalizer(localizer, _encoder); + return new HtmlLocalizer(localizer); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizerOfT.cs b/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizerOfT.cs index 4342496503..4247dd8121 100644 --- a/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizerOfT.cs +++ b/src/Microsoft.AspNet.Mvc.Localization/HtmlLocalizerOfT.cs @@ -9,9 +9,9 @@ using Microsoft.Extensions.Localization; namespace Microsoft.AspNet.Mvc.Localization { /// - /// This is an that provides localized HTML content. + /// This is an implementation that provides localized HTML content. /// - /// The to scope the resource names. + /// The to scope the resource names. public class HtmlLocalizer : IHtmlLocalizer { private readonly IHtmlLocalizer _localizer; diff --git a/src/Microsoft.AspNet.Mvc.Localization/IHtmlLocalizerOfT.cs b/src/Microsoft.AspNet.Mvc.Localization/IHtmlLocalizerOfT.cs index 4df8e73fe5..62323d8142 100644 --- a/src/Microsoft.AspNet.Mvc.Localization/IHtmlLocalizerOfT.cs +++ b/src/Microsoft.AspNet.Mvc.Localization/IHtmlLocalizerOfT.cs @@ -6,7 +6,7 @@ namespace Microsoft.AspNet.Mvc.Localization /// /// An that provides localized HTML content. /// - /// The to scope the resource names. + /// The to scope the resource names. public interface IHtmlLocalizer : IHtmlLocalizer { } diff --git a/src/Microsoft.AspNet.Mvc.Localization/LocalizedHtmlString.cs b/src/Microsoft.AspNet.Mvc.Localization/LocalizedHtmlString.cs index d6842a83d0..f2be394544 100644 --- a/src/Microsoft.AspNet.Mvc.Localization/LocalizedHtmlString.cs +++ b/src/Microsoft.AspNet.Mvc.Localization/LocalizedHtmlString.cs @@ -1,22 +1,34 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Mvc.Rendering; +using System; +using System.IO; +using System.Text; +using System.Text.Encodings.Web; +using Microsoft.AspNet.Html; namespace Microsoft.AspNet.Mvc.Localization { /// - /// An with localized content. + /// An with localized content. /// - public class LocalizedHtmlString : HtmlString + public class LocalizedHtmlString : IHtmlContent { +#if DOTNET5_5 + private static readonly object[] EmptyArguments = Array.Empty(); +#else + private static readonly object[] EmptyArguments = new object[0]; +#endif + private readonly object[] _arguments; + /// /// Creates an instance of . /// /// The name of the string resource. /// The string resource. - public LocalizedHtmlString(string key, string value) - : this(key, value, isResourceNotFound: false) + /// A flag that indicates if the resource is not found. + public LocalizedHtmlString(string key, string value, bool isResourceNotFound) + : this(key, value, isResourceNotFound, arguments: EmptyArguments) { } @@ -26,11 +38,28 @@ namespace Microsoft.AspNet.Mvc.Localization /// The name of the string resource. /// The string resource. /// A flag that indicates if the resource is not found. - public LocalizedHtmlString(string key, string value, bool isResourceNotFound) - : base(value) + /// The values to format the with. + public LocalizedHtmlString(string key, string value, bool isResourceNotFound, params object[] arguments) { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (arguments == null) + { + throw new ArgumentNullException(nameof(arguments)); + } + Key = key; + Value = value; IsResourceNotFound = isResourceNotFound; + _arguments = arguments; } /// @@ -41,11 +70,145 @@ namespace Microsoft.AspNet.Mvc.Localization /// /// The string resource. /// - public string Value => ToString(); + public string Value { get; } /// /// Gets a flag that indicates if the resource is not found. /// public bool IsResourceNotFound { get; } + + /// + public void WriteTo(TextWriter writer, HtmlEncoder encoder) + { + if (writer == null) + { + throw new ArgumentNullException(nameof(writer)); + } + + if (encoder == null) + { + throw new ArgumentNullException(nameof(encoder)); + } + + var htmlTextWriter = writer as HtmlTextWriter; + if (htmlTextWriter == null) + { + FormatValue(writer, encoder, Value, _arguments); + } + else + { + htmlTextWriter.Write(this); + } + } + + private static void FormatValue( + TextWriter writer, + HtmlEncoder encoder, + string resourceString, + object[] arguments) + { + var position = 0; + var length = resourceString.Length; + StringBuilder tokenBuffer = null; + var isToken = false; + + while (position < length) + { + var currentCharacter = resourceString[position]; + position++; + + if (currentCharacter == '}') + { + if (position < length && resourceString[position] == '}') + { + // Escaped curly brace: "}}". + AppendCurlyBrace(isToken, currentCharacter, tokenBuffer, writer); + position++; + } + else + { + // End of a token. + Append(isToken, '}', tokenBuffer, writer); + if (position == length) + { + break; + } + + AppendToOutput(tokenBuffer, arguments, writer, encoder); + + isToken = false; + tokenBuffer = null; + } + } + else if (currentCharacter == '{') + { + if (position < length && resourceString[position] == '{') + { + // Escaped curly brace: "{{". + AppendCurlyBrace(isToken, currentCharacter, tokenBuffer, writer); + position++; + } + else + { + // Start of a new token. + tokenBuffer = new StringBuilder(); + tokenBuffer.Append('{'); + isToken = true; + } + } + else + { + Append(isToken, currentCharacter, tokenBuffer, writer); + } + } + + AppendToOutput(tokenBuffer, arguments, writer, encoder); + } + + private static void Append( + bool isToken, + char value, + StringBuilder tokenBuffer, + TextWriter writer) + { + if (isToken) + { + tokenBuffer.Append(value); + } + else + { + writer.Write(value); + } + } + + private static void AppendCurlyBrace( + bool isToken, + char curlyBrace, + StringBuilder tokenBuffer, + TextWriter writer) + { + if (isToken) + { + tokenBuffer + .Append(curlyBrace) + .Append(curlyBrace); + } + else + { + writer.Write(curlyBrace); + } + } + + private static void AppendToOutput( + StringBuilder tokenBuffer, + object[] arguments, + TextWriter writer, + HtmlEncoder encoder) + { + if (tokenBuffer != null && tokenBuffer.Length > 0) + { + encoder.Encode(writer, string.Format(tokenBuffer.ToString(), arguments)); + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Localization/ViewLocalizer.cs b/src/Microsoft.AspNet.Mvc.Localization/ViewLocalizer.cs index af662d85a2..a9dc3b8eda 100644 --- a/src/Microsoft.AspNet.Mvc.Localization/ViewLocalizer.cs +++ b/src/Microsoft.AspNet.Mvc.Localization/ViewLocalizer.cs @@ -12,7 +12,7 @@ using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Mvc.Localization { /// - /// A that provides localized strings for views. + /// A implementation that provides localized strings for views. /// public class ViewLocalizer : IViewLocalizer, ICanHasViewContext { @@ -25,9 +25,7 @@ namespace Microsoft.AspNet.Mvc.Localization /// /// The . /// The . - public ViewLocalizer( - IHtmlLocalizerFactory localizerFactory, - IApplicationEnvironment applicationEnvironment) + public ViewLocalizer(IHtmlLocalizerFactory localizerFactory, IApplicationEnvironment applicationEnvironment) { if (localizerFactory == null) { @@ -75,15 +73,13 @@ namespace Microsoft.AspNet.Mvc.Localization public LocalizedString GetString(string name) => _localizer.GetString(name); /// - public LocalizedString GetString(string name, params object[] values) => - _localizer.GetString(name, values); + public LocalizedString GetString(string name, params object[] values) => _localizer.GetString(name, values); /// public LocalizedHtmlString Html(string key) => _localizer.Html(key); /// - public LocalizedHtmlString Html(string key, params object[] arguments) => - _localizer.Html(key, arguments); + public LocalizedHtmlString Html(string key, params object[] arguments) => _localizer.Html(key, arguments); /// public IStringLocalizer WithCulture(CultureInfo culture) => _localizer.WithCulture(culture); @@ -103,6 +99,7 @@ namespace Microsoft.AspNet.Mvc.Localization { baseName = baseName.Substring(1); } + _localizer = _localizerFactory.Create(baseName, _applicationName); } diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/MutableObjectModelBinderTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/MutableObjectModelBinderTest.cs index e5915c720c..dda33b0440 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/MutableObjectModelBinderTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/MutableObjectModelBinderTest.cs @@ -1357,7 +1357,6 @@ namespace Microsoft.AspNet.Mvc.ModelBinding } } - // Reviewers: Is this inconsistency with CanUpdateProperty() an issue we should be tracking? [Theory] [MemberData(nameof(MyCanUpdateButCannotSetPropertyData))] public void SetProperty_ValueProvidedAndCanUpdatePropertyTrue_DoesNothing( diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/TagHelperSampleTest.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/TagHelperSampleTest.cs index 64a075bef2..c1770ab59d 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/TagHelperSampleTest.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/TagHelperSampleTest.cs @@ -26,14 +26,12 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests { "/Home/Create", "/Home/Create?Name=Billy&Blurb=hello&DateOfBirth=2000-11-30&YearsEmployeed=0", - "/Home/Create", "/Home/Create?Name=Joe&Blurb=goodbye&DateOfBirth=1980-10-20&YearsEmployeed=1", "/Home/Edit/0", "/Home/Edit/0?Name=Bobby&Blurb=howdy&DateOfBirth=1999-11-30&YearsEmployeed=1", + "/Home/Edit/0?Name=Bobby&Blurb=howdy&DateOfBirth=1999-11-30&YearsEmployeed=2", "/Home/Edit/1", "/Home/Edit/1?Name=Jack&Blurb=goodbye&DateOfBirth=1979-10-20&YearsEmployeed=4", - "/Home/Edit/0", - "/Home/Edit/0?Name=Bobby&Blurb=howdy&DateOfBirth=1999-11-30&YearsEmployeed=2", }; // Three paths hit aspnet/External#50 with Mono on Mac. diff --git a/test/Microsoft.AspNet.Mvc.Localization.Test/HtmlLocalizerTest.cs b/test/Microsoft.AspNet.Mvc.Localization.Test/HtmlLocalizerTest.cs index 2887795f6c..2ff1bc919f 100644 --- a/test/Microsoft.AspNet.Mvc.Localization.Test/HtmlLocalizerTest.cs +++ b/test/Microsoft.AspNet.Mvc.Localization.Test/HtmlLocalizerTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; using Microsoft.AspNet.Testing; using Microsoft.Extensions.Localization; @@ -23,7 +24,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test var stringLocalizer = new Mock(); stringLocalizer.Setup(s => s["Hello"]).Returns(localizedString); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer.Object, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer.Object); // Act var actualLocalizedString = htmlLocalizer["Hello"]; @@ -41,7 +42,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test var stringLocalizer = new Mock(); stringLocalizer.Setup(s => s["Hello", "test"]).Returns(localizedString); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer.Object, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer.Object); // Act var actualLocalizedString = htmlLocalizer["Hello", "test"]; @@ -104,14 +105,19 @@ namespace Microsoft.AspNet.Mvc.Localization.Test var stringLocalizer = new Mock(); stringLocalizer.Setup(s => s["Hello"]).Returns(localizedString); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer.Object, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer.Object); // Act var localizedHtmlString = htmlLocalizer.Html("Hello", arguments); // Assert Assert.NotNull(localizedHtmlString); - Assert.Equal(expectedText, localizedHtmlString.Value); + Assert.Equal(format, localizedHtmlString.Value); + using (var writer = new StringWriter()) + { + localizedHtmlString.WriteTo(writer, new HtmlTestEncoder()); + Assert.Equal(expectedText, writer.ToString()); + } } public static TheoryData InvalidResourceStringData @@ -135,7 +141,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test [Theory] [MemberData(nameof(InvalidResourceStringData))] - public void HtmlLocalizer_HtmlWithInvalidResourcestring_ThrowsException(string format) + public void HtmlLocalizer_HtmlWithInvalidResourceString_ContentThrowsException(string format) { // Arrange var localizedString = new LocalizedString("Hello", format); @@ -143,10 +149,12 @@ namespace Microsoft.AspNet.Mvc.Localization.Test var stringLocalizer = new Mock(); stringLocalizer.Setup(s => s["Hello"]).Returns(localizedString); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer.Object, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer.Object); + var content = htmlLocalizer.Html("Hello", new object[] { }); // Act - var exception = Assert.Throws(() => htmlLocalizer.Html("Hello", new object[] { })); + var exception = Assert.Throws( + () => content.WriteTo(TextWriter.Null, new HtmlTestEncoder())); // Assert Assert.NotNull(exception); @@ -159,7 +167,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); // Act var actualLocalizedString = htmlLocalizer.GetString("John"); @@ -174,7 +182,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); // Act var actualLocalizedString = htmlLocalizer.GetString("John", "Doe"); @@ -189,7 +197,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); // Act var actualLocalizedString = htmlLocalizer.Html("John"); @@ -204,7 +212,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); // Act var actualLocalizedString = htmlLocalizer.WithCulture(new CultureInfo("fr"))["John"]; @@ -219,7 +227,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); // Act var allLocalizedStrings = htmlLocalizer.GetAllStrings(includeAncestorCultures: false).ToList(); @@ -235,7 +243,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); // Act var allLocalizedStrings = htmlLocalizer.GetAllStrings().ToList(); diff --git a/test/Microsoft.AspNet.Mvc.Localization.Test/ViewLocalizerTest.cs b/test/Microsoft.AspNet.Mvc.Localization.Test/ViewLocalizerTest.cs index 1453e36351..b158df06dd 100644 --- a/test/Microsoft.AspNet.Mvc.Localization.Test/ViewLocalizerTest.cs +++ b/test/Microsoft.AspNet.Mvc.Localization.Test/ViewLocalizerTest.cs @@ -5,12 +5,10 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Text.Encodings.Web; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.ViewEngines; using Microsoft.Extensions.Localization; using Microsoft.Extensions.PlatformAbstractions; -using Microsoft.Extensions.WebEncoders.Testing; using Moq; using Xunit; @@ -87,7 +85,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test { // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); var applicationEnvironment = new Mock(); applicationEnvironment.Setup(a => a.ApplicationName).Returns("TestApplication"); var viewLocalizer = new ViewLocalizer(new TestHtmlLocalizerFactory(), applicationEnvironment.Object); @@ -112,7 +110,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test { // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); var applicationEnvironment = new Mock(); applicationEnvironment.Setup(a => a.ApplicationName).Returns("TestApplication"); var viewLocalizer = new ViewLocalizer(new TestHtmlLocalizerFactory(), applicationEnvironment.Object); @@ -138,7 +136,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test { // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); var applicationEnvironment = new Mock(); applicationEnvironment.Setup(a => a.ApplicationName).Returns("TestApplication"); var viewLocalizer = new ViewLocalizer(new TestHtmlLocalizerFactory(), applicationEnvironment.Object); @@ -162,7 +160,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test { // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); var applicationEnvironment = new Mock(); applicationEnvironment.Setup(a => a.ApplicationName).Returns("TestApplication"); var viewLocalizer = new ViewLocalizer(new TestHtmlLocalizerFactory(), applicationEnvironment.Object); @@ -186,7 +184,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test { // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); var applicationEnvironment = new Mock(); applicationEnvironment.Setup(a => a.ApplicationName).Returns("TestApplication"); var viewLocalizer = new ViewLocalizer(new TestHtmlLocalizerFactory(), applicationEnvironment.Object); @@ -210,7 +208,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test { // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); var applicationEnvironment = new Mock(); applicationEnvironment.Setup(a => a.ApplicationName).Returns("TestApplication"); var viewLocalizer = new ViewLocalizer(new TestHtmlLocalizerFactory(), applicationEnvironment.Object); @@ -234,7 +232,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test { // Arrange var stringLocalizer = new TestStringLocalizer(); - var htmlLocalizer = new HtmlLocalizer(stringLocalizer, new HtmlTestEncoder()); + var htmlLocalizer = new HtmlLocalizer(stringLocalizer); var applicationEnvironment = new Mock(); applicationEnvironment.Setup(a => a.ApplicationName).Returns("TestApplication"); var viewLocalizer = new ViewLocalizer(new TestHtmlLocalizerFactory(), applicationEnvironment.Object); @@ -257,7 +255,7 @@ namespace Microsoft.AspNet.Mvc.Localization.Test { private IStringLocalizer _stringLocalizer { get; set; } - public TestHtmlLocalizer(IStringLocalizer stringLocalizer, HtmlEncoder encoder) + public TestHtmlLocalizer(IStringLocalizer stringLocalizer) { _stringLocalizer = stringLocalizer; } @@ -285,25 +283,31 @@ namespace Microsoft.AspNet.Mvc.Localization.Test public IStringLocalizer WithCulture(CultureInfo culture) { - return new TestStringLocalizer(culture); + return new TestHtmlLocalizer(new TestStringLocalizer(culture)); } IHtmlLocalizer IHtmlLocalizer.WithCulture(CultureInfo culture) { - return new TestHtmlLocalizer(new TestStringLocalizer(culture), new HtmlTestEncoder()); + return new TestHtmlLocalizer(new TestStringLocalizer(culture)); } public LocalizedHtmlString Html(string key) { - var localiziedString = _stringLocalizer.GetString(key); - return new LocalizedHtmlString(localiziedString.Name, localiziedString.Value); + var localizedString = _stringLocalizer.GetString(key); + return new LocalizedHtmlString( + localizedString.Name, + localizedString.Value, + isResourceNotFound: false); } public LocalizedHtmlString Html(string key, params object[] arguments) { var localizedString = _stringLocalizer.GetString(key, arguments); - - return new LocalizedHtmlString(localizedString.Name, localizedString.Value); + return new LocalizedHtmlString( + localizedString.Name, + localizedString.Value, + isResourceNotFound: false, + arguments: arguments); } IEnumerable IStringLocalizer.GetAllStrings(bool includeAncestorCultures) @@ -316,12 +320,12 @@ namespace Microsoft.AspNet.Mvc.Localization.Test { public IHtmlLocalizer Create(Type resourceSource) { - return new TestHtmlLocalizer(new TestStringLocalizer(), new HtmlTestEncoder()); + return new TestHtmlLocalizer(new TestStringLocalizer()); } public IHtmlLocalizer Create(string baseName, string location) { - return new TestHtmlLocalizer(new TestStringLocalizer(), new HtmlTestEncoder()); + return new TestHtmlLocalizer(new TestStringLocalizer()); } } }