我的网站以这种方式运作:
我试图实现此功能:
我认为我需要的是拦截请求,解析网址并获取文化,看它是否与当前的相同。
我尝试使用IHttpContextAccessor在Orchard.Core.Contents的ItemsController中获取它,但它没有原始Url。
我也尝试在Orchard.Autoroute和Orchard.Alias服务中捕获请求,但他们不是处理请求的人。
任何指针都会受到赞赏。
答案 0 :(得分:1)
有一些方法可以做到这一点。
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
实施中执行的所有操作。