HashCalculator.GUI/Translator.cs
2021-09-06 23:14:21 +02:00

66 lines
1.9 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Threading;
using TechnologyAssembler.Core.Language;
namespace HashCalculator.GUI
{
internal static class Translator
{
private static ITranslationProvider? _provider;
public static ITranslationProvider? Provider
{
get => Interlocked.CompareExchange(ref _provider, null, null);
set
{
var provider = value is null
? null
: new CachedCsfTranslationProvider(value);
Interlocked.Exchange(ref _provider, provider);
ProviderChanged?.Invoke(null, EventArgs.Empty);
}
}
public static bool HasProvider => Provider != null;
public static EventHandler? ProviderChanged;
public static string Translate(string what)
{
var provider = Provider;
if (provider is null)
{
return $"NoProvider:{what}";
}
return provider.GetString(what);
}
}
internal class CachedCsfTranslationProvider : ITranslationProvider
{
private readonly ITranslationProvider _provider;
private readonly ConcurrentDictionary<string, string> _cache = new ConcurrentDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
public string Name => $"Cached{_provider.Name}";
public CachedCsfTranslationProvider(ITranslationProvider provider)
{
_provider = provider;
}
public string GetString(string str)
{
if (!_cache.TryGetValue(str, out var value))
{
value = _provider.GetString(str);
_cache.TryAdd(str, value);
}
return value;
}
public string GetPluralString(string str, string strPlural, long count)
{
throw new NotImplementedException();
}
}
}