Browser 如何通过浏览器在Sitecore中设置上下文语言';什么语言?
我需要按浏览器语言设置上下文语言,并重定向到正确的语言版本。由于搜索引擎的索引,我还需要排除机器人。我找到了一篇关于机器人的文章,但这并不完全是我想要的,因为它完全覆盖了本机功能 几个小时后,我创建了自己的LanguageSolver(马克的代码也有一部分),用于检测浏览器语言,如果需要,可以重定向,但不包括机器人Browser 如何通过浏览器在Sitecore中设置上下文语言';什么语言?,browser,sitecore,detect,lang,Browser,Sitecore,Detect,Lang,我需要按浏览器语言设置上下文语言,并重定向到正确的语言版本。由于搜索引擎的索引,我还需要排除机器人。我找到了一篇关于机器人的文章,但这并不完全是我想要的,因为它完全覆盖了本机功能 几个小时后,我创建了自己的LanguageSolver(马克的代码也有一部分),用于检测浏览器语言,如果需要,可以重定向,但不包括机器人 public class LanguageResolver : Sitecore.Pipelines.HttpRequest.LanguageResolver { publi
public class LanguageResolver : Sitecore.Pipelines.HttpRequest.LanguageResolver
{
public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args)
{
Assert.ArgumentNotNull(args, "args");
Language lang = GetLanguageFromBrowser(args);
if (lang != null)
{
Sitecore.Context.Language = lang;
// if current language doesn't match with default site language, it will do a redirect
if (Sitecore.Context.Language.Name != Sitecore.Context.Site.Language)
{
// do redirect
UriBuilder uriBuilder = new UriBuilder(args.Context.Request.Url);
uriBuilder.Path = Sitecore.Context.Language.Name + "/";
HttpContext.Current.Response.Redirect(uriBuilder.Uri.ToString(), true);
args.AbortPipeline();
}
}
else
{
base.Process(args);
}
}
/// <summary>
/// Gets language from browser but only when language cookie doesn't exist yet and URL is related to homepage
/// Logic taken from https://markstiles.net/Blog/2013/04/01/browser-language-detection-in-sitecore.aspx
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public Language GetLanguageFromBrowser(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args)
{
// site must be inicialized, language si resolved only for homepage and a site must have in its configuration resolveBrowserLang="true" !
if (IsBrowserLangDetectionAllowed(args))
{
// default site language
Language defaultLangPrefix = LanguageManager.GetLanguage(Sitecore.Context.Site.Language);
// gets browser languages
string[] userLangs = args.Context.Request.UserLanguages;
if (userLangs != null && userLangs.Any())
{
foreach (string userLang in userLangs)
{
// gets first part where information about language is stored
string lang = userLang.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
if (!String.IsNullOrEmpty(lang))
{
Language scLang;
// if lang starts with the same letters as are in defaultLangPrefix
if (defaultLangPrefix != null && lang.StartsWith(defaultLangPrefix.CultureInfo.TwoLetterISOLanguageName))
{
scLang = defaultLangPrefix;
}
else
{
if (!Language.TryParse(lang, out scLang))
{
continue;
}
}
// then try to get the language item id from the language or two letter iso code
ID scLangId = LanguageManager.GetLanguageItemId(scLang, Sitecore.Context.Database);
if (ID.IsNullOrEmpty(scLangId))
{
//sometimes the language found is slightly different than official language item used in SC
scLang = LanguageManager.GetLanguage(scLang.CultureInfo.TwoLetterISOLanguageName);
scLangId = LanguageManager.GetLanguageItemId(scLang, Sitecore.Context.Database);
}
if (ID.IsNullOrEmpty(scLangId))
{
continue;
}
Item startItem = Sitecore.Context.Database.GetItem(Sitecore.Context.Site.StartPath, scLang);
//if you've got a version in this language then use that language
if (startItem != null && startItem.Versions.Count > 0)
{
return scLang;
}
}
}
// fallback language from site configuration
return LanguageManager.GetLanguage(Sitecore.Context.Site.Properties["resolveBrowserFallbackLang"]);
}
}
return null;
}
/// <summary>
/// Determinates if detection is allowed
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
protected bool IsBrowserLangDetectionAllowed(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args)
{
// site must be defined
return Sitecore.Context.Site != null
// lang cookie is not already set
&& !args.Context.Request.Cookies.AllKeys.Contains(Sitecore.Context.Site.GetCookieKey("lang"))
// URL is related to homepage
&& args.Context.Request.Url.AbsolutePath == "/"
// site must have property resolveBrowserLang="true"
&& Sitecore.Context.Site.Properties["resolveBrowserLang"] == "true"
// user agent is not robot
&& !Sitecore.Analytics.Configuration.AnalyticsSettings.Robots.ExcludeList.ContainsUserAgent(args.Context.Request.UserAgent);
}
}
公共类LanguageSolver:Sitecore.Pipelines.HttpRequest.LanguageSolver
{
公共覆盖无效进程(Sitecore.Pipelines.HttpRequest.HttpRequestArgs)
{
Assert.ArgumentNotNull(args,args);
Language lang=GetLanguageFromBrowser(args);
if(lang!=null)
{
Sitecore.Context.Language=lang;
//如果当前语言与默认站点语言不匹配,它将执行重定向
if(Sitecore.Context.Language.Name!=Sitecore.Context.Site.Language)
{
//重定向
UriBuilder UriBuilder=新的UriBuilder(args.Context.Request.Url);
uriBuilder.Path=Sitecore.Context.Language.Name+“/”;
HttpContext.Current.Response.Redirect(uriBuilder.Uri.ToString(),true);
args.AbortPipeline();
}
}
其他的
{
基本过程(args);
}
}
///
///从浏览器获取语言,但仅当语言cookie不存在且URL与主页相关时
///逻辑取自https://markstiles.net/Blog/2013/04/01/browser-language-detection-in-sitecore.aspx
///
///
///
公共语言GetLanguageFromBrowser(Sitecore.Pipelines.HttpRequest.HttpRequestArgs)
{
//网站必须是非专业化的,语言si只为主页解析,网站的配置中必须有resolveBrowserLang=“true”!
如果(IsBrowserLangDetectionAllowed(args))
{
//默认站点语言
Language defaultLangPrefix=LanguageManager.GetLanguage(Sitecore.Context.Site.Language);
//获取浏览器语言
字符串[]userLangs=args.Context.Request.UserLanguages;
if(userLangs!=null&&userLangs.Any())
{
foreach(userLangs中的字符串userLang)
{
//获取存储有关语言信息的第一部分
string lang=userLang.Split(新字符[]{“;”},StringSplitOptions.RemoveEmptyEntries.FirstOrDefault();
如果(!String.IsNullOrEmpty(lang))
{
语言能力;
//如果lang以defaultLangPrefix中相同的字母开头
if(defaultLangPrefix!=null&&lang.StartsWith(defaultLangPrefix.CultureInfo.TwoLetterIsLanguageName))
{
scLang=默认语言前缀;
}
其他的
{
if(!Language.TryParse(lang,out scLang))
{
继续;
}
}
//然后尝试从语言或两个字母的iso代码中获取语言项id
ID scLangId=LanguageManager.GetLanguageItemId(scLang,Sitecore.Context.Database);
if(ID.IsNullOrEmpty(scLangId))
{
//有时发现的语言与SC中使用的官方语言项目略有不同
scLang=LanguageManager.GetLanguage(scLang.CultureInfo.twoletteisolanguageName);
scLangId=LanguageManager.GetLanguageItemId(scLang,Sitecore.Context.Database);
}
if(ID.IsNullOrEmpty(scLangId))
{
继续;
}
Item startItem=Sitecore.Context.Database.GetItem(Sitecore.Context.Site.StartPath,scLang);
//如果你有这种语言的版本,那么就使用那种语言
if(startItem!=null&&startItem.Versions.Count>0)
{
返回scLang;
}
}
}
//来自站点配置的回退语言
返回LanguageManager.GetLanguage(Sitecore.Context.Site.Properties[“resolveBrowserFallbackLang]”);
}
}
返回null;
}
///
///确定是否允许检测
///
///
///
受保护的布尔值IsBrowserLangDetectionAllowed(Sitecore.Pipelines.HttpRequest.HttpRequestArgs)
{
//必须定义站点
返回Sitecore.Context.Site!=null
//lang cookie尚未设置
&&!args.Context.Request.Cookies.AllKeys.Contains(Sitecore.Context.Site.GetCookieKey(“lang”))
//URL与主页相关
&&args.Context.Request.Url.AbsolutePath==“/”
//站点必须具有resolveBrowserLang=“true”属性
&&Sitecore.Context.Site.Properties[“resolveBrowserLang”]=“true”
//用户代理不是机器人
&&!Sitecore.Analytics.Configuration.AnalyticsSettings.Robots.ExcludeList.ContainsUserAgent(args.Context.Request.UserAgent);
}
}
客户的请求只是主页,所以脚本可以扩展。我找到了一篇关于的文章,但这并不完全是我想要的,因为他完全凌驾于本机功能之上
几个小时后,我创建了自己的(也有马克代码的一部分)LanguageSolver,用于dete