WME Speed Display

Displays road speed directly in the center of the segment (taking curves into account) in Waze Map Editor

// ==UserScript==
// @name              WME Speed Display
// @name:pt-BR        WME Exibição de Velocidade
// @namespace         https://greasyfork.org/scripts/526702-wme-speed-display/
// @version           2.1.3
// @description       Displays road speed directly in the center of the segment (taking curves into account) in Waze Map Editor
// @description:pt-BR Exibe a velocidade da via diretamente no centro do segmento (levando em consideração as curvas) no Waze Map Editor
// @author            Luan Tavares
// @icon              data:image/png;base64,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vLDwG/eE8/s3BCkeAAAACXBIWXMAAC4jAAAuIwF4pT92AAADbGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjxkYzpjcmVhdG9yPjxyZGY6U2VxIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpsaT5MdWFuIFRhdmFyZXM8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+PGV4aWY6RGF0ZVRpbWVPcmlnaW5hbD4yMDI1LTAzLTA1VDEzOjEyOjQ0LjUxMDwvZXhpZjpEYXRlVGltZU9yaWdpbmFsPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNyZWF0ZURhdGU+MjAyNS0wMy0wNVQxMzoxMjo0NC41MTA8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/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
// @license           GPLv3
// @include           https://www.waze.com/editor*
// @include           https://www.waze.com/*/editor*
// @include           https://beta.waze.com/*
// @exclude           https://www.waze.com/user/editor*
// @grant             none
// ==/UserScript==

/* 
 * @todo:
 * Check a way to get all road types and groups automatically
 * Script layer switch is not loading based on the saved setting, it is always false in the new SDK
 * When I change the layer switch it does not toggle the layer on and off in the new SDK
 * Change "Hide in segments smaller than" so that it applies transparency instead of ignoring the icon
 * There is a snackbar that makes my wrapper go up and not go down anymore. Identify what it is and fix it
 */

/* global I18n */
/* global getWmeSdk */

// TODO: Remove this when SDK migration is complete
/* global W */

class WmeSpeedDisplay {
    constructor() {
        this.version           = '2.1.3';
        this.debugMode         = false;
        this.needResetSettings = false;
        this.settings          = {};
        this.zIndex            = {
            min: 2065,
            max: 6500,
            warn: 3000,
            warnDisplayed: false
        };

        this.segmentsCategories = {
            highways: [
                {
                    id: 3,
                    name: 'freeway'
                },
                {
                    id: 4,
                    name: 'ramp'
                },
                {
                    id: 6,
                    name: 'major_highway'
                },
                {
                    id: 7,
                    name: 'minor_highway'
                }
            ],
            non_drivable: [
                {
                    id: 18,
                    name: 'railroad'
                },
                {
                    id: 19,
                    name: 'runway_taxiway'
                }
            ],
            other_drivable: [
                {
                    id: 8,
                    name: 'off_road_not_maintained'
                },
                {
                    id: 20,
                    name: 'parking_lot_road'
                },
                {
                    id: 17,
                    name: 'private_road'
                },
                {
                    id: 15,
                    name: 'ferry'
                }
            ],
            streets: [
                {
                    id: 2,
                    name: 'primary_street'
                },
                {
                    id: 1,
                    name: 'street'
                },
                {
                    id: 22,
                    name: 'narrow_street'
                }
            ]
        };

        this.theme = [
            'default',
            'altViennaConv',
            'japan',
            'northAmerica',
            'sacu',
            'uk',
        ];

        this.wmeTranslations = I18n.translations[I18n.locale];
        this.spdTranslations = this.wmeTranslations.wmeSpd = {};

        this.debounce = {
            updateMapDisplay: this.debounce(this.updateMapDisplay.bind(this), 800),
            saveSettings: this.debounce(this.saveSettings.bind(this)),
            onZindexFieldChanged: this.debounce(this.onZindexFieldChanged.bind(this), 1000),
            onSpeedFilterChanged: this.debounce(this.onSpeedFilterChanged.bind(this), 500),
            onSettingsChange: this.debounce(this.onSettingsChange.bind(this), 500)
        };

        
        this.channel = new BroadcastChannel('wmeSpeedDisplay');
        
        this.layerName = 'wme-speed-display-layer';
        
        // TODO: Remove this when SDK migration is complete
        this.layerCheckbox = {
            roadGroup: null,
            speedDisplay: null
        };
        
        this.snackbarWrapper;
        this.displaySpeedsSwitch;
        this.wmeSdk;
        this.layer;
        // TODO: SDK migration
        // this.layerSwitcherElement;

        this.prepareAndInitialize();
    }

    /**
     * Checks if WME is ready to initializes the plugin.
     */
    prepareAndInitialize() {
        this.defineSettings();
        this.defineTranslations();

        this.wmeSdk = getWmeSdk({
            scriptId: 'wme-speed-display',
            scriptName: this.getTranslation('name')
        });

        this.wmeSdk.Events.once({
            eventName: 'wme-ready'
        }).then(this.initializePlugin.bind(this));
     }

    /**
     * Initializes the plugin.
     */
    async initializePlugin() {
        this.logDebug('WME loaded and ready. Starting script...', true);

        // TODO: Remove this when SDK migration is complete
        this.layer = new OpenLayers.Layer.Vector(this.layerName, {
            displayInLayerSwitcher: false,
            rendererOptions: {zIndexing: true}
        });

        // TODO: SDK migration
        // this.layer = this.wmeSdk.Map.addLayer({
        //     layerName: this.layerName,
        //     displayName: this.getTranslation('name'),
        //     shouldDisplayInLayerSwitcher: true,
        //     // styleRules: [
        //     //     {
        //     //         predicate: featureProperties => featureProperties.isHighlighted,
        //     //         style: {
        //     //             strokeColor: 'yellow',
        //     //             strokeWidth: 10,
        //     //         },
        //     //     },
        //     //     {
        //     //         style: { // Default style
        //     //             strokeColor: 'lightgray',
        //     //             strokeWidth: 5,
        //     //         },
        //     //     }
        //     // ]
        // });
        
        // this.wmeSdk.LayerSwitcher.addLayerCheckbox({name: this.getTranslation('name')});

        // this.getLayerSwitcher();
        // TODO: SDK migration - end

        this.setZIndex();
        
        // TODO: Remove this when SDK migration is complete
        W.map.addLayer(this.layer);
        this.addLayerCheckbox();
        // TODO: Remove this when SDK migration is complete - end

        this.createSnackbarWrapper();
        this.observeAllOriginalSnackbars();
        await this.addSettingsTab();
        this.updateSettingsElementsStates();
        this.addShortcut();
        this.addStyle();
        this.checkVersionAndShowChangelog();
        this.listen();

        this.logDebug('Waiting about 1 second for everything to load...');

        await this.sleep(1000);
        
        this.preUpdateMapDisplay();
    }

    /**
     * Method that listens to this script events.
     */
    listen() {
        this.channel.addEventListener('message', this.onChannelMessage.bind(this));
        
        this.wmeSdk.Events.on({
            eventName: 'wme-map-move-end',
            eventHandler: this.preUpdateMapDisplay.bind(this),
        });
        
        this.wmeSdk.Events.on({
            eventName: 'wme-map-zoom-changed',
            eventHandler: this.preUpdateMapDisplay.bind(this),
        });
        
        // TODO: Remove this when SDK migration is complete
        W.model.segments.on('objectschanged', this.preUpdateMapDisplay.bind(this));

        // TODO: SDK migration
        // this.wmeSdk.Events.trackDataModelEvents({dataModelName: 'segments'});
        
        // this.wmeSdk.Events.on({
        //     eventName: 'wme-data-model-objects-changed',
        //     eventHandler: this.preUpdateMapDisplay.bind(this),
        // });
        // TODO: SDK migration - end

        this.wmeSdk.Events.on({
            eventName: 'wme-user-settings-changed',
            eventHandler: this.onUserSettingsChanged.bind(this),
        });

        this.wmeSdk.Events.on({
            eventName: 'wme-map-data-loaded',
            eventHandler: this.preUpdateMapDisplay.bind(this),
        });

        // TODO: SDK migration
        // this.wmeSdk.Events.on({
        //     eventName: 'wme-layer-checkbox-toggled',
        //     eventHandler: this.onLayerSwitcherToggled.bind(this),
        // });
    }

    /**
     * Saves the settings and updates the map display.
     */
    async onSettingsChange() {
        await this.debounce.saveSettings();
        this.preUpdateMapDisplay();
    }

    /**
     * Updates the max zoom value display and triggers map update if the zoom level reaches the max.
     * @param {Event} event
     */
    async onSettingZoomChanged(event) {
        let zoomLevel   = this.wmeSdk.Map.getZoomLevel();
        let newMaxZoom  = parseInt(event.target.value, 10);
        let prevMaxZoom = this.settings.general.spdMaxZoom;

        document.getElementById('spd-max-zoom-value').innerText = newMaxZoom;

        await this.debounce.saveSettings();
    
        let wasVisible      = prevMaxZoom > zoomLevel;
        let shouldBeVisible = newMaxZoom > zoomLevel;
    
        if (wasVisible != shouldBeVisible)
            this.preUpdateMapDisplay();
    }

    /**
     * Updates the filter opacity value and triggers map update when opacity changes.
     * @param {Event} event
     */
    async onSettingOpacityChanged(event) {
        document.getElementById('spd-filter-opacity-value').innerText = parseFloat(event.target.value);

        await this.debounce.saveSettings();
        this.preUpdateMapDisplay();
    }

    /**
     * Handles user settings change.
     */
    onUserSettingsChanged() {
        let speedUnitTexts = document.querySelectorAll('.spd-filter-speed-unit');
        let isImperial     = this.wmeSdk.Settings.getUserSettings().isImperial;

        document.querySelector('.spd-filter-distance-unit').innerHTML = isImperial ? this.wmeTranslations.units_short.feet : this.wmeTranslations.units_short.meters;

        speedUnitTexts.forEach(text => {
            text.innerText = isImperial ? I18n.translate('measurements.speed.mi', {speed: ''}) : I18n.translate('measurements.speed.km', {speed: ''});
        });

        this.preUpdateMapDisplay();
    }

    /**
     * Changes layer's z-index.
     * @param {Event} event 
     */
    increaseOrDecreaseZindex(event) {
        let zIndexInput = document.getElementById('spd-layer-zindex');
        let decrease    = event.target.id == 'spd-btn-zindex-decrease';
    
        let min = this.zIndex.min;
        let max = this.zIndex.max;
    
        let currentZindex = parseInt(zIndexInput.value);
    
        if ((decrease && currentZindex > min) || (!decrease && currentZindex < max)) {
            zIndexInput.value = decrease ? currentZindex - 100 : currentZindex + 100;

            if (!this.zIndex.warnDisplayed)
                this.displayZIndexWarning();

            this.debounce.saveSettings();
            this.setZIndex();
        }
    }

    /**
     * Updates z-index input value within allowed range and saves settings with debounce.
     */
    onZindexFieldChanged() {
        let zIndexInput = document.getElementById('spd-layer-zindex');
        let min         = this.zIndex.min;
        let max         = this.zIndex.max;
        let value       = parseInt(zIndexInput.value, 10) || max;
        value           = Math.min(Math.max(value, min), max);

        zIndexInput.value = value;

        this.settings.general.spdLayerZindex = value;

        if (!this.zIndex.warnDisplayed)
            this.displayZIndexWarning();

        this.debounce.saveSettings();
        this.setZIndex();
    }

    /**
     * Displays a warning alert if the z-index value exceeds the allowed threshold. 
     */
    displayZIndexWarning() {
        if (parseInt(document.getElementById('spd-layer-zindex')?.value, 10) >= this.zIndex.warn && !this.settings.alertDismissed.infoZindex) {
            this.addAlert('info-zindex', this.getTranslation('alertMessage.zIndex'), 'warning');

            this.zIndex.warnDisplayed = true;
        }
    }

    /**
     * Sets the z-index of the layer.
     */
    setZIndex() {
        // TODO: Remove this when SDK migration is complete
        this.layer.setZIndex(this.settings.general.spdLayerZindex);
        
        // TODO: SDK migration
        // this.wmeSdk.Map.setLayerZIndex({
        //     layerName: this.layerName, 
        //     zIndex: this.settings.general.spdLayerZindex
        // });
    }

    /**
     * Resets the z-index of the layer.
     */
    resetZindex() {
        let zIndexInput = document.getElementById('spd-layer-zindex');
        
        this.settings.general.spdLayerZindex = this.zIndex.min;

        zIndexInput.value = this.settings.general.spdLayerZindex;

        this.onZindexFieldChanged();
    }

    /**
     * Save alert dismissed.
     * @param {Event} event
     */
    async onDismissAlert(event) {
        let currentDismissedAlertId = this.convertStringCaseStyle('kebab', 'camel', event.target.parentNode.id);

        this.settings.alertDismissed[currentDismissedAlertId] = true;
        
        await this.debounce.saveSettings();

        let warningGroup       = document.getElementById('spd-alert-group');
        let allAlertsDismissed = warningGroup.querySelectorAll('wz-alert:not([dismissed]), wz-alert[dismissed="false"]');

        if (allAlertsDismissed.length <= 1)
            warningGroup.classList.add('d-none');
    }

    /**
     * Validates the speed filter input's and save settings.
     * @param {Event} event
     */
    onSpeedFilterChanged(event) {
        let minSpeed = parseInt(document.getElementById('spd-min-speed').value) || 0;
        let maxSpeed = parseInt(document.getElementById('spd-max-speed').value) || 0;

        if (maxSpeed > 0 && minSpeed > maxSpeed) {
            this.logDebug('Min speed filter can\'t be bigger than the max speed filter.', false, 'error');

            this.removeAllSnackbars();
            this.addSnackbar('spd-snackbar-error-filtering', `<i class="w-icon w-icon-alert-danger-outline"></i><span><strong>${this.getTranslation('name')}:</strong><br>${this.getTranslation('snackbar.errorFiltering')}</span>`, `<wz-button color="text">${this.wmeTranslations.zoom_in_message.ok}</wz-button>`);

            event.target.value = '';

            return;
        }

        this.onSettingsChange();
    }

    // TODO: SDK migration
    /**
     * Updates the plugin's enabled state in settings when the corresponding checkbox is toggled and changes the plugin's layer visibility.
     * @param {Object} checkboxToggled - The object representing the toggled checkbox.
     * @param {boolean} checkboxToggled.checked - Whether the checkbox is checked or not.
     * @param {String} checkboxToggled.name - The name of the checkbox (used to identify the plugin's settings).
     */
    // async onLayerSwitcherToggled(checkboxToggled) {
    //     if (checkboxToggled.name == this.getTranslation('name')) {
    //         await this.debounce.saveSettings();
    //         this.preUpdateMapDisplay();
    //         this.toggleLayerVisibility();
    //     }
    // }

    /**
     * Select the speed display theme.
     * @param {Event} event 
     */
    async onThemeCardClicked(event) {
        this.selectThemeCard(event.target);
        await this.debounce.saveSettings();
        this.preUpdateMapDisplay();
    }

    /**
     * Simulate a click on the speed display layer switcher.
     */
    simulateLayerSwitchClick() {
        // TODO: Remove this when SDK migration is complete
        this.layerCheckbox.speedDisplay.click();

        // TODO: SDK migration
        // this.layerSwitcherElement.click();
    }

    /**
     * Handles channel messages and sincronizing settings on the others open WME tabs.
     * @param {Event} event 
     */
    onChannelMessage(event) {
        switch (event.data) {
            case 'saved':
                this.defineSettings();
                this.updateSettingsElementsStates();
                this.preUpdateMapDisplay();

                break;
        }

        // TODO: Remove this when SDK migration is complete (just the function param)
        this.toggleLayerVisibility(this.layerCheckbox.roadGroup.checked && this.settings.spdEnabled);
    }

    // TODO: Remove this when SDK migration is complete
    /**
     * Saves and updates the map display when WME SPD checkbox change.
     * @param {Event} event
     */
    onSpeedDisplayCheckboxChange(event) {
        this.debounce.saveSettings();
        this.preUpdateMapDisplay();

        this.toggleLayerVisibility(event.target.checked);
        
        this.displaySpeedsSwitch.checked = event.target.checked;
    }
    
    /**
     * Updates the layer visibility based on the layer switcher road group state.
     */
    onLayerSwithcerGroupRoadChange() {
        let roadGroupActived = this.layerCheckbox.roadGroup.checked;

        this.toggleLayerVisibility(roadGroupActived && this.settings.spdEnabled);

        this.layerCheckbox.speedDisplay.disabled = !roadGroupActived;
        this.displaySpeedsSwitch.disabled        = !roadGroupActived;
    }
    // TODO: Remove this when SDK migration is complete - end

    /**
     * Observes all 'wz-snackbar' elements for changes in children, attributes, or subtree.
     */
    observeAllOriginalSnackbars() {
        let snackbars = document.querySelectorAll('wz-snackbar');
    
        if (snackbars.length === 0) {
            this.logDebug('No "wz-snackbar" found.', false, 'warn');

            return;
        }
    
        snackbars.forEach(snackbar => {
            let observer = new MutationObserver(this.handleMutations.bind(this));
    
            observer.observe(snackbar, {
                childList: true,
                attributes: true,
                subtree: true
            });
    
            this.logDebug(`Observing changes in 'wz-snackbar' with class: ${snackbar.classList.value || 'without class'}`);
        });
    }

    /**
     * Handles mutations by adjusting 'translate' on 'snackbarWrapper' based on shadowRoot content.
     * @param {MutationRecord[]} mutationsList List of observed mutations.
     */
    handleMutations(mutationsList) {
        mutationsList.forEach((mutation) => {
            if (mutation.target.shadowRoot.children.length < 1) {
                this.snackbarWrapper.style.translate = '0px -95px';
                    
            } else {
                this.snackbarWrapper.style.removeProperty('translate');
            }
        });
    }

    /**
     * Attaches event listeners to the settings elements to track user interactions and changes.
     */
    attachSettingsListeners() {
        this.displaySpeedsSwitch.addEventListener('change', this.simulateLayerSwitchClick.bind(this));

        // Change event -> onSettingsChange
        ['spd-show-no-speed', 'spd-show-roundabout', 'spd-show-unpaved', 'spd-hide-segment-smaller-than'].forEach(id => {
            document.getElementById(id).addEventListener('change', this.onSettingsChange.bind(this));
        });

        document.getElementById('spd-max-zoom').addEventListener('input', this.onSettingZoomChanged.bind(this));
        document.getElementById('spd-filter-opacity').addEventListener('input', this.onSettingOpacityChanged.bind(this));

        ['spd-btn-zindex-decrease', 'spd-btn-zindex-increase'].forEach(id => {
            document.getElementById(id).addEventListener('click', this.increaseOrDecreaseZindex.bind(this));
        });

        document.getElementById('spd-btn-reset-z-index').addEventListener('click', this.resetZindex.bind(this));
        document.getElementById('spd-layer-zindex').addEventListener('input', this.debounce.onZindexFieldChanged.bind(this));
        document.getElementById('spd-hide-segment-smaller-than').addEventListener('input', this.onSettingsChange.bind(this));
        document.getElementById('spd-min-speed').addEventListener('input', this.debounce.onSpeedFilterChanged.bind(this));
        document.getElementById('spd-max-speed').addEventListener('input', this.debounce.onSpeedFilterChanged.bind(this));

        document.querySelectorAll('[id^="spd-show-speed-in-"]').forEach(input => {
            input.addEventListener('change', this.onSettingsChange.bind(this));
        });

        document.querySelectorAll('[id^="spd-theme-"]').forEach(card => {
            card.addEventListener('click', this.onThemeCardClicked.bind(this));
        });

        document.getElementById('spd-reset-default-settings').addEventListener('click', this.resetSettings.bind(this));

        if (this.debugMode) {
            document.getElementById('btn-spd-update-settings-tab').addEventListener('click', this.updateSettingsTab.bind(this));
            document.getElementById('btn-spd-test').addEventListener('click', this.addSnackbar.bind(this));
        }

        document.getElementById('btn-spd-open-changelog-dialog').addEventListener('click', this.openChangelogDialog.bind(this));
    }

    /**
     * Detaches event listeners from the settings elements to stop tracking user interactions.
     */
    detachSettingsListeners() {
        this.displaySpeedsSwitch.removeEventListener('change', this.simulateLayerSwitchClick.bind(this));

        // Change event -> onSettingsChange
        ['spd-show-no-speed', 'spd-show-roundabout', 'spd-show-unpaved', 'spd-hide-segment-smaller-than'].forEach(id => {
            document.getElementById(id).removeEventListener('change', this.onSettingsChange.bind(this));
        });

        document.getElementById('spd-max-zoom').removeEventListener('input', this.onSettingZoomChanged.bind(this));
        document.getElementById('spd-filter-opacity').removeEventListener('input', this.onSettingOpacityChanged.bind(this));

        ['spd-btn-zindex-decrease', 'spd-btn-zindex-increase'].forEach(id => {
            document.getElementById(id).removeEventListener('click', this.increaseOrDecreaseZindex.bind(this));
        });

        document.getElementById('spd-btn-reset-z-index').removeEventListener('click', this.resetZindex.bind(this));
        document.getElementById('spd-layer-zindex').removeEventListener('input', this.debounce.onZindexFieldChanged.bind(this));
        document.getElementById('spd-hide-segment-smaller-than').removeEventListener('input', this.onSettingsChange.bind(this));
        document.getElementById('spd-min-speed').removeEventListener('input', this.debounce.onSpeedFilterChanged.bind(this));
        document.getElementById('spd-max-speed').removeEventListener('input', this.debounce.onSpeedFilterChanged.bind(this));

        document.querySelectorAll('[id^="spd-show-speed-in-"]').forEach(input => {
            input.removeEventListener('change', this.onSettingsChange.bind(this));
        });

        document.querySelectorAll('[id^="spd-theme-"]').forEach(card => {
            card.removeEventListener('click', this.onThemeCardClicked.bind(this));
        });

        document.getElementById('spd-reset-default-settings').removeEventListener('click', this.resetSettings.bind(this));

        if (this.debugMode) {
            document.getElementById('btn-spd-update-settings-tab').removeEventListener('click', this.updateSettingsTab.bind(this));
            document.getElementById('btn-spd-test').removeEventListener('click', this.showSpeedDisplayDialog.bind(this));
        }

        document.getElementById('btn-spd-open-changelog-dialog').removeEventListener('click', this.openChangelogDialog.bind(this));
    }

    /**
     * Attaches listeners to close the dialog.
     */
    attachDialogListeners() {
        document.addEventListener('keydown', this.simulateBtnHideDialogClick.bind(this));
        document.querySelector('#spd-dialog-container .dark-overlay').addEventListener('click', this.simulateBtnHideDialogClick.bind(this), {once: true});
        document.getElementById('btn-spd-hide-dialog').addEventListener('click', this.hideSpeedDisplayDialog.bind(this), {once: true});
    }

    /**
     * Updates the map display if the road group checkbox is checked and speed display is enabled, showing a snackbar during the process.
     */
    async preUpdateMapDisplay() {
        if (!this.layerCheckbox.roadGroup.checked || !this.settings.spdEnabled) {
            this.logDebug('Can\'t update the map display.', false, 'warn');

            return;
        }

        let snackbarId = 'spd-snackbar-updating-map';
        
        if (W.map.getZoom() >= this.settings.general.spdMaxZoom)
            this.addSnackbar(snackbarId, '<div class="loader"></div>', null, true);

        await this.debounce.updateMapDisplay();
        this.removeSnackbar(document.getElementById(snackbarId));
    }

    /**
     * Updates the map display by removing old features and adding new speed icons based on the settings.
     */
    // TODO: Remove this when SDK migration is complete
    updateMapDisplay() {
        return new Promise((resolve, reject) => {
            try {
                this.logDebug('Updating map display...');
        
                this.layer.removeAllFeatures();
        
                if (W.map.getZoom() < this.settings.general.spdMaxZoom) {
                    this.logDebug('Maximum zoom exceeded. No speeds will be displayed.', false, 'warn');

                    resolve();
        
                    return;
                }
        
                let segments    = W.model.segments.objects || {};
                let segmentKeys = Object.keys(segments);
        
                if (segmentKeys.length == 0) {
                    this.logDebug('No segments found.', false, 'error');

                    reject();
        
                    return;
                }
        
                this.logDebug(`Total segments loaded: ${segmentKeys.length}`);
        
                segmentKeys.forEach(segmentId => {
                    let segment = segments[segmentId];
        
                    if (!segment || !segment.attributes) {
                        this.logDebug(`Could not find attributes or they are missing on the segment ${segmentId}.`, false, 'error');

                        return;
                    }
        
                    let attributes    = segment.attributes;
                    let roadSettingId = this.convertStringCaseStyle('snake', 'camel', `spd_show_speed_in_${this.getRoadSettingNameById(attributes.roadType)}`);
                    
                    let isLeftHandTraffic = this.wmeSdk.DataModel.Countries.getTopCountry().isLeftHandTraffic;
                    let isFwd             = attributes.fwdDirection;
                    let isRev             = attributes.revDirection;
                    let speedFwd          = this.getSpeed(isLeftHandTraffic ? attributes.revMaxSpeed : attributes.fwdMaxSpeed);
                    let speedRev          = this.getSpeed(isLeftHandTraffic ? attributes.fwdMaxSpeed : attributes.revMaxSpeed);
        
                    let hideNoSpeed        = !this.settings.general.spdShowNoSpeed && ((speedFwd == 'N/A' && speedRev == 'N/A') || (isFwd && !isRev && speedFwd == 'N/A') || (!isFwd && isRev && speedRev == 'N/A') || (!isFwd && !isRev));
                    let ignoreOnRoundabout = attributes.junctionID && !this.settings.general.spdShowRoundabout;
                    let ignoreOnUnpaved    = attributes.flags == 16 && !this.settings.general.spdShowUnpaved;
        
                    if (hideNoSpeed || !this.settings.roads[roadSettingId] || ignoreOnRoundabout || ignoreOnUnpaved) {
                        this.logDebug('This type of segment should not be loaded.', false, 'warn');
        
                        return;
                    }
        
                    let geometry = segment.getOLGeometry();
        
                    if (!geometry || geometry.components.length < 2) {
                        this.logDebug(`Invalid geometry on segment: ${segmentId}.`, false, 'error');
        
                        return;
                    }
                    
                    let minLength     = this.settings.filter.spdHideSegmentSmallerThan;
                    let segmentLength = attributes.length;
                    let opacity       = minLength != null && segmentLength < minLength ? this.getSettingOpacity() : null;

                    let midpoint                = this.calculateMidpoint(geometry);
                    let angle                   = this.calculateAngleAtMidpoint(geometry);
                    let {leftPoint, rightPoint} = this.getPerpendicularPoints(midpoint, angle, 5);
        
                    if (isFwd && isRev && speedFwd != speedRev) {
                        let leftFeature  = new OpenLayers.Feature.Vector(leftPoint, {speed: speedRev});
                        let rightFeature = new OpenLayers.Feature.Vector(rightPoint, {speed: speedFwd});

                        leftFeature.style = {
                            graphic: true,
                            externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedRev)),
                            graphicHeight: 30,
                            graphicWidth: 30,
                            graphicYOffset: -15,
                            graphicXOffset: -15,
                            graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedRev)
                        };

                        rightFeature.style = {
                            graphic: true,
                            externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedFwd)),
                            graphicHeight: 30,
                            graphicWidth: 30,
                            graphicYOffset: -15,
                            graphicXOffset: -15,
                            graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedFwd)
                        };
        
                        this.layer.addFeatures([leftFeature, rightFeature]);
        
                    } else {
                        let speed           = isLeftHandTraffic ? (isFwd ? speedRev : speedFwd) : (isFwd ? speedFwd : speedRev);
                        let centerFeature   = new OpenLayers.Feature.Vector(midpoint, {speed});
                        
                        centerFeature.style = {
                            graphic: true,
                            externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speed, isFwd && isRev)),
                            graphicHeight: 30,
                            graphicWidth: 30,
                            graphicYOffset: -15,
                            graphicXOffset: -15,
                            graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speed)
                        };
        
                        this.layer.addFeatures([centerFeature]);
                    }
                });
        
                this.logDebug('Update finished.');

                resolve();

            } catch (error) {
                this.logDebug(error, false, 'error');
                
                reject(error);
            }
        });
    }
    // TODO: SDK migration
    // updateMapDisplay() {
    //     return new Promise(async (resolve, reject) => {
    //         try {
    //             this.logDebug('Updating map display...');
        
    //             this.wmeSdk.Map.removeAllFeaturesFromLayer({layerName: this.layerName});
        
    //             if (this.wmeSdk.Map.getZoomLevel() < this.settings.general.spdMaxZoom) {
    //                 this.logDebug('Maximum zoom exceeded. No speeds will be displayed.', false, 'warn');

    //                 resolve();
        
    //                 return;
    //             }
        
    //             let segments = await this.wmeSdk.DataModel.Segments.getAll();
        
    //             if (segments.length == 0) {
    //                 this.logDebug('No segments found.', false, 'error');

    //                 reject();
        
    //                 return;
    //             }
        
    //             this.logDebug('Total segments loaded: ' + segments.length);
        
    //             segments.forEach(segment => {
    //                 let roadSettingId = this.convertStringCaseStyle('snake', 'camel', `spd_show_speed_in_${this.getRoadSettingNameById(segment.roadType)}`);
        
    //                 let isLeftHandTraffic = this.wmeSdk.DataModel.Countries.getTopCountry().isLeftHandTraffic;
    //                 let isFwd             = segment.isAtoB;
    //                 let isRev             = segment.isBtoA;
    //                 let isTwoWay          = segment.isTwoWay;
    //                 let speedFwd          = this.getSpeed(isFwd ? (isLeftHandTraffic ? segment.revSpeedLimit : segment.fwdSpeedLimit) : null);
    //                 let speedRev          = this.getSpeed(isRev ? (isLeftHandTraffic ? segment.fwdSpeedLimit : segment.revSpeedLimit) : null);
        
    //                 let hideNoSpeed        = !this.settings.general.spdShowNoSpeed && ((speedFwd == 'N/A' && speedRev == 'N/A') || (isFwd && !isRev && speedFwd == 'N/A') || (!isFwd && isRev && speedRev == 'N/A') || (!isFwd && !isRev && !isTwoWay));
    //                 let ignoreOnRoundabout = segment.junctionId && !this.settings.general.spdShowRoundabout;
    //                 let ignoreOnUnpaved    = segment.flagAttributes.unpaved && !this.settings.general.spdShowUnpaved;
        
    //                 if (hideNoSpeed || !this.settings.roads[roadSettingId] || ignoreOnRoundabout || ignoreOnUnpaved) {
    //                     this.logDebug('This type of segment should not be loaded.', false, 'warn');
        
    //                     return;
    //                 }
        
    //                 let geometry = segment.geometry;
                    
    //                 if (!geometry || geometry.coordinates.length < 2) {
    //                     this.logDebug(`${this.getTranslation('log.invalidGeometry')} ${segment.id}.`, false, 'error');
        
    //                     return;
    //                 }
        
    //                 let minLength     = this.settings.filter.spdHideSegmentSmallerThan;
    //                 let segmentLength = this.getLength(geometry.coordinates);
    //                 let opacity       = minLength != null && segmentLength < minLength ? this.getSettingOpacity() : null;
        
    //                 let midpoint                = this.calculateMidpoint(geometry.coordinates, segmentLength);
    //                 let angle                   = this.calculateAngleAtMidpoint(geometry.coordinates);
    //                 let {leftPoint, rightPoint} = this.getPerpendicularPoints(midpoint, angle, 5);
        
    //                 if (isFwd && isRev && speedFwd != speedRev) {
    //                     this.wmeSdk.Map.addFeaturesToLayer({
    //                         layerName: this.layerName,
    //                         features: [
    //                             {
    //                                 type: 'Feature',
    //                                 id: `speed-${segment.id}-rev`,
    //                                 geometry: {
    //                                     type: 'Point',
    //                                     coordinates: [leftPoint[0], leftPoint[1]]
    //                                 },
    //                                 properties: {
    //                                     speed: speedRev
    //                                 },
    //                                 style: {
    //                                     icon: {
    //                                         type: 'image',
    //                                         url: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedRev)),
    //                                         size: {
    //                                             width: 30,
    //                                             height: 30
    //                                         },
    //                                         anchor: {
    //                                             x: 15,
    //                                             y: 15
    //                                         },
    //                                         opacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedRev)
    //                                     }
    //                                 }
    //                             },
    //                             {
    //                                 type: 'Feature',
    //                                 id: `speed-${segment.id}-fwd`,
    //                                 geometry: {
    //                                     type: 'Point',
    //                                     coordinates: [rightPoint[0], rightPoint[1]]
    //                                 },
    //                                 properties: {
    //                                     speed: speedFwd
    //                                 },
    //                                 style: {
    //                                     icon: {
    //                                         type: 'image',
    //                                         url: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedFwd)),
    //                                         size: {
    //                                             width: 30,
    //                                             height: 30
    //                                         },
    //                                         anchor: {
    //                                             x: 15,
    //                                             y: 15
    //                                         },
    //                                         opacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedFwd)
    //                                     }
    //                                 }
    //                             }
    //                         ]
    //                     });
        
    //                     // let leftFeature   = new OpenLayers.Feature.Vector(leftPoint, {speed: speedRev});
    //                     // leftFeature.style = {
    //                     //     graphic: true,
    //                     //     externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedRev)),
    //                     //     graphicHeight: 30,
    //                     //     graphicWidth: 30,
    //                     //     graphicYOffset: -15,
    //                     //     graphicXOffset: -15,
    //                     //     graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedRev)
    //                     // };
        
    //                     // let rightFeature   = new OpenLayers.Feature.Vector(rightPoint, {speed: speedFwd});
    //                     // rightFeature.style = {
    //                     //     graphic: true,
    //                     //     externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedFwd)),
    //                     //     graphicHeight: 30,
    //                     //     graphicWidth: 30,
    //                     //     graphicYOffset: -15,
    //                     //     graphicXOffset: -15,
    //                     //     graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedFwd)
    //                     // };
        
    //                     // this.layer.addFeatures([leftFeature, rightFeature]);
    //                     // this.layer.addFeatures([leftFeature, rightFeature]);
        
    //                 } else {
    //                     let speed;
        
    //                     if (isFwd && speedFwd != null) {
    //                         speed = speedFwd;
        
    //                     } else if (isRev && speedRev != null) {
    //                         speed = speedRev;
    //                     }
        
    //                     speed = isFwd ? speedFwd : speedRev;
        
    //                     this.wmeSdk.Map.addFeatureToLayer({
    //                         layerName: this.layerName,
    //                         feature: {
    //                             type: 'Feature',
    //                             id: `speed-${segment.id}`,
    //                             geometry: {
    //                                 type: 'Point',
    //                                 coordinates: [midpoint[0], midpoint[1]]
    //                             },
    //                             properties: {
    //                                 speed,
    //                             },
    //                             style: {
    //                                 icon: {
    //                                     type: 'image',
    //                                     url: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speed, isTwoWay)),
    //                                     size: {
    //                                         width: 30,
    //                                         height: 30
    //                                     },
    //                                     anchor: {
    //                                         x: 15,
    //                                         y: 15
    //                                     },
    //                                     opacity: opacity ?? this.calculateOpacityBasedOnSpeed(speed)
    //                                 }
    //                             }
    //                         }
    //                     });
        
    //                     // let centerFeature   = new OpenLayers.Feature.Vector(midpoint, {speed});
    //                     // centerFeature.style = {
    //                     //     graphic: true,
    //                     //     externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speed)),
    //                     //     graphicHeight: 30,
    //                     //     graphicWidth: 30,
    //                     //     graphicYOffset: -15,
    //                     //     graphicXOffset: -15,
    //                     //     graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speed)
    //                     // };
        
    //                     // this.layer.addFeatures([centerFeature]);
    //                 }
    //             });
        
    //             this.logDebug('Update finished.');

    //             resolve();

    //         } catch (error) {
    //             this.logDebug(error, false, 'error');
                
    //             reject(error);
    //         }
    //     });
    // }

    // TODO: Remove this when SDK migration is complete
    /**
     * Toggle visibility of the display of the speed layer.
     * @param {Boolean} enabled
     */
    toggleLayerVisibility(enabled) {
        if (this.layer) {
            this.layer.setVisibility(enabled);
            
            this.logDebug(`Speed layer ${enabled ? 'enabled' : 'disabled'}.`);
        }
    }
    // TODO: SDK migration
    /**
     * Toggle visibility of the display of the speed layer.
     */
    // toggleLayerVisibility() {
    //     if (this.layer) {
    //         let enabled = this.settings.spdEnabled;

    //         this.wmeSdk.Map.setLayerVisibility({layerName: this.layerName, visibility: this.settings.spdEnabled});
            
    //         this.logDebug(`Speed layer ${enabled ? 'enabled' : 'disabled'}.`);
    //     }
    // }

    /**
     * Saves the current settings to localStorage.
     */
    saveSettings() {
        return new Promise((resolve, reject) => {
            try {
                let selectedTheme = this.getSelectedTheme();
                
                // TODO: Remove this when SDK migration is complete
                this.settings.spdEnabled = this.layerCheckbox.speedDisplay.checked;

                // TODO: SDK migration
                // this.settings.spdEnabled = this.layerSwitcherElement.checked;

                ['general', 'filter', 'roads'].forEach(group => this.updateSettingsGroup(group));

                this.settings.theme = selectedTheme?.id ? this.convertStringCaseStyle('kebab', 'camel', selectedTheme.id.replace('spd-theme-', '')) : 'default';
        
                localStorage.setItem('wmeSpeedDisplaySettings', JSON.stringify(this.settings));

                resolve();
                
                this.channel.postMessage('saved');

            } catch (error) {
                this.logDebug(error, false, 'error');
                
                reject(error);
            }
        });
    }

    /**
     * Loads the settings from localStorage or uses the provided settings to initialize the configuration.
     * @param {Object} [savedSettings] - The saved settings object to load; if not provided, it will load from localStorage.
     */
    loadSettings(savedSettings) {
        savedSettings = savedSettings ?? JSON.parse(localStorage.getItem('wmeSpeedDisplaySettings'));

        if (!savedSettings)
            return;

        // To ensure that if it enters a new settings, it doesn't discard them when loading the old settings
        Object.entries(savedSettings).forEach(([setting, value]) => {
            if (typeof value == 'object' && value != null) {
                if (!this.settings[setting])
                    this.settings[setting] = {};
                
                Object.entries(value).forEach(([subSetting, subValue]) => {
                    this.settings[setting][subSetting] = subValue ?? true;
                });
            } else {
                // If the saved theme no longer exists, select the default
                if (setting == 'theme' && !this.theme.includes(value))
                    value = 'default';
                
                this.settings[setting] = value ?? true;
            }
        });
    }

    /**
     * Resets the speed display settings to default.
     */
    async resetSettings() {
        localStorage.removeItem('wmeSpeedDisplaySettings');

        this.zIndex.warnDisplayed = false;

        this.defineSettings();
        this.updateSettingsElementsStates();
        this.resetZindex();
        this.displayZIndexWarning();
        await this.debounce.saveSettings();
        this.preUpdateMapDisplay();
    }

    /**
     * Updates the specified settings group by retrieving values from the corresponding HTML elements.
     * @param {string} group - The settings group to update (e.g., 'general', 'filter', 'roads').
     */
    updateSettingsGroup(group) {
        Object.entries(this.settings[group]).forEach(([setting, _]) => {
            let id      = this.convertStringCaseStyle('camel', 'kebab', setting);
            let element = document.getElementById(id);

            if (!element) {
                this.logDebug(`Setting field not found: ${id}`, false, 'warn');

                return;
            }

            let value;
            
            if (['range', 'number'].includes(element.type)) {
                value = element.value != null ? parseFloat(element.value) : element.value;
                
            } else {
                value = element.checked != undefined ? element.checked : element.value;
            }

            this.settings[group][setting] = value;
        });
    }

    /**
     * Adds a settings tab to the user interface with options to configure the speed display settings.
     */
    addSettingsTab() {
        return new Promise(async (resolve, reject) => {
            try {
                let {tabLabel, tabPane} = await this.wmeSdk.Sidebar.registerScriptTab();
                let speedUnit           = this.wmeSdk.Settings.getUserSettings().isImperial ? I18n.translate('measurements.speed.mi', {speed: ''}) : I18n.translate('measurements.speed.km', {speed: ''});

                tabLabel.innerHTML = this.getTranslation('name');

                let tabPaneHtml = `
                    <div class="segment sidebar-column" style="margin: -15px;">
                        <wz-section-header headline="${this.getTranslation('name')}" size="section-header2" back-button="false">
                            <svg slot="icon" xmlns="http://www.w3.org/2000/svg" width="22px" height="22px" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 1.08 1.08" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xodm="http://www.corel.com/coreldraw/odm/2003">
                                <path fill="var(--leading_icon, #90959c)" d="M0.54 0c0.3,0 0.54,0.24 0.54,0.54 0,0.3 -0.24,0.54 -0.54,0.54 -0.3,0 -0.54,-0.24 -0.54,-0.54 0,-0.3 0.24,-0.54 0.54,-0.54zm-0.18 0.74c0.09,0 0.13,-0.05 0.13,-0.14 0,-0.08 -0.04,-0.13 -0.12,-0.13 -0.01,0 -0.03,0 -0.05,0.01l0.01 -0.06 0.14 0 0 -0.07 -0.2 0 -0.02 0.19 0.07 0.03c0.01,-0.02 0.02,-0.03 0.05,-0.03 0.03,0 0.06,0.02 0.06,0.06 0,0.05 -0.03,0.07 -0.07,0.07 -0.02,0 -0.05,-0.01 -0.08,-0.03l-0.03 0.07c0.03,0.02 0.07,0.03 0.11,0.03zm0.33 -0.33c0.06,0 0.08,0.04 0.08,0.13 0,0.09 -0.03,0.13 -0.08,0.13 -0.05,0 -0.07,-0.04 -0.07,-0.13 0,-0.09 0.02,-0.13 0.07,-0.13zm0 0.33c0.1,0 0.14,-0.07 0.14,-0.2 0,-0.13 -0.04,-0.2 -0.14,-0.2 -0.09,0 -0.14,0.07 -0.14,0.2 0,0.13 0.05,0.2 0.14,0.2zm-0.15 -0.64c0.24,0 0.44,0.2 0.44,0.44 0,0.24 -0.2,0.44 -0.44,0.44 -0.24,0 -0.44,-0.2 -0.44,-0.44 0,-0.24 0.2,-0.44 0.44,-0.44z"/>
                            </svg>
                        </wz-section-header>

                        <div class="segment-edit-section">                  
                            <wz-alerts-group multiline="true" id="spd-alert-group" class="alertsGroup--cx2Lh ${Object.values(this.settings.alertDismissed).every(value => value == true) ? 'd-none' : ''}" style="padding: 0; margin: 15px 15px 15px 15px;"></wz-alerts-group>

                            <wz-tabs>
                                <wz-tab is-active="true" label="${this.getTranslation('title.settings')}" tooltip="${this.getTranslation('title.settings')}">
                                    <div style="display: flex; flex-direction: column; gap: 15px;">
                                        <div>
                                            <wz-label html-for="">${this.getTranslation('label.displaySpeeds')}</wz-label>

                                            <wz-toggle-switch name="spd-display-speeds" checked="${this.settings.spdEnabled}" id="spd-display-speeds" tabindex="0" value="true" disabled="${!this.layerCheckbox.roadGroup.checked}">
                                                <input type="checkbox" name="spd-display-speeds" value="true" style="display: none; visibility: hidden;">
                                            </wz-toggle-switch>
                                        </div>
                                        
                                        <div>
                                            <wz-checkbox checked="${this.settings.general.spdShowNoSpeed}" indeterminate="false" disabled="false" id="spd-show-no-speed" value="true">${this.getTranslation('label.showNoSpeed')}<input type="checkbox" value="true" style="display: none; visibility: hidden;"></wz-checkbox>
                                            <wz-checkbox checked="${this.settings.general.spdShowRoundabout}" indeterminate="false" disabled="false" id="spd-show-roundabout" value="true">${this.getTranslation('label.showOnRoundabout')}<input type="checkbox" value="true" style="display: none; visibility: hidden;"></wz-checkbox>
                                            <wz-checkbox checked="${this.settings.general.spdShowUnpaved}" indeterminate="false" disabled="false" id="spd-show-unpaved" value="true">${this.getTranslation('label.showOnUnpaved')}<input type="checkbox" value="true" style="display: none; visibility: hidden;"></wz-checkbox>
                                        </div>

                                        <div>
                                            <wz-label html-for="">
                                                ${this.getTranslation('label.maxZoom')} <span id="spd-max-zoom-value">${this.settings.general.spdMaxZoom}</span>
                                            </wz-label>

                                            <input type="range" id="spd-max-zoom" min="12" max="22" step="1" value="${this.settings.general.spdMaxZoom}">

                                            <div class="spd-info-message" style="display: flex; justify-content: space-between; width: 100%;">
                                                <span>${this.getTranslation('zoomOut')}</span><span>${this.getTranslation('zoomIn')}</span>
                                            </div>
                                        </div>

                                        <div>
                                            <wz-label html-for="">
                                                ${this.getTranslation('label.opacity')} <span id="spd-filter-opacity-value">${this.settings.general.spdFilterOpacity}</span>
                                            </wz-label>

                                            <input type="range" id="spd-filter-opacity" min="0" max="1" step="0.1" value="${this.settings.general.spdFilterOpacity}">

                                            <div class="spd-info-message" style="display: flex; justify-content: space-between; width: 100%;">
                                                <span>${this.getTranslation('label.min')} 0</span><span>${this.getTranslation('label.max')} 1</span>
                                            </div>
                                        </div>
                                        
                                        <div class="segment-level-select">
                                            <div class="label-container">
                                                <wz-label html-for="">${this.getTranslation('label.zIndex')}</wz-label>
                                                <wz-button color="text" size="sm" disabled="false" id="spd-btn-reset-z-index">${this.getTranslation('reset')}</wz-button>
                                            </div>

                                            <div class="select-container">
                                                <wz-button color="clear-icon" disabled="false" id="spd-btn-zindex-decrease">
                                                    <i class="w-icon w-icon-minus"></i>
                                                </wz-button>
                                                
                                                <wz-text-input size="sm" type="number" id="spd-layer-zindex" min="${this.zIndex.min}" max="${this.zIndex.max}" value="${this.settings.general.spdLayerZindex}" disabled="false" style="width: 100%;">
                                                    <input style="display: none; visibility: hidden;">
                                                </wz-text-input>
                                                
                                                <wz-button color="clear-icon" disabled="false" id="spd-btn-zindex-increase">
                                                    <i class="w-icon w-icon-plus"></i>
                                                </wz-button>
                                            </div>
                                        </div>
                                    </div>
                                </wz-tab>

                                <wz-tab is-active="false" label="${this.getTranslation('title.roadTypes')}" tooltip="${this.getTranslation('title.roadTypes')}">
                                    <div>
                                        <wz-label html-for="" style="margin:0">${this.getTranslation('title.showOnRoadType')}</wz-label>`;

                Object.entries(this.segmentsCategories).forEach(segmentCategory => {
                    tabPaneHtml += `<wz-menu-title style="padding:0;">${this.wmeTranslations.segment.categories[segmentCategory[0]]}</wz-menu-title>`;

                    Object.values(segmentCategory[1]).forEach(roadType => {
                        let id        = this.convertStringCaseStyle('snake', 'kebab', `spd_show_speed_in_${roadType.name}`);
                        let settingId = this.convertStringCaseStyle('kebab', 'camel', id);
                        let checked   = this.settings.roads[settingId];

                        tabPaneHtml += `<wz-checkbox checked="${checked}" indeterminate="false" disabled="false" id="${id}" value="true">${this.wmeTranslations.segment.road_types[roadType.id]}<input type="checkbox" value="true" style="display: none; visibility: hidden;"></wz-checkbox>`;
                    });
                });

                tabPaneHtml += `
                                    </div>
                                </wz-tab>

                                <wz-tab is-active="false" label="${this.getTranslation('title.filter')}" tooltip="${this.getTranslation('title.filter')}">
                                    <div style="display: flex; flex-direction: column; gap: 15px;">
                                        <div>
                                            <wz-label html-for="">${this.getTranslation('label.hideShorterSegments')}</wz-label>

                                            <div class="speedLimit--ZIWbK" style="margin-bottom: 0">
                                                <wz-text-input size="sm" type="number" id="spd-hide-segment-smaller-than"  min="0" max="9999" value="${this.settings.filter.spdHideSegmentSmallerThan}" disabled="false" class="speedLimitInput--aWKs1">
                                                    <input style="display: none; visibility: hidden;">
                                                </wz-text-input>

                                                <span class="spd-filter-distance-unit">${this.wmeSdk.Settings.getUserSettings().isImperial ? this.wmeTranslations.units_short.feet : this.wmeTranslations.units_short.meters}</span>
                                            </div>
                                        </div>
                                        
                                        <div>
                                            <wz-label html-for="">${this.getTranslation('label.speedFilter')}</wz-label>
                                            <div class="speedLimit--ZIWbK">
                                                <div class="directionLabel--U8iep">${this.getTranslation('label.min')}</div>

                                                <wz-text-input size="sm" type="number" id="spd-min-speed" min="0" max="999" value="${this.settings.filter.spdMinSpeed}" disabled="false" class="speedLimitInput--aWKs1">
                                                    <input style="display: none; visibility: hidden;">
                                                </wz-text-input>

                                                <span class="spd-filter-speed-unit">${speedUnit}</span>
                                            </div>

                                            <div class="speedLimit--ZIWbK"  style="margin-bottom: 0">
                                                <div class="directionLabel--U8iep">${this.getTranslation('label.max')}</div>

                                                <wz-text-input size="sm" type="number" id="spd-max-speed" min="0" max="999" value="${this.settings.filter.spdMaxSpeed}" disabled="false" class="speedLimitInput--aWKs1">
                                                    <input style="display: none; visibility: hidden;">
                                                </wz-text-input>

                                                <span class="spd-filter-speed-unit">${speedUnit}</span>
                                            </div>
                                        </div>
                                    </div>
                                </wz-tab>

                                <wz-tab is-active="false" label="${this.getTranslation('title.appearence')}" tooltip="${this.getTranslation('title.appearence')}">
                                    <div style="display: flex; flex-direction: column; gap: 15px;">
                                        <div class="drives-container">
                                            <div class="drive-list">`;
                
                this.theme.forEach(theme => {
                    tabPaneHtml += `
                                                <wz-card id="spd-theme-${this.convertStringCaseStyle('camel', 'kebab', theme)}" selected="${this.settings.theme == theme}" elevation-on-hover="4" class="list-item-card drive-list-item">
                                                    <div class="list-item-card-layout">
                                                        ${this.getSpeedIcon(60, theme == 'uk', theme)}

                                                        <div class="list-item-card-info">
                                                            <div class="list-item-card-title">${this.getTranslation('theme.' + theme)}</div>
                                                        </div>
                                                    </div>
                                                </wz-card>`;
                });
                
                tabPaneHtml += `
                                            </div>
                                        </div>
                                    </div>
                                </wz-tab>
                            </wz-tabs>
                            
                            <div class="form-group">
                                <div style="display: flex; flex-direction: column; gap: 15px; padding: 0 15px;">
                                    <wz-button color="secondary" id="spd-reset-default-settings">${this.getTranslation('btn.resetSettings')}</wz-button>`;

                if (this.debugMode) {
                    tabPaneHtml += `
                                    <wz-button color="primary" id="btn-spd-update-settings-tab">${this.getTranslation('btn.updateSettingsTab')}</wz-button>
                                    <wz-button color="secondary" id="btn-spd-test">Test something</wz-button>`;
                }

                tabPaneHtml += `
                                    <wz-button color="text" size="sm" id="btn-spd-open-changelog-dialog" title="${this.getTranslation('viewChangelog')}"><b>${this.getTranslation('name')}</b> v${this.version}</wz-button>

                                    <a href="https://www.waze.com/discuss/t/script-wme-speed-display/373172" target="_blank" style="width: 100%">
                                        <wz-button color="text" size="sm" title="${this.getTranslation('title.seeOnDiscuss')}" style="width: 100%">${this.getTranslation('btn.seeOnDiscuss')}</wz-button>
                                    </a>

                                    <a href="https://discord.gg/T6cDTGZj" target="_blank" style="width: 100%">
                                        <wz-button color="text" size="sm" title="${this.getTranslation('title.seeOnDiscord')}" style="width: 100%">${this.getTranslation('btn.seeOnDiscord')}</wz-button>
                                    </a>

                                    <a href="https://www.waze.com/pt-BR/user/editor/luan_tavares_127" target="_blank" style="width: 100%">
                                        <wz-button color="text" size="sm" title="${this.getTranslation('title.scriptDevBy')}" style="width: 100%">${this.getTranslation('btn.scriptDevBy')}</wz-button>
                                    </a>
                                </div>
                            </div>
                        </div>
                    </div>`;

                tabPane.innerHTML = tabPaneHtml;

                if (!this.settings.alertDismissed.infoToggleVisibility)
                    this.addAlert('info-toggle-visibility', this.getTranslation('alertMessage.toggleVisibility'));
                
                if (!this.zIndex.warnDisplayed)
                    this.displayZIndexWarning();

                this.displaySpeedsSwitch = document.getElementById('spd-display-speeds');
                
                this.attachSettingsListeners();

                this.logDebug('Settings tab added.');

                resolve();

            } catch (error) {
                this.logDebug(error, false, 'error');
                
                reject(error);
            }
        });
    }

    /**
     * Updates the settings tab by removing the old one and adding a new one with updated settings.
     */
    async updateSettingsTab() {
        this.logDebug('Updating settings tab...');

        this.detachSettingsListeners();
        this.defineTranslations();

        this.wmeSdk.Sidebar.removeScriptTab();

        await this.addSettingsTab();
        this.updateSettingsElementsStates();
        
        if (!this.zIndex.warnDisplayed)
            this.displayZIndexWarning();
    }

    /**
     * Updates the state of the settings elements (checkboxes, inputs) based on the current settings.
     */
    updateSettingsElementsStates() {
        // TODO: Remove this when SDK migration is complete
        this.layerCheckbox.speedDisplay.checked = this.settings.spdEnabled;
        
        // TODO: SDK migration
        // this.layerSwitcherElement.checked = this.settings.spdEnabled;

        if (this.displaySpeedsSwitch) {
            this.displaySpeedsSwitch.checked  = this.settings.spdEnabled;
            this.displaySpeedsSwitch.disabled = !this.layerCheckbox.roadGroup.checked;
        }
        
        Object.entries(this.settings.general).forEach(([setting, value]) => {
            let id      = this.convertStringCaseStyle('camel', 'kebab', setting);
            let element = document.getElementById(id);

            if (!element)
                return;

            switch (element.type) {
                case 'number':
                    element.value = (value == null || value == 0) ? '' : value;

                    break;
                    
                case 'range':
                    element.value                                    = value;
                    document.getElementById(`${id}-value`).innerText = value;

                    break;

                default:
                    element.checked = value;
            }
        });

        document.querySelectorAll('[id^="spd-show-speed-in-"]').forEach(input => {
            let settingId = this.convertStringCaseStyle('kebab', 'camel', input.id);

            input.checked = this.settings.roads[settingId];
        });

        Object.entries(this.settings.filter).forEach(([setting, value]) => {
            let id      = this.convertStringCaseStyle('camel', 'kebab', setting);
            let element = document.getElementById(id);

            if (!element)
                return;

            element.value = (value == null || value == 0) ? '' : value;
        });

        this.selectThemeCard(document.querySelector(`wz-card#spd-theme-${this.convertStringCaseStyle('camel', 'kebab', this.settings.theme)}`));
    }

    /**
     * Adds a global keyboard shortcut listener and add the script shortcut on shortcuts dialog.
     */
    addShortcut() {
        this.wmeSdk.Shortcuts.createShortcut({
            callback: this.shortcutCallback.bind(this),
            description: this.getTranslation('label.toggleLayerShortcut'),
            shortcutId: 'ks-wme-speed-display',
            shortcutKeys: 'AS+s',
        });
    }

    /**
     * Toggles the layer switcher speed display when shortcut is pressed.
     */
    shortcutCallback() {
        // TODO: Remove this when SDK migration is complete
        this.layerCheckbox.speedDisplay.click();
        
        this.displaySpeedsSwitch.checked = this.layerCheckbox.speedDisplay.checked;
        // TODO: Remove this when SDK migration is complete - end
        
        // TODO: SDK migration
        // this.layerSwitcherElement.click();

        // this.displaySpeedsSwitch.checked = this.layerSwitcherElement.checked;
        // TODO: SDK migration - end
    }

    // TODO: Remove this when SDK migration is complete
    /**
     * Calculates the real midpoint of a segment, considering curves.
     * @param {OpenLayers.Geometry.LineString} geometry Segment geometry.
     * 
     * @returns {OpenLayers.Geometry.Point} Real midpoint.
     */
    calculateMidpoint(geometry) {
        let length           = geometry.getLength();
        let cumulativeLength = 0;

        for (let i = 0; i < geometry.components.length - 1; i++) {
            let start         = geometry.components[i];
            let end           = geometry.components[i + 1];
            let segmentLength = start.distanceTo(end);

            if (cumulativeLength + segmentLength >= length / 2) {
                let ratio = (length / 2 - cumulativeLength) / segmentLength;

                return new OpenLayers.Geometry.Point(
                    start.x + ratio * (end.x - start.x),
                    start.y + ratio * (end.y - start.y)
                );
            }

            cumulativeLength += segmentLength;
        }

        return geometry.getCentroid();
    }
    // TODO: SDK migration
    /**
     * Calculates the real midpoint of a segment, considering curves.
     * @param {Array} coordinates - Array of [longitude, latitude] pairs representing the segment geometry.
     *
     * @returns {Array} The midpoint as an array [longitude, latitude].
     */
    // calculateMidpoint(coordinates) {
    //     let totalLength      = this.getLength(coordinates);
    //     let cumulativeLength = 0;
    
    //     for (let i = 0; i < coordinates.length - 1; i++) {
    //         let start         = coordinates[i];
    //         let end           = coordinates[i + 1];
    //         let segmentLength = this.getDistance(start, end);
    
    //         if (cumulativeLength + segmentLength >= totalLength / 2) {
    //             let ratio = (totalLength / 2 - cumulativeLength) / segmentLength;
    
    //             return [
    //                 start[0] + ratio * (end[0] - start[0]),
    //                 start[1] + ratio * (end[1] - start[1])
    //             ];
    //         }
    
    //         cumulativeLength += segmentLength;
    //     }
    
    //     // If something goes wrong, return a simple midpoint as a fallback
    //     let firstPoint = coordinates[0];
    //     let lastPoint  = coordinates[coordinates.length - 1];
    
    //     return [
    //         (firstPoint[0] + lastPoint[0]) / 2,
    //         (firstPoint[1] + lastPoint[1]) / 2
    //     ];
    // }

    /**
     * Generates an SVG icon with the speeds.
     * @param {String} speed The speed.
     * @param {Boolean} [sameSpeedBothWays] It is the segment two ways with same speed? (default: false)
     * @param {String} [theme] Force a theme. (default: this.settings.theme)
     *
     * @returns {String} SVG in string format.
     */
    getSpeedIcon(speed, sameSpeedBothWays = false, theme) {
        let icon;

        theme = theme ?? this.settings.theme;

        switch (theme) {
            case 'altViennaConv':
                icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
                        <circle cx="25" cy="25" r="21" fill="#FBE353" stroke="#FF5251" stroke-width="5"/>
                        <text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
                    </svg>`;
                
                break;
                
            case 'japan':
                icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
                        <circle cx="25" cy="25" r="21" fill="white" stroke="#FF5251" stroke-width="5"/>
                        <text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#0074E3" text-anchor="middle">${speed}</text>
                    </svg>`;
                
                break;

            case 'northAmerica':
                icon = `
                    <svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
                        <rect x="2.5" y="2.5" width="45" height="45" fill="white" stroke="#1F2125" stroke-width="3" rx="5"/>
                        <text x="25" y="12" font-size="9" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">SPEED</text>
                        <text x="25" y="22" font-size="9" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">LIMIT</text>
                        <text x="25" y="42" font-size="22" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
                    </svg>`;

                break;
                
            case 'sacu':
                icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
                        <circle cx="25" cy="25" r="21" fill="#235AA9" stroke="#FF5251" stroke-width="5"/>
                        <text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="white" text-anchor="middle">${speed}</text>
                    </svg>`;
                
                break;

            case 'uk':
                if (sameSpeedBothWays && [60, 70].includes(speed)) {
                    icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
                            <circle cx="25" cy="25" r="21" fill="white" stroke="#1F2125" stroke-width="2"/>
                            <line x1="10" y1="40" x2="40" y2="10" stroke="#1F2125" stroke-width="9"/>
                        </svg>`;

                } else {
                    icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
                            <circle cx="25" cy="25" r="21" fill="white" stroke="#FF5251" stroke-width="5"/>
                            <text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
                        </svg>`;
                }
                
                break;

            default:
                icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
                        <circle cx="25" cy="25" r="21" fill="white" stroke="#FF5251" stroke-width="5"/>
                        <text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
                    </svg>`;
        }
        
        return icon;
    }

    /**
     * Calculates the opacity of a speed icon based on speed filter settings.
     * @param {number} speed - The speed value to evaluate.
     * 
     * @returns {number} Opacity value (1 for visible, this.settings.general.spdFilterOpcaity for dimmed) depending on whether the speed falls within the defined min and max speed range.
     */
    calculateOpacityBasedOnSpeed(speed) {
        let minSpeed = parseInt(this.settings.filter.spdMinSpeed, 10);
        let maxSpeed = parseInt(this.settings.filter.spdMaxSpeed, 10);
        let validMin = isNaN(minSpeed) || minSpeed <= 0 || speed >= minSpeed;
        let validMax = isNaN(maxSpeed) || maxSpeed <= 0 || speed <= maxSpeed;
        let opacity  = this.getSettingOpacity();
    
        return validMin && validMax ? 1 : opacity;
    }

    /**
     * Get the opacity value defined in the settings.
     * @returns {number} Opacity value.
     */
    getSettingOpacity() {
        return this.settings.general.spdFilterOpacity < 0.1 ? 0.01 : this.settings.general.spdFilterOpacity;
    }

    // TODO: Remove this when SDK migration is complete
    /**
     * Calculates the angle at the midpoint of a geometry based on its components.
     * @param {Object} geometry - The geometry with points.
     * 
     * @returns {number} The angle in radians at the midpoint.
     */
    calculateAngleAtMidpoint(geometry) {
        let totalLength      = geometry.getLength();
        let cumulativeLength = 0;

        for (let i = 0; i < geometry.components.length - 1; i++) {
            let start = geometry.components[i];
            let end   = geometry.components[i + 1];

            if (!start || !end) continue;

            let segmentLength = start.distanceTo(end);

            if (cumulativeLength + segmentLength >= totalLength / 2)
                return Math.atan2(end.y - start.y, end.x - start.x);

            cumulativeLength += segmentLength;
        }

        if (geometry.components.length >= 2) {
            let firstPoint = geometry.components[0];
            let lastPoint  = geometry.components[geometry.components.length - 1];

            return Math.atan2(lastPoint.y - firstPoint.y, lastPoint.x - firstPoint.x);
        }

        this.logDebug(this.spdTranslations.log.insufficientGeometryAngleCalc, false, 'error');

        return 0;
    }
    // TODO: SDK migration
    /**
     * Calculates the angle at the midpoint of a geometry based on its components.
     * @param {Array} coordinates - The geometry coordinates.
     * 
     * @returns {Number} The angle in radians at the midpoint.
     */
    // calculateAngleAtMidpoint(coordinates) {
    //     let totalLength      = this.getLength(coordinates);
    //     let cumulativeLength = 0;

    //     for (let i = 0; i < coordinates.length - 1; i++) {
    //         let start = coordinates[i];
    //         let end   = coordinates[i + 1];

    //         if (!start || !end) continue;

    //         let segmentLength = this.getDistance(start, end);

    //         if (cumulativeLength + segmentLength >= totalLength / 2)
    //             return Math.atan2(end.y - start.y, end.x - start.x);

    //         cumulativeLength += segmentLength;
    //     }

    //     if (coordinates.length >= 2) {
    //         let firstPoint = coordinates[0];
    //         let lastPoint  = coordinates[coordinates.length - 1];

    //         return Math.atan2(lastPoint.y - firstPoint.y, lastPoint.x - firstPoint.x);
    //     }

    //     this.logDebug('Insufficient geometry for angle calculation.', false, 'error');

    //     return 0;
    // }

    /**
     * Calculates the distance in meters between two geographic coordinates using the Haversine formula.
     * @param {Array} startPoint - The starting point [longitude, latitude].
     * @param {Array} endPoint - The ending point [longitude, latitude].
     *
     * @returns {Number} The distance in meters between the two points.
     */
    getDistance(startPoint, endPoint) {
        let earthRadius      = 6371000;
        let latitude1        = this.toRadians(startPoint[1]);
        let latitude2        = this.toRadians(endPoint[1]);
        let deltaLatitude    = this.toRadians(endPoint[1] - startPoint[1]);
        let deltaLongitude   = this.toRadians(endPoint[0] - startPoint[0]);
        let haversineFormula = Math.sin(deltaLatitude / 2) * Math.sin(deltaLatitude / 2) + Math.cos(latitude1) * Math.cos(latitude2) * Math.sin(deltaLongitude / 2) * Math.sin(deltaLongitude / 2);
        let centralAngle     = 2 * Math.atan2(Math.sqrt(haversineFormula), Math.sqrt(1 - haversineFormula));
    
        return earthRadius * centralAngle;
    }

    /**
     * Converts an angle from degrees to radians.
     * @param {Number} angle - The angle in degrees.
     *
     * @returns {Number} The angle in radians.
     */
    toRadians(angle) {
        return angle * (Math.PI / 180);
    }

    /**
     * Returns two perpendicular points (left and right) from a midpoint at a given angle and distance, adjusted by map zoom.
     * @param {Object} midpoint - Central point with `x` and `y` coordinates.
     * @param {Number} angle - Angle in radians from the reference direction.
     * @param {Number} baseDistance - Base distance from the midpoint before zoom adjustment.
     * 
     * @returns {Object} {leftPoint, rightPoint} - Perpendicular points to the left and right.
     */
    getPerpendicularPoints(midpoint, angle, baseDistance) {
        let currentZoom      = this.wmeSdk.Map.getZoomLevel();
        let referenceZoom    = 19;
        let scaleFactor      = Math.pow(2, referenceZoom - currentZoom);
        let adjustedDistance = baseDistance * scaleFactor;

        let angleLeft  = angle + Math.PI / 2;
        let angleRight = angle - Math.PI / 2;

        // TODO: Remove this when SDK migration is complete
        let leftPoint = new OpenLayers.Geometry.Point(
            midpoint.x + adjustedDistance * Math.cos(angleLeft),
            midpoint.y + adjustedDistance * Math.sin(angleLeft)
        );

        let rightPoint = new OpenLayers.Geometry.Point(
            midpoint.x + adjustedDistance * Math.cos(angleRight),
            midpoint.y + adjustedDistance * Math.sin(angleRight)
        );
        // TODO: Remove this when SDK migration is complete - end

        // TODO: SDK migration
        // let leftPoint = [
        //     midpoint.x + adjustedDistance * Math.cos(angleLeft),
        //     midpoint.y + adjustedDistance * Math.sin(angleLeft)
        // ];

        // let rightPoint = [
        //     midpoint.x + adjustedDistance * Math.cos(angleRight),
        //     midpoint.y + adjustedDistance * Math.sin(angleRight)
        // ];
        // TODO: SDK migration -end

        return {
            leftPoint,
            rightPoint
        };
    }

    /**
     * Returns speed in mph/kmh or 'N/A'.
     * @param {Number} speed The speed value in kilometers per hour (km/h) to be formatted.
     * 
     * @returns {(Number|String)} The speed.
     */
    getSpeed(speed) {
        if (!speed)
            return 'N/A';

        return this.wmeSdk.Settings.getUserSettings().isImperial ? Math.round(speed * 0.621371) : speed;
    }

    /** 
     * Returns length in feet (rounded) if imperial units are preferred; otherwise, returns meters. 
     * @param {Array} coordinates - The length value in meters to be converted.
     * @param {Boolean} [forceMeters] - If needs to force results in meters.
     *
     * @returns {Number} The converted length in feet or the original length in meters.
     */
    getLength(coordinates, forceMeters = false) {
        let totalDistance = 0;
    
        // Iterate over the coordinates and add the distance between consecutive points
        for (let i = 0; i < coordinates.length - 1; i++) {
            let pointA = {
                lat: coordinates[i][1],
                lng: coordinates[i][0]
            };

            let pointB = {
                lat: coordinates[i + 1][1],
                lng: coordinates[i + 1][0]
            };
    
            totalDistance += this.calculateDistance(pointA, pointB);
        }
    
        return this.wmeSdk.Settings.getUserSettings().isImperial && !forceMeters ? Math.round(totalDistance * 3.28084) : totalDistance;
    }

    /**
     * Calculates the distance between two points using the Haversine formula.
     * @param {Array} pointA The first point, containing latitude (lat) and longitude (lng).
     * @param {Array} pointB The second point, containing latitude (lat) and longitude (lng).
     * @returns 
     */
    calculateDistance(pointA, pointB) {
        let earthRadius = 6371e3;
        let latitudeA   = pointA.lat * Math.PI / 180;
        let latitudeB   = pointB.lat * Math.PI / 180;
    
        // Calculate the differences in coordinates
        let deltaLatitude  = (pointB.lat - pointA.lat) * Math.PI / 180;
        let deltaLongitude = (pointB.lng - pointA.lng) * Math.PI / 180;
    
        // Haversine formula
        let haversineComponent = Math.sin(deltaLatitude / 2) * Math.sin(deltaLatitude / 2) + Math.cos(latitudeA) * Math.cos(latitudeB) * Math.sin(deltaLongitude / 2) * Math.sin(deltaLongitude / 2);
        let angularDistance    = 2 * Math.atan2(Math.sqrt(haversineComponent), Math.sqrt(1 - haversineComponent));
    
        // Calculate the distance in meters
        let distance = earthRadius * angularDistance;

        return distance;
    }

    /**
     * Makes a "dramatic" pause in the code.
     * @param {Number} ms Pause time in milliseconds.
     */
    async sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    /**
     * Returns a function with delay.
     * @param {Object} func Function that will be called with delay.
     * @param {Number} [timeout] Delay time in milliseconds. (default: 300)
     *
     * @returns {Function} Function
     */
    debounce(func, timeout = 300) {
        let promise = null;
        let timer;
    
        return (...args) => {
            clearTimeout(timer);
    
            return new Promise((resolve, reject) => {
                timer = setTimeout(async () => {
                    try {
                        promise    = func.apply(this, args);
                        let result = await promise;

                        resolve(result);
                        
                    } catch (error) {
                        reject(error);
                    }
                }, timeout);
            });
        };
    }

    /**
     * Converts a string from one case style to another (camel, snake, kebab).
     * @param {String} fromType - The original string case ('camel', 'snake', or 'kebab').
     * @param {String} toType - The target string case ('camel', 'snake', or 'kebab').
     * @param {String} string - The string to be converted.
     * 
     * @returns {String} The converted string.
     */
    convertStringCaseStyle(fromType, toType, string) {
        if (fromType == toType)
            return string;

        let conversionMap = {
            camel: {
                kebab: str => str.match(/[A-Z]?[a-z]+|[0-9]+/g).join('-').toLowerCase(),
                snake: str => str.match(/[A-Z]?[a-z]+|[0-9]+/g).join('_').toLowerCase()
            },
            snake: {
                kebab: str => str.replace(/_/g, '-'),
                camel: str => str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())
            },
            kebab: {
                camel: str => str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()),
                snake: str => str.replace(/-/g, '_')
            }
        };

        return conversionMap[fromType]?.[toType]?.(string) || string;
    }

    /**
     * Retrieves the road setting name by its ID from the segments categories.
     * @param {String} id - The ID of the road setting.
     * 
     * @returns {(String|null)} The name of the road setting if found, otherwise null.
     */
    getRoadSettingNameById(id) {
        for (let category of Object.values(this.segmentsCategories)) {
            let segment = category.find(item => item.id == id);

            if (segment)
                return segment.name;
        }

        // Returns null if ID is not found
        return null;
    }

    /**
     * Logs a debug message to the console if debug mode is enabled or forceMessage is true.
    * @param {String} message - The message to log.
    * @param {boolean} [forceMessage] - Whether to log the message regardless of the debug mode setting.
    * @param {String} [type] - The type of message ('warn', or 'error'). Default is 'log'.
     */
    logDebug(message, forceMessage = false, type) {
        if (this.debugMode || forceMessage)
            (console[type] || console.log)(`[WME Speed Display v${this.version}]: ${message}`);
    }

    // TODO: Remove this when SDK migration is complete
    /**
     * Adds a checkbox to the layer switcher to toggle the speed display layer visibility.
     */
    addLayerCheckbox() {
        let houseNumbersCheckbox     = document.getElementById('layer-switcher-item_house_numbers');
        this.layerCheckbox.roadGroup = document.getElementById('layer-switcher-group_road');

        if (!houseNumbersCheckbox) {
            this.logDebug('The "House Numbers" checkbox was not found. Trying again...', false, 'warn');

            setTimeout(() => this.addLayerCheckbox(), 1000);

            return;
        }

        let layerItem       = document.createElement('li');
        layerItem.innerHTML = `
            <div class="layer-selector">
                <wz-checkbox id="layer-switcher-item_speed_display" checked="${this.settings.spdEnabled}" disabled="${!this.layerCheckbox.roadGroup.checked}">
                    <div class="layer-selector-container" title="WME ${this.getTranslation('name')}">${this.getTranslation('label.displaySpeeds')}</div>
                </wz-checkbox>
            </div>`;

        houseNumbersCheckbox.closest('li').insertAdjacentElement('afterend', layerItem);

        this.layerCheckbox.speedDisplay = document.getElementById('layer-switcher-item_speed_display');

        if (!this.layerCheckbox.speedDisplay)
            return;

        this.layerCheckbox.speedDisplay.addEventListener('change', this.onSpeedDisplayCheckboxChange.bind(this));
        this.layerCheckbox.roadGroup.addEventListener('change', this.onLayerSwithcerGroupRoadChange.bind(this));

        this.toggleLayerVisibility(this.layerCheckbox.roadGroup.checked && this.settings.spdEnabled);
    }

    /**
     * Initializes settings from localStorage or sets default values.
     */
    defineSettings() {
        let localSettings = localStorage.getItem('wmeSpeedDisplaySettings');
        localSettings     = localSettings ? JSON.parse(localSettings) : null;

        this.settings = {
            spdEnabled: true,
            alertDismissed: {
                infoToggleVisibility: false,
                infoZindex: false
            },
            theme: 'default',
            general: {
                spdShowNoSpeed: true,
                spdShowRoundabout: true,
                spdShowUnpaved: true,
                spdMaxZoom: 18,
                spdLayerZindex: this.zIndex.min,
                spdFilterOpacity: 0.2
            },
            roads: {},
            filter: {
                spdHideSegmentSmallerThan: 0,
                spdMinSpeed: 0,
                spdMaxSpeed: 0
            }
        };

        Object.values(this.segmentsCategories).forEach(category => {
            Object.values(category).forEach(roadType => {
                let settingId = this.convertStringCaseStyle('snake', 'camel', `spd_show_speed_in_${roadType.name}`);
                
                this.settings.roads[settingId] = true;
            });
        });

        if (localSettings)
            this.loadSettings(localSettings);
    }

    /**
     * Checks if the plugin version changed and displays the changelog if necessary.
     */
    checkVersionAndShowChangelog() {
        this.logDebug('Checking plugin version.');
        
        let localSpdVersion = JSON.parse(localStorage.getItem('wmeSpeedDisplayVersion'));

        if (localSpdVersion == null || localSpdVersion != this.version) {
            if (this.needResetSettings && !this.debugMode)
                this.resetSettings();
        
            this.hideSpeedDisplayDialog();
            this.openChangelogDialog();

            localStorage.setItem('wmeSpeedDisplayVersion', JSON.stringify(this.version));
        }
    }
    
    /**
     * Opens changelog dialog.
     */
    openChangelogDialog() {
        this.showSpeedDisplayDialog(`${this.getTranslation('changelog')} ${this.getTranslation('name')} v${this.version}`, this.getTranslation('changelogMessage'), null, `<a href="https://greasyfork.org/scripts/526702-wme-speed-display" target="_blank"><wz-button color="primary">${this.getTranslation('viewScript')}</wz-button></a>`);
    }

    /**
     * Displays a modal dialog with customizable title, body content, and button text.
     * @param {String} title - The title of the modal (default: 'Without title').
     * @param {String} body - The HTML content or string inside the modal (default: '<span>Without body message</span>').
     * @param {String} [closeButtonText] - The text for the close button (default: 'Close').
     * @param {String} [customHtmlButtons] - Custom HTML button(s).
     */
    showSpeedDisplayDialog(title, body = '<span>Without body message</span>', closeButtonText, customHtmlButtons) {
        title                 = title && typeof title == 'string' ? title : 'Without title';
        closeButtonText       = closeButtonText ?? this.getTranslation('close');
        let wzDialogContainer = document.getElementById('wz-dialog-container');
        let divDialog         = document.createElement('div');
        divDialog.id          = 'spd-dialog-container';

        Object.assign(divDialog.style, {
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center',
            position: 'absolute',
            width: '100vw',
            height: '100vh',
            top: 0,
            left: 0
        });

        let divDialogHtml = `
            <div class="dark-overlay" style="background-color: var(--background_modal, rgba(32, 33, 36, 0.6)); width: 100vw; height: 100vh; position: absolute; top: 0px; left: 0px; z-index: 9999;"></div>

            <div style="display: flex; flex-direction: column; background-color: var(--background_default, #ffffff); border-radius: var(--wz-dialog-border-radius, 10px); box-shadow: rgba(0, 0, 0, 0.26) 0px 4px 8px 3px; width: var(--wz-dialog-width, 720px); height: var(--wz-dialog-height); padding: var(--wz-dialog-padding, var(--space-l, 24px)); position: fixed; z-index: 99999;">
                <h3 style="margin-bottom: 10px;">${title}</h3>
                
                <div style="max-height: 70vh; overflow: auto;">
                    ${body}
                </div>

                <div style="display: flex; justify-content: end; gap: 10px; margin-top: 10px;">
                    <wz-button color="secondary" id="btn-spd-hide-dialog">${closeButtonText}</wz-button>`;

        if (customHtmlButtons)
            divDialogHtml += `${customHtmlButtons}`;
        
        divDialogHtml += `
                </div>
            </div>`;

        divDialog.innerHTML = divDialogHtml;

        wzDialogContainer.appendChild(divDialog);
        
        this.attachDialogListeners();
    }

    /**
     * Closes the dialog and removes associated event listeners.
     */
    hideSpeedDisplayDialog() {
        let spdDialog = document.getElementById('spd-dialog-container');

        document.removeEventListener('keydown', this.simulateBtnHideDialogClick.bind(this));

        spdDialog?.remove();
    }

    /**
     * Simulates a click on the close dialog button.
     * @param {Event} event
     */
    simulateBtnHideDialogClick(event) {
        if (event.key && !['Escape', 'Enter'].includes(event.key))
            return;

        document.getElementById('btn-spd-hide-dialog')?.click();
    }

    /**
     * Adds an alert to the warning group.
     * 
     * @param {String} id - The unique identifier for the alert.
     * @param {(String|Element)} body - The content of the alert, either as a string or an HTML element.
     * @param {String} [variant] - The alert variant ('info', 'warning', 'danger' and 'success'). (default: 'info')
     * @param {Boolean} [truncable] - Whether the alert content should be truncated. (default: true)
     */
    addAlert(id, body, variant = 'info', truncable = true) {
        let warningGroup = document.getElementById('spd-alert-group');
        let alertHtml    = `
            <wz-alert id="${id}" role="alert" level="page" variant="${variant}" multiline="true" class="sidebar-alert inconsistent-direction-alert">
                <div class="alertContent--O8sZl">`;

        if (truncable) {
            alertHtml +=`
                    <wz-truncate is-expanded="false" limit="50">
                        <wz-body2>${body}</wz-body2>
                        <span slot="ellipsis">${this.wmeTranslations.common.show_more}</span>
                    </wz-truncate>`;
        } else {
            alertHtml +=`<wz-body2>${body}</wz-body2>`;
        }

        alertHtml += `
                </div>

                <wz-button size="sm" color="text" slot="dismiss" class="spd-btn-dismiss-alert">${this.wmeTranslations.zoom_in_message.ok}</wz-button>
            </wz-alert>`;

        warningGroup.classList.remove('d-none');
            
        warningGroup.insertAdjacentHTML('beforeend', alertHtml);

        document.querySelector(`#${id} .spd-btn-dismiss-alert`).addEventListener('click', this.onDismissAlert.bind(this), {once: true});
    }

    /**
     * Adds an snackbar on message container.
     * @param {String} id Snackbar ID
     * @param {(String|Element)} body Snackbar message
     * @param {String} [btnMsg] Snackbar button text (default: no button)
     * @param {Boolean} [loadingSnackbar] Is loading snackbar? (default: false)
     */
    addSnackbar(id, body, btnMsg, loadingSnackbar = false) {
        let snackbarClass = loadingSnackbar ? 'spd-snackbar spd-snackbar-loading' : 'spd-snackbar';
        
        if (id instanceof Event) {
            id     = 'snackbar-id-' + Math.floor(Math.random() * 100000);
            btnMsg = `<wz-button color="text">${this.wmeTranslations.zoom_in_message.ok}</wz-button>`;
        }

        if (document.getElementById(id))
            return;

        let snackbarHtml = `
            <div class="${snackbarClass}" id="${id}">
                <span class="text-wrapper">
                    ${body}
                </span>`;

        if (btnMsg)
            snackbarHtml += btnMsg;

        snackbarHtml += `
            </div>`;

        this.snackbarWrapper.insertAdjacentHTML('beforeend', snackbarHtml);

        if (btnMsg)
            document.querySelector(`.spd-snackbar#${id} wz-button`).addEventListener('click', this.removeSnackbar.bind(this), {once: true});
    }

    /**
     * Remove current snackbar.
     * @param {(Element|Event)} element - The element or event triggering the removal.
     */
    removeSnackbar(element) {
        if (element instanceof Event)
            element = element.currentTarget;

        element?.closest('.spd-snackbar')?.remove();
    }

    /**
     * Remove all snackbars.
     */
    removeAllSnackbars() {
        let allSnackbars = document.querySelectorAll('.spd-snackbar');

        allSnackbars.forEach(snackbar => snackbar.remove());
    }

    /**
     * Create a custom manual snackbar.
     */
    createSnackbarWrapper() {
        let msgContainer     = document.getElementById('map-message-container');
        this.snackbarWrapper = document.querySelector('.spd-snackbar-wrapper');

        if (!this.snackbarWrapper) {
            this.snackbarWrapper = document.createElement('div');
            this.snackbarWrapper.classList.add('spd-snackbar-wrapper');

            msgContainer.appendChild(this.snackbarWrapper);
        }
    }

    /**
     * Adds script custom stylesheet.
     */
    addStyle() {
        let style = document.createElement('style');

        style.innerHTML = `
            /* General */
            .d-none {
                display: none;
            }

            .spd-info-message {
                color: #777;
                font-size: 11px;
                line-height: 15px;
            }
            
            wz-card[id^="spd-theme-"] * {
                pointer-events: none;
            }
                
            /* Snackbar */
            #map-message-container {
                display: flex;
                flex-direction: column-reverse;
                gap: 15px;
            }
            
            .spd-snackbar-wrapper {
                display: flex;
                flex-direction: column-reverse;
                gap: 15px;
                align-items: flex-start;
                justify-content: flex-start;
                position: absolute;
                top: 0;
                bottom: 0;
                left: 0;
                right: 0;
                translate: 0 -15px;
                z-index: 10001;
                pointer-events: none;
            }

            .spd-snackbar {
                display: flex;
                align-items: center;
                gap: 15px;
                position: relative;
                padding: var(--space-m, 16px) var(--space-always-m, 16px);
                bottom: var(--wz-snackbar-bottom, initial);
                left: 50%;
                translate: -50%;
                min-width: var(--wz-snackbar-min-width, 195px);
                background-color: rgba(0, 0, 0, 0.8);
                border: none;
                border-radius: 6px;
                box-shadow: 0 1px 2px 0 rgba(60, 64, 67, 0.3), 0 2px 6px 2px rgba(60, 64, 67, 0.15);
                box-sizing: border-box;
                color: var(--wz-snackbar-color, var(--always_white, #ffffff));
                font-family: "Rubik", sans-serif;
                font-size: 14px;
                font-weight: 400;
                justify-content: space-between;
                pointer-events: all;
                letter-spacing: 0.2px;
                white-space: normal;
            }

            .spd-snackbar.spd-snackbar-loading {
                justify-content: center;
                background-color: transparent;
                box-shadow: none;
                min-width: auto;
            }
            
            .spd-snackbar-wrapper .text-wrapper {
                display: flex;
                align-items: center;
                gap: 15px;
            }

            .spd-snackbar-wrapper i.w-icon {
                font-size: 20px;
            }
                
            .spd-snackbar-wrapper wz-button {
                pointer-events: all;
            }
                
            .loader {
                width: 40px;
                aspect-ratio: 1;
                display: flex;
            }

            .loader::before,
            .loader::after {
                content: "";
                flex: 1;
                animation: l14 1.5s -.25s infinite linear alternate both;
            }

            .loader::after {
                --s: -1, -1;
                animation-delay: .5s;
            }

            @keyframes l14 {
                0%,
                30% {
                        transform: scale(var(--s, 1)) translate(0px) perspective(150px) rotateY(0deg);
                        clip-path: polygon(50% 0, 100% 0, 100% 100%, 50% 100%, 0 75%, 0 25%);
                        background: #FF5251;
                        border: 7px solid #FF5251;
                        border-right: none;
                }

                37.5% {
                        transform: scale(var(--s, 1)) translate(-10px) perspective(150px) rotateX(0deg);
                        clip-path: polygon(50% 0, 100% 0, 100% 100%, 50% 100%, 0 75%, 0 25%);
                        background: #FF5251;
                        border: 7px solid #FF5251;
                        border-right: none;
                }

                50% {
                        transform: scale(var(--s, 1)) translate(-10px) perspective(150px) rotateX(-90deg);
                        clip-path: polygon(50% 0, 100% 0, 100% 100%, 50% 100%, 0 75%, 0 25%);
                        background: #FF5251;
                        border: 7px solid #FF5251;
                        border-right: none;
                        border-radius: 0;
                }

                50.01% {
                        transform: scale(var(--s, 1)) translate(-10px) perspective(150px) rotateX(-90.1deg);
                        clip-path: polygon(0 0, 100% 0, 100% 100%, 50% 100%, 0 100%, 0 25%);
                        background: #fff;
                        border: 7px solid #FF5251;
                        border-right: none;
                        border-radius: 100px 0 0 100px;
                }

                62.5% {
                        transform: scale(var(--s, 1)) translate(-10px) perspective(150px) rotateX(-180deg);
                        clip-path: polygon(0 0, 100% 0, 100% 100%, 50% 100%, 0 100%, 0 25%);
                        background: #fff;
                        border: 7px solid #FF5251;
                        border-right: none;
                        border-radius: 100px 0 0 100px;
                }

                70%,
                100% {
                        transform: scale(var(--s, 1)) translate(0px) perspective(150px) rotateX(-180deg);
                        clip-path: polygon(0 0, 100% 0, 100% 100%, 50% 100%, 0 100%, 0 25%);
                        background: #fff;
                        border: 7px solid #FF5251;
                        border-right: none;
                        border-radius: 100px 0 0 100px;
                }
            }`;

        document.head.appendChild(style);
    }

    /**
     * Get the layer switcher element.
     */
    getLayerSwitcher() {
        let userScriptLayerSwitchers = document.querySelectorAll('.layer-selector-sdk-checkbox');

        if (userScriptLayerSwitchers.length < 1) {
            this.logDebug('Userscripts layer switches not found. Trying again...', false, 'warn');

            setTimeout(() => this.getLayerSwitcher(), 1000);
            
            return;
        }
        
        this.layerSwitcherElement = [...userScriptLayerSwitchers].find(checkbox => {
            return checkbox.querySelector('.layer-selector-container').textContent.trim() == this.getTranslation('name');
        });

        this.layerSwitcherElement.checked = this.settings.spdEnabled;
    }

    /**
     * Select a card theme.
     * @param {Element} card 
     */
    selectThemeCard(card) {
        let selectedTheme = this.getSelectedTheme();

        selectedTheme?.removeAttribute('selected');

        card.setAttribute('selected', 'true');
    }

    /**
     * Get card element of the selected theme.
     * @returns {Element} Returns the element of the selected theme.
     */
    getSelectedTheme() {
        return document.querySelector('wz-card[id^="spd-theme-"][selected=true]');
    }

    /**
     * Gets the translation of the word or displays the key if no translation is found (to make it easier to find missing translations).
     * @param {String} key Key in string format, separating subcategories by periods ".".
     * @param {Object} [replaceStrings={}] An object containing placeholder values for dynamic translations.
     *
     * @returns {String} Translated string.
     */
    getTranslation(key, replaceStrings = {}) {
        return I18n.translate(`wmeSpd.${key}`, replaceStrings);
    }

    /**
     * Sets translations for the current locale.
     */
    defineTranslations() {
        let translations;

        switch (I18n.locale) {
            case 'af':
                // Afrikaans
                translations = {
                    name: 'Spoedweergawes',
                    zoomOut: 'Verder',
                    zoomIn: 'Naby',
                    changelog: 'Veranderingsregister',
                    changelogMessage: `<h6>Wat is nuut:</h6><ul style="margin-bottom: 10px"><li>Die boodskap "werk ikone op met vertraging" is uiteindelik vervang deur 'n eenvoudige ikoon, wat aandui wanneer die skrif steeds spoedikone verwerk (onthou altyd dat daar 'n doelbewuste vertraging in die opdatering is).</li></ul><h6>Herstelwerk en verbeterings:</h6><ul><li>Die naam van die "algemeen"-oortjie is verander na "aanpassings" vir beter begrip van die funksie van elke oortjie;</li><li>Die werking van die segmentgroottefilter is aangepas — dit verwyder nou nie meer die ikoon nie, maar pas eerder dieselfde deursigtigheid toe as die spoedfilter.</li></ul>`,
                    close: 'Sluit',
                    viewScript: 'Besoek Skrip',
                    viewChangelog: 'Besoek veranderingsregister',
                    reset: 'Herstel',
                    snackbar: {
                        errorFiltering: 'Fout met toepassing van filter. Minimum spoed kan nie groter as maksimum wees nie.',
                    },
                    title: {
                        settings: 'Instellings',
                        roadTypes: 'Padsoorte',
                        filter: 'Filtreer',
                        appearence: 'Vorm',
                        showOnRoadType: 'Wys op die volgende padsoorte:',
                        seeOnDiscuss: 'Kyk na die skrip se draad op die Discuss',
                        seeOnDiscord: 'Kyk na die skrip se kanaal op die Waze Script se Discord-bediener',
                        scriptDevBy: 'Bekyk my redakteur gebruikersprofiel',
                    },
                    label: {
                        displaySpeeds: 'Toon spoed',
                        showNoSpeed: 'Toon op segmente sonder spoed',
                        showOnRoundabout: 'Toon op rotondes',
                        showOnUnpaved: 'Toon op nie-geplaveide paaie',
                        maxZoom: 'Render tot die zoom:',
                        toggleLayerShortcut: 'Wissel laag sigbaarheid',
                        zIndex: 'Laagdiepte',
                        hideShorterSegments: 'Versteek segmente kleiner as',
                        speedFilter: 'Filter volgens snelheid',
                        min: 'Min:',
                        max: 'Max:',
                        opacity: 'Filter deursigtigheidsvlak:',
                    },
                    alertMessage: {
                        zIndex: `As jy \'n laagdiepte groter as <b>${this.zIndex.warn}</b> gebruik, sal die spoedlaag ander lae oorskadu en jy sal nie enige element op die skerm kan kies totdat jy die laagdiepte weer laer as <b>${this.zIndex.warn}</b> maak.`,
                        toggleVisibility: `Om die laag sigbaarheid van spoed aan/af te skakel, gaan eenvoudig na <b>Kaartlae > Paaie > Wys spoed</b> of gebruik die kortpad <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Standaard',
                        altViennaConv: 'Alternatiewe Wene Konvensie',
                        japan: 'Japan',
                        northAmerica: 'Noord-Amerika',
                        sacu: 'Suidelike Afrikaanse Douane-unie',
                        uk: 'Verenigde Koninkryk',
                    },
                    btn: {
                        updateSettingsTab: 'Werk menu op',
                        resetSettings: 'Herstel instellings',
                        seeOnDiscuss: 'Sien op die Bespreking',
                        seeOnDiscord: 'Sien op die Discord',
                        scriptDevBy: 'Skrip ontwikkel deur Luan Tavares',
                    }
                };

                break;

            case 'ar':
                // Arabic
                translations = {
                    name: 'عرض السرعة',
                    zoomOut: 'أبعد',
                    zoomIn: 'أقرب',
                    changelog: 'سجل التغييرات',
                    changelogMessage: `<h6>ما الجديد:</h6><ul style="margin-bottom: 10px"><li>تمت إزالة رسالة "تحديث الأيقونات بتأخير" واستبدالها بأيقونة بسيطة تشير إلى أن السكربت لا يزال يعالج أيقونات السرعة (تذكر أن هناك تأخيرًا مقصودًا في التحديث).</li></ul><h6>تصحيحات وتحسينات:</h6><ul><li>تم تغيير اسم علامة التبويب "عام" إلى "تعديلات" لتوضيح وظيفة كل علامة تبويب بشكل أفضل؛</li><li>تم تعديل طريقة تصفية حجم المقطع — بدلاً من إزالة الأيقونة، يتم الآن تطبيق نفس مستوى الشفافية المستخدم في فلتر السرعة.</li></ul>`,
                    close: 'إغلاق',
                    viewScript: 'عرض السكربت',
                    viewChangelog: 'عرض سجل التغييرات',
                    reset: 'إعادة تعيين',
                    snackbar: {
                        errorFiltering: 'خطأ في تطبيق الفلتر. لا يمكن أن تكون السرعة الدنيا أكبر من القصوى.',
                    },
                    title: {
                        settings: 'الإعدادات',
                        roadTypes: 'أنواع الطرق',
                        filter: 'تصفية',
                        appearence: 'المظهر',
                        showOnRoadType: 'عرض على أنواع الطرق التالية:',
                        seeOnDiscuss: 'شاهد موضوع السكربت على Discuss',
                        seeOnDiscord: 'شاهد قناة السكربت على خادم Discord الخاص بـ Waze Script',
                        scriptDevBy: 'عرض ملف تعريف مستخدم المحرر الخاص بي',
                    },
                    label: {
                        displaySpeeds: 'عرض السرعات',
                        showNoSpeed: 'عرض على القطاعات التي لا تحتوي على سرعة',
                        showOnRoundabout: 'عرض على الدوار',
                        showOnUnpaved: 'عرض على الطريق غير المعبدة',
                        maxZoom: 'عرض حتى التكبير:',
                        toggleLayerShortcut: 'تبديل طبقة عرض السرعة',
                        zIndex: 'عمق الطبقة',
                        hideShorterSegments: 'إخفاء في القطاعات الأصغر من',
                        speedFilter: 'تصفية حسب السرعة',
                        min: 'أدنى:',
                        max: 'أقصى:',
                        opacity: 'مستوى تعتيم الفلتر:',
                    },
                    alertMessage: {
                        zIndex: `عند استخدام عمق طبقة أكبر من <b>${this.zIndex.warn}</b>، ستتداخل طبقة السرعة مع الطبقات الأخرى ولن يمكنك تحديد أي عنصر على الشاشة حتى تعيد عمق الطبقة إلى أقل من <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `لتفعيل/إلغاء تفعيل طبقة عرض السرعات، يمكنك الذهاب إلى <b>الطبقات > الطرق > عرض السرعات</b> أو استخدام الاختصار <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'افتراضي',
                        altViennaConv: 'اتفاقية فيينا البديلة',
                        japan: 'اليابان',
                        northAmerica: 'أمريكا الشمالية',
                        sacu: 'اتحاد الجمارك في جنوب أفريقيا',
                        uk: 'المملكة المتحدة',
                    },
                    btn: {
                        updateSettingsTab: 'تحديث القائمة',
                        resetSettings: 'إعادة تعيين الإعدادات',
                        seeOnDiscuss: 'انظر في المناقشة',
                        seeOnDiscord: 'انظر في الديسكورد',
                        scriptDevBy: 'البرنامج النصي تم تطويره بواسطة لوان تافاريس',
                    }
                };
            
                break;
            
            case 'bg':
                // Bulgarian
                translations = {
                    name: 'Показване на скоростта',
                    zoomOut: 'Отдалечи',
                    zoomIn: 'Приближи',
                    changelog: 'Журнал с промени',
                    changelogMessage: `<h6>Какво ново:</h6><ul style="margin-bottom: 10px"><li>Съобщението "актуализиране на иконите със закъснение" беше премахнато и заменено с проста икона, показваща кога скриптът все още обработва иконите за скорост (не забравяйте, че има умишлено закъснение).</li></ul><h6>Поправки и подобрения:</h6><ul><li>Името на раздела "общи" е променено на "настройки" за по-добро разбиране на всяка функция;</li><li>Функцията за филтриране по дължина на сегмента вече не премахва иконата, а прилага същата непрозрачност както във филтъра за скорост.</li></ul>`,
                    close: 'Затвори',
                    viewScript: 'Преглед на скрипта',
                    viewChangelog: 'Преглед на журнала с промени',
                    reset: 'Нулиране',
                    snackbar: {
                        errorFiltering: 'Грешка при прилагане на филтъра. Минималната скорост не може да бъде по-голяма от максималната.',
                    },
                    title: {
                        settings: 'Настройки',
                        roadTypes: 'Типове пътища',
                        filter: 'Филтър',
                        appearence: 'Изглед',
                        showOnRoadType: 'Покажи на следните типове пътища:',
                        seeOnDiscuss: 'Вижте нишката на скрипта в Discuss',
                        seeOnDiscord: 'Вижте канала на скрипта в Discord сървъра на Waze Script',
                        scriptDevBy: 'Вижте потребителския профил на моя редактор',
                    },
                    label: {
                        displaySpeeds: 'Показване на скорости',
                        showNoSpeed: 'Показване на сегменти без скорост',
                        showOnRoundabout: 'Показване на кръгови кръстовища',
                        showOnUnpaved: 'Показване на непавирани пътища',
                        maxZoom: 'Изобразяване до ниво на мащаб:',
                        toggleLayerShortcut: 'Превключване на слоя за показване на скоростта',
                        zIndex: 'Дълбочина на слоя',
                        hideShorterSegments: 'Скриване на сегменти по-малки от',
                        speedFilter: 'Филтриране по скорост',
                        min: 'Мин.:',
                        max: 'Макс.:',
                        opacity: 'Ниво на непрозрачност на филтъра:',
                    },
                    alertMessage: {
                        zIndex: `Ако използвате дълбочина на слоя, по-голяма от <b>${this.zIndex.warn}</b>, слойът за скорост ще се припокрие с други и няма да можете да изберете елемент на екрана, докато не го намалите под <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `За да активирате/деактивирате слоя за показване на скорости, можете да отидете в <b>Картови слоеве > Пътища > Показване на скорости</b> или да използвате клавишната комбинация <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'По подразбиране',
                        altViennaConv: 'Алтернативна Виенска конвенция',
                        japan: 'Япония',
                        northAmerica: 'Северна Америка',
                        sacu: 'Южноафрикански съюз за митници',
                        uk: 'Обединено кралство',
                    },
                    btn: {
                        updateSettingsTab: 'Актуализиране на менюто',
                        resetSettings: 'Нулиране на настройките',
                        seeOnDiscuss: 'Вижте в обсъждането',
                        seeOnDiscord: 'Вижте в Discord',
                        scriptDevBy: 'Скриптът е разработен от Луaн Таварес',
                    }
                };
            
                break;
            
            case 'ca':
                // Catalan
                translations = {
                    name: 'Visualització de la Velocitat',
                    zoomOut: 'Més allunyat',
                    zoomIn: 'Més a prop',
                    changelog: 'Registre de canvis',
                    changelogMessage: `<h6>Novetats:</h6><ul style="margin-bottom: 10px"><li>S'ha eliminat finalment el missatge de "actualització de les icones amb retard" i s'ha substituït per una icona senzilla per indicar que el script encara està processant les icones de velocitat (recorda que hi ha un retard intencionat en l'actualització).</li></ul><h6>Correccions i millores:</h6><ul><li>S'ha canviat el nom de la pestanya "general" a "ajustos" per facilitar la comprensió de la funció de cada pestanya;</li><li>La filtració per mida del segment ja no elimina la icona sinó que aplica la mateixa opacitat que el filtre de velocitat.</li></ul>`,
                    close: 'Tancar',
                    viewScript: 'Veure el script',
                    viewChangelog: 'Veure el registre de canvis',
                    reset: 'Restablir',
                    snackbar: {
                        errorFiltering: 'Error en aplicar el filtre. La velocitat mínima no pot ser superior a la màxima.',
                    },
                    title: {
                        settings: 'Configuració',
                        roadTypes: 'Tipus de carreteres',
                        filter: 'Filtre',
                        appearence: 'Aparença',
                        showOnRoadType: 'Mostrar en els següents tipus de carreteres:',
                        seeOnDiscuss: 'Veure el fil del script a Discuss',
                        seeOnDiscord: 'Veure el canal del script al servidor de Discord de Waze Script',
                        scriptDevBy: 'Veure el meu perfil d\'usuari de l\'editor',
                    },
                    label: {
                        displaySpeeds: 'Mostrar velocitats',
                        showNoSpeed: 'Mostrar en segments sense velocitat',
                        showOnRoundabout: 'Mostrar en rotondes',
                        showOnUnpaved: 'Mostrar en vies no pavimentades',
                        maxZoom: 'Renderitzar fins al zoom:',
                        toggleLayerShortcut: 'Alternar la capa de visualització de la velocitat',
                        zIndex: 'Profunditat de la capa',
                        hideShorterSegments: 'Amagar en segments més petits que',
                        speedFilter: 'Filtrar per velocitat',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Nivell d’opacitat del filtre:',
                    },
                    alertMessage: {
                        zIndex: `Si utilitzeu una profunditat de capa superior a <b>${this.zIndex.warn}</b>, la capa de velocitat es superposarà a altres i no podreu seleccionar cap element a la pantalla fins que la rebaixeu per sota de <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Per activar/desactivar la capa de visualització de velocitats, podeu anar a <b>Capes del mapa > Vies > Mostrar velocitats</b> o utilitzar la drecera <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Per defecte',
                        altViennaConv: 'Convenció alternativa de Viena',
                        japan: 'Japó',
                        northAmerica: 'Amèrica del Nord',
                        sacu: 'Unió duanera de l\'Àfrica Austral',
                        uk: 'Regne Unit',
                    },
                    btn: {
                        updateSettingsTab: 'Actualitzar el menú',
                        resetSettings: 'Restablir la configuració',
                        seeOnDiscuss: 'Veure a la discussió',
                        seeOnDiscord: 'Veure a Discord',
                        scriptDevBy: 'Script desenvolupat per Luan Tavares',
                    }
                };
            
                break;

            case 'cs':
                // Czech
                translations = {
                    name: 'Zobrazení Rychlosti',
                    zoomOut: 'Více vzdálené',
                    zoomIn: 'Více přiblížené',
                    changelog: 'Seznam změn',
                    changelogMessage: `<h6>Novinky:</h6><ul style="margin-bottom: 10px"><li>Zpráva "aktualizace ikon se zpožděním" byla konečně odstraněna a nahrazena jednoduchou ikonou, která jasně ukazuje, že skript stále zpracovává rychlostní ikony (pamatujte, že existuje záměrné zpoždění aktualizace).</li></ul><h6>Opravy a vylepšení:</h6><ul><li>Název karty "obecné" byl změněn na "úpravy" pro lepší porozumění funkci jednotlivých karet skriptu;</li><li>Změněno chování filtrování podle délky segmentu – nyní neodstraňuje ikonu, ale pouze aplikuje stejnou průhlednost jako rychlostní filtr.</li></ul>`,
                    close: 'Zavřít',
                    viewScript: 'Zobrazit skript',
                    viewChangelog: 'Zobrazit seznam změn',
                    reset: 'Obnovit',
                    snackbar: {
                        errorFiltering: 'Chyba při aplikaci filtru. Minimální rychlost nemůže být větší než maximální.',
                    },
                    title: {
                        settings: 'Nastavení',
                        roadTypes: 'Typy silnic',
                        filter: 'Filtr',
                        appearence: 'Vzhled',
                        showOnRoadType: 'Zobrazit na následujících typech silnic:',
                        seeOnDiscuss: 'Podívejte se na vlákno skriptu na Discuss',
                        seeOnDiscord: 'Podívejte se na kanál skriptu na Discord serveru Waze Script',
                        scriptDevBy: 'Zobrazit můj uživatelský profil editoru',
                    },
                    label: {
                        displaySpeeds: 'Zobrazit rychlosti',
                        showNoSpeed: 'Zobrazit na segmentu bez rychlosti',
                        showOnRoundabout: 'Zobrazit na kruhovém objezdu',
                        showOnUnpaved: 'Zobrazit na nezpevněné cestě',
                        maxZoom: 'Renderovat až na zoom:',
                        toggleLayerShortcut: 'Přepnout vrstvu zobrazení rychlosti',
                        zIndex: 'Hloubka vrstvy',
                        hideShorterSegments: 'Skrýt na segmentech menších než',
                        speedFilter: 'Filtrovat podle rychlosti',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Úroveň neprůhlednosti filtru:',
                    },
                    alertMessage: {
                        zIndex: `Pokud použijete hloubku vrstvy vyšší než <b>${this.zIndex.warn}</b>, vrstva rychlosti se překryje s ostatními a nebude možné vybrat žádný prvek na obrazovce, dokud ji opět nezmenšíte pod <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Pro aktivaci/deaktivaci vrstvy zobrazení rychlostí stačí přejít do <b>Mapové vrstvy > Cesty > Zobrazit rychlosti</b> nebo použít klávesovou zkratku <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Výchozí',
                        altViennaConv: 'Alternativní Vídeňská úmluva',
                        japan: 'Japonsko',
                        northAmerica: 'Severní Amerika',
                        sacu: 'Jižní africká celní unie',
                        uk: 'Spojené království',
                    },
                    btn: {
                        updateSettingsTab: 'Aktualizovat nabídku',
                        resetSettings: 'Obnovit nastavení',
                        seeOnDiscuss: 'Zobrazit v diskusi',
                        seeOnDiscord: 'Zobrazit na Discordu',
                        scriptDevBy: 'Skript vyvinutý Luanem Tavaresem',
                    }
                };                

                break;

            case 'da':
                // Danish
                translations = {
                    name: 'Hastighedsvisning',
                    zoomOut: 'Mere afstand',
                    zoomIn: 'Mere tæt på',
                    changelog: 'Ændringslog',
                    changelogMessage: `<h6>Nyheder:</h6><ul style="margin-bottom: 10px"><li>Beskeden "opdatering af ikoner med forsinkelse" er nu fjernet og erstattet med et simpelt ikon, der tydeligt viser, når scriptet stadig behandler hastighedsikoner (husk, der er en tilsigtet forsinkelse ved opdatering).</li></ul><h6>Rettelser og forbedringer:</h6><ul><li>Fanen "generelt" er blevet omdøbt til "justeringer" for at gøre funktionen af hver fane tydeligere;</li><li>Segmentstørrelsesfilteret fjerner ikke længere ikoner, men anvender nu samme gennemsigtighed som hastighedsfilteret.</li></ul>`,
                    close: 'Luk',
                    viewScript: 'Se script',
                    viewChangelog: 'Se ændringslog',
                    reset: 'Nulstil',
                    snackbar: {
                        errorFiltering: 'Fejl ved anvendelse af filter. Minimumshastighed kan ikke være større end maksimum.',
                    },
                    title: {
                        settings: 'Indstillinger',
                        roadTypes: 'Straßentypen',
                        filter: 'Filter',
                        appearence: 'Erscheinungsbild',
                        showOnRoadType: 'An den folgenden Straßentypen anzeigen:',
                        seeOnDiscuss: 'Siehe den Thread des Skripts auf Discuss',
                        seeOnDiscord: 'Siehe den Kanal des Skripts auf dem Waze Script Discord-Server',
                        scriptDevBy: 'Se min redaktørbrugerprofil',
                    },
                    label: {
                        displaySpeeds: 'Vis hastigheder',
                        showNoSpeed: 'Vis på segmenter uden hastighed',
                        showOnRoundabout: 'Vis på rundkørsler',
                        showOnUnpaved: 'Vis på ubelagte veje',
                        maxZoom: 'Render op til zoom:',
                        toggleLayerShortcut: 'Skift synlighed af hastighedslaget',
                        zIndex: 'Lagdybde',
                        hideShorterSegments: 'Skjul på segmenter mindre end',
                        speedFilter: 'Filtrer efter hastighed',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Filterets opacitetsniveau:',
                    },
                    alertMessage: {
                        zIndex: `Når du bruger en lagdybde større end <b>${this.zIndex.warn}</b>, vil hastighedslaget dække de andre, og det vil ikke være muligt at vælge et element på skærmen, før du sænker dybden igen under <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `For at aktivere/deaktivere hastighedslaget, skal du gå til <b>Kortlag > Veje > Vis hastigheder</b> eller bruge genvejstasten <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Standard',
                        altViennaConv: 'Alternativ Wienerkonvention',
                        japan: 'Japan',
                        northAmerica: 'Nordamerika',
                        sacu: 'Southern African Customs Union',
                        uk: 'Storbritannien',
                    },
                    btn: {
                        updateSettingsTab: 'Opdater menu',
                        resetSettings: 'Nulstil indstillinger',
                        seeOnDiscuss: 'Se i diskussionen',
                        seeOnDiscord: 'Se på Discord',
                        scriptDevBy: 'Script udviklet af Luan Tavares',
                    }
                };
            
                break;
            
            case 'de':
                // German
                translations = {
                    name: 'Geschwindigkeitsanzeige',
                    zoomOut: 'Weiter entfernt',
                    zoomIn: 'Mehr heran',
                    changelog: 'Änderungsprotokoll',
                    changelogMessage: `<h6>Neues:</h6><ul style="margin-bottom: 10px"><li>Die Nachricht "Symbole mit Verzögerung aktualisieren" wurde endlich entfernt und durch ein einfaches Symbol ersetzt, das anzeigt, wenn das Skript die Geschwindigkeitssymbole noch verarbeitet (denken Sie daran, dass es eine beabsichtigte Verzögerung gibt).</li></ul><h6>Fehlerbehebungen und Verbesserungen:</h6><ul><li>Der Reiter "Allgemein" wurde in "Anpassungen" umbenannt, um die Funktion jeder Registerkarte besser zu verdeutlichen;</li><li>Die Segmentgrößenfilterung entfernt das Symbol nicht mehr, sondern wendet jetzt dieselbe Transparenz wie der Geschwindigkeitsfilter an.</li></ul>`,
                    close: 'Schließen',
                    viewScript: 'Skript anzeigen',
                    viewChangelog: 'Änderungsprotokoll anzeigen',
                    reset: 'Zurücksetzen',
                    snackbar: {
                        errorFiltering: 'Fehler beim Anwenden des Filters. Die Mindestgeschwindigkeit darf nicht größer als die Höchstgeschwindigkeit sein.',
                    },
                    title: {
                        settings: 'Einstellungen',
                        roadTypes: 'Straßentypen',
                        filter: 'Filter',
                        appearence: 'Erscheinungsbild',
                        showOnRoadType: 'Auf den folgenden Straßentypen anzeigen:',
                        seeOnDiscuss: 'Siehe den Thread des Skripts auf Discuss',
                        seeOnDiscord: 'Siehe den Kanal des Skripts auf dem Waze Script Discord-Server',
                        scriptDevBy: 'Mein Editor-Benutzerprofil anzeigen',
                    },
                    label: {
                        displaySpeeds: 'Geschwindigkeiten anzeigen',
                        showNoSpeed: 'Auf Segmenten ohne Geschwindigkeit anzeigen',
                        showOnRoundabout: 'Auf Kreisverkehr anzeigen',
                        showOnUnpaved: 'Auf unbefestigten Straßen anzeigen',
                        maxZoom: 'Rendern bis Zoom:',
                        toggleLayerShortcut: 'Schicht für Geschwindigkeitsanzeige umschalten',
                        zIndex: 'Schichttiefe',
                        hideShorterSegments: 'Verstecken bei Segmenten kürzer als',
                        speedFilter: 'Nach Geschwindigkeit filtern',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Filterdeckkraftstufe:',
                    },
                    alertMessage: {
                        zIndex: `Wenn Sie eine Schichttiefe von mehr als <b>${this.zIndex.warn}</b> verwenden, wird die Geschwindigkeits-Schicht andere überlagern, und es wird nicht möglich sein, ein Element auf dem Bildschirm auszuwählen, bis Sie die Schichttiefe wieder unter <b>${this.zIndex.warn}</b> verringern.`,
                        toggleVisibility: `Um die Sichtbarkeit der Geschwindigkeits-Schicht zu aktivieren/deaktivieren, gehen Sie zu <b>Kartenebenen > Straßen > Geschwindigkeiten anzeigen</b> oder verwenden Sie die Verknüpfung <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Standard',
                        altViennaConv: 'Alternative Wien-Konvention',
                        japan: 'Japan',
                        northAmerica: 'Nordamerika',
                        sacu: 'Südafrikanische Zollunion',
                        uk: 'Vereinigtes Königreich',
                    },
                    btn: {
                        updateSettingsTab: 'Menü aktualisieren',
                        resetSettings: 'Einstellungen zurücksetzen',
                        seeOnDiscuss: 'Im Diskussionsthread ansehen',
                        seeOnDiscord: 'Auf Discord ansehen',
                        scriptDevBy: 'Skript entwickelt von Luan Tavares',
                    }
                };
            
                break;
            
            case 'el':
                // Greek
                translations = {
                    name: 'Εμφάνιση Ταχύτητας',
                    zoomOut: 'Περισσότερη απόσταση',
                    zoomIn: 'Πιο κοντά',
                    changelog: 'Αρχείο αλλαγών',
                    changelogMessage: `<h6>Τι νέο υπάρχει:</h6><ul style="margin-bottom: 10px"><li>Το μήνυμα "ενημέρωση εικονιδίων με καθυστέρηση" αφαιρέθηκε και αντικαταστάθηκε με ένα απλό εικονίδιο, το οποίο δείχνει πότε το script εξακολουθεί να επεξεργάζεται τα εικονίδια ταχύτητας (θυμηθείτε ότι υπάρχει σκόπιμη καθυστέρηση).</li></ul><h6>Διορθώσεις και βελτιώσεις:</h6><ul><li>Το όνομα της καρτέλας "γενικά" άλλαξε σε "ρυθμίσεις" για καλύτερη κατανόηση της λειτουργίας κάθε καρτέλας του script.</li><li>Η λειτουργία του φιλτραρίσματος μεγεθών τμημάτων άλλαξε — δεν αφαιρεί πλέον το εικονίδιο, αλλά εφαρμόζει την ίδια διαφάνεια όπως το φίλτρο ταχύτητας.</li></ul>`,
                    close: 'Κλείσιμο',
                    viewScript: 'Δείτε το script',
                    viewChangelog: 'Δείτε το αρχείο αλλαγών',
                    reset: 'Επαναφορά',
                    snackbar: {
                        errorFiltering: 'Σφάλμα στην εφαρμογή του φίλτρου. Η ελάχιστη ταχύτητα δεν μπορεί να είναι μεγαλύτερη από τη μέγιστη.',
                    },
                    title: {
                        settings: 'Ρυθμίσεις',
                        roadTypes: 'Τύποι Δρόμων',
                        filter: 'Φίλτρο',
                        appearence: 'Εμφάνιση',
                        showOnRoadType: 'Εμφάνιση στους εξής τύπους δρόμων:',
                        seeOnDiscuss: 'Δείτε το νήμα του script στο Discuss',
                        seeOnDiscord: 'Δείτε το κανάλι του script στον server Discord του Waze Script',
                        scriptDevBy: 'Δείτε το προφίλ χρήστη του επεξεργαστή μου',
                    },
                    label: {
                        displaySpeeds: 'Εμφάνιση ταχυτήτων',
                        showNoSpeed: 'Εμφάνιση σε τμήματα χωρίς ταχύτητα',
                        showOnRoundabout: 'Εμφάνιση σε κυκλικούς κόμβους',
                        showOnUnpaved: 'Εμφάνιση σε α paved δρόμους',
                        maxZoom: 'Απεικόνιση μέχρι το ζουμ:',
                        toggleLayerShortcut: 'Αλλαγή ορατότητας του επιπέδου ταχύτητας',
                        zIndex: 'Βάθος επιπέδου',
                        hideShorterSegments: 'Απόκρυψη σε τμήματα μικρότερα από',
                        speedFilter: 'Φίλτρο κατά ταχύτητα',
                        min: 'Ελάχιστο:',
                        max: 'Μέγιστο:',
                        opacity: 'Επίπεδο αδιαφάνειας φίλτρου:',
                    },
                    alertMessage: {
                        zIndex: `Όταν χρησιμοποιείτε βάθος επιπέδου μεγαλύτερο από <b>${this.zIndex.warn}</b>, το επίπεδο ταχύτητας θα επικαλύψει τα άλλα και δεν θα μπορείτε να επιλέξετε κανένα στοιχείο στην οθόνη μέχρι να το χαμηλώσετε ξανά κάτω από <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Για να ενεργοποιήσετε/απενεργοποιήσετε το επίπεδο ταχύτητας, πηγαίνετε στο <b>Επίπεδα Χάρτη > Οδοί > Εμφάνιση ταχυτήτων</b> ή χρησιμοποιήστε την συντόμευση <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Προεπιλογή',
                        altViennaConv: 'Εναλλακτική Σύμβαση της Βιέννης',
                        japan: 'Ιαπωνία',
                        northAmerica: 'Βόρεια Αμερική',
                        sacu: 'Νότια Αφρικανική Τελωνειακή Ένωση',
                        uk: 'Ηνωμένο Βασίλειο',
                    },
                    btn: {
                        updateSettingsTab: 'Ενημέρωση μενού',
                        resetSettings: 'Επαναφορά ρυθμίσεων',
                        seeOnDiscuss: 'Δείτε στη Συζήτηση',
                        seeOnDiscord: 'Δείτε στο Discord',
                        scriptDevBy: 'Το σενάριο αναπτύχθηκε από τον Luan Tavares',
                    }
                };
            
                break;
            
            case 'en-AU':
                // English (Australia)
                translations = {
                    name: 'Speed Display',
                    zoomOut: 'Zoom Out',
                    zoomIn: 'Zoom In',
                    changelog: 'Changelog',
                    changelogMessage: `<h6>What's New:</h6><ul style="margin-bottom: 10px"><li>Finally removed the "updating icons with delay" message and replaced it with a simple icon, making it clear when the script is still processing speed icons (remember there’s an intentional delay).</li></ul><h6>Fixes and improvements:</h6><ul><li>Renamed the "general" tab to "settings" for better clarity on each tab's function;</li><li>The segment size filter no longer removes the icon but now applies the same opacity as the speed filter.</li></ul>`,
                    close: 'Close',
                    viewScript: 'View Script',
                    viewChangelog: 'View Changelog',
                    reset: 'Reset',
                    snackbar: {
                        errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
                    },
                    title: {
                        settings: 'Settings',
                        roadTypes: 'Road Types',
                        filter: 'Filter',
                        appearence: 'Appearance',
                        showOnRoadType: 'Show on the following road types:',
                        seeOnDiscuss: 'See the script\'s thread on Discuss',
                        seeOnDiscord: 'See the script\'s channel on the Waze Script Discord server',
                        scriptDevBy: 'View my editor user profile',
                    },
                    label: {
                        displaySpeeds: 'Display Speeds',
                        showNoSpeed: 'Show on segments without speed',
                        showOnRoundabout: 'Show on roundabouts',
                        showOnUnpaved: 'Show on unpaved roads',
                        maxZoom: 'Render up to zoom level:',
                        toggleLayerShortcut: 'Toggle speed display layer',
                        zIndex: 'Layer Depth',
                        hideShorterSegments: 'Hide segments shorter than',
                        speedFilter: 'Filter by speed',
                        min: 'Min:',
                        max: 'Max:',
                        opacity: 'Filter opacity level:',
                    },
                    alertMessage: {
                        zIndex: `When using a layer depth greater than <b>${this.zIndex.warn}</b>, the speed layer will overlap other layers, and no element can be selected until you lower it back below <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `To toggle the speed display layer, go to <b>Map Layers > Roads > Display Speeds</b> or use the shortcut <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Default',
                        altViennaConv: 'Alternative Vienna Convention',
                        japan: 'Japan',
                        northAmerica: 'North America',
                        sacu: 'Southern African Customs Union',
                        uk: 'United Kingdom',
                    },                    
                    btn: {
                        updateSettingsTab: 'Update Menu',
                        resetSettings: 'Reset Settings',
                        seeOnDiscuss: 'See on the Discuss',
                        seeOnDiscord: 'See on Discord',
                        scriptDevBy: 'Script developed by Luan Tavares',
                    }
                };
            
                break;
            
            case 'en-GB':
                // English (UK)
                translations = {
                    name: 'Speed Display',
                    zoomOut: 'Zoom Out',
                    zoomIn: 'Zoom In',
                    changelog: 'Changelog',
                    changelogMessage: `<h6>What's New:</h6><ul style="margin-bottom: 10px"><li>Finally removed the "updating icons with delay" message and replaced it with a simple icon, making it clear when the script is still processing speed icons (remember there’s an intentional delay).</li></ul><h6>Fixes and improvements:</h6><ul><li>Renamed the "general" tab to "settings" for better clarity on each tab's function;</li><li>The segment size filter no longer removes the icon but now applies the same opacity as the speed filter.</li></ul>`,
                    close: 'Close',
                    viewScript: 'View Script',
                    viewChangelog: 'View Changelog',
                    reset: 'Reset',
                    snackbar: {
                        errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
                    },
                    title: {
                        settings: 'Settings',
                        roadTypes: 'Road Types',
                        filter: 'Filter',
                        appearence: 'Appearance',
                        showOnRoadType: 'Show on the following road types:',
                        seeOnDiscuss: 'See the script\'s thread on Discuss',
                        seeOnDiscord: 'See the script\'s channel on the Waze Script Discord server',
                        scriptDevBy: 'View my editor user profile',
                    },
                    label: {
                        displaySpeeds: 'Display Speeds',
                        showNoSpeed: 'Show on segments without speed',
                        showOnRoundabout: 'Show on roundabouts',
                        showOnUnpaved: 'Show on unpaved roads',
                        maxZoom: 'Render up to zoom level:',
                        toggleLayerShortcut: 'Toggle speed display layer',
                        zIndex: 'Layer Depth',
                        hideShorterSegments: 'Hide segments shorter than',
                        speedFilter: 'Filter by speed',
                        min: 'Min:',
                        max: 'Max:',
                        opacity: 'Filter opacity level:',
                    },
                    alertMessage: {
                        zIndex: `When using a layer depth greater than <b>${this.zIndex.warn}</b>, the speed layer will overlap other layers, and no element can be selected until you lower it back below <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `To toggle the speed display layer, go to <b>Map Layers > Roads > Display Speeds</b> or use the shortcut <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Default',
                        altViennaConv: 'Alternative Vienna Convention',
                        japan: 'Japan',
                        northAmerica: 'North America',
                        sacu: 'Southern African Customs Union',
                        uk: 'United Kingdom',
                    },
                    btn: {
                        updateSettingsTab: 'Update Menu',
                        resetSettings: 'Reset Settings',
                        seeOnDiscuss: 'See on the Discuss',
                        seeOnDiscord: 'See on Discord',
                        scriptDevBy: 'Script developed by Luan Tavares',
                    }
                };
            
                break;
            
            case 'en-US':
                // US English
                translations = {
                    name: 'Speed Display',
                    zoomOut: 'Zoom Out',
                    zoomIn: 'Zoom In',
                    changelog: 'Changelog',
                    changelogMessage: `<h6>What's New:</h6><ul style="margin-bottom: 10px"><li>Finally removed the "updating icons with delay" message and replaced it with a simple icon, making it clear when the script is still processing speed icons (remember there’s an intentional delay).</li></ul><h6>Fixes and improvements:</h6><ul><li>Renamed the "general" tab to "settings" for better clarity on each tab's function;</li><li>The segment size filter no longer removes the icon but now applies the same opacity as the speed filter.</li></ul>`,
                    close: 'Close',
                    viewScript: 'View Script',
                    viewChangelog: 'View Changelog',
                    reset: 'Reset',
                    snackbar: {
                        errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
                    },
                    title: {
                        settings: 'Settings',
                        roadTypes: 'Road Types',
                        filter: 'Filter',
                        appearence: 'Appearance',
                        showOnRoadType: 'Show on the following road types:',
                        seeOnDiscuss: 'See the script\'s thread on Discuss',
                        seeOnDiscord: 'See the script\'s channel on the Waze Script Discord server',
                        scriptDevBy: 'View my editor user profile',
                    },
                    label: {
                        displaySpeeds: 'Display Speeds',
                        showNoSpeed: 'Show on segments without speed',
                        showOnRoundabout: 'Show on roundabouts',
                        showOnUnpaved: 'Show on unpaved roads',
                        maxZoom: 'Render up to zoom level:',
                        toggleLayerShortcut: 'Toggle speed display layer',
                        zIndex: 'Layer Depth',
                        hideShorterSegments: 'Hide segments shorter than',
                        speedFilter: 'Filter by speed',
                        min: 'Min:',
                        max: 'Max:',
                        opacity: 'Filter opacity level:',
                    },
                    alertMessage: {
                        zIndex: `When using a layer depth greater than <b>${this.zIndex.warn}</b>, the speed layer will overlap other layers, and no element can be selected until you lower it back below <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `To toggle the speed display layer, go to <b>Map Layers > Roads > Display Speeds</b> or use the shortcut <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Default',
                        altViennaConv: 'Alternative Vienna Convention',
                        japan: 'Japan',
                        northAmerica: 'North America',
                        sacu: 'Southern African Customs Union',
                        uk: 'United Kingdom',
                    },
                    btn: {
                        updateSettingsTab: 'Update Menu',
                        resetSettings: 'Reset Settings',
                        seeOnDiscuss: 'See on the Discuss',
                        seeOnDiscord: 'See on Discord',
                        scriptDevBy: 'Script developed by Luan Tavares',
                    }
                };
            
                break;

            case 'es':
                // Spanish
                translations = {
                    name: 'Exhibición de Velocidad',
                    zoomOut: 'Alejar',
                    zoomIn: 'Acercar',
                    changelog: 'Registro de cambios',
                    changelogMessage: `<h6>Novedades:</h6><ul style="margin-bottom: 10px"><li>Por fin se eliminó el mensaje de "actualizando los íconos con retraso" y se reemplazó por un ícono simple, dejando claro cuándo el script aún está procesando los íconos de velocidad (recuerda que hay un retraso intencionado).</li></ul><h6>Correcciones y mejoras:</h6><ul><li>Se cambió el nombre de la pestaña "general" a "ajustes" para clarificar mejor la función de cada pestaña del script;</li><li>Se modificó el funcionamiento del filtro por tamaño de segmento: ya no elimina el ícono, ahora solo aplica la misma opacidad del filtro de velocidad.</li></ul>`,
                    close: 'Cerrar',
                    viewScript: 'Ver script',
                    viewChangelog: 'Ver registro de cambios',
                    reset: 'Restablecer',
                    snackbar: {
                        errorFiltering: 'Error al aplicar el filtro. La velocidad mínima no puede ser mayor que la máxima.',
                    },
                    title: {
                        settings: 'Configuración',
                        roadTypes: 'Tipos de carretera',
                        filter: 'Filtro',
                        appearence: 'Apariencia',
                        showOnRoadType: 'Mostrar en los siguientes tipos de carretera:',
                        seeOnDiscuss: 'Ver el hilo del script en Discuss',
                        seeOnDiscord: 'Ver el canal del script en el servidor de Discord de Waze Script',
                        scriptDevBy: 'Ver mi perfil de usuario del editor',
                    },
                    label: {
                        displaySpeeds: 'Mostrar velocidades',
                        showNoSpeed: 'Mostrar en segmentos sin velocidad',
                        showOnRoundabout: 'Mostrar en rotondas',
                        showOnUnpaved: 'Mostrar en caminos no pavimentados',
                        maxZoom: 'Renderizar hasta el nivel de zoom:',
                        toggleLayerShortcut: 'Alternar capa de exhibición de velocidad',
                        zIndex: 'Profundidad de la capa',
                        hideShorterSegments: 'Ocultar segmentos más pequeños que',
                        speedFilter: 'Filtrar por velocidad',
                        min: 'Mín.:',
                        max: 'Máx.:',
                        opacity: 'Nivel de opacidad del filtro:',
                    },
                    alertMessage: {
                        zIndex: `Al utilizar una profundidad de capa mayor a <b>${this.zIndex.warn}</b>, la capa de velocidad se superpondrá a las demás y no se podrá seleccionar ningún elemento hasta que la bajes de nuevo por debajo de <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Para activar/desactivar la capa de exhibición de velocidades, dirígete a <b>Capas del Mapa > Vías > Mostrar velocidades</b> o usa el acceso directo <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Predeterminado',
                        altViennaConv: 'Convención de Viena Alternativa',
                        japan: 'Japón',
                        northAmerica: 'América del Norte',
                        sacu: 'Unión Aduanera de África Austral',
                        uk: 'Reino Unido',
                    },
                    btn: {
                        updateSettingsTab: 'Actualizar menú',
                        resetSettings: 'Restablecer configuración',
                        seeOnDiscuss: 'Ver en la Discusión',
                        seeOnDiscord: 'Ver en Discord',
                        scriptDevBy: 'Script desarrollado por Luan Tavares',
                    }
                };
            
                break;

            case 'es-419':
                // Latin-american spanish
                translations = {
                    name: 'Exhibición de Velocidad',
                    zoomOut: 'Alejar',
                    zoomIn: 'Acercar',
                    changelog: 'Registro de cambios',
                    changelogMessage: `<h6>Novedades:</h6><ul style="margin-bottom: 10px"><li>Finalmente se eliminó el mensaje de "actualización de íconos con retraso" y fue reemplazado por un ícono simple, lo que deja claro cuándo el script aún está procesando los íconos de velocidad (recuerda que hay un retraso intencional).</li></ul><h6>Correcciones y mejoras:</h6><ul><li>Se renombró la pestaña "general" a "ajustes" para mayor claridad sobre la función de cada pestaña del script;</li><li>El filtro por tamaño de segmento ya no elimina el ícono, ahora solo aplica la misma opacidad que el filtro de velocidad.</li></ul>`,
                    close: 'Cerrar',
                    viewScript: 'Ver script',
                    viewChangelog: 'Ver registro de cambios',
                    reset: 'Restablecer',
                    snackbar: {
                        errorFiltering: 'Error al aplicar el filtro. La velocidad mínima no puede ser mayor que la máxima.',
                    },
                    title: {
                        settings: 'Configuración',
                        roadTypes: 'Tipos de carretera',
                        filter: 'Filtro',
                        appearence: 'Apariencia',
                        showOnRoadType: 'Mostrar en los siguientes tipos de carretera:',
                        seeOnDiscuss: 'Ver el hilo del script en Discuss',
                        seeOnDiscord: 'Ver el canal del script en el servidor de Discord de Waze Script',
                        scriptDevBy: 'Ver mi perfil de usuario del editor',
                    },
                    label: {
                        displaySpeeds: 'Mostrar velocidades',
                        showNoSpeed: 'Mostrar en segmentos sin velocidad',
                        showOnRoundabout: 'Mostrar en rotondas',
                        showOnUnpaved: 'Mostrar en caminos no pavimentados',
                        maxZoom: 'Renderizar hasta el nivel de zoom:',
                        toggleLayerShortcut: 'Alternar capa de exhibición de velocidad',
                        zIndex: 'Profundidad de la capa',
                        hideShorterSegments: 'Ocultar segmentos más pequeños que',
                        speedFilter: 'Filtrar por velocidad',
                        min: 'Mín.:',
                        max: 'Máx.:',
                        opacity: 'Nivel de opacidad del filtro:',
                    },
                    alertMessage: {
                        zIndex: `Al utilizar una profundidad de capa mayor a <b>${this.zIndex.warn}</b>, la capa de velocidad se superpondrá a las demás y no se podrá seleccionar ningún elemento hasta que la bajes de nuevo por debajo de <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Para activar/desactivar la capa de exhibición de velocidades, dirígete a <b>Capas del Mapa > Vías > Mostrar velocidades</b> o usa el acceso directo <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Predeterminado',
                        altViennaConv: 'Convención de Viena Alternativa',
                        japan: 'Japón',
                        northAmerica: 'América del Norte',
                        sacu: 'Unión Aduanera de África Austral',
                        uk: 'Reino Unido',
                    },
                    btn: {
                        updateSettingsTab: 'Actualizar menú',
                        resetSettings: 'Restablecer configuración',
                        seeOnDiscuss: 'Ver en el Debate',
                        seeOnDiscord: 'Ver en Discord',
                        scriptDevBy: 'Script desarrollado por Luan Tavares',
                    }
                };                
                
                break;

            case 'et':
                // Estonian
                translations = {
                    name: 'Kiiruskuva',
                    zoomOut: 'Kaugemal',
                    zoomIn: 'Lähemal',
                    changelog: 'Muudatuste ajalugu',
                    changelogMessage: `<h6>Mis on uut:</h6><ul style="margin-bottom: 10px"><li>"Ikoonide värskendamine viivitusega" teade eemaldati ja asendati lihtsa ikooniga, mis näitab, kui skript töötleb veel kiirusikoonide andmeid (pea meeles, et värskendusel on tahtlik viivitus).</li></ul><h6>Parandused ja täiendused:</h6><ul><li>Vahekaardi "üldine" nimi muudeti "seadistused", et paremini mõista iga vahekaardi funktsiooni skriptis;</li><li>Segmendi pikkuse filter ei eemalda enam ikooni, vaid rakendab nüüd sama läbipaistvuse nagu kiirusfiltris.</li></ul>`,
                    close: 'Sulge',
                    viewScript: 'Vaata skripti',
                    viewChangelog: 'Vaata muudatuste ajalugu',
                    reset: 'Lähtesta',
                    snackbar: {
                        errorFiltering: 'Viga filtri rakendamisel. Minimaalne kiirus ei saa olla suurem kui maksimaalne.',
                    },
                    title: {
                        settings: 'Seaded',
                        roadTypes: 'Teetüübid',
                        filter: 'Filtrid',
                        appearence: 'Välimus',
                        showOnRoadType: 'Kuva järgmistes teetüüpides:',
                        seeOnDiscuss: 'Vaata skripti teemat Discussis',
                        seeOnDiscord: 'Vaata skripti kanalit Waze Scripti Discord serveris',
                        scriptDevBy: 'Vaadake minu redaktori kasutajaprofiili',
                    },
                    label: {
                        displaySpeeds: 'Kuva kiirus',
                        showNoSpeed: 'Kuva ilma kiiruseta segmentidel',
                        showOnRoundabout: 'Kuva ringteel',
                        showOnUnpaved: 'Kuva kõvaketšimata teedel',
                        maxZoom: 'Kuva kuni suumi tasemeni:',
                        toggleLayerShortcut: 'Kiiruskuva kihi vahetamise otsetee',
                        zIndex: 'Kihi sügavus',
                        hideShorterSegments: 'Peida lühemad segmendid',
                        speedFilter: 'Filtreeri kiiruse järgi',
                        min: 'Miinimum:',
                        max: 'Maksimum:',
                        opacity: 'Filtri opakuse tasand:',
                    },
                    alertMessage: {
                        zIndex: `Kui kasutad kihi sügavust üle <b>${this.zIndex.warn}</b>, kattub kiiruskiht teiste kihtidega ja te ei saa valida ühtegi elementi ekraanil enne, kui vähendate kihi sügavust alla <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Kiiruskihtide nähtavuse vahetamiseks mine <b>Kaardi kihid > Teed > Kuvada kiirus</b> või kasuta kiirklahvi <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Vaikimisi',
                        altViennaConv: 'Alternatiivne Viini konventsioon',
                        japan: 'Jaapan',
                        northAmerica: 'Põhja-Ameerika',
                        sacu: 'Lõuna-Aafrika Tolliliit',
                        uk: 'Ühendkuningriik',
                    },
                    btn: {
                        updateSettingsTab: 'Uuenda menüü',
                        resetSettings: 'Lähtesta seaded',
                        seeOnDiscuss: 'Vaata arutelus',
                        seeOnDiscord: 'Vaata Discordis',
                        scriptDevBy: 'Skripti arendas Luan Tavares',
                    }
                };
            
                break;
            
            
            case 'eu':
                // Basque
                translations = {
                    name: 'Abiadura Erakustea',
                    zoomOut: 'Hurbilago',
                    zoomIn: 'Aldez aurretik',
                    changelog: 'Aldaketa erregistroa',
                    changelogMessage: `<h6>Berrikuntzak:</h6><ul style="margin-bottom: 10px"><li>"Ikonoak atzerapenarekin eguneratzen" mezua kendu eta ikono sinple batekin ordezkatu da, script-ak oraindik abiadura-ikonoak prozesatzen ari dela adierazteko (gogoratu eguneratzean atzerapen bat dagoela nahita).</li></ul><h6>Zuzendutakoak eta hobekuntzak:</h6><ul><li>"Orokorra" izeneko fitxa "doikuntzak" izenera aldatu da, fitxa bakoitzaren funtzioa argiago ulertzeko;</li><li>Segmentuaren tamainaren iragazkia ez du ikonoa kentzen, baizik eta abiadura-iragazkiarekin erabiltzen den gardentasun bera aplikatzen du.</li></ul>`,
                    close: 'Itxi',
                    viewScript: 'Ikusi script-a',
                    viewChangelog: 'Ikusi aldaketak',
                    reset: 'Berrezarri',
                    snackbar: {
                        errorFiltering: 'Errorea iragazkia aplikatzean. Gutxieneko abiadura ezin da handiagoa izan gehienekoa baino.',
                    },
                    title: {
                        settings: 'Ezarpenak',
                        roadTypes: 'Errepide motak',
                        filter: 'Filtratu',
                        appearence: 'Itxura',
                        showOnRoadType: 'Erakutsi hurrengo errepide motetan:',
                        seeOnDiscuss: 'Ikusi skriptaren haria Discuss-en',
                        seeOnDiscord: 'Ikusi skriptaren kanala Waze Script-en Discord zerbitzuan',
                        scriptDevBy: 'Ikusi nire editorearen erabiltzaile-profila',
                    },
                    label: {
                        displaySpeeds: 'Erakutsi abiadurak',
                        showNoSpeed: 'Erakutsi abiadurarik gabeko segmentuetan',
                        showOnRoundabout: 'Erakutsi biribilguneetan',
                        showOnUnpaved: 'Erakutsi asfaltatu gabeko bideetan',
                        maxZoom: 'Erakutsi zoom maila honetara arte:',
                        toggleLayerShortcut: 'Abiadura geruza aldatu laburdura',
                        zIndex: 'Geruzaren sakonera',
                        hideShorterSegments: 'Ezkutatu segmentu txikiagoak',
                        speedFilter: 'Iragazi abiaduraren arabera',
                        min: 'Gutxiengoa:',
                        max: 'Maximoa:',
                        opacity: 'Filtroko opazitatea maila:',
                    },
                    alertMessage: {
                        zIndex: `Geruza sakonera <b>${this.zIndex.warn}</b> baino handiagoa bada, abiadura geruzak beste geruzak estaliko ditu eta ezin izango duzu elementurik aukeratu pantailan, <b>${this.zIndex.warn}</b> baino baxuagoa den geruzarekin berriro jaitsi arte.`,
                        toggleVisibility: `Abiadura geruza bistaratzea aktibatu/itzaltzeko, joan <b>Mapa geruzak > Bideak > Abiadura erakutsi</b> eta erabili laburdura <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Definitibo',
                        altViennaConv: 'Alternatibo Vienna Konbentzioa',
                        japan: 'Japonia',
                        northAmerica: 'Ipar Amerika',
                        sacu: 'Hegoaldeko Afrikako Aduana Batasuna',
                        uk: 'Erresuma Batua',
                    },
                    btn: {
                        updateSettingsTab: 'Eguneratu menu',
                        resetSettings: 'Berrezarri ezarpenak',
                        seeOnDiscuss: 'Ikusi eztabaidan',
                        seeOnDiscord: 'Ikusi Discord-en',
                        scriptDevBy: 'Script-a Luan Tavares-ek garatu du',
                    }
                };
            
                break;
            
            case 'fa-IR':
                // Persian (Iran)
                translations = {
                    name: 'نمایش سرعت',
                    zoomOut: 'بیشتر دور',
                    zoomIn: 'بیشتر نزدیک',
                    changelog: 'تغییرات ثبت شده',
                    changelogMessage: `<h6>جدیدترین‌ها:</h6><ul style="margin-bottom: 10px"><li>پیام "در حال به‌روزرسانی آیکون‌ها با تأخیر" بالاخره حذف و با یک آیکون ساده جایگزین شد که نشان می‌دهد اسکریپت هنوز در حال پردازش آیکون‌های سرعت است (به خاطر داشته باشید که تأخیری عمدی وجود دارد).</li></ul><h6>اصلاحات و بهبودها:</h6><ul><li>نام تب "عمومی" به "تنظیمات" تغییر یافت تا عملکرد هر تب واضح‌تر شود؛</li><li>فیلتر اندازه بخش دیگر آیکون را حذف نمی‌کند بلکه از شفافیت مشابه فیلتر سرعت استفاده می‌کند.</li></ul>`,
                    close: 'بستن',
                    viewScript: 'مشاهده اسکریپت',
                    viewChangelog: 'مشاهده تغییرات ثبت شده',
                    reset: 'بازنشانی',
                    snackbar: {
                        errorFiltering: 'خطا در اعمال فیلتر. حداقل سرعت نمی‌تواند بیشتر از حداکثر باشد.',
                    },
                    title: {
                        settings: 'تنظیمات',
                        roadTypes: 'انواع جاده‌ها',
                        filter: 'فیلتر',
                        appearence: 'ظاهر',
                        showOnRoadType: 'نمایش در انواع جاده‌های زیر:',
                        seeOnDiscuss: 'مطالعه موضوع اسکریپت در Discuss',
                        seeOnDiscord: 'مشاهده کانال اسکریپت در سرور Discord اسکریپت‌های Waze',
                        scriptDevBy: 'مشاهده نمایه کاربری ویرایشگر من',
                    },
                    label: {
                        displaySpeeds: 'نمایش سرعت ها',
                        showNoSpeed: 'نمایش در بخش هایی بدون سرعت',
                        showOnRoundabout: 'نمایش در چرخشگاه ها',
                        showOnUnpaved: 'نمایش در جاده های خاکی',
                        maxZoom: 'نمایش تا زوم:',
                        toggleLayerShortcut: 'تغییر لایه نمایش سرعت',
                        zIndex: 'عمق لایه',
                        hideShorterSegments: 'مخفی کردن بخش های کوتاه تر از',
                        speedFilter: 'فیلتر بر اساس سرعت',
                        min: 'حداقل:',
                        max: 'حداکثر:',
                        opacity: 'سطح شفافیت فیلتر:',
                    },
                    alertMessage: {
                        zIndex: `اگر از عمق لایه بیشتر از <b>${this.zIndex.warn}</b> استفاده کنید، لایه سرعت بر روی لایه های دیگر قرار می گیرد و شما نمی توانید هیچ عنصری را در صفحه انتخاب کنید تا زمانی که عمق لایه را به کمتر از <b>${this.zIndex.warn}</b> کاهش دهید.`,
                        toggleVisibility: `برای فعال/غیرفعال کردن لایه نمایش سرعت، به <b>لایه های نقشه > جاده ها > نمایش سرعت</b> بروید یا از میانبر <b>ALT</b> + <b>SHIFT</b> + <b>S</b> استفاده کنید`
                    },
                    theme: {
                        default: 'پیش‌فرض',
                        altViennaConv: 'کنوانسیون وین جایگزین',
                        japan: 'ژاپن',
                        northAmerica: 'آمریکای شمالی',
                        sacu: 'اتحادیه گمرکی جنوب آفریقا',
                        uk: 'پادشاهی متحد',
                    },
                    btn: {
                        updateSettingsTab: 'به روز رسانی منو',
                        resetSettings: 'بازنشانی تنظیمات',
                        seeOnDiscuss: 'مشاهده در بحث',
                        seeOnDiscord: 'مشاهده در دیسکورد',
                        scriptDevBy: 'اسکریپت توسط لوان تاوارس توسعه داده شده است',
                    }
                };
            
                break;

            case 'fi':
                // Finnish
                translations = {
                    name: 'Nopeusnäyttö',
                    zoomOut: 'Laajenna',
                    zoomIn: 'Lähennä',
                    changelog: 'Muutokset',
                    changelogMessage: `<h6>Uutta:</h6><ul style="margin-bottom: 10px"><li>"Päivitän kuvakkeita viiveellä" -viesti on poistettu ja korvattu yksinkertaisella kuvakkeella, joka osoittaa, kun skripti edelleen käsittelee nopeusikoneita (muista, että päivityksessä on tarkoituksellinen viive).</li></ul><h6>Korjaukset ja parannukset:</h6><ul><li>"Yleinen"-välilehden nimi on muutettu muotoon "asetukset", jotta skriptin välilehtien tarkoitus olisi selkeämpi;</li><li>Segmenttikoon suodatin ei enää poista kuvaketta vaan käyttää samaa läpinäkyvyyttä kuin nopeussuodatin.</li></ul>`,
                    close: 'Sulje',
                    viewScript: 'Näytä skripti',
                    viewChangelog: 'Näytä muutokset',
                    reset: 'Palauta',
                    snackbar: {
                        errorFiltering: 'Virhe suodatinta sovellettaessa. Vähimmäisnopeus ei voi olla suurempi kuin enimmäisnopeus.',
                    },
                    title: {
                        settings: 'Asetukset',
                        roadTypes: 'Tiestötyypit',
                        filter: 'Suodatin',
                        appearence: 'Ulkoasu',
                        showOnRoadType: 'Näytä seuraavilla tietyyppien alueilla:',
                        seeOnDiscuss: 'Katso skriptin ketju Discussissa',
                        seeOnDiscord: 'Katso skriptin kanava Waze Scriptin Discord-palvelimella',
                        scriptDevBy: 'Näytä editorini käyttäjäprofiili',
                    },
                    label: {
                        displaySpeeds: 'Näytä nopeudet',
                        showNoSpeed: 'Näytä segmentissä, jossa ei ole nopeutta',
                        showOnRoundabout: 'Näytä liikenneympyrässä',
                        showOnUnpaved: 'Näytä päällystämättömällä tiellä',
                        maxZoom: 'Renderöi zoom-tasoon asti:',
                        toggleLayerShortcut: 'Vaihda nopeuskerroksen näkyvyyttä',
                        zIndex: 'Kerrosjärjestys',
                        hideShorterSegments: 'Piilota lyhyemmät segmentit kuin',
                        speedFilter: 'Suodata nopeuden mukaan',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Suodattimen läpinäkyvyysaste:',
                    },
                    alertMessage: {
                        zIndex: `Kun käytät suurempaa kerrosjärjestystä kuin <b>${this.zIndex.warn}</b>, nopeuskerros peittää muut ja et voi valita mitään elementtiä näytöltä, ennen kuin lasket sen takaisin alle <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Voit aktivoida/poistaa käytöstä nopeuskerroksen menemällä kohtaan <b>Karttatasot > Tiet > Näytä nopeudet</b> tai käyttämällä pikanäppäintä <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Oletus',
                        altViennaConv: 'Vaihtoehtoinen Wienin sopimus',
                        japan: 'Japani',
                        northAmerica: 'Pohjois-Amerikka',
                        sacu: 'Etelä-Afrikan tulliliitto',
                        uk: 'Yhdistynyt kuningaskunta',
                    },
                    btn: {
                        updateSettingsTab: 'Päivitä valikko',
                        resetSettings: 'Palauta asetukset',
                        seeOnDiscuss: 'Katso keskustelussa',
                        seeOnDiscord: 'Katso Discordissa',
                        scriptDevBy: 'Skriptin on kehittänyt Luan Tavares',
                    }
                };

                break;

            case 'fr':
                // French
                translations = {
                    name: 'Affichage de la vitesse',
                    zoomOut: 'Zoom arrière',
                    zoomIn: 'Zoom avant',
                    changelog: 'Journal des modifications',
                    changelogMessage: `<h6>Nouveautés :</h6><ul style="margin-bottom: 10px"><li>Le message "mise à jour des icônes avec délai" a été supprimé et remplacé par une icône simple indiquant que le script traite encore les icônes de vitesse (n'oubliez pas qu'il y a un délai intentionnel).</li></ul><h6>Corrections et améliorations :</h6><ul><li>L'onglet "général" a été renommé en "réglages" pour mieux clarifier la fonction de chaque onglet du script ;</li><li>Le filtre de taille de segment n'enlève plus l'icône mais applique maintenant la même opacité que le filtre de vitesse.</li></ul>`,
                    close: 'Fermer',
                    viewScript: 'Voir le script',
                    viewChangelog: 'Voir le journal des modifications',
                    reset: 'Réinitialiser',
                    snackbar: {
                        errorFiltering: 'Erreur lors de l’application du filtre. La vitesse minimale ne peut pas être supérieure à la maximale.',
                    },
                    title: {
                        settings: 'Paramètres',
                        roadTypes: 'Types de route',
                        filter: 'Filtrer',
                        appearence: 'Apparence',
                        showOnRoadType: 'Afficher sur les types de route suivants :',
                        seeOnDiscuss: 'Voir le fil du script sur Discuss',
                        seeOnDiscord: 'Voir le canal du script sur le serveur Discord de Waze Script',
                        scriptDevBy: 'Voir mon profil utilisateur de l’éditeur',
                    },
                    label: {
                        displaySpeeds: 'Afficher les vitesses',
                        showNoSpeed: 'Afficher sur les segments sans vitesse',
                        showOnRoundabout: 'Afficher sur le rond-point',
                        showOnUnpaved: 'Afficher sur la voie non pavée',
                        maxZoom: 'Rendre jusqu\'au zoom :',
                        toggleLayerShortcut: 'Alterner la visibilité de la couche de vitesse',
                        zIndex: 'Profondeur de la couche',
                        hideShorterSegments: 'Masquer sur les segments plus petits que',
                        speedFilter: 'Filtrer par vitesse',
                        min: 'Min. :',
                        max: 'Max. :',
                        opacity: 'Niveau de transparence du filtre:',
                    },
                    alertMessage: {
                        zIndex: `Lorsque vous utilisez une profondeur de couche supérieure à <b>${this.zIndex.warn}</b>, la couche de vitesse va se superposer aux autres et vous ne pourrez sélectionner aucun élément sur l\'écran jusqu\'à ce que vous la fassiez descendre sous <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Pour activer/désactiver la couche de vitesse, allez dans <b>Couches de la carte > Routes > Afficher les vitesses</b> ou utilisez le raccourci <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Par défaut',
                        altViennaConv: 'Convention de Vienne alternative',
                        japan: 'Japon',
                        northAmerica: 'Amérique du Nord',
                        sacu: 'Union douanière d\'Afrique australe',
                        uk: 'Royaume-Uni',
                    },
                    btn: {
                        updateSettingsTab: 'Mettre à jour le menu',
                        resetSettings: 'Réinitialiser les paramètres',
                        seeOnDiscuss: 'Voir sur la discussion',
                        seeOnDiscord: 'Voir sur Discord',
                        scriptDevBy: 'Script développé par Luan Tavares',
                    }
                };
                
                break;

            case 'gl':
                // Galician
                translations = {
                    name: 'Exhibición de velocidade',
                    zoomOut: 'Máis afastado',
                    zoomIn: 'Máis achegado',
                    changelog: 'Rexistro de cambios',
                    changelogMessage: `<h6>Novedades:</h6><ul style="margin-bottom: 10px"><li>Eliminouse finalmente a mensaxe de "actualización dos iconos con atraso" e substituíuse por un icono sinxelo, indicando claramente cando o script segue a procesar os iconos de velocidade (lembre que hai un atraso intencionado).</li></ul><h6>Correccións e melloras:</h6><ul><li>Cambiouse o nome da lapela "xeral" a "axustes" para unha mellor comprensión da función de cada lapela do script;</li><li>O filtro por tamaño de segmento xa non elimina o icono, agora aplica a mesma opacidade que o filtro de velocidade.</li></ul>`,
                    close: 'Pechar',
                    viewScript: 'Ver script',
                    viewChangelog: 'Ver rexistro de cambios',
                    reset: 'Restablecer',
                    snackbar: {
                        errorFiltering: 'Erro ao aplicar o filtro. A velocidade mínima non pode ser maior que a máxima.',
                    },
                    title: {
                        settings: 'Configuracións',
                        roadTypes: 'Tipos de estrada',
                        filter: 'Filtro',
                        appearence: 'Aparencia',
                        showOnRoadType: 'Amosar nos seguintes tipos de estrada:',
                        seeOnDiscuss: 'Ver o fío do script en Discuss',
                        seeOnDiscord: 'Ver o canal do script no servidor Discord de Waze Script',
                        scriptDevBy: 'Ver o meu perfil de usuario do editor',
                    },
                    label: {
                        displaySpeeds: 'Exhibir velocidades',
                        showNoSpeed: 'Exhibir en segmentos sen velocidade',
                        showOnRoundabout: 'Exhibir en rotondas',
                        showOnUnpaved: 'Exhibir en vías non pavimentadas',
                        maxZoom: 'Renderizar ata o zoom:',
                        toggleLayerShortcut: 'Alternar capa de exhibición de velocidade',
                        zIndex: 'Profundidade da capa',
                        hideShorterSegments: 'Ocultar en segmentos máis pequenos que',
                        speedFilter: 'Filtrar por velocidade',
                        min: 'Mín.:',
                        max: 'Máx.:',
                        opacity: 'Nivel de opacidade do filtro:',
                    },
                    alertMessage: {
                        zIndex: `Ao usar unha profundidade de capa maior que <b>${this.zIndex.warn}</b>, a capa de velocidade cubrirá outras capas e non poderá seleccionar ningún elemento na pantalla ata que a baixe por debaixo de <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Para activar/desactivar a capa de exhibición de velocidades, vai a <b>Capas do mapa > Vías > Exhibir velocidades</b> ou utiliza o atallo <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Por defecto',
                        altViennaConv: 'Convención de Viena alternativa',
                        japan: 'Japón',
                        northAmerica: 'América do Norte',
                        sacu: 'Unión Aduanera de África Austral',
                        uk: 'Reino Unido',
                    },
                    btn: {
                        updateSettingsTab: 'Actualizar menú',
                        resetSettings: 'Restablecer configuracións',
                        seeOnDiscuss: 'Ver na discusión',
                        seeOnDiscord: 'Ver en Discord',
                        scriptDevBy: 'Script desenvolvido por Luan Tavares',
                    }
                };
            
                break;
            
            case 'he':
                // Hebrew
                translations = {
                    name: 'הצגת מהירות',
                    zoomOut: 'מרחוק יותר',
                    zoomIn: 'מקרוב יותר',
                    changelog: 'יומן שינויים',
                    changelogMessage: `<h6>מה חדש:</h6><ul style="margin-bottom: 10px"><li>הוסר סוף סוף ההודעה "מעדכן סמלים עם השהיה" והוחלף באייקון פשוט, המבהיר מתי הסקריפט עדיין מעבד את סמלי המהירות (זכור שיש עיכוב מכוון).</li></ul><h6>תיקונים ושיפורים:</h6><ul><li>שונה שם הלשונית מ"כללי" ל"הגדרות" לשם הבנה טובה יותר של תפקוד כל לשונית;</li><li>הפילטר לפי אורך קטע אינו מסיר עוד את האייקון, אלא מיישם שקיפות כפי שנעשה בפילטר המהירות.</li></ul>`,
                    close: 'סגור',
                    viewScript: 'צפה בסקריפט',
                    viewChangelog: 'צפה ביומן השינויים',
                    reset: 'אפס',
                    snackbar: {
                        errorFiltering: 'שגיאה ביישום המסנן. המהירות המינימלית לא יכולה להיות גבוהה מהמהירות המרבית.',
                    },
                    title: {
                        settings: 'הגדרות',
                        roadTypes: 'סוגי דרכים',
                        filter: 'סנן',
                        appearence: 'מראה',
                        showOnRoadType: 'הצג על סוגי הדרכים הבאים:',
                        seeOnDiscuss: 'ראה את השרשור של הסקריפט ב-Discuss',
                        seeOnDiscord: 'ראה את הערוץ של הסקריפט בשרת Discord של Waze Script',
                        scriptDevBy: 'הצג את פרופיל המשתמש של העורך שלי',
                    },
                    label: {
                        displaySpeeds: 'הצג מהירויות',
                        showNoSpeed: 'הצג בקטעים ללא מהירות',
                        showOnRoundabout: 'הצג בכיכרות',
                        showOnUnpaved: 'הצג בדרכים לא סלוליות',
                        maxZoom: 'הצג עד לזום:',
                        toggleLayerShortcut: 'החלף שכבת הצגת מהירות',
                        zIndex: 'עומק השכבה',
                        hideShorterSegments: 'הסתר בקטעים קצרים מ-',
                        speedFilter: 'סנן לפי מהירות',
                        min: 'מינימום:',
                        max: 'מקסימום:',
                        opacity: 'רמת שקיפות המסנן:',
                    },
                    alertMessage: {
                        zIndex: `כאשר משתמשים בעומק שכבה גבוה יותר מ- <b>${this.zIndex.warn}</b>, שכבת המהירות תכסה שכבות אחרות ולא ניתן יהיה לבחור אף פריט על המסך עד שתרד את עומק השכבה מתחת ל- <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `כדי להפעיל/לכבות את שכבת הצגת המהירויות, פשוט לכו ל- <b>שכבות המפה > דרכים > הצג מהירויות</b> או השתמשו בקיצור הדרך <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'ברירת מחדל',
                        altViennaConv: 'אמנת וינה חלופין',
                        japan: 'יפן',
                        northAmerica: 'צפון אמריקה',
                        sacu: 'איחוד המכס של דרום אפריקה',
                        uk: 'הממלכה המאוחדת',
                    },
                    btn: {
                        updateSettingsTab: 'עדכן תפריט',
                        resetSettings: 'אפס הגדרות',
                        seeOnDiscuss: 'ראה בדיון',
                        seeOnDiscord: 'ראה ב-Discord',
                        scriptDevBy: 'הסקריפט פותח על ידי לואן טאווארס',
                    }
                };
            
                break;
            
            case 'hi':
                // Hindi
                translations = {
                    name: 'स्पीड डिस्प्ले',
                    zoomOut: 'और दूर',
                    zoomIn: 'और पास',
                    changelog: 'चेंजलॉग',
                    changelogMessage: `<h6>नवीनतम:</h6><ul style="margin-bottom: 10px"><li>"विलंब से आइकन अपडेट हो रहे हैं" संदेश को अंततः हटा दिया गया है और इसे एक सरल आइकन से बदल दिया गया है, जो स्पष्ट करता है कि स्क्रिप्ट अभी भी गति आइकन को प्रोसेस कर रही है (ध्यान दें कि अद्यतन में जानबूझकर देरी है)।</li></ul><h6>सुधार और बेहतरियाँ:</h6><ul><li>"सामान्य" टैब का नाम "सेटिंग्स" में बदल दिया गया है ताकि प्रत्येक टैब की भूमिका स्पष्ट हो सके;</li><li>सेगमेंट साइज़ फ़िल्टर अब आइकन को नहीं हटाता, बल्कि गति फ़िल्टर जैसी ही पारदर्शिता लागू करता है।</li></ul>`,
                    close: 'बंद करें',
                    viewScript: 'स्क्रिप्ट देखें',
                    viewChangelog: 'चेंजलॉग देखें',
                    reset: 'रीसेट',
                    snackbar: {
                        errorFiltering: 'फ़िल्टर लागू करने में त्रुटि। न्यूनतम गति अधिकतम से अधिक नहीं हो सकती।',
                    },
                    title: {
                        settings: 'सेटिंग्स',
                        roadTypes: 'सड़क प्रकार',
                        filter: 'फ़िल्टर',
                        appearence: 'रूप',
                        showOnRoadType: 'निम्नलिखित सड़क प्रकारों पर दिखाएं:',
                        seeOnDiscuss: 'Discuss पर स्क्रिप्ट का थ्रेड देखें',
                        seeOnDiscord: 'Waze Script के Discord सर्वर पर स्क्रिप्ट चैनल देखें',
                        scriptDevBy: 'मेरा संपादक उपयोगकर्ता प्रोफ़ाइल देखें',
                    },
                    label: {
                        displaySpeeds: 'गति दिखाएं',
                        showNoSpeed: 'गति के बिना सेगमेंट में दिखाएं',
                        showOnRoundabout: 'राउंडअबाउट में दिखाएं',
                        showOnUnpaved: 'अस्फल्टेड सड़कों पर दिखाएं',
                        maxZoom: 'जूम स्तर तक रेंडर करें:',
                        toggleLayerShortcut: 'स्पीड डिस्प्ले लेयर बदलें',
                        zIndex: 'लेयर की गहराई',
                        hideShorterSegments: 'छोटे सेगमेंट को छुपाएं',
                        speedFilter: 'गति के अनुसार फ़िल्टर करें',
                        min: 'न्यूनतम:',
                        max: 'अधिकतम:',
                        opacity: 'फ़िल्टर अपारदर्शिता स्तर:',
                    },
                    alertMessage: {
                        zIndex: `यदि आप <b>${this.zIndex.warn}</b> से बड़ी लेयर गहराई का उपयोग करते हैं, तो स्पीड डिस्प्ले अन्य लेयर्स के ऊपर आ जाएगा और स्क्रीन पर कोई भी तत्व चयनित नहीं किया जा सकेगा, जब तक कि आप इसे <b>${this.zIndex.warn}</b> से नीचे नहीं कर देते।`,
                        toggleVisibility: `स्पीड डिस्प्ले लेयर को सक्रिय/निष्क्रिय करने के लिए, बस <b>मैप लेयर्स > सड़कें > स्पीड डिस्प्ले</b> पर जाएं या शॉर्टकट का उपयोग करें <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'डिफ़ॉल्ट',
                        altViennaConv: 'वैकल्पिक वियना सम्मेलन',
                        japan: 'जापान',
                        northAmerica: 'उत्तरी अमेरिका',
                        sacu: 'दक्षिण अफ़्रीकी सीमा शुल्क संघ',
                        uk: 'संयुक्त राज्य',
                    },
                    btn: {
                        updateSettingsTab: 'मेन्‍यू अपडेट करें',
                        resetSettings: 'सेटिंग्स रीसेट करें',
                        seeOnDiscuss: 'चर्चा में देखें',
                        seeOnDiscord: 'Discord पर देखें',
                        scriptDevBy: 'स्क्रिप्ट लुआन तावरेस द्वारा विकसित की गई है',
                    }
                };
            
                break;
            
            case 'hr':
                // Croatian
                translations = {
                    name: 'Prikaz brzine',
                    zoomOut: 'Više udaljeno',
                    zoomIn: 'Više približeno',
                    changelog: 'Povijest izmjena',
                    changelogMessage: `<h6>Novosti:</h6><ul style="margin-bottom: 10px"><li>Poruka "ažuriranje ikona s odgodom" konačno je uklonjena i zamijenjena jednostavnom ikonom koja jasno pokazuje kada skripta još uvijek obrađuje ikone brzine (imajte na umu da postoji namjerno kašnjenje).</li></ul><h6>Ispravci i poboljšanja:</h6><ul><li>Kartica "opće" preimenovana je u "postavke" radi boljeg razumijevanja funkcije svake kartice;</li><li>Filtar veličine segmenta više ne uklanja ikonu, već sada primjenjuje istu neprozirnost kao i filtar brzine.</li></ul>`,
                    close: 'Zatvori',
                    viewScript: 'Pogledaj skriptu',
                    viewChangelog: 'Pogledaj povijest izmjena',
                    reset: 'Poništi',
                    snackbar: {
                        errorFiltering: 'Pogreška pri primjeni filtra. Minimalna brzina ne može biti veća od maksimalne.',
                    },
                    title: {
                        settings: 'Postavke',
                        roadTypes: 'Vrste cesta',
                        filter: 'Filtriraj',
                        appearence: 'Izgled',
                        showOnRoadType: 'Prikaži na sljedećim vrstama cesta:',
                        seeOnDiscuss: 'Pogledajte temu skripte na Discussu',
                        seeOnDiscord: 'Pogledajte kanal skripte na Waze Script Discord poslužitelju',
                        scriptDevBy: 'Pogledajte moj korisnički profil uređivača',
                    },
                    label: {
                        displaySpeeds: 'Prikazuj brzine',
                        showNoSpeed: 'Prikazuj na segmentima bez brzine',
                        showOnRoundabout: 'Prikazuj na kružnim tokovima',
                        showOnUnpaved: 'Prikazuj na neasfaltiranim cestama',
                        maxZoom: 'Prikazuj do razine zooma:',
                        toggleLayerShortcut: 'Prekidač sloja za prikaz brzine',
                        zIndex: 'Dubina sloja',
                        hideShorterSegments: 'Sakrij segmente kraće od',
                        speedFilter: 'Filtriraj prema brzini',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Razina neprozirnosti filtra:',
                    },
                    alertMessage: {
                        zIndex: `Ako koristite dubinu sloja veću od <b>${this.zIndex.warn}</b>, sloj brzine će se preklapati s drugim slojevima i neće biti moguće odabrati bilo koji element na ekranu dok ga ne spustite ispod <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Za aktiviranje/deaktiviranje sloja prikaza brzine, jednostavno idite na <b>Slabe mape > Ceste > Prikaz brzina</b> ili koristite prečac <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Zadano',
                        altViennaConv: 'Alternativna Bečka konvencija',
                        japan: 'Japan',
                        northAmerica: 'Sjeverna Amerika',
                        sacu: 'Južnoafrička unija carina',
                        uk: 'Ujedinjeno Kraljevstvo',
                    },
                    btn: {
                        updateSettingsTab: 'Ažuriraj izbornik',
                        resetSettings: 'Vrati postavke na zadane',
                        seeOnDiscuss: 'Pogledajte u raspravi',
                        seeOnDiscord: 'Pogledajte na Discordu',
                        scriptDevBy: 'Skript je razvio Luan Tavares',
                    }
                };
            
                break;
            
            case 'hu':
                // Hungarian
                translations = {
                    name: 'Sebesség megjelenítése',
                    zoomOut: 'Távolabb',
                    zoomIn: 'Közelebb',
                    changelog: 'Változási napló',
                    changelogMessage: `<h6>Újdonságok:</h6><ul style="margin-bottom: 10px"><li>Végre eltávolítottuk a "késleltetett ikonfrissítés" üzenetet, és egyszerű ikonnal helyettesítettük, jelezve, hogy a szkript még dolgozik a sebességikonokon (ne feledje, a frissítés szándékosan késik).</li></ul><h6>Javítások és fejlesztések:</h6><ul><li>Az "általános" fül neve mostantól "beállítások" a jobb érthetőség érdekében;</li><li>A szegmensméret szűrő mostantól nem távolítja el az ikont, hanem ugyanolyan áttetszőséget alkalmaz, mint a sebességszűrő.</li></ul>`,
                    close: 'Bezárás',
                    viewScript: 'Szkript megtekintése',
                    viewChangelog: 'Változási napló megtekintése',
                    reset: 'Visszaállítás',
                    snackbar: {
                        errorFiltering: 'Hiba a szűrő alkalmazásakor. A minimális sebesség nem lehet nagyobb, mint a maximális.',
                    },
                    title: {
                        settings: 'Beállítások',
                        roadTypes: 'Úttípusok',
                        filter: 'Szűrő',
                        appearence: 'Megjelenés',
                        showOnRoadType: 'Megjelenítés a következő úttípusokon:',
                        seeOnDiscuss: 'Nézd meg a script témáját a Discuss-on',
                        seeOnDiscord: 'Nézd meg a script csatornát a Waze Script Discord szerverén',
                        scriptDevBy: 'Tekintse meg a szerkesztői felhasználói profilomat',
                    },
                    label: {
                        displaySpeeds: 'Sebességek megjelenítése',
                        showNoSpeed: 'Megjelenítés sebesség nélküli szegmenseken',
                        showOnRoundabout: 'Megjelenítés körforgalomban',
                        showOnUnpaved: 'Megjelenítés burkolatlan úton',
                        maxZoom: 'Renderelés legnagyobb zoom szinten:',
                        toggleLayerShortcut: 'Sebesség réteg átváltása',
                        zIndex: 'Réteg mélysége',
                        hideShorterSegments: 'Rejtsd el a rövidebb szegmenseket, mint',
                        speedFilter: 'Szűrés sebesség szerint',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Szűrő átlátszóság szintje:',
                    },
                    alertMessage: {
                        zIndex: `Ha a réteg mélysége nagyobb, mint <b>${this.zIndex.warn}</b>, a sebesség réteg átfedheti a többi réteget, és nem lesz lehetőség semmilyen elem kiválasztására a képernyőn, amíg le nem csökkenti <b>${this.zIndex.warn}</b> alá.`,
                        toggleVisibility: `A sebesség réteg láthatóságának aktiválásához/deaktiválásához egyszerűen menjen ide: <b>Térképrétegek > Út > Sebesség megjelenítése</b>, vagy használja a gyorsbillentyűt <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Alapértelmezett',
                        altViennaConv: 'Alternatív Bécsi Egyezmény',
                        japan: 'Japán',
                        northAmerica: 'Észak-Amerika',
                        sacu: 'Dél-afrikai Vámunió',
                        uk: 'Egyesült Királyság',
                    },
                    btn: {
                        updateSettingsTab: 'Menü frissítése',
                        resetSettings: 'Beállítások visszaállítása',
                        seeOnDiscuss: 'Nézd meg a vitában',
                        seeOnDiscord: 'Nézd meg Discordon',
                        scriptDevBy: 'A scriptet Luan Tavares fejlesztette',
                    }
                };
            
                break;
            
            case 'id':
                // Indonesian
                translations = {
                    name: 'Tampilan Kecepatan',
                    zoomOut: 'Lebih jauh',
                    zoomIn: 'Lebih dekat',
                    changelog: 'Catatan perubahan',
                    changelogMessage: `<h6>Baru:</h6><ul style="margin-bottom: 10px"><li>Pesan "memperbarui ikon dengan jeda" akhirnya dihapus dan diganti dengan ikon sederhana, memperjelas saat skrip masih memproses ikon kecepatan (ingat bahwa ada penundaan yang disengaja).</li></ul><h6>Perbaikan dan peningkatan:</h6><ul><li>Nama tab "umum" diubah menjadi "pengaturan" untuk memperjelas fungsi setiap tab dalam skrip;</li><li>Filter ukuran segmen sekarang tidak lagi menghapus ikon, tetapi menerapkan tingkat transparansi yang sama dengan filter kecepatan.</li></ul>`,
                    close: 'Tutup',
                    viewScript: 'Lihat skrip',
                    viewChangelog: 'Lihat catatan perubahan',
                    reset: 'Atur ulang',
                    snackbar: {
                        errorFiltering: 'Kesalahan dalam menerapkan filter. Kecepatan minimum tidak boleh lebih besar dari maksimum.',
                    },
                    title: {
                        settings: 'Pengaturan',
                        roadTypes: 'Tipe Jalan',
                        filter: 'Filter',
                        appearence: 'Tampilan',
                        showOnRoadType: 'Tampilkan pada tipe jalan berikut:',
                        seeOnDiscuss: 'Lihat thread skrip di Discuss',
                        seeOnDiscord: 'Lihat saluran skrip di server Discord Waze Script',
                        scriptDevBy: 'Lihat profil pengguna editor saya',
                    },
                    label: {
                        displaySpeeds: 'Tampilkan kecepatan',
                        showNoSpeed: 'Tampilkan pada segmen tanpa kecepatan',
                        showOnRoundabout: 'Tampilkan di bundaran',
                        showOnUnpaved: 'Tampilkan di jalan tidak beraspal',
                        maxZoom: 'Render hingga zoom:',
                        toggleLayerShortcut: 'Toggling lapisan tampilan kecepatan',
                        zIndex: 'Kedalaman lapisan',
                        hideShorterSegments: 'Sembunyikan pada segmen yang lebih pendek dari',
                        speedFilter: 'Filter berdasarkan kecepatan',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Tingkat opasitas filter:',
                    },
                    alertMessage: {
                        zIndex: `Jika kedalaman lapisan lebih besar dari <b>${this.zIndex.warn}</b>, lapisan kecepatan akan menutupi lapisan lain dan Anda tidak akan dapat memilih elemen di layar sampai Anda menurunkan kedalaman lapisan kembali di bawah <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Untuk mengaktifkan/mematikan lapisan tampilan kecepatan, cukup pergi ke <b>Lapisan Peta > Jalan > Tampilkan kecepatan</b> atau gunakan pintasan <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Default',
                        altViennaConv: 'Konvensi Wina Alternatif',
                        japan: 'Jepang',
                        northAmerica: 'Amerika Utara',
                        sacu: 'Uni Bea Cukai Afrika Selatan',
                        uk: 'Inggris Raya',
                    },
                    btn: {
                        updateSettingsTab: 'Perbarui menu',
                        resetSettings: 'Atur ulang pengaturan',
                        seeOnDiscuss: 'Lihat di diskusi',
                        seeOnDiscord: 'Lihat di Discord',
                        scriptDevBy: 'Script dikembangkan oleh Luan Tavares',
                    }
                };
            
                break;
            
            case 'it':
                // Italian
                translations = {
                    name: 'Visualizzazione Velocità',
                    zoomOut: 'Zoom indietro',
                    zoomIn: 'Zoom avanti',
                    changelog: 'Registro modifiche',
                    changelogMessage: `<h6>Novità:</h6><ul style="margin-bottom: 10px"><li>Il messaggio "aggiornamento icone con ritardo" è stato finalmente rimosso e sostituito con una semplice icona, che chiarisce quando lo script sta ancora elaborando le icone di velocità (ricorda che c'è un ritardo intenzionale).</li></ul><h6>Correzioni e miglioramenti:</h6><ul><li>La scheda "generale" è stata rinominata in "impostazioni" per chiarire meglio la funzione di ciascuna scheda;</li><li>Il filtro per la dimensione del segmento non rimuove più l'icona, ma applica la stessa opacità del filtro di velocità.</li></ul>`,
                    close: 'Chiudi',
                    viewScript: 'Vedi script',
                    viewChangelog: 'Visualizza registro modifiche',
                    reset: 'Ripristina',
                    snackbar: {
                        errorFiltering: 'Errore nell’applicazione del filtro. La velocità minima non può essere maggiore della massima.',
                    },
                    title: {
                        settings: 'Impostazioni',
                        roadTypes: 'Tipi di strada',
                        filter: 'Filtro',
                        appearence: 'Aspetto',
                        showOnRoadType: 'Mostra sui seguenti tipi di strada:',
                        seeOnDiscuss: 'Vedi il thread dello script su Discuss',
                        seeOnDiscord: 'Vedi il canale dello script sul server Discord di Waze Script',
                        scriptDevBy: 'Visualizza il profilo utente del mio editor',
                    },
                    label: {
                        displaySpeeds: 'Visualizza velocità',
                        showNoSpeed: 'Visualizza su segmento senza velocità',
                        showOnRoundabout: 'Visualizza su rotatoria',
                        showOnUnpaved: 'Visualizza su strada non asfaltata',
                        maxZoom: 'Renderizza fino allo zoom:',
                        toggleLayerShortcut: 'Alterna il layer di visualizzazione velocità',
                        zIndex: 'Profondità del layer',
                        hideShorterSegments: 'Nascondi nei segmenti più corti di',
                        speedFilter: 'Filtra per velocità',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Livello opacità filtro:',
                    },
                    alertMessage: {
                        zIndex: `Se utilizzi una profondità del layer maggiore di <b>${this.zIndex.warn}</b>, il layer della velocità coprirà gli altri e non sarà possibile selezionare alcun elemento sulla mappa finché non riduci nuovamente la profondità sotto <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Per attivare/disattivare il layer di visualizzazione delle velocità, vai su <b>Layer Mappa > Strade > Visualizza velocità</b> o usa la scorciatoia <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Predefinito',
                        altViennaConv: 'Convenzione di Vienna Alternativa',
                        japan: 'Giappone',
                        northAmerica: 'Nord America',
                        sacu: 'Unione Doganale dell’Africa Australe',
                        uk: 'Regno Unito',
                    },
                    btn: {
                        updateSettingsTab: 'Aggiorna menu',
                        resetSettings: 'Ripristina impostazioni',
                        seeOnDiscuss: 'Vedi nella discussione',
                        seeOnDiscord: 'Vedi su Discord',
                        scriptDevBy: 'Script sviluppato da Luan Tavares',
                    }
                };
            
                break;

            case 'ja':
                // Japanese
                translations = {
                    name: '速度表示',
                    zoomOut: 'ズームアウト',
                    zoomIn: 'ズームイン',
                    changelog: '変更履歴',
                    changelogMessage: `<h6>新機能:</h6><ul style="margin-bottom: 10px"><li>「遅延付きアイコン更新」のメッセージを削除し、シンプルなアイコンに置き換えました。これにより、スクリプトが速度アイコンを処理中であることが明確になりました(更新には意図的な遅延があります)。</li></ul><h6>修正と改善:</h6><ul><li>「一般」タブの名前を「設定」に変更し、各タブの機能をより明確にしました。</li><li>セグメントサイズによるフィルターは、アイコンを非表示にする代わりに、速度フィルターと同じ透明度を適用するようになりました。</li></ul>`,
                    close: '閉じる',
                    viewScript: 'スクリプトを見る',
                    viewChangelog: '変更履歴を見る',
                    reset: 'リセット',
                    snackbar: {
                        errorFiltering: 'フィルター適用エラー。最小速度が最大速度を超えることはできません。',
                    },
                    title: {
                        settings: '設定',
                        roadTypes: '道路タイプ',
                        filter: 'フィルター',
                        appearence: '外観',
                        showOnRoadType: '次の道路タイプに表示:',
                        seeOnDiscuss: 'Discussでスクリプトのスレッドを見る',
                        seeOnDiscord: 'Waze ScriptのDiscordサーバーでスクリプトのチャンネルを見る',
                        scriptDevBy: 'エディターのユーザープロフィールを表示',
                    },
                    label: {
                        displaySpeeds: '速度を表示',
                        showNoSpeed: '速度なしのセグメントに表示',
                        showOnRoundabout: 'ラウンドアバウトに表示',
                        showOnUnpaved: '未舗装道路に表示',
                        maxZoom: 'ズーム最大:',
                        toggleLayerShortcut: '速度表示レイヤーを切り替える',
                        zIndex: 'レイヤーの深度',
                        hideShorterSegments: '次の長さ未満のセグメントを非表示:',
                        speedFilter: '速度でフィルタリング',
                        min: '最小:',
                        max: '最大:',
                        opacity: 'フィルターの不透明度レベル:',
                    },
                    alertMessage: {
                        zIndex: `レイヤーの深度を <b>${this.zIndex.warn}</b> より大きく設定すると、速度レイヤーが他のレイヤーを覆い、再び <b>${this.zIndex.warn}</b> 以下に戻すまでマップ上の要素を選択できなくなります。`,
                        toggleVisibility: `速度表示レイヤーをオン/オフにするには、<b>マップレイヤー > 道路 > 速度表示</b>に移動するか、ショートカット <b>ALT</b> + <b>SHIFT</b> + <b>S</b> を使用してください。`
                    },
                    theme: {
                        default: 'デフォルト',
                        altViennaConv: '代替ウィーン条約',
                        japan: '日本',
                        northAmerica: '北アメリカ',
                        sacu: '南部アフリカ関税同盟',
                        uk: 'イギリス',
                    },
                    btn: {
                        updateSettingsTab: 'メニューを更新',
                        resetSettings: '設定をリセット',
                        seeOnDiscuss: 'ディスカッションで見る',
                        seeOnDiscord: 'Discordで見る',
                        scriptDevBy: 'スクリプトはLuan Tavaresによって開発されました',
                    }
                };
            
                break;
            
            case 'ka':
                // Georgian
                translations = {
                    name: 'სისწრაფის ჩვენება',
                    zoomOut: 'გამორთვა',
                    zoomIn: 'ზუმი',
                    changelog: 'შეცდომების ჩანაწერი',
                    changelogMessage: `<h6>ახალი ფუნქციები:</h6><ul style="margin-bottom: 10px"><li>შეტყობინება "ხატულების განახლება შეფერხებით" საბოლოოდ მოიხსნა და ჩანაცვლდა მარტივი ხატულით, რაც ცხადყოფს, რომ სკრიპტი ჯერ კიდევ ამუშავებს სიჩქარის ხატულებს (დაიმახსოვრეთ, რომ განახლებას მიზანმიმართული დაგვიანება აქვს).</li></ul><h6>შეცდომების გამოსწორება და გაუმჯობესება:</h6><ul><li>ჩანართის სახელი "ზოგადი" გადაკეთდა "პარამეტრებად", რათა უკეთ აღიქმულიყო თითოეული ჩანართის ფუნქცია;</li><li>სეგმენტის ზომის ფილტრი აღარ აშორებს ხატულას, არამედ ახლა იყენებს იმავე გამჭვირვალობას, როგორც სიჩქარის ფილტრში.</li></ul>`,
                    close: 'დახურვა',
                    viewScript: 'იხილეთ სქრიპტი',
                    viewChangelog: 'შეცდომების ჩანაწერის ნახვა',
                    reset: 'გადატვირთვა',
                    snackbar: {
                        errorFiltering: 'შეცდომა ფილტრის გამოყენებისას. მინიმალური სიჩქარე არ შეიძლება იყოს მაქსიმალურ სიჩქარეზე მეტი.',
                    },
                    title: {
                        settings: 'პარამეტრები',
                        roadTypes: 'გზების ტიპები',
                        filter: 'ფილტრი',
                        appearence: 'გამოცხადება',
                        showOnRoadType: 'აჩვენე შემდეგი გზის ტიპებზე:',
                        seeOnDiscuss: 'იხილეთ სკრიპტის თემა Discuss-ზე',
                        seeOnDiscord: 'იხილეთ სკრიპტის არხი Waze Script-ის Discord სერვერზე',
                        scriptDevBy: 'ნახეთ ჩემი რედაქტორის მომხმარებლის პროფილი',
                    },
                    label: {
                        displaySpeeds: 'სისწრაფის ჩვენება',
                        showNoSpeed: 'სიჩქარის გარეშე სეგმენტებზე ჩვენება',
                        showOnRoundabout: 'საკვანძო გზებზე ჩვენება',
                        showOnUnpaved: 'აუცილებელი გზების გამოფენა',
                        maxZoom: 'ზუმის მაქსიმალური დონე:',
                        toggleLayerShortcut: 'სისწრაფის ფენის გადართვის ცხელი კლავიშები',
                        zIndex: 'ფენის სიღრმე',
                        hideShorterSegments: 'დამალვა, თუ სეგმენტი არის ამცირებელი:',
                        speedFilter: 'ფილტრი სიჩქარის მიხედვით',
                        min: 'მინიმუმ:',
                        max: 'მაქსიმუმ:',
                        opacity: 'ფილტრის გამჭვირვალობის დონე:',
                    },
                    alertMessage: {
                        zIndex: `თუ გამოიყენეთ ფენის სიღრმე <b>${this.zIndex.warn}</b> მეტი, სისწრაფის ფენა დახურავს ყველა სხვა ფენებს და ვერ შეარჩიეთ ელემენტები ეკრანზე სანამ არ დააბრუნებთ სიღრმე <b>${this.zIndex.warn}</b> ქვემოთ.`,
                        toggleVisibility: `სიჩქარის ფენის ჩართვის/გამორთვისთვის, გთხოვთ გადადით <b>მოგზაურობა > გზები > სიჩქარის ნახვა</b> ან გამოიყენეთ ცხელი კლავიშები <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'ნაგულისხმები',
                        altViennaConv: 'ძველი ვენის კონვენცია',
                        japan: 'იაპონია',
                        northAmerica: 'ჩრდილოეთ ამერიკა',
                        sacu: 'სამხრეთ აფრიკის საბაჟო კავშირი',
                        uk: 'დიდი ბრიტანეთი',
                    },
                    btn: {
                        updateSettingsTab: 'მენიუს განახლება',
                        resetSettings: 'პარამეტრების გადატვირთვა',
                        seeOnDiscuss: 'იხილეთ განხილვაში',
                        seeOnDiscord: 'იხილეთ Discord-ზე',
                        scriptDevBy: 'სკრიპტი გამოიმუშავა ლუან ტავარესმა',
                    }
                };
            
                break;

            case 'ko':
                // Korean
                translations = {
                    name: '속도 표시',
                    zoomOut: '줌 아웃',
                    zoomIn: '줌 인',
                    changelog: '변경 기록',
                    changelogMessage: `<h6>새로운 기능:</h6><ul style="margin-bottom: 10px"><li>"지연된 아이콘 업데이트" 메시지가 제거되고 간단한 아이콘으로 교체되어 스크립트가 여전히 속도 아이콘을 처리 중임을 명확하게 보여줍니다 (업데이트에는 의도적인 지연이 있습니다).</li></ul><h6>수정 및 개선 사항:</h6><ul><li>"일반" 탭의 이름이 "설정"으로 변경되어 각 탭의 기능을 더 잘 이해할 수 있습니다;</li><li>세그먼트 크기 필터는 이제 아이콘을 제거하지 않고 속도 필터와 동일한 불투명도를 적용합니다.</li></ul>`,
                    close: '닫기',
                    viewScript: '스크립트 보기',
                    viewChangelog: '변경 기록 보기',
                    reset: '초기화',
                    snackbar: {
                        errorFiltering: '필터 적용 오류. 최소 속도가 최대 속도보다 클 수 없습니다.',
                    },
                    title: {
                        settings: '설정',
                        roadTypes: '도로 유형',
                        filter: '필터',
                        appearence: '모양',
                        showOnRoadType: '다음 도로 유형에서 표시:',
                        seeOnDiscuss: 'Discuss에서 스크립트 스레드 보기',
                        seeOnDiscord: 'Waze Script Discord 서버에서 스크립트 채널 보기',
                        scriptDevBy: '내 편집기 사용자 프로필 보기',
                    },
                    label: {
                        displaySpeeds: '속도 표시',
                        showNoSpeed: '속도 없는 세그먼트에 표시',
                        showOnRoundabout: '로터리에서 표시',
                        showOnUnpaved: '비포장 도로에서 표시',
                        maxZoom: '최대 줌:',
                        toggleLayerShortcut: '속도 레이어 전환 단축키',
                        zIndex: '레이어 깊이',
                        hideShorterSegments: '이보다 짧은 세그먼트 숨기기',
                        speedFilter: '속도 필터',
                        min: '최소:',
                        max: '최대:',
                        opacity: '필터 불투명도 수준:',
                    },
                    alertMessage: {
                        zIndex: `레이어 깊이가 <b>${this.zIndex.warn}</b>를 초과하면 속도 레이어가 다른 레이어 위에 표시되어 화면에서 다른 요소를 선택할 수 없게 됩니다. 다시 <b>${this.zIndex.warn}</b> 이하로 낮추기 전까지 선택할 수 없습니다.`,
                        toggleVisibility: `속도 레이어의 가시성을 활성화/비활성화하려면 <b>맵 레이어 > 도로 > 속도 표시</b>로 이동하거나 단축키 <b>ALT</b> + <b>SHIFT</b> + <b>S</b>를 사용하세요.`
                    },
                    theme: {
                        default: '기본',
                        altViennaConv: '대체 비엔나 협약',
                        japan: '일본',
                        northAmerica: '북아메리카',
                        sacu: '남부 아프리카 세관 동맹',
                        uk: '영국',
                    },
                    btn: {
                        updateSettingsTab: '메뉴 업데이트',
                        resetSettings: '설정 초기화',
                        seeOnDiscuss: '토론에서 보기',
                        seeOnDiscord: 'Discord에서 보기',
                        scriptDevBy: '스크립트는 Luan Tavares에 의해 개발되었습니다',
                    }
                };
            
                break;

            case 'lt':
                // Lithuanian
                translations = {
                    name: 'Greitis Rodymas',
                    zoomOut: 'Toliau',
                    zoomIn: 'Arčiau',
                    changelog: 'Pakeitimų Žurnalas',
                    changelogMessage: `<h6>Nauja:</h6><ul style="margin-bottom: 10px"><li>Pranešimas „atnaujinami piktogramos su uždelsimu“ pagaliau pašalintas ir pakeistas paprasta piktograma, aiškiai rodanti, kada scenarijus vis dar apdoroja greičio piktogramas (atnaujinimas vyksta su tyčiniu uždelsimu).</li></ul><h6>Taisymai ir patobulinimai:</h6><ul><li>Skirtuko "Bendra" pavadinimas pakeistas į "Nustatymai", kad būtų aiškiau suprantama kiekvieno skirtuko paskirtis;</li><li>Segmento dydžio filtras dabar nepanaikina piktogramos, bet taiko tokią pat skaidrumo reikšmę kaip ir greičio filtras.</li></ul>`,
                    close: 'Uždaryti',
                    viewScript: 'Peržiūrėti scenarijų',
                    viewChangelog: 'Peržiūrėti pakeitimų žurnalą',
                    reset: 'Atstatyti',
                    snackbar: {
                        errorFiltering: 'Klaida taikant filtrą. Mažiausias greitis negali būti didesnis nei didžiausias.',
                    },
                    title: {
                        settings: 'Nustatymai',
                        roadTypes: 'Kelio tipai',
                        filter: 'Filtras',
                        appearence: 'Išvaizda',
                        showOnRoadType: 'Rodyti šiuose kelio tipuose:',
                        seeOnDiscuss: 'Žiūrėkite scenarijaus temą Discuss',
                        seeOnDiscord: 'Žiūrėkite scenarijaus kanalą Waze Script Discord serveryje',
                        scriptDevBy: 'Peržiūrėkite mano redaktoriaus naudotojo profilį',
                    },
                    label: {
                        displaySpeeds: 'Rodyti greičius',
                        showNoSpeed: 'Rodyti segmentuose be greičio',
                        showOnRoundabout: 'Rodyti žiedinėse sankryžose',
                        showOnUnpaved: 'Rodyti neasfaltuotose keliose',
                        maxZoom: 'Rodyti iki židinio lygio:',
                        toggleLayerShortcut: 'Perjungti greičio sluoksnį',
                        zIndex: 'Sluoksnio gylis',
                        hideShorterSegments: 'Slėpti trumpesnius nei',
                        speedFilter: 'Filtruoti pagal greitį',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Filtravimo nepralaidumo lygis:',
                    },
                    alertMessage: {
                        zIndex: `Naudojant sluoksnio gylį, kuris yra didesnis nei <b>${this.zIndex.warn}</b>, greičio sluoksnis uždengs kitus sluoksnius ir negalėsite pasirinkti jokio elemento ekrane, kol vėl nepasieksite gylio žemiau <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Norėdami įjungti/išjungti greičio sluoksnio matomumą, eikite į <b>Žemėlapių sluoksniai > Keliai > Rodyti greičius</b> arba naudokite klaviatūros kombinaciją <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Numatytas',
                        altViennaConv: 'Alternatyvi Vienos konvencija',
                        japan: 'Japonija',
                        northAmerica: 'Šiaurės Amerika',
                        sacu: 'Pietų Afrikos muitų sąjunga',
                        uk: 'Jungtinė Karalystė',
                    },
                    btn: {
                        updateSettingsTab: 'Atnaujinti meniu',
                        resetSettings: 'Atstatyti nustatymus',
                        seeOnDiscuss: 'Žiūrėti diskusijoje',
                        seeOnDiscord: 'Žiūrėti Discorde',
                        scriptDevBy: 'Skriptą sukūrė Luan Tavares',
                    }
                };
            
                break;
                
            case 'lv':
                // Latvian
                translations = {
                    name: 'Ātruma Rādīšana',
                    zoomOut: 'Tālāk',
                    zoomIn: 'Tuvāk',
                    changelog: 'Izmaiņu Žurnāls',
                    changelogMessage: `<h6>Jauns:</h6><ul style="margin-bottom: 10px"><li>Ziņojums "atjaunina ikonas ar aizturi" beidzot tika noņemts un aizstāts ar vienkāršu ikonu, kas skaidri norāda, kad skripts vēl apstrādā ātruma ikonas (atcerieties, ka atjaunināšanai ir tīša aizture).</li></ul><h6>Labošanas un uzlabojumi:</h6><ul><li>Cilne "Vispārīgi" tika pārdēvēta par "Iestatījumi", lai labāk saprastu katras cilnes funkciju;</li><li>Sadaļas izmēra filtrs vairs neizņem ikonu, bet piemēro tādu pašu caurspīdīgumu kā ātruma filtrā.</li></ul>`,
                    close: 'Aizvērt',
                    viewScript: 'Skatīt Skriptu',
                    viewChangelog: 'Skatīt Izmaiņu Žurnālu',
                    reset: 'Atiestatīt',
                    snackbar: {
                        errorFiltering: 'Kļūda, lietojot filtru. Minimālais ātrums nevar būt lielāks par maksimālo.',
                    },
                    title: {
                        settings: 'Iestatījumi',
                        roadTypes: 'Ceļa tipi',
                        filter: 'Filtrs',
                        appearence: 'Izskats',
                        showOnRoadType: 'Rādīt šādos ceļa tipos:',
                        seeOnDiscuss: 'Skatīt skripta pavedienu Discuss',
                        seeOnDiscord: 'Skatīt skripta kanālu Waze Script Discord serverī',
                        scriptDevBy: 'Skatīt manu redaktora lietotāja profilu',
                    },
                    label: {
                        displaySpeeds: 'Rādīt ātrumus',
                        showNoSpeed: 'Rādīt segmentos bez ātruma',
                        showOnRoundabout: 'Rādīt aplī',
                        showOnUnpaved: 'Rādīt neasfaltētajos ceļos',
                        maxZoom: 'Rādīt līdz palielināšanas līmenim:',
                        toggleLayerShortcut: 'Pārslēgt ātruma slāni',
                        zIndex: 'Slāņa dziļums',
                        hideShorterSegments: 'Paslēpt īsākus nekā',
                        speedFilter: 'Filtrēt pēc ātruma',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Filtra līmeņa caurspīdīgums:',
                    },
                    alertMessage: {
                        zIndex: `Izmantojot slāņa dziļumu, kas pārsniedz <b>${this.zIndex.warn}</b>, ātruma slānis pārklās citus slāņus, un nebūs iespējams izvēlēties nevienu elementu ekrānā līdz tā atkārtotai pazemināšanai zem <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Lai aktivizētu/deaktivizētu ātruma slāņa redzamību, vienkārši dodieties uz <b>Kartes Slāņi > Ceļi > Rādīt ātrumus</b> vai izmantojiet īsinājumtaustiņu <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Noklus',
                        altViennaConv: 'Alternatīvā Vīnes konvencija',
                        japan: 'Japāna',
                        northAmerica: 'Ziemeļamerika',
                        sacu: 'Dienvidu Āfrikas muitas savienība',
                        uk: 'Apvienotā Karaliste',
                    },
                    btn: {
                        updateSettingsTab: 'Atjaunināt Meni',
                        resetSettings: 'Atiestatīt Iestatījumus',
                        seeOnDiscuss: 'Skatīt diskusijā',
                        seeOnDiscord: 'Skatīt Discordā',
                        scriptDevBy: 'Skriptu izstrādājis Luan Tavares',
                    }
                };
            
                break;
            
            case 'ms':
                // Malay
                translations = {
                    name: 'Papar Kelajuan',
                    zoomOut: 'Jauhkan',
                    zoomIn: 'Dekatkan',
                    changelog: 'Log Perubahan',
                    changelogMessage: `<h6>Ciri Baharu:</h6><ul style="margin-bottom: 10px"><li>Mesej "mengemas kini ikon dengan kelewatan" akhirnya dialih keluar dan digantikan dengan ikon ringkas, menjelaskan bila skrip masih memproses ikon kelajuan (ingat, terdapat kelewatan yang disengajakan).</li></ul><h6>Pembaikan dan penambahbaikan:</h6><ul><li>Tab "umum" dinamakan semula kepada "tetapan" untuk kejelasan yang lebih baik tentang fungsi setiap tab;</li><li>Penapis saiz segmen kini tidak lagi membuang ikon, tetapi menggunakan ketelusan yang sama seperti penapis kelajuan.</li></ul>`,
                    close: 'Tutup',
                    viewScript: 'Lihat Skrip',
                    viewChangelog: 'Lihat Log Perubahan',
                    reset: 'Tetapkan Semula',
                    snackbar: {
                        errorFiltering: 'Ralat semasa menggunakan penapis. Kelajuan minimum tidak boleh melebihi maksimum.',
                    },
                    title: {
                        settings: 'Tetapan',
                        roadTypes: 'Jenis Jalan',
                        filter: 'Penapis',
                        appearence: 'Penampilan',
                        showOnRoadType: 'Tunjukkan pada jenis jalan berikut:',
                        seeOnDiscuss: 'Lihat thread skrip di Discuss',
                        seeOnDiscord: 'Lihat saluran skrip di pelayan Discord Waze Script',
                        scriptDevBy: 'Lihat profil pengguna editor saya',
                    },
                    label: {
                        displaySpeeds: 'Papar kelajuan',
                        showNoSpeed: 'Papar pada segmen tiada kelajuan',
                        showOnRoundabout: 'Papar pada bulatan',
                        showOnUnpaved: 'Papar pada jalan tidak berturap',
                        maxZoom: 'Paparkan sehingga tahap zum:',
                        toggleLayerShortcut: 'Tukar lapisan paparan kelajuan',
                        zIndex: 'Kedalaman lapisan',
                        hideShorterSegments: 'Sembunyikan pada segmen lebih pendek daripada',
                        speedFilter: 'Tapis mengikut kelajuan',
                        min: 'Min.:',
                        max: 'Maks.:',
                        opacity: 'Tahap kelegapan penapis:',
                    },
                    alertMessage: {
                        zIndex: `Apabila menggunakan kedalaman lapisan lebih besar daripada <b>${this.zIndex.warn}</b>, lapisan kelajuan akan menutupi lapisan lain dan tiada elemen boleh dipilih pada skrin sehingga ia diturunkan di bawah <b>${this.zIndex.warn}</b> semula.`,
                        toggleVisibility: `Untuk menghidupkan/mematikan kebolehtampilan lapisan kelajuan, pergi ke <b>Lapisan Peta > Jalan > Papar kelajuan</b> atau gunakan pintasan <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Lalai',
                        altViennaConv: 'Konvensi Vienna Alternatif',
                        japan: 'Jepun',
                        northAmerica: 'Amerika Utara',
                        sacu: 'Kesatuan Kastam Afrika Selatan',
                        uk: 'United Kingdom',
                    },
                    btn: {
                        updateSettingsTab: 'Kemas kini Menu',
                        resetSettings: 'Tetapkan Semula Tetapan',
                        seeOnDiscuss: 'Lihat dalam perbincangan',
                        seeOnDiscord: 'Lihat di Discord',
                        scriptDevBy: 'Skrip dibangunkan oleh Luan Tavares',
                    }
                };
            
                break;
            
            case 'nl':
                // Dutch
                translations = {
                    name: 'Snelheidsweergave',
                    zoomOut: 'Uitzoomen',
                    zoomIn: 'Inzoomen',
                    changelog: 'Wijzigingslog',
                    changelogMessage: `<h6>Nieuw:</h6><ul style="margin-bottom: 10px"><li>Het bericht "iconen bijwerken met vertraging" is eindelijk verwijderd en vervangen door een eenvoudig pictogram, dat duidelijk aangeeft wanneer het script nog steeds snelheidsiconen verwerkt (onthoud dat er een opzettelijke vertraging is).</li></ul><h6>Oplossingen en verbeteringen:</h6><ul><li>De tab "algemeen" is hernoemd naar "instellingen" voor een betere duidelijkheid over de functie van elke tab;</li><li>Het segmentgroottefilter verwijdert het pictogram niet meer, maar past nu dezelfde transparantie toe als het snelheidsfilter.</li></ul>`,
                    close: 'Sluiten',
                    viewScript: 'Bekijk script',
                    viewChangelog: 'Bekijk wijzigingslog',
                    reset: 'Reset',
                    snackbar: {
                        errorFiltering: 'Fout bij het toepassen van het filter. De minimale snelheid kan niet groter zijn dan de maximale.',
                    },
                    title: {
                        settings: 'Instellingen',
                        roadTypes: 'Wegtypen',
                        filter: 'Filter',
                        appearence: 'Uiterlijk',
                        showOnRoadType: 'Weergeven op de volgende wegtypen:',
                        seeOnDiscuss: 'Bekijk de thread van het script op Discuss',
                        seeOnDiscord: 'Bekijk het kanaal van het script op de Waze Script Discord-server',
                        scriptDevBy: 'Bekijk mijn editor gebruikersprofiel',
                    },
                    label: {
                        displaySpeeds: 'Toon snelheden',
                        showNoSpeed: 'Weergeven op segmenten zonder snelheid',
                        showOnRoundabout: 'Weergeven op rotonde',
                        showOnUnpaved: 'Weergeven op onverharde wegen',
                        maxZoom: 'Weergeven tot zoomniveau:',
                        toggleLayerShortcut: 'Wissel snel de snelheidsweergavelayer',
                        zIndex: 'Laagdiepte',
                        hideShorterSegments: 'Verberg segmenten korter dan',
                        speedFilter: 'Filter op snelheid',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Filterdekking niveau:',
                    },
                    alertMessage: {
                        zIndex: `Wanneer je een laagdiepte groter dan <b>${this.zIndex.warn}</b> gebruikt, zal de snelheidslaag de andere lagen bedekken en kun je geen elementen meer selecteren op het scherm totdat je de laagdiepte weer onder <b>${this.zIndex.warn}</b> brengt.`,
                        toggleVisibility: `Om de snelheidsweergavelayer in of uit te schakelen, ga naar <b>Kaartlagen > Wegen > Weergave van snelheden</b> of gebruik de sneltoets <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Standaard',
                        altViennaConv: 'Alternatieve Wenen Conventie',
                        japan: 'Japan',
                        northAmerica: 'Noord-Amerika',
                        sacu: 'Zuidelijke Afrikaanse Douane Unie',
                        uk: 'Verenigd Koninkrijk',
                    },
                    btn: {
                        updateSettingsTab: 'Werk menu bij',
                        resetSettings: 'Herstel instellingen',
                        seeOnDiscuss: 'Zie op Discussie',
                        seeOnDiscord: 'Zie op Discord',
                        scriptDevBy: 'Script ontwikkeld door Luan Tavares',
                    }
                };
            
                break;

            case 'no':
                // Norwegian
                translations = {
                    name: 'Hastighetsvisning',
                    zoomOut: 'Zoom ut',
                    zoomIn: 'Zoom inn',
                    changelog: 'Endringslogg',
                    changelogMessage: `<h6>Nytt:</h6><ul style="margin-bottom: 10px"><li>Meldingen "oppdaterer ikoner med forsinkelse" er endelig fjernet og erstattet med et enkelt ikon som tydelig viser når skriptet fortsatt behandler fartsikonene (merk at det er en tilsiktet forsinkelse).</li></ul><h6>Fikser og forbedringer:</h6><ul><li>Fanen "Generelt" har fått nytt navn til "Innstillinger" for å klargjøre funksjonen til hver fane;</li><li>Filteret for segmentstørrelse fjerner ikke lenger ikonet, men bruker samme gjennomsiktighet som fartsfilteret.</li></ul>`,
                    close: 'Lukk',
                    viewScript: 'Se skript',
                    viewChangelog: 'Vis endringslogg',
                    reset: 'Tilbakestill',
                    snackbar: {
                        errorFiltering: 'Feil ved bruk av filter. Minimumshastighet kan ikke være større enn maksimum.',
                    },
                    title: {
                        settings: 'Innstillinger',
                        roadTypes: 'Vei typer',
                        filter: 'Filter',
                        appearence: 'Utseende',
                        showOnRoadType: 'Vis på følgende veit typer:',
                        seeOnDiscuss: 'Se tråden for skriptet på Discuss',
                        seeOnDiscord: 'Se skriptets kanal på Waze Script Discord-serveren',
                        scriptDevBy: 'Se min editor brukerprofil',
                    },
                    label: {
                        displaySpeeds: 'Vis hastigheter',
                        showNoSpeed: 'Vis på segmenter uten hastighet',
                        showOnRoundabout: 'Vis på rundkjøring',
                        showOnUnpaved: 'Vis på uasfalterte veier',
                        maxZoom: 'Vis til zoomnivå:',
                        toggleLayerShortcut: 'Bytt visningslag for hastighet',
                        zIndex: 'Lagdybde',
                        hideShorterSegments: 'Skjul segmenter kortere enn',
                        speedFilter: 'Filtrer etter hastighet',
                        min: 'Min.:',
                        max: 'Maks.:',
                        opacity: 'Filter gjennomsiktighetsnivå:',
                    },
                    alertMessage: {
                        zIndex: `Når du bruker en lagdybde større enn <b>${this.zIndex.warn}</b>, vil hastighetslaget overlappe de andre, og du vil ikke kunne velge noen elementer på skjermen før du senker lagdybden til under <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `For å aktivere/deaktivere visningslaget for hastigheter, kan du gå til <b>Kartlag > Veier > Vis hastigheter</b> eller bruke snarveien <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Standard',
                        altViennaConv: 'Alternativ Wien-konvensjon',
                        japan: 'Japan',
                        northAmerica: 'Nord-Amerika',
                        sacu: 'Sydlige afrikanske tollunionen',
                        uk: 'Storbritannia',
                    },
                    btn: {
                        updateSettingsTab: 'Oppdater meny',
                        resetSettings: 'Tilbakestill innstillinger',
                        seeOnDiscuss: 'Se på diskusjonen',
                        seeOnDiscord: 'Se på Discord',
                        scriptDevBy: 'Script utviklet av Luan Tavares',
                    }
                };
            
                break;

            case 'pl':
                // Polish
                translations = {
                    name: 'Wyświetlanie prędkości',
                    zoomOut: 'Oddal',
                    zoomIn: 'Przybliż',
                    changelog: 'Dziennik zmian',
                    changelogMessage: `<h6>Nowości:</h6><ul style="margin-bottom: 10px"><li>Wiadomość „aktualizowanie ikon z opóźnieniem” została usunięta i zastąpiona prostą ikoną, pokazującą, kiedy skrypt nadal przetwarza ikony prędkości (pamiętaj, że aktualizacja odbywa się z zamierzonym opóźnieniem).</li></ul><h6>Poprawki i ulepszenia:</h6><ul><li>Nazwa zakładki „Ogólne” została zmieniona na „Ustawienia” dla lepszego zrozumienia funkcji zakładek;</li><li>Filtr długości segmentu nie usuwa już ikony, lecz stosuje taką samą przezroczystość jak filtr prędkości.</li></ul>`,
                    close: 'Zamknij',
                    viewScript: 'Zobacz skrypt',
                    viewChangelog: 'Zobacz dziennik zmian',
                    reset: 'Resetuj',
                    snackbar: {
                        errorFiltering: 'Błąd podczas stosowania filtra. Minimalna prędkość nie może być większa niż maksymalna.',
                    },
                    title: {
                        settings: 'Ustawienia',
                        roadTypes: 'Rodzaje dróg',
                        filter: 'Filtr',
                        appearence: 'Wygląd',
                        showOnRoadType: 'Pokaż na następujących rodzajach dróg:',
                        seeOnDiscuss: 'Zobacz wątek skryptu na Discuss',
                        seeOnDiscord: 'Zobacz kanał skryptu na serwerze Discord Waze Script',
                        scriptDevBy: 'Zobacz mój profil użytkownika edytora',
                    },
                    label: {
                        displaySpeeds: 'Pokaż prędkości',
                        showNoSpeed: 'Pokaż na segmentach bez prędkości',
                        showOnRoundabout: 'Pokaż na rondzie',
                        showOnUnpaved: 'Pokaż na drodze nieutwardzonej',
                        maxZoom: 'Renderuj do zoomu:',
                        toggleLayerShortcut: 'Przełącz warstwę wyświetlania prędkości',
                        zIndex: 'Głębokość warstwy',
                        hideShorterSegments: 'Ukryj na segmentach krótszych niż',
                        speedFilter: 'Filtruj według prędkości',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Poziom przezroczystości filtra:',
                    },
                    alertMessage: {
                        zIndex: `Używając głębokości warstwy większej niż <b>${this.zIndex.warn}</b>, warstwa prędkości będzie nakładać się na inne, uniemożliwiając wybór jakichkolwiek elementów na ekranie, dopóki nie zmniejszysz jej poniżej <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Aby włączyć/wyłączyć warstwę wyświetlania prędkości, przejdź do <b>Warstwy mapy > Drogi > Wyświetl prędkości</b> lub użyj skrótu <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Domyślny',
                        altViennaConv: 'Alternatywna konwencja wiedeńska',
                        japan: 'Japonia',
                        northAmerica: 'Ameryka Północna',
                        sacu: 'Południowoafrykańska Unia Celna',
                        uk: 'Wielka Brytania',
                    },
                    btn: {
                        updateSettingsTab: 'Aktualizuj menu',
                        resetSettings: 'Resetuj ustawienia',
                        seeOnDiscuss: 'Zobacz na Dyskusji',
                        seeOnDiscord: 'Zobacz na Discordzie',
                        scriptDevBy: 'Skrypt opracowany przez Luana Tavaresa',
                    }
                };
                
                break;

            case 'pt-BR':
                // Portuguese (Brazil)
                translations = {
                    name: 'Exibição de Velocidade',
                    zoomOut: 'Mais afastado',
                    zoomIn: 'Mais aproximado',
                    changelog: 'Registro de alterações',
                    changelogMessage: `<h6>Novidades:</h6><ul style="margin-bottom: 10px"><li>Enfim removido a mensagem de "atualizando os ícones com delay" por um ícone simplório, ficando claro quando o script ainda está processando os ícones de velocidades (lembre-se sempre que existe um delay proposital na atualização dos ícones).</li></ul><h6>Correções e melhorias:</h6><ul><li>Alterado o nome da aba "geral" para "ajustes" para uma melhor clareza no entendimento da função de cada aba do script;</li><li>Modificado o funcionamento da filtragem por tamanho de segmento, onde antes removia o ícone da visualização, agora ele apenas aplica a opcaidade igual a aplicada no filtro de velocidade.</li></ul>`,
                    close: 'Fechar',
                    viewScript: 'Ver script',
                    viewChangelog: 'Visualizar o registro de alterações',
                    reset: 'Redefinir',
                    snackbar: {
                        errorFiltering: 'Erro ao aplicar o filtro. A velocidade mínima não pode ser maior que a máxima.',
                    },
                    title: {
                        settings: 'Ajustes',
                        roadTypes: 'Tipos de via',
                        filter: 'Filtro',
                        appearence: 'Aparência',
                        showOnRoadType: 'Exibir nos seguintes tipos de via:',
                        seeOnDiscuss: 'Veja o tópico do script no Discuss',
                        seeOnDiscord: 'Veja o canal do script no servidor Discord do Waze Script',
                        scriptDevBy: 'Veja o meu perfil de usuário do editor',
                    },
                    label: {
                        displaySpeeds: 'Exibir velocidades',
                        showNoSpeed: 'Exibir em segmento sem velocidade',
                        showOnRoundabout: 'Exibir em rotatória',
                        showOnUnpaved: 'Exibir em via não pavimentada',
                        maxZoom: 'Renderizar até o zoom:',
                        toggleLayerShortcut: 'Alternar a camada de exibição da velocidade',
                        zIndex: 'Profundidade da camada',
                        hideShorterSegments: 'Ocultar em segmentos menores que',
                        speedFilter: 'Filtrar por velocidade',
                        min: 'Mín.:',
                        max: 'Máx.:',
                        opacity: 'Nível de opacidade do filtro:',
                    },
                    alertMessage: {
                        zIndex: `Ao utilizar uma profundidade de camada maior que <b>${this.zIndex.warn}</b>, a camada de velocidade se sobreponhará as outras e não será possível selecionar nenhum elemento na tela até baixa-la novamente abaixo de <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Para ativar/desativar a camada de exibição de velocidades, basta ir até <b>Camadas do Mapa > Vias > Exibir velocidades</b> ou utilizar o atalho <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Padrão',
                        altViennaConv: 'Convenção de Viena Alternativa',
                        japan: 'Japão',
                        northAmerica: 'América do Norte',
                        sacu: 'União Aduaneira da África Austral',
                        uk: 'Reino Unido',
                    },
                    btn: {
                        updateSettingsTab: 'Atualizar menu',
                        resetSettings: 'Redefinir configurações',
                        seeOnDiscuss: 'Ver no Discuss',
                        seeOnDiscord: 'Ver no Discord',
                        scriptDevBy: 'Script desenvolvido por Luan Tavares',
                    }
                };

                break;

            case 'pt-PT':
                // Portuguese (Portugal)
                translations = {
                    name: 'Exibição de Velocidade',
                    zoomOut: 'Mais afastado',
                    zoomIn: 'Mais aproximado',
                    changelog: 'Registo de alterações',
                    changelogMessage: `<h6>Novidades:</h6><ul style="margin-bottom: 10px"><li>A mensagem "a atualizar ícones com atraso" foi finalmente removida e substituída por um ícone simples, indicando quando o script ainda está a processar os ícones de velocidade (existe um atraso propositado na atualização).</li></ul><h6>Correções e melhorias:</h6><ul><li>O separador "Geral" foi renomeado para "Ajustes", para melhor compreensão da função de cada separador;</li><li>O filtro de tamanho de segmento agora aplica opacidade em vez de remover o ícone, tal como o filtro de velocidade.</li></ul>`,
                    close: 'Fechar',
                    viewScript: 'Ver script',
                    viewChangelog: 'Visualizar o registo de alterações',
                    reset: 'Redefinir',
                    snackbar: {
                        errorFiltering: 'Erro ao aplicar o filtro. A velocidade mínima não pode ser superior à máxima.',
                    },
                    title: {
                        settings: 'Ajustes',
                        roadTypes: 'Tipos de estrada',
                        filter: 'Filtro',
                        appearence: 'Aparência',
                        showOnRoadType: 'Mostrar nos seguintes tipos de estrada:',
                        seeOnDiscuss: 'Veja o tópico do script no Discuss',
                        seeOnDiscord: 'Veja o canal do script no servidor Discord do Waze Script',
                        scriptDevBy: 'Veja o meu perfil de utilizador do editor',
                    },
                    label: {
                        displaySpeeds: 'Exibir velocidades',
                        showNoSpeed: 'Exibir em segmento sem velocidade',
                        showOnRoundabout: 'Exibir em rotunda',
                        showOnUnpaved: 'Exibir em via não pavimentada',
                        maxZoom: 'Renderizar até o zoom:',
                        toggleLayerShortcut: 'Alternar a camada de exibição da velocidade',
                        zIndex: 'Profundidade da camada',
                        hideShorterSegments: 'Ocultar em segmentos menores que',
                        speedFilter: 'Filtrar por velocidade',
                        min: 'Mín.:',
                        max: 'Máx.:',
                        opacity: 'Nível de opacidade do filtro:',
                    },
                    alertMessage: {
                        zIndex: `Ao utilizar uma profundidade de camada maior que <b>${this.zIndex.warn}</b>, a camada de velocidade se sobreporá a outras e não será possível selecionar nenhum elemento na tela até que a profundidade seja reduzida abaixo de <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Para ativar/desativar a camada de exibição de velocidades, basta ir a <b>Camadas do Mapa > Vias > Exibir velocidades</b> ou utilizar o atalho <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Padrão',
                        altViennaConv: 'Convenção de Viena Alternativa',
                        japan: 'Japão',
                        northAmerica: 'América do Norte',
                        sacu: 'União Aduaneira da África Austral',
                        uk: 'Reino Unido',
                    },
                    btn: {
                        updateSettingsTab: 'Atualizar menu',
                        resetSettings: 'Redefinir configurações',
                        seeOnDiscuss: 'Ver no Discuss',
                        seeOnDiscord: 'Ver no Discord',
                        scriptDevBy: 'Script desenvolvido por Luan Tavares',
                    }
                };
            
                break;

            case 'ro':
                // Romanian
                translations = {
                    name: 'Afișarea vitezei',
                    zoomOut: 'Mai departe',
                    zoomIn: 'Mai aproape',
                    changelog: 'Jurnalul modificărilor',
                    changelogMessage: `<h6>Noutăți:</h6><ul style="margin-bottom: 10px"><li>Mesajul „actualizare pictograme cu întârziere” a fost în sfârșit eliminat și înlocuit cu o pictogramă simplă, clarificând că scriptul încă procesează pictogramele de viteză (rețineți că există o întârziere intenționată).</li></ul><h6>Corecturi și îmbunătățiri:</h6><ul><li>Fila „General” a fost redenumită „Setări” pentru o mai bună înțelegere a funcției fiecărei file;</li><li>Filtrul după dimensiunea segmentului nu mai elimină pictograma, ci aplică aceeași opacitate ca filtrul de viteză.</li></ul>`,
                    close: 'Închide',
                    viewScript: 'Vezi scriptul',
                    viewChangelog: 'Vizualizează jurnalul modificărilor',
                    reset: 'Resetează',
                    snackbar: {
                        errorFiltering: 'Eroare la aplicarea filtrului. Viteza minimă nu poate fi mai mare decât viteza maximă.',
                    },
                    title: {
                        settings: 'Setări',
                        roadTypes: 'Tipuri de drumuri',
                        filter: 'Filtru',
                        appearence: 'Aparență',
                        showOnRoadType: 'Afișați pe următoarele tipuri de drumuri:',
                        seeOnDiscuss: 'Vezi firul scriptului pe Discuss',
                        seeOnDiscord: 'Vezi canalul scriptului pe serverul Discord Waze Script',
                        scriptDevBy: 'Vizualizează profilul meu de utilizator editor',
                    },
                    label: {
                        displaySpeeds: 'Afișează vitezele',
                        showNoSpeed: 'Afișează pe segmente fără viteză',
                        showOnRoundabout: 'Afișează pe sens giratoriu',
                        showOnUnpaved: 'Afișează pe drumuri neasfaltate',
                        maxZoom: 'Renderizează până la zoom:',
                        toggleLayerShortcut: 'Comută stratul de afișare a vitezei',
                        zIndex: 'Adâncimea stratului',
                        hideShorterSegments: 'Ascunde segmentele mai mici de',
                        speedFilter: 'Filtrează după viteză',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Nivelul de opacitate al filtrului:',
                    },
                    alertMessage: {
                        zIndex: `Atunci când folosești o adâncime a stratului mai mare de <b>${this.zIndex.warn}</b>, stratul de viteză se va suprapune altor straturi și nu vei putea selecta niciun element pe ecran până când nu scazi adâncimea sub <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Pentru a activa/dezactiva stratul de afișare a vitezelor, mergi la <b>Straturi Mapa > Drumuri > Afișează viteze</b> sau folosește scurtătura <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Implicit',
                        altViennaConv: 'Alternativă Convenția de la Viena',
                        japan: 'Japonia',
                        northAmerica: 'America de Nord',
                        sacu: 'Uniunea Vamală a Africii de Sud',
                        uk: 'Regatul Unit',
                    },
                    btn: {
                        updateSettingsTab: 'Actualizează meniul',
                        resetSettings: 'Resetare setări',
                        seeOnDiscuss: 'Vezi în discuție',
                        seeOnDiscord: 'Vezi pe Discord',
                        scriptDevBy: 'Script dezvoltat de Luan Tavares',
                    }
                };
            
                break;

            case 'ru':
                // Russian
                translations = {
                    name: 'Отображение скорости',
                    zoomOut: 'Удалить',
                    zoomIn: 'Приблизить',
                    changelog: 'Журнал изменений',
                    changelogMessage: `<h6>Новое:</h6><ul style="margin-bottom: 10px"><li>Сообщение «обновление иконок с задержкой» наконец удалено и заменено на простой значок, указывающий, что скрипт всё ещё обрабатывает значки скорости (обратите внимание, что обновление происходит с намеренной задержкой).</li></ul><h6>Исправления и улучшения:</h6><ul><li>Вкладка «Общие» переименована в «Настройки» для лучшего понимания функций вкладок;</li><li>Фильтр по длине сегмента теперь не удаляет иконку, а применяет ту же прозрачность, что и фильтр скорости.</li></ul>`,
                    close: 'Закрыть',
                    viewScript: 'Посмотреть скрипт',
                    viewChangelog: 'Просмотреть журнал изменений',
                    reset: 'Сбросить',
                    snackbar: {
                        errorFiltering: 'Ошибка применения фильтра. Минимальная скорость не может быть больше максимальной.',
                    },
                    title: {
                        settings: 'Настройки',
                        roadTypes: 'Типы дорог',
                        filter: 'Фильтр',
                        appearence: 'Внешний вид',
                        showOnRoadType: 'Показать на следующих типах дорог:',
                        seeOnDiscuss: 'Посмотреть тему скрипта на Discuss',
                        seeOnDiscord: 'Посмотреть канал скрипта на сервере Discord Waze Script',
                        scriptDevBy: 'Посмотреть мой профиль пользователя редактора',
                    },
                    label: {
                        displaySpeeds: 'Отображать скорости',
                        showNoSpeed: 'Отображать на сегментах без скорости',
                        showOnRoundabout: 'Отображать на круговых развязках',
                        showOnUnpaved: 'Отображать на неасфальтированных дорогах',
                        maxZoom: 'Отображать до уровня зума:',
                        toggleLayerShortcut: 'Переключить слой отображения скорости',
                        zIndex: 'Глубина слоя',
                        hideShorterSegments: 'Скрывать на сегментах короче чем',
                        speedFilter: 'Фильтровать по скорости',
                        min: 'Мин.:',
                        max: 'Макс.:',
                        opacity: 'Уровень непрозрачности фильтра:',
                    },
                    alertMessage: {
                        zIndex: `При использовании глубины слоя больше <b>${this.zIndex.warn}</b> слой скорости будет перекрывать другие и вы не сможете выбрать элементы на экране, пока не уменьшите глубину слоя ниже <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Для активации/деактивации слоя отображения скорости перейдите в <b>Слои карты > Дороги > Отображать скорости</b> или используйте комбинацию клавиш <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'По умолчанию',
                        altViennaConv: 'Альтернативная Венская конвенция',
                        japan: 'Япония',
                        northAmerica: 'Северная Америка',
                        sacu: 'Южноафриканский таможенный союз',
                        uk: 'Соединенное Королевство',
                    },
                    btn: {
                        updateSettingsTab: 'Обновить меню',
                        resetSettings: 'Сбросить настройки',
                        seeOnDiscuss: 'Смотреть на обсуждении',
                        seeOnDiscord: 'Смотреть в Discord',
                        scriptDevBy: 'Скрипт разработан Луаном Таваресом',
                    }
                };
                
                break;
                
            case 'sk':
                // Slovak
                translations = {
                    name: 'Zobrazenie rýchlosti',
                    zoomOut: 'Ďalej',
                    zoomIn: 'Priblížiť',
                    changelog: 'Záznam zmien',
                    changelogMessage: `<h6>Novinky:</h6><ul style="margin-bottom: 10px"><li>Zpráva „aktualizace ikon se zpožděním“ byla konečně odstraněna a nahrazena jednoduchou ikonou, která ukazuje, že skript stále zpracovává ikony rychlosti (mějte na paměti, že aktualizace má záměrné zpoždění).</li></ul><h6>Opravy a vylepšení:</h6><ul><li>Záložka „Obecné“ byla přejmenována na „Nastavení“ pro lepší porozumění funkcím záložek;</li><li>Filtr velikosti segmentu již neodstraňuje ikonu, ale aplikuje stejnou průhlednost jako filtr rychlosti.</li></ul>`,
                    close: 'Zatvoriť',
                    viewScript: 'Zobraziť skript',
                    viewChangelog: 'Zobraziť záznam zmien',
                    reset: 'Obnoviť',
                    snackbar: {
                        errorFiltering: 'Chyba pri použití filtra. Minimálna rýchlosť nemôže byť väčšia ako maximálna.',
                    },
                    title: {
                        settings: 'Nastavenia',
                        roadTypes: 'Typy ciest',
                        filter: 'Filtrovať',
                        appearence: 'Vzhľad',
                        showOnRoadType: 'Zobraziť na nasledujúcich typoch ciest:',
                        seeOnDiscuss: 'Pozrite si vlákno skriptu na Discuss',
                        seeOnDiscord: 'Pozrite si kanál skriptu na Waze Script Discord serveri',
                        scriptDevBy: 'Zobraziť môj profil používateľa editora',
                    },
                    label: {
                        displaySpeeds: 'Zobraziť rýchlosti',
                        showNoSpeed: 'Zobraziť na segmentoch bez rýchlosti',
                        showOnRoundabout: 'Zobraziť na okruhu',
                        showOnUnpaved: 'Zobraziť na nezpevnených cestách',
                        maxZoom: 'Zobraziť do úrovne priblíženia:',
                        toggleLayerShortcut: 'Prepínať vrstvu zobrazenia rýchlosti',
                        zIndex: 'Hĺbka vrstvy',
                        hideShorterSegments: 'Skryť na segmentoch kratších ako',
                        speedFilter: 'Filtrovať podľa rýchlosti',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Úroveň priezračnosti filtra:',
                    },
                    alertMessage: {
                        zIndex: `Pri použití hĺbky vrstvy väčšej ako <b>${this.zIndex.warn}</b> bude vrstva rýchlosti prekryť ostatné a nebude možné vybrať žiadny prvok na obrazovke, kým ju neznížite pod <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Ak chcete zapnúť/vypnúť vrstvu zobrazenia rýchlosti, prejdite na <b>Mapové vrstvy > Cesty > Zobraziť rýchlosti</b> alebo použite skratku <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Predvolený',
                        altViennaConv: 'Alternatívna Viedenská konvencia',
                        japan: 'Japonsko',
                        northAmerica: 'Severná Amerika',
                        sacu: 'Juhoafrická colná únia',
                        uk: 'Spojené kráľovstvo',
                    },
                    btn: {
                        updateSettingsTab: 'Aktualizovať menu',
                        resetSettings: 'Obnoviť nastavenia',
                        seeOnDiscuss: 'Pozrieť na diskusii',
                        seeOnDiscord: 'Pozrieť na Discord',
                        scriptDevBy: 'Skript vyvinul Luan Tavares',
                    }
                };
            
                break;

            case 'sl':
                // Slovenian
                translations = {
                    name: 'Prikaz hitrosti',
                    zoomOut: 'Povečaj',
                    zoomIn: 'Pomanjšaj',
                    changelog: 'Zgodovina sprememb',
                    changelogMessage: `<h6>Novice:</h6><ul style="margin-bottom: 10px"><li>Sporočilo »posodabljanje ikon z zamikom« je bilo končno odstranjeno in zamenjano s preprosto ikono, ki jasno pokaže, kdaj skripta še vedno obdeluje ikone hitrosti (posodobitev ima nameren zamik).</li></ul><h6>Popravki in izboljšave:</h6><ul><li>Zavihek »Splošno« je preimenovan v »Nastavitve« za boljše razumevanje funkcije zavihkov;</li><li>Filter velikosti segmenta zdaj ne odstrani več ikone, temveč uporabi enako prosojnost kot filter hitrosti.</li></ul>`,
                    close: 'Zapri',
                    viewScript: 'Poglej skript',
                    viewChangelog: 'Poglej zgodovino sprememb',
                    reset: 'Ponastavi',
                    snackbar: {
                        errorFiltering: 'Napaka pri uporabi filtra. Najmanjša hitrost ne more biti večja od največje.',
                    },
                    title: {
                        settings: 'Nastavitve',
                        roadTypes: 'Vrste cest',
                        filter: 'Filtriraj',
                        appearence: 'Izgled',
                        showOnRoadType: 'Prikaži na naslednjih vrstah cest:',
                        seeOnDiscuss: 'Oglejte si temo skripte na Discuss',
                        seeOnDiscord: 'Oglejte si kanal skripte na Waze Script Discord strežniku',
                        scriptDevBy: 'Ogled mojega uporabniškega profila urejevalnika',
                    },
                    label: {
                        displaySpeeds: 'Prikaz hitrosti',
                        showNoSpeed: 'Prikaz na segmentih brez hitrosti',
                        showOnRoundabout: 'Prikaz na krožišču',
                        showOnUnpaved: 'Prikaz na nepovoznih cestah',
                        maxZoom: 'Prikaz do stopnje povečave:',
                        toggleLayerShortcut: 'Preklopi plast prikaza hitrosti',
                        zIndex: 'Globina plasti',
                        hideShorterSegments: 'Skrij na segmentih krajši od',
                        speedFilter: 'Filtriraj po hitrosti',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Raven filtriranja prosojnosti:',
                    },
                    alertMessage: {
                        zIndex: `Pri uporabi globine plasti večje od <b>${this.zIndex.warn}</b> se bo plast hitrosti prekrila z drugimi in ne bo mogoče izbrati nobenega elementa na zaslonu, dokler je ne zmanjšate pod <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Za aktiviranje/izklop plasti prikaza hitrosti, pojdite na <b>Plasti zemljevida > Ceste > Prikaz hitrosti</b> ali uporabite bližnjico <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Privzeto',
                        altViennaConv: 'Alternativna Dunajska konvencija',
                        japan: 'Japonska',
                        northAmerica: 'Severna Amerika',
                        sacu: 'Južnoafriška carinska unija',
                        uk: 'Združeno kraljestvo',
                    },
                    btn: {
                        updateSettingsTab: 'Posodobi meni',
                        resetSettings: 'Ponastavi nastavitve',
                        seeOnDiscuss: 'Oglej si na razpravi',
                        seeOnDiscord: 'Oglej si na Discordu',
                        scriptDevBy: 'Skript je razvijal Luan Tavares',
                    }
                };
            
                break;
            
            case 'sv':
                // Swedish
                translations = {
                    name: 'Hastighetsvisning',
                    zoomOut: 'Zooma ut',
                    zoomIn: 'Zooma in',
                    changelog: 'Ändringslogg',
                    changelogMessage: `<h6>Nytt:</h6><ul style="margin-bottom: 10px"><li>Meddelandet "uppdaterar ikoner med fördröjning" har äntligen tagits bort och ersatts med en enkel ikon som visar när skriptet fortfarande behandlar hastighetsikoner (det finns en avsiktlig fördröjning).</li></ul><h6>Fixar och förbättringar:</h6><ul><li>Fliken "Allmänt" har bytt namn till "Inställningar" för att tydliggöra flikarnas funktion;</li><li>Segmentstorleksfiltret tar inte längre bort ikonen utan tillämpar samma transparens som hastighetsfiltret.</li></ul>`,
                    close: 'Stäng',
                    viewScript: 'Visa skript',
                    viewChangelog: 'Visa ändringslogg',
                    reset: 'Återställ',
                    snackbar: {
                        errorFiltering: 'Fel vid tillämpning av filtret. Minsta hastighet kan inte vara större än den maximala.',
                    },
                    title: {
                        settings: 'Inställningar',
                        roadTypes: 'Väglagstyper',
                        filter: 'Filter',
                        appearence: 'Utseende',
                        showOnRoadType: 'Visa på följande vägtyper:',
                        seeOnDiscuss: 'Se skriptets tråd på Discuss',
                        seeOnDiscord: 'Se skriptets kanal på Waze Script Discord-servern',
                        scriptDevBy: 'Visa min redigerarprofil',
                    },
                    label: {
                        displaySpeeds: 'Visa hastigheter',
                        showNoSpeed: 'Visa på segment utan hastighet',
                        showOnRoundabout: 'Visa på rondell',
                        showOnUnpaved: 'Visa på oasfalterad väg',
                        maxZoom: 'Rendera upp till zoomnivå:',
                        toggleLayerShortcut: 'Växla hastighetslagrets synlighet',
                        zIndex: 'Lagerdjup',
                        hideShorterSegments: 'Dölj på segment som är kortare än',
                        speedFilter: 'Filtrera efter hastighet',
                        min: 'Min.:',
                        max: 'Max.:',
                        opacity: 'Filter opacitetsnivå:',
                    },
                    alertMessage: {
                        zIndex: `När du använder ett lagerdjup större än <b>${this.zIndex.warn}</b> kommer hastighetslagret att täcka andra lager och du kommer inte att kunna välja några objekt på skärmen förrän du sänker det under <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `För att aktivera/inaktivera hastighetsvisningslagret, gå till <b>Map Layers > Roads > Visa hastigheter</b> eller använd genvägen <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Standard',
                        altViennaConv: 'Alternativ Wienkonvention',
                        japan: 'Japan',
                        northAmerica: 'Nordamerika',
                        sacu: 'Sydafrikanska tullunionen',
                        uk: 'Storbritannien',
                    },
                    btn: {
                        updateSettingsTab: 'Uppdatera meny',
                        resetSettings: 'Återställ inställningar',
                        seeOnDiscuss: 'Se på diskussionen',
                        seeOnDiscord: 'Se på Discord',
                        scriptDevBy: 'Script utvecklat av Luan Tavares',
                    }
                };
                
                break;

            case 'th':
                // Thai
                translations = {
                    name: 'การแสดงความเร็ว',
                    zoomOut: 'ซูมออก',
                    zoomIn: 'ซูมเข้า',
                    changelog: 'บันทึกการเปลี่ยนแปลง',
                    changelogMessage: `<h6>ใหม่:</h6><ul style="margin-bottom: 10px"><li>ข้อความ "กำลังอัปเดตไอคอนพร้อมดีเลย์" ถูกลบออกในที่สุดและแทนที่ด้วยไอคอนธรรมดา ทำให้เห็นชัดเจนว่า script กำลังประมวลผลไอคอนความเร็วอยู่ (การอัปเดตมีการหน่วงเวลาโดยเจตนา)</li></ul><h6>การแก้ไขและปรับปรุง:</h6><ul><li>เปลี่ยนชื่อแท็บ "ทั่วไป" เป็น "การตั้งค่า" เพื่อให้เข้าใจหน้าที่ของแต่ละแท็บชัดเจนยิ่งขึ้น</li><li>ฟิลเตอร์ขนาดเซ็กเมนต์จะไม่ลบไอคอนอีกต่อไป แต่จะใช้ความโปร่งใสแบบเดียวกับฟิลเตอร์ความเร็ว</li></ul>`,
                    close: 'ปิด',
                    viewScript: 'ดูสคริปต์',
                    viewChangelog: 'ดูบันทึกการเปลี่ยนแปลง',
                    reset: 'คืนค่า',
                    snackbar: {
                        errorFiltering: 'ข้อผิดพลาดในการใช้ตัวกรอง ความเร็วขั้นต่ำต้องไม่มากกว่าค่าสูงสุด.',
                    },
                    title: {
                        settings: 'การตั้งค่า',
                        roadTypes: 'ประเภทถนน',
                        filter: 'ตัวกรอง',
                        appearence: 'ลักษณะ',
                        showOnRoadType: 'แสดงในประเภทถนนต่อไปนี้:',
                        seeOnDiscuss: 'ดูเธรดของสคริปต์ใน Discuss',
                        seeOnDiscord: 'ดูช่องของสคริปต์ในเซิร์ฟเวอร์ Discord ของ Waze Script',
                        scriptDevBy: 'ดูโปรไฟล์ผู้ใช้ของฉันในตัวแก้ไข',
                    },
                    label: {
                        displaySpeeds: 'แสดงความเร็ว',
                        showNoSpeed: 'แสดงในเซกเมนต์ที่ไม่มีความเร็ว',
                        showOnRoundabout: 'แสดงในทางแยกรอบ',
                        showOnUnpaved: 'แสดงในถนนที่ไม่ได้ปู',
                        maxZoom: 'แสดงได้จนถึงการซูมระดับ:',
                        toggleLayerShortcut: 'สลับการแสดงผลเลเยอร์ความเร็ว',
                        zIndex: 'ความลึกของเลเยอร์',
                        hideShorterSegments: 'ซ่อนในเซกเมนต์ที่สั้นกว่า',
                        speedFilter: 'กรองตามความเร็ว',
                        min: 'ขั้นต่ำ:',
                        max: 'สูงสุด:',
                        opacity: 'ระดับความทึบของฟิลเตอร์:',
                    },
                    alertMessage: {
                        zIndex: `เมื่อใช้ความลึกของเลเยอร์ที่มากกว่า <b>${this.zIndex.warn}</b> เลเยอร์ความเร็วจะทับซ้อนกับเลเยอร์อื่นและคุณจะไม่สามารถเลือกองค์ประกอบใดๆ บนหน้าจอจนกว่าจะลดความลึกลงต่ำกว่า <b>${this.zIndex.warn}</b> อีกครั้ง.`,
                        toggleVisibility: `เพื่อเปิด/ปิดการแสดงผลของเลเยอร์ความเร็ว ให้ไปที่ <b>แผนที่ > ถนน > แสดงความเร็ว</b> หรือใช้ทางลัด <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'ค่าเริ่มต้น',
                        altViennaConv: 'อนุสัญญาวีนนาทางเลือก',
                        japan: 'ญี่ปุ่น',
                        northAmerica: 'อเมริกาเหนือ',
                        sacu: 'สหภาพศุลกากรแอฟริกาตอนใต้',
                        uk: 'สหราชอาณาจักร',
                    },
                    btn: {
                        updateSettingsTab: 'อัปเดตเมนู',
                        resetSettings: 'ตั้งค่าคืนค่า',
                        seeOnDiscuss: 'ดูในกระทู้สนทนา',
                        seeOnDiscord: 'ดูใน Discord',
                        scriptDevBy: 'สคริปต์พัฒนาโดย Luan Tavares',
                    }
                };
            
                break;

            case 'tr':
                // Turkish
                translations = {
                    name: 'Hız Gösterimi',
                    zoomOut: 'Daha uzak',
                    zoomIn: 'Daha yakın',
                    changelog: 'Değişiklikler',
                    changelogMessage: `<h6>Yenilikler:</h6><ul style="margin-bottom: 10px"><li>"Gecikmeli simge güncelleniyor" mesajı nihayet kaldırıldı ve hız simgeleri hâlâ işlenirken bunu belirten basit bir simgeyle değiştirildi (bilerek yapılan bir gecikme vardır).</li></ul><h6>Düzeltmeler ve iyileştirmeler:</h6><ul><li>"Genel" sekmesinin adı, her sekmenin işlevinin daha iyi anlaşılması için "Ayarlar" olarak değiştirildi;</li><li>Segment boyutu filtresi artık simgeyi kaldırmaz, hız filtresinde olduğu gibi opaklık uygular.</li></ul>`,
                    close: 'Kapat',
                    viewScript: 'Scripti Görüntüle',
                    viewChangelog: 'Değişiklikler Kaydını Görüntüle',
                    reset: 'Sıfırla',
                    snackbar: {
                        errorFiltering: 'Filtre uygulanırken hata oluştu. Minimum hız, maksimum hızdan büyük olamaz.',
                    },
                    title: {
                        settings: 'Ayarlar',
                        roadTypes: 'Yol Tipleri',
                        filter: 'Filtre',
                        appearence: 'Görünüm',
                        showOnRoadType: 'Aşağıdaki yol tiplerinde göster:',
                        seeOnDiscuss: 'Script\'in thread\'ini Discuss\'ta görün',
                        seeOnDiscord: 'Waze Script Discord sunucusunda script kanalını görün',
                        scriptDevBy: 'Editör kullanıcı profilimi görüntüle',
                    },
                    label: {
                        displaySpeeds: 'Hızları Göster',
                        showNoSpeed: 'Hızsız segmentlerde göster',
                        showOnRoundabout: 'Dönel kavşakta göster',
                        showOnUnpaved: 'Asfaltlanmamış yolda göster',
                        maxZoom: 'Zoom seviyesine kadar render yap:',
                        toggleLayerShortcut: 'Hız katmanını açıp kapatma kısayolu',
                        zIndex: 'Katman derinliği',
                        hideShorterSegments: 'Daha kısa segmentlerde gizle',
                        speedFilter: 'Hız filtresi',
                        min: 'Min:',
                        max: 'Maks:',
                        opacity: 'Filtre opaklık seviyesi:',
                    },
                    alertMessage: {
                        zIndex: `Katman derinliğini <b>${this.zIndex.warn}</b> değerinden daha yüksek kullanırsanız, hız katmanı diğerlerinin üst üste binmesine neden olur ve herhangi bir öğe seçilemez. Bu durumu düzeltmek için katman derinliğini <b>${this.zIndex.warn}</b> değerinin altına indirin.`,
                        toggleVisibility: `Hız katmanını açıp kapatmak için <b>Harita Katmanları > Yollar > Hızları Göster</b> yolunu izleyebilir veya <b>ALT</b> + <b>SHIFT</b> + <b>S</b> kısayolunu kullanabilirsiniz.`
                    },
                    theme: {
                        default: 'Varsayılan',
                        altViennaConv: 'Alternatif Viyana Sözleşmesi',
                        japan: 'Japonya',
                        northAmerica: 'Kuzey Amerika',
                        sacu: 'Güney Afrika Gümrük Birliği',
                        uk: 'Birleşik Krallık',
                    },
                    btn: {
                        updateSettingsTab: 'Menüyü Güncelle',
                        resetSettings: 'Ayarları Sıfırla',
                        seeOnDiscuss: 'Tartışmada gör',
                        seeOnDiscord: 'Discord’da gör',
                        scriptDevBy: 'Script, Luan Tavares tarafından geliştirilmiştir',
                    }
                };
            
                break;

            case 'uk':
                // Ukrainian
                translations = {
                    name: 'Відображення швидкості',
                    zoomOut: 'Далі',
                    zoomIn: 'Ближче',
                    changelog: 'Журнал змін',
                    changelogMessage: `<h6>Що нового:</h6><ul style="margin-bottom: 10px"><li>Повідомлення «оновлення значків із затримкою» остаточно видалено й замінено простим значком, який чітко вказує, що скрипт ще обробляє значки швидкості (оновлення виконується із запланованою затримкою).</li></ul><h6>Виправлення та покращення:</h6><ul><li>Вкладку «Загальні» перейменовано на «Налаштування» для кращого розуміння функцій;</li><li>Фільтр довжини сегментів більше не видаляє значки, а застосовує ту ж прозорість, що й фільтр швидкості.</li></ul>`,
                    close: 'Закрити',
                    viewScript: 'Переглянути сценарій',
                    viewChangelog: 'Переглянути журнал змін',
                    reset: 'Скинути',
                    snackbar: {
                        errorFiltering: 'Помилка застосування фільтра. Мінімальна швидкість не може бути більшою за максимальну.',
                    },
                    title: {
                        settings: 'Налаштування',
                        roadTypes: 'Типи доріг',
                        filter: 'Фільтр',
                        appearence: 'Зовнішній вигляд',
                        showOnRoadType: 'Показати на наступних типах доріг:',
                        seeOnDiscuss: 'Переглянути тему скрипта на Discuss',
                        seeOnDiscord: 'Переглянути канал скрипта на сервері Discord Waze Script',
                        scriptDevBy: 'Переглянути мій профіль користувача редактора',
                    },
                    label: {
                        displaySpeeds: 'Показувати швидкості',
                        showNoSpeed: 'Показувати на сегментах без швидкості',
                        showOnRoundabout: 'Показувати на кільцевих перехрестях',
                        showOnUnpaved: 'Показувати на непокритих дорогах',
                        maxZoom: 'Рендерити до рівня zoom:',
                        toggleLayerShortcut: 'Перемикання шару відображення швидкості',
                        zIndex: 'Глибина шару',
                        hideShorterSegments: 'Приховувати на сегментах менше ніж',
                        speedFilter: 'Фільтрувати за швидкістю',
                        min: 'Мін.:',
                        max: 'Макс.:',
                        opacity: 'Рівень прозорості фільтра:',
                    },
                    alertMessage: {
                        zIndex: `Якщо використовувати глибину шару більше за <b>${this.zIndex.warn}</b>, шар швидкості накладатиметься на інші, і ви не зможете вибрати жоден елемент на екрані, поки не зменшите глибину до <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Щоб увімкнути/вимкнути шар швидкості, просто перейдіть до <b>Шари карти > Дороги > Відображати швидкості</b> або використовуйте гарячу клавішу <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'За замовчуванням',
                        altViennaConv: 'Альтернативна Віденська конвенція',
                        japan: 'Японія',
                        northAmerica: 'Північна Америка',
                        sacu: 'Південноафриканський митний союз',
                        uk: 'Сполучене Королівство',
                    },
                    btn: {
                        updateSettingsTab: 'Оновити меню',
                        resetSettings: 'Скинути налаштування',
                        seeOnDiscuss: 'Дивитися в обговоренні',
                        seeOnDiscord: 'Дивитися в Discord',
                        scriptDevBy: 'Сценарій розроблений Луаном Таваресом',
                    }
                };
                
                break;

            case 'vi':
                // Vietnamese
                translations = {
                    name: 'Hiển thị tốc độ',
                    zoomOut: 'Zoom ra',
                    zoomIn: 'Zoom vào',
                    changelog: 'Lịch sử thay đổi',
                    changelogMessage: `<h6>Mới:</h6><ul style="margin-bottom: 10px"><li>Thông báo "đang cập nhật biểu tượng với độ trễ" cuối cùng đã được gỡ bỏ và thay thế bằng biểu tượng đơn giản, thể hiện rõ khi nào script vẫn đang xử lý biểu tượng tốc độ (có độ trễ có chủ đích).</li></ul><h6>Sửa lỗi và cải tiến:</h6><ul><li>Tab "Chung" được đổi tên thành "Cài đặt" để dễ hiểu hơn về chức năng của từng tab;</li><li>Bộ lọc kích thước đoạn đường không còn xóa biểu tượng mà áp dụng độ mờ giống như bộ lọc tốc độ.</li></ul>`,
                    close: 'Đóng',
                    viewScript: 'Xem kịch bản',
                    viewChangelog: 'Xem lịch sử thay đổi',
                    reset: 'Đặt lại',
                    snackbar: {
                        errorFiltering: 'Lỗi áp dụng bộ lọc. Tốc độ tối thiểu không thể lớn hơn tốc độ tối đa.',
                    },
                    title: {
                        settings: 'Cài đặt',
                        roadTypes: 'Loại đường',
                        filter: 'Lọc',
                        appearence: 'Ngoại hình',
                        showOnRoadType: 'Hiển thị trên các loại đường sau:',
                        seeOnDiscuss: 'Xem chủ đề của script trên Discuss',
                        seeOnDiscord: 'Xem kênh của script trên máy chủ Discord của Waze Script',
                        scriptDevBy: 'Xem hồ sơ người dùng biên tập viên của tôi',
                    },
                    label: {
                        displaySpeeds: 'Hiển thị tốc độ',
                        showNoSpeed: 'Hiển thị trên đoạn đường không có tốc độ',
                        showOnRoundabout: 'Hiển thị trên vòng xuyến',
                        showOnUnpaved: 'Hiển thị trên đường không trải nhựa',
                        maxZoom: 'Hiển thị đến mức zoom:',
                        toggleLayerShortcut: 'Chuyển đổi lớp hiển thị tốc độ',
                        zIndex: 'Độ sâu lớp',
                        hideShorterSegments: 'Ẩn trên các đoạn đường ngắn hơn',
                        speedFilter: 'Lọc theo tốc độ',
                        min: 'Tối thiểu:',
                        max: 'Tối đa:',
                        opacity: 'Mức độ trong suốt bộ lọc:',
                    },
                    alertMessage: {
                        zIndex: `Khi sử dụng độ sâu lớp lớn hơn <b>${this.zIndex.warn}</b>, lớp tốc độ sẽ chồng lên các lớp khác và bạn sẽ không thể chọn bất kỳ đối tượng nào trên màn hình cho đến khi giảm độ sâu lớp xuống dưới <b>${this.zIndex.warn}</b>.`,
                        toggleVisibility: `Để bật/tắt lớp hiển thị tốc độ, chỉ cần vào <b>Lớp bản đồ > Đoạn đường > Hiển thị tốc độ</b> hoặc sử dụng phím tắt <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Mặc định',
                        altViennaConv: 'Hiệp định Vienna thay thế',
                        japan: 'Nhật Bản',
                        northAmerica: 'Bắc Mỹ',
                        sacu: 'Liên minh Hải quan Nam Phi',
                        uk: 'Vương quốc Anh',
                    },
                    btn: {
                        updateSettingsTab: 'Cập nhật menu',
                        resetSettings: 'Đặt lại cài đặt',
                        seeOnDiscuss: 'Xem trên thảo luận',
                        seeOnDiscord: 'Xem trên Discord',
                        scriptDevBy: 'Script được phát triển bởi Luan Tavares',
                    }
                };
            
                break;

            case 'zh':
                // Chinese
                translations = {
                    name: '速度显示',
                    zoomOut: '缩小',
                    zoomIn: '放大',
                    changelog: '更新日志',
                    changelogMessage: `<h6>新增內容:</h6><ul style="margin-bottom: 10px"><li>「延遲更新圖示」的訊息已被簡單圖示取代,明確顯示腳本正在處理速度圖示(請注意,有刻意延遲)。</li></ul><h6>修正與改進:</h6><ul><li>將「一般」分頁名稱修改為「設定」,更清楚表達各分頁的功能;</li><li>依據路段長度的篩選條件不再移除圖示,而是套用與速度篩選相同的透明度。</li></ul>`,
                    close: '关闭',
                    viewScript: '查看脚本',
                    viewChangelog: '查看更新日志',
                    reset: '重置',
                    snackbar: {
                        errorFiltering: '应用过滤器时出错。最低速度不能大于最高速度。',
                    },
                    title: {
                        settings: '设置',
                        roadTypes: '道路类型',
                        filter: '过滤器',
                        appearence: '外观',
                        showOnRoadType: '在以下道路类型上显示:',
                        seeOnDiscuss: '查看脚本的主题讨论',
                        seeOnDiscord: '查看Waze Script Discord服务器上的脚本频道',
                        scriptDevBy: '查看我的编辑器用户档案',
                    },
                    label: {
                        displaySpeeds: '显示速度',
                        showNoSpeed: '显示无速度段落',
                        showOnRoundabout: '显示在环形交叉口',
                        showOnUnpaved: '显示在未铺砌的道路上',
                        maxZoom: '最大缩放:',
                        toggleLayerShortcut: '切换速度显示图层',
                        zIndex: '图层深度',
                        hideShorterSegments: '隐藏小于以下长度的段落',
                        speedFilter: '按速度过滤',
                        min: '最小:',
                        max: '最大:',
                        opacity: '过滤器透明度级别:',
                    },
                    alertMessage: {
                        zIndex: `当使用大于 <b>${this.zIndex.warn}</b> 的图层深度时,速度图层将覆盖其他图层,您将无法选择任何屏幕上的元素,直到将其深度降低到 <b>${this.zIndex.warn}</b> 以下。`,
                        toggleVisibility: `要启用/禁用速度显示图层,只需转到 <b>地图图层 > 道路 > 显示速度</b> 或使用快捷键 <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: '默认',
                        altViennaConv: '替代维也纳公约',
                        japan: '日本',
                        northAmerica: '北美洲',
                        sacu: '南部非洲关税联盟',
                        uk: '英国',
                    },
                    btn: {
                        updateSettingsTab: '更新菜单',
                        resetSettings: '重置设置',
                        seeOnDiscuss: '在讨论中查看',
                        seeOnDiscord: '在 Discord 上查看',
                        scriptDevBy: '脚本由Luan Tavares开发',
                    }
                };
            
                break;

            case 'zh-TW':
                // Traditional Chinese
                translations = {
                    name: '速度顯示',
                    zoomOut: '縮小',
                    zoomIn: '放大',
                    changelog: '更新日誌',
                    changelogMessage: `<h6>新增內容:</h6><ul style="margin-bottom: 10px"><li>最終移除「延遲更新圖示」的訊息,改為使用簡單圖示,清楚顯示腳本仍在處理速度圖示(請記得更新有刻意延遲)。</li></ul><h6>修正與改善:</h6><ul><li>將「一般」頁籤名稱改為「設定」,以更清楚說明各頁籤功能;</li><li>路段長度過濾器不再移除圖示,而是套用與速度過濾器相同的透明度。</li></ul>`,
                    close: '關閉',
                    viewScript: '查看腳本',
                    viewChangelog: '查看更新日誌',
                    reset: '重設',
                    snackbar: {
                        errorFiltering: '應用篩選器時出錯。最低速度不能大於最高速度。',
                    },
                    title: {
                        settings: '設定',
                        roadTypes: '道路類型',
                        filter: '過濾器',
                        appearence: '外觀',
                        showOnRoadType: '在以下道路類型上顯示:',
                        seeOnDiscuss: '查看腳本的主題討論',
                        seeOnDiscord: '查看Waze Script Discord伺服器上的腳本頻道',
                        scriptDevBy: '查看我的編輯器用戶檔案',
                    },
                    label: {
                        displaySpeeds: '顯示速度',
                        showNoSpeed: '顯示無速度段落',
                        showOnRoundabout: '顯示在環形交叉口',
                        showOnUnpaved: '顯示在未鋪設的道路上',
                        maxZoom: '最大縮放:',
                        toggleLayerShortcut: '切換速度顯示圖層',
                        zIndex: '圖層深度',
                        hideShorterSegments: '隱藏小於以下長度的段落',
                        speedFilter: '按速度過濾',
                        min: '最小:',
                        max: '最大:',
                        opacity: '濾鏡透明度級別:',
                    },
                    alertMessage: {
                        zIndex: `當使用大於 <b>${this.zIndex.warn}</b> 的圖層深度時,速度圖層將覆蓋其他圖層,您將無法選擇任何螢幕上的元素,直到將其深度降低到 <b>${this.zIndex.warn}</b> 以下。`,
                        toggleVisibility: `要啟用/禁用速度顯示圖層,只需前往 <b>地圖圖層 > 道路 > 顯示速度</b> 或使用快捷鍵 <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: '預設',
                        altViennaConv: '替代維也納公約',
                        japan: '日本',
                        northAmerica: '北美洲',
                        sacu: '南部非洲關稅聯盟',
                        uk: '英國',
                    },
                    btn: {
                        updateSettingsTab: '更新菜單',
                        resetSettings: '重設設定',
                        seeOnDiscuss: '在討論中查看',
                        seeOnDiscord: '在 Discord 上查看',
                        scriptDevBy: '腳本由Luan Tavares開發',
                    }
                };
            
                break;

            default:
                // Default language (english)
                translations = {
                    name: 'Speed Display',
                    zoomOut: 'Zoom Out',
                    zoomIn: 'Zoom In',
                    changelog: 'Changelog',
                    changelogMessage: `<h6>What's New:</h6><ul style="margin-bottom: 10px"><li>Finally removed the "updating icons with delay" message and replaced it with a simple icon, making it clear when the script is still processing speed icons (remember there’s an intentional delay).</li></ul><h6>Fixes and improvements:</h6><ul><li>Renamed the "general" tab to "settings" for better clarity on each tab's function;</li><li>The segment size filter no longer removes the icon but now applies the same opacity as the speed filter.</li></ul>`,
                    close: 'Close',
                    viewScript: 'View Script',
                    viewChangelog: 'View Changelog',
                    reset: 'Reset',
                    snackbar: {
                        errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
                    },
                    title: {
                        settings: 'General',
                        roadTypes: 'Road Types',
                        filter: 'Filter',
                        appearence: 'Appearence',
                        showOnRoadType: 'Show on the following road types:',
                        seeOnDiscuss: 'See the script\'s thread on the Discuss',
                        seeOnDiscord: 'See the script\'s channel on the Waze Script\'s Discord server',
                        scriptDevBy: 'View my editor user profile',
                    },
                    label: {
                        displaySpeeds: 'Display speeds',
                        showNoSpeed: 'Show on segments with no speed',
                        showOnRoundabout: 'Show on roundabout',
                        showOnUnpaved: 'Show on unpaved road',
                        maxZoom: 'Render until zoom:',
                        toggleLayerShortcut: 'Toggle speed display layer',
                        zIndex: 'Layer depth',
                        hideShorterSegments: 'Hide segments shorter than',
                        speedFilter: 'Filter by speed',
                        min: 'Min:',
                        max: 'Max:',
                        opacity: 'Filter opacity level:',
                    },
                    alertMessage: {
                        zIndex: `When using a layer depth greater than <b>${this.zIndex.warn}</b>, the speed layer will overlap others, and you will not be able to select any element on the screen until you lower the depth below <b>${this.zIndex.warn}</b>.`,
                        // TODO: Adjust translation of the toggleVisibility when finishing SDK migration
                        toggleVisibility: `To toggle the visibility of the speed display layer, just go to <b>Map Layers > Roads > Show speeds</b> or use the shortcut <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
                    },
                    theme: {
                        default: 'Default',
                        altViennaConv: 'Alternative Vienna Convention',
                        japan: 'Japan',
                        northAmerica: 'North America',
                        sacu: 'Southern African Customs Union',
                        uk: 'United Kingdom',
                    },
                    btn: {
                        updateSettingsTab: 'Update Menu',
                        resetSettings: 'Reset Settings',
                        seeOnDiscuss: 'See on the Discuss',
                        seeOnDiscord: 'See on the Discord',
                        scriptDevBy: 'Script developed by Luan Tavares',
                    }
                };                

                break;
        };

        Object.assign(this.spdTranslations, translations);

        this.logDebug('Languages defined.');
    }
}

window.SDK_INITIALIZED.then(() => new WmeSpeedDisplay());