使用不同项目中的资源进行站点地图本地化

SiteMap Localization with resoures in different project

我正在使用 ASP.Net 4.0 开发网站,该网站使用位于单独项目文件中的资源。

总的来说,本地化进展顺利。但是,站点地图未正确本地化。

最初,我使用隐式本地化命名资源键,但是当资源被移动到不同的项目时,这就中断了。我们有多个项目共享相同的资源,因此单独的资源项目很有意义。

出于这个原因,我决定明确显示站点地图资源。

原站点地图节点:

<siteMapNode url="Account" title="Account" description="showNavigation('Account');">

使用在资源移出项目之前有效的资源密钥:

<siteMapNode url="Account" title="Account" description="showNavigation('Account');" resourceKey="Account">

最后站点地图节点使用显式资源: <siteMapNode url="Account" title="$Namespace:Sitemap, Account" description="showNavigation('Account');">

不幸的是,使用最后一个站点地图节点,我在站点地图显示上确实得到了 $Namespace:Sitemap, Account

有人有进一步的建议吗?

我最终没有修改 Sitemap 文件并使用了以下 SiteMapNode

<siteMapNode url="Account" title="Account" description="showNavigation('Account');" resourceKey="Account">

这是我用来本地化站点地图的那个。

正如我上面所说,仅此一项是行不通的。查看 ascx 文件(站点地图位于自定义控件上),我注意到我们在每个节点的 OnItemDataBound 事件上都有一个事件处理程序。

在 ascx 文件中,菜单项文本如下:

<%# Eval("Title") %>

我将其替换为:

<asp:Literal ID="litTitle" runat="server"/>

在事件处理程序中,我添加了以下代码来本地化标题:

var node = ((SiteMapNode)e.Item.DataItem);
var litTitle = ((Literal)e.Item.FindControl("litTitle"));
if (node != null)
{
    litTitle.Text = Sitemap.ResourceManager.GetString(node.ResourceKey, CultureInfo.CurrentCulture);
}

GetString()调用中参数应该是:node.ResourceKey + ".Title"。不过,我也借此机会简化了资源文件,去掉了每个键的所有“.Title”后缀。