UNPKG

vue-maplibre-gl

Version:
48 lines (40 loc) 1.41 kB
import type { ValidLanguages } from '@/types.ts'; import { type LayerSpecification, Map as MaplibreMap } from 'maplibre-gl'; export function setPrimaryLanguage(map: MaplibreMap, lang: ValidLanguages | undefined) { const style = map.getStyle(); if (!style?.layers) return; const langField = lang ? `name:${lang}` : 'name'; function replaceTextField(expr: any): any { if (typeof expr === 'string') { // "{name}" oder "{name:xx}" → coalesce verwenden if (/\{name(:\S+)?\}/.test(expr)) { return [ 'coalesce', [ 'get', langField ], [ 'get', 'name' ] ]; } return expr; } else if (Array.isArray(expr)) { const op = expr[ 0 ]; if (op === 'get') { if (typeof expr[ 1 ] === 'string' && expr[ 1 ].startsWith('name')) { return [ 'coalesce', [ 'get', langField ], [ 'get', 'name' ] ]; } return expr; } else if (op === 'concat' || op === 'format' || op === 'case') { // rekursiv alle Unter-Elemente bearbeiten return expr.map(replaceTextField); } else { // generisch: rekursiv alles bearbeiten return expr.map(replaceTextField); } } return expr; } style.layers.forEach((layer: LayerSpecification) => { if (layer.type !== 'symbol') return; const tf = map.getLayoutProperty(layer.id, 'text-field'); if (!tf) return; const newTf = replaceTextField(tf); if (newTf) { map.setLayoutProperty(layer.id, 'text-field', newTf); } }); }