Learn how to change language labels in a map.
The ArcGIS Static Basemap Tiles service provides a number of different styles that you can use in your MapLibre GL JS applications. Each style accepts a language
parameter, which allows you to localize place labels. There are currently more than 5 different languages available.
In this tutorial, you use a <select
dropdown menu to toggle between a number of different language labels for the static basemap tiles.
Prerequisites
You need an ArcGIS Location Platform account.
ArcGIS Online and ArcGIS Enterprise accounts are not supported.
Steps
Get the starter app
Select a type of authentication and follow the steps to create a new app.
Choose API key authentication if you:
- Want the easiest way to get started.
- Want to build public applications that access ArcGIS Location Services and secure items.
- Have an ArcGIS Location Platform or ArcGIS Online account.
Choose user authentication if you:
- Want to build private applications.
- Require application users to sign in with their own ArcGIS account and access resources their behalf.
- Have an ArcGIS Online account.
To learn more about both types of authentication, go to Authentication.
Set up authentication
Set developer credentials
Use the API key or OAuth developer credentials so your application can access ArcGIS services.
Add a language selector
Add a menu that allows users to change the display language of your map. MapLibre does not have a built-in selector widget, so you will create an HTML <select
element.
-
In the
<body
element, add a> select
element which you will populate in a later step.Use dark colors for code blocks <body> <div id="map"></div> <div id="language-wrapper"> <select id="language"></select> </div> </body>
-
In the
<head
tag, add CSS that will position the> <select
menu element and its wrapper in the upper right corner and provide styling.> Use dark colors for code blocks <style> html, body, #map { margin: 0; padding: 0; height: 100%; } #language-wrapper { position: absolute; top: 20px; right: 20px; background: rgba(255, 255, 255, 0); } #language { font-size: 16px; padding: 4px 8px; } .maplibregl-ctrl-bottom-right { margin-left: 50px; } </style>
Update the map's viewpoint
-
Change the map's
center
to[8.90, 47.14]
andzoom
level to6
. This will focus the map on Switzerland.Use dark colors for code blocks const map = new maplibregl.Map({ container: "map", style: { version: 8, sources: { "raster-tiles": { type: "raster", tiles: [ url(defaultLanguage) ], tileSize: 512 } }, layers: [ { id: "simple-tiles", type: "raster", source: "raster-tiles", minzoom: 0, maxzoom: 22 } ] }, zoom: 6, center: [8.90, 47.14] // Switzerland });
Set the basemap
When the page loads, initialize the app to display the static basemap tiles in English.
-
Create a function called
url
that takes a language as a parameter. This will create the URL of the static basemap tiles for that specified language.Use dark colors for code blocks <script> /* Use for API key authentication */ const accessToken = "YOUR_ACCESS_TOKEN"; // or /* Use for user authentication */ // const session = await arcgisRest.ArcGISIdentityManager.beginOAuth2({ // clientId: "YOUR_CLIENT_ID", // Your client ID from OAuth credentials // redirectUri: "YOUR_REDIRECT_URI", // The redirect URL registered in your OAuth credentials // portal: "YOUR_PORTAL_URL" // Your portal URL // }) // const accessToken = session.token; const basemapEnum = "arcgis/navigation"; const baseUrl = "https://static-map-tiles-api.arcgis.com/arcgis/rest/services/static-basemap-tiles-service/v1"; const url = (language) => `${baseUrl}/${basemapEnum}/static/tile/{z}/{y}/{x}?token=${accessToken}&language=${language}`; const map = new maplibregl.Map({ container: "map", style: { version: 8, sources: { "raster-tiles": { type: "raster", tiles: [ url(defaultLanguage) ], tileSize: 512 } }, layers: [ { id: "simple-tiles", type: "raster", source: "raster-tiles", minzoom: 0, maxzoom: 22 } ] }, zoom: 6, center: [8.90, 47.14] // Switzerland }); </script>
-
Create a
default
variable for the basemap, which isLanguage en
for English.Use dark colors for code blocks <script> /* Use for API key authentication */ const accessToken = "YOUR_ACCESS_TOKEN"; // or /* Use for user authentication */ // const session = await arcgisRest.ArcGISIdentityManager.beginOAuth2({ // clientId: "YOUR_CLIENT_ID", // Your client ID from OAuth credentials // redirectUri: "YOUR_REDIRECT_URI", // The redirect URL registered in your OAuth credentials // portal: "YOUR_PORTAL_URL" // Your portal URL // }) // const accessToken = session.token; const basemapEnum = "arcgis/navigation"; const baseUrl = "https://static-map-tiles-api.arcgis.com/arcgis/rest/services/static-basemap-tiles-service/v1"; const url = (language) => `${baseUrl}/${basemapEnum}/static/tile/{z}/{y}/{x}?token=${accessToken}&language=${language}`; const defaultLanguage = "en"; const map = new maplibregl.Map({ container: "map", style: { version: 8, sources: { "raster-tiles": { type: "raster", tiles: [ url(defaultLanguage) ], tileSize: 512 } }, layers: [ { id: "simple-tiles", type: "raster", source: "raster-tiles", minzoom: 0, maxzoom: 22 } ] }, zoom: 6, center: [8.90, 47.14] // Switzerland }); </script>
-
Modify the
tiles
property of the map to use theurl
function withdefault
as the default basemap language.Language Use dark colors for code blocks <script> /* Use for API key authentication */ const accessToken = "YOUR_ACCESS_TOKEN"; // or /* Use for user authentication */ // const session = await arcgisRest.ArcGISIdentityManager.beginOAuth2({ // clientId: "YOUR_CLIENT_ID", // Your client ID from OAuth credentials // redirectUri: "YOUR_REDIRECT_URI", // The redirect URL registered in your OAuth credentials // portal: "YOUR_PORTAL_URL" // Your portal URL // }) // const accessToken = session.token; const basemapEnum = "arcgis/navigation"; const baseUrl = "https://static-map-tiles-api.arcgis.com/arcgis/rest/services/static-basemap-tiles-service/v1"; const url = (language) => `${baseUrl}/${basemapEnum}/static/tile/{z}/{y}/{x}?token=${accessToken}&language=${language}`; const defaultLanguage = "en"; const map = new maplibregl.Map({ container: "map", style: { version: 8, sources: { "raster-tiles": { type: "raster", tiles: [ url(defaultLanguage) ], tileSize: 512 } }, layers: [ { id: "simple-tiles", type: "raster", source: "raster-tiles", minzoom: 0, maxzoom: 22 } ] }, zoom: 6, center: [8.90, 47.14] // Switzerland }); </script>
-
Retrieve the
select
element by storing it in alanguage
variable.Select Element Use dark colors for code blocks const languageSelectElement = document.querySelector("#language");
-
Import
arcgis
to make a request to the Static Basemap Tiles service. This dynamically fetches the available languages and populates theRest.request() select
element.Use dark colors for code blocks <!-- REST JS --> <script src="https://unpkg.com/@esri/arcgis-rest-request@4/dist/bundled/request.umd.js"></script>
Use dark colors for code blocks arcgisRest.request(`${baseUrl}/self`, { httpMethod: "GET", authentication: arcgisRest.ApiKeyManager.fromKey(accessToken) }).then((response) => { response.languages.forEach((language) => { const option = document.createElement("option"); option.value = language.code; option.textContent = language.name; languageSelectElement.appendChild(option); }); });
-
Run the code to ensure the
<select
element contains different language enumerations.>
Add an event listener
Use an event listener to register a language change in the <select
element and to update the map.
-
Add an event listener to store the selected basemap.
Use dark colors for code blocks const languageSelectElement = document.querySelector("#language"); arcgisRest.request(`${baseUrl}/self`, { httpMethod: "GET", authentication: arcgisRest.ApiKeyManager.fromKey(accessToken) }).then((response) => { response.languages.forEach((language) => { const option = document.createElement("option"); option.value = language.code; option.textContent = language.name; languageSelectElement.appendChild(option); }); }); languageSelectElement.addEventListener("change", (e) => { const language = e.target.value; });
-
Update the map's
raster-tiles
with the new language.Use dark colors for code blocks const languageSelectElement = document.querySelector("#language"); arcgisRest.request(`${baseUrl}/self`, { httpMethod: "GET", authentication: arcgisRest.ApiKeyManager.fromKey(accessToken) }).then((response) => { response.languages.forEach((language) => { const option = document.createElement("option"); option.value = language.code; option.textContent = language.name; languageSelectElement.appendChild(option); }); }); languageSelectElement.addEventListener("change", (e) => { const language = e.target.value; const tilesUrl = url(language); map.getSource("raster-tiles").setTiles([tilesUrl]); });
Run the app
Run the app.
The map should be displayed in English and you should be able to use the controls to switch between language labels.What's next?
Learn how to use additional location services in these tutorials: