Локализация SiteMap с ресурсами в другом проекте

Я разрабатываю веб-сайт с использованием ASP.Net 4.0, который использует ресурсы, расположенные в отдельном файле проекта.

В целом с локализацией все идет нормально. Однако файл Sitemap не локализуется должным образом.

Изначально я использовал неявную локализацию для присвоения имени ключу ресурса, однако это сломалось, когда ресурсы были перемещены в другой проект. У нас есть несколько проектов, использующих одни и те же ресурсы, поэтому отдельный ресурсный проект имеет смысл.

По этой причине я решил сделать ресурсы карты сайта явными.

Исходный siteMapNode:

<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 на отображении карты сайта.

У кого-нибудь есть дополнительные предложения?


person Steve    schedule 26.08.2015    source источник


Ответы (1)


В итоге я не изменил файл 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» из каждого ключа.

person Steve    schedule 27.08.2015