Friday, 13 November 2015

Update user language and regional settings with CSOM

Following my previous post around multilingual aspects of SharePoint Online: Modify Site Regional and Language settings with JSOM and JavaScript

Here is some CSOM code which updates the personal regional settings of the current user or another user (if you are a tenant admin and have the rights to update user profiles)

Before update:




The code:


using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.UserProfiles;
using System.Security;
namespace UpdateLanguagePreference
{
class Program
{
static void Main(string[] args)
{
//Tenant Admin Details
string tenantAdministrationUrl = "https://yoursite-admin.sharepoint.com/";
string tenantAdminLoginName = "tenantadmin@yoursite.onmicrosoft.com";
string tenantAdminPassword = "password";
//AccountName of the user whos property you want to update.
//If you want to update properties of multiple users, you can fetch the accountnames through search.
string UserAccountName = "i:0#.f|membership|user@yoursite.onmicrosoft.com";
using (ClientContext clientContext = new ClientContext(tenantAdministrationUrl))
{
var passWord = new SecureString();
foreach (char c in tenantAdminPassword.ToCharArray()) passWord.AppendChar(c);
clientContext.Credentials = new SharePointOnlineCredentials(tenantAdminLoginName, passWord);
// Display languages
var muiLanguages = "en-GB,nl-NL,fr-BE,de-DE";
var customRegionalSettings = "False"; //Override the site regional settings with custom settings for user.
var locale = "2057"; //English (United Kingdom)
//Full list of timezone id's available here: https://msdn.microsoft.com/library/microsoft.sharepoint.spregionalsettings.timezones.aspx
var timeZoneID = "2";// "(UTC) Dublin, Edinburgh, Lisbon, London";
// Get the people manager instance for tenant context
PeopleManager peopleManager = new PeopleManager(clientContext);
peopleManager.SetSingleValueProfileProperty(UserAccountName, "SPS-MUILanguages", muiLanguages);
//This is important.
peopleManager.SetSingleValueProfileProperty(UserAccountName, "SPS-RegionalSettings-FollowWeb", customRegionalSettings);
peopleManager.SetSingleValueProfileProperty(UserAccountName, "SPS-Locale", locale);
peopleManager.SetSingleValueProfileProperty(UserAccountName, "SPS-TimeZone", timeZoneID);
clientContext.ExecuteQuery();
}
}
}
}

After update:



Thanks!


1 comment:

dattaraj said...

Hi Vardhman,

I am trying to update the logged in users Language settings using SP Server Side code as below:

string mui = lcid == 1036 ? "fr-FR" : "en-US";

SPWeb web = SPContext.Current.Web;
SPUser user = web.CurrentUser;

SPSecurity.RunWithElevatedPrivileges(delegate {
userSettingsProvider = SPUserSettingsProviderManager.Local.UserSettingsProviders.FirstOrDefault();

userSettingsProvider.UpdateUserLanguageSettings(userSettingsProvider.GetProviderContext(web.CurrentUser), web.CurrentUser, mui, "ui-ui");
userSettingsProvider.UpdateUserDisplayLanguageSettings(userSettingsProvider.GetProviderContext(user), user, mui);
userSettingsProvider.UpdateUserContentLanguageSettings(userSettingsProvider.GetProviderContext(user), user, mui);
});

when i see in the _/layouts/regionalsetng.aspx?type=user, i see that Language field takes a while to get the value updated(After Multiple refresh its updated). But i need it to be refreshed immediately. Any suggestion?

Thanks,
Dattaraj