Программно изменить язык (язык) страницы - PullRequest
2 голосов
/ 09 января 2012

У меня есть два корневых узла на моем веб-сайте 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 голосов
/ 28 июня 2012

Вы можете проверить хост на Session_Start и перенаправить их на страницу определенного языка без особых хлопот

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

}
0 голосов
/ 14 октября 2016

Я понимаю, что это очень старо, но я нашел его, когда искал ответ, и подумал, что поделюсь тем, что я сделал. Я использую 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' и '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}");
    }

}

Надеюсь, это кому-нибудь поможет

0 голосов
/ 28 июня 2012

Я думаю, что PreRequestHandler слишком рано в цикле страницы. При вызове страницы default.aspx культура устанавливается Umbraco. Я сам добавил изменение культуры в конструктор моей базовой MasterPage, главной страницы, которая всегда вызывается на любой странице. Вы также можете изменить культуру в Page Init или Page Load.

С уважением,

Corné Hogerheijde

...