以编程方式更改页面的区域设置(语言)

时间:2012-01-09 09:36:53

标签: c# asp.net localization umbraco httpmodule

我的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");
}

3 个答案:

答案 0 :(得分:0)

我认为PreRequestHandler在页面循环中太早了。在调用default.aspx页面时,文化由Umbraco设置。我自己将文化更改添加到我的基本MasterPage的构造函数中,该页面始终在任何页面上调用。您还可以在Page Init或Page Load中更改文化。

亲切的问候,

CornéHogerheijde

答案 1 :(得分:0)

您可以在Session_Start上检查主机并将其重定向到特定语言页面,而不会有太多麻烦

void Session_Start(object sender, EventArgs e) 
{
    // Your logic will go here

}

答案 2 :(得分:0)

我意识到这是非常古老的,但我在寻找答案时发现它,并认为我会分享我所做的。我正在使用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 / locale时,我只需将?lang=en?lang=fr添加到任何网址。这也会改变我显示的文本。我的每个文本字段都以简单的语言代码为前缀,例如。 'fr_pageTitle'和'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}");
    }

}

希望这有助于某人