@@ -1,13 +1,7 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics;
using System.Globalization;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Reflection;
using System.Resources;
using System.Resources;
using System.Threading.Tasks;
namespace Discord.Interactions
namespace Discord.Interactions
{
{
@@ -22,9 +16,8 @@ namespace Discord.Interactions
private readonly string _baseResource;
private readonly string _baseResource;
private readonly Assembly _assembly;
private readonly Assembly _assembly;
private static readonly ConcurrentDictionary<string, ResourceManager> _localizerCache = new() ;
private readonly ResourceManager _resourceManager ;
private readonly IEnumerable<CultureInfo> _supportedLocales;
private readonly IEnumerable<CultureInfo> _supportedLocales;
private readonly IEnumerable<string> _resourceNames;
/// <summary>
/// <summary>
/// Initializes a new instance of the <see cref="ResxLocalizationManager"/> class.
/// Initializes a new instance of the <see cref="ResxLocalizationManager"/> class.
@@ -37,7 +30,7 @@ namespace Discord.Interactions
_baseResource = baseResource;
_baseResource = baseResource;
_assembly = assembly;
_assembly = assembly;
_supportedLocales = supportedLocales;
_supportedLocales = supportedLocales;
_resourceNames = assembly.GetManifestResourceNames( );
_resourceManager = new ResourceManager(_baseResource, assembly );
}
}
/// <inheritdoc />
/// <inheritdoc />
@@ -50,17 +43,13 @@ namespace Discord.Interactions
private IDictionary<string, string> GetValues(IList<string> key, string identifier)
private IDictionary<string, string> GetValues(IList<string> key, string identifier)
{
{
var resourceName = (_baseResource + "." + string.Join(".", key)).Replace(" ", SpaceToken);
if (!_resourceNames.Any(x => string.Equals(resourceName + ".resources", x, StringComparison.OrdinalIgnoreCase)))
return ImmutableDictionary<string, string>.Empty;
var entryKey = (string.Join('.', key) + '.' + identifier).Replace(" ", SpaceToken);
var result = new Dictionary<string, string>();
var result = new Dictionary<string, string>();
var resourceManager = _localizerCache.GetOrAdd(resourceName, new ResourceManager(resourceName, _assembly));
foreach (var locale in _supportedLocales)
foreach (var locale in _supportedLocales)
{
{
var value = resourceManager.GetString(identifier , locale);
var value = _resourceManager.GetString(entryKey , locale);
if (value is not null)
if (value is not null)
result[locale.Name] = value;
result[locale.Name] = value;
}
}