以编程方式更改页面的区域设置(语言)
本文关键字:设置 区域 语言 编程 方式更 | 更新日期: 2023-09-27 18:19:51
我的Umbraco网站中有两个根节点。。一个设置为英语,另一个使用管理主机名设置为德语。。
|- en
|---- english page1
|---- english page2
|- de
|---- german page1
|---- german page2
http://mywebsite.com设置为en节点,并且http://mywebsite.de设置为de节点。
在某些情况下,我需要将德语节点的语言更改为英语。。这可能吗?怎么可能?
例如,如果有人使用德语主机名调用英语页面,我需要将区域设置更改为英语
例如http://mywebsite.de/english-page1.aspx应为英语区域设置。。所以字典等需要从英语加载
http://mywebsite.com/german-page1.aspx应为德语区域设置。。所以字典等需要从德语加载
我已经编写了一个HttpModule来更改PreRequestHandlerExecute上的区域设置,但没有成功
void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-CH");
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de-CH");
}
我认为PreRequestHandler在页面周期中太早了。在对default.aspx页面的调用中,区域性由Umbraco设置。我自己将文化变化添加到了我的基础MasterPage的构造函数中,该母版页总是在任何页面上调用。您也可以在Page Init或Page Load更改区域性。
问候,
CornéHogerheijde
您可以在Session_Start
上检查主机并将其重定向到特定语言页面,而无需太多麻烦
void Session_Start(object sender, EventArgs e)
{
// Your logic will go here
}
我意识到这已经很老了,但我在寻找答案时发现了它,并想分享我所做的。我使用的是Umbraco 7.5和MVC。
首先我创建了一个过滤器:
public class LanguageFilterAttribute : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var httpContext = filterContext.RequestContext.HttpContext;
if (!string.IsNullOrEmpty(httpContext?.Request.QueryString["lang"]))
{
if (httpContext.Request.QueryString["lang"].ToLower().StartsWith("en"))
httpContext.Session["lang"] = "en";
else if (httpContext.Request.QueryString["lang"].ToLower().StartsWith("fr"))
httpContext.Session["lang"] = "fr";
}
if (httpContext.Session["lang"] != null)
{
switch (httpContext.Session["lang"].ToString())
{
case "en":
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
break;
case "fr":
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR");
break;
}
}
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
然后在OnApplicationStarted
中添加过滤器
public class MyUmbracoApplication : Umbraco.Web.UmbracoApplication
{
protected override void OnApplicationStarted(object sender, EventArgs e)
{
base.OnApplicationStarted(sender, e);
GlobalFilters.Filters.Add(new LanguageFilterAttribute());
}
}
每当我想更改语言/区域设置时,我只需将?lang=en
或?lang=fr
添加到任何url中。这也会更改我显示的文本。我的每个文本字段都以简单的语言代码为前缀,例如"fr_pageTitle"answers"en_pageTitle"。然后我有一个扩展方法来从MVC视图中提取正确的文本
public static class PublishedContentExtensions
{
public static T GetPropertyLangValue<T>(this IPublishedContent content, string fieldName)
{
var lang = CoreHelper.GetSessionLanguage();
if (string.IsNullOrEmpty(lang))
return content.GetPropertyValue<T>(fieldName);
return content.GetPropertyValue<T>($"{fieldName}_{lang}");
}
}
希望这能帮助