简体   繁体   中英

Change CultureInfo c#

I created 3 options idioms to my WebApp. This idiom are set in Buttons in all pages. The first option idiom is set CurrentInfo.

My question is, who I can set in others pages this Idiom that user set in Homepage?

for example, to each page, in Page_Load I have this config:

Idioma.MudaCultura(CultureInfo.CurrentCulture.TwoLetterISOLanguageName.ToString());

My Button Event in Home Page. (basically this is the same for all pages)

protected void es_OnChange(object sender, EventArgs e)
{
    Idioma.MudaCultura("es");
    lblWelcome.Text = Idioma.RetornaMensagem("welcome");
    btnRequestAccess.Text = Idioma.RetornaMensagem("btnRequestAccess");
    btnTickets.Text = Idioma.RetornaMensagem("btnTickets");
    btnManager.Text = Idioma.RetornaMensagem("btnManager");
    btnManageFolders.Text = Idioma.RetornaMensagem("btnManageFolders");
}

My class Idiom

public class Idioma
{
    private string chaveRM = "";

    public string ChaveRM
    {
        get { return chaveRM; }
        set { chaveRM = value; }
    }

    public static string RetornaMensagem(string NomeMensagem) 
    {
        ResourceManager resx = new ResourceManager(typeof(RM)); 
        return resx.GetString(NomeMensagem, System.Threading.Thread.CurrentThread.CurrentCulture); 
    } 

    public static void MudaCultura(string cultura)
    { 
        if (cultura=="pt") 
        { 
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("pt", true); 
        }

        else if(cultura=="en") 
        { 
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en", true); 
        }

        else if (cultura == "es")
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("es", true);
        }
    }
}

What I need is setting CurrentInfo with option that User was set in HomePage and if is different of this CurrentInfo.

Example:

Home: My CurrentInfo is "en-US". Home: I change my Idiom to "es-ES". Other page: I need get this new CurrentInfo("es-ES").

Am I clear?

in order to make it in a professional way, you should know the hierarchical of the asp page, as you know any aspx page extends from System.Web.Pages so you have to create a class called BasePage this one will extends from Page and you will over-ride some default functions that will help you alot in cultureinfo and currency etc.. and make your aspx page extends from BasePage

you need to reload page after changing the culture in order to make it take effect

Check below example:

public class BasePage: Page
{ 
  public BasePage()
  {
    //
    // TODO: Add constructor logic here
    //


  }
  protected override void OnPreInit(EventArgs e)
  {
    Page.Theme = "Default";
    base.OnPreInit(e);
  }
  protected override void OnInit(EventArgs e)
  {
    base.OnInit(e);
  }
protected override void InitializeCulture()
{
    string CurrencySymbol = "";
    string lang = string.Empty;
    HttpCookie cookie = Request.Cookies["ddl_LanguageSwitcher"];

    if (cookie != null && cookie.Value != null)
    {
        lang = cookie.Value;
        CultureInfo eg = CultureInfo.CreateSpecificCulture(lang);
        IsArabic = (lang.IndexOf("ar-") >= 0);
        if (IsArabic)
        {
            CurrencySymbol = "جم";
        }
        else
        {
            CurrencySymbol = "EGP";
        }

        DateTimeFormatInfo di = new DateTimeFormatInfo();
        di.FullDateTimePattern = "dd/MM/yyyy HH:mm:ss";
        di.ShortDatePattern = "dd/MM/yyyy";
        eg.DateTimeFormat = di;
        NumberFormatInfo ni = new NumberFormatInfo();
        ni.CurrencySymbol = CurrencySymbol;
        ni.CurrencyDecimalDigits = 2;
        ni.NumberDecimalDigits = 2;
        //ni.CurrencyGroupSeparator = "-";
        ni.NumberGroupSeparator = "";
        eg.NumberFormat = ni;
        System.Threading.Thread.CurrentThread.CurrentUICulture = eg;
        System.Threading.Thread.CurrentThread.CurrentCulture = eg;
        _culture = Request.Cookies["ddl_LanguageSwitcher"].Value;
    }
    else
    {
        if (string.IsNullOrEmpty(lang)) lang = BL.Settings.DefaultLanguage;
        CultureInfo eg = CultureInfo.CreateSpecificCulture(lang);
        IsArabic = (lang.IndexOf("ar-") >= 0);
        if (IsArabic)
        {
            CurrencySymbol = "جم";
            //eg.NumberFormat.CurrencySymbol = "جم";
        }
        else
        {
            CurrencySymbol = "EGP";
            //eg.NumberFormat.CurrencySymbol = "EGP";
        }

        DateTimeFormatInfo di = new DateTimeFormatInfo();
        di.FullDateTimePattern = "dd/MM/yyyy HH:mm:ss";
        di.ShortDatePattern = "dd/MM/yyyy";
        eg.DateTimeFormat = di;

        NumberFormatInfo ni = new NumberFormatInfo();
        ni.CurrencySymbol = CurrencySymbol;
        ni.CurrencyDecimalDigits = 2;
        ni.NumberDecimalDigits = 2;
        //ni.CurrencyGroupSeparator = "-";
        ni.NumberGroupSeparator = "";
        eg.NumberFormat = ni;
        System.Threading.Thread.CurrentThread.CurrentUICulture = eg;
        System.Threading.Thread.CurrentThread.CurrentCulture = eg;
        HttpCookie cookie2 = new HttpCookie("ddl_LanguageSwitcher");
        cookie2.Value = lang;
        Response.SetCookie(cookie2);
        _culture = "ar-EG";
    }
    base.InitializeCulture();
}
}

I hope this was helpful

This is not the complete solution, but shows you how can you set/retrieve something from the Session - if you decide to go this way.

public string ChaveRM
{
    get 
    { 
        if (Session["chaveRM"] != null) 
            return Session["chaveRM"].ToString();

        return string.Empty;
    }
    set 
    { 
        Session["chaveRM"] = value; 
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM