如何将所选区域性传递到 InitializeCulture() 方法
how to pass the selected culture into InitializeCulture() method
我有一个登录页面,用户可以通过单选按钮 select 他的语言,登录后用户将被重定向到 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>
如何将 selected 语言从登录页面传递到 Default.aspx 页面中的此方法?我试图通过会话传递它,但出现此错误:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
System.Web.SessionState.HttpSessionState.this[string].get returned null.
因为此方法发生在启动任何控件或会话之前的早期阶段,所以它 returns 为空。知道如何将 selected 文化传递给此方法吗?
在您的代码中 "lang" 加载到 Session 中的什么地方?
我相信这是在告诉您 "lang" 在 SessionState 中不存在,而 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;
}
Change Culture of a webpage as in 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,但它 returns 和会话一样都是 null,因此查询字符串是唯一对我有用的方法。
我有一个登录页面,用户可以通过单选按钮 select 他的语言,登录后用户将被重定向到 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>
如何将 selected 语言从登录页面传递到 Default.aspx 页面中的此方法?我试图通过会话传递它,但出现此错误:
System.NullReferenceException: 'Object reference not set to an instance of an object.' System.Web.SessionState.HttpSessionState.this[string].get returned null.
因为此方法发生在启动任何控件或会话之前的早期阶段,所以它 returns 为空。知道如何将 selected 文化传递给此方法吗?
在您的代码中 "lang" 加载到 Session 中的什么地方?
我相信这是在告诉您 "lang" 在 SessionState 中不存在,而 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;
}
Change Culture of a webpage as in 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,但它 returns 和会话一样都是 null,因此查询字符串是唯一对我有用的方法。