将线程文化设置为中性文化

Posted

技术标签:

【中文标题】将线程文化设置为中性文化【英文标题】:Setting thread Culture to a neutral culture 【发布时间】:2011-03-30 15:58:38 【问题描述】:

当尝试使用db_ent.SaveChanges() 将数据保存到数据库时,我遇到了这个错误:

文化“sr”是一种中性文化。它不能用于格式化和解析,因此不能设置为线程的当前文化。有什么解决办法吗?

编辑:

我的路由本地化助手

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Threading;
using System.Globalization;

namespace darns.Helpers

public class MultiCultureMvcRouteHandler : MvcRouteHandler

    protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
    
        String culture = requestContext.RouteData.Values["culture"].ToString();
        var ci = new CultureInfo(culture);
        Thread.CurrentThread.CurrentUICulture = ci;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
        return base.GetHttpHandler(requestContext);
    


public class SingleCultureMvcRouteHandler : MvcRouteHandler 

public class CultureConstraint : IRouteConstraint

    private string[] _values;
    public CultureConstraint(params string[] values)
    
        this._values = values;
    

    public bool Match(HttpContextBase httpContext,Route route,string parameterName,
                    RouteValueDictionary values, RouteDirection routeDirection)
    
        // Get the value called "parameterName" from the 
        // RouteValueDictionary called "value"
        string value = values[parameterName].ToString();
        // Return true is the list of allowed values contains 
        // this value.
        return _values.Contains(value);
    


public enum Culture
       
    sr = 1,
    hr = 2,
    en = 3,
    ru = 4


/// <summary>
/// Util class for storing error message pairs
/// </summary>
/// <typeparam name="E"></typeparam>
/// <typeparam name="T"></typeparam>
public class ErrorPair<E, T>

    public E Key  get; set; 
    public T Message  get; set; 
    public ErrorPair(E key, T message)
    
        Key = key;
        Message = message;
    


【问题讨论】:

【参考方案1】:

我遇到了类似的问题。用户的浏览器正在发送“en”中性文化。

所以我用它来让 .Net 选择最接近的“特定”文化:

//replace '$' in string with current user's culture's Currency Symbol
//if neutral culture use .Net to set SpecificCulture
//, e.g. 'en', .Net assumes 'en-US'
private static MvchtmlString currencySubstitution(MvcHtmlString htmlString)
    
        var ci = System.Threading.Thread.CurrentThread.CurrentUICulture;
        System.Globalization.RegionInfo ri;
        if (ci.IsNeutralCulture)
        
            ci = System.Globalization.CultureInfo.CreateSpecificCulture(ci.TwoLetterISOLanguageName);
        

        ri = new System.Globalization.RegionInfo(ci.LCID);

        string currencySymbol = ri.CurrencySymbol;//en-AU: $,or // AUD = ri.ISOCurrencySymbol;
        return MvcHtmlString.Create(htmlString.ToHtmlString().Replace("$", currencySymbol));
    

【讨论】:

【参考方案2】:

您不能使用中性文化(sr、en、fr 等),因为在特定文化中可能存在格式差异。例如,en-US 和 en-GB 的日期格式可能不同,仅使用 en 无法确保格式正确。

您必须使用特定的文化。在您的情况下,请尝试使用 'sr-Cyrl-CS'(塞尔维亚,西里尔文)或 'sr-Latn-CS'(塞尔维亚,拉丁文)文化,或者您知道应该使用的另一个特定于 sr 的文化名称,而不是仅仅使用 'sr' .

【讨论】:

当我发布数据时,控制器操作中是否可能改变中立文化? 我不是 100% 确定,但我不认为在操作中设置文化然后立即尝试保存您的数据会起作用,因为文化更改不会在上下文/线程中完成直到保存数据之后。在进行任何数据处理之前,您真的想知道您使用的是什么文化。 这里有一些关于让 MVC 改变文化的主题的链接...... afana.me/post/aspnet-mvc-internationalization.aspx ***.com/questions/1560796/… 有没有办法禁用这种文化检查?我不能使用特定文化,因为我的本地化代码更改起来非常复杂【参考方案3】:

尝试 sr-Cyrl-RS 表示西里尔字母或 sr-Latn-RS 表示拉丁语。

【讨论】:

以上是关于将线程文化设置为中性文化的主要内容,如果未能解决你的问题,请参考以下文章

找不到适合指定文化或中性文化的任何资源

为整个 appdomain 定义文化

无法从程序集“CLRviaCSharp,版本=1.0.0.0,文化=中性,PublicKeyToken=null”加载类型“MarshalByRefType”

asp.net mvc 在哪里设置默认文化?

使用 ASPNETCore 1.1.1 本地化默认将当前文化设置为浏览器文化

无法加载文件或程序集“Microsoft.Owin,版本=2.1.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35