从标记页面访问资源文本

时间:2014-03-06 13:38:44

标签: c# asp.net webforms localization

我正在创建一个包含多种语言的Web应用程序。 我已经设置了这样的文化

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);

我有几个语言文件,如“en.resx”和“de.resx”。 我可以从他们背后的代码中读取它们,就像这样

var test = GetGlobalResourceObject(Thread.CurrentThread.CurrentUICulture.ToString(), "aboutUsLnk");

但是从标记页面怎么样。 我一直在网上搜索,大多数网页建议这样的东西

<asp:Literal Text='<%$ Resources:Resource, aboutUsLnk %>' runat="server" />

如果我有一个名为Resource的.resx文件,那就有效,但我不是我想要的。我错过了什么?

1 个答案:

答案 0 :(得分:3)

  

如果我有一个名为Resource的.resx文件但是那不是我想要的,那就有效。我错过了什么?

您可能正在寻找本地资源和 meta:resourcekey 属性。

每页定义本地(您为它们定义与您的页面完全相同的名称),您可以使用它们来存储特定于一个页面的资源。您可以通过添加ASP.NET特定文件夹(App_LocalResources)创建它们,然后在其中为每个页面添加本地资源:

App_LocalResources/{pagename}.resx

然后从页面标记(AboutUs.aspx)中调用资源文件(AboutUs.resx,AboutUs.fr-BE.resx,...)中的资源对象将是这样的:

<asp:Literal Text='About Us' meta:resourcekey="aboutUsLnk" runat="server" />

您提到的全球资源是在整个网站上定义的(通常您在此处存储资源,如&#34;编辑&#34;,&#34;保存&#34;等),并且通常在您展示时调用。

请阅读此处了解更多详情:http://msdn.microsoft.com/en-us/magazine/cc163566.aspx

修改

对不起,对于误解,你可能会问如何调用你的全球资源,这些资源可以区分每种文化。您可以使用GetGlobalResourceObject在标记代码中执行此操作,几乎与在后面的代码中执行的操作相同。

您可以编写服务器控件之外的任何地方:

<%= GetGlobalResourceObject(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString(), "aboutUsLnk")%>

要在服务器控件属性中调用GetGlobalResourceObject,您不能使用<%= %>,但可以将服务器控件包装在其周围(在允许此操作的控件中,例如Label) :

<asp:Label ID="Label1" runat="server"><%= GetGlobalResourceObject(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString(), "aboutUsLnk")%></asp:Label>

或者,您可以使用绑定语法:

<asp:Label ID="Label1" runat="server" Text='<%# GetGlobalResourceObject(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString(), "aboutUsLnk")%>'></asp:Label>

请注意,使用后者时,您需要绑定控件:

protected void Page_Load(object sender, EventArgs e)
{
   Label1.DataBind();
}

编辑2

您可以将上层代码包装在一些帮助器方法中,以提高代码可读性。在后面的代码中声明它:

protected string GetResource(string resourceName)
{
   return GetGlobalResourceObject(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString(), resourceName).ToString();
}

在标记中你可以像以前一样称它为:

<asp:Label ID="Label1" runat="server" Text='<%# GetResource("aboutUsLnk")%>'></asp:Label>
<asp:Label ID="Label2" runat="server"><%= GetResource("aboutUsLnk")%></asp:Label>