这两种在aspx / ascx文件中本地化字符串的方法之间的区别?

时间:2010-05-21 14:57:59

标签: c# localization resharper-5.0

当我第一次开始本地化网站时,我只是做了这样的本地化:

<%= Resources.ResourceFile.ResourceName %>

它似乎工作得非常好。但是,ReSharper 5.0 Beta就是这样的:

<asp:Localize Text="<%$ Resources: ResourceFile, ResourceName %>" runat="server">
  Value
</asp:Localize>

它的完成方式是否重要?

另外,为什么ReSharper将原始文本保留在localize控件中?我认为它是存在的,以防资源文件中的值为空,它可以显示“默认”文本。情况似乎并非如此。删除它并自行关闭本地化控件是否安全?

4 个答案:

答案 0 :(得分:2)

我在msdn上找到的以下信息可能会帮助您了解您想要的差异

使用强类型检索全局资源

Resources.ResourceFile.ResourceName使用to retrieve global resources using strong typing

资源被编译到命名空间Resources中,每个默认资源都成为Resources类的成员。例如,如果您已创建默认资源文件WebResources.resx并且该文件包含名为WelcomeText的资源,则可以在代码中引用该资源,如以下代码所示

字符串欢迎; welcome = Resources.WebResources.WelcomeText;

了解更多详情:http://msdn.microsoft.com/en-us/library/ms227982.aspx

明确的本地化

<asp:Button ID="Button1" runat="server" 
    Text="<%$ Resources:WebResources, Button1

标题%&gt;

资源表达式采用以下形式,其中Class是可选的,除非资源是全局资源,并且需要ResourceID:

Class值标识使用全局资源时要使用的资源文件。编译.resx文件时,基本文件名(不带扩展名)将显式用作生成的程序集的类名。如果要使用本地资源文件(与当前页面名称匹配的文件)中的资源,则不必包含类名。这是因为ASP.NET将页面类与资源类匹配。

ResourceID值是要读取的资源的标识符。在前面的示例中,按钮的Text属性是从全局资源文件WebResources.resx(或相应的本地化版本)中读取的。在该文件中,ASP.NET使用具有标识符Button1Caption的资源的值以及页面本身。要设置页面属性,可以在@ Page指令

中使用资源表达式

更多相关信息:http://msdn.microsoft.com/en-us/library/ms227427(v=VS.100).aspx

答案 1 :(得分:2)

好吧,你不能使用&lt;%=%&gt; asp服务器控件上的服务器标签。

所以

<asp:Localize Text="<%= Resources.ResourceFile.ResourceName %>" runat="server">
  Value
</asp:Localize>

将导致编译错误。 遗憾的是,您无法将动态数据传递到服务器控件属性,除非它是可以应用<%# %>服务器标记的数据绑定,例如:

<asp:Repeater runat="server">
...
  <asp:Localize Text="<%# Resources.ResourceFile.ResourceName %>" runat="server">
   Value
  </asp:Localize>
...
</asp:Repeater>

您可以随时将其移至代码隐藏,但这很糟糕。

<%$ %>'东西'但是如果你去它准备进入维护地狱(除非我们当然是在谈论一个3页的申请......)

我个人使用<%= %>,我从不使用re-sharper来全球化/本地化我的应用程序。 此外,我从未使用<asp:Localize />服务器控件,我没有遇到任何问题...

答案 2 :(得分:1)

第一个创建一个单独的Rsource文件foreach页面(模块),但第二个创建一个(或afew)并输出所有的资源键。

第二种方法可以让您轻松地为您的应用程序创建新语言,因为所有字符串都聚集在一个地方,您可以将其提供给任何人进行翻译。

答案 3 :(得分:1)

afaik存在差异,这是时间问题。

我还没有确认,但我真的希望&lt;%$在页面生命周期的早期发生。

  • &lt;%=它几乎是&lt;%Response.Write(“Some Text”)%&gt;,这就是为什么你不能在aspx的很多地方使用它,即它需要完成当页面正在呈现时
  • &lt;%#在DataBind /期间发生,远离页面/控件的初始化。请注意,DataBind代码可能正在使用之前设置的其他属性,因此这是一个重要的区别。
  • 鉴于上述情况并且您可以在控件属性中使用&lt;%$,我真的希望它在页面/控件生命周期的早期发生。