2014-04-15 2 views
1

Sitecore 웹 사이트에 Facebook 페이지 탭에서 본이 페이지 (항목)가 있습니다. 오히려 간단한 페이지이지만 처음로드 할 때 Sitecore에서 잘못된 언어를 사용하는 문제가 있습니다. 그런 다음로드가 잘됩니다.Sitecore.Context.Language를 설정하면 잘못된 언어로 된 항목이 한 번 표시됩니다.

이 항목은이 컨트롤러를 통해 실행 :이 디버깅 할 때

// 
    // GET: /Portfolio/ 
    public override ActionResult Index() 
    { 

     var appId = "*****"; 
     var appSecret = "*****"; 

     // Defaults to en 
     var requestLanguage = "en"; 

     // Get language from FB 
     if (Request.Form["signed_request"] != null) 
     { 

      if (Request.Url.Host.ToLower().Contains("local")) { 
       appId = "*****"; 
       appSecret = "*****"; 
      } 

      var fbUser = new Facebook.FacebookClient 
      { 
       AppId = appId, 
       AppSecret = appSecret 
      }; 

      var parsedSignedRequest = JObject.Parse(fbUser.ParseSignedRequest(Request.Form["signed_request"]).ToString()); 
      if (parsedSignedRequest != null) 
      { 
       requestLanguage = parsedSignedRequest["user"]["locale"].ToString().StartsWith("fr") ? "fr-CA" : "en"; 
      } // Else: Request can't be parsed, something is wrong 

     } // Else: Probably not in FB 

     // ?l=***** can bypass language setting 
     if (!string.IsNullOrWhiteSpace(Request.QueryString["l"])) 
     { 
      requestLanguage = Request.QueryString["l"]; 
     } 

     Context.Language = Language.Parse(requestLanguage); 

     // Views will need this 
     ViewBag.requestLanguage = requestLanguage; 
     ViewBag.appId = appId; 

     return base.Index(); 

    } 

, 그것은 완벽하게 작동합니다. 나는 페이스 북 사용자가 사용하는 것의 Sitecore의 Context.Language를 설정하고있다 (나는 프랑스어와 영어 콘텐츠를 가지고있다).

@Html.Sitecore().Placeholder("fb-body") 

마지막으로, 내보기 렌더링은 다음과 같습니다 :

지금보기에, 나는 기본적으로 그냥 (지루한 HTML 마크 업 이외의)가 자리를 배치이 마스터 레이아웃을

@using Sitecore.Globalization 
@using Sitecore.Data.Items 
@model RenderingModel 

@{ 

    // I checked this and the context language here is always correctly set, even on first load (controller did that) 
    // Sitecore.Context.Language = Language.Parse(ViewBag.requestLanguage); 

    var all = "All"; 
    var back = "Back"; 
    var projetTitle = "the project"; 
    var servicesTitle = "services"; 

    // Since my language is correctly set, this works fine 
    if (Language.Current.Name.ToLowerInvariant().Contains("fr")) 
    { 
     all = "Tous les projets"; 
     back = "Retour"; 
     projetTitle = "le projet"; 
     servicesTitle = "services"; 
    } 

    var portfolio = Model.Item.Parent.Children.FirstOrDefault(x => x.TemplateName == "Portfolio"); 

    var wrongLanguage = portfolio.Language; 
    var wrongLanguage2 = Model.Item.Language; 

} 

여기에서 포트폴리오 노드를 가져올 때 잘못된 언어로 표시됩니다. Model.Item.Language에서 보면 언어가 잘못되었습니다.

여기서 내가 무엇을 놓치고 있는지, 내 언어를 이해할 수 있도록 Sitecore에 말해야 할 것이 있습니까? 이것도 일종의 캐싱 문제처럼 보입니다 ... 어떻게 해결할 수 있습니까?

감사합니다.

답변

4

설정 한 기본 컨트롤러가 확실하지 않지만 직접 반환하거나 SitecoreController에서 상속하여 PageContext.Current.PageView를 사용하는 것으로 보입니다.

public class TestController : Controller 
{ 
    public ActionResult Index() 
    { 
     Sitecore.Context.SetLanguage(Language.Parse("nl-NL"), true); 

     var view = (PageContext.Current.PageView) as RenderingView; 
     var renderer = view.Rendering.Renderer as ViewRenderer; 
     renderer.ViewPath = "/Views/Test/Index.cshtml"; 

     return View(view); 
    } 
} 

을 그리고 내보기에 내가 렌더링 : :이와 결국 내가 문제를 재현하려고 몇 가지 문제에 부딪쳤다

@model Sitecore.Mvc.Presentation.RenderingModel 

Context language is: @Sitecore.Context.Language<br/> 
Model language is: @Model.Item.Language 

처음 결과 :
상황에 맞는 언어는 다음과 같습니다 nl- NL
모델 언어는 :

는 두 번째 결과

도중 :
상황에 맞는 언어는 : NL-NL
M odel 언어는 다음과 같습니다. nl-NL

문제는 언어 분석기가 언어를 기본값 ('en')으로 먼저 설정하고 컨트롤러 작업에 들어가면 이미 'en'으로 항목을 가져 왔습니다. 따라서 언어 조정이 너무 늦게 시작됩니다. 조정 된 언어가 쿠키에 유지 되었기 때문에 두 번째로 올바른 언어로로드됩니다.

언어를 설정하는 적절한 위치는 LanguageResolver입니다. LanguageResolver를 재정 의하여/확장하고 httpRequestBegin 파이프 라인에서 바꿀 수 있습니다. 이렇게하면 로컬 키가있는 콘텐츠가 캐시 키의 기본 언어로 캐싱되지 않습니다.

관련 문제