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
任何提示都将不胜感激。有一些方法可以做到这一点 机具选择器 您可以在
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.");
}
}
}