Skip to content

Instantly share code, notes, and snippets.

@stefanolsen
Last active September 12, 2017 10:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stefanolsen/5cb755e7f1044d14fc82e33b40771a64 to your computer and use it in GitHub Desktop.
Save stefanolsen/5cb755e7f1044d14fc82e33b40771a64 to your computer and use it in GitHub Desktop.
Code listings for blog post about generically ensuring the right EPiServer content language for AJAX requests. Read about it here: https://stefanolsen.com/posts/ensuring-the-right-ajax-content-language-using-a-filter-attribute/
<!DOCTYPE html>
<html lang="@Model.CurrentPage.LanguageBranch">
@* Rest of the layout file goes here. *@
</html>
function ajaxGet(url, data, onComplete) {
// Get the language code from the root HTML element.
var language = document.documentElement.lang;
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
onComplete(request.responseText);
}
}
};
// Override the Accept-Language header and send the request
request.open('GET', url);
request.setRequestHeader("Accept-Language", language);
request.send();
}
public class EnsureAjaxLanguageMvcAttribute : ActionFilterAttribute
{
private readonly Injected<Settings> _settings;
private readonly Injected<IUpdateCurrentLanguage> _updateCurrentLanguage;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (_settings.Service.PageUseBrowserLanguagePreferences)
{
// If the PageUseBrowserLanguagePreferences setting is true, this is already handled everywhere.
return;
}
if (filterContext?.RequestContext?.HttpContext.Request == null)
{
return;
}
HttpRequestBase httpRequest = filterContext.RequestContext.HttpContext.Request;
if (!httpRequest.IsAjaxRequest())
{
return;
}
string[] acceptedLanguages = httpRequest.UserLanguages;
if (acceptedLanguages == null || acceptedLanguages.Length == 0)
{
return;
}
var languagePreferenceList = new LanguagePreferenceList();
languagePreferenceList.ConditionalAddRange(acceptedLanguages);
var culture = ContentLanguage.Instance.DetermineCulture(languagePreferenceList);
_updateCurrentLanguage.Service.UpdateLanguage(culture.Name);
}
}
public class EnsureAjaxLanguageWebApiAttribute : ActionFilterAttribute
{
private readonly Injected<Settings> _settings;
private readonly Injected<IUpdateCurrentLanguage> _updateCurrentLanguage;
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (_settings.Service.PageUseBrowserLanguagePreferences)
{
// If the PageUseBrowserLanguagePreferences setting is true, this is already handled everywhere.
return;
}
var acceptedLanguages = actionContext.Request.Headers.AcceptLanguage;
if (acceptedLanguages.Count == 0)
{
return;
}
var languagePreferenceList = new LanguagePreferenceList();
languagePreferenceList.ConditionalAddRange(acceptedLanguages.Select(lang => lang.Value));
var culture = ContentLanguage.Instance.DetermineCulture(languagePreferenceList);
_updateCurrentLanguage.Service.UpdateLanguage(culture.Name);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment