Change Display Language

By default, GoodData displays the user interface in US English. This can be changed using the Display Language setting.

You can enable a different display language for your organization, workspace, or even for individual users. Such change affects multiple areas of the GoodData user interface:

In addition to Dashboards and Analytical Designer, it also applies to the Home page and main sections such as Getting Started, Workspaces, Data Sources, Users and Groups, Automations, and Settings.

Changing the display language affects both titles and descriptions of these sections and their subsections.

Available Languages

The GoodData user interface supports the following languages, listed alphabetically:

  • Chinese
  • Chinese (Cantonese)
  • Chinese (Traditional)
  • Dutch
  • English (Australia)
  • English (Great Britain)
  • English (USA)
  • Finnish
  • French
  • French (Canada)
  • German
  • Italian
  • Japanese
  • Korean
  • Polish
  • Portuguese (Brazil)
  • Portuguese (Portugal)
  • Slovenian
  • Spanish
  • Spanish (Latin America)
  • Turkish

Note

Unless you set a specific display language for a workspace or a user, the settings are inherited from their parents:

  • Workspaces inherit the settings from their parent entity, i.e. parent workspace or organization.
  • Users inherit the language settings from their workspaces.

Change the Language

To change the display language:

  1. Create the locale setting.
  2. Enable the language that you want to use.

Below is a table of language IDs that you can use to enable different languages. The IDs are listed in alphabetical order:

LanguageLanguage ID
Chinesezh-Hans
Chinese (Cantonese)zh-HK
Chinese (Traditional)zh-Hant
Dutchnl-NL
English (American - default)en-US
English (Australian)en-AU
English (British)en-GB
Finnishfi-FI
Frenchfr-FR
French (Canadian)fr-CA
Germande-DE
Italianit-IT
Japaneseja-JP
Koreanko-KR
Polishpl-PL
Portuguesept-PT
Portuguese (Brazilian)pt-BR
Sloveniansl-SI
Spanishes-ES
Spanish (Latin American)es-419
Turkishtr-TR

Note

You cannot change the texts nor add additional languages.

If you use an invalid language ID, English (en-US) will be used instead.

Organization

To change the display language for the whole organization, use one of the following methods:

Steps:

  1. Go to Settings.

  2. Under Localization > Display language, click Change.

    language settings in ui
  3. Select one of the supported languages and click Apply.

To create the locale organization settings, send the following POST request /api/v1/entities/organizationSettings:

curl $ENDPOINT/api/v1/entities/organizationSettings \
  -H "Content-Type: application/vnd.gooddata.api+json" \
  -H "Accept: application/vnd.gooddata.api+json" \
  -H "Authorization: Bearer {API_TOKEN}" \
  -X POST \
  -d '{
    "data":
    {
        "type": "organizationSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | jq .

To enable a different language, send the following PUT request /api/v1/entities/organizationSettings/locale:

curl $ENDPOINT/api/v1/entities/organizationSettings/locale \
  -H "Content-Type: application/vnd.gooddata.api+json" \
  -H "Accept: application/vnd.gooddata.api+json" \
  -H "Authorization: Bearer {API_TOKEN}" \
  -X PUT \
  -d '{
    "data":
    {
        "type": "organizationSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | jq .

To create the locale organization settings, send the following POST request /api/v1/entities/organizationSettings:

Invoke-RestMethod -Method Post -Uri '$ENDPOINT/api/v1/entities/organizationSettings' `
-ContentType 'application/vnd.gooddata.api+json' `
-H @{ 
    'Accept' = 'application/vnd.gooddata.api+json'
    'Authorization' = 'Bearer {API_TOKEN}' 
} `
-Body '{
    "data":
    {
        "type": "organizationSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | ConvertTo-Json

To enable a different language, send the following PUT request /api/v1/entities/organizationSettings/locale:

Invoke-RestMethod -Method Put -Uri '$ENDPOINT/api/v1/entities/organizationSettings/locale' `
-ContentType 'application/vnd.gooddata.api+json' `
-H @{ 
    'Accept' = 'application/vnd.gooddata.api+json'
    'Authorization' = 'Bearer {API_TOKEN}' 
} `
-Body '{
    "data":
    {
        "type": "organizationSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | ConvertTo-Json

Workspace

To change the display language for individual workspaces, you need to use the API:

Go to the Workspaces tab and open the workspace you want to edit. Open the Settings tab and click Change in the Display language section.

Localization section in the Settings tab displaying four configuration rows: display language, date format, first day of the week, and time zone. Each setting includes a Change button on the right side of its row.

To create the locale workspace settings, send the following POST request /api/v1/entities/workspaceSettings:

curl $ENDPOINT/api/v1/entities/workspaces/{WORKSPACE_ID}/workspaceSettings \
  -H "Content-Type: application/vnd.gooddata.api+json" \
  -H "Accept: application/vnd.gooddata.api+json" \
  -H "Authorization: Bearer {API_TOKEN}" \
  -X POST \
  -d '{
    "data":
    {
        "type": "workspaceSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | jq .

To enable a different language, send the following PUT request /api/v1/entities/workspaceSettings/locale:

curl $ENDPOINT/api/v1/entities/workspaces/{WORKSPACE_ID}/workspaceSettings/locale \
  -H "Content-Type: application/vnd.gooddata.api+json" \
  -H "Accept: application/vnd.gooddata.api+json" \
  -H "Authorization: Bearer {API_TOKEN}" \
  -X PUT \
  -d '{
    "data":
    {
        "type": "workspaceSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | jq .

To create the locale workspace settings, send the following POST request /api/v1/entities/workspaceSettings:

Invoke-RestMethod -Method Post -Uri '$ENDPOINT/api/v1/entities/workspaces/{WORKSPACE_ID}/workspaceSettings' `
-ContentType 'application/vnd.gooddata.api+json' `
-H @{ 
    'Accept' = 'application/vnd.gooddata.api+json'
    'Authorization' = 'Bearer {API_TOKEN}' 
} `
-Body '{
    "data":
    {
        "type": "workspaceSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | ConvertTo-Json

To enable a different language, send the following PUT request /api/v1/entities/workspaceSettings/locale:

Invoke-RestMethod -Method Put -Uri '$ENDPOINT/api/v1/entities/workspaces/{WORKSPACE_ID}/workspaceSettings/locale' `
-ContentType 'application/vnd.gooddata.api+json' `
-H @{ 
    'Accept' = 'application/vnd.gooddata.api+json'
    'Authorization' = 'Bearer {API_TOKEN}' 
} `
-Body '{
    "data":
    {
        "type": "workspaceSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | ConvertTo-Json

User

To change the display language for individual users, you need to use the API:

To create the locale user settings, send the following POST request /api/v1/entities/userSettings:

curl $ENDPOINT/api/v1/entities/users/{USER_ID}/userSettings \
  -H "Content-Type: application/vnd.gooddata.api+json" \
  -H "Accept: application/vnd.gooddata.api+json" \
  -H "Authorization: Bearer {API_TOKEN}" \
  -X POST \
  -d '{
    "data":
    {
        "type": "userSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | jq .

To enable a different language, send the following PUT request /api/v1/entities/userSettings/locale:

curl $ENDPOINT/api/v1/entities/users/{USER_ID}/userSettings/{locale_id} \
  -H "Content-Type: application/vnd.gooddata.api+json" \
  -H "Accept: application/vnd.gooddata.api+json" \
  -H "Authorization: Bearer {API_TOKEN}" \
  -X PUT \
  -d '{
    "data":
    {
        "type": "userSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | jq .

To create the locale user settings, send the following POST request /api/v1/entities/userSettings:

Invoke-RestMethod -Method Post -Uri '$ENDPOINT/api/v1/entities/users/{USER_ID}/userSettings' `
-ContentType 'application/vnd.gooddata.api+json' `
-H @{ 
    'Accept' = 'application/vnd.gooddata.api+json'
    'Authorization' = 'Bearer {API_TOKEN}' 
} `
-Body '{
    "data":
    {
        "type": "userSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | ConvertTo-Json

To enable a different language, send the following PUT request /api/v1/entities/userSettings/locale:

Invoke-RestMethod -Method Put -Uri '$ENDPOINT/api/v1/entities/users/{USER_ID}/userSettings/{locale_id}' `
-ContentType 'application/vnd.gooddata.api+json' `
-H @{ 
    'Accept' = 'application/vnd.gooddata.api+json'
    'Authorization' = 'Bearer {API_TOKEN}' 
} `
-Body '{
    "data":
    {
        "type": "userSetting",
        "id": "{some_id}",
        "attributes": {
            "content": {"value": "LANGUAGE_ID"},
            "type": "LOCALE"
        }
    }
}' | ConvertTo-Json

Metadata Localization

When you extend your analytics across various regions and languages, it’s beneficial to adapt the embedded analytics to fit local contexts. This includes translating the content within visualizations, assigning local names to data entities, and adjusting date or currency formats as needed.

Language settings can be customized at different levels: organization-wide, for individual tenants (workspaces), or even for specific users. Typically, the metadata language aligns with the user interface (UI) language. However, situations may arise where you prefer the metadata in one language and the UI in another. For instance, while using the Analytics Designer in English, you might wish to provide the embedded visualizations to your end-users in multiple languages, which they can select from their account settings.

XLIFF Files

Metadata localization within GoodData uses standard XLIFF files (version 2.0 or 2.1). These files contain all translatable text strings. The translations are stored within the workspace that originates the entities, i.e. translations of entities must be added to workspaces that have ownership of them. A single XLIFF file can serve multiple workspaces, assuming they are copies of an original workspace and remain unaltered. Modifications to a cloned workspace or the creation of a new workspace necessitate generating new XLIFF files for each case.

Entities subject to localization include titles, descriptions, tags (in attributes, labels, facts, datasets, metrics, attribute hierarchies, dashboards, visualizations, and filters), along with free-form content in dashboards, visualizations, and filters. The Declarative API does not support localization.

This localization feature is designed for scenarios where modifications to workspace metadata, dashboards, or visualizations are carried out in the original English version, which is then translated and distributed to users in other languages. Translation between languages (e.g., German to French) is not supported; translations can only be made from the default language (en-US) to the target language. Should a translation for a string/entity not exist, GoodData defaults to using the original language values.

Metadata Localization Process

The process of localizing metadata involves three main steps:

  1. Export an XLIFF file for localization purposes.
  2. Translate the content into the desired languages.
  3. Import the localized XLIFF file back into GoodData.

Exporting an XLIFF File

To begin the localization process, use the GET API to export metadata strings that require translation for each language. This action will generate an XLIFF file for any specified language.

To retrieve the original text strings, use the following API call:

POST {"locale":"<locale-identifier>"} to api/v1/actions/workspaces/<id>/translations/retrieve

If translations already exist, specify a locale identifier in the above API call to obtain translations for a specific language.

To show a list of already translated locales, use the following API call:

GET api/v1/actions/workspaces/<id>/translations

Translating the XLIFF File

Within the XLIFF file, specify the target language using the standard IETF RFC 5646 language tag (for example, es-ES for Spanish or ja-JP for Japanese). Translate the strings contained within the <source> tags and add your translations within the same segment, enclosed in <target> tags.

Example structure of an XLIFF file:

<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0"
       srcLang="en-US" trgLang="cs-CZ">
 <file id="cz-cz-translation">
  <group id="fact">
   <group id="fact.volume">
    <unit id="fact.volume.title">
     <segment>
        <source>tagA</source>
        <target>Translation of tagA</target>
     </segment>
     <segment>
        <source>tagB</source>
        <target>Translation of tagB</target>
     </segment>
    </unit>
   </group>
  </group>
 </file>
</xliff>

To aid translators in understanding the context of free-form segments, each segment contains JSON paths within the source text. This is accomplished using mrk inline elements, making it easier for translators to navigate and comprehend the document structure.

Example:

<segment id="<hashed_value>">
  <source>
    <mrk id="1" type="free-form:path" value="<json_path>"/>Source text
  </source>
  <target>Translated text</target>
</segment>

Importing the XLIFF File

After translating the strings in the XLIFF files, they can be imported back into GoodData. Administrators will use an API call with the corresponding XLIFF file for each language.

To create or update translations, use:

POST the XLIFF document to api/v1/actions/workspaces/<id>/translations/set

To remove translations for a specific locale, use:

POST {"locale":"<locale-identifier>"} to api/v1/actions/workspaces/<id>/translations/clean

Setting Up Metadata Localizations

To choose a specific metadata localization through the API, it is necessary to set the METADATA_LOCALE setting. It must be set at the organization, workspace, or user level for the metadata to be translated.

To do so, follow the same steps as described in the sections above. See Change the Language for Organization, Workspace, or User for details.

Below is an example API payload for this configuration:

"data": {
  "type": "workspaceSetting",
  "id": "my_id",
  "attributes": {
    "content": { "value": "pt-PT" },
    "type": "METADATA_LOCALE"
  }
}

Only users with organization.MANAGE or workspace.MANAGE permissions can configure metadata localizations for a workspace. Once set up, users can choose their preferred language for metadata.

Limitations of Metadata Localizations

  • Whenever a metadata string of an object is modified (for example, if the author of a dashboard changes its title), all associated translations are reset. To ensure that translations remain up-to-date, the organization’s administrator is required to perform a new export-import process for localization for each language.

  • The default language, en-US, cannot be targeted for translations. If attempted, such translations will be ignored by the backend.

  • Multi-line text strings should not include indentation. For instance:

        <target>Multi-line
    text.
        </target>

    Automatic formatting by some code editors might indent these elements, potentially causing issues with backend processing.

  • Filtering operations use the original language.

  • In the XLIFF file, translations must maintain the original tag values’ order. Changing the order of segments can result in lost ordering and incorrect segment returns in XLIFF exports for that language, as illustrated by the example of improper segment order.

  • Localized versions are intended solely for content consumption. For instance, a user with a German localized version will see metrics and reports in German but cannot alter the names of these metrics or reports.

Localized Data Labels

Localized Data Labels let you show dimension values (attribute values like country, product, region) in the user’s preferred language, while keeping analytics logic stable. This complements existing UI and metadata localization so the dashboard experience can be fully in one language.

How it works

  • The primary label drives logic. Filtering, saved views, drills, and shared links store and resolve values using the primary label (canonical).
  • Secondary (text) labels can have translations for specific locales. GoodData displays the translation that matches the user’s dataLocale. If no translation exists for that locale, GoodData falls back to the secondary label value (not the primary label). For example, the primary label stores ISO codes (e.g. GER). The secondary label stores the base display name (e.g. Germany). A German translation can provide Deutschland. If a user’s locale is Spanish and no Spanish translation exists, GoodData shows Germany, not GER.

Filters and Metrics

When enabled, localized secondary labels are used broadly across the platform, including filters and metrics. This can affect results if you use localized labels and localized literals in definitions.

Secondary label values are localized, but content is shared across users regardless of their locale. If you create a metric or filter that references a localized secondary label and uses localized text literals, users in different locales can get different results.

Example: If you define a metric filter like ... WHERE {label/place} = "Office" and place is a localized secondary label, the literal "Office" may not exist in German or Spanish. The condition can become false for those locales, and the metric returns incorrect results.

Recommendation: If possible, do not create filters or metric conditions based on localized secondary labels and localized literals. Opt for:

  • Attributes or primary labels whose values are the same across locales
  • Stable identifiers or non-localized values

Setup

  1. Provide translation columns in your data

Add one column per language to the dimension table (denormalized), for example:

  • region_name (default)
  • region_name_de
  • region_name_fr
  1. Map translations in the Logical Data Model

Define locale and translations on a secondary label.

  • locale (optional) is a BCP 47 locale including extensions. It overrides ldmDefaultLocale when set. Default is null (no locale).
  • translations is an array of objects, each with:
    • sourceColumn (database column name)
    • locale (BCP 47 locale including extensions)

Example:

"labels": [
  {
    "locale": "en-US",
    "sourceColumn": "region_name",
    "translations": [
      { "locale": "es-ES", "sourceColumn": "region_name_es" },
      { "locale": "de-DE", "sourceColumn": "region_name_de" }
    ]
  }
]

Rules:

  • Translations can be defined only on secondary labels.
  • Translation source columns must be STRING.
  • Each translation must use a valid locale (BCP 47). Locales must be unique.
  1. Set the data locale

To display localized data values (for example, translated attribute values) and keep the experience consistent across dashboards, filters, visualizations, and exports, set the DATA_LOCALE setting.

You can set DATA_LOCALE at the organization, workspace, or user level. Users can also change it for themselves if allowed, in the same way as metadata locale.

DATA_LOCALE uses a BCP 47 locale without extensions (for example fr-FR, de-DE, cs-CZ).

Example API payload:

"data": {
  "type": "workspaceSetting",
  "id": "my_id",
  "attributes": {
    "content": { "value": "fr-FR" },
    "type": "DATA_LOCALE"
  }
}

Only users with organization.MANAGE or workspace.MANAGE permissions can configure settings for a workspace or organization.

Behavior in the product

Dashboards, filters, and collaboration

  • Dashboards and filters show localized values.
  • Filter states persist across language changes because selections are stored using the primary label.
  • Shared links remain correct across languages. The recipient sees the same data, with labels in their locale.

Exports and scheduled exports

  • Exports reflect the localized values the user sees.

  • Scheduled exports:

    • Internal recipients use the recipient’s data locale
    • External recipients use the schedule creator’s data locale

Sorting

  • When translated labels are displayed, sorting follows the displayed text by default.
  • If you define a custom sort column, it overrides alphabetical sorting.
  • If a user locale is not set, sorting behavior can be controlled by sortCaseSensitive (case-sensitive on or off). Locale extensions can also affect case sensitivity when a locale is used.

The sorting of text values can be influenced by workspace settings:

  • LDM_DEFAULT_LOCALE Sets the default locale used for sorting text values in the workspace. When set, text values are sorted according to this locale without requiring you to define locale on each label.

    This setting can be set at the workspace level (and typically also at organization level if your settings model supports it), using the same settings API shape, with type: "LDM_DEFAULT_LOCALE".

  • SORT_CASE_SENSITIVE Controls case-sensitive sorting behavior. This is useful when no explicit locale-based sorting is applied (for example, when a user locale is not set). Set it using type: "SORT_CASE_SENSITIVE".

Example payload:

{
  "data": {
    "type": "workspaceSetting",
    "id": "sort_case_sensitive",
    "attributes": {
      "content": { "value": false },
      "type": "SORT_CASE_SENSITIVE"
    }
  }
}

Sorting behavior example:

Default sorting:

  1. Adam
  2. Barbara
  3. adam
  4. barbara

With SORT_CASE_SENSITIVE = false:

  1. Adam
  2. adam
  3. Barbara
  4. barbara

Limitations

  • Translation columns must be STRING.
  • Translations are intended for localized display. Avoid using localized secondary labels with localized literals in metric/filter logic as described above.
  • Translation labels are not intended for MAQL conditions to avoid language-specific logic.
  • Language-specific collation rules (for example accents or umlauts) are not guaranteed unless you configure label locale/collation appropriately.