2012-11-14 84 views
0

我一直在試圖關注發現的博客文章here。我已經添加了一個新的程序集來託管我的資源文件(我使用了一個單獨的程序集,因爲資源可能需要在多個項目之間共享)。我已經添加了以下到我的web.config:無法在MVC中獲得本地化工作4

<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; 
    } 

,我理解設置線程當前的文化應該導致我的資源文件文化發生改變。我似乎無法得到我生活中的這種工作(因此我試圖在十個不同的地點設置這個品種)。

對我在做什麼有什麼建議嗎?

回答

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; 
    } 
} 

這是即時通訊使用確切的代碼,所以我知道這個工程。

+0

幸運的是,你可以通過使用filterContext.HttpContext.Request – Pbirkoff

+0

感謝哥們獲得請求我把它 – dnxit

+0

發現問題。這不是上面的代碼,這工作正常。問題是我忘了它是在一個過濾器中,所以我不得不將這個屬性應用到我的所有類中。 –

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; 
     }