Skip to content
This repository was archived by the owner on Nov 29, 2018. It is now read-only.

Log diagnostic info about search for localization resources #331

Merged
merged 1 commit into from
Feb 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,18 @@ public LocalizedString(string name, string value)
/// <param name="value">The actual string.</param>
/// <param name="resourceNotFound">Whether the string was not found in a resource. Set this to <c>true</c> to indicate an alternate string value was used.</param>
public LocalizedString(string name, string value, bool resourceNotFound)
: this(name, value, resourceNotFound, searchedLocation: null)
{
}

/// <summary>
/// Creates a new <see cref="LocalizedString"/>.
/// </summary>
/// <param name="name">The name of the string in the resource it was loaded from.</param>
/// <param name="value">The actual string.</param>
/// <param name="resourceNotFound">Whether the string was not found in a resource. Set this to <c>true</c> to indicate an alternate string value was used.</param>
/// <param name="searchedLocation">The location which was searched for a localization value.</param>
public LocalizedString(string name, string value, bool resourceNotFound, string searchedLocation)
{
if (name == null)
{
Expand All @@ -41,6 +53,7 @@ public LocalizedString(string name, string value, bool resourceNotFound)
Name = name;
Value = value;
ResourceNotFound = resourceNotFound;
SearchedLocation = searchedLocation;
}

public static implicit operator string(LocalizedString localizedString)
Expand All @@ -63,6 +76,11 @@ public static implicit operator string(LocalizedString localizedString)
/// </summary>
public bool ResourceNotFound { get; }

/// <summary>
/// The location which was searched for a localization value.
/// </summary>
public string SearchedLocation { get; }

/// <summary>
/// Returns the actual string.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// 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 System;
using System.Globalization;
using Microsoft.Extensions.Logging;

namespace Microsoft.Extensions.Localization.Internal
{
internal static class ResourceManagerStringLocalizerLoggerExtensions
{
private static readonly Action<ILogger, string, string, CultureInfo, Exception> _searchedLocation;

static ResourceManagerStringLocalizerLoggerExtensions()
{
_searchedLocation = LoggerMessage.Define<string, string, CultureInfo>(
LogLevel.Debug,
1,
$"{nameof(ResourceManagerStringLocalizer)} searched for '{{Key}}' in '{{LocationSearched}}' with culture '{{Culture}}'.");
}

public static void SearchedLocation(this ILogger logger, string key, string searchedLocation, CultureInfo culture)
{
_searchedLocation(logger, key, searchedLocation, culture, null);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<ProjectReference Include="..\Microsoft.Extensions.Localization.Abstractions\Microsoft.Extensions.Localization.Abstractions.csproj" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="1.2.0-*" />
<PackageReference Include="Microsoft.Extensions.Options" Version="1.2.0-*" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.2.0-*" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System.Reflection;
using System.Resources;
using Microsoft.Extensions.Localization.Internal;
using Microsoft.Extensions.Logging;

namespace Microsoft.Extensions.Localization
{
Expand All @@ -23,6 +24,7 @@ public class ResourceManagerStringLocalizer : IStringLocalizer
private readonly ResourceManager _resourceManager;
private readonly IResourceStringProvider _resourceStringProvider;
private readonly string _resourceBaseName;
private readonly ILogger _logger;

/// <summary>
/// Creates a new <see cref="ResourceManagerStringLocalizer"/>.
Expand All @@ -31,16 +33,19 @@ public class ResourceManagerStringLocalizer : IStringLocalizer
/// <param name="resourceAssembly">The <see cref="Assembly"/> that contains the strings as embedded resources.</param>
/// <param name="baseName">The base name of the embedded resource that contains the strings.</param>
/// <param name="resourceNamesCache">Cache of the list of strings for a given resource assembly name.</param>
/// <param name="logger">The <see cref="ILogger"/>.</param>
public ResourceManagerStringLocalizer(
ResourceManager resourceManager,
Assembly resourceAssembly,
string baseName,
IResourceNamesCache resourceNamesCache)
IResourceNamesCache resourceNamesCache,
ILogger logger)
: this(
resourceManager,
new AssemblyWrapper(resourceAssembly),
baseName,
resourceNamesCache)
resourceNamesCache,
logger)
{
}

Expand All @@ -51,12 +56,14 @@ public ResourceManagerStringLocalizer(
ResourceManager resourceManager,
AssemblyWrapper resourceAssemblyWrapper,
string baseName,
IResourceNamesCache resourceNamesCache)
IResourceNamesCache resourceNamesCache,
ILogger logger)
: this(
resourceManager,
new AssemblyResourceStringProvider(resourceNamesCache, resourceAssemblyWrapper, baseName),
baseName,
resourceNamesCache)
resourceNamesCache,
logger)
{
}

Expand All @@ -67,7 +74,8 @@ public ResourceManagerStringLocalizer(
ResourceManager resourceManager,
IResourceStringProvider resourceStringProvider,
string baseName,
IResourceNamesCache resourceNamesCache)
IResourceNamesCache resourceNamesCache,
ILogger logger)
{
if (resourceManager == null)
{
Expand All @@ -89,10 +97,16 @@ public ResourceManagerStringLocalizer(
throw new ArgumentNullException(nameof(resourceNamesCache));
}

if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}

_resourceStringProvider = resourceStringProvider;
_resourceManager = resourceManager;
_resourceBaseName = baseName;
_resourceNamesCache = resourceNamesCache;
_logger = logger;
}

/// <inheritdoc />
Expand All @@ -107,7 +121,7 @@ public virtual LocalizedString this[string name]

var value = GetStringSafely(name, null);

return new LocalizedString(name, value ?? name, resourceNotFound: value == null);
return new LocalizedString(name, value ?? name, resourceNotFound: value == null, searchedLocation: _resourceBaseName);
}
}

Expand All @@ -124,7 +138,7 @@ public virtual LocalizedString this[string name]
var format = GetStringSafely(name, null);
var value = string.Format(format ?? name, arguments);

return new LocalizedString(name, value, resourceNotFound: format == null);
return new LocalizedString(name, value, resourceNotFound: format == null, searchedLocation: _resourceBaseName);
}
}

Expand All @@ -140,13 +154,15 @@ public IStringLocalizer WithCulture(CultureInfo culture)
_resourceManager,
_resourceStringProvider,
_resourceBaseName,
_resourceNamesCache)
_resourceNamesCache,
_logger)
: new ResourceManagerWithCultureStringLocalizer(
_resourceManager,
_resourceStringProvider,
_resourceBaseName,
_resourceNamesCache,
culture);
culture,
_logger);
}

/// <inheritdoc />
Expand All @@ -173,7 +189,7 @@ protected IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures,
foreach (var name in resourceNames)
{
var value = GetStringSafely(name, culture);
yield return new LocalizedString(name, value ?? name, resourceNotFound: value == null);
yield return new LocalizedString(name, value ?? name, resourceNotFound: value == null, searchedLocation: _resourceBaseName);
}
}

Expand All @@ -191,7 +207,11 @@ protected string GetStringSafely(string name, CultureInfo culture)
throw new ArgumentNullException(nameof(name));
}

var cacheKey = $"name={name}&culture={(culture ?? CultureInfo.CurrentUICulture).Name}";
var keyCulture = culture ?? CultureInfo.CurrentUICulture;

var cacheKey = $"name={name}&culture={keyCulture.Name}";

_logger.SearchedLocation(name, _resourceBaseName, keyCulture);

if (_missingManifestCache.ContainsKey(cacheKey))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.IO;
using System.Reflection;
using System.Resources;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

namespace Microsoft.Extensions.Localization
Expand All @@ -24,20 +25,30 @@ public class ResourceManagerStringLocalizerFactory : IStringLocalizerFactory
private readonly ConcurrentDictionary<string, ResourceManagerStringLocalizer> _localizerCache =
new ConcurrentDictionary<string, ResourceManagerStringLocalizer>();
private readonly string _resourcesRelativePath;
private readonly ILoggerFactory _loggerFactory;

/// <summary>
/// Creates a new <see cref="ResourceManagerStringLocalizer"/>.
/// </summary>
/// <param name="localizationOptions">The <see cref="IOptions{LocalizationOptions}"/>.</param>
/// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
public ResourceManagerStringLocalizerFactory(
IOptions<LocalizationOptions> localizationOptions)
IOptions<LocalizationOptions> localizationOptions,
ILoggerFactory loggerFactory)
{
if (localizationOptions == null)
{
throw new ArgumentNullException(nameof(localizationOptions));
}

if (loggerFactory == null)
{
throw new ArgumentNullException(nameof(loggerFactory));
}

_resourcesRelativePath = localizationOptions.Value.ResourcesPath ?? string.Empty;
_loggerFactory = loggerFactory;

if (!string.IsNullOrEmpty(_resourcesRelativePath))
{
_resourcesRelativePath = _resourcesRelativePath.Replace(Path.AltDirectorySeparatorChar, '.')
Expand Down Expand Up @@ -180,7 +191,8 @@ protected virtual ResourceManagerStringLocalizer CreateResourceManagerStringLoca
new ResourceManager(baseName, assembly),
assembly,
baseName,
_resourceNamesCache);
_resourceNamesCache,
_loggerFactory.CreateLogger<ResourceManagerStringLocalizer>());
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using System.Reflection;
using System.Resources;
using Microsoft.Extensions.Localization.Internal;
using Microsoft.Extensions.Logging;

namespace Microsoft.Extensions.Localization
{
Expand All @@ -26,13 +27,15 @@ public class ResourceManagerWithCultureStringLocalizer : ResourceManagerStringLo
/// <param name="baseName">The base name of the embedded resource that contains the strings.</param>
/// <param name="resourceNamesCache">Cache of the list of strings for a given resource assembly name.</param>
/// <param name="culture">The specific <see cref="CultureInfo"/> to use.</param>
/// <param name="logger">The <see cref="ILogger"/>.</param>
internal ResourceManagerWithCultureStringLocalizer(
ResourceManager resourceManager,
IResourceStringProvider resourceStringProvider,
string baseName,
IResourceNamesCache resourceNamesCache,
CultureInfo culture)
: base(resourceManager, resourceStringProvider, baseName, resourceNamesCache)
CultureInfo culture,
ILogger logger)
: base(resourceManager, resourceStringProvider, baseName, resourceNamesCache, logger)
{
if (resourceManager == null)
{
Expand Down Expand Up @@ -70,13 +73,15 @@ internal ResourceManagerWithCultureStringLocalizer(
/// <param name="baseName">The base name of the embedded resource that contains the strings.</param>
/// <param name="resourceNamesCache">Cache of the list of strings for a given resource assembly name.</param>
/// <param name="culture">The specific <see cref="CultureInfo"/> to use.</param>
/// <param name="logger">The <see cref="ILogger"/>.</param>
public ResourceManagerWithCultureStringLocalizer(
ResourceManager resourceManager,
Assembly resourceAssembly,
string baseName,
IResourceNamesCache resourceNamesCache,
CultureInfo culture)
: base(resourceManager, resourceAssembly, baseName, resourceNamesCache)
CultureInfo culture,
ILogger logger)
: base(resourceManager, resourceAssembly, baseName, resourceNamesCache, logger)
{
if (resourceManager == null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Localization\Microsoft.AspNetCore.Localization.csproj" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="1.2.0-*" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="1.2.0-*" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-*" />
<PackageReference Include="xunit" Version="2.2.0-*" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-*" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@

<ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.Extensions.Localization\Microsoft.Extensions.Localization.csproj" />
<PackageReference Include="Microsoft.AspNetCore.Testing" Version="1.2.0-*" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="1.2.0-*" />
<PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="1.2.0-*" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-*" />
<PackageReference Include="Moq" Version="4.6.36-*" />
<PackageReference Include="xunit" Version="2.2.0-*" />
Expand Down
Loading