首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何拦截请求以获取用于站点本地化的原始URL?

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

Stack Overflow用户
提问于 2017-12-09 01:36:54
回答 1查看 283关注 0票数 0

我的网站是这样运作的:

  1. 所有内容都有用于{区域性/片段}URL的自动命令。
  2. 用户可以选择网站文化,这样一切都以他们所选择的语言呈现。

我试图实现这个功能:

  1. 用户选择英文网站。
  2. 用户转到"site.com/es/ content ",这是西班牙语的一个内容。
  3. 网站必须自动将区域性更改为西班牙语,并返回所请求的内容。

我认为我需要的是拦截请求,解析URL并获取区域性,看看它是否与当前的相同。

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

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

如有任何指示,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-11 11:33:42

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

实现ICultureSelector

代码语言:javascript
代码运行次数:0
运行
复制
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获取当前用户的一些设置。任何适合你需要的东西。

直接设置文化

代码语言:javascript
代码运行次数: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.");
        }
    }
}

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

有趣的事实:在控制器中更改WorkContext.Culture将覆盖您在ICultureSelector实现中所做的一切。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47724461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档