Add localization to Service Manager 2016 Self-Service Portal (with Estonian localization sample)

Iron Contributor

Introduction

As setting up Service Manager 2016 Self-Service Portal we wanted to add Estonian localization to the new HTML Self-Service Portal as we had done with the old one. Without too much hassle we figured out how language files are added and where the files are so the next steps were to translate the new localization file and make a minor adjustment to "Company" title to make it change with localization.

  

Steps to add a new localization

Step 1: Create the missing localization file to the following folder on you SSP IIS server

In our case we created the following file: SelfServicePortalResources.et.resx

C:\inetpub\wwwroot\SelfServicePortal\App_GlobalResources\

 

Step 2: Add the missing localization by adding a line to _Layout.cshtml file in the following folder

C:\inetpub\wwwroot\SelfServicePortal\Views\Shared\

You can choose your own position but I set Estonian as first on the list and either delete the ones that you don't need or comment them out with <!-- comment --> tags.

<ul class="lang_menu hidden" data-select-lang=@currentCulture>
                        <li value="et-EE">Eesti</li>
			<li value="en-US">English</li>
<!-- <li value="fr-FR">français</li>
<li value="de-DE">Deutsch</li>
<li value ""> ..etc.. </li> -->
</ul>

That's pretty much it if you don't want to change the "Company" title when changing the localization.

 

Step 3(optional): When you also want to make localization changes to change the "Company" title you need to make a tiny change to _Layout.cshtml file in the following folder

C:\inetpub\wwwroot\SelfServicePortal\Views\Shared\

You need to change the following line from 

<div class="col span_15 logo">@System.Web.Configuration.WebConfigurationManager.AppSettings["CompanyName"]</div>

to

<div class="col span_15 logo">@Resources.SelfServicePortalResources.PageTitle</div>

This change will make your "Company" title information come from the active localization file instead of console defined "Company" name. 

  <data name="PageTitle" xml:space="preserve">
               <value>Localized "Company" title</value>
  </data>

 

Restrictions

I know that Service Manager 2012 that was built on SharePoint 2010 supported only a specific set of languages but I would think that the new portal supports more.

 

Resources (in attachments)

Attached a .zip archive with translation files for Service Manager 2016 and  if anyone is still looking for this a Service Manager 2012 localization. If you don't want to download a ready file you can alternatively copy-paste the SM16 code from Spoilers! below.

  • SelfServicePortalResources.et.resx - SCSM 2016 SSP localization
  • SilverlightModule_StringResources.ET.resx - SCSM 2012 SSP localization
Spoiler
<?xml version="1.0" encoding="utf-8"?>
<root>
  <!-- 
    Microsoft ResX Schema 
    
    Version 2.0
    
    The primary goals of this format is to allow a simple XML format 
    that is mostly human readable. The generation and parsing of the 
    various data types are done through the TypeConverter classes 
    associated with the data types.
    
    Example:
    
    ... ado.net/XML headers & schema ...
    <resheader name="resmimetype">text/microsoft-resx</resheader>
    <resheader name="version">2.0</resheader>
    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
        <value>[base64 mime encoded serialized .NET Framework object]</value>
    </data>
    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
        <comment>This is a comment</comment>
    </data>
                
    There are any number of "resheader" rows that contain simple 
    name/value pairs.
    
    Each data row contains a name, and value. The row also contains a 
    type or mimetype. Type corresponds to a .NET class that support 
    text/value conversion through the TypeConverter architecture. 
    Classes that don't support this are serialized and stored with the 
    mimetype set.
    
    The mimetype is used for serialized objects, and tells the 
    ResXResourceReader how to depersist the object. This is currently not 
    extensible. For a given mimetype the value must be set accordingly:
    
    Note - application/x-microsoft.net.object.binary.base64 is the format 
    that the ResXResourceWriter will generate, however the reader can 
    read any of the formats listed below.
    
    mimetype: application/x-microsoft.net.object.binary.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
            : and then encoded with base64 encoding.
    
    mimetype: application/x-microsoft.net.object.soap.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
            : and then encoded with base64 encoding.

    mimetype: application/x-microsoft.net.object.bytearray.base64
    value   : The object must be serialized into a byte array 
            : using a System.ComponentModel.TypeConverter
            : and then encoded with base64 encoding.
    -->
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="SoftwareCatalog1" xml:space="preserve">
    <value>Tarkvara kataloog</value>
  </data>
  <data name="ActionLog" xml:space="preserve">
    <value>Logi</value>
  </data>
  <data name="ActivateRequest" xml:space="preserve">
    <value>Aktiivsed pöördumised</value>
  </data>
  <data name="Active" xml:space="preserve">
    <value>Aktiivne</value>
  </data>
  <data name="Activities" xml:space="preserve">
    <value>Tegevused</value>
  </data>
  <data name="ActivityImplementor" xml:space="preserve">
    <value>Tegevuse teostaja</value>
  </data>
  <data name="AddComments" xml:space="preserve">
    <value>Lisa kommentaar..</value>
  </data>
  <data name="All" xml:space="preserve">
    <value>Kõik</value>
  </data>
  <data name="Announcements" xml:space="preserve">
    <value>Aktiivsed teated</value>
  </data>
  <data name="ApprovalStatus" xml:space="preserve">
    <value>Kinnitamise staatus</value>
  </data>
  <data name="Approve" xml:space="preserve">
    <value>Kinnita</value>
  </data>
  <data name="AssociatedWI" xml:space="preserve">
    <value>Seotud pöördumine</value>
  </data>
  <data name="AttachFile" xml:space="preserve">
    <value>Lisa fail</value>
  </data>
  <data name="AttachFiles" xml:space="preserve">
    <value>Lisa failid</value>
  </data>
  <data name="AvailableRequests" xml:space="preserve">
    <value>Pöördumis vormid</value>
  </data>
  <data name="Cancel" xml:space="preserve">
    <value>Tühista</value>
  </data>
  <data name="CancelRequest" xml:space="preserve">
    <value>Tühista pöördumine</value>
  </data>
  <data name="Closed" xml:space="preserve">
    <value>Suletud</value>
  </data>
  <data name="ContactUs" xml:space="preserve">
    <value>Võta meiega ühendust</value>
  </data>
  <data name="CostInformation" xml:space="preserve">
    <value>Maksumus</value>
  </data>
  <data name="CreatedDate" xml:space="preserve">
    <value>Koostamise kuupäev</value>
  </data>
  <data name="Description" xml:space="preserve">
    <value>Kirjeldus</value>
  </data>
  <data name="Details" xml:space="preserve">
    <value>Detailid</value>
  </data>
  <data name="ExpiryDate" xml:space="preserve">
    <value>Aegumise kuupäev</value>
  </data>
  <data name="ExternalContent" xml:space="preserve">
    <value>Väline sisu</value>
  </data>
  <data name="FavHelpArticles" xml:space="preserve">
    <value>Lemmik juhendid</value>
  </data>
  <data name="Favorites" xml:space="preserve">
    <value>Lemmikud</value>
  </data>
  <data name="FavouriteThis" xml:space="preserve">
    <value>Lisa lemmikuks</value>
  </data>
  <data name="FindByKeywords" xml:space="preserve">
    <value>Otsi märksõna</value>
  </data>
  <data name="GenericRequest" xml:space="preserve">
    <value>Ei leia lahendust kataloogist?</value>
  </data>
  <data name="HelpArticles" xml:space="preserve">
    <value>Juhendid</value>
  </data>
  <data name="Home" xml:space="preserve">
    <value>Esileht</value>
  </data>
  <data name="ID" xml:space="preserve">
    <value>ID</value>
  </data>
  <data name="InProgress" xml:space="preserve">
    <value>Edenenemisel</value>
  </data>
  <data name="Instructions" xml:space="preserve">
    <value>Juhised</value>
  </data>
  <data name="InternalContent" xml:space="preserve">
    <value>Kohalik sisu</value>
  </data>
  <data name="LastModified" xml:space="preserve">
    <value>Viimati muudetud</value>
  </data>
  <data name="LastUpdated" xml:space="preserve">
    <value>Viimati uuendatud</value>
  </data>
  <data name="Loading" xml:space="preserve">
    <value>Ole kannatlik...</value>
  </data>
  <data name="ManualActivity" xml:space="preserve">
    <value>Manuaalsed tegevused</value>
  </data>
  <data name="MarkCompleted" xml:space="preserve">
    <value>Märgi lõpetatuks</value>
  </data>
  <data name="MarkFailed" xml:space="preserve">
    <value>Märgi tühistatuks</value>
  </data>
  <data name="MostPopular" xml:space="preserve">
    <value>Populaarsed</value>
  </data>
  <data name="MyActvities" xml:space="preserve">
    <value>Minu tegevused</value>
  </data>
  <data name="MyRequests" xml:space="preserve">
    <value>Minu pöördumised</value>
  </data>
  <data name="NavQuestion" xml:space="preserve">
    <value>Ei leia lahendust ?</value>
  </data>
  <data name="PageTitle" xml:space="preserve">
    <value>Iseteenindusportaal</value>
  </data>
  <data name="Priority" xml:space="preserve">
    <value>Prioriteet</value>
  </data>
  <data name="Property" xml:space="preserve">
    <value>Atribuut</value>
  </data>
  <data name="QueryPickerMeta" xml:space="preserve">
    <value>See väli sõltub </value>
  </data>
  <data name="RateThis" xml:space="preserve">
    <value>Anna hinnang</value>
  </data>
  <data name="Refresh" xml:space="preserve">
    <value>Värskenda</value>
  </data>
  <data name="Reject" xml:space="preserve">
    <value>Hülga</value>
  </data>
  <data name="RelatedHelpArticles" xml:space="preserve">
    <value>Seonduvad juhendid</value>
  </data>
  <data name="RequestOfferings" xml:space="preserve">
    <value>Teenuse pakkumised</value>
  </data>
  <data name="Resolved" xml:space="preserve">
    <value>Lahendatud</value>
  </data>
  <data name="Review" xml:space="preserve">
    <value>Ülevaatus</value>
  </data>
  <data name="ReviewActivity" xml:space="preserve">
    <value>Vaata üle</value>
  </data>
  <data name="ReviewAs" xml:space="preserve">
    <value>Ülevaataja</value>
  </data>
  <data name="Reviewers" xml:space="preserve">
    <value>Ülevaatajad</value>
  </data>
  <data name="Search" xml:space="preserve">
    <value>Otsi</value>
  </data>
  <data name="SearchPlaceHolder" xml:space="preserve">
    <value>Otsi märksõna</value>
  </data>
  <data name="SearchResults" xml:space="preserve">
    <value>Otsingutulemused</value>
  </data>
  <data name="SeeAll" xml:space="preserve">
    <value>Vaata kõiki</value>
  </data>
  <data name="Share" xml:space="preserve">
    <value>Jaga</value>
  </data>
  <data name="SLAInformation" xml:space="preserve">
    <value>SLA informatsioon</value>
  </data>
  <data name="SubmitForm" xml:space="preserve">
    <value>Sisesta</value>
  </data>
  <data name="Title" xml:space="preserve">
    <value>Pealkiri</value>
  </data>
  <data name="Update" xml:space="preserve">
    <value>Uuenda</value>
  </data>
  <data name="UserInput" xml:space="preserve">
    <value>Kommentaari lisamine</value>
  </data>
  <data name="Value" xml:space="preserve">
    <value>Väärtus</value>
  </data>
  <data name="VotedBy" xml:space="preserve">
    <value>Hääletas</value>
  </data>
  <data name="ActivityArea" xml:space="preserve">
    <value>Tegevused</value>
  </data>
  <data name="ScheduledEndDate" xml:space="preserve">
    <value>Planeeritud lõppkuupäev</value>
  </data>
  <data name="ScheduledStartDate" xml:space="preserve">
    <value>Planeeritud alguskuupäev</value>
  </data>
  <data name="SortBy" xml:space="preserve">
    <value>Sorteeri</value>
  </data>
  <data name="Stage" xml:space="preserve">
    <value>Etapp</value>
  </data>
  <data name="ItemDetails" xml:space="preserve">
    <value>Üksuse detailid</value>
  </data>
  <data name="ChooseFile" xml:space="preserve">
    <value>Vali fail</value>
  </data>
  <data name="CreateRequest" xml:space="preserve">
    <value>Koosta pöördumine</value>
  </data>
  <data name="Owner" xml:space="preserve">
    <value>Omanik</value>
  </data>
  <data name="NoSearchRecords" xml:space="preserve">
    <value>Üksusi ei leitud, muuda otsingu parameetreid</value>
  </data>
  <data name="Enteries" xml:space="preserve">
    <value>Sisestused</value>
  </data>
  <data name="Filtered" xml:space="preserve">
    <value>Filtreeritud</value>
  </data>
  <data name="First" xml:space="preserve">
    <value>Esimene</value>
  </data>
  <data name="Last" xml:space="preserve">
    <value>Viimane</value>
  </data>
  <data name="Next" xml:space="preserve">
    <value>Järgmine</value>
  </data>
  <data name="Previous" xml:space="preserve">
    <value>Eelmine</value>
  </data>
  <data name="Show" xml:space="preserve">
    <value>Kuva</value>
  </data>
  <data name="Showing" xml:space="preserve">
    <value>Kuvan</value>
  </data>
  <data name="ActivityUpdateFail" xml:space="preserve">
    <value>Tegevuse uuendamine ebaõnnestus</value>
  </data>
  <data name="ActivityUpdateSuccess" xml:space="preserve">
    <value>Tegevuse uuendamine õnnestus</value>
  </data>
  <data name="CantFindSolution" xml:space="preserve">
    <value>Ei leidnud probleemile lahendust?</value>
  </data>
  <data name="KARatingUpdateFailed" xml:space="preserve">
    <value>Hinnangu uuendamine ebaõnnestus</value>
  </data>
  <data name="KARatingUpdateSuccess" xml:space="preserve">
    <value>Hinnangu lisamine õnnestus</value>
  </data>
  <data name="Launguage" xml:space="preserve">
    <value>Keelevalik</value>
  </data>
  <data name="NewRequestCreated" xml:space="preserve">
    <value>Uus pöördumine esitatud</value>
  </data>
  <data name="PoweredBy" xml:space="preserve">
    <value>Powered By</value>
  </data>
  <data name="RequestUpdateFail" xml:space="preserve">
    <value>Pöördumise uuendamine ebaõnnestus </value>
  </data>
  <data name="RequestUpdateSuccess" xml:space="preserve">
    <value>Pöörumise uuendamine õnnestus</value>
  </data>
  <data name="ServiceCatalog" xml:space="preserve">
    <value>Pöördumiste kataloog</value>
  </data>
  <data name="Comment" xml:space="preserve">
    <value>Kommentaar</value>
  </data>
  <data name="Name" xml:space="preserve">
    <value>Nimi</value>
  </data>
  <data name="Status" xml:space="preserve">
    <value>Staatus</value>
  </data>
  <data name="FavoritesDescription" xml:space="preserve">
    <value>Kuvab lemmikuks märgitud  pöördumiste nimekirja</value>
  </data>
  <data name="Article" xml:space="preserve">
    <value>Juhendid</value>
  </data>
  <data name="ActivityStatusEnum_Active" xml:space="preserve">
    <value>Edeneb</value>
  </data>
  <data name="ActivityStatusEnum_Cancelled" xml:space="preserve">
    <value>Tühistatud</value>
  </data>
  <data name="ActivityStatusEnum_Completed" xml:space="preserve">
    <value>Lõpetatud</value>
  </data>
  <data name="ActivityStatusEnum_Failed" xml:space="preserve">
    <value>Ebaõnnestunud</value>
  </data>
  <data name="ActivityStatusEnum_OnHold" xml:space="preserve">
    <value>Ootel</value>
  </data>
  <data name="ActivityStatusEnum_Ready" xml:space="preserve">
    <value>Pooleli</value>
  </data>
  <data name="ActivityStatusEnum_Rerun" xml:space="preserve">
    <value>Taaskäivita</value>
  </data>
  <data name="ActivityStatusEnum_Skipped" xml:space="preserve">
    <value>Vahele jäetud</value>
  </data>
  <data name="Ago" xml:space="preserve">
    <value>tagasi</value>
  </data>
  <data name="SeeLess" xml:space="preserve">
    <value>Kuva vähem</value>
  </data>
  <data name="SeeMore" xml:space="preserve">
    <value>Kuva rohkem</value>
  </data>
  <data name="Days" xml:space="preserve">
    <value>päeva</value>
  </data>
  <data name="Hours" xml:space="preserve">
    <value>tundi</value>
  </data>
  <data name="Minutes" xml:space="preserve">
    <value>minutit</value>
  </data>
  <data name="AddedBy" xml:space="preserve">
    <value>Lisas</value>
  </data>
  <data name="NothingToShowHere" xml:space="preserve">
    <value>Pole midagi kuvada ...</value>
  </data>
  <data name="NoActivitiesFound" xml:space="preserve">
    <value>Tegevusi ei leitud</value>
  </data>
  <data name="NoHelpArticlesFound" xml:space="preserve">
    <value>Juhendeid ei leitud</value>
  </data>
  <data name="NoOfferingsFound" xml:space="preserve">
    <value>Pakkumisi ei leitud</value>
  </data>
  <data name="NoRequestsFound" xml:space="preserve">
    <value>Pöördumisi ei leitud</value>
  </data>
  <data name="Notes" xml:space="preserve">
    <value>Märkused</value>
  </data>
  <data name="AddCommentToActivate" xml:space="preserve">
    <value>Lisa pöördumise avamisele selgitus..</value>
  </data>
  <data name="AddCommentToCancel" xml:space="preserve">
    <value>Lisa pöördumise tühistamisele selgitus..</value>
  </data>
  <data name="Comments" xml:space="preserve">
    <value>Kommentaarid</value>
  </data>
  <data name="EmptyQueryTable" xml:space="preserve">
    <value>Andmete laadimiseks vajuta "Värskenda" nupul</value>
  </data>
  <data name="AttachedBy" xml:space="preserve">
    <value>Manustas</value>
  </data>
  <data name="AttachedDate" xml:space="preserve">
    <value>Faili lisamise kuupäev</value>
  </data>
  <data name="FileName" xml:space="preserve">
    <value>Faili nimi</value>
  </data>
  <data name="AttachedFiles" xml:space="preserve">
    <value>Lisatud failid</value>
  </data>
  <data name="HasVeto" xml:space="preserve">
    <value>Veto õigus</value>
  </data>
  <data name="MustVote" xml:space="preserve">
    <value>Peab hääletama</value>
  </data>
  <data name="FileAttachedBy" xml:space="preserve">
    <value>Faili lisaja</value>
  </data>
</root>

Sources

  • Language Codes - find your language code in this list
  • Translated with the help of my dear colleagues
0 Replies