Last active
July 19, 2019 13:31
-
-
Save NaibafCH/1e692541503eca0d7109fc0921bc3caf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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