【问题标题】:Change resource file reference on btn click在 btn 单击时更改资源文件引用
【发布时间】:2014-04-15 18:17:10
【问题描述】:

我正在实现一种用户切换显示语言的方法(en || es)。我有以下内容:

<asp:LinkButton ID="Lnk_cultChange" runat="server" Text="<%$Resources:mySource, cultbtn%>" OnClick="cultChange_Click" />

后面的代码:

protected void cultChange_Click(object sender, EventArgs e)
{
    if (CultureInfo.CurrentUICulture.TwoLetterISOLanguageName == "en")
    {
        System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-ES");
        System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
        base.InitializeCulture();
    }
    else
    {
        System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
        System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
        base.InitializeCulture();
    }
}

有回发,但似乎没有发生任何事情。英文资源文件仍在显示,没有翻译。我的实现是否正确?

【问题讨论】:

  • 也许这需要在页面初始化时完成(更改)。
  • 调试你的代码,我打赌你的Page_Load事件在你的按钮点击事件之前发生/触发..做一些正确的IsPostBack()检查我会把代码放在Pre_Render或Init上
  • Page_Load 将总是在点击事件之前触发
  • 你也可以加入一些可以处理 onclientClick 的 JavaScript 代码(如果可用的话)并将它的回发属性设置为 false...

标签: c# asp.net multilingual resx


【解决方案1】:

在页面 PreInit 事件上切换文化,如果您只想在单击特定按钮时切换文化,请使用以下代码。

protected override void OnPreInit(EventArgs e)
{
    if (Page.IsPostBack)
    {
        if (Request.Form["__EVENTTARGET"] == "Lnk_cultChange")
        {
            if (CultureInfo.CurrentUICulture.TwoLetterISOLanguageName == "en")
            {
                System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-ES");
                System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
                base.InitializeCulture();
            }
            else
            {
                System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
                System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
                base.InitializeCulture();
            }
        }

    }

    base.OnPreInit(e);
}

Request.Form["__EVENTTARGET"] 将是您的 LinkBut​​ton 的客户端 ID,如果这不起作用,请告诉我

【讨论】:

  • 您的实施对我不起作用。也许我在 onClick 中调用了不正确的事件?
  • 不要使用按钮的点击事件,只需将条件放在页面PreInit上,就像上面的解决方案一样。如果不起作用,请将您的示例解决方案发送给我 [anubrij@live.com],我将通过更正回复您。
【解决方案2】:

将您的更改语言按钮放在站点主控中。 添加如下点击事件处理程序

protected void btnEng_Click(object sender, EventArgs e)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en");
    Session.Add("Lang", "en");
    Response.Redirect(Request.Url.PathAndQuery);
}

并在您页面的代码后面添加以下方法:

protected override void InitializeCulture()
    {
        if (Session["Lang"] != null)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Session["Lang"].ToString().Split('-')[0]);
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(Session["Lang"].ToString().Split('-')[0]);
        }
        else
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
        }
        base.InitializeCulture();
    }

希望有帮助

【讨论】:

    【解决方案3】:

    就像@Umriyaev 建议你必须覆盖InitializeCulture() 并在另一个重定向后使用它来拉文化。看这里https://stackoverflow.com/a/10672476/2596756

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多