public new IStringLocalizer Create(string baseName, string location)
        {
            FieldInfo fieldInfo = typeof(SqlStringLocalizerFactory).GetField("_resourceLocalizations",
                                                                             BindingFlags.Static | BindingFlags.NonPublic);
            var resourceLocalizations = (ConcurrentDictionary <string, IStringLocalizer>)fieldInfo.GetValue(this);

            fieldInfo = typeof(SqlStringLocalizerFactory).GetField("_developmentSetup",
                                                                   BindingFlags.Instance | BindingFlags.NonPublic);
            var developmentSetup = (DevelopmentSetup)fieldInfo.GetValue(this);

            fieldInfo = typeof(SqlStringLocalizerFactory).GetField("_options",
                                                                   BindingFlags.Instance | BindingFlags.NonPublic);
            var localizationOptions = (IOptions <SqlLocalizationOptions>)fieldInfo.GetValue(this);

            if (resourceLocalizations.Keys.Contains(baseName + location))
            {
                return(resourceLocalizations[baseName + location]);
            }

            Type       type   = GetType().BaseType;
            MethodInfo method = type.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic)
                                .Single(m => m.Name == "GetAllFromDatabaseForResource");
            SqlStringLocalizerFactory   baseFactory   = this;
            Dictionary <string, string> localizations =
                (Dictionary <string, string>)method.Invoke(baseFactory, new object[] { baseName + location });

            SqlStringLocalizer sqlStringLocalizer = new SqlStringLocalizer(localizations, developmentSetup, baseName + location, localizationOptions.Value.ReturnOnlyKeyIfNotFound, localizationOptions.Value.CreateNewRecordWhenLocalisedStringDoesNotExist);

            return(resourceLocalizations.GetOrAdd(baseName + location, sqlStringLocalizer));
        }
        public void ResourceNotFound_Is_False_When_Resource_Exists()
        {
            // Arrange
            var stringProviderMock = new Mock <IStringProvider>();

            stringProviderMock.Setup(p => p.GetString(It.IsAny <string>(), It.IsAny <CultureInfo>())).Returns <string, CultureInfo>((x, y) => "Invoer tekst");
            var localizer = new SqlStringLocalizer(stringProviderMock.Object, "Test.Namespace.Foo.Bar", NullLogger.Instance);

            // Act
            var localizedString = localizer["INPUT_STRING"];

            // Assert
            Assert.False(localizedString.ResourceNotFound);
        }
        public void Get_Same_Value_When_Not_Found()
        {
            // Arrange
            var stringProviderMock = new Mock <IStringProvider>();

            stringProviderMock.Setup(p => p.GetString(It.IsAny <string>(), It.IsAny <CultureInfo>())).Returns <string, CultureInfo>((x, y) => null);
            var localizer = new SqlStringLocalizer(stringProviderMock.Object, "Test.Namespace.Foo.Bar", NullLogger.Instance);

            // Act
            var localizedString = localizer["INPUT_STRING"];

            // Assert
            Assert.Equal("INPUT_STRING", localizedString.Value);
        }
        public void With_Culture_Returns_New_Localizer_With_Selected_Culture()
        {
            // Arrange
            const string lookupKey          = "INPUT_STRING";
            const string nlAnswer           = "Invoer tekst";
            const string enAnswer           = "Input text";
            var          stringProviderMock = new Mock <IStringProvider>();

            stringProviderMock.Setup(p => p.GetString(lookupKey, CultureInfo.GetCultureInfo("nl"))).Returns <string, CultureInfo>((x, y) => nlAnswer);
            stringProviderMock.Setup(p => p.GetString(lookupKey, CultureInfo.GetCultureInfo("en"))).Returns <string, CultureInfo>((x, y) => enAnswer);
            CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo("nl");
            var currentUiLocalizer = new SqlStringLocalizer(stringProviderMock.Object, "Test.Namespace.Foo.Bar", NullLogger.Instance);

            // Act
            var englishLocalizer = currentUiLocalizer.WithCulture(CultureInfo.GetCultureInfo("en"));
            var localizedString  = englishLocalizer[lookupKey];

            // Assert
            Assert.Equal(enAnswer, localizedString.Value);
        }
        public void Return_Correct_Localization_Based_On_Ui_Culture()
        {
            // Arrange
            const string lookupKey          = "INPUT_STRING";
            const string nlAnswer           = "Invoer tekst";
            const string enAnswer           = "Input text";
            var          stringProviderMock = new Mock <IStringProvider>();

            stringProviderMock.Setup(p => p.GetString(lookupKey, CultureInfo.GetCultureInfo("nl"))).Returns <string, CultureInfo>((x, y) => nlAnswer);
            stringProviderMock.Setup(p => p.GetString(lookupKey, CultureInfo.GetCultureInfo("en"))).Returns <string, CultureInfo>((x, y) => enAnswer);
            var localizer = new SqlStringLocalizer(stringProviderMock.Object, "Test.Namespace.Foo.Bar", NullLogger.Instance);

            CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo("nl");

            // Act
            var localizedString = localizer[lookupKey];

            // Assert
            Assert.Equal(nlAnswer, localizedString.Value);
            stringProviderMock.Verify(moq => moq.GetString(lookupKey, CultureInfo.GetCultureInfo("nl")), Times.AtLeastOnce());
            stringProviderMock.Verify(moq => moq.GetString(lookupKey, CultureInfo.GetCultureInfo("en")), Times.Never());
        }