Мне нужно установить язык интерфейса на языке браузера (языки) и сделать перенаправление для правильной языковой версии. Мне также необходимо исключить роботов из-за индексации поисковых систем.Как установить язык интерфейса в Sitecore на языке (-ах) браузера?
1
A
ответ
5
Я нашел статью о "Browser Language Detection is Sitecore" from Mark Stiles, но это было не совсем то, что я хотел, потому что он переопределяет родную функциональность вообще.
После нескольких часов я создал собственный (есть и части кода Марка) LanguageResolver, использующий для обнаружения языка браузера с переадресацией, если это необходимо и исключая роботов.
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);
}
}
Запрос клиента был только для начальной страницы, поэтому сценарий мог быть расширен.
Смежные вопросы
- 1. Изменить язык интерфейса браузера программно
- 2. Вручную установить язык интерфейса?
- 3. Невозможно установить язык браузера в java ResourceBundle
- 4. Как установить язык по умолчанию в многоязычном решении Sitecore?
- 5. Как установить язык javac на английском языке постоянно на eclipse
- 6. Sitecore Rocks - Добавить элемент на определенном языке
- 7. Set/force HUE Язык интерфейса на английском языке (Hadoop/Cloudera)
- 8. Как установить язык на французском языке моего приложения для Android?
- 9. Sitecore, отображающий японский язык, хотя язык установлен на английский
- 10. Язык интерфейса на клавиатуре телефона
- 11. Как изменить язык пользовательского интерфейса на Padre?
- 12. Установить язык устройства как язык?
- 13. Как установить язык на highcharts.client.Chart
- 14. Создание файла sitecore программно на определенном языке
- 15. Как изменить язык «Timestamp» на языке MySql?
- 16. Как меняется язык пользовательского интерфейса?
- 17. Как изменить язык интерфейса gitg в Windows?
- 18. Язык пользовательского интерфейса AccountKit
- 19. Язык Интерфейса и язык интерфейса пользователя powershel
- 20. Selenium webdriver - Невозможно установить язык браузера
- 21. Sitecore не принимает язык в URL
- 22. NSDateFormatter - установить язык устройства как язык?
- 23. За исключением случаев Язык на английском языке
- 24. Как добавить новый язык в Sitecore 8?
- 25. Как установить язык по умолчанию как 'en' в случае, если версия языка не создана в sitecore
- 26. Язык интерфейса, специфичный для Drupal
- 27. Как установить португальский язык на движок TTS?
- 28. Sitecore, обеспечивающий перевод страниц на один язык
- 29. Как установить язык в Rails?
- 30. ASP MVC Изменить язык браузера?
Вы можете «принять» свой собственный ответ, нажав на «галочку». Это удаляет его из неразрешенного списка вопросов в StackOverflow. –
Обновлена ссылка на [«Обнаружение языка браузера - Sitecore» от Mark Stiles] (https://markstiles.net/blog/2013/4/1/browser-language-detection-in-sitecore/) https: // markstiles.net/blog/2013/4/1/browser-language-detection-in-sitecore/ – Annagram