gpt4 book ai didi

c# - CurrentThread.CurrentUICulture 设置正确但总是 en-US

转载 作者:行者123 更新时间:2023-11-30 13:59:18 26 4
gpt4 key购买 nike

我正在用两种语言开发一个多语言网站,从阿拉伯语和英语开始

我已经在 IE 和 FireFox 中将语言设置为阿拉伯语 (ar-ae),但它总是给我英语版本,我无法解决这个问题

网站结构

Default.aspx
en/Default.aspx
ar/Default.aspx

问题是当我将 URL 用作 http://localhost:49831/site/Defualt.aspx 然后它工作正常并将我重定向到阿拉伯语版本 ar/Default.aspx 如果选择阿拉伯语作为语言。

但是当使用 URL 作为 http://localhost:49831/site/ 时,它总是将我重定向到英文版 en/Default.aspx

我不确定我做错了什么。

我只使用 Default.aspx 来检测默认浏览器语言,然后相应地重定向

Default.aspx.cs 文件的代码

    // Localization and Globalization code
protected override void InitializeCulture()
{
String lang = Request["Language"];

Session["lang"] = Helper.DetectLanguage(lang);
//Set Direction of page LTR/RTL
if (Session["lang"] == "ar-AE")
{
Session["PageDIR"] = "rtl";
}
else
{
Session["PageDIR"] = "ltr";
}

base.InitializeCulture();
}

public static String DetectLanguage(String lang)
{
String LangCode = lang;

if (!string.IsNullOrEmpty(lang))
{
lang = lang.ToLower();
}

String Lang2Char;
CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture;
String LangName = ci.Name.ToString().ToLower();
//check leng & if length is less than 2 then set english as default language.
if (LangName.Length > 1)
{
Lang2Char = LangName.Substring(0, 2);
}
else
{
Lang2Char = "en";
}

// if QueryString is not null then execute foollowinf if block
//If Language is present in Querystring then excute if part else, else part
if (lang != null)
{
switch (lang)
{
case "en-us":
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
LangCode = "en-US";
break;
case "ar-ae":
Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-AE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar-AE");
LangCode = "ar-AE";
break;
default:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
LangCode = "en-US";
break;
}
}
// if lang query string is null then set the language based on following logic
else
{
switch (Lang2Char)
{
case "en":
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
LangCode = "en-US";
break;
case "ar":
Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-AE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar-AE");
LangCode = "ar-AE";
break;
default:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
LangCode = "en-US";
break;
}

}
return LangCode;
}

我怎样才能最好地定义此代码以使其工作。在 Global.asx 文件中定义 CurrentUICulture 是否更好

最佳答案

我建议您在处理多语言网站时采取一些不同的方法。一开始您不必使用多个默认页面,您只需要一个。

所以让我解释一下如何做到这一点。

首先,可以在 web.config 中设置默认站点全局化:

  <system.web>
<globalization uiCulture="sl-SI" culture="sl-SI" enableClientBasedCulture="false"/>
</system.web>

如果可能,您可以设置 enableClientBasedCulture="true" 以强制客户端站点全局化。否则,将采用默认文化。

接下来,如何在 asp.net 页面中设置全局化(强制,当用户需要时):

    internal static void ChangeLanguage(string languageCode, System.Web.UI.Page page)
{
CultureInfo ci = new CultureInfo(languageCode);
page.Session[cLanguageSessionKey] = ci;
//save to user profile is required (just a sample)...
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
Entities.MembershipUserFull user = Services.MembershipUserManager.GetMembershipUserFull(HttpContext.Current.User.Identity.Name);
user.LanguageId = Services.LanguageManager.GetLanguageIdFromLanguageCode(languageCode);

//save profile...
user.SaveProfile();
}

//reload page. New culture will take efect...
page.Response.Redirect(page.Request.Url.AbsoluteUri);
}

这是页面加载:

        //set language if required...
if (User.Identity.IsAuthenticated)
{
Entities.MembershipUserFull user = Services.MembershipUserManager.GetMembershipUserFull(HttpContext.Current.User.Identity.Name);
if (user != null && user.LanguageId != null)
{
GP.Solutions.Entities.Language language = Services.LanguageManager.GetLanguage((int)user.LanguageId);
if (Thread.CurrentThread.CurrentUICulture.Name != language.Code)
{
ChangeLanguage(language.Code, this);
}
}
}

最后是如何在 Web 控件上处理多语言支持:

请注意我有两个全局资源(每个支持的语言一个。没有语言代码的是默认资源)

enter image description here

假设我需要在 Label 上显示一些文本:

<asp:Label ID="Label1" runat="server" CssClass="AdvertPreTitle" Text='<% $resources:AppResource,MostPopularService %>'></asp:Label>

请注意,MostPopularService 是根据当前 UI Culture 从特定语言资源中读取的。这是资源文件的片段:

enter image description here

所以最后我只有一个处理所有语言的默认页面。

关于c# - CurrentThread.CurrentUICulture 设置正确但总是 en-US,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13915123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com