我的网站是这样运作的:
我试图实现这个功能:
我认为我需要的是拦截请求,解析URL并获取区域性,看看它是否与当前的相同。
我尝试过使用ItemsController在Orchard.Core.Contents中使用IHttpContextAccessor,但它没有原始Url。
我还尝试在Orchard.Autoroute和Orchard.Alias服务中捕获请求,但它们不是处理请求的服务。
如有任何指示,将不胜感激。
发布于 2018-01-11 03:33:42
有一些方法可以做到这一点。
实现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
中疯狂阅读标题、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
实现中所做的一切。
https://stackoverflow.com/questions/47724461
复制相似问题