asp.net嵌入式资源标记的正确语法

时间:2010-08-26 15:49:43

标签: asp.net resources localization

我正在尝试本地化asp.net Web应用程序。考虑以下asp.net代码。我正在使用CurrentCulture和CurrentUICulture设置为德语(“DE-DE”)。

<%= ReportTitles.EndOfDay %>
<asp:Literal ID="litLabel" runat="server" Text="<%$ Resources:ReportTitles, EndOfDay %>"/>

我希望这两行产生相同的结果,但我得到了这个:

AuswertungenfürdenTagesabschluss
一天结束

换句话说,第一个语法<%= ReportTitles.EndOfDay %>成功从我们正在使用的ReportTitles.de.resx文件中检索值,但第二个语法<asp:Literal ID="litLabel" runat="server" Text="<%$ Resources:ReportTitles, EndOfDay %>"/> 从默认的美国英语ReportTitles.resx文件中获取值。

第二行出了什么问题?感谢

1 个答案:

答案 0 :(得分:3)

在Load期间设置文化是在生命周期的中间。这是在创建文字控件之后。

基本上,当Page.ProcessRequest调用FrameworkInitialize时会创建控制树,后者调用__BuildControlTree,这是一种从代码文件自动生成的方法。它将实例化一个新的Literal控件,设置所有属性,并将其添加到控制树。它基本上已经从活动的ResourceManager中读取。这是在加载之前,它甚至在PreInit之前。这意味着你还没有改变文化。

&lt;%= ...%&gt;将在渲染过程中解析为对HtmlTextWriter.Write的调用。这是生命周期的结束,它将使用新的文化。

实现此目的的通常方法是使用HttpModule / HttpHandler或覆盖Page.InitializeCulture。

查看http://ghferr.free.fr/wiki/Articles/images/aspnet_page-control-life-cycle.jpg,概述值得打印并放在附近的墙上。 ;)