c# - 从标记页面访问资源文本

标签 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 文件,但那不是我想要的,那就可以了。我错过了什么?

最佳答案

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/

相关文章:

asp.net - 在部署时编译 ASCX 文件而不是首次加载?

c# - MVC 5 不适用于 IIS 7

c# - 我可以通过 Lucene 在 Orchard 中搜索/索引自定义数据源吗?

c# - 有哪些技术可用于发送短信?

javascript - Messi jQuery 确认框重定向

ASP.net 网页表单设计

c# - 对 ViewState/IPostback 与持久文本框值感到困惑

c# - 将字符串值分配给枚举,然后按值查找枚举

c# - 通过 Entity Framework 抛出错误将数据插入数据库

asp.net - 关于查找哪些 aspx 文件使用哪些 CSS 类的方法的任何建议