在 asp.net 中更改区域性时实例为只读异常

Mat*_*eri 4 .net c# asp.net-mvc currentculture

我尝试实现多文化应用程序,用户可以更改语言、日期格式等。我编写了核心,但它返回异常: System.InvalidOperationException:实例是只读的。

switch (culture)
    {
        case SystemCulture.English:
                Thread.CurrentThread.CurrentCulture = new CultureInfo(CultureCodes.English);
                Thread.CurrentThread.CurrentUICulture = new CultureInfo(CultureCodes.English);
                break;
                        //another cultures here
    }
    switch (cultureFormat)
    {
        case SystemDateFormat.European:
                  var europeanDateFormat = CultureInfo.GetCultureInfo(CultureCodes.Italian).DateTimeFormat;
                  Thread.CurrentThread.CurrentCulture.DateTimeFormat = europeanDateFormat;
                  Thread.CurrentThread.CurrentUICulture.DateTimeFormat = europeanDateFormat;
                  break;
    //another cultures here
    }
        
Run Code Online (Sandbox Code Playgroud)

我在互联网上找到了一些信息,我必须使用我的文化的新实例对象,我更改了我的代码只是添加:

CultureInfo myCulture;

switch (culture)
{
       case SystemCulture.English:
            myCulture= new CultureInfo(CultureCodes.English);
            break;
}
Run Code Online (Sandbox Code Playgroud)

如下所示,脱离开关:

Thread.CurrentThread.CurrentCulture = cultureInfo;
Run Code Online (Sandbox Code Playgroud)

我对线程不熟悉,我不确定我使用的是否正确。您能建议我如何正确地做到这一点吗?

pfx*_*pfx 8

您收到Instance is read-only错误是因为您尝试通过下面的代码更改只读区域性的属性。

Thread.CurrentThread.CurrentCulture.DateTimeFormat = europeanDateFormat;
Run Code Online (Sandbox Code Playgroud)

您可以通过其属性检查文化是否为只读IsReadOnly;内置的是。

相反,您必须创建当前活动区域性的克隆/副本,对该克隆应用任何更改,并将该更改分配给当前线程和CurrentCulture/或CurrentUICulture当前线程。

var clone = Thread.CurrentThread.CurrentCulture.Clone() as CultureInfo;
clone.DateTimeFormat = CultureInfo.GetCultureInfo("it").DateTimeFormat;

Thread.CurrentThread.CurrentCulture = clone;
Thread.CurrentThread.CurrentUICulture = clone; 
Run Code Online (Sandbox Code Playgroud)