diff --git a/Source.Common/Platform.cs b/Source.Common/Platform.cs index dcf28d2a..62a5d984 100644 --- a/Source.Common/Platform.cs +++ b/Source.Common/Platform.cs @@ -1,6 +1,7 @@ using Source.Common; using System.Diagnostics; +using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -48,6 +49,13 @@ public static unsafe void DebugString(ReadOnlySpan buf) { } public static void Initialize() { + // Source's data files (KeyValues, .res, .vmt, convar values) are always en-US formatted, so the + // process must not follow the user's locale - float.Parse("0.25") throws under fr-FR otherwise. + CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; + CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture; + Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; + Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; + ThreadUtils.SetMainThread(); } } diff --git a/Source.GUI.Controls/PropertySheet.cs b/Source.GUI.Controls/PropertySheet.cs index d5b248a6..20bd76a3 100644 --- a/Source.GUI.Controls/PropertySheet.cs +++ b/Source.GUI.Controls/PropertySheet.cs @@ -2,6 +2,8 @@ using Source.Common.GUI; using Source.Common.Input; +using System.Globalization; + namespace Source.GUI.Controls; class ContextLabel : Label @@ -534,7 +536,7 @@ public override void ApplySchemeSettings(IScheme scheme) { Border = scheme.GetBorder("RaisedBorder")!; SetBorder(Border); - PageTransitionEffectTime = float.Parse(scheme.GetResourceString("PropertySheet.TransitionEffectTime")); + PageTransitionEffectTime = float.TryParse(scheme.GetResourceString("PropertySheet.TransitionEffectTime"), NumberStyles.Float, CultureInfo.InvariantCulture, out float transitionTime) ? transitionTime : 0; TabFont = scheme.GetFont(SmallTabs ? "DefaultVerySmall" : "DefaultSmall")!; if (TabKV != null)