Learn how to localize basemap A basemap is the foundational layer and data that provides the overall visual and geographic context for a map or scene. It typically includes geographic features and labels for land, water, roads, buildings, cities, places, and administrative boundaries, but can also include raster data such as satellite and areal images. Learn more place labels using the basemap styles service The ArcGIS Basemap Styles service, also referred to as the Basemap Styles service, is a location service that provides basemap styles and data for the world. It returns styles as Mapbox styles and web maps, and data as vector tiles and/or map tiles. It supports all of the styles in the ArcGIS Basemap style and Open Basemap style family. An ArcGIS Location Platform or ArcGIS Online account is required to use the service. Learn more .

Use the combobox to change the basemap language.

The basemap styles service The ArcGIS Basemap Styles service, also referred to as the Basemap Styles service, is a location service that provides basemap styles and data for the world. It returns styles as Mapbox styles and web maps, and data as vector tiles and/or map tiles. It supports all of the styles in the ArcGIS Basemap style and Open Basemap style family. An ArcGIS Location Platform or ArcGIS Online account is required to use the service. Learn more provides a number of basemap layer styles such as topography, streets, and imagery that you can use in maps. Each style accepts a language parameter, which allows you to localize place labels. There are currently over 30 different languages available.

In this tutorial, you will create a Calcite combobox to switch between different languages to update the Basemap style and app language.

Prerequisites

Steps

Create a new pen

  1. To get started, either complete the Display a map tutorial or .

Get an access token

You need an access token An access token is an authorization string that provides access to secure ArcGIS content, data, and services. Its capabilities are determined by the privileges it supports. It is obtained by implementing API key authentication, User authentication, or App authentication. Learn more with the correct privileges to access the location services ArcGIS Location Services, also referred to as Location Services, are services hosted by Esri that provide geospatial functionality for developing mapping applications. They include the ArcGIS Basemap Styles service, ArcGIS Static Basemap Tiles service, ArcGIS Places service, ArcGIS Geocoding service, ArcGIS Routing service, ArcGIS GeoEnrichment service, and ArcGIS Elevation service. An ArcGIS Location Platform or ArcGIS Online account is required to use the services. Learn more used in this tutorial.

  1. Go to the Create an API key tutorial and create an API key An API key is a long-lived access token created using API key credentials. They are valid for up to one year and are typically embedded directly into client applications. Learn more with the following privilege(s) Privileges are a set of permissions assigned to ArcGIS accounts, developer credentials, and applications that grant access to secure resources and functionality in ArcGIS. Learn more :
    • Privileges
      • Location services > Basemaps
  2. In CodePen, set the apiKey property on the global esriConfig variable to your access token.
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };

To learn about other ways to get an access token, go to Types of authentication.

Update the map

  1. Update the center and zoom attributes to focus the display on Europe.
    31 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    </arcgis-map>
    5 collapsed lines
    </body>
    </html>

Add modules

The request module can be used to request data from a remote server or file. We’ll use this module to fetch the available languages from the basemap style API endpoint.

  1. In a new <script> at the bottom of the <body>, use $arcgis.import() to add the request module.
    37 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    </arcgis-map>
    <script type="module">
    const esriRequest = await $arcgis.import("@arcgis/core/request.js");
    </script>
    5 collapsed lines
    </body>
    </html>

Set the current language

Set the current language of the basemap and the lang attribute on the body to Spanish (es). Setting the lang of the application will update the components to use the given language and formatting. For instance, when the locale is set to Spanish, the zoom component tooltip will say Acercar instead of Zoom in.

  1. Set the app’s locale to Spanish (es) by setting the lang attribute on the document body.

    28 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    </arcgis-map>
    </body>
    3 collapsed lines
    </html>
  2. Set the basemap from a style to the arcgis/outdoor basemap style A basemap layer is the layer in a map or scene that displays basemap data. The data source for a basemap layer is typically a basemap service. Learn more with the language property set to "es". This will display the basemap’s place labels in Spanish.

    37 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    </arcgis-map>
    <script type="module">
    const esriRequest = await $arcgis.import("@arcgis/core/request.js");
    const viewElement = document.querySelector("arcgis-map");
    viewElement.basemap = {
    style: {
    id: "arcgis/outdoor",
    language: "es", // Spanish language basemap
    },
    };
    </script>
    5 collapsed lines
    </body>
    </html>

Create a language dropdown

Get the list of languages available from the basemap styles service and add them to a calcite-combobox component to allow users to select the language of their basemap.

  1. Create a div called basemapLanguage with a calcite-combobox component, placed in the top-right slot of the map. Set selection-mode to single, so only one language can be selected at a time. Add the clear-disabled attribute so that a language is always selected.

    31 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    <div id="basemapLanguage" slot="top-right">
    <calcite-label>Basemap language</calcite-label>
    <calcite-combobox id="languageCombobox" selection-mode="single" clear-disabled></calcite-combobox>
    </div>
    </arcgis-map>
    19 collapsed lines
    <script type="module">
    const esriRequest = await $arcgis.import("@arcgis/core/request.js");
    const viewElement = document.querySelector("arcgis-map");
    viewElement.basemap = {
    style: {
    id: "arcgis/outdoor",
    language: "es", // Spanish language basemap
    },
    };
    </script>
    </body>
    </html>
  2. Within the <style> tags, apply some CSS properties to the basemapLanguage div.

    15 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    #basemapLanguage {
    width: 200px;
    padding: 10px;
    background-color: white;
    }
    46 collapsed lines
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    <div id="basemapLanguage" slot="top-right">
    <calcite-label>Basemap language</calcite-label>
    <calcite-combobox id="languageCombobox" selection-mode="single" clear-disabled></calcite-combobox>
    </div>
    </arcgis-map>
    <script type="module">
    const esriRequest = await $arcgis.import("@arcgis/core/request.js");
    const viewElement = document.querySelector("arcgis-map");
    viewElement.basemap = {
    style: {
    id: "arcgis/outdoor",
    language: "es", // Spanish language basemap
    },
    };
    </script>
    </body>
    </html>
  3. Fetch the list of languages available from the /self endpoint for the basemap styles service using the esriRequest method. Specify json as the response type. This will return a json response with a languages property.

    61 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    #basemapLanguage {
    width: 200px;
    padding: 10px;
    background-color: white;
    }
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    <div id="basemapLanguage" slot="top-right">
    <calcite-label>Basemap language</calcite-label>
    <calcite-combobox id="languageCombobox" selection-mode="single" clear-disabled></calcite-combobox>
    </div>
    </arcgis-map>
    <script type="module">
    const esriRequest = await $arcgis.import("@arcgis/core/request.js");
    const viewElement = document.querySelector("arcgis-map");
    viewElement.basemap = {
    style: {
    id: "arcgis/outdoor",
    language: "es", // Spanish language basemap
    },
    };
    // update combobox values with languages from rest endpoint
    const basemapStylesEndpoint =
    "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles/self";
    esriRequest(basemapStylesEndpoint, {
    responseType: "json",
    }).then((response) => {
    });
    7 collapsed lines
    </script>
    </body>
    </html>
  4. From the response data, use the JavaScript forEach method to iterate through each of the languages and add it as a calcite-combobox-item. Set the value to the language code, and the label to the language name. If the language code matches the language of the current basemap, set the item as selected.

    61 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    #basemapLanguage {
    width: 200px;
    padding: 10px;
    background-color: white;
    }
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    <div id="basemapLanguage" slot="top-right">
    <calcite-label>Basemap language</calcite-label>
    <calcite-combobox id="languageCombobox" selection-mode="single" clear-disabled></calcite-combobox>
    </div>
    </arcgis-map>
    <script type="module">
    const esriRequest = await $arcgis.import("@arcgis/core/request.js");
    const viewElement = document.querySelector("arcgis-map");
    viewElement.basemap = {
    style: {
    id: "arcgis/outdoor",
    language: "es", // Spanish language basemap
    },
    };
    // update combobox values with languages from rest endpoint
    const basemapStylesEndpoint =
    "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles/self";
    esriRequest(basemapStylesEndpoint, {
    responseType: "json",
    }).then((response) => {
    const json = response.data;
    // add each language as a combobox item
    json.languages.forEach((language, index) => {
    const comboboxItem = document.createElement("calcite-combobox-item");
    comboboxItem.value = language.code;
    comboboxItem.heading = language.name;
    // if the current basemap language is the same as the combobox item, select it
    comboboxItem.selected = viewElement.basemap.style.language === language.code;
    languageCombobox.appendChild(comboboxItem);
    });
    });
    7 collapsed lines
    </script>
    </body>
    </html>

Create a basemap language function

Create a function that accepts a language code and updates the basemap style formatted with that language.

  1. Define a new function updateBasemapLanguage that accepts a language code.

    81 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    #basemapLanguage {
    width: 200px;
    padding: 10px;
    background-color: white;
    }
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    <div id="basemapLanguage" slot="top-right">
    <calcite-label>Basemap language</calcite-label>
    <calcite-combobox id="languageCombobox" selection-mode="single" clear-disabled></calcite-combobox>
    </div>
    </arcgis-map>
    <script type="module">
    const esriRequest = await $arcgis.import("@arcgis/core/request.js");
    const viewElement = document.querySelector("arcgis-map");
    viewElement.basemap = {
    style: {
    id: "arcgis/outdoor",
    language: "es", // Spanish language basemap
    },
    };
    // update combobox values with languages from rest endpoint
    const basemapStylesEndpoint =
    "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles/self";
    esriRequest(basemapStylesEndpoint, {
    responseType: "json",
    }).then((response) => {
    const json = response.data;
    // add each language as a combobox item
    json.languages.forEach((language, index) => {
    const comboboxItem = document.createElement("calcite-combobox-item");
    comboboxItem.value = language.code;
    comboboxItem.heading = language.name;
    // if the current basemap language is the same as the combobox item, select it
    comboboxItem.selected = viewElement.basemap.style.language === language.code;
    languageCombobox.appendChild(comboboxItem);
    });
    });
    const updateLanguage = (languageCode) => {
    };
    6 collapsed lines
    </script>
    </body>
    </html>
  2. Use the languageCode variable to update the application’s language and the language of the basemap style.

    81 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    #basemapLanguage {
    width: 200px;
    padding: 10px;
    background-color: white;
    }
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    <div id="basemapLanguage" slot="top-right">
    <calcite-label>Basemap language</calcite-label>
    <calcite-combobox id="languageCombobox" selection-mode="single" clear-disabled></calcite-combobox>
    </div>
    </arcgis-map>
    <script type="module">
    const esriRequest = await $arcgis.import("@arcgis/core/request.js");
    const viewElement = document.querySelector("arcgis-map");
    viewElement.basemap = {
    style: {
    id: "arcgis/outdoor",
    language: "es", // Spanish language basemap
    },
    };
    // update combobox values with languages from rest endpoint
    const basemapStylesEndpoint =
    "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles/self";
    esriRequest(basemapStylesEndpoint, {
    responseType: "json",
    }).then((response) => {
    const json = response.data;
    // add each language as a combobox item
    json.languages.forEach((language, index) => {
    const comboboxItem = document.createElement("calcite-combobox-item");
    comboboxItem.value = language.code;
    comboboxItem.heading = language.name;
    // if the current basemap language is the same as the combobox item, select it
    comboboxItem.selected = viewElement.basemap.style.language === language.code;
    languageCombobox.appendChild(comboboxItem);
    });
    });
    const updateLanguage = (languageCode) => {
    // update language in html body
    document.body.setAttribute("lang", languageCode);
    // update the basemap language
    viewElement.basemap = {
    style: {
    id: "arcgis/outdoor",
    language: languageCode,
    },
    };
    };
    6 collapsed lines
    </script>
    </body>
    </html>

Update the language on user input

Use the calciteComboboxChange event to recognize when the user has selected a new language.

  1. Add an event listener to watch for changes on the combobox. When the combobox value has changed, call the updateBasemapLanguage function to update the basemap language and app locale.
    81 collapsed lines
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>ArcGIS Maps SDK for JavaScript Tutorials: Display a map</title>
    <style>
    html,
    body {
    height: 100%;
    margin: 0;
    }
    #basemapLanguage {
    width: 200px;
    padding: 10px;
    background-color: white;
    }
    </style>
    <script>
    var esriConfig = {
    apiKey: "YOUR_ACCESS_TOKEN",
    };
    </script>
    <!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
    <script type="module" src="https://js.arcgis.com/5.0/"></script>
    </head>
    <body lang="es">
    <arcgis-map basemap="arcgis/topographic" center="13, 46" zoom="4">
    <arcgis-zoom slot="top-left"></arcgis-zoom>
    <div id="basemapLanguage" slot="top-right">
    <calcite-label>Basemap language</calcite-label>
    <calcite-combobox id="languageCombobox" selection-mode="single" clear-disabled></calcite-combobox>
    </div>
    </arcgis-map>
    <script type="module">
    const esriRequest = await $arcgis.import("@arcgis/core/request.js");
    const viewElement = document.querySelector("arcgis-map");
    viewElement.basemap = {
    style: {
    id: "arcgis/outdoor",
    language: "es", // Spanish language basemap
    },
    };
    // update combobox values with languages from rest endpoint
    const basemapStylesEndpoint =
    "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles/self";
    esriRequest(basemapStylesEndpoint, {
    responseType: "json",
    }).then((response) => {
    const json = response.data;
    // add each language as a combobox item
    json.languages.forEach((language, index) => {
    const comboboxItem = document.createElement("calcite-combobox-item");
    comboboxItem.value = language.code;
    comboboxItem.heading = language.name;
    // if the current basemap language is the same as the combobox item, select it
    comboboxItem.selected = viewElement.basemap.style.language === language.code;
    languageCombobox.appendChild(comboboxItem);
    });
    });
    const updateLanguage = (languageCode) => {
    // update language in html body
    document.body.setAttribute("lang", languageCode);
    // update the basemap language
    viewElement.basemap = {
    style: {
    id: "arcgis/outdoor",
    language: languageCode,
    },
    };
    };
    const languageCombobox = document.getElementById("languageCombobox");
    // when the combobox value changes, update the language
    languageCombobox.addEventListener("calciteComboboxChange", () => {
    updateLanguage(languageCombobox.value);
    });
    7 collapsed lines
    </script>
    </body>
    </html>

Run the App

In CodePen, run your code to display the map.

You should be able to use the calcite combobox to update the basemap language and app language.

What’s Next?

Learn how to use additional SDK features and ArcGIS services in these tutorials: