2015-09-25 52 views
0

我的網站必須是英語和西班牙語,但用戶應該能夠選擇他們的個人資料頁面中的語言。多語言網站沒有更改語言

我有這樣的結構。 http://screencast.com/t/ArrNy8yDChM

在搜索輸入我有這個

  <input type="text" placeholder="@Resource.SearchBoxWatermark" class="form-control" name="top-search" id="top-search"> 

然後,我有一個配置文件編輯視圖

@{ 
    ViewBag.Title = "Profile"; 
    Layout = "~/Areas/GlobalAdmin/Views/Shared/_LayoutGlobalAdmin.cshtml"; 
} 
@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    <div class="wrapper wrapper-content"> 
     <div class="row animated fadeInRight"> 
      <div class="col-md-4"> 
       <div class="ibox float-e-margins"> 
        <div class="ibox-title"> 
         <h5>Profile Detail</h5> 
        </div> 
        <div> 
         <div class="ibox-content no-padding border-left-right"> 
          <img alt="image" class="img-responsive" src="~/Images/profile_big.jpg"> 
         </div> 
         <div class="ibox-content profile-content"> 
          <h4><strong>Monica Smith</strong></h4> 
          <p><i class="fa fa-map-marker"></i> Riviera State 32/106 
          </p> 
          <h5> 
           About me 
          </h5> 
          <p> 
           Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitat. 
          </p> 
          <label class="radio-inline">@Html.RadioButton("Language", "English") English</label> 
          <label class="radio-inline">@Html.RadioButton("Language", "Spanish") Spanish</label> 
          <br/> 
          <input type="submit" value="Update" class="btn btn-primary"/> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
} 
@{Html.RenderPartial("~/Areas/GlobalAdmin/Views/Shared/_Toastr.cshtml");} 

和簡檔編輯動作:

[HttpPost] 
     public async Task<ActionResult> Edit(FormCollection formCollection) 
     { 
      try 
      { 
       var client = AuthenticationHelper.GetActiveDirectoryClient(); 
       var user = (Microsoft.Azure.ActiveDirectory.GraphClient.User) await client.Users.GetByObjectId(ClaimsPrincipal.Current.Identities.First().Name).ExecuteAsync(); 
       var extPropLookupNameLanguage = $"extension_{SettingsHelper.ClientId.Replace("-", "")}_{"Language"}"; 
       user.SetExtendedProperty(extPropLookupNameLanguage, formCollection["Language"]);  
       await user.UpdateAsync(); 

       try 
       { 
        string culture = string.Empty; 
        if (formCollection["Language"].ToString() == "English") 
        { 
         culture = "en-US"; 
        } 
        else if (formCollection["Language"].ToString() == "Spanish") 
        { 
         culture = "es-CO"; 
        } 
        var cultureInfo = new CultureInfo(culture); 
        Thread.CurrentThread.CurrentUICulture = cultureInfo; 
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); 
        HttpCookie langCookie = new HttpCookie("culture", culture); 
        langCookie.Expires = DateTime.Now.AddYears(1); 
        System.Web.HttpContext.Current.Response.Cookies.Add(langCookie); 
        var toastrSuccess = "Perfil actualizado satisfactoriamente"; 
        return RedirectToAction("Edit", new { toastrSuccess = toastrSuccess }); 

       } 
       catch (Exception ex) 
       { 
        var toastrError = ex.Message; 
        return RedirectToAction("Edit", new { toastrError = toastrError }); 
       } 

      } 
      catch (Exception ex) 
      { 
       ViewBag.toastrError = ex.Message; 
       return RedirectToAction("Edit", new { toastrError = ex.Message }); 
      } 
     } 

然而,當我在單選按鈕西班牙語中選擇搜索輸入水位rmark沒有改變西班牙如下:

http://screencast.com/t/78YqMeMvx4qg

缺少什麼我在這裏?

+0

當您更改單選按鈕時是否有回傳?如果沒有,這是正常的行爲。視圖引擎僅在頁面加載期間解析您的資源字符串一次。如果您希望能夠在不刷新頁面的情況下更改語言,則需要添加一些JavaScript。 – hbulens

+0

是檢查返回返回RedirectToAction(「編輯」,新{toastrSuccess = toastrSuccess}); –

+0

我不明白。更改單選按鈕不會觸發回發,請單擊提交。只有刷新頁面並處理回發時,資源才能正確顯示。 – hbulens

回答

1

原因是你只爲當前線程(執行你的Edit動作的線程)設置線程UICulture和Cultue。最後你要返回一個重定向,它基本上返回一個302狀態碼給客戶端您重定向操作的網址。一旦客戶端收到它,它會向這個URL發出額外的請求,但是這個請求是由線程池中的任意線程處理的。此線程的UI文化未設置爲西班牙語,這是您的資源無法工作的原因。 您需要做的是添加一些代碼,用於在每個傳入請求中解析您的語言Cookie(如果您正在爲整個應用程序選擇一種語言)。

您可以通過多種方式實現它:

1)實現一個IHttpModule的,並設置文化中的BeginRequest:

void context_BeginRequest(object sender, EventArgs e) 
    { 
     if (HttpContext.Current.Request.Cookies["culture"] != null) 
     { 
     HttpCookie cookie = HttpContext.Current.Request.Cookies["culture"]; 
     string lang = cookie.Value; 
     var culture = new System.Globalization.CultureInfo(lang); 
     Thread.CurrentThread.CurrentCulture = culture; 
     Thread.CurrentThread.CurrentUICulture = culture; 
     } 
    } 

2)在你的基地控制器覆蓋OnActionExecuting處理程序:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
     if (HttpContext.Current.Request.Cookies["culture"] != null) 
     { 
     HttpCookie cookie = HttpContext.Current.Request.Cookies["culture"]; 
     string lang = cookie.Value; 
     var culture = new System.Globalization.CultureInfo(lang); 
     Thread.CurrentThread.CurrentCulture = culture; 
     Thread.CurrentThread.CurrentUICulture = culture; 
     } 
     base.OnActionExecuting(filterContext);   
    } 
+1

驚人的答案,非常感謝。 +1 –

+0

我很高興提供幫助 –