PortiBlog

Het SharePoint object model en meertaligheid

15 juli 2014

Om gecontroleerd aanpassingen in een draaiende SharePoint omgeving te doen, wordt veelal het SharePoint object model gebruikt. In combinatie met een site die dezelfde culture heeft als de SharePoint server (normaal gesproken: 1033; en-US) levert dit weinig verassingen op. Wanneer je echter wijzigingen gaat doen in een site met een andere hoofdtaal dan Engels, kan dit tot verwarrend gedrag leiden.

Om dit te illustreren ga ik in een Nederlandse site de naam van een Content Type wijzigen.

In mijn site heb ik een Content Type “publicatie” die ik vanuit een console-applicatie ga hernoemen naar “Artikel”. Om dit te bewerkstelligen voer ik de volgende code uit:


SPContentType contentType = web.ContentTypes["Publicatie"];
contentType.Name = "Artikel";
contentType.Update();

Wanneer ik echter in mijn site het Content Type ga bekijken, zie ik dat de naam nogsteeds “Publicatie” is. Als echter bij taalinstellingen de alternatieve taal “Engels” wordt geselecteerd, verschijnt de nieuwe naam wel.

De naam van het Content Type is alleen gewijzigd in de Engelse vertaling. De verschillende vertalingen van de naam kunnen in het object model benaderd en aangepast worden via een zogenaamd SPUserResource-object. Het ligt voor de hand om de volgende regels code toe te voegen om de wijziging ook voor Nederlands door te voeren:


contentType.NameResource.SetValueForUICulture(new CultureInfo(1043), "Artikel");
contentType.NameResource.Update();

Ook dit zal niet tot het gewenste resultaat leiden, omdat het SPUserResource-object uitsluitend wordt gebruikt wanneer de geselecteerde taal niet overeenkomt met de hoofdtaal van de site.

Omdat de console-applicatie onder de default culture van de het operating system draait (en-US), heeft het updaten van de naam van het Content Type via contentType.Name geresulteerd in het updaten van de Engelse vertaling en niet in het updaten van de definitie van het Content Type in de contentdatabase. Hierdoor blijft in het Nederlands de oude naam zichtbaar en kan het Content Type tevens in het object model uitsluitend op basis van de oude naam gevonden worden.

Om ervoor te zorgen dat de wijziging netjes in de definitie wordt doorgevoerd, moet de UICulture waaronder de update wordt uitgevoerd gelijk gemaakt worden aan de default culture van de site:


System.Threading.Thread.CurrentThread.CurrentUICulture = web.Locale;
SPContentType contentType = web.ContentTypes["Publicatie"];
contentType.Name = "Artikel";
contentType.Update();

Nu is de wijziging wel zichtbaar wanneer de site in het Nederlands bekeken wordt en kan het content type in het object model alleen nog op basis van de nieuwe naam gevonden worden.

Met de onderstaande code wordt ervoor gezorgd dat de nieuwe naam ook zichtbaar is als de site in het Engels bekeken wordt.


contentType.NameResource.SetValueForUICulture(new CultureInfo(1033), "Artikel");
contentType.NameResource.Update();

Powershell

Het bovenstaande gaat ook voor aanpassingen via PowerShell geheel op.


[System.Threading.Thread]::CurrentThread.CurrentUICulture = $web.Locale;

$contentType = $web.ContentTypes["Publicatie"];
$contentType.Name = "Artikel";
$contentType.Update();

$contentType.NameResource.SetValueForUICulture((New-Object -TypeName System.Globalization.CultureInfo -ArgumentList 1033), "Artikel");
$contentType.NameResource.Update();

 

Submit a comment

Dit vind je vast ook interessant.