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

Orchardcms 如何拦截请求以获取站点本地化的原始URL?,orchardcms,orchardcms-1.10,Orchardcms,Orchardcms 1.10,我的网站是这样工作的: 所有内容都有{culture/slug}URL的自动路由 用户可以选择网站文化,以便所有内容都以他们选择的语言呈现 我正在尝试实现以下功能: 用户选择英文网站 用户进入“site.com/es/content”,这是一个西班牙语内容 网站必须自动将区域性更改为西班牙语,并返回请求的内容 我想我需要的是截取请求,解析URL并获取区域性,看看它是否与当前的相同 我尝试使用IHttpContextAccessor在Orchard.Core.Contents中的ItemsCont

我的网站是这样工作的:

  • 所有内容都有{culture/slug}URL的自动路由
  • 用户可以选择网站文化,以便所有内容都以他们选择的语言呈现
  • 我正在尝试实现以下功能:

  • 用户选择英文网站
  • 用户进入“site.com/es/content”,这是一个西班牙语内容
  • 网站必须自动将区域性更改为西班牙语,并返回请求的内容
  • 我想我需要的是截取请求,解析URL并获取区域性,看看它是否与当前的相同

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

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


    任何提示都将不胜感激。

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

    机具选择器 您可以在
    GetCulture
    中进入疯狂状态,读取标题、cookies、查询字符串或从数据库获取当前用户的一些设置。任何适合你需要的

    直接设置文化 在返回结果之前,只需更改
    WorkContext
    的当前文化即可


    有趣的事实:在控制器中更改
    工作上下文。区域性
    将覆盖您在
    ICultureSelector
    实现中所做的一切。

    您是否尝试实现
    ICultureSelector
    GetCulture
    方法将HTTP上下文作为参数接收,这将使您能够从当前URL检测区域性。
    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 };
            }
        }
    }
    
    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.");
            }
        }
    }