簡體   English   中英

如何將所選區域性傳遞給InitializeCulture()方法

[英]how to pass the selected culture into InitializeCulture() method

我有一個登錄頁面,用戶可以通過單選按鈕選擇其語言,登錄后,用戶將被重定向到Default.aspx,在這里我使用以下方法設置頁面區域性:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"%>
<%@ Import Namespace="System.Resources" %>
<% @Import Namespace="System.Globalization" %>
<% @Import Namespace="System.Threading" %>
<script runat=server>
        protected override void InitializeCulture()
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Session["lang"].ToString());
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(Session["lang"].ToString());
            base.InitializeCulture();
        }
</script>

如何將所選語言從登錄頁面傳遞到Default.aspx頁面的此方法? 我試圖通過會話傳遞它,但出現此錯誤:

System.NullReferenceException:'對象引用未設置為對象的實例。 System.Web.SessionState.HttpSessionState.this [string] .get返回null。

因為此方法發生在啟動任何控件或會話之前的早期,所以這就是它返回null的原因。 知道如何將所選區域性傳遞給該方法嗎?

在您的代碼中,“ lang”加載到Session中的什么位置?

我相信這是在告訴您SessionState中不存在“ lang”,而SessionState本身不可用。

您是將其設置為默認值還是允許用戶選擇它?

如果是前者,則將其放在您的App.xaml.cs中:

[assembly: NeutralResourcesLanguage("en-US")]

如果您擔心線程文化,也可以執行以下操作:

var culture = CultureInfo.CreateSpecificCulture("en-US");

if (Thread.CurrentThread.CurrentCulture.Name != "en-US")
{
    var culture = CultureInfo.CreateSpecificCulture("en-US");
    CultureInfo.DefaultThreadCurrentCulture = culture;
    CultureInfo.DefaultThreadCurrentUICulture = culture;
}

在MSDN中更改網頁的區域性

 <%@ Page Language="C#" uiculture="auto" %> <%@ Import Namespace="System.Threading" %> <%@ Import Namespace="System.Globalization" %> <script runat="server"> protected override void InitializeCulture() { if (Request.Form["ListBox1"] != null) { String selectedLanguage = Request.Form["ListBox1"]; UICulture = selectedLanguage ; Culture = selectedLanguage ; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage); Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage); } base.InitializeCulture(); } </script> 

我找到了答案,我設法使用查詢字符串傳遞了選定的文化信息:

在我的登錄頁面中,我有兩個單選按鈕和一個按鈕:

<asp:RadioButton ID="RadioButton1" runat="server" Text="ar-AE" />
<asp:RadioButton ID="RadioButton2" runat="server" Text="en-US" />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />

在按鈕OnClick后面的代碼中:

protected void Button1_Click(object sender, EventArgs e)
    {
        if (RadioButton1.Checked)
        {
            Response.Redirect("Default.aspx?language=" + RadioButton1.Text);
        }
        else
        {
            Response.Redirect("Default.aspx?language=" + RadioButton2.Text);
        }
    }

然后在Default.aspx頁面中,我有以下代碼:

<% @Import Namespace="System.Resources" %>
<% @Import Namespace="System.Globalization" %>
<% @Import Namespace="System.Threading" %>
<script runat=server>
    protected override void InitializeCulture()
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.QueryString["language"].ToString());
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(Request.QueryString["language"].ToString());
        base.InitializeCulture();
    }
</script>

我也嘗試使用Cookie,但它也像會話一樣返回null,因此查詢字符串是唯一對我有用的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM