无法在MVC 4中实现本地化

时间:2012-11-14 13:21:34

标签: c# asp.net-mvc localization asp.net-mvc-4 resourcebundle

我一直在尝试关注找到here的博文。我添加了一个新的程序集来托管我的资源文件(我使用了一个单独的程序集,因为资源可能需要在多个项目之间共享)。我在web.config中添加了以下内容:

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="MyResources.Resources"/>   <!-- New entry for resources -->
      </namespaces>
    </pages>
  </system.web.webPages.razor>

我已经离开了,并将资源字符串添加到几个文件中以进行测试。现在我遇到的问题是,我无法将资源设置为默认值以外的任何其他内容。例如,在生成的资源文件设计器中,有以下内容:

    /// <summary>
    ///   Looks up a localized string similar to Log in was unsuccessful. Please correct the errors and try again..
    /// </summary>
    public static string Account_LoginUnsuccessful {
        get {
            return ResourceManager.GetString("Account_LoginUnsuccessful", resourceCulture);
        }
    }

如果我在此方法中设置断点,resourceCulture绝不是空的。即使我尝试了以下内容:

在Global.asax.ca中:

    protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
        var culture = new System.Globalization.CultureInfo("fr");

        // Modify current thread's cultures            
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture.Name);
    } // End of Application_AcquireRequestState

在我的所有其他控制器继承的基本mvc控制器中:

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        SetCulture(requestContext.HttpContext.Request);
        base.Initialize(requestContext);
    }

    protected override void ExecuteCore()
    {
        SetCulture(Request);

        base.ExecuteCore();
    }

    protected override void Execute(System.Web.Routing.RequestContext requestContext)
    {
        SetCulture(requestContext.HttpContext.Request);
        base.Execute(requestContext);
    }

    protected override IAsyncResult BeginExecute(System.Web.Routing.RequestContext requestContext, AsyncCallback callback, object state)
    {
        SetCulture(requestContext.HttpContext.Request);

        metrics = Metrics.BeginTimer();
        return base.BeginExecute(requestContext, callback, state);
    }

    private void SetCulture(HttpRequestBase Request)
    {
        string cultureName = "fr";
        // Validate culture name
        cultureName = CultureHelper.GetImplementedCulture(cultureName); // This is safe

        // Modify current thread's cultures            
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
    }

现在,根据我的理解设置线程当前文化应该导致我的资源文件文化发生变化。我似乎无法完成这项工作(因此我尝试在十个不同的位置设置cultire)。

对我在这里做错了什么建议?

2 个答案:

答案 0 :(得分:1)

要验证,请尝试在ActionFilterAttribute中设置语言:

public class ChangeLanguageAttribute : ActionFilterAttribute
{

  public override void OnActionExecuting(
     ActionExecutingContext filterContext)
  {
     string languageCode = "fr";

     CultureInfo info =
       CultureInfo.CreateSpecificCulture(languageCode.ToString());

     Thread.CurrentThread.CurrentCulture = info;
     Thread.CurrentThread.CurrentUICulture = info;
  }
}

这是我使用的确切代码,所以我知道这有效。

答案 1 :(得分:0)

这是我提出的代码,应该是 Application_OnBeginRequest

public void Application_OnBeginRequest(object sender, EventArgs e)
        {
            System.Globalization.CultureInfo NC = new System.Globalization.CultureInfo(1036, true);
            NC.NumberFormat.CurrencyDecimalDigits = 2;
            NC.NumberFormat.CurrencySymbol = "euro";
            NC.NumberFormat.CurrencyDecimalSeparator = ".";
            NC.NumberFormat.PercentDecimalSeparator = ".";
            NC.NumberFormat.NumberDecimalSeparator = ".";
            NC.NumberFormat.CurrencyGroupSeparator = "";
            NC.NumberFormat.PercentGroupSeparator = "";
            NC.NumberFormat.NumberGroupSeparator = "";
            System.Threading.Thread.CurrentThread.CurrentCulture = NC;
        }