Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式更改页面的区域设置(语言)_C#_Asp.net_Localization_Umbraco_Httpmodule - Fatal编程技术网

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

C# 以编程方式更改页面的区域设置(语言),c#,asp.net,localization,umbraco,httpmodule,C#,Asp.net,Localization,Umbraco,Httpmodule,我的Umbraco网站中有两个根节点。。一个设置为英语,另一个设置为德语,使用管理主机名 |- en |---- english page1 |---- english page2 |- de |---- german page1 |---- german page2 设置为en节点,设置为de节点 在某些情况下,我需要将德语节点的语言更改为英语。。这可能吗?如何实现 例如,如果有人使用德语主机名调用英语页面,我需要将区域设置更改为英语 比如说 .de/english-page1.aspx应

我的Umbraco网站中有两个根节点。。一个设置为英语,另一个设置为德语,使用管理主机名

|- en
|---- english page1
|---- english page2

|- de
|---- german page1
|---- german page2
设置为en节点,设置为de节点

在某些情况下,我需要将德语节点的语言更改为英语。。这可能吗?如何实现

例如,如果有人使用德语主机名调用英语页面,我需要将区域设置更改为英语

比如说 .de/english-page1.aspx应为英语区域设置。。因此,需要从英语加载词典等
.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设置。我自己将文化变化添加到我的基本母版页的构造函数中,母版页总是在任何页面上调用。您还可以在页面初始化或页面加载时更改区域性

亲切问候,


CorneéHogerheijde

我认为PreRequestHandler在页面周期中太早了。在调用default.aspx页面时,区域性由Umbraco设置。我自己将文化变化添加到我的基本母版页的构造函数中,母版页总是在任何页面上调用。您还可以在页面初始化或页面加载时更改区域性

亲切问候,


CorneéHogerheijde

您可以在
会话_Start
上检查主机,并将其重定向到特定的语言页面,而无需太多麻烦

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

}

您可以在
Session\u 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)
    {

    }
}
然后在应用程序启动时的
中添加过滤器

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时,我只需向任何url添加
?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}");
    }

}
公共静态类发布的内容文本
{
公共静态T GetPropertyLangValue(此IPPublishedContent内容,字符串字段名)
{
var lang=coreheloper.GetSessionLanguage();
if(string.IsNullOrEmpty(lang))
返回content.GetPropertyValue(fieldName);
返回content.GetPropertyValue($“{fieldName}{lang}”);
}
}

希望这对某人有所帮助

我意识到这很古老,但我在寻找答案时发现了它,并想与大家分享我所做的一切。我正在使用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)
    {

    }
}
然后在应用程序启动时的
中添加过滤器

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时,我只需向任何url添加
?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}");
    }

}
公共静态类发布的内容文本
{
公共静态T GetPropertyLangValue(此IPPublishedContent内容,字符串字段名)
{
var lang=coreheloper.GetSessionLanguage();
if(string.IsNullOrEmpty(lang))
返回content.GetPropertyValue(fieldName);
返回content.GetPropertyValue($“{fieldName}{lang}”);
}
}

希望这能帮助别人

我不明白重点。文化的变化如何将域从en变为de?你的代码看起来不错,应该设置文化我不明白。文化的变化如何将域从en变为de?您的代码似乎很好,它应该设置文化