【问题标题】:Asp.net Globalization gone crazyAsp.net 全球化疯了
【发布时间】:2013-10-30 16:53:25
【问题描述】:

我已经建立了一个支持 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 文件。而且我对每个实体都有扩展方法(顺便说一下,我正在使用实体框架)来获取给定语言的字符串。

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

对于“产品”表,我有 [ ID(int),Name(int) ] 列。

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

产品上的“名称”列引用了 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 种语言...

这真的让我发疯了。它是随机发生的。我想不通。

如果你们能帮助我,那就太好了!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的评论。多亏了你,我才能弄清楚(我猜)......
    【解决方案2】:

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

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

    有这个笔记让我用属性来解决这个问题,

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

    系统目前运行良好...

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多