Поделиться через


Пошаговое руководство. Локализация веб-части

Дата последнего изменения: 7 декабря 2010 г.

Применимо к: SharePoint Foundation 2010

В этой статье
Создание пустого проекта SharePoint
Создание веб-части
Добавление языковых ресурсов
Локализация файла компонентов и файла описания элемента управления веб-частью
Создание кода для извлечения локализованных строк
Локализация свойств веб-части
Локализация атрибутов
Тестирование веб-части

В этом пошаговом руководстве описывается локализация веб-части для развертывания в Microsoft SharePoint Foundation 2010. Методика, описанная в этом руководстве, предназначена только для SharePoint Foundation 2010. Данная методика неприменима к веб-части, развернутой в Microsoft ASP.NET.

В качестве примера описывается создание простой веб-части, которая отображает фразу "Hello, world" на нескольких языках. Кроме того, показано, как подготовить к локализации весь отображаемый текст, относящийся к веб-части, включая отображаемый текст для следующих элементов:

  • Компонент, который предоставляет веб-часть.

  • Запись веб-части в коллекции веб-частей.

  • Заголовок в хроме веб-части.

  • Настраиваемое действие в меню веб-части.

  • Настраиваемое свойство в редакторе веб-частей.

  • Дочерний элемент управления, расположенный на веб-части.

Необходимые компоненты

Процедуры, описанные в этом пошаговом руководстве, предназначены для разработчиков, которые используют Microsoft Visual Studio 2010. Дополнительные сведения о необходимых компонентах см. в статье о требованиях по разработке решений SharePoint.

Для использования этого пошагового руководства необходимо следующее:

Основные понятия о решениях локализации в SharePoint Foundation 2010 см. в статье Основные сведения о многоязыковом пользовательском интерфейсе.

Создание пустого проекта SharePoint

Сначала создадим пустой проект SharePoint в Visual Studio 2010. Имя создаваемого проекта — Wingtip.WebParts. Затем настроим проект для развертывания в качестве решения фермы.

ПримечаниеПримечание

Веб-часть, создаваемая в этом пошаговом руководстве, может быть развернута в качестве изолированного решения. Весь код веб-части может выполняться с частичным доверием. Однако помимо веб-части в этом пошаговом руководстве также развертываются файлы языковых ресурсов в корневой папке установки SharePoint, а для этой операции требуется полное доверие. В производственной среде можно использовать два отдельных решения: изолированное решение для развертывания веб-части и решение фермы для развертывания файлов ресурсов. С целью упрощения в этом пошаговом руководстве используется только одно решение фермы.

Создание пустого проекта SharePoint

  1. Запустите Visual Studio 2010 от имени администратора.

  2. Чтобы открыть диалоговое окно Создание проекта, в меню Файл выберите команду Создать, а затем выберите Новый проект.

  3. Разверните узел SharePoint в разделе Visual C# или Visual Basic, а затем выберите 2010.

  4. В области Шаблоны выберите Пустой проект SharePoint, в качестве имени проекта укажите Wingtip.WebParts, а затем нажмите кнопку ОК.

    Откроется мастер настройки SharePoint.

  5. На странице Укажите сайт и уровень безопасности для отладки укажите URL-адрес сайта SharePoint, на который необходимо добавить новую веб-часть, или оставьте расположение по умолчанию (http://< имя_системы>/).

  6. В разделе Какова степень доверия для этого решения SharePoint? установите переключатель Развернуть как решение фермы.

  7. Нажмите кнопку Готово.

    Проект появится в окне Обозреватель решений.

Создание веб-части

Следующее действие — добавление веб-части в проект. Для этого необходимо создать новый класс, который является производным от класса WebPart в пространстве имен System.Web.UI.WebControls.WebParts. Для добавления дочернего элемента управления, который является экземпляром класса Label, веб-часть переопределяет метод CreateChildControls. Локализация текста, отображаемого этим элементом управления, описана далее в этом пошаговом руководстве. Для предоставления возможности локализации всех типов пользовательского интерфейса, которые могут содержаться в веб-части, пример кода создает настраиваемое свойство, содержащее атрибуты WebBrowsable и Personalizable. С помощью этих атрибутов можно настроить отображение свойства в области инструментов при изменении веб-части пользователем. В завершение в меню параметров веб-части добавляется элемент путем создания пользовательского класса WebPartVerb.

Добавление веб-части в проект

  1. В окне Обозреватель решений выберите узел Wingtip.WebParts. В меню Проект выберите пункт Добавить элемент.

  2. В диалоговом окне Добавление нового элемента выберите Веб-часть. В поле Имя введите LocalizedWebPart. Затем нажмите кнопку Добавить.

    Класс LocalizedWebPart откроется в редакторе кода.

  3. В редакторе кода нажмите сочетание клавиш Ctrl+A, чтобы выбрать весь код. Затем скопируйте и вставьте следующий код:

    using System;
    using System.ComponentModel;
    using System.Globalization;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using Microsoft.SharePoint.WebControls;
    
    namespace Wingtip.WebParts.LocalizedWebPart
    {
        [ToolboxItemAttribute(false)]
        public class LocalizedWebPart : WebPart
        {
    
            // Constants for display strings.
            const string CATEGORY_TEXT = "Text";
            const string LABEL_TEXT = "Hello, world!";
            const string TOOLPANE_BOLD = "Bold";
            const string TOOLPANE_BOLD_DESC = "Make the text bold";
            const string VERB_UNDERLINE = "Underline";
            const string VERB_UNDERLINE_DESC = "Draw a line under the text";
            const string WEB_PART_TITLE = "Localized Web Part";
            const string WEB_PART_DESC = "An example localized Web Part";
    
            // Member variable for the child control.
            private Label m_textLabel;
    
            // Instantiates the Web Part.
            public LocalizedWebPart()
            {
    
                // Add a handler for the PreRender event.
                PreRender += LocalizedWebPart_PreRender;
            }
    
            // Creates the control tree.
            protected override void CreateChildControls()
            {
    
                // Add a Label control to display content.
                m_textLabel = new Label();
                m_textLabel.Text = Text;
                Controls.Add(m_textLabel);
            }
    
            // The PreRender event is raised after the Web Part is edited,
            // so this is a good time to update the child control.
            void LocalizedWebPart_PreRender(object sender, EventArgs e)
            {
    
                // Make sure that CreateChildControls has been called.
                EnsureChildControls();
    
                // Apply current Web Part settings to the child control.
                m_textLabel.Font.Bold = Bold;
            }
    
    
            // Indicates whether the text is bold.
            // This property is exposed in the Web Part Editor.
            [WebBrowsable]
            [Personalizable(PersonalizationScope.Shared)]
            [Category(CATEGORY_TEXT)]
            [WebDisplayName(TOOLPANE_BOLD)]
            [WebDescription(TOOLPANE_BOLD_DESC)]
            public bool Bold { get; set; }
    
            // Overrides the Description property.
            [WebBrowsable(false), Personalizable(false)]
            public override string Description
            {
                get { return WEB_PART_DESC; }
                set { ; }
            }
    
            // Gets the text to display.
            private string Text
            {
                get { return LABEL_TEXT; }
            }
    
            // Overrides the Title property.
            [WebBrowsable(false), Personalizable(false)]
            public override string Title
            {
                get { return WEB_PART_TITLE; }
                set { ; }
            }
    
            // Gets a collection of custom verbs that provide items
            // on the options menu for the Web Part.
            public override WebPartVerbCollection Verbs
            {
                get
                {
    
                    // Add a custom verb to toggle underlining for the text.
                    WebPartVerb verb = new WebPartVerb(this.ID + "_UnderlineVerb",
                     (sender, args) =>
                     {
                         EnsureChildControls();
                         m_textLabel.Font.Underline = !m_textLabel.Font.Underline;
                     });
    
                    verb.Checked = m_textLabel.Font.Underline;
                    verb.Text = VERB_UNDERLINE;
                    verb.Description = VERB_UNDERLINE_DESC;
    
                    WebPartVerb[] newVerbs = new WebPartVerb[] { verb };
                    return new WebPartVerbCollection(base.Verbs, newVerbs);
                }
            }
        }
    }
    
    Imports System
    Imports System.ComponentModel
    Imports System.Globalization
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    Imports Microsoft.SharePoint.WebControls
    
    <ToolboxItemAttribute(false)> _
    Public Class LocalizedWebPart
        Inherits WebPart
    
        ' Constants for display strings.
        Const CATEGORY_TEXT As String = "Text"
        Const LABEL_TEXT As String = "Hello, world!"
        Const TOOLPANE_BOLD As String = "Bold"
        Const TOOLPANE_BOLD_DESC As String = "Make the text bold"
        Const VERB_UNDERLINE As String = "Underline"
        Const VERB_UNDERLINE_DESC As String = "Draw a line under the text"
        Const WEB_PART_TITLE As String = "Localized Web Part"
        Const WEB_PART_DESC As String = "An example localized Web Part"
    
        ' Member variable for the child control.
        Private m_textLabel As Label
    
        ' Instantiates the Web Part.
        Public Sub New()
            ' Add a handler for the PreRender event.
            AddHandler PreRender, AddressOf LocalizedWebPart_PreRender
        End Sub
    
        ' Creates the control tree.
        Protected Overrides Sub CreateChildControls()
            ' Add a Label control to display content.
            m_textLabel = New Label()
            m_textLabel.Text = Text
            Controls.Add(m_textLabel)
        End Sub
    
        ' The PreRender event is raised after the Web Part is edited,
        ' so this is a good time to update the child control.
        Private Sub LocalizedWebPart_PreRender(ByVal sender As Object, ByVal e As EventArgs)
    
            ' Make sure that CreateChildControls has been called.
            EnsureChildControls()
    
            ' Apply current Web Part settings to the child control.
            m_textLabel.Font.Bold = Bold
        End Sub
    
        Private m_bold As Boolean
    
        ' Indicates whether the text is bold.
        ' This property is exposed in the Web Part Editor.
        <WebBrowsable()> _
        <Personalizable(PersonalizationScope.[Shared])> _
        <Category(CATEGORY_TEXT)> _
        <WebDisplayName(TOOLPANE_BOLD)> _
        <WebDescription(TOOLPANE_BOLD_DESC)> _
        Public Property Bold() As Boolean
            Get
                Return m_bold
            End Get
            Set(ByVal value As Boolean)
                m_bold = value
            End Set
        End Property
    
        ' Overrides the Description property.
        <WebBrowsable(False)> _
        <Personalizable(False)> _
        Public Overrides Property Description As String
            Get
                Return WEB_PART_DESC
            End Get
            Set(ByVal value As String)
            End Set
        End Property
    
        ' Gets the text to display.
        ReadOnly Property Text As String
            Get
                Return LABEL_TEXT
            End Get
        End Property
    
        ' Overrides the Title property.
        <WebBrowsable(False)> _
        <Personalizable(False)> _
        Public Overrides Property Title As String
            Get
                Return WEB_PART_TITLE
            End Get
            Set(ByVal value As String)
            End Set
        End Property
    
        ' Gets a collection of custom verbs that provide items
        ' on the options menu for the Web Part.
        Public Overrides ReadOnly Property Verbs() As WebPartVerbCollection
            Get
    
                ' Add a custom verb to toggle underlining for the text.
                Dim verb As New WebPartVerb(Me.ID + "_UnderlineVerb", AddressOf UnderlineVerbHandler)
    
                verb.Checked = m_textLabel.Font.Underline
                verb.Text = VERB_UNDERLINE
                verb.Description = VERB_UNDERLINE_DESC
    
                Dim newVerbs As WebPartVerb() = New WebPartVerb() {verb}
                Return New WebPartVerbCollection(MyBase.Verbs, newVerbs)
            End Get
        End Property
    
        ' Toggles underlining.
        Private Sub UnderlineVerbHandler(ByVal sender As Object, ByVal args As EventArgs)
            EnsureChildControls()
            m_textLabel.Font.Underline = Not m_textLabel.Font.Underline
        End Sub
    
    End Class
    
  4. Чтобы сохранить все файлы проекта, нажмите сочетание клавиш Ctrl+Shift+S.

Теперь необходимо проверить созданную веб-часть. Чтобы построить и развернуть решение, нажмите клавишу F5. После открытия веб-сайта создайте новую страницу веб-частей и добавьте на нее созданную веб-часть. В режиме редактирования страницы проверьте меню параметров, расположенное в верхнем правом углу хрома веб-части. Чтобы проверить работоспособность настраиваемой команды, щелкните Подчеркнутый несколько раз. Затем щелкните Изменить веб-часть. В открывшейся области инструментов найдите настраиваемое свойство, расположенное внизу области. Выберите Полужирный и затем нажмите кнопку Применить, чтобы проверить, правильно ли задано свойство.

Добавление языковых ресурсов

При локализации веб-части сначала необходимо добавить в проект файлы языковых ресурсов. Для выполнения инструкций этого пошагового руководства требуется два файла ресурсов: один файл для языка веб-сайта, используемого по умолчанию, а другой файл — для одного из альтернативных языков, поддерживаемых веб-сайтом. Можно использовать любые языки. В примере этого пошагового руководства используются английский и испанский языки.

СоветСовет

Чтобы определить, какие языки поддерживаются веб-сайтом разработки, откройте домашнюю страницу веб-сайта в браузере. В меню Действия сайта выберите пункт Параметры сайта. В разделе Администрирование сайта щелкните Параметры языка. Язык по умолчанию отображается в верхней части страницы. Альтернативные языки перечислены под языком по умолчанию.

Созданные файлы ресурсов необходимо развернуть в расположении файловой системы веб-сервера, которое доступно всем компонентам веб-части, создающим отображаемый текст, включая следующие:

Существует несколько альтернативных способов предоставления языковых ресурсов на целевых веб-серверах. Простейший способ, который также обеспечивает наибольшую гибкость для добавления поддержки других языков в будущем, заключается в предоставлении файлов языковых ресурсов в папке Resources, которая находится в корневой папке установки SharePoint Foundation. Visual Studio использует для этой папки маркер {SharePointRoot}\Resources. Полный путь к папке: %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\Resources. В эту папку SharePoint Foundation устанавливает языковые ресурсы, которые используются встроенными веб-частями.

Добавление языковых ресурсов в папку {SharePointRoot}\Resources

  1. В окне Обозреватель решений выберите узел проекта Wingtip.Webparts. В меню Проект выберите команду Добавить сопоставленную папку SharePoint.

  2. В диалоговом окне Добавление сопоставленной папки SharePoint выберите Resources и затем нажмите кнопку ОК.

    Папка Resources добавлена в проект. Проверьте свойства добавленной папки. Обратите внимание, что свойство DeploymentLocation имеет значение {SharePointRoot}\Resources.

  3. В окне Обозреватель решений выберите папку Resources. В меню Проект выберите пункт Добавить элемент.

  4. В диалоговом окне Добавление нового элемента разверните узел Visual C#, если используется язык C#, или Общие элементы при работе в Visual Basic. Выберите Общие. В области шаблонов выберите Файл ресурсов. Укажите имя файла Wingtip.WebParts.resx и затем нажмите кнопку Добавить.

    Файл ресурсов добавлен в проект и открыт в редакторе управляемых ресурсов.

    СоветСовет

    При хранении файлов в глобальной папке Resources рекомендуется выбирать уникальные имена файлов, чтобы предотвратить возникновение конфликтов имен с ресурсами, предоставляемым другими приложениями. Одна из рекомендаций заключается в указании названия организации в качестве префикса имени файла. Например, если организация называется Wingtip Toys, имена развертываемых файлов ресурсов могут начинаться с "Wingtip".

  5. В окне Обозреватель решений щелкните правой кнопкой мыши созданный файл ресурсов и затем выберите команду Открыть с помощью. В диалоговом окне Выбор программы выберите Редактор XML (текст) и затем нажмите кнопку ОК.

    Файл ресурсов откроется в редакторе.

  6. Прокрутите вниз файл. Вставьте пустую строку непосредственно над тегом </root>. Скопируйте следующую разметку и вставьте ее в файл в место вставки.

      <data name="Bold" xml:space="preserve">
        <value>Bold (invariant)</value>
      </data>
      <data name="BoldDesc" xml:space="preserve">
        <value>Make the text bold (invariant)</value>
      </data>
      <data name="FeatureDesc" xml:space="preserve">
        <value>An example localized Web Part (invariant)</value>
      </data>
      <data name="FeatureTitle" xml:space="preserve">
        <value>Localized Web Part (invariant)</value>
      </data>
      <data name="LabelText" xml:space="preserve">
        <value>Hello, world! (invariant)</value>
      </data>
      <data name="TextCategory" xml:space="preserve">
        <value>Text (invariant)</value>
      </data>
      <data name="Underline" xml:space="preserve">
        <value>Underline (invariant)</value>
      </data>
      <data name="UnderlineDesc" xml:space="preserve">
        <value>Draw a line under the text (invariant)</value>
      </data>
      <data name="WebPartDesc" xml:space="preserve">
        <value>An example localized Web Part (invariant)</value>
      </data>
      <data name="WebPartTitle" xml:space="preserve">
        <value>Localized Web Part (invariant)</value>
      </data>
    
  7. Чтобы сохранить файл, нажмите сочетание клавиш Ctrl+S. Затем в меню Файл выберите команду Закрыть, чтобы закрыть файл.

  8. В окне Обозреватель решений выберите файл Wingtip.WebParts.resx. В меню Правка выберите команду Копировать. Затем выберите команду Вставить.

    Файл "Копия Wingtip.WebParts.resx" добавлен в папку Resources.

  9. Щелкните правой кнопкой мыши файл "Копия Wingtip.WebParts.resx" и затем выберите команду Переименовать. Переименуйте файл в Wingtip.WebParts.код_языка-КОД_СТРАНЫ.resx, где код_языка — это двухбуквенный код языка по умолчанию, а КОД_СТРАНЫ — это двухбуквенный код страны.

    Например, если в качестве языка по умолчанию используется английский (США), имя файла ресурсов — Wingtip.WebParts**.en-US**.resx.

    Дополнительные сведения об идентификаторах языка см. в справке по классу System.Globalization.CultureInfo.

    Важное примечаниеВажно!

    Как будет показано далее в этом пошаговом руководстве, для указания ссылки на файл ресурсов используется его базовое имя, например "Wingtip.WebParts". При извлечении значения ресурса SharePoint Foundation выполняет поиск файла ресурса, имя которого состоит из базового имени файла и идентификатора языка, который соответствует значению свойства CurrentUICulture потока, выполняемого в настоящее время. SharePoint Foundation выполняет поиск точного совпадения. Например, если для текущего потока идентификатором языка является "pt-BR", SharePoint Foundation ищет файл ресурсов с именем "базовое_имя_файла.pt-BR.resx". SharePoint Foundation игнорирует файлы с одинаковым кодом языка, но с разными кодами стран, например "базовое_имя_файла.pt.resx" и "базовое_имя_файла.pt-PT.resx".

    Если SharePoint Foundation не удается найти файл ресурсов с соответствующим идентификатором языка в выполняемом потоке, он выполняет поиск резервного файла ресурсов. При выборе резервного файла ресурсов приоритет отдается файлу ресурсов для инвариантной культуры, т. е. файлу ресурсов, который не имеет идентификатора языка в конце имени файла. Например, в текущем проекте файл ресурсов для инвариантной культуры — Wingtip.WebParts.resx. Если SharePoint Foundation не удается найти файл ресурсов для инвариантной культуры, он пытается вернуться к языку по умолчанию. Если не удается найти файл ресурсов для языка по умолчанию, SharePoint Foundation отображает имя ресурса.

  10. Повторите шаги 8 и 9, добавив идентификатор альтернативного языка, который включен на веб-сайте.

  11. Откройте оба созданных файла языковых ресурсов со сведениями о стране и замените слово "invariant" идентификатором языка для файла. Например, в файле Wingtip.WebParts.en-US.resx замените "Bold (invariant)" на "Bold (en-US)".

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

  12. Чтобы сохранить все файлы проекта, нажмите сочетание клавиш Ctrl+Shift+S.

Локализация файла компонентов и файла описания элемента управления веб-частью

Следующий важный шаг — локализация отображаемых строк, которые находятся в двух основных XML-файлах, а именно в файле элементов компонентов и файле описания элемента управления веб-частью. Оба файла содержат строки заголовков и описаний, которые можно заменить выражениями ASP.NET, соответствующими следующему шаблону:

$Resources:BaseFileName,ResourceName

Знак доллара ($) указывает, что после него следует выражение. Префикс "Resources" задает тип выражения. Суффикс после двоеточия (:) — это значение выражения для разрешения. Первая часть значения — базовое имя файла ресурсов. Часть, следующая за запятой, — имя локализованной строки, извлекаемой из файла. Использование пробелов в выражении не допускается.

ПримечаниеПримечание

Выражения ресурсов могут оканчиваться точкой с запятой (;). Использование точки с запятой в качестве разделителя допустимо, но не требуется SharePoint Foundation 2010.

Локализация компонента

  1. В окне Обозреватель решений разверните папку Features и затем дважды щелкните Feature1.

    Feature1.feature откроется в конструкторе компонентов.

  2. Удалите текст в поле Название конструктора компонентов и укажите следующее выражение ресурса:

    $Resources:Wingtip.WebParts,FeatureTitle
    
  3. Вставьте следующее выражение в поле Описание:

    $Resources:Wingtip.WebParts,FeatureDesc
    
  4. Чтобы сохранить все файлы проекта, нажмите сочетание клавиш Ctrl+Shift+S.

Локализация описания элемента управления веб-частью

  1. В окне Обозреватель решений разверните папку LocalizedWebPart и затем дважды щелкните веб-часть LocalizedWebPart.webpart.

    Веб-часть LocalizedWebPart.webpart откроется в редакторе XML.

  2. Удалите значение свойства Title ("LocalizedWebPart") и укажите следующее выражение ресурса:

    $Resources:Wingtip.WebParts,WebPartTitle
    
  3. Удалите значение свойства Description ("My WebPart") и укажите следующее выражение ресурса:

    $Resources:Wingtip.WebParts,WebPartDesc
    
  4. Чтобы сохранить все файлы проекта, нажмите сочетание клавиш Ctrl+Shift+S.

Создание кода для извлечения локализованных строк

Для локализации кода в обычном приложении ASP.NET необходимо добавить языковые ресурсы во вспомогательную сборку, которая развертывается вместе с главной сборкой в глобальном кэше сборок. Если в коде требуется извлечь значение ресурса, вызывается метод HttpContext.GetGlobalResourceObject.

Несмотря на то, что этот метод можно вызвать из кода, который запускается в SharePoint Foundation, альтернативный метод, доступный разработчикам SharePoint Foundation, не требует развертывания языковых ресурсов во вспомогательных сборках. Класс SPUtility содержит статический метод GetLocalizedString, который может извлекать строковое значение из файла ресурсов, расположенного в папке {SharePointRoot}\Resources на веб-сервере. В этом пошаговом руководстве будет использоваться метод GetLocalizedString.

В качестве первого аргумента метод GetLocalizedString принимает выражение ресурса, а в качестве второго аргумента — базовое имя файла ресурсов. Чтобы упростить вызовы метода из кода веб-части, необходимо использовать программу-оболочку GetLocalizedString в собственном методе.

Создание метода, который извлекает строки ресурсов

  1. В окне Обозреватель решений выберите узел проекта Wingtip.Webparts. В меню Проект выберите команду Добавить класс.

    Откроется диалоговое окно Добавление нового элемента.

  2. В поле Имя введите Utility.cs или Utility.vb в зависимости от используемого языка. После этого нажмите кнопку Добавить.

  3. Чтобы выбрать весь код, нажмите сочетание клавиш Ctrl+A. Затем скопируйте и вставьте следующий код, заменив текущее содержимое файла.

    using Microsoft.SharePoint.Utilities;
    
    namespace Wingtip.WebParts.LocalizedWebPart
    {
        public static class Utility
        {
    
            // Wraps the SPUtility method of the same name.
            public static string GetLocalizedString(string resourceName, int LCID)
            {
                if (string.IsNullOrEmpty(resourceName))
                    return string.Empty;
    
                // SPUtility.GetLocalized string needs a resource expression as the first argument.
                string resourceExpression = string.Format("$Resources:{0}", resourceName);
    
                string resourceFile = "Wingtip.WebParts";
    
                // Note: If the named resource does not have a value for the specified language, 
                // SPUtility.GetLocalizedString returns the value for the invariant language.
                // If the named resource does not exist, it returns the original expression.
               return SPUtility.GetLocalizedString(resourceExpression, resourceFile, (uint)LCID);
            }
        }
    }
    
    Imports Microsoft.SharePoint.Utilities
    
    Public NotInheritable Class Utility
    
        ' Wraps the SPUtility method of the same name.
        Public Shared Function GetLocalizedString(ByVal resourceName As String, ByVal LCID As Integer) As String
    
            If String.IsNullOrEmpty(resourceName) Then
                Return String.Empty
            End If
    
            Dim resourceFile As String = "Wingtip.WebParts"
    
            ' SPUtility.GetLocalized string needs a resource expression as the first argument.
            Dim resourceExpression As String = String.Format("$Resources:{0}", resourceName)
    
            ' Note: If the named resource does not have a value for the specified language, 
            ' SPUtility.GetLocalizedString returns the value for the invariant language.
            ' If the named resource does not exist, it returns the original expression.
            Return SPUtility.GetLocalizedString(resourceExpression, resourceFile, CUInt(LCID))
    
        End Function
    
    End Class
    
  4. Чтобы сохранить все файлы проекта, нажмите сочетание клавиш Ctrl+Shift+S.

Локализация свойств веб-части

Следующая задача — локализация кода свойств веб-части, которые возвращают отображаемый текст. Жестко заданную строку можно заменить вызовом служебного метода GetLocalizedString, передав имя ресурса и код языка (LCID) для языка текущего потока. Для получения кода текущего языка воспользуйтесь статическим свойством CultureInfo.CurrentUICulture.

Локализация свойств веб-части

  1. В окне Обозреватель решений дважды щелкните LocalizedWebPart.cs или LocalizedWebPart.vb, чтобы открыть файл ресурсов.

  2. В верхней части файла непосредственно под объявлением класса LocalizedWebPart расположены объявления для нескольких строковых констант. Удалите эти объявления и вставьте следующий код:

    // Translate resource keys to string constants.
    const string CATEGORY_TEXT = "TextCategory";
    const string LABEL_TEXT = "LabelText";
    const string TOOLPANE_BOLD = "Bold";
    const string TOOLPANE_BOLD_DESC = "BoldDesc";
    const string VERB_UNDERLINE = "Underline";
    const string VERB_UNDERLINE_DESC = "UnderlineDesc";
    const string WEB_PART_TITLE = "WebPartTitle";
    const string WEB_PART_DESC = "WebPartDesc";
    
    ' Translate resource keys to string constants.
    Const CATEGORY_TEXT As String = "TextCategory"
    Const LABEL_TEXT As String = "LabelText"
    Const TOOLPANE_BOLD As String = "Bold"
    Const TOOLPANE_BOLD_DESC As String = "BoldDesc"
    Const VERB_UNDERLINE As String = "Underline"
    Const VERB_UNDERLINE_DESC As String = "UnderlineDesc"
    Const WEB_PART_TITLE As String = "WebPartTitle"
    Const WEB_PART_DESC As String = "WebPartDesc"
    
  3. Перейдите к свойству Description. Замените код метода доступа get следующим кодом:

    get { return Utility.GetLocalizedString(WEB_PART_DESC, CultureInfo.CurrentUICulture.LCID); }
    
    Get
        Return Utility.GetLocalizedString(WEB_PART_DESC, CultureInfo.CurrentUICulture.LCID)
    End Get
    
  4. Перейдите к свойству Text. Замените код метода доступа get следующим кодом:

    get { return Utility.GetLocalizedString(LABEL_TEXT, CultureInfo.CurrentUICulture.LCID); }
    
    Get
        Return Utility.GetLocalizedString(LABEL_TEXT, CultureInfo.CurrentUICulture.LCID)
    End Get
    
  5. Перейдите к свойству Title. Замените код метода доступа get следующим кодом:

    get { return Utility.GetLocalizedString(WEB_PART_TITLE, CultureInfo.CurrentUICulture.LCID); }
    
    Get
        Return Utility.GetLocalizedString(WEB_PART_TITLE, CultureInfo.CurrentUICulture.LCID)
    End Get
    
  6. Перейдите к свойству Verbs. Замените две строки кода, которые задают свойства verb.Text и verb.Description, следующими строками:

    verb.Text = Utility.GetLocalizedString(VERB_UNDERLINE, CultureInfo.CurrentUICulture.LCID);
    verb.Description = Utility.GetLocalizedString(VERB_UNDERLINE_DESC, CultureInfo.CurrentUICulture.LCID);
    
    verb.Text = Utility.GetLocalizedString(VERB_UNDERLINE, CultureInfo.CurrentUICulture.LCID)
    verb.Description = Utility.GetLocalizedString(VERB_UNDERLINE_DESC, CultureInfo.CurrentUICulture.LCID)
    
  7. Чтобы сохранить все файлы проекта, нажмите сочетание клавиш Ctrl+Shift+S.

Локализация атрибутов

Код веб-части задает настраиваемое свойство Bold, которое содержит несколько атрибутов, как показано в следующем фрагменте кода:

[WebBrowsable]
[Personalizable(PersonalizationScope.Shared)]
[Category(CATEGORY_TEXT)]
[WebDisplayName(TOOLPANE_BOLD)]
[WebDescription(TOOLPANE_BOLD_DESC)]
public bool Bold { get; set; }
<WebBrowsable()> _
<Personalizable(PersonalizationScope.[Shared])> _
<Category(CATEGORY_TEXT)> _
<WebDisplayName(TOOLPANE_BOLD)> _
<WebDescription(TOOLPANE_BOLD_DESC)> _
Public Property Bold() As Boolean
    Get
        Return m_bold
    End Get
    Set(ByVal value As Boolean)
        m_bold = value
    End Set
End Property

С помощью атрибутов WebBrowsable и Personalizable задается отображение свойства в пользовательском интерфейсе при редактировании веб-части пользователем. Три дополнительных атрибута обеспечивают отображение текста для пользовательского интерфейса редактирования:

  • Category

    Предоставляет отображаемое имя настраиваемой категории для свойства.

  • WebDisplayName

    Предоставляет отображаемое имя свойства.

  • WebDescription

    Предоставляет текст всплывающей подсказки для свойства.

Для локализации текста этих атрибутов необходимо создать классы особых атрибутов, производные от класса CategoryAttribute, класса WebDisplayNameAttribute и класса WebDescriptionAttribute.

Локализация атрибутов Category, WebDisplayName и WebDescription

  1. В окне Обозреватель решений дважды щелкните LocalizedWebPart.cs или LocalizedWebPart.vb, чтобы открыть исходный файл.

  2. В нижней части класса LocalizedWebPart, но внутри него, вставьте код для следующих подклассов:

    public sealed class LocalizedCategoryAttribute : CategoryAttribute
    {
        public LocalizedCategoryAttribute(string category)
            : base(category)
        { }
    
        // Override this method to return values from the webpart's resource file.
        protected override string GetLocalizedString(string value)
        {
            return Utility.GetLocalizedString(value, CultureInfo.CurrentUICulture.LCID);
        }
    }
    
    public sealed class LocalizedWebDisplayNameAttribute : WebDisplayNameAttribute
    {
        bool m_isLocalized;
    
        public LocalizedWebDisplayNameAttribute(string displayName)
            : base(displayName)
        { }
    
        // Override this property to return values from the webpart's resource file.
        public override string DisplayName
        {
            get
            {
                if (!m_isLocalized)
                {
                    this.DisplayNameValue = Utility.GetLocalizedString(base.DisplayName, CultureInfo.CurrentUICulture.LCID);
                    m_isLocalized = true;
                }
                return base.DisplayName;
            }
        }
    }
    
    public sealed class LocalizedWebDescriptionAttribute : WebDescriptionAttribute
    {
        bool m_isLocalized;
    
        public LocalizedWebDescriptionAttribute(string description)
            : base(description)
        { }
    
        // Override this property to return values from the webpart's resource file.
        public override string Description
        {
            get
            {
                if (!m_isLocalized)
                {
                    this.DescriptionValue = Utility.GetLocalizedString(base.Description, CultureInfo.CurrentUICulture.LCID);
                    m_isLocalized = true;
                }
                return base.Description;
            }
        }
    }
    
    Public NotInheritable Class LocalizedCategoryAttribute
        Inherits CategoryAttribute
        Public Sub New(ByVal category As String)
            MyBase.New(category)
        End Sub
    
        ' Override this method to return values from the webpart's resource file.
        Protected Overrides Function GetLocalizedString(ByVal value As String) As String
            Return Utility.GetLocalizedString(value, CultureInfo.CurrentUICulture.LCID)
        End Function
    End Class
    
    Public NotInheritable Class LocalizedWebDisplayNameAttribute
        Inherits WebDisplayNameAttribute
        Private m_isLocalized As Boolean
    
        Public Sub New(ByVal displayName As String)
            MyBase.New(displayName)
        End Sub
    
        ' Override this property to return values from the webpart's resource file.
        Public Overrides ReadOnly Property DisplayName() As String
            Get
                If Not m_isLocalized Then
                    Me.DisplayNameValue = Utility.GetLocalizedString(MyBase.DisplayName, CultureInfo.CurrentUICulture.LCID)
                    m_isLocalized = True
                End If
                Return MyBase.DisplayName
            End Get
        End Property
    End Class
    
    Public NotInheritable Class LocalizedWebDescriptionAttribute
        Inherits WebDescriptionAttribute
        Private m_isLocalized As Boolean
    
        Public Sub New(ByVal description As String)
            MyBase.New(description)
        End Sub
    
        ' Override this property to return values from the webpart's resource file.
        Public Overrides ReadOnly Property Description() As String
            Get
                If Not m_isLocalized Then
                    Me.DescriptionValue = Utility.GetLocalizedString(MyBase.Description, CultureInfo.CurrentUICulture.LCID)
                    m_isLocalized = True
                End If
                Return MyBase.Description
            End Get
        End Property
    End Class
    
  3. Перейдите к свойству Bold. Измените имена атрибутов Category, WebDisplayName и WebDescription на LocalizedCategory, LocalizedWebDisplayName и LocalizedWebDescription.

    Не изменяйте параметры атрибутов. Измененный код выглядит следующим образом:

    [LocalizedCategory(CATEGORY_TEXT)]
    [LocalizedWebDisplayName(TOOLPANE_BOLD)]
    [LocalizedWebDescription(TOOLPANE_BOLD_DESC)]
    
    <LocalizedCategory(CATEGORY_TEXT)> _
    <LocalizedWebDisplayName(TOOLPANE_BOLD)> _
    <LocalizedWebDescription(TOOLPANE_BOLD_DESC)> _
    
  4. Чтобы сохранить все файлы проекта, нажмите сочетание клавиш Ctrl+Shift+S.

Тестирование веб-части

С помощью тестирования веб-части можно проверить ее работоспособность.

Тестирование веб-части

  1. В Visual Studio нажмите клавишу F5, чтобы начать отладку.

    Процесс построения и развертывания отображается в области Выходные данные. Веб-сайт открывается в веб-браузере по умолчанию.

  2. В меню Действия сайта выберите пункт Параметры сайта. В разделе Администрирование семейства веб-сайтов выберите Возможности семейства веб-сайтов. Убедитесь, что компонент "Локализованная веб-часть" отображает название и описание на языке по умолчанию.

  3. Щелкните свое имя в верхнем правом углу страницы. Выберите команду Выбрать язык интерфейса и затем выберите альтернативный язык, используемый для локализации веб-части. Убедитесь, что название и описание компонента "Локализованная веб-часть" отображаются на альтернативном языке.

  4. (Необязательно) Повторите шаг 3, выбрав язык, для которого не развернут файл языковых ресурсов. Убедитесь, что заголовок и описание компонента "Локализованная веб-часть" отображаются на инвариантном языке.

  5. Повторите шаг 3, выбрав язык веб-сайта по умолчанию.

  6. В меню Действия сайта выберите пункт Параметры сайта. В разделе Коллекции выберите Веб-части. Затем выберите LocalizedWebPart.webpart. Убедитесь, что заголовок, описание и пример отображаются на языке по умолчанию.

  7. Повторите шаг 3 и при необходимости шаг 4. Убедитесь, что язык изменяется так, как запланировано. Затем снова выберите язык по умолчанию.

  8. В меню Действия сайта выберите Дополнительные параметры. Последовательно выберите Страница, Страница веб-частей и затем Создать. Введите имя страницы. Затем щелкните Создать.

    Откроется новая страница веб-частей.

  9. В области Столбец по середине выберите Добавить веб-часть. В списке Категории щелкните Пользовательская. Выберите LocalizedWebPart и затем нажмите кнопку Добавить.

    ПримечаниеПримечание

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

    Веб-часть добавлена на страницу.

  10. Щелкните Остановить изменение. Переключитесь на альтернативный язык и убедитесь, что заголовок веб-части и текст подписи изменяются правильным образом. Затем вернитесь к языку по умолчанию.

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

  12. Переключитесь на альтернативный язык. Затем повторите шаг 11. Убедитесь, что действие Подчеркнутый отображается на альтернативном языке. Выберите язык по умолчанию.

  13. Переместите курсор в правую часть страницы. При появлении стрелки вниз щелкните ее. Затем выберите Изменить веб-часть. В нижней части области инструментов найдите категорию Текст. Убедитесь, что имя отображается на языке по умолчанию. Разверните категорию. Убедитесь, что флажок Полужирный и его всплывающая подсказка отображаются на языке по умолчанию.

  14. Переключитесь на альтернативный язык. Затем повторите шаг 13. Убедитесь, что текст отображается на альтернативном языке.

См. также

Задачи

Пошаговое руководство. Локализация столбцов, типов контента и списков

Ссылка

CultureInfo

GetLocalizedString

WebBrowsableAttribute

PersonalizableAttribute

CategoryAttribute

WebDisplayNameAttribute

WebDescriptionAttribute

Концепции

Основные сведения о многоязыковом пользовательском интерфейсе

Другие ресурсы

Включение поддержки нескольких языков для пользовательского интерфейса сайта (Возможно, на английском языке)

Практическое руководство. Добавление и удаление сопоставленных папок