diff --git a/public/assets/sunny-unlabeled.json b/public/assets/sunny-unlabeled.json index c941d6fda4..751fbe525b 100644 --- a/public/assets/sunny-unlabeled.json +++ b/public/assets/sunny-unlabeled.json @@ -30,6 +30,47 @@ "fill-color": "#fcf7e5" } }, + { + "id": "landcover_low_zooms", + "type": "fill", + "source": "protomaps", + "source-layer": "landcover", + "paint": { + "fill-color": [ + "match", + [ + "get", + "kind" + ], + "grassland", + "#e5f2c9", + "barren", + "rgba(255, 243, 215, 1)", + "urban_area", + "rgba(230, 230, 230, 1)", + "farmland", + "rgba(216, 239, 210, 1)", + "glacier", + "rgba(255, 255, 255, 1)", + "scrub", + "rgba(234, 239, 210, 1)", + "#f0efdd" + ], + "fill-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 5, + 1, + 7, + 0 + ] + } + }, { "id": "landuse_farmland", "type": "fill", @@ -70,16 +111,13 @@ "source": "protomaps", "source-layer": "landuse", "filter": [ - "any", - [ - "in", - "kind", - "national_park", - "park", - "cemetery", - "nature_reserve", - "golf_course" - ] + "in", + "kind", + "national_park", + "park", + "cemetery", + "nature_reserve", + "golf_course" ], "paint": { "fill-color": [ diff --git a/public/assets/sunny.json b/public/assets/sunny.json index ad969069e4..d106b50582 100644 --- a/public/assets/sunny.json +++ b/public/assets/sunny.json @@ -109,15 +109,14 @@ "type": "fill", "source": "protomaps", "source-layer": "landuse", - "filter": - [ - "in", - "kind", - "national_park", - "park", - "cemetery", - "nature_reserve", - "golf_course" + "filter": [ + "in", + "kind", + "national_park", + "park", + "cemetery", + "nature_reserve", + "golf_course" ], "paint": { "fill-color": [ @@ -3010,19 +3009,16 @@ } }, { - "id": "physical_line_waterway_label", + "id": "water_waterway_label", "type": "symbol", "source": "protomaps", - "source-layer": "physical_line", + "source-layer": "water", "minzoom": 13, "filter": [ - "all", - [ - "in", - "kind", - "river", - "stream" - ] + "in", + "kind", + "river", + "stream" ], "layout": { "symbol-placement": "line", @@ -3120,10 +3116,10 @@ } }, { - "id": "pois_ocean", + "id": "water_label_ocean", "type": "symbol", "source": "protomaps", - "source-layer": "pois", + "source-layer": "water", "filter": [ "any", [ @@ -3168,7 +3164,7 @@ } }, { - "id": "pois_lakes", + "id": "water_label_lakes", "type": "symbol", "source": "protomaps", "source-layer": "water", @@ -3313,7 +3309,7 @@ } }, { - "id": "pois_important", + "id": "pois", "type": "symbol", "source": "protomaps", "source-layer": "pois", diff --git a/src/UI/Map/MapLibreAdaptor.ts b/src/UI/Map/MapLibreAdaptor.ts index eeb788ce5b..da43a4b0dd 100644 --- a/src/UI/Map/MapLibreAdaptor.ts +++ b/src/UI/Map/MapLibreAdaptor.ts @@ -7,11 +7,11 @@ import { ExportableMap, KeyNavigationEvent, MapProperties } from "../../Models/M import SvelteUIElement from "../Base/SvelteUIElement" import MaplibreMap from "./MaplibreMap.svelte" import * as htmltoimage from "html-to-image" -import RasterLayerHandler from "./RasterLayerHandler" import Constants from "../../Models/Constants" import { Protocol } from "pmtiles" import { GeoOperations } from "../../Logic/GeoOperations" import { Feature, LineString } from "geojson" +import RasterLayerHandler from "./RasterLayerHandler" /** * The 'MapLibreAdaptor' bridges 'MapLibre' with the various properties of the `MapProperties` diff --git a/src/UI/Map/MaplibreMap.svelte b/src/UI/Map/MaplibreMap.svelte index 8a2f07a572..515346285f 100644 --- a/src/UI/Map/MaplibreMap.svelte +++ b/src/UI/Map/MaplibreMap.svelte @@ -66,7 +66,6 @@ _map.resize() const canvas = _map.getCanvas() canvas.addEventListener("webglcontextlost", (e) => { - console.warn("A MapLibreMap lost their context. Recovery is", autorecovery, e) try { _map?.remove() } catch (e) { diff --git a/src/UI/Map/ProtomapsLanguageSupport.ts b/src/UI/Map/ProtomapsLanguageSupport.ts new file mode 100644 index 0000000000..c48753ead7 --- /dev/null +++ b/src/UI/Map/ProtomapsLanguageSupport.ts @@ -0,0 +1,5350 @@ +import { Store } from "../../Logic/UIEventSource" +import { + DataDrivenPropertyValueSpecification, + LayerSpecification, + Map as MlMap, + SymbolLayerSpecification +} from "maplibre-gl" +import Locale from "../i18n/Locale" +import { Utils } from "../../Utils" + +export class ProtomapsLanguageSupport { + + private _map: Store + + private static expressions: Record DataDrivenPropertyValueSpecification> = + { + "places_country": language => [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "name:en" + ] + ], + {} + ], + "places_region": language => [ + "step", + [ + "zoom" + ], + [ + "get", + "name:short" + ], + 6, + [ + "case", + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "has", + "script" + ], + [ + "case", + [ + "any", + [ + "is-supported-script", + [ + "get", + "name" + ] + ], + [ + "has", + "pgf:name" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "name:en" + ] + ], + {}, + "\n", + {}, + [ + "case", + [ + "all", + [ + "!", + [ + "has", + "name:" + language + ] + ], + [ + "has", + "name:en" + ], + [ + "!", + [ + "has", + "script" + ] + ] + ], + "", + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "get", + "name:en" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {} + ] + ], + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "has", + "script2" + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ], + [ + "has", + "script3" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "!", + [ + "has", + "script" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "!", + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ] + ] + ], + "places_locality": language => [ + "case", + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "has", + "script" + ], + [ + "case", + [ + "any", + [ + "is-supported-script", + [ + "get", + "name" + ] + ], + [ + "has", + "pgf:name" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "name:en" + ] + ], + {}, + "\n", + {}, + [ + "case", + [ + "all", + [ + "!", + [ + "has", + "name:" + language + ] + ], + [ + "has", + "name:en" + ], + [ + "!", + [ + "has", + "script" + ] + ] + ], + "", + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "get", + "name:en" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {} + ] + ], + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "has", + "script2" + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ], + [ + "has", + "script3" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "!", + [ + "has", + "script" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "!", + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ] + ], + "places_subplace": language => [ + "case", + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "has", + "script" + ], + [ + "case", + [ + "any", + [ + "is-supported-script", + [ + "get", + "name" + ] + ], + [ + "has", + "pgf:name" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "name:en" + ] + ], + {}, + "\n", + {}, + [ + "case", + [ + "all", + [ + "!", + [ + "has", + "name:" + language + ] + ], + [ + "has", + "name:en" + ], + [ + "!", + [ + "has", + "script" + ] + ] + ], + "", + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "get", + "name:en" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {} + ] + ], + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "has", + "script2" + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ], + [ + "has", + "script3" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "!", + [ + "has", + "script" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "!", + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ] + ], + "pois": language => [ + "case", + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "has", + "script" + ], + [ + "case", + [ + "any", + [ + "is-supported-script", + [ + "get", + "name" + ] + ], + [ + "has", + "pgf:name" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "name:en" + ] + ], + {}, + "\n", + {}, + [ + "case", + [ + "all", + [ + "!", + [ + "has", + "name:" + language + ] + ], + [ + "has", + "name:en" + ], + [ + "!", + [ + "has", + "script" + ] + ] + ], + "", + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "get", + "name:en" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {} + ] + ], + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "has", + "script2" + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ], + [ + "has", + "script3" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "!", + [ + "has", + "script" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "!", + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ] + ], + "pois_peak": language => ProtomapsLanguageSupport.simpleExpression(language), + "water_label_lakes": language => ProtomapsLanguageSupport.waterwayExpression(language), + "water_label_ocean": language => ProtomapsLanguageSupport.waterwayExpression(language), + "water_waterway_label": language => ProtomapsLanguageSupport.waterwayExpression(language), + "roads_labels_minor": language => ProtomapsLanguageSupport.roadLabelExpression(language), + "roads_labels_major": language => ProtomapsLanguageSupport.roadLabelExpression(language) + } + + + constructor(map: Store) { + this._map = map + map.addCallbackAndRunD(async (map) => { + this.update() + while (!map.isStyleLoaded()) { + await Utils.waitFor(250) + } + this.update() + map.on("styledata", () => { + this.update() + }) + }) + Locale.language.addCallback(() => this.update()) + } + + private _isUpdating = false + + public update() { + ProtomapsLanguageSupport._update(this._map?.data, Locale.language.data) + } + + private static waterwayExpression(language: string): DataDrivenPropertyValueSpecification { + return ["case", + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "has", + "script" + ], + [ + "case", + [ + "any", + [ + "is-supported-script", + [ + "get", + "name" + ] + ], + [ + "has", + "pgf:name" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "name:en" + ] + ], + {}, + "\n", + {}, + [ + "case", + [ + "all", + [ + "!", + [ + "has", + "name:" + language + ] + ], + [ + "has", + "name:en" + ], + [ + "!", + [ + "has", + "script" + ] + ] + ], + "", + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "get", + "name:en" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {} + ] + ], + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "has", + "script2" + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ], + [ + "has", + "script3" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "!", + [ + "has", + "script" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "!", + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ] + ] + } + + private static simpleExpression(language: string): DataDrivenPropertyValueSpecification { + return [ + "coalesce", + ["get", "name:" + language], + ["get", "name"], + ["get", "name:en"] + ] + } + + private static roadLabelExpression(language: string): DataDrivenPropertyValueSpecification { + return [ + "case", + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "has", + "script" + ], + [ + "case", + [ + "any", + [ + "is-supported-script", + [ + "get", + "name" + ] + ], + [ + "has", + "pgf:name" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "name:en" + ] + ], + {}, + "\n", + {}, + [ + "case", + [ + "all", + [ + "!", + [ + "has", + "name:" + language + ] + ], + [ + "has", + "name:en" + ], + [ + "!", + [ + "has", + "script" + ] + ] + ], + "", + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "get", + "name:en" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {} + ] + ], + [ + "all", + [ + "any", + [ + "has", + "name" + ], + [ + "has", + "pgf:name" + ] + ], + [ + "any", + [ + "has", + "name2" + ], + [ + "has", + "pgf:name2" + ] + ], + [ + "!", + [ + "any", + [ + "has", + "name3" + ], + [ + "has", + "pgf:name3" + ] + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "has", + "script2" + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ], + [ + "case", + [ + "all", + [ + "has", + "script" + ], + [ + "has", + "script2" + ], + [ + "has", + "script3" + ] + ], + [ + "format", + [ + "get", + "name:" + language + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "case", + [ + "!", + [ + "has", + "script" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "!", + [ + "has", + "script2" + ] + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script3" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ], + [ + "format", + [ + "coalesce", + [ + "get", + "name:" + language + ], + [ + "get", + "pgf:name3" + ], + [ + "get", + "name3" + ] + ], + {}, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name" + ], + [ + "get", + "name" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + }, + "\n", + {}, + [ + "coalesce", + [ + "get", + "pgf:name2" + ], + [ + "get", + "name2" + ] + ], + { + "text-font": [ + "case", + [ + "==", + [ + "get", + "script2" + ], + "Devanagari" + ], + [ + "literal", + [ + "Noto Sans Devanagari Regular v1" + ] + ], + [ + "literal", + [ + "Noto Sans Regular" + ] + ] + ] + } + ] + ] + ] + ] + } + + + private static _update(map: MlMap, language: string) { + if (!map) { + return + } + if (!map.isStyleLoaded()) { + map.once("styledata", () => { + ProtomapsLanguageSupport._update(map, language) + }) + return + } + const style = map.getStyle(); + (style.layers ?? []).forEach((layer: LayerSpecification) => { + if (layer.type !== "symbol") { + return + } + const symbolLayer: SymbolLayerSpecification = layer + + if (symbolLayer.source !== "protomaps") { + return + } + const tf = symbolLayer.layout?.["text-field"] + if (tf === undefined) { + return + } + const newExpressionF = ProtomapsLanguageSupport.expressions[layer.id] + if (!newExpressionF) { + console.log(">>> No function found for", layer.id) + return + } + const newExpression = newExpressionF(language) + if (!newExpression) { + return + } + const oldProperty = map.getLayoutProperty(layer.id, "text-field") + if (JSON.stringify(oldProperty) === JSON.stringify(newExpression)) { + return + } + map.setLayoutProperty(layer.id, "text-field", newExpression) + }) + } + + +} diff --git a/src/UI/Map/RasterLayerHandler.ts b/src/UI/Map/RasterLayerHandler.ts index e29ad5eded..99ebac072d 100644 --- a/src/UI/Map/RasterLayerHandler.ts +++ b/src/UI/Map/RasterLayerHandler.ts @@ -4,9 +4,12 @@ import { RasterLayerPolygon } from "../../Models/RasterLayers" import { RasterLayerProperties } from "../../Models/RasterLayerProperties" import { Utils } from "../../Utils" import { VectorSourceSpecification } from "@maplibre/maplibre-gl-style-spec" +import { ProtomapsLanguageSupport } from "./ProtomapsLanguageSupport" class SingleBackgroundHandler { - // Value between 0 and 1.0 + /** + * Current opacity of this layer, Value between 0 and 1.0 + * */ public opacity = new UIEventSource(0.0) private _map: Store private _background: UIEventSource @@ -18,15 +21,18 @@ class SingleBackgroundHandler { */ public static readonly DEACTIVATE_AFTER = 60 private fadeStep = 0.1 + private _languageSupport: ProtomapsLanguageSupport constructor( map: Store, targetLayer: RasterLayerPolygon, - background: UIEventSource + background: UIEventSource, + languageSupport: ProtomapsLanguageSupport ) { this._targetLayer = targetLayer this._map = map this._background = background + this._languageSupport = languageSupport background.addCallback(async () => { await this.update() @@ -64,7 +70,7 @@ class SingleBackgroundHandler { map.removeLayer(this._targetLayer.properties.id) } } catch (e) { - console.warn("Could not (try to) remove the raster layer", e) + // Probably already removed } } @@ -95,7 +101,7 @@ class SingleBackgroundHandler { private async enable() { let ttl = 15 await this.awaitStyleIsLoaded() - while (!this.tryEnable() && ttl > 0) { + while (this._background.data.properties.id === this._targetLayer.properties.id && !this.tryEnable() && ttl > 0) { ttl-- await Utils.waitFor(250) } @@ -137,6 +143,11 @@ class SingleBackgroundHandler { if (background.type === "vector") { const styleToSet = background.style ?? background.url map.setStyle(styleToSet) + this.awaitStyleIsLoaded().then(() => { + console.log("UPDATING") + this._languageSupport.update() + }) + } else { map.addLayer( { @@ -150,6 +161,9 @@ class SingleBackgroundHandler { addLayerBeforeId ) this.opacity.addCallbackAndRun((o) => { + if (map.getStyle() === undefined || map.getLayer(background.id) === undefined) { + return true + } try { map.setPaintProperty(background.id, "raster-opacity", o) } catch (e) { @@ -166,27 +180,43 @@ class SingleBackgroundHandler { Stores.Chronic( 8, () => this.opacity.data > 0 && this._deactivationTime !== undefined - ).addCallback(() => this.opacity.setData(Math.max(0, this.opacity.data - this.fadeStep))) + ).addCallback(() => { + try { + this.opacity.setData(Math.max(0, this.opacity.data - this.fadeStep)) + } catch (e) { + // The layer probably got pruned; we just unregister + return true + } + }) } private fadeIn() { Stores.Chronic( 8, () => this.opacity.data < 1.0 && this._deactivationTime === undefined - ).addCallback(() => this.opacity.setData(Math.min(1.0, this.opacity.data + this.fadeStep))) + ).addCallback(() => { + try { + this.opacity.setData(Math.min(1.0, this.opacity.data + this.fadeStep)) + } catch (e) { + // The layer probably got pruned; we just unregister + return true + } + }) } } export default class RasterLayerHandler { private _singleLayerHandlers: Record = {} + private _languageSupport: ProtomapsLanguageSupport constructor(map: Store, background: UIEventSource) { background.addCallbackAndRunD((l) => { const key = l.properties.id if (!this._singleLayerHandlers[key]) { - this._singleLayerHandlers[key] = new SingleBackgroundHandler(map, l, background) + this._singleLayerHandlers[key] = new SingleBackgroundHandler(map, l, background, this._languageSupport) } }) + this._languageSupport = new ProtomapsLanguageSupport(map) } public static prepareSource( diff --git a/src/assets/global-raster-layers.json b/src/assets/global-raster-layers.json index 22d7468b90..883b28dd41 100644 --- a/src/assets/global-raster-layers.json +++ b/src/assets/global-raster-layers.json @@ -30,7 +30,7 @@ }, { "url": "pmtiles://https://api.protomaps.com/tiles/v4.json?key=2af8b969a9e8b692", - "style": "https://api.protomaps.com/styles/v5/white.json?key=2af8b969a9e8b692", + "style": "https://api.protomaps.com/styles/v5/white/en.json?key=2af8b969a9e8b692", "connect-src": [ "https://protomaps.github.io" ], @@ -63,7 +63,7 @@ "connect-src": [ "https://protomaps.github.io" ], - "style": "https://api.protomaps.com/styles/v5/grayscale.json?key=2af8b969a9e8b692", + "style": "https://api.protomaps.com/styles/v5/grayscale/en.json?key=2af8b969a9e8b692", "id": "protomaps.grayscale", "name": "Protomaps Grayscale", "type": "vector", @@ -78,7 +78,7 @@ "connect-src": [ "https://protomaps.github.io" ], - "style": "https://api.protomaps.com/styles/v5/dark.json?key=2af8b969a9e8b692", + "style": "https://api.protomaps.com/styles/v5/dark/en.json?key=2af8b969a9e8b692", "id": "protomaps.dark", "name": "Protomaps Dark", "type": "vector", @@ -90,7 +90,7 @@ }, { "url": "pmtiles://https://api.protomaps.com/tiles/v4.json?key=2af8b969a9e8b692", - "style": "https://api.protomaps.com/styles/v5/black.json?key=2af8b969a9e8b692", + "style": "https://api.protomaps.com/styles/v5/black/en.json?key=2af8b969a9e8b692", "connect-src": [ "https://protomaps.github.io" ],