我正在创建一个具有多种语言的 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 文件,但那不是我想要的,那就可以了。我错过了什么?
最佳答案
That works if I have a .resx-file called Resource but i thats not what I want. What did I miss?
您可能正在寻找本地资源和 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" />
您提到的全局资源是在整个网站上定义的(通常您在这里存储“编辑”、“保存”等资源),并且通常按照您显示的方式调用。
阅读此处了解更多详细信息: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>
或者,您可以使用绑定(bind)语法:
<asp:Label ID="Label1" runat="server" Text='<%# GetGlobalResourceObject(System.Threading.Thread.CurrentThread.CurrentUICulture.ToString(), "aboutUsLnk")%>'></asp:Label>
请注意,使用后者时,您需要绑定(bind)控件:
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>
关于c# - 从标记页面访问资源文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22226230/