Files
Sharepoint-Toolbox/SharepointToolbox/Localization/TranslationSource.cs
Dev a287ed83ab feat(01-05): implement TranslationSource singleton + EN/FR resx files
- TranslationSource singleton with INotifyPropertyChanged indexer binding
- PropertyChanged fires with string.Empty on culture switch (signals all bindings refresh)
- Missing key returns [key] placeholder (prevents null in WPF bindings)
- Strings.resx with 27 Phase 1 UI string keys (EN)
- Strings.fr.resx with same 27 keys stubbed with EN text (FR completeness Phase 5)
- Strings.Designer.cs ResourceManager for dotnet build compatibility
- SharepointToolbox.csproj updated with EmbeddedResource metadata
2026-04-02 12:16:57 +02:00

39 lines
1.3 KiB
C#

using System.ComponentModel;
using System.Globalization;
using System.Resources;
namespace SharepointToolbox.Localization;
/// <summary>
/// Singleton INotifyPropertyChanged string lookup enabling runtime culture switching without restart.
/// WPF bindings use: Source={x:Static loc:TranslationSource.Instance}, Path=[key]
/// On CurrentCulture change, fires PropertyChanged with empty string to signal all properties changed,
/// which causes WPF to re-evaluate all bindings to this source.
/// </summary>
public class TranslationSource : INotifyPropertyChanged
{
public static readonly TranslationSource Instance = new();
private ResourceManager _resourceManager = Strings.ResourceManager;
private CultureInfo _currentCulture = CultureInfo.CurrentUICulture;
private TranslationSource() { }
public string this[string key] =>
_resourceManager.GetString(key, _currentCulture) ?? $"[{key}]";
public CultureInfo CurrentCulture
{
get => _currentCulture;
set
{
if (Equals(_currentCulture, value)) return;
_currentCulture = value;
Thread.CurrentThread.CurrentUICulture = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(string.Empty));
}
}
public event PropertyChangedEventHandler? PropertyChanged;
}