I’ve been asked a few times recently how to add a new language to StoreFront 3.0. So, I thought I’d better write a blog post about it.

The process is very similar to that for StoreFront 2.x. For the Unified Receiver UI, the location to place the language files and the JavaScript code to load these files are different. Here are the details.

Adding a language pack

A new language pack is comprised of a culture definition file, a string bundle file and a custom string bundle file.

Culture definition file

The format of the culture definition file is:

(function ($) {
    $.globalization.availableCulture("<lang-code>", {
        name: "<lang-code>",
        englishName: "<language name in English>",
        nativeName: "<language name in native language>",
        stringBundle: "<path to the string bundle>",
        customStringBundle: "<path to the custom string bundle>"

For example, for the Unified Receiver UI, a culture file for Polish looks like:
(function ($) {
    $.globalization.availableCulture("pl", {
        name: "pl",
        englishName: "Polish",
        nativeName: "polski",
        stringBundle: "custom/wrstrings.pl.js",
        customStringBundle: "custom/custom.strings.pl.js"

For the classic UI, the culture file looks like the following, which is not changed from StoreFront 2.x.
(function ($) {
    $.globalization.availableCulture("pl", {
        name: "pl",
        englishName: "Polish",
        nativeName: "polski",
        stringBundle: "contrib/wrstrings.pl.js",
        customStringBundle: "contrib/custom.strings.pl.js"

This should be saved as culture.pl.js and placed in the custom folder for the Unified Receiver UI and the contrib folder for the Classic UI.

String bundle files

A string bundle file defines a set of name-value pairs. You can copy an existing string bundle file and replace the language code (e.g. ‘en’ ) with your new language code (e.g. ‘pl’) and replace all string values with the translated ones. Save your new language bundle file as wrstrings.<lang-code>.js, e.g. wrstrings.pl.js.

For the Unified Receiver UI, the built-in string bundle file is under the folder receiver\js\localization\<lang-code>\. For example the path for the English string bundle file is something like receiver\js\localization\en\ctxs.strings_BA0A6F9FF8511CBD.js. The random string in the file name is generated at Receiver for Web site creation time and is different for each site. Your new language pack file, e.g. wrstrings.pl.js ,should be placed in the custom folder.

For the Classic UI, the built-in string bundle file is under the folder scripts\<lang-code>\. For example, the path for the English string bundle file is scripts\en\ctxs.wrstrings.js. Your new language pack file, e.g. wrstrings.pl.js, should be placed in the contrib folder.

You also need to create a custom string file for the new language. You can copy a custom string for a built-in language (e.g. English), modify the language code and replace the string values with translated ones. For the Unified Receiver UI, this is custom\strings.<lang-code>.js, e.g. custom\strings.en.js for English. For the Classic UI,  this is contrib\custom.strings.<lang-code>.js, e.g.  contrib\custom.strings.en.js for English. The custom string file should be saved as custom.strings.<lang-code>.js, e.g. custom.strings.pl.js for Polish and placed in the custom folder for the Unified Receiver UI and in the contrib folder for the Classic UI.

Loading the language pack

After you create the language pack, you need to customize Receiver for Web to load it.

For the Unified Receiver UI, this is done by adding the following code to script.js in the custom folder:

    dataType: 'script',
    url: 'custom/culture.pl.js',
    async: false

For the Classic UI, this is done by adding the following code to custom.script.js in the contrib folder:
$(document).ready(function () {

Adding language resources to Authentication Service

The user interface for the logon form is provided by the StoreFront Authentication Service. Localizing these strings requires creating 3 additional resource files. Continuing with using Polish (language code ‘pl’) as an example:

In Windows Explorer, open the folder C:\inetpub\wwwroot\Citrix\Authentication\App_Data\resources.

  • Copy ExplicitAuth.resx to ExplicitAuth.pl.resx
  • Copy ExplicitCore.resx to ExplicitCore.pl.resx
  • Copy ExplicitFormsCommon.resx to ExplicitFormsCommon.pl.resx

In all the newly copied files, locate each <data> element and translate the string in the corresponding <value> element. Save each file using UTF-8 encoding. Run the command iisreset on the Storefront server to restart IIS.

Adjusting UI elements for the new language

On a Polish system, loading the Receiver for Web site in a browser should now display the UI with all strings appearing in Polish. If any translated strings are longer in Polish than the built-in languages and are not correctly positioned, it is worth noting that the language code (‘pl’ in this case) appears as a class name on the <body> tag, and this can be used to create CSS definitions to adjust elements as necessary.

For example, the following CSS definition would make the logon box slightly wider when using Polish, to accommodate potential longer translated strings:

.pl .credentialform {
    width: 600px;

This CSS class happens to have the same name for both the Unified Receiver UI and the Classic UI. You need to insert your CSS definition to custom\style.css for the Unified Receiver UI and contrib\custom.style.css for the Classic UI.