Asp.net全球化变得疯狂

时间:2013-10-29 17:53:59

标签: c# asp.net globalization global-asax

我建立了一个有6种不同语言支持的网站。整个语言系统都疯了。它要么以所要求的语言打开,要么打开一半,另一半打到另一个或者另一个。

以下是我如何构建系统的描述。

在global.asax中,我已经完成了这个;

protected void Application_AcquireRequestState(object sender,EventArgs e)

{
    //just to show my point
    if(RouteData.Values["language"] =! null){
    switch(RouteData.Values["language"].toString())
    {
       case "en-us":
             // at this point i'm changing the value of static enum that i've already defined in another class ,
          // just to reach it from other pages. You'll see what i mean in a second.
            Statics.Language = LanguageEnum.EN;
             break;
    }
    // Here is the culture changing codes. ConvertToCulture method is a custom method to get ISO code for language from LanguageEnum
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(ConvertToCulture(Statics.Language));

    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(ConvertToCulture(Statics.Language));
}

这是global.asax文件。我在每个实体上都有扩展方法(顺便说一句,我使用实体框架)来获取给定语言的字符串。

当然你可能想知道为什么我在实体上编写了扩展方法。在我的数据库中,没有字符串在同一个表中。我的意思是这样的;

for“Products”表我有[ID(int),Name(int)]列。

对于“LanguageStrings”表我有[ID(int),EN(字符串),FR(字符串)]列。

产品上的“名称”列引用了LanguageStrings表上的ID列。

这是一个扩展方法示例;

            public static string GetName(this Product pr)
    {

            try
            {
                return pr.LanguageStrings.GetType().
                    GetProperty(Statics.Language.ToString()).
                    GetValue(pr.LanguageStrings, null).ToString();
            }
            catch (Exception ex)
            {
                return "null";
            }


    }

在我网站的每个页面中,我都会找到包含这些扩展程序的名称,说明和技术信息。而且我还有从“.resx”文件中获取字符串的方法,即:

     public static string ResGet(string key)
    {
        return Resources.Strings.ResourceManager.GetString(key);
    }

至关重要;

例如,当请求默认页面时,有时会全部使用英语。有时页面的大厅是英文,页面的一半是法语。有时它全是法国人。

要么使用所请求的语言打开整个页面,要么将一半请求打开,另一半打开另一个或完全另一个。我的意思是它出现了2种或1种语言......

这真让我疯狂。它随机发生。我无法理解。

如果你们帮助我真的很棒!

2 个答案:

答案 0 :(得分:2)

Statics.Language是静态属性吗?如果是这样,您可能会有多个请求以非线程安全的方式修改其值。如果您认为除了Thread.CurrentUICulture之外还需要额外的商店来获取此信息,您可能需要考虑使用ThreadLocal<LanguageEnum>值。

答案 1 :(得分:0)

我一直在寻找Thread-Safe操作(感谢Nicole Calinoiu)。我用[ThreadStatic]属性标记了我的Statics.Language属性,如下所述

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx

有这个说明让我用这个属性来解决这个问题,

  

“标记为 ThreadStaticAttribute 的静态字段不在线程之间共享。每个执行线程都有一个单独的字段实例,并独立设置并获取该字段的值。如果访问该字段一个不同的线程,它将包含一个不同的值。“

系统目前运行良好......