Переключение языка в MasterPage C#.NET

Мне нужно переключить язык в файле мастер-страницы. файл главной страницы содержит меню, и мне также нужно переключить язык. Есть ли обходной путь, как я могу также использовать многоязыковую поддержку на главной странице?

Я создал переключатель языка с помощью этого учебник. Мой файл MLS.cs (в учебнике называется BasePage.cs) MLS наследуется от System.Web.UI.Page, но моя мастер-страница наследуется от System.Web.UI.MasterPage.

Я надеюсь, что есть простое решение для переключения языка также на мастер-странице без написания меню на всех страницах контента.

Вот содержимое моего Design.Master (MasterPge для пользователя):

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Design.Master.cs" Inherits="ProjectName.Site1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>...</head>
<body class="skin-blue">
    <form id="form1" runat="server">
    <div class="wrapper">
    <aside class="main-sidebar">
            <div class="slimScrollDiv" style="width: auto; height: 422px; overflow: hidden; position: relative;">
                <div class="sidebar" id="scrollspy" style="width: auto; height: 422px; overflow: hidden; -ms-touch-action: none;">
                    <ul class="nav sidebar-menu">
                        <li class="header">data lookup</li>
                        <li><a href="~/datalookup.aspx"><i class="fa fa-arrow-right"></i>to data file</a></li>
                    </ul>
                    <!-- sidebar menu: : style can be found in sidebar.less -->
                    <ul class="nav sidebar-menu">
                        <li class="header">quick selection menue</li>
                        <li class="active"><a href="#table1"><i class="fa fa-circle-o"></i>to table 1</a></li>
                        <li ><a href="#table2"><i class="fa fa-circle-o"></i>to table 2</a></li>
                        <li ><a href="#table3"><i class="fa fa-circle-o"></i>to table 3</a></li>
                        <li ><a href="#table4"><i class="fa fa-circle-o"></i>to table 4</a></li>
                    </ul>
                </div>
            </div>
            <!-- /.sidebar -->
        </aside>
    <!-- /.aside -->

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


person Hack4Life    schedule 28.07.2015    source источник


Ответы (1)


Я добился этого, создав два заголовка, один на английском и один на валлийском, а затем в MasterPage.master.cs я сделал:

protected void Page_Load(object sender, EventArgs e)
{
    BreadCrumb();

    if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
    {                
        Footer1.Visible = false;
        Footer2.Visible = true;
        Header1.Visible = false;
        Header2.Visible = true;
    }

    if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
    {                
        Footer2.Visible = false;
        Footer1.Visible = true;
        Header1.Visible = true;
        Header2.Visible = false;
    }

    Page.Header.DataBind();   
    //clear cache each time page loads
    Response.Expires = 0;
    Response.Cache.SetNoStore();
    Response.AppendHeader("Pragma", "no-cache");


private void BreadCrumb()
{
    string path = HttpContext.Current.Request.Url.AbsolutePath;

    if (path == "/LogIn.aspx" || path == "/LogIn.aspx?lang=cy-GB")
    {                
        breadcrumb.Visible = false;                
    }
}

Я также создал класс BasePage, от которого наследовался каждый последующий код страницы:

public partial class BasePage : System.Web.UI.Page
    {
        protected override void InitializeCulture()
        {
            if (Session["language"] == null)
            {
                Session["language"] = "en-GB";
            }

            else
            {
                if (Request.QueryString["lang"] == null)
                {
                    SetSessionCulture();
                }

                if (Request.QueryString["lang"] != null)
                {
                    string qs = Request.QueryString["lang"];
                    Session["language"] = qs;
                }

                SetSessionCulture();
            }

            SetSessionCulture();           
        }

        private void SetSessionCulture()
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Session["language"].ToString());
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(Session["language"].ToString());
            base.InitializeCulture();
        }
    }

изменить

Я передаю оба заголовка на валлийском/английском языке своему мастеру следующим образом:

<%@ Register Src="Components/Header2.ascx" TagName="Header" TagPrefix="uc1" %>
<%@ Register Src="Components/Header2.cy-GB.ascx" TagName="Header" TagPrefix="uc4" %>

Затем отключите/включите их на основе текущего языка, который хранится в сеансе, затем для каждой другой страницы, которая наследуется от моей базовой страницы, он проверяет текущую культуру и выбирает переводы из моих файлов resx.

редактировать 2

С точки зрения двух заголовков все, что у меня есть, это мои ссылки и переключатель языка, код выглядит следующим образом:

английская версия

public partial class header : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           string currentPage = Request.Url.AbsoluteUri.ToString();

            NameValueCollection qsexisting = HttpUtility.ParseQueryString(Request.QueryString.ToString());

            //find anyting called lang in the array and remove
            qsexisting.Remove("lang");

            //The culture is English, set stuff to Welsh
            if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
            {
                Uri uri = new Uri(currentPage);
                languagelink.HRef = String.Format(uri.GetLeftPart(UriPartial.Path) + "?lang=cy-GB" + (qsexisting.ToString() == "" ? "" : "&" + qsexisting.ToString()));                
            }
        }

        protected void LoginStatus1_LoggedOut(object sender, EventArgs e)
        {
            Response.Redirect("~/LogIn.aspx");
        }
    }

валлийская версия

 public partial class header_cy_GB : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string currentPage = Request.Url.AbsoluteUri.ToString();

            NameValueCollection qsexisting = HttpUtility.ParseQueryString(Request.QueryString.ToString());
            //find anyting called lang in the array and remove
            qsexisting.Remove("lang");

            var qs = Request.QueryString;

            //The culture is welsh, set stuff to English
            if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
            {
                Uri uri = new Uri(currentPage);
                languagelink.HRef = String.Format(uri.GetLeftPart(UriPartial.Path) + "?lang=en-GB" + (qsexisting.ToString() == "" ? "" : "&" + qsexisting.ToString()));
            }
        }

        protected void LoginStatus1_LoggedOut(object sender, EventArgs e)
        {
            Response.Redirect("~/LogIn.aspx");
        }
    }
person JsonStatham    schedule 28.07.2015
comment
Что вы имеете в виду под двумя заголовками? Что у них внутри? - person Hack4Life; 28.07.2015
comment
Просто ссылки на другие страницы и ссылка на переключение языка, но в одной все на валлийском, а в другой все на английском, - person JsonStatham; 28.07.2015
comment
Я добавил некоторый код моего файла Design.Master. Мне нужно перевести весь текст внутри файла #scrollspy. Как я могу сделать это, изменив заголовок? Меня это смущает.. - person Hack4Life; 28.07.2015
comment
ваш Footer1/Footer2 что-то вроде заполнителя, и вы переключаетесь между ними? - person Hack4Life; 28.07.2015
comment
Хорошо, становится все яснее и яснее @selectDistinct. Не могли бы вы также показать мне содержимое файла ascx и то, как оно используется внутри файла .aspx? Это файл, содержащий определение некоторых пользовательских элементов управления, таких как asp:literal? - person Hack4Life; 28.07.2015
comment
Вы можете видеть в моем втором редактировании, код, стоящий за этим, устанавливает, что на самом деле будет делать ссылка переключения языка для каждой версии заголовка, т. Е. Установите текущую культуру на en-GB или cy-GB соответственно, aspx для заголовков не имеет значения, поскольку пока у вас есть какая-то кнопка переключения языка, которую вы можете подключить, как я сделал при загрузке страницы. - person JsonStatham; 28.07.2015
comment
В вашем первом фрагменте кода есть Header1 и Header2, но вы регистрируете Header2 и Header2.cy-GB. В чем разница? Header2.cy-GB.visible не работает в коде моего файла мастер-страницы. - person Hack4Life; 29.07.2015