Nueva funcionalidad MUI en SharePoint 2010 y modificación campos título o descripción

Hola a todos.

Últimamente los que hayáis desarrollado para entornos con language packs instalados o nativos en otros idiomas que no sean el inglés, os habreis percatado que cuando vuestro entorno de desarrollo ésta en inglés (VS y Windows Server), si procedéis a la modificación del campo título en una lista por medio del modelo de objetos éste no se produce.

¿Por qué ocurre esto? SharePoint 2010 ha sido rediseñado a nivel de manejo de lenguajes (Cultures) y provee una nueva funcionalidad llamada Multilingual User Interface (MUI). (https://msdn.microsoft.com/en-us/library/ff800886.aspx) . Básicamente significa que todas las propiedades visibles de objetos SharePoint (normalmente Títulos y Descripciones) se salvan en varios lenguajes si tienes language packs instalados. Entonces, si accedes a ellos mediante código (para leerlos o actualizarlos) se actualizará el valor correspondiente del CurrentUICulture del Thread que se este ejecutando. Normalmente, como los sistemas están en inglés , v. gr. stsadm, PowerShell y Visual Studio están ejecutando en "en-us culture", vuestros códigos sólo actualizarán los datos a la versión inglesa correspondiente al campo en cuestión. Por lo cual cualquier otro lenguage quedará intacto.

Propiedades que se ven afectadas por esta modificación son SPfield.Title, SPfield.Description, Splist.Title, SPlist.Description entre otros.

Como ejemplo, observad el remark del artículo de MSDN sobre SPLIST.Title que advierte de ello:

https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splist.title.aspx

Finalmente, os comparto un ejemplo práctico. Pensad en un entorno con todos los productos en inglés y vuestro SharePoint instalado con Language Pack en español. Teneís dos site collection en dos web application distintos uno en inglés y otro en español.

El siguiente trozo de código se ejecuta al activar unaFeature a nivel de site collection. Éste crea una lista basada en una plantilla de biblioteca de documentos y en teoría renombraría el campo título de la lista. 

        public override voidFeatureActivated(SPFeatureReceiverPropertiesproperties)

{         

            SPSitesite = (SPSite)properties.Feature.Parent;

            SPWebweb = site.OpenWeb();

            try

            {

                Guidguid = web.Lists.Add("Creacion Calvarro", "", SPListTemplateType.DocumentLibrary);

                SPListlist = web.Lists[guid];

                list.Title = "Renombrado Calvarro";

                list.OnQuickLaunch = true;

                list.Update();

            }

            catch { }

        }

Si desplegaramos la feature en el site collection en inglés la lista finalmente adoptaría el segundo nombre ya que la renombramos o sea el valor sería Renombrado Calvarro .Sin embargo en el caso del site collection en español adoptaría el primer nombre Creacion Calvarro ya que el culture sería diferente.

¿Cual sería la manera correcta de desarrollar ese código que sería valido en un entorno MOSS 2007 pero no en un entorno SPS 2010? Pues ya que MUI involucra a los cultures y a los threads, de primeras deberíamos añadir los respectivos namespaces

usingSystem.Globalization;

usingSystem.Threading;

Luego modificaríamos el código anterior para iterar en cada culture y cambiaríamos el título de cada lista en los lenguajes presentes en el entorno.

     public override voidFeatureActivated(SPFeatureReceiverPropertiesproperties)

        {

            SPSitesite = (SPSite)properties.Feature.Parent;

            SPWebweb = site.OpenWeb();

            try

            {

                Guidguid = web.Lists.Add("Creacion Calvarro", "", SPListTemplateType.DocumentLibrary);

                SPListlist = web.Lists[guid];

                foreach (CultureInfo culture inweb.SupportedUICultures)

                {

                    Thread.CurrentThread.CurrentUICulture = culture;

                    list.Title = "Renombrado Calvarro";

                }

                list.OnQuickLaunch = true;

                list.Update();

            }

            catch { }

        }  

Espero que os haya gustado este post ,un poco más extenso de lo normal, pero bastante interesante en mi opinión.

Muchísimas Gracias a todos.

Un saludo. 

Héctor Calvarro Martín. SharePointDev. Microsoft Support Engineer for DEV EMEA

"CVM TACENT, CLAMANT"