using System; using System.Globalization; using System.Threading; using Xunit; namespace Microsoft.AspNet.Mvc.ModelBinding.Test { public class CultureReplacer : IDisposable { private const string _defaultCultureName = "en-GB"; private const string _defaultUICultureName = "en-US"; private static readonly CultureInfo _defaultCulture = CultureInfo.GetCultureInfo(_defaultCultureName); private readonly CultureInfo _originalCulture; private readonly CultureInfo _originalUICulture; private readonly long _threadId; // Culture => Formatting of dates/times/money/etc, defaults to en-GB because en-US is the same as InvariantCulture // We want to be able to find issues where the InvariantCulture is used, but a specific culture should be. // // UICulture => Language public CultureReplacer(string culture = _defaultCultureName, string uiCulture = _defaultUICultureName) { _originalCulture = Thread.CurrentThread.CurrentCulture; _originalUICulture = Thread.CurrentThread.CurrentUICulture; _threadId = Thread.CurrentThread.ManagedThreadId; Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture); Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(uiCulture); } /// /// The name of the culture that is used as the default value for Thread.CurrentCulture when CultureReplacer is used. /// public static string DefaultCultureName { get { return _defaultCultureName; } } /// /// The name of the culture that is used as the default value for Thread.UICurrentCulture when CultureReplacer is used. /// public static string DefaultUICultureName { get { return _defaultUICultureName; } } /// /// The culture that is used as the default value for Thread.CurrentCulture when CultureReplacer is used. /// public static CultureInfo DefaultCulture { get { return _defaultCulture; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (disposing) { Assert.True(Thread.CurrentThread.ManagedThreadId == _threadId, "The current thread is not the same as the thread invoking the constructor. This should never happen."); Thread.CurrentThread.CurrentCulture = _originalCulture; Thread.CurrentThread.CurrentUICulture = _originalUICulture; } } } }