Asp.net 设置Sitecore.Context.Language会给我一次错误语言的项目
我的Sitecore网站中有此页面项,可从Facebook页面选项卡查看。这是一个相当简单的页面,但我有一个问题,Sitecore在第一次加载时给了我错误的语言,然后后续加载就可以了 此项通过此控制器运行:Asp.net 设置Sitecore.Context.Language会给我一次错误语言的项目,asp.net,facebook,sitecore,sitecore7,Asp.net,Facebook,Sitecore,Sitecore7,我的Sitecore网站中有此页面项,可从Facebook页面选项卡查看。这是一个相当简单的页面,但我有一个问题,Sitecore在第一次加载时给了我错误的语言,然后后续加载就可以了 此项通过此控制器运行: // // GET: /Portfolio/ public override ActionResult Index() { var appId = "*****"; var appSecret = "*****";
//
// 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的上下文。Facebook用户使用的语言我有法语和英语内容
现在,在视图上,我有一个主布局,它基本上除了无聊的html标记之外,还放置了占位符:
@Html.Sitecore().Placeholder("fb-body")
最后,我的视图渲染如下所示:
@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什么,以便他理解我的语言吗?这看起来也有点像缓存问题。。。我应该在哪里解决这个问题
谢谢 我不确定您设置了什么基本控制器,但您似乎通过自己返回或从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
模型语言为:en
第二次结果:
上下文语言为:nl nl
模型语言为:nl nl
问题是语言解析器首先将语言设置为默认值“en”,当它进入控制器操作时,它已经获取了带有“en”的项。所以你的语言调整来得太晚了。第二次加载时使用正确的语言,因为调整后的语言保存在cookie中
设置语言的合适位置应该是LanguageSolver。您可以重写/扩展LanguageSolver,并在httpRequestBegin管道中替换它。这样,您还可以防止使用cachekey中的默认语言缓存本地化内容。我不确定您设置了什么基本控制器,但您似乎通过自己返回或从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
模型语言为:en
第二次结果:
上下文语言为:nl nl
模型语言为:nl nl
问题是语言解析器首先将语言设置为默认值“en”,当它进入控制器操作时,它已经获取了带有“en”的项。所以你的语言调整来得太晚了。第二次加载时使用正确的语言,因为调整后的语言保存在cookie中
设置语言的合适位置应该是LanguageSolver。您可以重写/扩展LanguageSolver,并在httpRequestBegin管道中替换它。这样,您还可以防止使用cachekey中的默认语言缓存本地化内容