blob: 7a8a9fd08d9fe0dda8af1b4c9cff6e5a84ebafac (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Diagnostics;
using System.Threading;
namespace System.Globalization
{
public partial class CultureInfo : IFormatProvider
{
private static CultureInfo GetUserDefaultCultureCacheOverride()
{
return null; // ICU doesn't provide a user override
}
internal static CultureInfo GetUserDefaultCulture()
{
if (GlobalizationMode.Invariant)
return CultureInfo.InvariantCulture;
CultureInfo cultureInfo = null;
string localeName;
if (CultureData.GetDefaultLocaleName(out localeName))
{
cultureInfo = GetCultureByName(localeName, true);
cultureInfo._isReadOnly = true;
}
else
{
cultureInfo = CultureInfo.InvariantCulture;
}
return cultureInfo;
}
private static CultureInfo GetUserDefaultUILanguage()
{
return GetUserDefaultCulture();
}
////////////////////////////////////////////////////////////////////////
//
// CurrentCulture
//
// This instance provides methods based on the current user settings.
// These settings are volatile and may change over the lifetime of the
// thread.
//
////////////////////////////////////////////////////////////////////////
//
// We use the following order to return CurrentCulture and CurrentUICulture
// o use current thread culture if the user already set one using CurrentCulture/CurrentUICulture
// o use thread culture if the user already set one using DefaultThreadCurrentCulture
// or DefaultThreadCurrentUICulture
// o Use NLS default user culture
// o Use NLS default system culture
// o Use Invariant culture
//
public static CultureInfo CurrentCulture
{
get
{
if (Thread.m_CurrentCulture != null)
{
return Thread.m_CurrentCulture;
}
CultureInfo ci = s_DefaultThreadCurrentCulture;
if (ci != null)
{
return ci;
}
// if s_userDefaultCulture == null means CultureInfo statics didn't get initialized yet. this can happen if there early static
// method get executed which eventually hit the cultureInfo code while CultureInfo statics didn’t get chance to initialize
if (s_userDefaultCulture == null)
{
Init();
}
Debug.Assert(s_userDefaultCulture != null);
return s_userDefaultCulture;
}
set
{
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
if (s_asyncLocalCurrentCulture == null)
{
Interlocked.CompareExchange(ref s_asyncLocalCurrentCulture, new AsyncLocal<CultureInfo>(AsyncLocalSetCurrentCulture), null);
}
s_asyncLocalCurrentCulture.Value = value;
}
}
public static CultureInfo CurrentUICulture
{
get
{
return GetCurrentUICultureNoAppX();
}
set
{
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
CultureInfo.VerifyCultureName(value, true);
if (s_asyncLocalCurrentUICulture == null)
{
Interlocked.CompareExchange(ref s_asyncLocalCurrentUICulture, new AsyncLocal<CultureInfo>(AsyncLocalSetCurrentUICulture), null);
}
// this one will set s_currentThreadUICulture too
s_asyncLocalCurrentUICulture.Value = value;
}
}
}
}
|