0

我的网站是这样工作的:

  1. 所有内容都有 {culture/slug} URL 的自动路由
  2. 用户可以选择网站文化,以便一切都以他们选择的语言呈现

我正在尝试实现此功能:

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

我认为我需要的是拦截请求,解析 URL 并获取文化以查看它是否与当前的相同。

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

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

任何指针将不胜感激。

4

1 回答 1

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,读取标题、cookies、查询字符串或从数据库获取当前用户的一些设置。什么都适合你的需要。

直接设置文化

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实现中所做的一切。

于 2018-01-11T11:33:42.153 回答