diff --git a/src/Localization/Localization/src/ResourceManagerStringLocalizerFactory.cs b/src/Localization/Localization/src/ResourceManagerStringLocalizerFactory.cs
index 2eb737eaa7..a525f72368 100644
--- a/src/Localization/Localization/src/ResourceManagerStringLocalizerFactory.cs
+++ b/src/Localization/Localization/src/ResourceManagerStringLocalizerFactory.cs
@@ -101,9 +101,8 @@ namespace Microsoft.Extensions.Localization
else
{
// This expectation is defined by dotnet's automatic resource storage.
- // We have to conform to "{RootNamespace}.{ResourceLocation}.{FullTypeName - AssemblyName}".
- var assemblyName = new AssemblyName(typeInfo.Assembly.FullName).Name;
- return baseNamespace + "." + resourcesRelativePath + TrimPrefix(typeInfo.FullName, assemblyName + ".");
+ // We have to conform to "{RootNamespace}.{ResourceLocation}.{FullTypeName - RootNamespace}".
+ return baseNamespace + "." + resourcesRelativePath + TrimPrefix(typeInfo.FullName, baseNamespace + ".");
}
}
@@ -267,4 +266,4 @@ namespace Microsoft.Extensions.Localization
return name;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/AssemblyInfo.cs b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/AssemblyInfo.cs
new file mode 100644
index 0000000000..bc7d005571
--- /dev/null
+++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/AssemblyInfo.cs
@@ -0,0 +1,5 @@
+using System.Reflection;
+using Microsoft.Extensions.Localization;
+
+[assembly: ResourceLocation("Resources")]
+[assembly: RootNamespace("LocalizationTest.Abc")]
diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Controllers/ValuesController.cs b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Controllers/ValuesController.cs
new file mode 100644
index 0000000000..93dad2460a
--- /dev/null
+++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Controllers/ValuesController.cs
@@ -0,0 +1,9 @@
+// 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.
+
+namespace LocalizationTest.Abc.Controllers
+{
+ public class ValuesController
+ {
+ }
+}
diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj
new file mode 100644
index 0000000000..d7a45a84ab
--- /dev/null
+++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj
@@ -0,0 +1,26 @@
+
+
+ netcoreapp3.0;net472
+ LocalizationTest.Abc
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ResXFileCodeGenerator
+ ValuesController.Designer.cs
+
+
+
diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Resources/Controllers/ValuesController.resx b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Resources/Controllers/ValuesController.resx
new file mode 100644
index 0000000000..9966ea419e
--- /dev/null
+++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Resources/Controllers/ValuesController.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ValFromResource
+
+
\ No newline at end of file
diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/StringLocalizerOfTRootNamespaceTest.cs b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/StringLocalizerOfTRootNamespaceTest.cs
new file mode 100644
index 0000000000..7c892e65dd
--- /dev/null
+++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/StringLocalizerOfTRootNamespaceTest.cs
@@ -0,0 +1,26 @@
+// 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 LocalizationTest.Abc.Controllers;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Options;
+using Moq;
+using Xunit;
+
+namespace Microsoft.Extensions.Localization.RootNamespace.Tests
+{
+ public class StringLocalizerOfTRootNamespaceTest
+ {
+ [Fact]
+ public void RootNamespace()
+ {
+ var locOptions = new LocalizationOptions();
+ var options = new Mock>();
+ options.Setup(o => o.Value).Returns(locOptions);
+ var factory = new ResourceManagerStringLocalizerFactory(options.Object, NullLoggerFactory.Instance);
+
+ var valuesLoc = factory.Create(typeof(ValuesController));
+ Assert.Equal("ValFromResource", valuesLoc["String1"]);
+ }
+ }
+}
diff --git a/src/Localization/Localization/test/LocalizationServiceCollectionExtensionsTest.cs b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/LocalizationServiceCollectionExtensionsTest.cs
similarity index 100%
rename from src/Localization/Localization/test/LocalizationServiceCollectionExtensionsTest.cs
rename to src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/LocalizationServiceCollectionExtensionsTest.cs
diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests.csproj b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Microsoft.Extensions.Localization.Tests.csproj
similarity index 100%
rename from src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests.csproj
rename to src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Microsoft.Extensions.Localization.Tests.csproj
diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Model.cs b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Model.cs
new file mode 100644
index 0000000000..9d95c370fd
--- /dev/null
+++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Model.cs
@@ -0,0 +1,8 @@
+// This namespace for test resources with alternative RootNamespace
+namespace MyNamespace
+{
+ public class Model
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/src/Localization/Localization/test/ResourceManagerStringLocalizerFactoryTest.cs b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/ResourceManagerStringLocalizerFactoryTest.cs
similarity index 96%
rename from src/Localization/Localization/test/ResourceManagerStringLocalizerFactoryTest.cs
rename to src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/ResourceManagerStringLocalizerFactoryTest.cs
index 7a18c0e4bd..86f6e15ccd 100644
--- a/src/Localization/Localization/test/ResourceManagerStringLocalizerFactoryTest.cs
+++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/ResourceManagerStringLocalizerFactoryTest.cs
@@ -7,6 +7,7 @@ using System.Reflection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
+using MyNamespace;
using Moq;
using Xunit;
@@ -132,7 +133,7 @@ namespace Microsoft.Extensions.Localization.Tests
var loggerFactory = NullLoggerFactory.Instance;
var resourcePath = Path.Combine("My", "Resources");
- var rootNamespace = "MyNamespace";
+ var rootNamespace = nameof(MyNamespace);
var rootNamespaceAttribute = new RootNamespaceAttribute(rootNamespace);
var typeFactory = new TestResourceManagerStringLocalizerFactory(
@@ -141,12 +142,13 @@ namespace Microsoft.Extensions.Localization.Tests
rootNamespaceAttribute: rootNamespaceAttribute,
loggerFactory: loggerFactory);
- var type = typeof(ResourceManagerStringLocalizerFactoryTest);
+ var type = typeof(Model);
+
// Act
typeFactory.Create(type);
// Assert
- Assert.Equal($"Microsoft.Extensions.Localization.Tests.ResourceManagerStringLocalizerFactoryTest", typeFactory.BaseName);
+ Assert.Equal($"{rootNamespace}.{nameof(Model)}", typeFactory.BaseName);
}
[Fact]
@@ -159,7 +161,7 @@ namespace Microsoft.Extensions.Localization.Tests
var loggerFactory = NullLoggerFactory.Instance;
var resourcePath = Path.Combine("My", "Resources");
- var rootNamespace = "MyNamespace";
+ var rootNamespace = nameof(MyNamespace);
var resourceLocationAttribute = new ResourceLocationAttribute(resourcePath);
var rootNamespaceAttribute = new RootNamespaceAttribute(rootNamespace);
@@ -169,12 +171,13 @@ namespace Microsoft.Extensions.Localization.Tests
rootNamespaceAttribute,
loggerFactory);
- var type = typeof(ResourceManagerStringLocalizerFactoryTest);
+ var type = typeof(Model);
+
// Act
typeFactory.Create(type);
// Assert
- Assert.Equal($"MyNamespace.My.Resources.ResourceManagerStringLocalizerFactoryTest", typeFactory.BaseName);
+ Assert.Equal($"{rootNamespace}.My.Resources.{nameof(Model)}", typeFactory.BaseName);
}
[Fact]
diff --git a/src/Localization/Localization/test/ResourceManagerStringLocalizerTest.cs b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/ResourceManagerStringLocalizerTest.cs
similarity index 100%
rename from src/Localization/Localization/test/ResourceManagerStringLocalizerTest.cs
rename to src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/ResourceManagerStringLocalizerTest.cs
diff --git a/src/Localization/Localization/test/StringLocalizerOfTTest.cs b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/StringLocalizerOfTTest.cs
similarity index 100%
rename from src/Localization/Localization/test/StringLocalizerOfTTest.cs
rename to src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/StringLocalizerOfTTest.cs