我有一个多语言的Web表单Web应用程序,我正在使用资源文件和一个BasePage类,它根据继承自此类的页面中包含的QueryString设置文化。这一切都运作良好,如果有点笨重,因为我必须为每个按钮执行此类操作,将用户带到另一个页面以维护文化:
if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
{
return "~/Secure/Details.aspx?lang=cy-GB&PersonId=" + currentPersonId;
}
else
{
return "~/Secure/Details.aspx?PersonId=" + currentPersonId;
}
我知道可能有更好的方法可以做到这一点,但作为一个新手,因为它工作我只是做了。
直到我必须实施asp:SiteMapPath
控件。我最初假设我可以简单地为url
属性创建资源条目,就像我为title
所做的那样:
<siteMapNode
title="$resources:SiteMapLocalizations,HomePageTitle"
description="Home"
url="~$resources:SiteMapLocalizations,HomePageUrl">
然而,这导致服务器错误:
从客户端(:)检测到潜在危险的Request.Path值。
我已经完成了一些阅读,我相信我需要以某种方式将当前文化存储到会话变量中,该变量将跟随用户,因此当他们点击“主页”时在痕迹上它将与文化保持一致并从资源文件中获取相应的文本,我也希望这将允许我删除我必须写的所有IF ELSE
语句在整个申请过程中保持现有语言。
然而,我的问题是,从哪里开始,为了达到这个目的,我找不到一步一步的指导,任何人都可以提供一些指示吗?
答案 0 :(得分:0)
看一下这个链接。它解释了你想要实现的目标。
http://adamyan.blogspot.se/2010/02/aspnet-mvc-2-localization-complete.html
答案 1 :(得分:0)
确保您有某种触发语言更改的按钮。在我的情况下,我有两个版本的标题,一个带有英文链接,将查询字符串附加到英语,一个用于威尔士,如:
<强> ASP 强>
<a id="languagelink" runat="server" title="Cymraeg">Cymraeg</a>
<强> C#强>
if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
{
Uri uri = new Uri(currentPage);
languagelink.HRef = String.Format(uri.GetLeftPart(UriPartial.Path)+"?lang=cy-GB");
}
每个需要语言切换的页面都需要从我的自定义BasePage
继承,如下所示:
<强>继承强>
public partial class Secure_CustomerSummary : BasePage
<强> Base_Page 强>
public partial class BasePage : System.Web.UI.Page
{
protected override void InitializeCulture()
{
if (Session["language"] == null)
{
Session["language"] = "en-GB";
}
else
{
if (Request.QueryString["lang"] == null)
{
SetSessionCulture();
}
if (Request.QueryString["lang"] != null)
{
string qs = Request.QueryString["lang"];
Session["language"] = qs;
}
SetSessionCulture();
}
SetSessionCulture();
}
private void SetSessionCulture()
{
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Session["language"].ToString());
Thread.CurrentThread.CurrentUICulture = new CultureInfo(Session["language"].ToString());
base.InitializeCulture();
}
}