Skip to content

Instantly share code, notes, and snippets.

@NaibafCH
Last active July 19, 2019 13:31
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save NaibafCH/1e692541503eca0d7109fc0921bc3caf to your computer and use it in GitHub Desktop.
Save NaibafCH/1e692541503eca0d7109fc0921bc3caf to your computer and use it in GitHub Desktop.
using System.Collections.Generic;
using System.Linq;
using Sitecore.Configuration;
using Sitecore.Data.Managers;
using Sitecore.Diagnostics;
using Sitecore.Globalization;
using Sitecore.Pipelines.HttpRequest;
using Sitecore.Web;
using Sitecore.Sites;
namespace Sitecore.Foundation.Multisite.Pipelines.HttpRequestBegin
{
/***
* 1) Register this processor in config:
* <pipelines>
* <httpRequestBegin>
* <processor patch:after="*[@type='Sitecore.Pipelines.HttpRequest.LanguageResolver, Sitecore.Kernel']"
* type="Sitecore.Foundation.Multisite.Pipelines.HttpRequestBegin.BrowserLanguageResolver, Sitecore.Foundation.Multisite" />
* </httpRequestBegin>
* </pipelines>
*
* 2) Mark all your sites which you want this processor be executed:
* <site name="myCustomSite" patch:before="site[@name='website']"
* ...
* isBrowserLanguageResolving="true" />
*
* 3) Optional: Implement method "IsLanguageConfigured". This should check if the resolved language is used on the current site
*
*/
public class BrowserLanguageResolver : HttpRequestProcessor
{
public override void Process(HttpRequestArgs args)
{
// Check setting
if (!IsBrowserLanguageDetectionEnabled())
{
return;
}
// Site couldn't be resolved
var site = Context.Site;
if (site == null)
{
return;
}
// Only execute this processor on custom sites
if (IsCustomSite(Context.Site))
{
return;
}
// Check for Database
if (Context.Database == null)
{
return;
}
// Cookie already set
var languageFromCookie = WebUtil.GetCookieValue(site.GetCookieKey("lang"));
if (!string.IsNullOrEmpty(languageFromCookie))
{
return;
}
// Try to get browser language
var language = GetBrowserLanguage(args);
if (language == null)
{
return;
}
// Optional: Check if the resolved language is used on the current site
if (!IsLanguageConfigured(language))
{
return;
}
Context.Language = language;
Tracer.Info("Language changed to \"" + language.Name + "\" due to the browser language of the current request.");
}
protected virtual bool IsCustomSite(SiteContext site)
{
if (site == null)
{
return false;
}
if (!bool.TryParse(site.Properties["isBrowserLanguageResolving"], out var isWebSite))
{
return false;
}
return isWebSite;
}
protected virtual bool IsLanguageConfigured(Language language)
{
// TODO (optional): Add logic here which checks if the resolved language is used on the current site
return true;
}
protected virtual bool IsBrowserLanguageDetectionEnabled()
{
return Settings.GetBoolSetting("Sitecore.Foundation.Multisite.BrowserLanguageResolver.IsEnabled", true);
}
protected virtual Language GetBrowserLanguage(HttpRequestArgs args)
{
var browserLanguages = GetBrowserLanguageStrings(args);
foreach (var browserLanguage in browserLanguages)
{
if (string.IsNullOrEmpty(browserLanguage))
{
continue;
}
var language = LanguageManager.GetLanguage(browserLanguage, Context.Database);
if (language != null)
{
return language;
}
}
return null;
}
protected virtual IEnumerable<string> GetBrowserLanguageStrings(HttpRequestArgs args)
{
var languages = new List<string>();
if (args.HttpContext.Request.UserLanguages == null)
{
return languages;
}
var fullLanguage = args.HttpContext.Request.UserLanguages[0];
if (string.IsNullOrEmpty(fullLanguage))
{
return languages;
}
// Add culture code
var mainLanguage = fullLanguage.Split(';').FirstOrDefault();
if (string.IsNullOrEmpty(mainLanguage))
{
return languages;
}
languages.Add(mainLanguage);
// Add 2-char ISO code. This is especially usefull if you are using 2-char languages in Sitecore.
var isoArray = mainLanguage.Split('-');
if (isoArray.Length == 2)
{
languages.Add(isoArray[0]);
}
return languages;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment