Compartir a través de


Tutorial: Localización de un elemento web

Última modificación: martes, 07 de diciembre de 2010

Hace referencia a: SharePoint Foundation 2010

En este artículo
Creación de un proyecto vacío de SharePoint
Creación del elemento web
Adición de recursos de idioma
Localización de la característica y del archivo de descripción del control del elemento web
Escritura de código para recuperar las cadenas localizadas
Localización de las propiedades del elemento web
Localización de atributos
Prueba del elemento web

En este tutorial se muestra cómo localizar un elemento web para la implementación en Microsoft SharePoint Foundation 2010. Las técnicas que se usan en el tutorial son específicas de SharePoint Foundation 2010, por lo que no funcionan para un elemento web implementado en Microsoft ASP.NET.

En este tutorial, creará un elemento web simple que puede mostrar el texto "Hello, world" en varios idiomas. Además, se muestra cómo preparar para la localización todo el texto para mostrar asociado con el elemento web, incluido el texto para mostrar de:

  • La característica que aprovisiona el elemento web.

  • La entrada del elemento web en la galería de elementos web.

  • El título del cromo del elemento web.

  • Una acción personalizada del menú del elemento web.

  • Una propiedad personalizada del editor de elementos web.

  • Un control secundario hospedado por el elemento web.

Requisitos previos

Los procedimientos del tutorial están escritos para programadores que usan Microsoft Visual Studio 2010. Para obtener los requisitos previos, vea el tema sobre los requisitos para desarrollar soluciones de SharePoint.

Para completar el tutorial es necesario:

Para obtener una introducción a los conceptos clave de la localización de soluciones en SharePoint Foundation 2010, vea Descripción de la interfaz de usuario multilingüe (MUI).

Creación de un proyecto vacío de SharePoint

Para empezar, cree un proyecto vacío de SharePoint en Visual Studio 2010. Denomínelo Wingtip.WebParts. Configúrelo para que se implemente como una solución de conjunto o granja de servidores.

Nota

El elemento web que creará en este tutorial se puede implementar como una solución de espacio aislado. Todo el código del elemento web se puede ejecutar con confianza parcial. Sin embargo, además del elemento web, el tutorial también implementa archivos de recursos de idioma en una carpeta raíz de la instalación de SharePoint, y esta parte del proyecto requiere plena confianza. En un entorno de producción, puede resultar conveniente usar dos soluciones independientes: una solución de espacio aislado para implementar el elemento web y una solución de granja de servidores para implementar los archivos de recursos. Por motivos de simplicidad, el tutorial solo usa una solución de granja de servidores.

Para crear un proyecto de SharePoint vacío

  1. Inicie Visual Studio 2010 como administrador.

  2. Abra el cuadro de diálogo Nuevo proyecto; para ello, elija Nuevo en el menú Archivo y, a continuación, haga clic en Nuevo proyecto.

  3. Expanda el nodo SharePoint en Visual C# o Visual Basic y, a continuación, haga clic en 2010.

  4. En el panel Plantillas, haga clic en Proyecto de SharePoint vacío, cambie el nombre del proyecto por Wingtip.WebParts y, a continuación, haga clic en Aceptar.

    Aparecerá el Asistente para la personalización de SharePoint.

  5. En la página Especifique el sitio y el nivel de seguridad de la depuración, escriba la dirección URL del sitio de SharePoint al que desea agregar el nuevo elemento web, o bien use la ubicación predeterminada (http://< nombre del sistema>/).

  6. En la sección ¿Cuál es el nivel de confianza de esta solución de SharePoint?, seleccione Implementar como solución de granja de servidores.

  7. Haga clic en Finalizar.

    El proyecto aparecerá en el Explorador de soluciones.

Creación del elemento web

La siguiente tarea consiste en agregar un elemento web al proyecto. Para ello, cree una nueva clase que derive de la clase WebPart en el espacio de nombres System.Web.UI.WebControls.WebParts. El elemento web de ejemplo invalida el método CreateChildControls para agregar un control secundario, una instancia de la clase Label. Más adelante en este tutorial, aprenderá a localizar el texto que muestra este control. Para ofrecerle la oportunidad de localizar todos los distintos tipos de interfaz de usuario que puede tener un elemento web, el código de ejemplo crea una propiedad personalizada decorada con los atributos WebBrowsable y Personalizable. Estos atributos hacen que la propiedad aparezca en el panel de herramientas cuando un usuario edita el elemento web. Por último, el ejemplo agrega un elemento al menú Opciones del elemento web mediante la creación de un WebPartVerb personalizado.

Para agregar un elemento web al proyecto

  1. En el Explorador de soluciones, seleccione el nodo Wingtip.WebParts. En el menú Proyecto, haga clic en Agregar nuevo elemento.

  2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Elemento web. En el campo Nombre, escriba LocalizedWebPart. A continuación, haga clic en Agregar.

    La clase LocalizedWebPart se abrirá en el editor de código.

  3. En el editor de código, presione Ctrl+A para seleccionar todo. A continuación, copie y pegue el siguiente código:

    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. Presione Ctrl+Mayús+S para guardar todo.

Ahora que tiene un elemento web en funcionamiento, debe probarlo. Presione F5 para compilar e implementar la solución. Cuando se abra el sitio web, cree una nueva página de elementos web y agréguele el elemento web. Cuando la página se encuentre en modo de edición, compruebe el menú Opciones en la esquina superior derecha del cromo del elemento web. Haga clic en Subrayado varias veces para comprobar que funcione el verbo personalizado. A continuación, haga clic en Editar elemento web. Cuando aparezca el panel de herramientas, busque la propiedad personalizada en la parte inferior del panel. Seleccione Negrita y, a continuación, haga clic en Aplicar para comprobar que la propiedad se establezca correctamente.

Adición de recursos de idioma

El primer paso para localizar el elemento web consiste en agregar archivos de recursos de idioma al proyecto. En este tutorial, solo necesita dos archivos de recursos: un archivo para el idioma predeterminado del sitio web y otro para uno de los idiomas alternativos admitidos en el sitio web. Puede usar los idiomas que prefiera. En los ejemplos se usa inglés y español.

SugerenciaSugerencia

Para averiguar qué idiomas admite el sitio web de desarrollo, abra la página principal en el explorador. Haga clic en Acciones del sitio y, a continuación, en Configuración del sitio. En Administración de sitios, haga clic en Configuración de idioma. El idioma predeterminado aparece en la parte superior de la página. Los idiomas alternativos se enumeran debajo del idioma predeterminado.

Debe implementar los archivos de recursos creados en una ubicación en el sistema de archivos del servidor web a la que puedan tener acceso todos los componentes del elemento web que generan texto para mostrar, incluidos:

Dispone de varias alternativas para el aprovisionamiento de recursos de idioma en los servidores web de destino. El enfoque más sencillo, y el que ofrece el nivel más alto de flexibilidad para agregar compatibilidad con otros idiomas en el futuro, consiste en aprovisionar los archivos de recursos de idioma en la carpeta Resources situada justo debajo de la raíz de instalación de SharePoint Foundation. El token que usa Visual Studio para esta carpeta es {SharePointRoot}\Resources. La ruta de acceso completa es %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\Resources. En esta carpeta SharePoint Foundation instala los recursos de idioma que consumen los elementos web integrados.

Para agregar recursos a la carpeta {SharePointRoot}\Resources

  1. En el Explorador de soluciones, seleccione el nodo de proyecto Wingtip.Webparts. En el menú Proyecto, haga clic en Agregar carpeta asignada de SharePoint.

  2. En el cuadro de diálogo Agregar carpeta asignada de SharePoint, seleccione Resources y, a continuación, haga clic en Aceptar.

    Se agregará una carpeta Resources al proyecto. Compruebe las propiedades de esta carpeta. Observe que la propiedad DeploymentLocation está establecida en {SharePointRoot}\Resources.

  3. En el Explorador de soluciones, seleccione la carpeta Resources. En el menú Proyecto, haga clic en Agregar nuevo elemento.

  4. En el cuadro de diálogo Agregar nuevo elemento, expanda el nodo de Visual C# si el lenguaje de desarrollo es C#, o bien Elementos comunes si trabaja en Visual Basic. Seleccione General. En el panel de plantillas, seleccione Archivo de recursos. Denomine al archivo Wingtip.WebParts.resx y, a continuación, haga clic en Agregar.

    El archivo de recursos se agrega al proyecto y se abre en el Editor de recursos administrados.

    SugerenciaSugerencia

    Siempre que aprovisione archivos en la carpeta global Resources, se recomienda elegir nombres de archivo únicos para evitar conflictos de nomenclatura con los recursos que aprovisionan otras aplicaciones. Una convención consiste en agregar el nombre de la compañía como prefijo del nombre de archivo. Por ejemplo, si la compañía es Wingtip Toys, los nombres de todos los archivos de recursos que implemente pueden comenzar con "Wingtip".

  5. En el Explorador de soluciones, haga clic con el botón secundario en el archivo de recursos que acaba de crear y, a continuación, haga clic en Abrir con. En el cuadro de diálogo Abrir con, seleccione Editor XML (texto) y, a continuación, haga clic en Aceptar.

    El archivo de recursos se abrirá en el editor.

  6. Desplácese hacia abajo hasta el final del archivo. Inserte una línea en blanco inmediatamente sobre la etiqueta </root>. Copie el siguiente marcado y péguelo en el archivo en el punto de inserción.

      <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. Presione Ctrl+S para guardar el archivo. A continuación, en el menú Archivo, haga clic en Cerrar para cerrar el archivo.

  8. En el Explorador de soluciones, seleccione el archivo Wingtip.WebParts.resx. En el menú Editar, haga clic en Copiar. A continuación, haga clic en Pegar.

    Se agregará un archivo denominado Copy of Wingtip.WebParts.resx a la carpeta Resources.

  9. Haga clic con el botón secundario en el archivo llamado Copy of Wingtip.WebParts.resx y, a continuación, haga clic en Cambiar nombre. Cambie el nombre del archivo por Wingtip.WebParts.idioma-PAÍS O REGIÓN.resx donde idioma es un código de dos letras para el idioma predeterminado del sitio web y PAÍS O REGIÓN es un código de dos letras para la referencia cultural secundaria.

    Por ejemplo, si el idioma predeterminado es inglés (Estados Unidos), el nombre del archivo de recursos será Wingtip.WebParts**.en-US**.resx.

    Para obtener más información acerca de los identificadores de idioma, vea la clase System.Globalization.CultureInfo.

    Nota importanteImportante

    Como se demuestra más adelante en el tutorial, para hacer referencia a un archivo de recursos se debe usar su nombre de archivo base, como "Wingtip.WebParts". Cuando SharePoint Foundation recupera un valor de recurso, busca un archivo de recursos cuyo nombre de archivo base vaya seguido por un identificador de idioma que corresponda al valor de la propiedad CurrentUICulture del subproceso que se encuentra en ejecución actualmente. SharePoint Foundation espera encontrar una coincidencia exacta. Por ejemplo, si el identificador de idioma del subproceso actual es "pt-BR", SharePoint Foundation busca un archivo de recursos cuyo nombre sea "nombreDeArchivoBase.pt-BR.resx". Pasa por alto los archivos con el mismo código de idioma pero con una referencia cultural secundaria diferente, como "nombreDeArchivoBase.pt.resx" y "nombreDeArchivoBase.pt-PT.resx".

    Si SharePoint Foundation no encuentra un archivo de recursos que coincida con el identificador de idioma del subproceso en ejecución, busca un archivo de recursos de reserva. La primera opción para un archivo de recursos de reserva es uno que tenga la referencia cultural de todos los idiomas; es decir, un archivo de recursos que no tenga ningún identificador de idioma al final del nombre de archivo. Por ejemplo, en el proyecto actual, el archivo de recursos con referencia cultural de todos los idiomas es Wingtip.WebParts.resx. Si SharePoint Foundation no puede encontrar un archivo de recursos con referencia cultural de todos los idiomas, intenta buscar uno con el idioma predeterminado. Si no encuentra un archivo de recursos con el idioma predeterminado, muestra el nombre del recurso.

  10. Repita los pasos 8 y 9, pero esta vez anexe el identificador de idioma de un idioma alternativo habilitado en el sitio web.

  11. Abra los dos archivos de recursos de idioma específicos de la referencia cultural que acaba de crear y reemplace la palabra "invariant" por el identificador de idioma del archivo. Por ejemplo, en Wingtip.WebParts.en-US.resx, "Bold (invariant)" se convierte en "Bold (en-US)".

    En este tutorial, no es necesario traducir los valores de cadena. Basta con anexar un identificador de idioma a una cadena sin traducir. Al probar el elemento web, el identificador de idioma indica el idioma que se muestra.

  12. Presione Ctrl+Mayús+S para guardar todo.

Localización de la característica y del archivo de descripción del control del elemento web

La próxima tarea importante consiste en localizar las cadenas para mostrar que tienen lugar en dos archivos XML principales: el archivo de elementos de característica y el archivo de descripción del control del elemento web. Ambos archivos contienen cadenas de título y descripción que se pueden reemplazar por expresiones de ASP.NET que se ajusten al siguiente modelo:

$Resources:BaseFileName,ResourceName

El signo de dólar ($) indica que sigue una expresión. El prefijo "Resources" indica el tipo de expresión. El sufijo que sigue a los dos puntos (:) es el valor de expresión que se debe resolver. La primera parte del valor es el nombre de archivo base de un archivo de recursos. La parte que sigue a la coma es el nombre de la cadena localizada que se debe recuperar del archivo. No se permiten espacios en ningún lugar de la expresión.

Nota

Es posible que vea expresiones de recursos que terminan con un punto y coma (;). Este delimitador se acepta, pero no es obligatorio en SharePoint Foundation 2010.

Para localizar la característica

  1. En el Explorador de soluciones, expanda la carpeta Features y, a continuación, haga doble clic en Feature1.

    Feature1.Feature se abrirá en el diseñador de características.

  2. En el diseñador de características, elimine el texto del cuadro Título y reemplácelo por la siguiente expresión de recurso:

    $Resources:Wingtip.WebParts,FeatureTitle
    
  3. Pegue la siguiente expresión en el cuadro Descripción:

    $Resources:Wingtip.WebParts,FeatureDesc
    
  4. Presione Ctrl+Mayús+S para guardar todo.

Para localizar la descripción del control del elemento web

  1. En el Explorador de soluciones, expanda la carpeta LocalizedWebPart y, a continuación, haga doble clic en LocalizedWebPart.webpart.

    LocalizedWebPart.webpart se abrirá en el editor XML.

  2. Elimine el valor de la propiedad Title ("LocalizedWebPart") y reemplácelo por la siguiente expresión de recurso:

    $Resources:Wingtip.WebParts,WebPartTitle
    
  3. Elimine el valor de la propiedad Description ("My WebPart") y reemplácelo por la siguiente expresión de recurso:

    $Resources:Wingtip.WebParts,WebPartDesc
    
  4. Presione Ctrl+Mayús+S para guardar todo.

Escritura de código para recuperar las cadenas localizadas

Para localizar código en una aplicación de ASP.NET común, se insertan recursos de idioma en un ensamblado satélite que se implementa con el ensamblado principal en la memoria caché global de ensamblados. Cuando el código necesita recuperar un valor de recurso, se llama al método HttpContext.GetGlobalResourceObject.

Aunque desde luego se puede llamar a este método desde el código que se ejecuta en SharePoint Foundation, hay un método alternativo disponible para los programadores de SharePoint Foundation que no requiere la implementación de los recursos de idioma en ensamblados satélite. La clase SPUtility incluye un método estático, GetLocalizedString, que puede recuperar un valor de cadena de un archivo de recursos ubicado en la carpeta {SharePointRoot}\Resources del servidor web. En este tutorial se usará el método GetLocalizedString.

El método GetLocalizedString espera una expresión de recurso en el primer argumento y el nombre de archivo base de un archivo de recursos en el segundo argumento. Para simplificar las llamadas de método desde el código del elemento web, debe encapsular GetLocalizedString en un método con diseño propio.

Para crear un método que recupere cadenas de recursos

  1. En el Explorador de soluciones, seleccione el nodo de proyecto Wingtip.Webparts. En el menú Proyecto, haga clic en Agregar clase.

    Aparecerá el cuadro de diálogo Agregar nuevo elemento.

  2. En el campo Nombre, escriba Utility.cs o Utility.vb, en función de su idioma. A continuación, haga clic en Agregar.

  3. Presione Ctrl+A para seleccionar todo. A continuación, copie y pegue el siguiente código para reemplazar el contenido actual del archivo.

    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. Presione Ctrl+Mayús+S para guardar todo.

Localización de las propiedades del elemento web

La siguiente tarea consiste en localizar el código de las propiedades del elemento web que devuelven texto para mostrar. En cada caso, puede reemplazar una cadena codificada de forma rígida por una llamada al método de utilidad GetLocalizedString, pasando un nombre de recurso y el identificador de configuración regional (LCID) del idioma del subproceso actual. Puede obtener el LCID del idioma actual si obtiene acceso a la propiedad estática CultureInfo.CurrentUICulture.

Para localizar las propiedades del elemento web

  1. En el Explorador de soluciones, haga doble clic en LocalizedWebPart.cs o LocalizedWebPart.vb para abrir el archivo de origen.

  2. En la parte superior del archivo, justo debajo de la declaración de la clase LocalizedWebPart, aparecen las declaraciones de varias constantes de cadena. Elimine estas declaraciones y reemplácelas por el siguiente código:

    // 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. Navegue a la propiedad Description. Reemplace el código del descriptor de acceso get por el siguiente código:

    get { return Utility.GetLocalizedString(WEB_PART_DESC, CultureInfo.CurrentUICulture.LCID); }
    
    Get
        Return Utility.GetLocalizedString(WEB_PART_DESC, CultureInfo.CurrentUICulture.LCID)
    End Get
    
  4. Navegue a la propiedad Text. Reemplace el código del descriptor de acceso get por el siguiente código:

    get { return Utility.GetLocalizedString(LABEL_TEXT, CultureInfo.CurrentUICulture.LCID); }
    
    Get
        Return Utility.GetLocalizedString(LABEL_TEXT, CultureInfo.CurrentUICulture.LCID)
    End Get
    
  5. Navegue a la propiedad Title. Reemplace el código del descriptor de acceso get por el siguiente código:

    get { return Utility.GetLocalizedString(WEB_PART_TITLE, CultureInfo.CurrentUICulture.LCID); }
    
    Get
        Return Utility.GetLocalizedString(WEB_PART_TITLE, CultureInfo.CurrentUICulture.LCID)
    End Get
    
  6. Navegue a la propiedad Verbs. Reemplace las dos líneas de código que establecen las propiedades verb.Text y verb.Description por las siguientes líneas:

    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. Presione Ctrl+Mayús+S para guardar todo.

Localización de atributos

El código del elemento web define una propiedad Bold personalizada decorada con varios atributos, como se muestra en el siguiente fragmento de código:

[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

Los atributos WebBrowsable y Personalizable hacen que la propiedad aparezca en la interfaz de usuario de edición del usuario que edita el elemento web. Tres atributos adicionales proporcionan el texto para mostrar de la interfaz de usuario de edición:

  • Category

    Proporciona el nombre para mostrar de una categoría personalizada de la propiedad.

  • WebDisplayName

    Proporciona el nombre para mostrar de la propiedad.

  • WebDescription

    Proporciona el texto de la información sobre herramientas de la propiedad.

Para localizar el texto de estos atributos, debe escribir clases de atributo personalizadas que deriven de las clases CategoryAttribute, WebDisplayNameAttribute y WebDescriptionAttribute.

Para localizar los atributos Category, WebDisplayName y WebDescription

  1. En el Explorador de soluciones, haga doble clic en LocalizedWebPart.cs o LocalizedWebPart.vb para abrir el archivo de origen.

  2. Al final de la clase LocalizedWebPart, pero aún dentro de ella, inserte código para las siguientes subclases:

    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. Navegue a la propiedad Bold. A continuación, cambie los nombres de los atributos Category, WebDisplayName y WebDescription por LocalizedCategory, LocalizedWebDisplayName y LocalizedWebDescription.

    No cambie los parámetros de atributo. El código revisado es el siguiente:

    [LocalizedCategory(CATEGORY_TEXT)]
    [LocalizedWebDisplayName(TOOLPANE_BOLD)]
    [LocalizedWebDescription(TOOLPANE_BOLD_DESC)]
    
    <LocalizedCategory(CATEGORY_TEXT)> _
    <LocalizedWebDisplayName(TOOLPANE_BOLD)> _
    <LocalizedWebDescription(TOOLPANE_BOLD_DESC)> _
    
  4. Presione Ctrl+Mayús+S para guardar todo.

Prueba del elemento web

Pruebe el elemento web para asegurarse de que funcione correctamente.

Para probar el elemento web

  1. En Visual Studio, presione F5 para iniciar la depuración.

    En el panel Resultados se notifica el proceso de compilación e implementación. Finalmente, el sitio web aparecerá en el explorador predeterminado.

  2. Haga clic en Acciones del sitio y, a continuación, en Configuración del sitio. En Administración de colección de sitios, haga clic en Características de la colección de sitios. Compruebe que la característica del elemento web localizado muestre el título y la descripción en el idioma predeterminado.

  3. Haga clic en su nombre en la esquina superior derecha de la página. Elija Seleccionar idioma de presentación y, a continuación, haga clic en el idioma alternativo usado para localizar el elemento web. Compruebe que el título y la descripción de la característica del elemento web localizado se muestren en el idioma alternativo.

  4. (Opcional) Repita el paso 3, pero seleccione un idioma para el que no haya implementado un archivo de recursos de idioma. Compruebe que el título y la descripción de la característica del elemento web localizado se muestren con la referencia cultural de todos los idiomas.

  5. Repita el paso 3, pero revierta el idioma al valor predeterminado del sitio web.

  6. Haga clic en Acciones del sitio y, a continuación, en Configuración del sitio. En Galerías, haga clic en Elementos web. A continuación, haga clic en LocalizedWebPart.webpart. Compruebe que el título, la descripción y el ejemplo se muestren en el idioma predeterminado.

  7. Repita el paso 3 y, opcionalmente, el paso 4. Compruebe que el idioma cambie según lo esperado. A continuación, revierta la presentación al idioma predeterminado.

  8. Haga clic en Acciones del sitio y, a continuación, en Más opciones. Haga clic en Página, seleccione Página de elementos web y, a continuación, haga clic en Crear. Escriba un nombre para la página. A continuación, haga clic en Crear.

    Aparecerá la nueva página de elementos web.

  9. En Columna central, haga clic en Agregar elemento web. En Categorías, haga clic en Personalizar. Seleccione LocalizedWebPart y, a continuación, haga clic en Agregar.

    Nota

    En esta área de la interfaz de usuario, el título y el ejemplo del elemento web siempre aparecen en el idioma predeterminado del sitio web. El cambio a un idioma alternativo no afecta al texto que muestra el elemento web.

    El elemento web se agrega a la página.

  10. Haga clic en Detener la edición. Cambie al idioma alternativo para comprobar que el título del elemento web y el texto de etiqueta cambien según lo esperado. A continuación, revierta al idioma predeterminado.

  11. Mueva el cursor hasta el extremo derecho de la página. Cuando aparezca la flecha abajo, haga clic en ella. Compruebe que la acción Subrayado aparezca en el menú en el idioma predeterminado.

  12. Cambie al idioma alternativo. A continuación, repita el paso 11. Compruebe que la acción Subrayado se muestre en el idioma alternativo. Revierta la presentación al idioma predeterminado.

  13. Mueva el cursor hasta el extremo derecho de la página. Cuando aparezca la flecha abajo, haga clic en ella. A continuación, haga clic en Editar elemento web. En la parte inferior del panel de herramientas, busque la categoría Texto. Compruebe que el nombre aparezca en el idioma predeterminado. Expanda la categoría. Compruebe que la casilla de verificación Negrita y su información sobre herramientas aparezcan en el idioma predeterminado.

  14. Cambie al idioma alternativo. A continuación, repita el paso 13. Compruebe que el texto cambie al idioma alternativo.

Vea también

Tareas

Tutorial: Localización de columnas, tipos de contenido y listas

Referencia

CultureInfo

GetLocalizedString

WebBrowsableAttribute

PersonalizableAttribute

CategoryAttribute

WebDisplayNameAttribute

WebDescriptionAttribute

Conceptos

Descripción de la interfaz de usuario multilingüe (MUI)

Otros recursos

Poner a disposición varios idiomas para la interfaz de usuario del sitio

Procedimiento para agregar y quitar carpetas asignadas