这两种在aspx/ascx文件中本地化字符串的方式有什么区别?

12

第一次进行网站本地化时,我只是像这样进行本地化:

<%= Resources.ResourceFile.ResourceName %>

它似乎完美地运行。然而,ReSharper 5.0 Beta 是这样实现的:

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

哪种方式完成有关系吗?

另外,为什么ReSharper会在本地化控件内保留原始文本?我以为这是为了在Resource文件中的值为空时显示“默认”文本。但事实并非如此。是否可以安全地将其删除并只自我关闭本地化控件?


这个语法 <%= Resources.ResourceFile.ResourceName %> 不仅可以访问全局资源,还能访问 App_LocalResources 吗?我好像无法访问。 - User
4个回答

2

我在MSDN上找到了以下信息,可能会帮助您理解所需的区别

使用强类型检索全局资源

使用Resources.ResourceFile.ResourceName可以使用强类型检索全局资源

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

String welcome; welcome = Resources.WebResources.WelcomeText;

详细信息请参阅:http://msdn.microsoft.com/en-us/library/ms227982.aspx

显式本地化

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

标题 %>

资源表达式采用以下形式,其中 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


考虑到您正在直接引用MSDN文档,您应该将该文本放入块引用中。 - Roman
嘿,我已经在那里发布了 MSDN 的链接,并在阅读 MSDN 文档后将文本粘贴。 - Pranay Rana

2

很遗憾,你不能在 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 />服务器控件,也没有出现问题...

这个语法 <%= Resources.ResourceFile.ResourceName %> 不仅可以访问全局资源,还能访问 App_LocalResources 吗?我好像无法访问。 - User

1

第一种方法是为每个页面(模块)创建单独的资源文件,而第二种方法则是创建一个(或几个)并将所有资源键放在其中。

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


我不确定我理解了。在第一个例子中,它不会为每个页面创建新的资源文件。它有一个资源(在示例中称为ResourceFile),其中包含ResourceName。两个示例都调用相同的资源文件以获取相同的资源。 - Brandon
@Brandon - 第一种方法通常用于本地资源,第二种方法通常用于全局资源。但在幕后,它们都使用相同的方法。例如 GetGlobalResourceGetLocalReource,它们以不同的方式给出一些参数并将它们传递给一个名为 Getresource 的主要重载或方法。 - Nasser Hadjloo
啊,我明白了。那我之前用错了。我每次都引用了一个单一的全局资源文件。 - Brandon

1

据我所知,这是有区别的,而且关键在于时间。

我还没有确认过,但我真的希望<%$会在页面生命周期的早期出现很多。

  • <%=基本上就是<% Response.Write("Some Text") %>,这就是为什么你不能在aspx的许多地方使用它,即它需要在页面呈现时完成
  • <%#出现在DataBind /控件初始化之前。请注意,DataBind代码可能使用其他更早设置的属性,因此这是一个重要的区别。
  • 考虑到以上情况以及您可以在控件属性中使用<%$,我真的希望它会在页面/控件生命周期的早期出现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接