Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
GlobalizationMode.cs
Go to the documentation of this file.
3
5
6internal static class GlobalizationMode
7{
8 private static class Settings
9 {
10 internal static bool Invariant { get; } = AppContextConfigHelper.GetBooleanConfig("System.Globalization.Invariant", "DOTNET_SYSTEM_GLOBALIZATION_INVARIANT");
11
12
13 internal static bool PredefinedCulturesOnly { get; } = AppContextConfigHelper.GetBooleanConfig("System.Globalization.PredefinedCulturesOnly", "DOTNET_SYSTEM_GLOBALIZATION_PREDEFINED_CULTURES_ONLY", GlobalizationMode.Invariant);
14
15 }
16
17 internal static bool Invariant => Settings.Invariant;
18
20
21 internal static bool UseNls { get; } = !Invariant && (AppContextConfigHelper.GetBooleanConfig("System.Globalization.UseNls", "DOTNET_SYSTEM_GLOBALIZATION_USENLS") || !LoadIcu());
22
23
24 private static bool TryGetAppLocalIcuSwitchValue([NotNullWhen(true)] out string value)
25 {
26 return TryGetStringValue("System.Globalization.AppLocalIcu", "DOTNET_SYSTEM_GLOBALIZATION_APPLOCALICU", out value);
27 }
28
29 private static bool TryGetStringValue(string switchName, string envVariable, [NotNullWhen(true)] out string value)
30 {
31 value = AppContext.GetData(switchName) as string;
32 if (string.IsNullOrEmpty(value))
33 {
35 if (string.IsNullOrEmpty(value))
36 {
37 return false;
38 }
39 }
40 return true;
41 }
42
43 private static void LoadAppLocalIcu(string icuSuffixAndVersion)
44 {
46 int num = icuSuffixAndVersion.IndexOf(':');
47 ReadOnlySpan<char> version;
48 if (num >= 0)
49 {
50 suffix = icuSuffixAndVersion.AsSpan(0, num);
51 version = icuSuffixAndVersion.AsSpan(suffix.Length + 1);
52 }
53 else
54 {
55 version = icuSuffixAndVersion;
56 }
58 }
59
60 private static string CreateLibraryName(ReadOnlySpan<char> baseName, ReadOnlySpan<char> suffix, ReadOnlySpan<char> extension, ReadOnlySpan<char> version, bool versionAtEnd = false)
61 {
62 if (!versionAtEnd)
63 {
64 return string.Concat(baseName, suffix, version, extension);
65 }
66 return string.Concat(baseName, suffix, extension, version);
67 }
68
69 private static IntPtr LoadLibrary(string library, bool failOnLoadFailure)
70 {
71 if (!NativeLibrary.TryLoad(library, typeof(object).Assembly, DllImportSearchPath.ApplicationDirectory | DllImportSearchPath.System32, out var handle) && failOnLoadFailure)
72 {
73 Environment.FailFast("Failed to load app-local ICU: " + library);
74 }
75 return handle;
76 }
77
78 private static bool LoadIcu()
79 {
81 {
82 return Interop.Globalization.LoadICU() != 0;
83 }
85 return true;
86 }
87
89 {
90 IntPtr intPtr = IntPtr.Zero;
91 IntPtr intPtr2 = IntPtr.Zero;
92 int num = version.IndexOf('.');
93 if (num > 0)
94 {
95 ReadOnlySpan<char> version2 = version.Slice(0, num);
96 intPtr = LoadLibrary(CreateLibraryName("icuuc", suffix, ".dll", version2), failOnLoadFailure: false);
97 if (intPtr != IntPtr.Zero)
98 {
99 intPtr2 = LoadLibrary(CreateLibraryName("icuin", suffix, ".dll", version2), failOnLoadFailure: false);
100 }
101 }
102 if (intPtr == IntPtr.Zero)
103 {
104 intPtr = LoadLibrary(CreateLibraryName("icuuc", suffix, ".dll", version), failOnLoadFailure: true);
105 }
106 if (intPtr2 == IntPtr.Zero)
107 {
108 intPtr2 = LoadLibrary(CreateLibraryName("icuin", suffix, ".dll", version), failOnLoadFailure: true);
109 }
110 Interop.Globalization.InitICUFunctions(intPtr, intPtr2, version, suffix);
111 }
112}
static void InitICUFunctions(IntPtr icuuc, IntPtr icuin, ReadOnlySpan< char > version, ReadOnlySpan< char > suffix)
Definition Interop.cs:99
static int LoadICU()
static bool GetBooleanConfig(string configName, bool defaultValue)
static ? object GetData(string name)
Definition AppContext.cs:31
static void FailFast(string? message)
static ? string GetEnvironmentVariable(string variable)
static string CreateLibraryName(ReadOnlySpan< char > baseName, ReadOnlySpan< char > suffix, ReadOnlySpan< char > extension, ReadOnlySpan< char > version, bool versionAtEnd=false)
static bool TryGetAppLocalIcuSwitchValue([NotNullWhen(true)] out string value)
static bool TryGetStringValue(string switchName, string envVariable, [NotNullWhen(true)] out string value)
static void LoadAppLocalIcuCore(ReadOnlySpan< char > version, ReadOnlySpan< char > suffix)
static void LoadAppLocalIcu(string icuSuffixAndVersion)
static IntPtr LoadLibrary(string library, bool failOnLoadFailure)
static bool TryLoad(string libraryPath, out IntPtr handle)
static readonly IntPtr Zero
Definition IntPtr.cs:18
ReadOnlySpan< T > Slice(int start)