Skip to content

Change language labels for basemap styles

Learn how to change language labels for basemap styles.

Change language labels for basemap styles using API key authentication

The ArcGIS Basemap Styles service provides a number of different styles that you can use in your OpenLayers applications. 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 use a <select> dropdown menu to toggle between a number of different place label languages.

Prerequisites

You need an ArcGIS Location Platform or ArcGIS Online account.

Steps

Get the starter app

Select a type of authentication below and follow the steps to create a new application.

You can choose one of the following to create a new CodePen:

  • Option 1: Complete the Display a map tutorial; or,
  • Option 2: Start from the Display a map tutorial .

Set up authentication

Create developer credentials in your portal for the type of authentication you selected.

Create a new API key credential with the correct privileges to access the resources used in this tutorial.

  1. Go to the Create an API key tutorial and create an API key with the following privilege(s):
    • Privileges
      • Location services > Basemaps

Set developer credentials

Use the API key or OAuth developer credentials so your application can access ArcGIS services.

  1. Update the accessToken variable to use your API key.

    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83  /* Use for API key authentication */  const accessToken = "YOUR_ACCESS_TOKEN"; 
    Expand

Remove basemap references

  1. Remove the basemapId, basemapURL, and the olms function.

    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83  <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: "https://www.arcgis.com/sharing/rest" // Your portal URL  // })   // const accessToken = session.token;   const map = new ol.Map({ target: "map" });   map.setView(  new ol.View({  center: ol.proj.fromLonLat([-20, 30]),  zoom: 3  })  );   const basemapId = "arcgis/outdoor";   const basemapURL = `https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles/${basemapId}?token=${accessToken}`;   olms.apply(map, basemapURL)   .then(() => {  // Add Esri attribution  // Learn more in https://esriurl.com/attribution  const source = map.getLayers().item(0).getSource();  const poweredByEsriString = "Powered by <a href='https://www.esri.com/en-us/home' target='_blank'>Esri</a> | ";   const attributionFn = source.getAttributions();  if (attributionFn) {  source.setAttributions((ViewStateLayerStateExtent) => {  return [poweredByEsriString, ...attributionFn(ViewStateLayerStateExtent)];  });  }  else source.setAttributions(poweredByEsriString);   });   </script> 
    Expand

Add a language selector

Add a menu that allows users to change the display language of your map. OpenLayers does not have a built-in selector widget, so you will create an HTML <select> element.

  1. In the <head> tag, add CSS that will position the <select> menu wrapper element in the upper right corner and provide styling.

    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  <style>  html,  body,  #map {  padding: 0;  margin: 0;  height: 100%;  width: 100%;  font-family: Arial, Helvetica, sans-serif;  font-size: 14px;  color: #323232;  }    #languages-wrapper {  position: absolute;  top: 20px;  right: 20px;  }   #languages {  font-size: 16px;  padding: 4px 8px;  }    </style> 
    Expand
  2. In the <body> element, add the wrapper tag with an id of languages-wrapper.

    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  <body>  <div id="map"></div>   <div id="languages-wrapper">   </div> 
    Expand
  3. In the wrapper element, add a <select> element, which you will populate in a later step.

    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  <div id="languages-wrapper">   <select id="languages"></select>   </div> 
    Expand

Set the initial language

When the page loads, initialize the app to initially display in Ukrainian.

  1. Create a function called url that creates the URL for a basemap style.

    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  <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 map = new ol.Map({ target: "map" });  map.setView(  new ol.View({  center: ol.proj.fromLonLat([48.8790, 35.7088]),  zoom: 3  })  );   const baseUrl = "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles";  const url = (language) => `${baseUrl}/arcgis/outdoor?token=${accessToken}&language=${language}`; 
    Expand
  2. Create a function called setLanguage that will clear existing basemap layers and use olms to instantiate a basemap layer in the new language.

    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  const baseUrl = "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles";  const url = (language) => `${baseUrl}/arcgis/outdoor?token=${accessToken}&language=${language}`;   const setLanguage = (language) => {  // Clear out existing layers.  map.setLayerGroup(new ol.layer.Group());  // Instantiate the given basemap layer.  olms.apply(map, url(language))  .then(() => {  // Add Esri attribution  // Learn more in https://esriurl.com/attribution  const source = map.getLayers().item(0).getSource();  const poweredByEsriString = "Powered by <a href='https://www.esri.com/en-us/home' target='_blank'>Esri</a> | ";   const attributionFn = source.getAttributions();  if (attributionFn) {  source.setAttributions((ViewStateLayerStateExtent) => {  return [poweredByEsriString, ...attributionFn(ViewStateLayerStateExtent)];  });  }  else source.setAttributions(poweredByEsriString);   });  }; 
    Expand
  3. Access the <select> element using its id.

    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  const basemapsSelectElement = document.querySelector("#languages"); 
    Expand
  4. Import arcgisRest.request() to make a request to the Basemap Styles service. This dynamically fetches the available basemap languages and populates the select element.

    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  <!-- REST JS -->  <script src="https://unpkg.com/@esri/arcgis-rest-request@4/dist/bundled/request.umd.js"></script> 
    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  arcgisRest.request(`${baseUrl}/self`, {  httpMethod: "GET"  }).then(response => {  response.languages.forEach(language => {  const option = document.createElement("option");  option.value = language.code  option.textContent = language.name  basemapsSelectElement.appendChild(option)  })   }) 
    Expand
  1. Call setLanguage to initialize the basemap layer to the Ukrainian (uk) enumeration.

    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  arcgisRest.request(`${baseUrl}/self`, {  httpMethod: "GET"  }).then(response => {  response.languages.forEach(language => {  const option = document.createElement("option");  option.value = language.code  option.textContent = language.name  basemapsSelectElement.appendChild(option)  })   setLanguage(response.languages[0].code)   }) 
    Expand

Add an event listener

Call setLanguage when the user selects an option in the <select> menu.

  1. Add an event listener that calls setLanguage when the <select> element is changed.

    Expand
    Use dark colors for code blocks
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  const basemapsSelectElement = document.querySelector("#languages");   arcgisRest.request(`${baseUrl}/self`, {  httpMethod: "GET"  }).then(response => {  response.languages.forEach(language => {  const option = document.createElement("option");  option.value = language.code  option.textContent = language.name  basemapsSelectElement.appendChild(option)  })   setLanguage(response.languages[0].code)   })   basemapsSelectElement.addEventListener("change", (e) => {  setLanguage(e.target.value);  }); 
    Expand

Run the app

Run the app.

Use the layer switcher menu at the top right to select and explore different basemap layer styles.

What's Next?

Learn how to use additional location services in these tutorials:

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.