Share via


Windows SharePoint Services 3.0: Создание и развертывание решений (часть 6)

Последняя и самая сложная тема, которую мы рассмотрим применительно к Решениям, это локализация.

Начнем с того, что рассмотрим какие типы ресурсов встречаются в WSS 3.0. Условно все ресурсы можно разбить на два типа:

1). ресурсы, которые используются в сборках Вашего Шаблона, сборках веб-частей и т. д. В этом случае файлы с ресурсами должны быть откомпилированы и встроены в вашу сборку, если это ресурсы по умолчанию, либо разместиться в GAC в виде отдельной сборки с характерной культурой.

При создании этого типа ресурсов механизм очень прост. Воспользуйтесь Visual Studio и добавьте файл ресурсов в проект, например NMUPortal.resx. Visual Studio автоматически создаст прокси-класс, который упростит доступ к ресурсам и позволит получать доступ к записям, используя соответствующие имена переменных. Например, если создать запись с именем Portal_Title, то доступ к этой записи из кода можно будет получить следующим образом:

NMUPortal.Resources.NMUPortal.Portal_Title

Если Вы хотите добавить ресурсы для конкретной культуры, используйте в имени файла идентификатор культуры. Например для русского языка файл ресурсов будет иметь имя NMUPortal.ru-RU.resx.

Visual Studio ресурсы по умолчанию встраивает в сборку, а ресурсы, соответствующие культурам, компилирует в отдельные сборки и разбрасывает их по соответствующим папкам. Таким образом, Вы развертываете на сервере ни одну сборку с кодом, но и сборки с ресурсами. В зависимости от установленной культуры пользователя, данные будут выбираться из соответствующей сборки.

Если ресурсы используются внутри сборки, то их развертывание в GAC осуществляется с помощью уже знакомого элемента Assembly в manifest.xml.

2). ресурсы, которые используются во время обработки CAML-файлов (onet.xml, feature.xml и т. д.) и при компиляции страниц приложения и элементов управления. В этом случае ресурсы не компилируются, а поставляются в исходном виде (XML).

Тут все намного сложнее, так как нет единого места для таких ресурсов.

а). Если Вы используете ресурсы в страницах приложений или элементах управления, то все они должны располагаться в папке App_GlobalResources веб-приложения. Как ни странно, но если приложение уже создано, то после развертывания шаблона их нужно скопировать в App_GlobalResources самостоятельно. В теории это должен был бы делать элемент ApplicationResource в манифесте, но он создает папку resources и копирует все туда. Поэтому использование последнего для меня до сих пор большая загадка. В общем же случае, чтобы ресурсы попали в папку вновь созданного веб-приложения, их нужно разместить в C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\CONFIG\Resources. Это можно сделать с помощью элемента RootFile в манифесте.

<RootFiles>
  <RootFile Location="Config\Resources\NMUPortal.resx"/>
</RootFiles>

Использовать ресурсы довольно просто. Например:

<asp:Label runat=server text="<%$Resources:NMUPortal,Portal_Title %>"></asp:Label>

б). Если Вы хотите использовать ресурсы в onet.xml или features.xml, то их нужно скопировать в другие папки. Глобальной папкой является C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\Resources. Если ресурсы находятся тут, то они доступны и в onet.xml и в других CAML файлах.

Пример использования:

<NavBars>
  <NavBar Body="$Resources:NMUPortal,Portal_Title" ID="1212" Name="$Resources:NMUPortal,Portal_Title" Url="https://www.microsoft.com"></NavBar>
</NavBars>

Развернуть сюда ресурсы можно с помощью того же элемента RootFile

<RootFiles>
  <RootFile Location="Resources\NMUPortal.resx"/>
</RootFiles>

c). Если Вы планируете использовать ресурсы только с конкретной Feature, то было бы логично развернуть их в директории Feature. Это можно сделать с помощью элемента Resources в манифесте:

<Resources>
  <Resource Location="AddNewsSiteAction\Resources\NMUPortal.resx"/>
</Resources>

В теории их можно развернуть в любую директорию внутри директории соответствующей Feature.

<?xml version="1.0" encoding="utf-8" ?>
<Feature DefaultResourceFile="_res"
         xmlns="https://schemas.microsoft.com/sharepoint/"
         Id="91E266BE-CAFB-4197-B920-31E6627C2056"
         Title="Add News"
         Description="Add news to the main page"
         Scope="Site"
         Hidden="FALSE"
         ImageUrl="menuprofile.gif"
         >
  <ElementManifests>
    <ElementManifest Location="elements.xml"/>
  </ElementManifests>
</Feature>

DefaultResourceFile как раз и позволяет установить директорию. Если этот атрибут не установлен или _res, то используется директория Resources внутри внутри директории Feature. А вот пример использования:

<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <CustomAction Id="AddNewsAction"
                GroupId="SiteActions"
                Location="Microsoft.SharePoint.StandardMenu"
                Sequence="100"
                Title="$Resources:Portal_Title;"
                Description="Manage news"
                ImageUrl="_layouts/images/menuprofile.gif">
    <UrlAction Url="_layouts/NMUPortal/MyApplicationPage.aspx" />
  </CustomAction>
</Elements>

Вот и все, что касается ресурсов.

Последний компонент, который требуется локализовать, это webtemp*.xml. Он не может использовать ресурсы. Поэтому для его локализации требуется создавать несколько webTemp*.xml - для каждой культуры. При этом их нужно разворачивать в директорию с иденетификатором соответствующей культуры (вместо 1033 номер вашей культуры).

И теперь о главном - как все это развернуть. Механизм тут следующий:

Шаг 1. Разверните базовый шаблон, не включая ресурсы, соответствующие конкретной культуре.

Шаг 2. Для каждого типа культуры создайте отдельный пакет (его принято называть Language Pack). В manifest.xml этого пакета включите все ресурсы и webtemp*.xml.

Шаг 3. Разверните Language Pack с использованием stsadm:

%stsadm% -o addsolution -filename  %WSPackage% -lcid 1049
%stsadm% -o execadmsvcjobs
%stsadm% -o deploysolution -name NMUPortal.wsp -immediate -allowGacDeployment -force -lcid 1049
%stsadm% -o execadmsvcjobs

Тут мы добавили lcid для спецификации культуры.

Удаление решения происходит в обратном порядке (сначало удаляем все Language Packs, а затем основное решение)