如何拦截获取站点本地化原始URL的请求?

时间:2017-12-09 01:36:55

标签: orchardcms orchardcms-1.10

我的网站以这种方式运作:

  1. 所有内容都自动包含{culture / slug}网址
  2. 用户可以选择网站文化,以便所有内容都以他们选择的语言显示
  3. 我试图实现此功能:

    1. 用户选择英文网站。
    2. 用户访问" site.com/es/content" ;,这是西班牙文的内容。
    3. 网站必须自动将文化更改为西班牙语并返回所请求的内容。
    4. 我认为我需要的是拦截请求,解析网址并获取文化,看它是否与当前的相同。

      我尝试使用IHttpContextAccessor在Orchard.Core.Contents的ItemsController中获取它,但它没有原始Url。

      我也尝试在Orchard.Autoroute和Orchard.Alias服务中捕获请求,但他们不是处理请求的人。

      任何指针都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

有一些方法可以做到这一点。

实施ICultureSelector

namespace SomeModule
{
    using System;
    using System.Globalization;
    using System.Linq;
    using System.Web;
    using Orchard.Localization.Services;

    public class CultureSelectorByHeader : ICultureSelector
    {
        private readonly ICultureManager cultureManager;

        public CultureSelectorByHeader(ICultureManager cultureManager)
        {
            this.cultureManager = cultureManager;
        }

        public CultureSelectorResult GetCulture(HttpContextBase context)
        {
            var acceptedLanguageHeader = context?.Request?.UserLanguages?.FirstOrDefault();
            if ( acceptedLanguageHeader == null )
                return null;

            var enabledCultures = this.cultureManager.ListCultures();
            var siteCulture = this.cultureManager.GetSiteCulture();

            // Select the specified culture if it's enabled.
            // Otherwise, or if it wasn't found, fall back to the default site culture.
            var culture = enabledCultures.Contains(acceptedLanguageHeader, StringComparer.InvariantCultureIgnoreCase)
                ? CultureInfo.CreateSpecificCulture(acceptedLanguageHeader).Name
                : CultureInfo.CreateSpecificCulture(siteCulture).Name;

            return new CultureSelectorResult { CultureName = culture, Priority = 0 };
        }
    }
}

您可以在GetCulture中疯狂,读取标题,Cookie,查询字符串或从DB获取当前用户的一些设置。无论什么适合您的需要。

直接设置文化

private void SetWorkContextCulture(string cultureTwoLetterIsoCode)
{
    if ( !string.IsNullOrWhitespace(cultureTwoLetterIsoCode) )
    {
        try
        {
            var culture = CultureInfo.CreateSpecificCulture(cultureTwoLetterIsoCode);
            this.Services.WorkContext.CurrentCulture = culture.TwoLetterISOLanguageName;
        }
        catch ( CultureNotFoundException )
        {
            Debug.WriteLine("Couldn't change thread culture.");
        }
    }
}

在返回结果之前,只需更改WorkContext的当前文化,就可以了。

有趣的事实:更改控制器中的WorkContext.Culture会覆盖您在ICultureSelector实施中执行的所有操作。

相关问题