您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Displays road speed directly in the center of the segment (taking curves into account) in Waze Map Editor
当前为
// ==UserScript== // @name WME Speed Display // @namespace https://gf.qytechs.cn/scripts/526702-wme-speed-display/ // @version 1.4.16 // @description Displays road speed directly in the center of the segment (taking curves into account) in Waze Map Editor // @author Luan Tavares // @icon data:image/png;base64,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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: * Add zindex field for the user to define the height of the layer they want to display * Add a scheme where speeds are not displayed on stretches smaller than X m or a better way * Add a speed filter, where the user says from which speed he wants to see * Add an opacity option for icons * Add some visual information when updateMap is rendering * Check a way to get all road types and groups automatically * Update the map when the user selects a search location */ /* global W */ /* global I18n */ /* global OpenLayers */ class WmeSpeedDisplay { constructor() { this.version = '1.4.16'; this.layer = null; this.debugMode = false; this.settings = {}; 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' }, { id: 5, name: 'walking_trail' }, { id: 10, name: 'pedestrian_boardwalk' }, { id: 16, name: 'stairway' } ], 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.spdTranslations = I18n.translations[I18n.locale].wmeSpd; this.debounce = { updateMapDisplay: this.debounce(this.updateMapDisplay.bind(this), 1000), saveSettings: this.debounce(this.saveSettings.bind(this)) }; this.layerCheckbox = { roadGroup: null, speedDisplay: null }; this.prepareAndInitialize(); } /** * Checks if WME is ready to initializes the plugin. */ prepareAndInitialize() { this.defineInitialSettings(); this.defineTranslations(); if (W?.userscripts?.state?.isReady) { this.logDebug(this.spdTranslations.log.wmeReadyStartScript); this.initializePlugin(); } else { this.logDebug(this.spdTranslations.log.waitingWme); document.addEventListener('wme-ready', this.initializePlugin.bind(this), {once: true}); } } /** * Initializes the plugin. */ async initializePlugin() { this.logDebug(this.spdTranslations.log.wmeReadyStartingPlugin, true); this.checkVersionAndShowChangelog(); this.layer = new OpenLayers.Layer.Vector('Speed Display Layer', { displayInLayerSwitcher: false }); W.map.addLayer(this.layer); this.addLayerCheckbox(); this.addSettingsTab(); this.addShortcut(); this.listen(); this.logDebug(this.spdTranslations.log.shortSleep); await this.sleep(1000); this.updateMapDisplay(); } /** * Method that listens to this script events. */ listen() { document.getElementById('keyboard-dialog-link').addEventListener('click', this.addKeyboardShortCutOnDialog.bind(this)); W.prefs.on('change:isImperial', this.debounce.updateMapDisplay.bind(this)); W.map.events.register('moveend', null, this.onTriggeringMapEvent.bind(this)); W.map.events.register('zoomend', null, this.onTriggeringMapEvent.bind(this)); W.model.segments.on('objectschanged', this.onTriggeringMapEvent.bind(this)); } /** * When the map triggers an event, updates the map display. */ onTriggeringMapEvent() { if (this.layerCheckbox.roadGroup.checked && this.settings.spdEnabled) this.debounce.updateMapDisplay(); } /** * Saves and updates the map display when WME SPD checkbox change. * @param {Event} event */ onSpeedDisplayCheckboxChange(event) { this.debounce.saveSettings(); this.debounce.updateMapDisplay(); this.toggleLayerVisibility(event.target.checked); } /** * Saves the settings and updates the map display. */ onSettingsChange() { this.debounce.saveSettings(); this.debounce.updateMapDisplay(); } /** * Updates the max zoom value display and triggers map update if the zoom level reaches the max. * @param {Event} event */ onSettingZoomChanged(event) { let zoomLevel = W.map.getZoom(); document.getElementById('spd-max-zoom-value').innerText = event.target.value; this.debounce.saveSettings(); if (zoomLevel >= this.settings.general.spdMaxZoom) this.debounce.updateMapDisplay(); } /** * Updates the layer visibility based on the layer switcher road group state. */ onLayerSwithcerGroupRoadChange() { let roadGroupActived = this.layerCheckbox.roadGroup.checked; this.toggleLayerVisibility(roadGroupActived); this.layerCheckbox.speedDisplay.disabled = !roadGroupActived; } /** * Attaches event listeners to the settings elements to track user interactions and changes. */ attachSettingsListeners() { ['spd-show-no-speed', 'spd-show-roundabout', 'spd-show-unpaved'].forEach(id => { document.getElementById(id).addEventListener('change', this.onSettingsChange.bind(this)); }); document.getElementById('spd-max-zoom').addEventListener('input', this.onSettingZoomChanged.bind(this)); document.querySelectorAll('[id^="spd-show-speed-in-"]').forEach(input => { input.addEventListener('change', this.onSettingsChange.bind(this)); }); if (this.debugMode) { document.getElementById('btn-spd-update-settings-tab').addEventListener('click', this.updateSettingsTab.bind(this)); document.getElementById('btn-spd-show-modal').addEventListener('click', this.showSpeedDisplayDialog.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() { ['spd-show-no-speed', 'spd-show-roundabout', 'spd-show-unpaved'].forEach(id => { document.getElementById(id).removeEventListener('change', this.onSettingsChange.bind(this)); }); document.getElementById('spd-max-zoom').removeEventListener('input', this.onSettingZoomChanged.bind(this)); document.querySelectorAll('[id^="spd-show-speed-in-"]').forEach(input => { input.removeEventListener('change', this.onSettingsChange.bind(this)); }); if (this.debugMode) { document.getElementById('btn-spd-update-settings-tab').removeEventListener('click', this.updateSettingsTab.bind(this)); document.getElementById('btn-spd-show-modal').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 by removing old features and adding new speed icons based on the settings. */ updateMapDisplay() { this.logDebug(this.spdTranslations.log.updateMapDisplay); let zoomLevel = W.map.getZoom(); this.layer.removeAllFeatures(); if (zoomLevel < this.settings.general.spdMaxZoom) { this.logDebug(this.spdTranslations.log.maxZoomExceeded); return; } let segments = W.model.segments.objects || {}; let segmentKeys = Object.keys(segments); if (segmentKeys.length === 0) { this.logDebug(this.spdTranslations.log.noneSegment); return; } this.logDebug(`${this.spdTranslations.log.numSegmentsLoaded} ${segmentKeys.length}`); segmentKeys.forEach(segmentId => { let segment = segments[segmentId]; if (!segment || !segment.attributes) { this.logDebug(`${this.spdTranslations.log.attributesNotFound} ${segmentId}.`); return; } let attributes = segment.attributes; let roadSettingId = this.convertStringCaseStyle('snake', 'camel', `spd_show_speed_in_${this.getRoadSettingNameById(attributes.roadType)}`); let isFwd = attributes.fwdDirection; let isRev = attributes.revDirection; let speedFwd = this.getSpeed(isFwd ? attributes.fwdMaxSpeed : null); let speedRev = this.getSpeed(isRev ? attributes.revMaxSpeed : 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)); 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.spdTranslations.log.disallowedSegment); return; } let geometry = segment.getOLGeometry(); if (!geometry || geometry.components.length < 2) { this.logDebug(`${this.spdTranslations.log.invalidGeometry} ${segmentId}.`); return; } 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}); leftFeature.style = { graphic: true, externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedRev)), graphicHeight: 30, graphicWidth: 30, graphicYOffset: -15, graphicXOffset: -15 }; 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 }; 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; 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 }; this.layer.addFeatures([centerFeature]); } }); this.logDebug(this.spdTranslations.log.updateMapDisplayFinished); } /** * Toggle visibility of the display of the speed layer. * @param {Boolean} enabled */ toggleLayerVisibility(enabled) { if (this.layer) { this.layer.setVisibility(enabled); this.logDebug(`${this.spdTranslations.log.speedLayer} ${enabled ? this.spdTranslations.enabled : this.spdTranslations.disabled}.`); } } /** * Saves the current settings to localStorage. */ saveSettings() { this.settings.spdEnabled = this.layerCheckbox.speedDisplay.checked; Object.keys(this.settings.general).forEach(setting => { let element = document.getElementById(this.convertStringCaseStyle('camel', 'kebab', setting)); this.settings.general[setting] = setting != 'spdMaxZoom' ? element.checked : element.value; }); document.querySelectorAll('[id^="spd-show-speed-in-"]').forEach(input => { let settingId = this.convertStringCaseStyle('kebab', 'camel', input.id); this.settings.roads[settingId] = input.checked; }); localStorage.setItem('wmeSpeedDisplaySettings', JSON.stringify(this.settings)); } /** * 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 { this.settings[setting] = value ?? true; } }); } /** * Adds a settings tab to the user interface with options to configure the speed display settings. */ addSettingsTab() { let scriptTabContainer = document.querySelector('#user-info .nav-tabs'); if (!scriptTabContainer) { this.logDebug(this.spdTranslations.log.scriptsTabNotFound); setTimeout(() => this.addSettingsTab(), 1000); return; } if (document.getElementById('wme-spd-tab')) return; let tabButton = document.createElement('li'); tabButton.innerHTML = `<a href="#spd-settings" data-toggle="tab">${this.spdTranslations.name}</a>`; scriptTabContainer.appendChild(tabButton); let tabContentContainer = document.querySelector('.tab-content'); let userScriptsApiDocsLinkContainer = tabContentContainer.querySelector('.userscripts-api-docs-link-container'); let tabContent = document.createElement('div'); tabContent.id = 'spd-settings'; tabContent.classList.add('tab-pane'); let tabContentHtml = ` <div style="padding: 0 10px;"> <h4>${this.spdTranslations.settingTabName}</h4> <hr> <wz-label html-for="">${this.spdTranslations.title.general}</wz-label> <wz-checkbox checked="${this.settings.general.spdShowNoSpeed}" indeterminate="false" disabled="false" id="spd-show-no-speed" value="true">${this.spdTranslations.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.spdTranslations.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.spdTranslations.label.showOnUnpaved}<input type="checkbox" value="true" style="display: none; visibility: hidden;"></wz-checkbox> <br> <wz-label html-for="" style="margin-top:10px">${this.spdTranslations.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 style="display: flex; justify-content: space-between; width: 100%; color: #777; font-size: 11px; line-height: 15px;"><span>${this.spdTranslations.zoomOut}</span><span>${this.spdTranslations.zoomIn}</span></div> <br> <wz-label html-for="" style="margin:0">${this.spdTranslations.title.showOnRoadType}</wz-label>`; Object.entries(this.segmentsCategories).forEach(segmentCategory => { tabContentHtml += `<wz-menu-title style="padding:0;">${I18n.translations[I18n.locale].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]; tabContentHtml += `<wz-checkbox checked="${checked}" indeterminate="false" disabled="false" id="${id}" value="true">${I18n.translations[I18n.locale].segment.road_types[roadType.id]}<input type="checkbox" value="true" style="display: none; visibility: hidden;"></wz-checkbox>`; }); }); if (this.debugMode) { tabContentHtml += `<wz-button color="primary" id="btn-spd-update-settings-tab" style="margin-top: 10px; width: 100%;">${this.spdTranslations.btn.updateSettingsTab}</wz-button>`; tabContentHtml += `<wz-button color="secondary" id="btn-spd-show-modal" style="margin-top: 10px; width: 100%;">${this.spdTranslations.showDialog}</wz-button>`; } tabContentHtml += `<wz-button color="text" size="sm" style="margin-top: 10px" id="btn-spd-open-changelog-dialog"><b>${this.spdTranslations.name}</b> v${this.version}</wz-button> </div>`; tabContent.innerHTML = tabContentHtml; tabContentContainer.insertBefore(tabContent, userScriptsApiDocsLinkContainer); this.attachSettingsListeners(); this.logDebug(this.spdTranslations.log.settingsTabAdded); } /** * Updates the settings tab by removing the old one and adding a new one with updated settings. */ updateSettingsTab() { this.logDebug(this.spdTranslations.log.updatingSettingsTab); let linkTab = document.querySelector('#user-info .nav-tabs li a[href="#spd-settings"]'); let tabContent = document.getElementById('spd-settings'); if (!linkTab || !tabContent) return; this.detachSettingsListeners(); this.defineTranslations(); tabContent.remove(); linkTab.closest('li').remove(); this.addSettingsTab(); this.updateSettingsElementsStates(); } /** * Updates the state of the settings elements (checkboxes, inputs) based on the current settings. */ updateSettingsElementsStates() { Object.entries(this.settings.general).forEach(([setting, value]) => { let id = this.convertStringCaseStyle('camel', 'kebab', setting); let element = document.getElementById(id); if (!element) return; if (setting != 'spdMaxZoom') { element.checked = value; } else { element.value = value; document.getElementById('spd-max-zoom-value').innerText = value; } }); document.querySelectorAll('[id^="spd-show-speed-in-"]').forEach(input => { let settingId = this.convertStringCaseStyle('kebab', 'camel', input.id); if (input.type == 'checkbox') input.checked = this.settings.roads[settingId]; }); } /** * Adds a global keyboard shortcut listener and add the script shortcut on shortcuts dialog. */ addShortcut() { document.addEventListener('keydown', this.onDocumentKeydown.bind(this)); } /** * Adds a custom shortcut section to the shortcuts dialog. */ addKeyboardShortCutOnDialog() { let shortcutDialog = document.getElementById('shortcuts-dialog'); if (!shortcutDialog) { this.logDebug(this.spdTranslations.log.shortCutDialogNotFound); setTimeout(() => this.addKeyboardShortCutOnDialog(), 1000); return; } let lastShortcutActionGroup = shortcutDialog.querySelector('.shortcut-action-group:last-of-type'); let newActionGroup = document.createElement('section'); newActionGroup.classList.add('shortcut-action-group'); newActionGroup.id = 'keyboard-shortcut-scripts-dialog'; newActionGroup.innerHTML = ` <h2>${this.spdTranslations.name}</h2> <p class="shortcut-action" id="keyboard-shortcut-speed-display"> <span> <span> <kbd class="altKey"> <span>$altKey</span> </kbd> + </span> <span> <kbd class="shiftKey"> <span>$shiftKey</span> </kbd> + </span> <kbd>S</kbd> </span> <span class="shortcut-action-name">${this.spdTranslations.label.toggleLayerShortcut}</span> </p>`; lastShortcutActionGroup.insertAdjacentElement('afterend', newActionGroup); } /** * Toggles the layer switcher speed display when shortcut is pressed. * @param {Event} event */ onDocumentKeydown(event) { if (event.altKey && event.shiftKey && event.key.toLowerCase() == 's') this.layerCheckbox.speedDisplay.click(); } /** * 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(); } /** * Generates an SVG icon with the speeds. * @param {String} speedFwd Forward speed. * @param {String} speedRev Reverse speed. * @param {String} isFwd Direction of the road forward. * @param {String} isRev Reverse lane direction. * * @returns {String} SVG in string format. */ getSpeedIcon(speed) { return ` <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="red" stroke-width="5"/> <text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="black" text-anchor="middle">${speed}</text> </svg>`; } /** * 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); return 0; } /** * 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 = W.map.getZoom(); 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; 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) ); 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 W.prefs.attributes.isImperial ? Math.round(speed * 0.621371) : speed; } /** * 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|null)} timeout Delay time in milliseconds. * * @returns Function */ debounce(func, timeout = 300) { let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, args); }, 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, (_, letra) => letra.toUpperCase()) }, kebab: { camel: str => str.replace(/-([a-z])/g, (_, letra) => letra.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. */ logDebug(message, forceMessage = false) { if (this.debugMode || forceMessage) console.log(`[WME Speed Display]: ${message}`); } /** * 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(this.spdTranslations.log.houseNumberCheckboxNotFound); 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.spdTranslations.name}">${this.spdTranslations.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. */ defineInitialSettings() { let localSettings = localStorage.getItem('wmeSpeedDisplaySettings'); localSettings = localSettings ? JSON.parse(localSettings) : null; this.settings = { spdEnabled: true, general: { spdShowNoSpeed: true, spdShowRoundabout: true, spdShowUnpaved: true, spdMaxZoom: 18 }, roads: {} }; 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); this.updateSettingsElementsStates(); } } /** * Checks if the plugin version changed and displays the changelog if necessary. */ checkVersionAndShowChangelog() { this.logDebug(this.spdTranslations.log.checkingVersion); let localSpdVersion = JSON.parse(localStorage.getItem('wmeSpeedDisplayVersion')); if (localSpdVersion == null || localSpdVersion != this.version) { this.hideSpeedDisplayDialog(); this.openChangelogDialog(); localStorage.setItem('wmeSpeedDisplayVersion', JSON.stringify(this.version)); } } /** * Opens changelog dialog. */ openChangelogDialog() { this.showSpeedDisplayDialog(`${this.spdTranslations.changelog} ${this.spdTranslations.name} v${this.version}`, this.spdTranslations.changelogMessage, null, `<a href="https://gf.qytechs.cn/pt-BR/scripts/526702-wme-speed-display" target="_blank"><wz-button color="primary">${this.spdTranslations.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.spdTranslations.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(); } /** * Sets translations for the current locale. */ defineTranslations() { switch (I18n.locale) { case 'af': // Afrikaans this.spdTranslations = { name: 'Spoedvertoning', settingTabName: 'Spoedvertoning Instellings', enabled: 'geaktiveer', disabled: 'gedeaktiveer', zoomOut: 'Verder uit', zoomIn: 'Nader in', changelog: 'Verandering logboek', changelogMessage: '<h6>Nuutjies:</h6><ul style="margin-bottom: 10px"><li>Die spoed-ikoon word nou in die regte rigting vir elke baan vertoon, en volg die hoek van die middelpunt van elke segment perpendikulêr.</li></ul><h6>Regstellings:</h6><ul><li>Klein regstellings en verbetering van kode.</li></ul>', close: 'Maak toe', viewScript: 'Bekyk Skrip', showDialog: 'Wys modaal', title: { general: 'Algemeen', showOnRoadType: 'Vertoon op padsegmente van tipe:' }, label: { displaySpeeds: 'Vertoon spoed', showNoSpeed: 'Vertoon op segmente sonder spoed', showOnRoundabout: 'Vertoon op sirkelroetes', showOnUnpaved: 'Vertoon op ongeplaveide pad', maxZoom: 'Vertoon tot zoomvlak:', toggleLayerShortcut: 'Toggle layer switcher speed display' }, btn: { updateSettingsTab: 'Opdateer menu', }, log: { wmeReadyStartScript: 'WME gelaai en gereed. Begin skrip...', waitingWme: 'Wag vir WME om gereed te wees...', wmeReadyStartingPlugin: 'WME is gereed. Stel pasgemaakte laag op...', shortSleep: 'Wag ongeveer 1 sekonde vir alles om te laai...', updateMapDisplay: 'Opdateer kaartvertoning...', maxZoomExceeded: 'Maksimum zoomvlak oorskry. Geen spoed sal vertoon word nie.', noneSegment: 'Geen segmente gevind nie.', numSegmentsLoaded: 'Totale gelaaide segmente:', attributesNotFound: 'Kon nie eienskappe vind of dit is afwesig op die segment nie', disallowedSegment: 'Hierdie tipe segment moet nie gelaai word nie.', invalidGeometry: 'Ongeldige geometrie op segment:', updateMapDisplayFinished: 'Opdatering voltooi.', shortCutDialogNotFound: 'Kon nie die sleutelbordkortpaaie dialoog vind nie. Probeer weer...', houseNumberCheckboxNotFound: 'Die "Huisnommers"-merkblokkie is nie gevind nie. Probeer weer...', scriptsTabNotFound: 'Skrip-paneel nie gevind nie. Probeer weer...', settingsTabAdded: 'Instellings-oortjie bygevoeg.', speedLayer: 'Spoedlaag', opacityUpdated: 'Deursigtigheid van ikone aangepas na', updatingSettingsTab: 'Opdateer instellings-oortjie...', languageDefined: 'Tale gedefinieer.', checkingVersion: 'Kontroleer die weergawe van die inprop.', insufficientGeometryAngleCalc: 'Onvoldoende geometrie vir hoekberekening.' } }; break; case 'ar': // Arabic this.spdTranslations = { name: 'عرض السرعة', settingTabName: 'إعدادات عرض السرعة', enabled: 'مفعل', disabled: 'معطل', zoomOut: 'تكبير للخارج', zoomIn: 'تكبير للداخل', changelog: 'سجل التغييرات', changelogMessage: '<h6>التحديثات:</h6><ul style="margin-bottom: 10px"><li>تم الآن عرض أيقونة السرعة في الاتجاه الصحيح لكل مسار، وتواكب الزاوية العمودية لنقطة المنتصف لكل جزء.</li></ul><h6>الإصلاحات:</h6><ul><li>تصحيحات وتحسينات صغيرة في الشيفرة.</li></ul>', close: 'إغلاق', viewScript: 'عرض البرنامج النصي', showDialog: 'عرض النافذة المنبثقة', title: { general: 'عام', showOnRoadType: 'عرض على أنواع الطرق:' }, label: { displaySpeeds: 'عرض السرعات', showNoSpeed: 'عرض على الطرق بدون سرعة', showOnRoundabout: 'عرض في الدوارات', showOnUnpaved: 'عرض على طريق غير معبد', maxZoom: 'العرض حتى مستوى التكبير:', toggleLayerShortcut: 'تبديل مبدل الطبقة لعرض السرعة' }, btn: { updateSettingsTab: 'تحديث القائمة', }, log: { wmeReadyStartScript: 'تم تحميل WME وجاهز. بدء السكريبت...', waitingWme: 'انتظار جاهزية WME...', wmeReadyStartingPlugin: 'WME جاهز. إعداد الطبقة المخصصة...', shortSleep: 'انتظار ثانية واحدة لتحميل كل شيء...', updateMapDisplay: 'تحديث عرض الخريطة...', maxZoomExceeded: 'تم تجاوز الحد الأقصى للتكبير. لن يتم عرض أي سرعات.', noneSegment: 'لم يتم العثور على أي مقاطع.', numSegmentsLoaded: 'إجمالي المقاطع المحملة:', attributesNotFound: 'تعذر العثور على الخصائص أو أنها مفقودة في المقطع', disallowedSegment: 'هذا النوع من المقاطع لا يجب تحميله.', invalidGeometry: 'هندسة غير صالحة في المقطع:', updateMapDisplayFinished: 'اكتمل التحديث.', houseNumberCheckboxNotFound: 'لم يتم العثور على خانة اختيار "أرقام المنازل". المحاولة مرة أخرى...', shortCutDialogNotFound: 'تعذر العثور على مربع حوار اختصارات لوحة المفاتيح. جارٍ المحاولة مرة أخرى...', scriptsTabNotFound: 'لم يتم العثور على لوحة البرامج النصية. المحاولة مرة أخرى...', settingsTabAdded: 'تمت إضافة علامة تبويب الإعدادات.', speedLayer: 'طبقة السرعة', opacityUpdated: 'تم ضبط شفافية الأيقونات إلى', updatingSettingsTab: 'تحديث علامة تبويب الإعدادات...', languageDefined: 'تم تحديد اللغات.', checkingVersion: 'التحقق من إصدار الإضافة.', insufficientGeometryAngleCalc: 'الهندسة غير كافية لحساب الزاوية.' } }; break; case 'bg': // Bulgarian this.spdTranslations = { name: 'Показване на скоростта', settingTabName: 'Настройки за показване на скоростта', enabled: 'активиран', disabled: 'деактивиран', zoomOut: 'Отдалечаване', zoomIn: 'Приближаване', changelog: 'Дневник на промените', changelogMessage: '<h6>Новини:</h6><ul style="margin-bottom: 10px"><li>Иконата за скорост вече се показва в правилната посока за всяка лента и съответства на ъгъла на средната точка на всеки сегмент.</li></ul><h6>Корекции:</h6><ul><li>Малки корекции и подобрения в кода.</li></ul>', close: 'Затвори', viewScript: 'Преглед на скрипта', showDialog: 'Показване на модален прозорец', title: { general: 'Общи', showOnRoadType: 'Показване на пътните сегменти от тип:' }, label: { displaySpeeds: 'Показване на скоростите', showNoSpeed: 'Показване на сегменти без скорост', showOnRoundabout: 'Показване на кръгови движения', showOnUnpaved: 'Показване на неасфалтиран път', maxZoom: 'Показване до ниво на увеличение:', toggleLayerShortcut: 'Превключване на превключвателя на слоя за показване на скорост' }, btn: { updateSettingsTab: 'Актуализиране на менюто', }, log: { wmeReadyStartScript: 'WME е зареден и готов. Стартиране на скрипта...', waitingWme: 'Изчакване WME да бъде готов...', wmeReadyStartingPlugin: 'WME е готов. Настройване на персонализиран слой...', shortSleep: 'Изчакване около 1 секунда за зареждане на всичко...', updateMapDisplay: 'Актуализиране на картата...', maxZoomExceeded: 'Превишено максимално увеличение. Няма да се показват скорости.', noneSegment: 'Не са намерени сегменти.', numSegmentsLoaded: 'Общ брой заредени сегменти:', attributesNotFound: 'Неуспешно намиране на атрибутите или те липсват в сегмента', disallowedSegment: 'Този тип сегмент не трябва да се зарежда.', invalidGeometry: 'Невалидна геометрия в сегмента:', updateMapDisplayFinished: 'Актуализацията е завършена.', shortCutDialogNotFound: 'Не можа да се намери диалоговият прозорец за бързи клавиши. Повторен опит...', houseNumberCheckboxNotFound: 'Не е намерена отметката „Номера на къщи“. Повторен опит...', scriptsTabNotFound: 'Не е намерен панел със скриптове. Повторен опит...', settingsTabAdded: 'Добавен е раздел с настройки.', speedLayer: 'Слой за скорост', opacityUpdated: 'Прозрачността на иконите е настроена на', updatingSettingsTab: 'Актуализиране на раздела с настройки...', languageDefined: 'Определени езици.', checkingVersion: 'Проверка на версията на приставката.', insufficientGeometryAngleCalc: 'Недостатъчна геометрия за изчисление на ъгъла.' } }; break; case 'ca': // Catalan this.spdTranslations = { name: 'Visualització de velocitat', settingTabName: 'Configuració de la visualització de velocitat', enabled: 'activat', disabled: 'desactivat', zoomOut: 'Allunyar', zoomIn: 'Apropar', changelog: 'Registre de canvis', changelogMessage: '<h6>Novetats:</h6><ul style="margin-bottom: 10px"><li>Ara la icona de velocitat es mostra en la direcció correcta de cada sentit i segueix l\'angle perpendicular al punt mitjà de cada segment.</li></ul><h6>Corregits:</h6><ul><li>Petites correccions i millores de codi.</li></ul>', close: 'Tancar', viewScript: 'Veure l\'script', showDialog: 'Mostra el modal', title: { general: 'General', showOnRoadType: 'Mostrar en segments de tipus:' }, label: { displaySpeeds: 'Mostrar velocitats', showNoSpeed: 'Mostrar en segments sense velocitat', showOnRoundabout: 'Mostrar en rotondes', showOnUnpaved: 'Mostrar en carretera no pavimentada', maxZoom: 'Renderitzar fins al zoom:', toggleLayerShortcut: 'Alterna l\'interruptor de capa per mostrar la velocitat' }, btn: { updateSettingsTab: 'Actualitzar menú', }, log: { wmeReadyStartScript: 'WME carregat i llest. Iniciant script...', waitingWme: 'Esperant que el WME estigui llest...', wmeReadyStartingPlugin: 'WME llest. Configurant capa personalitzada...', shortSleep: 'Esperant 1 segon perquè tot es carregui...', updateMapDisplay: 'Actualitzant la visualització del mapa...', maxZoomExceeded: 'Zoom màxim excedit. No es mostrarà cap velocitat.', noneSegment: 'No s’han trobat segments.', numSegmentsLoaded: 'Total de segments carregats:', attributesNotFound: 'No s’han pogut trobar els atributs o estan absents en el segment', disallowedSegment: 'Aquest tipus de segment no s’ha de carregar.', invalidGeometry: 'Geometria no vàlida en el segment:', updateMapDisplayFinished: 'Actualització completada.', shortCutDialogNotFound: 'No s’ha pogut trobar el diàleg de dreceres del teclat. Intentant-ho de nou...', houseNumberCheckboxNotFound: 'No s’ha trobat la casella de selecció "Números de casa". Tornant a intentar...', scriptsTabNotFound: 'No s’ha trobat el panell de scripts. Tornant a intentar...', settingsTabAdded: 'S’ha afegit la pestanya de configuració.', speedLayer: 'Capa de velocitat', opacityUpdated: 'Opacitat de les icones ajustada a', updatingSettingsTab: 'Actualitzant la pestanya de configuració...', languageDefined: 'Idiomes definits.', checkingVersion: 'Comprovant la versió del complement.', insufficientGeometryAngleCalc: 'Geometria insuficient per al càlcul de l\'angle.' } }; break; case 'cs': // Czech this.spdTranslations = { name: 'Zobrazení rychlosti', settingTabName: 'Nastavení zobrazení rychlosti', enabled: 'povolené', disabled: 'zakázané', zoomOut: 'Oddálit', zoomIn: 'Přiblížit', changelog: 'Seznam změn', changelogMessage: '<h6>Novinky:</h6><ul style="margin-bottom: 10px"><li>Ikona rychlosti je nyní zobrazena ve správném směru pro každou jízdní dráhu a odpovídá úhlu středového bodu každého segmentu kolmo.</li></ul><h6>Opravy:</h6><ul><li>Malé opravy a vylepšení kódu.</li></ul>', close: 'Zavřít', viewScript: 'Zobrazit skript', showDialog: 'Zobrazit dialog', title: { general: 'Obecné', showOnRoadType: 'Zobrazit na segmentech typu:' }, 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ž do úrovně zoomu:', toggleLayerShortcut: 'Přepnout přepínač vrstvy pro zobrazení rychlosti' }, btn: { updateSettingsTab: 'Aktualizovat menu', }, log: { wmeReadyStartScript: 'WME načteno a připraveno. Spouštím skript...', waitingWme: 'Čekám, až bude WME připraveno...', wmeReadyStartingPlugin: 'WME je připraveno. Nastavuji vlastní vrstvu...', shortSleep: 'Čekám asi 1 sekundu, než se vše načte...', updateMapDisplay: 'Aktualizuji zobrazení na mapě...', maxZoomExceeded: 'Byl překročen maximální zoom. Rychlost nebude zobrazena.', noneSegment: 'Žádné segmenty nebyly nalezeny.', numSegmentsLoaded: 'Celkový počet načtených segmentů:', attributesNotFound: 'Nelze najít atributy nebo chybí v segmentu', disallowedSegment: 'Tento typ segmentu by neměl být načten.', invalidGeometry: 'Neplatná geometrie v segmentu:', updateMapDisplayFinished: 'Aktualizace dokončena.', shortCutDialogNotFound: 'Nepodařilo se najít dialog klávesových zkratek. Zkouším znovu...', houseNumberCheckboxNotFound: 'Checkbox "Čísla domů" nebyl nalezen. Pokouším se znovu...', scriptsTabNotFound: 'Záložka skriptů nebyla nalezena. Pokouším se znovu...', settingsTabAdded: 'Přidána karta nastavení.', speedLayer: 'Vrstva rychlosti', opacityUpdated: 'Průhlednost ikon byla nastavena na', updatingSettingsTab: 'Aktualizuji záložku nastavení...', languageDefined: 'Jazyky definovány.', checkingVersion: 'Kontroluji verzi pluginu.', insufficientGeometryAngleCalc: 'Nedostatečná geometrie pro výpočet úhlu.' } }; break; case 'da': // Danish this.spdTranslations = { name: 'Hastighedsvisning', settingTabName: 'Indstillinger for hastighedsvisning', enabled: 'aktiveret', disabled: 'deaktiveret', zoomOut: 'Zoom ud', zoomIn: 'Zoom ind', changelog: 'Ændringslog', changelogMessage: '<h6>Nyheder:</h6><ul style="margin-bottom: 10px"><li>Nu vises hastighedsikonet i den korrekte retning for hver bane og følger vinkelret på midtpunktets vinkel for hvert segment.</li></ul><h6>Retter:</h6><ul><li>Små rettelser og forbedringer af koden.</li></ul>', close: 'Luk', viewScript: 'Vis skript', showDialog: 'Vis dialog', title: { general: 'Generelt', showOnRoadType: 'Vis på vejsegmenter af typen:' }, label: { displaySpeeds: 'Vis hastigheder', showNoSpeed: 'Vis på segmenter uden hastighed', showOnRoundabout: 'Vis på rundkørsler', showOnUnpaved: 'Vis på ujævn vej', maxZoom: 'Render til zoom-niveau:', toggleLayerShortcut: 'Skift lagvægtsveksel til hastighedsvisning' }, btn: { updateSettingsTab: 'Opdater menu', }, log: { wmeReadyStartScript: 'WME indlæst og klar. Starter script...', waitingWme: 'Venter på, at WME er klar...', wmeReadyStartingPlugin: 'WME er klar. Konfigurerer tilpasset lag...', shortSleep: 'Venter ca. 1 sekund på, at alt indlæses...', updateMapDisplay: 'Opdaterer kortvisning...', maxZoomExceeded: 'Maksimum zoom overskredet. Ingen hastigheder vil blive vist.', noneSegment: 'Ingen segmenter fundet.', numSegmentsLoaded: 'Samlet antal indlæste segmenter:', attributesNotFound: 'Kunne ikke finde attributterne eller de mangler i segmentet', disallowedSegment: 'Denne type segment bør ikke indlæses.', invalidGeometry: 'Ugyldig geometri i segment:', updateMapDisplayFinished: 'Opdatering fuldført.', shortCutDialogNotFound: 'Kunne ikke finde tastaturgenvejsdialogen. Prøver igen...', houseNumberCheckboxNotFound: 'Checkboxen "Husnumre" blev ikke fundet. Prøver igen...', scriptsTabNotFound: 'Script-panelet blev ikke fundet. Prøver igen...', settingsTabAdded: 'Indstillingsfanen tilføjet.', speedLayer: 'Hastighedslag', opacityUpdated: 'Ikonernes gennemsigtighed justeret til', updatingSettingsTab: 'Opdaterer indstillingsfanen...', languageDefined: 'Sprog defineret.', checkingVersion: 'Kontrollerer plugin-versionen.', insufficientGeometryAngleCalc: 'Utilstrækkelig geometri til vinkelberegning.' } }; break; case 'de': // German this.spdTranslations = { name: 'Geschwindigkeitsanzeige', settingTabName: 'Einstellungen für Geschwindigkeitsanzeige', enabled: 'aktiviert', disabled: 'deaktiviert', zoomOut: 'Herauszoomen', zoomIn: 'Hineinzoomen', changelog: 'Änderungsprotokoll', changelogMessage: '<h6>Neuigkeiten:</h6><ul style="margin-bottom: 10px"><li>Das Geschwindigkeitssymbol wird nun in die richtige Richtung für jede Spur angezeigt und folgt im rechten Winkel zum Winkel des Mittelpunkts jedes Segments.</li></ul><h6>Fehlerbehebungen:</h6><ul><li>Kleine Fehlerbehebungen und Verbesserungen des Codes.</li></ul>', close: 'Schließen', viewScript: 'Skript anzeigen', showDialog: 'Dialog anzeigen', title: { general: 'Allgemein', showOnRoadType: 'Anzeigen für Straßentypen:' }, label: { displaySpeeds: 'Geschwindigkeiten anzeigen', showNoSpeed: 'Bei Segmenten ohne Geschwindigkeit anzeigen', showOnRoundabout: 'Bei Kreisverkehren anzeigen', showOnUnpaved: 'Auf unbefestigter Straße anzeigen', maxZoom: 'Rendern bis Zoomstufe:', toggleLayerShortcut: 'Schalte Layer-Schalter für Geschwindigkeitsanzeige um' }, btn: { updateSettingsTab: 'Menü aktualisieren', }, log: { wmeReadyStartScript: 'WME geladen und bereit. Starte Skript...', waitingWme: 'Warten auf WME, um bereit zu sein...', wmeReadyStartingPlugin: 'WME ist bereit. Benutzerdefinierte Ebene wird konfiguriert...', shortSleep: 'Warte ca. 1 Sekunde, damit alles geladen wird...', updateMapDisplay: 'Kartenanzeige wird aktualisiert...', maxZoomExceeded: 'Maximale Zoomstufe überschritten. Keine Geschwindigkeiten werden angezeigt.', noneSegment: 'Keine Segmente gefunden.', numSegmentsLoaded: 'Gesamtzahl der geladenen Segmente:', attributesNotFound: 'Attribute konnten nicht gefunden werden oder fehlen im Segment', disallowedSegment: 'Dieser Segmenttyp sollte nicht geladen werden.', invalidGeometry: 'Ungültige Geometrie im Segment:', updateMapDisplayFinished: 'Aktualisierung abgeschlossen.', shortCutDialogNotFound: 'Das Tastenkürzel-Dialogfeld konnte nicht gefunden werden. Erneuter Versuch...', houseNumberCheckboxNotFound: 'Checkbox "Hausnummern" nicht gefunden. Erneuter Versuch...', scriptsTabNotFound: 'Skript-Panel nicht gefunden. Erneuter Versuch...', settingsTabAdded: 'Einstellungs-Tab hinzugefügt.', speedLayer: 'Geschwindigkeits-Ebene', opacityUpdated: 'Symboltransparenz angepasst auf', updatingSettingsTab: 'Einstellungs-Tab wird aktualisiert...', languageDefined: 'Sprachen definiert.', checkingVersion: 'Überprüfe Plugin-Version.', insufficientGeometryAngleCalc: 'Unzureichende Geometrie für die Winkelberechnung.' } }; break; case 'el': // Greek this.spdTranslations = { name: 'Εμφάνιση Ταχύτητας', settingTabName: 'Ρυθμίσεις Εμφάνισης Ταχύτητας', enabled: 'ενεργοποιημένο', disabled: 'απενεργοποιημένο', zoomOut: 'Απομάκρυνση', zoomIn: 'Εστίαση', changelog: 'Αρχείο αλλαγών', changelogMessage: '<h6>Νέα:</h6><ul style="margin-bottom: 10px"><li>Το εικονίδιο ταχύτητας εμφανίζεται τώρα στην σωστή κατεύθυνση για κάθε λωρίδα και ακολουθεί την κάθετη γωνία του μέσου σημείου κάθε τμήματος.</li></ul><h6>Διορθώσεις:</h6><ul><li>Μικρές διορθώσεις και βελτιώσεις του κώδικα.</li></ul>', close: 'Κλείσιμο', viewScript: 'Προβολή σεναρίου', showDialog: 'Εμφάνιση διαλόγου', title: { general: 'Γενικά', showOnRoadType: 'Εμφάνιση σε τύπους δρόμων:' }, label: { displaySpeeds: 'Εμφάνιση ταχυτήτων', showNoSpeed: 'Εμφάνιση σε τμήματα χωρίς ταχύτητα', showOnRoundabout: 'Εμφάνιση σε κυκλικούς κόμβους', showOnUnpaved: 'Εμφάνιση σε μη ασφαλτοστρωμένο δρόμο', maxZoom: 'Απεικόνιση έως μεγέθυνση:', toggleLayerShortcut: 'Εναλλαγή διακόπτη επιπέδου εμφάνισης ταχύτητας' }, btn: { updateSettingsTab: 'Ενημέρωση μενού', }, log: { wmeReadyStartScript: 'Το WME φορτώθηκε και είναι έτοιμο. Εκκίνηση σεναρίου...', waitingWme: 'Αναμονή για το WME να είναι έτοιμο...', wmeReadyStartingPlugin: 'Το WME είναι έτοιμο. Διαμόρφωση προσαρμοσμένου επιπέδου...', shortSleep: 'Αναμονή περίπου 1 δευτερόλεπτο για να φορτώσουν όλα...', updateMapDisplay: 'Ενημέρωση εμφάνισης χάρτη...', maxZoomExceeded: 'Υπέρβαση μέγιστης μεγέθυνσης. Δεν θα εμφανίζονται ταχύτητες.', noneSegment: 'Δεν βρέθηκαν τμήματα.', numSegmentsLoaded: 'Σύνολο φορτωμένων τμημάτων:', attributesNotFound: 'Δεν βρέθηκαν ή λείπουν τα χαρακτηριστικά στο τμήμα', disallowedSegment: 'Αυτός ο τύπος τμήματος δεν πρέπει να φορτωθεί.', invalidGeometry: 'Μη έγκυρη γεωμετρία στο τμήμα:', updateMapDisplayFinished: 'Η ενημέρωση ολοκληρώθηκε.', shortCutDialogNotFound: 'Δεν ήταν δυνατή η εύρεση του διαλόγου συντομεύσεων πληκτρολογίου. Προσπάθεια ξανά...', houseNumberCheckboxNotFound: 'Το πλαίσιο επιλογής "Αριθμοί σπιτιών" δεν βρέθηκε. Προσπάθεια ξανά...', scriptsTabNotFound: 'Ο πίνακας σεναρίων δεν βρέθηκε. Προσπάθεια ξανά...', settingsTabAdded: 'Προστέθηκε καρτέλα ρυθμίσεων.', speedLayer: 'Επίπεδο ταχύτητας', opacityUpdated: 'Η αδιαφάνεια των εικονιδίων ρυθμίστηκε σε', updatingSettingsTab: 'Ενημέρωση καρτέλας ρυθμίσεων...', languageDefined: 'Ορισμένες γλώσσες.', checkingVersion: 'Έλεγχος έκδοσης προσθέτου.', insufficientGeometryAngleCalc: 'Ανεπαρκής γεωμετρία για τον υπολογισμό της γωνίας.' } }; break; case 'en-AU': // English (Australia) this.spdTranslations = { name: 'Speed Display', settingTabName: 'Speed Display Settings', enabled: 'enabled', disabled: 'disabled', zoomOut: 'Zoom out', zoomIn: 'Zoom in', changelog: 'Changelog', changelogMessage: '<h6>New features:</h6><ul style="margin-bottom: 10px"><li>The speed icon is now displayed in the correct direction for each lane, and follows the perpendicular angle of the midpoint of each segment.</li></ul><h6>Fixes:</h6><ul><li>Minor code fixes and improvements.</li></ul>', close: 'Close', viewScript: 'View script', showDialog: 'Show dialog', title: { general: 'General', showOnRoadType: 'Show on road types:' }, label: { displaySpeeds: 'Display speeds', showNoSpeed: 'Show on segments without speed', showOnRoundabout: 'Show on roundabouts', showOnUnpaved: 'Show on unpaved road', maxZoom: 'Render up to zoom level:', toggleLayerShortcut: 'Toggle layer switcher speed display' }, btn: { updateSettingsTab: 'Update menu', }, log: { wmeReadyStartScript: 'WME loaded and ready. Starting script...', waitingWme: 'Waiting for WME to be ready...', wmeReadyStartingPlugin: 'WME is ready. Setting up custom layer...', shortSleep: 'Waiting about 1 second for everything to load...', updateMapDisplay: 'Updating map display...', maxZoomExceeded: 'Maximum zoom exceeded. No speeds will be displayed.', noneSegment: 'No segments found.', numSegmentsLoaded: 'Total segments loaded:', attributesNotFound: 'Could not find attributes or they are missing in the segment', disallowedSegment: 'This segment type should not be loaded.', invalidGeometry: 'Invalid geometry in segment:', updateMapDisplayFinished: 'Update complete.', shortCutDialogNotFound: 'Could not find the keyboard shortcuts dialogue. Trying again...', houseNumberCheckboxNotFound: '"House Numbers" checkbox not found. Retrying...', scriptsTabNotFound: 'Scripts panel not found. Retrying...', settingsTabAdded: 'Settings tab added.', speedLayer: 'Speed layer', opacityUpdated: 'Icon opacity adjusted to', updatingSettingsTab: 'Updating settings tab...', languageDefined: 'Languages defined.', checkingVersion: 'Checking plugin version.', insufficientGeometryAngleCalc: 'Insufficient geometry for angle calculation.' } }; break; case 'en-GB': // English (UK) this.spdTranslations = { name: 'Speed Display', settingTabName: 'Speed Display Settings', enabled: 'enabled', disabled: 'disabled', zoomOut: 'Zoom out', zoomIn: 'Zoom in', changelog: 'Changelog', changelogMessage: '<h6>New features:</h6><ul style="margin-bottom: 10px"><li>The speed icon is now displayed in the correct direction for each lane, and follows the perpendicular angle of the midpoint of each segment.</li></ul><h6>Fixes:</h6><ul><li>Minor code fixes and improvements.</li></ul>', close: 'Close', viewScript: 'View script', showDialog: 'Show dialog', title: { general: 'General', showOnRoadType: 'Show on road types:' }, label: { displaySpeeds: 'Display speeds', showNoSpeed: 'Show on segments without speed', showOnRoundabout: 'Show on roundabouts', showOnUnpaved: 'Show on unpaved road', maxZoom: 'Render up to zoom level:', toggleLayerShortcut: 'Toggle layer switcher speed display' }, btn: { updateSettingsTab: 'Update menu', }, log: { wmeReadyStartScript: 'WME loaded and ready. Starting script...', waitingWme: 'Waiting for WME to be ready...', wmeReadyStartingPlugin: 'WME is ready. Setting up custom layer...', shortSleep: 'Waiting about 1 second for everything to load...', updateMapDisplay: 'Updating map display...', maxZoomExceeded: 'Maximum zoom exceeded. No speeds will be displayed.', noneSegment: 'No segments found.', numSegmentsLoaded: 'Total segments loaded:', attributesNotFound: 'Could not find attributes or they are missing in the segment', disallowedSegment: 'This segment type should not be loaded.', invalidGeometry: 'Invalid geometry in segment:', updateMapDisplayFinished: 'Update complete.', shortCutDialogNotFound: 'Could not find the keyboard shortcuts dialogue. Trying again...', houseNumberCheckboxNotFound: '"House Numbers" checkbox not found. Retrying...', scriptsTabNotFound: 'Scripts panel not found. Retrying...', settingsTabAdded: 'Settings tab added.', speedLayer: 'Speed layer', opacityUpdated: 'Icon opacity adjusted to', updatingSettingsTab: 'Updating settings tab...', languageDefined: 'Languages defined.', checkingVersion: 'Checking plugin version.', insufficientGeometryAngleCalc: 'Insufficient geometry for angle calculation.' } }; break; case 'en-US': // US English this.spdTranslations = { name: 'Speed Display', settingTabName: 'Speed Display Settings', enabled: 'enabled', disabled: 'disabled', zoomOut: 'Zoom out', zoomIn: 'Zoom in', changelog: 'Changelog', changelogMessage: '<h6>New features:</h6><ul style="margin-bottom: 10px"><li>The speed icon is now displayed in the correct direction for each lane, and follows the perpendicular angle of the midpoint of each segment.</li></ul><h6>Fixes:</h6><ul><li>Minor code fixes and improvements.</li></ul>', close: 'Close', viewScript: 'View script', showDialog: 'Show dialog', title: { general: 'General', showOnRoadType: 'Show on road types:' }, label: { displaySpeeds: 'Display speeds', showNoSpeed: 'Show on segments without speed', showOnRoundabout: 'Show on roundabouts', showOnUnpaved: 'Show on unpaved road', maxZoom: 'Render up to zoom level:', toggleLayerShortcut: 'Toggle layer switcher speed display' }, btn: { updateSettingsTab: 'Update menu', }, log: { wmeReadyStartScript: 'WME loaded and ready. Starting script...', waitingWme: 'Waiting for WME to be ready...', wmeReadyStartingPlugin: 'WME is ready. Setting up custom layer...', shortSleep: 'Waiting about 1 second for everything to load...', updateMapDisplay: 'Updating map display...', maxZoomExceeded: 'Maximum zoom exceeded. No speeds will be displayed.', noneSegment: 'No segments found.', numSegmentsLoaded: 'Total segments loaded:', attributesNotFound: 'Could not find attributes or they are missing in the segment', disallowedSegment: 'This segment type should not be loaded.', invalidGeometry: 'Invalid geometry in segment:', updateMapDisplayFinished: 'Update complete.', shortCutDialogNotFound: 'Could not find the keyboard shortcuts dialog. Trying again...', houseNumberCheckboxNotFound: '"House Numbers" checkbox not found. Retrying...', scriptsTabNotFound: 'Scripts panel not found. Retrying...', settingsTabAdded: 'Settings tab added.', speedLayer: 'Speed layer', opacityUpdated: 'Icon opacity adjusted to', updatingSettingsTab: 'Updating settings tab...', languageDefined: 'Languages defined.', checkingVersion: 'Checking plugin version.', insufficientGeometryAngleCalc: 'Insufficient geometry for angle calculation.' } }; break; case 'es': // Spanish this.spdTranslations = { name: 'Mostrar Velocidad', settingTabName: 'Configuración de Mostrar Velocidad', enabled: 'habilitado', disabled: 'deshabilitado', zoomOut: 'Alejar', zoomIn: 'Acercar', changelog: 'Registro de Cambios', changelogMessage: '<h6>Novedades:</h6><ul style="margin-bottom: 10px"><li>Ahora el ícono de velocidad se muestra en la dirección correcta de cada carril, y sigue el ángulo perpendicular del punto medio de cada segmento.</li></ul><h6>Correciones:</h6><ul><li>Pequeñas correcciones y mejoras en el código.</li></ul>', close: 'Cerrar', viewScript: 'Ver script', showDialog: 'Mostrar diálogo', title: { general: 'General', showOnRoadType: 'Mostrar en los segmentos de tipo:' }, label: { displaySpeeds: 'Mostrar velocidades', showNoSpeed: 'Mostrar en segmentos sin velocidad', showOnRoundabout: 'Mostrar en rotonda', showOnUnpaved: 'Mostrar en vía no pavimentada', maxZoom: 'Renderizar hasta el zoom máximo:', toggleLayerShortcut: 'Alternar conmutador de capa para mostrar la velocidad' }, btn: { updateSettingsTab: 'Actualizar menú', }, log: { wmeReadyStartScript: 'WME cargado y listo. Iniciando script...', waitingWme: 'Esperando a que WME esté listo...', wmeReadyStartingPlugin: 'WME está listo. Configurando capa personalizada...', shortSleep: 'Esperando alrededor de 1 segundo para que todo cargue...', updateMapDisplay: 'Actualizando visualización en el mapa...', maxZoomExceeded: 'Zoom máximo excedido. No se mostrará la velocidad.', noneSegment: 'No se encontraron segmentos.', numSegmentsLoaded: 'Total de segmentos cargados:', attributesNotFound: 'No se encontraron los atributos o están ausentes en el segmento', disallowedSegment: 'Este tipo de segmento no debe cargarse.', invalidGeometry: 'Geometría inválida en el segmento:', updateMapDisplayFinished: 'Actualización completada.', shortCutDialogNotFound: 'No se pudo encontrar el cuadro de diálogo de accesos directos del teclado. Intentando de nuevo...', houseNumberCheckboxNotFound: 'No se encontró el checkbox "Números de Casas". Intentando de nuevo...', scriptsTabNotFound: 'No se encontró la pestaña de scripts. Intentando de nuevo...', settingsTabAdded: 'Pestaña de configuración agregada.', speedLayer: 'Capa de velocidad', opacityUpdated: 'Opacidad de los íconos ajustada a', updatingSettingsTab: 'Actualizando pestaña de configuración...', languageDefined: 'Idiomas definidos.', checkingVersion: 'Verificando la versión del plugin.', insufficientGeometryAngleCalc: 'Geometría insuficiente para calcular el ángulo.' } }; break; case 'es-419': // Latin-american spanish this.spdTranslations = { name: 'Mostrar Velocidad', settingTabName: 'Configuraciones de Mostrar Velocidad', enabled: 'habilitada', disabled: 'deshabilitada', zoomOut: 'Alejar', zoomIn: 'Acercar', changelog: 'Registro de cambios', changelogMessage: '<h6>Novedades:</h6><ul style="margin-bottom: 10px"><li>Ahora el ícono de velocidad se muestra en la dirección correcta de cada carril, y sigue el ángulo perpendicular del punto medio de cada segmento.</li></ul><h6>Correciones:</h6><ul><li>Pequeñas correcciones y mejoras en el código.</li></ul>', close: 'Cerrar', viewScript: 'Ver script', showDialog: 'Mostrar diálogo', title: { general: 'General', showOnRoadType: 'Mostrar en los segmentos del tipo:' }, label: { displaySpeeds: 'Mostrar velocidades', showNoSpeed: 'Mostrar en segmento sin velocidad', showOnRoundabout: 'Mostrar en rotonda', showOnUnpaved: 'Mostrar en vía no pavimentada', maxZoom: 'Renderizar hasta el nivel de zoom:', toggleLayerShortcut: 'Alternar conmutador de capa para mostrar la velocidad' }, btn: { updateSettingsTab: 'Actualizar menú', }, log: { wmeReadyStartScript: 'WME cargado y listo. Iniciando el script...', waitingWme: 'Esperando que WME esté listo...', wmeReadyStartingPlugin: 'WME está listo. Configurando la capa personalizada...', shortSleep: 'Esperando aproximadamente 1 segundo para que todo se cargue...', updateMapDisplay: 'Actualizando la visualización en el mapa...', maxZoomExceeded: 'Se ha excedido el zoom máximo. No se mostrará velocidad.', noneSegment: 'No se encontraron segmentos.', numSegmentsLoaded: 'Número total de segmentos cargados:', attributesNotFound: 'No se pudieron encontrar los atributos o están ausentes en el segmento', disallowedSegment: 'Este tipo de segmento no debe cargarse.', invalidGeometry: 'Geometría inválida en el segmento:', updateMapDisplayFinished: 'Actualización completada.', shortCutDialogNotFound: 'No se pudo encontrar el cuadro de diálogo de accesos directos del teclado. Intentando nuevamente...', houseNumberCheckboxNotFound: 'No se encontró el checkbox "Números de Casas". Intentando nuevamente...', scriptsTabNotFound: 'No se encontró la pestaña de scripts. Intentando nuevamente...', settingsTabAdded: 'Pestaña de configuraciones añadida.', speedLayer: 'Capa de velocidad', opacityUpdated: 'Opacidad de los íconos ajustada a', updatingSettingsTab: 'Actualizando la pestaña de configuraciones...', languageDefined: 'Idiomas definidos.', checkingVersion: 'Comprobando la versión del plugin.', insufficientGeometryAngleCalc: 'Vähemalt kaks koordinaati üheskoordinaati vahetega.' } }; break; case 'et': // Estonian this.spdTranslations = { name: 'Kiirus näidik', settingTabName: 'Kiirus näidiku seadistused', enabled: 'lubatud', disabled: 'keelatud', zoomOut: 'Kaugemalt', zoomIn: 'Lähemalt', changelog: 'Muudatuste logi', changelogMessage: '<h6>Uued funktsioonid:</h6><ul style="margin-bottom: 10px"><li>Kiirusikoon kuvatakse nüüd õiges suunas iga sõiduraja jaoks ja järgib iga segmendi keskpunkti risti nurka.</li></ul><h6>Parandused:</h6><ul><li>Väikesed parandused ja koodi täiustused.</li></ul>', close: 'Sulge', viewScript: 'Vaata skripti', showDialog: 'Näita dialoogi', title: { general: 'Üldine', showOnRoadType: 'Kuva järgmistes tee tüüpides:' }, label: { displaySpeeds: 'Kuva kiirus', showNoSpeed: 'Kuva kiiruseta segmentides', showOnRoundabout: 'Kuva ringristmikul', showOnUnpaved: 'Kuva sillutamata teel', maxZoom: 'Renderda kuni maksimaalse suumimiseni:', toggleLayerShortcut: 'Lülita kihivahetaja kiiruskuva' }, btn: { updateSettingsTab: 'Uuenda menüüd', }, log: { wmeReadyStartScript: 'WME on laaditud ja valmis. Skripti käivitamine...', waitingWme: 'Oodates, et WME oleks valmis...', wmeReadyStartingPlugin: 'WME on valmis. Kohandatud kihi seadistamine...', shortSleep: 'Oodates umbes 1 sekundit, et kõik laeks...', updateMapDisplay: 'Kaardi kuvamise uuendamine...', maxZoomExceeded: 'Maksimaalne suum ületatud. Kiirus ei kuvata.', noneSegment: 'Ühtegi segmenti ei leitud.', numSegmentsLoaded: 'Laaditud segmentide kogus:', attributesNotFound: 'Segmentidest ei leitud omadusi või need puuduvad', disallowedSegment: 'Seda tüüpi segment ei tohiks laadida.', invalidGeometry: 'Geomeetria on vigane segmentis:', updateMapDisplayFinished: 'Uuendamine lõppenud.', shortCutDialogNotFound: 'Klaviatuuri otseteede dialoogi ei leitud. Proovin uuesti...', houseNumberCheckboxNotFound: 'Maja numbri valikut ei leitud. Üritatakse uuesti...', scriptsTabNotFound: 'Skriptide vahelehte ei leitud. Üritatakse uuesti...', settingsTabAdded: 'Seadistuste vahekaart lisatud.', speedLayer: 'Kiiruskiht', opacityUpdated: 'Ikonide läbipaistvus on seatud: ', updatingSettingsTab: 'Seadistuste vahekaardi uuendamine...', languageDefined: 'Keel määratud.', checkingVersion: 'Kontrollin plugin-a versiooni.', insufficientGeometryAngleCalc: 'Vähemalt kaksi koordinaatide eristetikutta.' } }; break; case 'eu': // Basque this.spdTranslations = { name: 'Abiadura Bistaratzea', settingTabName: 'Abiadura Bistaratzeko Ezarpenak', enabled: 'gaituta', disabled: 'desgaituta', zoomOut: 'Urrundu', zoomIn: 'Zooma handitu', changelog: 'Aldaketa erregistroa', changelogMessage: '<h6>Albisteak:</h6><ul style="margin-bottom: 10px"><li>Oraino abiadura ikonoa norab da zehazki norabide bakoitzeko norabidea, eta segmentu bakoitzaren erdiko puntuko perpendikularko angelua jarraitzen du.</li></ul><h6>Hobetzeak:</h6><ul><li>Kodeko zuzenketa txikiak eta hobetzeak.</li></ul>', close: 'Itxi', viewScript: 'Ikusi script-a', showDialog: 'Irudiak erakutsi', title: { general: 'Orokorra', showOnRoadType: 'Erakutsi errepide mota hauetan:' }, label: { displaySpeeds: 'Abiadurak bistaratu', showNoSpeed: 'Abiadurarik gabeko segmentuetan erakutsi', showOnRoundabout: 'Biribilguneetan erakutsi', showOnUnpaved: 'Erakutsi asfaltatu gabeko bidean', maxZoom: 'Errendatu zoom maila honetara arte:', toggleLayerShortcut: 'Aldatu geruzako aldatzailea abiadura erakusteko' }, btn: { updateSettingsTab: 'Eguneratu menua', }, log: { wmeReadyStartScript: 'WME kargatuta eta prest. Script abiatzen...', waitingWme: 'WME prest egon arte itxaroten...', wmeReadyStartingPlugin: 'WME prest dago. Geruza pertsonalizatua ezartzen...', shortSleep: 'Segundu 1 inguru itxaroten elementu guztiak kargatzeko...', updateMapDisplay: 'Mapa bistaratzeko eguneratzen...', maxZoomExceeded: 'Gehienezko zooma gaindituta. Ez da abiadurarik bistaratuko.', noneSegment: 'Ez da segmenturik aurkitu.', numSegmentsLoaded: 'Guztira kargatutako segmentuak:', attributesNotFound: 'Ez dira atributuak aurkitu edo falta dira segmentuan', disallowedSegment: 'Segmentu mota hau ez da kargatu behar.', invalidGeometry: 'Geometria baliogabea segmentuan:', updateMapDisplayFinished: 'Eguneratzea osatua.', shortCutDialogNotFound: 'Ezin izan da teklatuko lasterbideen elkarrizketa-koadroa aurkitu. Berriro saiatzen...', houseNumberCheckboxNotFound: '"Etxe zenbakiak" kontrol-laukia ez da aurkitu. Berriro saiatzen...', scriptsTabNotFound: 'Script panelean ez da aurkitu. Berriro saiatzen...', settingsTabAdded: 'Ezarpenen fitxa gehituta.', speedLayer: 'Abiadura geruza', opacityUpdated: 'Ikonoen gardentasuna egokituta honela:', updatingSettingsTab: 'Ezarpen fitxa eguneratzen...', languageDefined: 'Hizkuntzak definituta.', checkingVersion: 'Pluginaren bertsioa egiaztatzen.', insufficientGeometryAngleCalc: 'Geometria ez da nahikoa angeluaren kalkulua egiteko.' } }; break; case 'fa-IR': // Persian (Iran) this.spdTranslations = { name: 'نمایش سرعت', settingTabName: 'تنظیمات نمایش سرعت', enabled: 'فعال', disabled: 'غیرفعال', zoomOut: 'بزرگنمایی کمتر', zoomIn: 'بزرگنمایی بیشتر', changelog: 'لیست تغییرات', changelogMessage: '<h6>ویژگیهای جدید:</h6><ul style="margin-bottom: 10px"><li>آیکون سرعت اکنون در جهت صحیح برای هر خط نمایش داده میشود و زاویه عمودی نقطه میانه هر بخش را دنبال میکند.</li></ul><h6>رفع اشکال:</h6><ul><li>اصلاحات و بهبودهای جزئی در کد.</li></ul>', close: 'بستن', viewScript: 'مشاهده اسکریپت', showDialog: 'نمایش مودال', title: { general: 'عمومی', showOnRoadType: 'نمایش در نوع جاده:' }, label: { displaySpeeds: 'نمایش سرعتها', showNoSpeed: 'نمایش در بخشهای بدون سرعت', showOnRoundabout: 'نمایش در میدانها', showOnUnpaved: 'نمایش در جاده خاکی', maxZoom: 'نمایش تا سطح بزرگنمایی:', toggleLayerShortcut: 'سوئیچ لایه نمایش سرعت' }, btn: { updateSettingsTab: 'بروزرسانی منو', }, log: { wmeReadyStartScript: 'WME بارگذاری شده و آماده است. شروع اسکریپت...', waitingWme: 'منتظر آماده شدن WME...', wmeReadyStartingPlugin: 'WME آماده است. پیکربندی لایه سفارشی...', shortSleep: 'منتظر حدود 1 ثانیه برای بارگذاری کامل...', updateMapDisplay: 'بروزرسانی نمایش نقشه...', maxZoomExceeded: 'بزرگنمایی حداکثر فراتر رفته است. هیچ سرعتی نمایش داده نمیشود.', noneSegment: 'هیچ بخشی یافت نشد.', numSegmentsLoaded: 'تعداد بخشهای بارگذاری شده:', attributesNotFound: 'ویژگیها یافت نشدند یا در بخش وجود ندارند', disallowedSegment: 'این نوع بخش نباید بارگذاری شود.', invalidGeometry: 'هندسه نامعتبر در بخش:', updateMapDisplayFinished: 'بروزرسانی کامل شد.', shortCutDialogNotFound: 'گفتگوی میانبرهای صفحه کلید یافت نشد. در حال تلاش مجدد...', houseNumberCheckboxNotFound: 'چکباکس "شماره خانه" یافت نشد. تلاش مجدد...', scriptsTabNotFound: 'پنل اسکریپت یافت نشد. تلاش مجدد...', settingsTabAdded: 'زبانه تنظیمات اضافه شد.', speedLayer: 'لایه سرعت', opacityUpdated: 'شفافیت آیکونها تنظیم شد به', updatingSettingsTab: 'در حال بروزرسانی زبانه تنظیمات...', languageDefined: 'زبانها تعیین شد.', checkingVersion: 'در حال بررسی نسخه پلاگین.', insufficientGeometryAngleCalc: 'هندسه کافی برای محاسبه زاویه وجود ندارد.' } }; break; case 'fi': // Finnish this.spdTranslations = { name: 'Nopeuden näyttö', settingTabName: 'Nopeuden näyttöasetukset', enabled: 'käytössä', disabled: 'poistettu käytöstä', zoomOut: 'Loitontaa', zoomIn: 'Lähentää', changelog: 'Muutosloki', changelogMessage: '<h6>Uudet ominaisuudet:</h6><ul style="margin-bottom: 10px"><li>Nopeuskuvake näytetään nyt oikeassa suunnassa jokaiselle kaistalle ja seuraa jokaisen segmentin keskikohdan kohtisuoraa kulmaa.</li></ul><h6>Korjaukset:</h6><ul><li>Pieniä koodikorjauksia ja parannuksia.</li></ul>', close: 'Sulje', viewScript: 'Avaa skripti', showDialog: 'Avaa ikkuna', title: { general: 'Yleinen', showOnRoadType: 'Näytä tyypin segmenttien kohdalla:' }, 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 enintään zoom-tasolle:', toggleLayerShortcut: 'Vaihda kerroksen kytkintä nopeusnäytöllä' }, btn: { updateSettingsTab: 'Päivitä valikko', }, log: { wmeReadyStartScript: 'WME ladattu ja valmis. Käynnistetään skripti...', waitingWme: 'Odotetaan, että WME on valmis...', wmeReadyStartingPlugin: 'WME on valmis. Asetetaan mukautettua kerrosta...', shortSleep: 'Odota noin 1 sekunti ennen kuin kaikki latautuu...', updateMapDisplay: 'Päivitetään näyttö kartalla...', maxZoomExceeded: 'Maksimi zoomaus ylitetty. Nopeutta ei näytetä.', noneSegment: 'Ei löytynyt segmenttejä.', numSegmentsLoaded: 'Yhteensä ladattuja segmenttejä:', attributesNotFound: 'Attribuutteja ei löytynyt tai ne puuttuvat segmentistä', disallowedSegment: 'Tämän tyyppistä segmenttiä ei tule ladata.', invalidGeometry: 'Virheellinen geometria segmentissä:', updateMapDisplayFinished: 'Päivitys valmis.', shortCutDialogNotFound: 'Pikanäppäindialogia ei löytynyt. Yritetään uudelleen...', houseNumberCheckboxNotFound: '"Talojen numerot" -valintaruutua ei löytynyt. Yritetään uudelleen...', scriptsTabNotFound: 'Skripti-välilehteä ei löytynyt. Yritetään uudelleen...', settingsTabAdded: 'Asetusvälilehti lisätty.', speedLayer: 'Nopeuskerros', opacityUpdated: 'Ikonien opasiteetti säädetty arvoon', updatingSettingsTab: 'Päivitetään asetusten välilehteä...', languageDefined: 'Kielet määritetty.', checkingVersion: 'Tarkistetaan liitännäisen versiota.', insufficientGeometryAngleCalc: 'Geometria insuffisante pour calculer l\'angle de déviation.' } }; break; case 'fr': // French this.spdTranslations = { name: 'Affichage de la vitesse', settingTabName: 'Paramètres d\'affichage de la vitesse', enabled: 'activée', disabled: 'désactivée', zoomOut: 'Dézoomer', zoomIn: 'Zoomer', changelog: 'Journal des modifications', changelogMessage: '<h6>Nouveautés:</h6><ul style="margin-bottom: 10px"><li>L\'icône de vitesse est désormais affichée dans la bonne direction pour chaque voie, en suivant l\'angle perpendiculaire du point central de chaque segment.</li></ul><h6>Corrections:</h6><ul><li>Corrections mineures et améliorations du code.</li></ul>', close: 'Fermer', viewScript: 'Voir le script', showDialog: 'Afficher la fenêtre modale', title: { general: 'Général', showOnRoadType: 'Afficher sur les segments de type :' }, label: { displaySpeeds: 'Afficher les vitesses', showNoSpeed: 'Afficher sur le segment sans vitesse', showOnRoundabout: 'Afficher sur le rond-point', showOnUnpaved: 'Afficher sur route non pavée', maxZoom: 'Rendre jusqu\'au niveau de zoom :', toggleLayerShortcut: 'Basculer l\'interrupteur de couche pour afficher la vitesse' }, btn: { updateSettingsTab: 'Mettre à jour le menu', }, log: { wmeReadyStartScript: 'WME chargé et prêt. Démarrage du script...', waitingWme: 'En attente que WME soit prêt...', wmeReadyStartingPlugin: 'WME est prêt. Configuration de la couche personnalisée...', shortSleep: 'Attente d\'environ 1 seconde pour que tout se charge...', updateMapDisplay: 'Mise à jour de l\'affichage sur la carte...', maxZoomExceeded: 'Le zoom maximum a été dépassé. Aucune vitesse ne sera affichée.', noneSegment: 'Aucun segment trouvé.', numSegmentsLoaded: 'Nombre total de segments chargés :', attributesNotFound: 'Impossible de trouver les attributs ou ils sont manquants dans le segment', disallowedSegment: 'Ce type de segment ne doit pas être chargé.', invalidGeometry: 'Géométrie invalide dans le segment :', updateMapDisplayFinished: 'Mise à jour terminée.', shortCutDialogNotFound: 'Impossible de trouver la boîte de dialogue des raccourcis clavier. Nouvelle tentative...', houseNumberCheckboxNotFound: 'La case à cocher "Numéros des maisons" n\'a pas été trouvée. Tentative de nouveau...', scriptsTabNotFound: 'L\'onglet des scripts n\'a pas été trouvé. Tentative de nouveau...', settingsTabAdded: 'Onglet des paramètres ajouté.', speedLayer: 'Couche de vitesse', opacityUpdated: 'Opacité des icônes ajustée à', updatingSettingsTab: 'Mise à jour de l\'onglet des paramètres...', languageDefined: 'Langues définies.', checkingVersion: 'Vérification de la version du plugin.', insufficientGeometryAngleCalc: 'Géométrie insuffisante pour le calcul de l\'angle.' } }; break; case 'gl': // Galician this.spdTranslations = { name: 'Visualización da velocidade', settingTabName: 'Configuración da visualización da velocidade', enabled: 'activado', disabled: 'desactivado', zoomOut: 'Afastar', zoomIn: 'Achegar', changelog: 'Rexistro de cambios', changelogMessage: '<h6>Novidades:</h6><ul style="margin-bottom: 10px"><li>Agora o ícone de velocidade é mostrado na direção correta de cada carril, e segue o ângulo perpendicular do ponto médio de cada segmento.</li></ul><h6>Correccións:</h6><ul><li>Pequenas correccións e melloras no código.</li></ul>', close: 'Pechar', viewScript: 'Ver o script', showDialog: 'Amosar modal', title: { general: 'Xeral', showOnRoadType: 'Amosar nos segmentos do tipo:' }, label: { displaySpeeds: 'Amosar velocidades', showNoSpeed: 'Amosar en segmentos sen velocidade', showOnRoundabout: 'Amosar en rotondas', showOnUnpaved: 'Amosar en vía sen pavimentar', maxZoom: 'Renderizar ata o zoom:', toggleLayerShortcut: 'Alternar o interruptor de capa para mostrar a velocidade' }, btn: { updateSettingsTab: 'Actualizar menú', }, log: { wmeReadyStartScript: 'WME cargado e listo. Iniciando script...', waitingWme: 'Agardando a que WME estea listo...', wmeReadyStartingPlugin: 'WME está listo. Configurando capa personalizada...', shortSleep: 'Agardando uns 1 segundo para que todo se cargue...', updateMapDisplay: 'Actualizando a visualización no mapa...', maxZoomExceeded: 'Zoom máximo excedido. Ningunha velocidade será mostrada.', noneSegment: 'Non se atoparon segmentos.', numSegmentsLoaded: 'Total de segmentos cargados:', attributesNotFound: 'Non se puideron atopar os atributos ou están ausentes no segmento', disallowedSegment: 'Este tipo de segmento non debe ser cargado.', invalidGeometry: 'Xeometría non válida no segmento:', updateMapDisplayFinished: 'Actualización completada.', shortCutDialogNotFound: 'Non foi posible atopar o cadro de diálogo dos atallos de teclado. Intentando de novo...', houseNumberCheckboxNotFound: 'Non se atopou a caixa de selección "Números das casas". Intentando de novo...', scriptsTabNotFound: 'Non se atopou o panel de scripts. Intentando de novo...', settingsTabAdded: 'Aba de configuración engadida.', speedLayer: 'Capa de velocidade', opacityUpdated: 'Opacidade dos iconas axustada a', updatingSettingsTab: 'Actualizando a aba de configuración...', languageDefined: 'Idiomas definidos.', checkingVersion: 'Comprobando a versión do plugin.', insufficientGeometryAngleCalc: 'Xeometría insuficiente para o cálculo do ángulo.' } }; break; case 'he': // Hebrew this.spdTranslations = { name: 'תצוגת מהירות', settingTabName: 'הגדרות תצוגת מהירות', enabled: 'מופעל', disabled: 'מנוטרל', zoomOut: 'התרחק', zoomIn: 'התקרב', changelog: 'יומן שינויים', changelogMessage: '<h6>חידושים:</h6><ul style="margin-bottom: 10px"><li>אייקון המהירות מוצג כעת בכיוון הנכון לכל נתיב, ועוקב אחרי הזווית הניצבת לנקודת האמצע של כל קטע.</li></ul><h6>תיקונים:</h6><ul><li>תיקונים קטנים ושיפורים בקוד.</li></ul>', close: 'סגור', viewScript: 'צפייה בסקריפט', showDialog: 'הצג מודאלי', title: { general: 'כללי', showOnRoadType: 'הצג בקטעי דרך מהסוג:' }, label: { displaySpeeds: 'הצג מהירויות', showNoSpeed: 'הצג בקטעי דרך ללא מהירות', showOnRoundabout: 'הצג בכיכרות', showOnUnpaved: 'הצג בדרך לא סלולה', maxZoom: 'הצג עד רמת התקרבות:', toggleLayerShortcut: 'Alternar o interruptor de capa para mostrar a velocidade' }, btn: { updateSettingsTab: 'עדכן תפריט', }, log: { wmeReadyStartScript: 'WME נטען ומוכן. מפעיל סקריפט...', waitingWme: 'ממתין ל-WME שיטען...', wmeReadyStartingPlugin: 'WME מוכן. מגדיר שכבה מותאמת אישית...', shortSleep: 'ממתין כשנייה לטעינה מלאה...', updateMapDisplay: 'מעדכן תצוגת מפה...', maxZoomExceeded: 'ההתקרבות חרגה מהמקסימום. מהירות לא תוצג.', noneSegment: 'לא נמצאו קטעים.', numSegmentsLoaded: 'סך כל הקטעים שנטענו:', attributesNotFound: 'לא ניתן למצוא את המאפיינים או שהם חסרים בקטע', disallowedSegment: 'קטע זה אינו אמור להיטען.', invalidGeometry: 'גיאומטריה לא תקינה בקטע:', updateMapDisplayFinished: 'העדכון הושלם.', shortCutDialogNotFound: 'Non foi posible atopar o cadro de diálogo dos atallos de teclado. Intentando de novo...', houseNumberCheckboxNotFound: 'תיבת הסימון "מספרי בתים" לא נמצאה. מנסה שוב...', scriptsTabNotFound: 'לשונית הסקריפטים לא נמצאה. מנסה שוב...', settingsTabAdded: 'לשונית ההגדרות נוספה.', speedLayer: 'שכבת מהירות', opacityUpdated: 'שקיפות האייקונים הותאמה ל', updatingSettingsTab: 'מעדכן את לשונית ההגדרות...', languageDefined: 'השפות הוגדרו.', checkingVersion: 'בודק את גרסת התוסף.', insufficientGeometryAngleCalc: 'גיאומטריה לא מספקת לחישוב הזווית.' } }; break; case 'hi': // Hindi this.spdTranslations = { name: 'स्पीड डिस्प्ले', settingTabName: 'स्पीड डिस्प्ले सेटिंग्स', enabled: 'सक्षम', disabled: 'अक्षम', zoomOut: 'जूम आउट', zoomIn: 'जूम इन', changelog: 'चेंजलॉग', changelogMessage: '<h6>नई विशेषताएँ:</h6><ul style="margin-bottom: 10px"><li>स्पीड आइकन अब हर लेन की सही दिशा में प्रदर्शित होता है और हर खंड के मध्य बिंदु के लंबवत कोण का अनुसरण करता है।</li></ul><h6>सुधार:</h6><ul><li>कोड में छोटे सुधार और सुधार।</li></ul>', close: 'बंद करें', viewScript: 'स्क्रिप्ट देखें', showDialog: 'मोडल दिखाएँ', title: { general: 'सामान्य', showOnRoadType: 'इस सड़क प्रकार पर दिखाएं:' }, label: { displaySpeeds: 'स्पीड दिखाएं', showNoSpeed: 'स्पीड न होने पर दिखाएं', showOnRoundabout: 'राउंडअबाउट पर दिखाएं', showOnUnpaved: 'असंपन्न सड़क पर दिखाएँ', maxZoom: 'मैक्स जूम पर रेंडर करें:', toggleLayerShortcut: 'लेयर स्विचर गति प्रदर्शन टॉगल करें' }, btn: { updateSettingsTab: 'मेनू अपडेट करें', }, log: { wmeReadyStartScript: 'WME लोड हो गया और तैयार है। स्क्रिप्ट शुरू हो रही है...', waitingWme: 'WME के तैयार होने का इंतजार कर रहे हैं...', wmeReadyStartingPlugin: 'WME तैयार है। कस्टम लेयर सेट कर रहे हैं...', shortSleep: 'सब कुछ लोड होने के लिए लगभग 1 सेकंड रुक रहे हैं...', updateMapDisplay: 'मानचित्र प्रदर्शन अपडेट कर रहे हैं...', maxZoomExceeded: 'अधिकतम जूम स्तर पार हो गया। कोई स्पीड नहीं दिखाई देगी।', noneSegment: 'कोई सेगमेंट नहीं मिला।', numSegmentsLoaded: 'लोड किए गए सेगमेंट की कुल संख्या:', attributesNotFound: 'सेगमेंट में गुण नहीं मिले या गायब हैं', disallowedSegment: 'यह प्रकार का सेगमेंट लोड नहीं किया जाना चाहिए।', invalidGeometry: 'सेगमेंट में अमान्य ज्यामिति:', updateMapDisplayFinished: 'अद्यतन समाप्त हो गया।', shortCutDialogNotFound: 'कीबोर्ड शॉर्टकट संवाद नहीं मिला। पुनः प्रयास कर रहे हैं...', houseNumberCheckboxNotFound: '"हाउस नंबर" चेकबॉक्स नहीं मिला। फिर से प्रयास कर रहे हैं...', scriptsTabNotFound: 'स्क्रिप्ट पैनल नहीं मिला। फिर से प्रयास कर रहे हैं...', settingsTabAdded: 'सेटिंग्स टैब जोड़ा गया।', speedLayer: 'स्पीड लेयर', opacityUpdated: 'आइकन की अपारदर्शिता को समायोजित किया गया', updatingSettingsTab: 'सेटिंग्स टैब को अपडेट कर रहे हैं...', languageDefined: 'भाषाएं परिभाषित की गईं।', checkingVersion: 'प्लगइन संस्करण की जाँच कर रहे हैं।', insufficientGeometryAngleCalc: 'कोण गणना के लिए अपर्याप्त ज्यामिति।' } }; break; case 'hr': // Croatian this.spdTranslations = { name: 'Prikaz brzine', settingTabName: 'Postavke prikaza brzine', enabled: 'omogućeno', disabled: 'onemogućeno', zoomOut: 'Udalji', zoomIn: 'Povećaj', changelog: 'Dnevnik promjena', changelogMessage: '<h6>Novosti:</h6><ul style="margin-bottom: 10px"><li>Ikona brzine sada se prikazuje u ispravnom smjeru za svaku traku i prati kut središnje točke svakog segmenta okomito.</li></ul><h6>Ispravci:</h6><ul><li>Mali ispravci i poboljšanja koda.</li></ul>', close: 'Zatvori', viewScript: 'Pogledaj skriptu', showDialog: 'Prikaži dijalog', title: { general: 'Općenito', showOnRoadType: 'Prikaz na segmentima vrste:' }, label: { displaySpeeds: 'Prikaz brzina', showNoSpeed: 'Prikaz na segmentima bez brzine', showOnRoundabout: 'Prikaz na kružnim tokovima', showOnUnpaved: 'Prikaži na neasfaltiranoj cesti', maxZoom: 'Renderirati do razine uvećanja:', toggleLayerShortcut: 'Prebacite prekidač sloja za prikaz brzine' }, btn: { updateSettingsTab: 'Ažuriraj izbornik', }, log: { wmeReadyStartScript: 'WME učitano i spremno. Pokrećem skriptu...', waitingWme: 'Čekam da WME bude spreman...', wmeReadyStartingPlugin: 'WME je spreman. Postavljam prilagođeni sloj...', shortSleep: 'Čekam 1 sekundu da se sve učita...', updateMapDisplay: 'Ažuriram prikaz na karti...', maxZoomExceeded: 'Maksimalno uvećanje premašeno. Brzina neće biti prikazana.', noneSegment: 'Nema segmenata.', numSegmentsLoaded: 'Ukupno učitanih segmenata:', attributesNotFound: 'Nisu pronađeni atributi ili nedostaju u segmentu', disallowedSegment: 'Ova vrsta segmenta ne bi trebala biti učitana.', invalidGeometry: 'Nevažeća geometrija na segmentu:', updateMapDisplayFinished: 'Ažuriranje završeno.', shortCutDialogNotFound: 'Nije moguće pronaći dijalog prečaca tipkovnice. Pokušavam ponovno...', houseNumberCheckboxNotFound: '"Brojevi kuća" kutija za potvrdu nije pronađena. Pokušavam ponovno...', scriptsTabNotFound: 'Kartica skripti nije pronađena. Pokušavam ponovno...', settingsTabAdded: 'Kartica postavki dodana.', speedLayer: 'Sloj brzine', opacityUpdated: 'Prozirnost ikona postavljena na', updatingSettingsTab: 'Ažuriram karticu postavki...', languageDefined: 'Jezici definirani.', checkingVersion: 'Provjeravam verziju dodatka.', insufficientGeometryAngleCalc: 'Nedovoljna geometrija za izračun kuta.' } }; break; case 'hu': // Hungarian this.spdTranslations = { name: 'Sebesség kijelzés', settingTabName: 'Sebesség kijelzés beállítások', enabled: 'engedélyezve', disabled: 'letiltva', zoomOut: 'Távolítás', zoomIn: 'Közelítés', changelog: 'Változásnapló', changelogMessage: '<h6>Újdonságok:</h6><ul style="margin-bottom: 10px"><li>A sebesség ikon mostantól a megfelelő irányban jelenik meg minden sávnál, és követi minden szegmens középpontjának merőleges szögét.</li></ul><h6>Javítások:</h6><ul><li>Kisebb kódbeli javítások és fejlesztések.</li></ul>', close: 'Bezárás', viewScript: 'Szkript megtekintése', showDialog: 'Modális ablak megjelenítése', title: { general: 'Általános', showOnRoadType: 'Megjelenítés ezen az úttípuson:' }, label: { displaySpeeds: 'Sebességek megjelenítése', showNoSpeed: 'Megjelenítés sebesség nélküli szegmenseken', showOnRoundabout: 'Megjelenítés körforgalomra', showOnUnpaved: 'Megjelenítés burkolatlan úton', maxZoom: 'Renderelés a legnagyobb nagyításig:', toggleLayerShortcut: 'Rétegváltó sebesség kijelző váltás' }, btn: { updateSettingsTab: 'Menü frissítése', }, log: { wmeReadyStartScript: 'WME betöltve és kész. A szkript indítása...', waitingWme: 'Várakozás a WME betöltődésére...', wmeReadyStartingPlugin: 'A WME kész. Egyéni réteg beállítása...', shortSleep: 'Várakozás körülbelül 1 másodpercig, hogy minden betöltődjön...', updateMapDisplay: 'Térkép megjelenítés frissítése...', maxZoomExceeded: 'Maximális nagyítási szint túllépve. Sebesség nem jeleníthető meg.', noneSegment: 'Nincs szegmens.', numSegmentsLoaded: 'Betöltött szegmensek száma:', attributesNotFound: 'A szegmensen nem találhatók az attribútumok vagy hiányoznak', disallowedSegment: 'Ez a szegmensként nem engedélyezett betöltésre.', invalidGeometry: 'Érvénytelen geometria a szegmensen:', updateMapDisplayFinished: 'Frissítés befejeződött.', shortCutDialogNotFound: 'Nem található a billentyűparancsok párbeszédpanel. Újrapróbálkozás...', houseNumberCheckboxNotFound: '"Házszám" jelölőnégyzet nem található. Újrapróbálkozás...', scriptsTabNotFound: 'Skript fül nem található. Újrapróbálkozás...', settingsTabAdded: 'Beállítások fül hozzáadva.', speedLayer: 'Sebesség réteg', opacityUpdated: 'Ikonok átlátszósága beállítva', updatingSettingsTab: 'Beállítások fül frissítése...', languageDefined: 'Nyelvek definiálva.', checkingVersion: 'A bővítmény verziójának ellenőrzése.', insufficientGeometryAngleCalc: 'Efektifitás alakúszág kalkulálásának hiányzó geometriá.' } }; break; case 'id': // Indonesian this.spdTranslations = { name: 'Tampilan Kecepatan', settingTabName: 'Pengaturan Tampilan Kecepatan', enabled: 'aktif', disabled: 'nonaktif', zoomOut: 'Perkecil', zoomIn: 'Perbesar', changelog: 'Catatan Perubahan', changelogMessage: '<h6>Fitur Baru:</h6><ul style="margin-bottom: 10px"><li>Ikon kecepatan sekarang ditampilkan dalam arah yang benar untuk setiap jalur, dan mengikuti sudut tegak lurus dari titik tengah setiap segmen.</li></ul><h6>Perbaikan:</h6><ul><li>Perbaikan kecil dan peningkatan kode.</li></ul>', close: 'Tutup', viewScript: 'Lihat Skrip', showDialog: 'Tampilkan modal', title: { general: 'Umum', showOnRoadType: 'Tampilkan pada tipe jalan:' }, label: { displaySpeeds: 'Tampilkan kecepatan', showNoSpeed: 'Tampilkan di segmen tanpa kecepatan', showOnRoundabout: 'Tampilkan di bundaran', showOnUnpaved: 'Tampilkan di jalan yang tidak teras', maxZoom: 'Render hingga zoom maksimal:', toggleLayerShortcut: 'Alihkan sakelar lapisan untuk menampilkan kecepatan' }, btn: { updateSettingsTab: 'Perbarui Menu', }, log: { wmeReadyStartScript: 'WME dimuat dan siap. Memulai skrip...', waitingWme: 'Menunggu WME untuk siap...', wmeReadyStartingPlugin: 'WME siap. Menyiapkan lapisan khusus...', shortSleep: 'Menunggu sekitar 1 detik agar semuanya dimuat...', updateMapDisplay: 'Memperbarui tampilan peta...', maxZoomExceeded: 'Zoom maksimal terlampaui. Kecepatan tidak akan ditampilkan.', noneSegment: 'Tidak ada segmen yang ditemukan.', numSegmentsLoaded: 'Jumlah segmen yang dimuat:', attributesNotFound: 'Atribut tidak ditemukan atau hilang di segmen', disallowedSegment: 'Segmen jenis ini tidak boleh dimuat.', invalidGeometry: 'Geometri tidak valid di segmen:', updateMapDisplayFinished: 'Pembaruan selesai.', shortCutDialogNotFound: 'Tidak dapat menemukan dialog pintasan keyboard. Mencoba lagi...', houseNumberCheckboxNotFound: 'Checkbox "Nomor Rumah" tidak ditemukan. Mencoba lagi...', scriptsTabNotFound: 'Tab skrip tidak ditemukan. Mencoba lagi...', settingsTabAdded: 'Tab pengaturan ditambahkan.', speedLayer: 'Lapisan Kecepatan', opacityUpdated: 'Opasitas ikon diatur ke', updatingSettingsTab: 'Memperbarui tab pengaturan...', languageDefined: 'Bahasa telah didefinisikan.', checkingVersion: 'Memeriksa versi plugin.', insufficientGeometryAngleCalc: 'Kalkulasi kelengkapan geometria yang insufficient.' } }; break; case 'it': // Italian this.spdTranslations = { name: 'Visualizzazione della velocità', settingTabName: 'Impostazioni visualizzazione della velocità', enabled: 'abilitato', disabled: 'disabilitato', zoomOut: 'Zoom indietro', zoomIn: 'Zoom avanti', changelog: 'Registro modifiche', changelogMessage: '<h6>Novità:</h6><ul style="margin-bottom: 10px"><li>L\'icona della velocità ora viene visualizzata nella direzione corretta per ogni corsia e segue l\'angolo perpendicolare al punto centrale di ogni segmento.</li></ul><h6>Correzioni:</h6><ul><li>Piccole correzioni e miglioramenti del codice.</li></ul>', close: 'Chiudi', viewScript: 'Vedi Script', showDialog: 'Mostra finestra modale', title: { general: 'Generale', showOnRoadType: 'Mostra su tipo di strada:' }, label: { displaySpeeds: 'Mostra velocità', showNoSpeed: 'Mostra su segmenti senza velocità', showOnRoundabout: 'Mostra sulle rotonde', showOnUnpaved: 'Mostra sulla strada non pavimentata', maxZoom: 'Renderizza fino allo zoom:', toggleLayerShortcut: 'Attiva/disattiva il selettore del livello per visualizzare la velocità' }, btn: { updateSettingsTab: 'Aggiorna menu', }, log: { wmeReadyStartScript: 'WME caricato e pronto. Avvio lo script...', waitingWme: 'In attesa che WME sia pronto...', wmeReadyStartingPlugin: 'WME pronto. Impostando layer personalizzato...', shortSleep: 'Attendere circa 1 secondo affinché tutto venga caricato...', updateMapDisplay: 'Aggiornando la visualizzazione della mappa...', maxZoomExceeded: 'Zoom massimo superato. La velocità non verrà visualizzata.', noneSegment: 'Nessun segmento trovato.', numSegmentsLoaded: 'Numero totale di segmenti caricati:', attributesNotFound: 'Impossibile trovare gli attributi o mancano nel segmento', disallowedSegment: 'Questo tipo di segmento non deve essere caricato.', invalidGeometry: 'Geometria non valida nel segmento:', updateMapDisplayFinished: 'Aggiornamento completato.', shortCutDialogNotFound: 'Impossibile trovare la finestra di dialogo delle scorciatoie da tastiera. Riprovo...', houseNumberCheckboxNotFound: 'Non trovata la casella di selezione "Numeri civici". Riprovo...', scriptsTabNotFound: 'Non trovata la scheda degli script. Riprovo...', settingsTabAdded: 'Scheda impostazioni aggiunta.', speedLayer: 'Layer velocità', opacityUpdated: 'Opacità delle icone impostata su', updatingSettingsTab: 'Aggiornamento scheda impostazioni...', languageDefined: 'Lingue definite.', checkingVersion: 'Verifica versione del plugin.', insufficientGeometryAngleCalc: 'Geometria insufficiente per il calcolo dell\'angolo.' } }; break; case 'ja': // Japanese this.spdTranslations = { name: '速度表示', settingTabName: '速度表示設定', enabled: '有効', disabled: '無効', zoomOut: 'ズームアウト', zoomIn: 'ズームイン', changelog: '変更履歴', changelogMessage: '<h6>新機能:</h6><ul style="margin-bottom: 10px"><li>速度アイコンが各レーンの正しい方向に表示され、各セグメントの中央点の直角方向の角度に従います。</li></ul><h6>修正:</h6><ul><li>コードの小さな修正と改善。</li></ul>', close: '閉じる', viewScript: 'スクリプトを表示', showDialog: 'モーダルを表示', title: { general: '一般', showOnRoadType: '次のタイプのセグメントに表示:' }, label: { displaySpeeds: '速度を表示', showNoSpeed: '速度なしのセグメントに表示', showOnRoundabout: 'ラウンドアバウトに表示', showOnUnpaved: '未舗装道路に表示', maxZoom: '最大ズームレベルまでレンダリング:', toggleLayerShortcut: 'レイヤースイッチャー速度表示を切り替える' }, btn: { updateSettingsTab: 'メニューを更新', }, log: { wmeReadyStartScript: 'WMEが読み込まれ、準備が整いました。スクリプトを開始します...', waitingWme: 'WMEの準備が整うのを待っています...', wmeReadyStartingPlugin: 'WMEが準備完了。カスタムレイヤーを設定中...', shortSleep: 'すべての読み込みが完了するまで約1秒間待機...', updateMapDisplay: '地図表示を更新しています...', maxZoomExceeded: '最大ズームを超えました。速度は表示されません。', noneSegment: 'セグメントが見つかりませんでした。', numSegmentsLoaded: '読み込まれたセグメントの数:', attributesNotFound: 'セグメントの属性が見つかりませんまたは不足しています', disallowedSegment: 'このタイプのセグメントは読み込むべきではありません。', invalidGeometry: 'セグメントのジオメトリが無効です:', updateMapDisplayFinished: '更新が完了しました。', shortCutDialogNotFound: 'キーボードショートカットのダイアログが見つかりませんでした。再試行中...', houseNumberCheckboxNotFound: '「家番号」のチェックボックスが見つかりませんでした。再試行します...', scriptsTabNotFound: 'スクリプトタブが見つかりませんでした。再試行します...', settingsTabAdded: '設定タブが追加されました。', speedLayer: '速度レイヤー', opacityUpdated: 'アイコンの透明度が次のように更新されました:', updatingSettingsTab: '設定タブを更新しています...', languageDefined: '言語が設定されました。', checkingVersion: 'プラグインのバージョンを確認しています。', insufficientGeometryAngleCalc: '角度計算には不十分なジオメトリです。' } }; break; case 'ka': // Georgian this.spdTranslations = { name: 'მოჩვენების სიჩქარე', settingTabName: 'მოჩვენების სიჩქარის პარამეტრები', enabled: 'ჩართულია', disabled: 'გამორთულია', zoomOut: 'დისტანცირება', zoomIn: 'დაახლოვება', changelog: 'ცვლილებების ისტორია', changelogMessage: '<h6>ახალშექმნილი:</h6><ul style="margin-bottom: 10px"><li>სიჩქარის ხატულა ახლა სწორად ეჩვენება თითოეული ზოლის მიმართულებას და ახლავს თითოეული სეგმენტის შუა წერტილის დამრტყმელ კუთხეს.</li></ul><h6>გადასინჯვები:</h6><ul><li>მცირე გამოსწორებები და კოდის გაუმჯობესება.</li></ul>', close: 'დახურვა', viewScript: 'სკრიპტის ნახვა', showDialog: 'მოდალური ფანჯრის ჩვენება', title: { general: 'ზოგადი', showOnRoadType: 'მოჩვენება შემდეგი ტიპის მონაკვეთებზე:' }, label: { displaySpeeds: 'მოჩვენება სიჩქარე', showNoSpeed: 'მოჩვენება სიჩქარის გარეშე მონაკვეთებზე', showOnRoundabout: 'მოჩვენება როტონდაზე', showOnUnpaved: 'აჩვენე უგრუნტო გზაზე', maxZoom: 'გახსენით მაქსიმალური ზუმი:', toggleLayerShortcut: 'შედეგის სიჩქარის საჩვენებელი ფენის გადამრთველი' }, btn: { updateSettingsTab: 'განახლება მენიუ', }, log: { wmeReadyStartScript: 'WME დამუხტულია და მზადაა. სკრიპტის დაწყება...', waitingWme: 'WME-ის მოლოდინი...', wmeReadyStartingPlugin: 'WME მზადაა. პერსონალური ფენების კონფიგურაცია...', shortSleep: 'მოლოდინი დაახლოებით 1 წამით, რომ ყველაფერი დატვირთული იყოს...', updateMapDisplay: 'რუკის ჩვენების განახლება...', maxZoomExceeded: 'მაქსიმალური ზუმი გადააჭარბა. სიჩქარე არ გამოიჩენს.', noneSegment: 'არ არის მონაკვეთები.', numSegmentsLoaded: 'დატვირთული მონაკვეთების რაოდენობა:', attributesNotFound: 'მონაკვეთებში ვერ მოიძებნა ატრიბუტები ან ისინი აკლია', disallowedSegment: 'ეს ტიპის მონაკვეთები არ უნდა ჩაიტვირთოს.', invalidGeometry: 'გეომეტრია არასწორია მონაკვეთზე:', updateMapDisplayFinished: 'განახლება დასრულდა.', shortCutDialogNotFound: 'ვერ მოიძებნა კლავიატურის მალსახმობების დიალოგი. ხელახლა ცდა...', houseNumberCheckboxNotFound: '„სახლების ნომრის“ საკონტროლო ჩხიკი არ მოიძებნა. ვცდილობთ თავიდან...', scriptsTabNotFound: 'სკრიპტების ჩანართი ვერ მოიძებნა. ვცდილობთ თავიდან...', settingsTabAdded: 'პარამეტრების ჩანართი დაემატა.', speedLayer: 'სიჩქარის ფენა', opacityUpdated: 'ხატების გამჭვირვალობა განახლდა:', updatingSettingsTab: 'პარამეტრების ჩანართის განახლება...', languageDefined: 'ენის გადამზადება.', checkingVersion: 'ამოწმდება პლაგინის ვერსია.', insufficientGeometryAngleCalc: 'კუთხის გამოთვლისთვის არ არის საკმარისი გეომეტრია.' } }; break; case 'ko': // Korean this.spdTranslations = { name: '속도 표시', settingTabName: '속도 표시 설정', enabled: '활성화됨', disabled: '비활성화됨', zoomOut: '축소', zoomIn: '확대', changelog: '변경 로그', changelogMessage: '<h6>새로운 기능:</h6><ul style="margin-bottom: 10px"><li>속도 아이콘은 이제 각 차선의 올바른 방향으로 표시되며 각 구간의 중간 지점의 직각 각도를 따릅니다.</li></ul><h6>수정 사항:</h6><ul><li>코드의 작은 수정 사항과 개선 사항.</li></ul>', close: '닫기', viewScript: '스크립트 보기', showDialog: '모달 표시', title: { general: '일반', showOnRoadType: '다음 도로 유형에 표시:' }, label: { displaySpeeds: '속도 표시', showNoSpeed: '속도가 없는 구간에 표시', showOnRoundabout: '회전 교차로에 표시', showOnUnpaved: '포장되지 않은 도로에 표시', maxZoom: '최대 확대 수준까지 렌더링:', toggleLayerShortcut: '레이어 전환기 속도 표시 전환' }, btn: { updateSettingsTab: '메뉴 업데이트', }, log: { wmeReadyStartScript: 'WME가 로드되고 준비되었습니다. 스크립트를 시작합니다...', waitingWme: 'WME가 준비되기를 기다리고 있습니다...', wmeReadyStartingPlugin: 'WME가 준비되었습니다. 사용자 정의 레이어 설정 중...', shortSleep: '모든 것이 로드될 때까지 약 1초 기다립니다...', updateMapDisplay: '지도 표시 업데이트 중...', maxZoomExceeded: '최대 확대 수준을 초과했습니다. 속도가 표시되지 않습니다.', noneSegment: '세그먼트가 없습니다.', numSegmentsLoaded: '로드된 세그먼트의 총 수:', attributesNotFound: '세그먼트에서 속성을 찾을 수 없거나 누락됨', disallowedSegment: '이 유형의 세그먼트는 로드되어서는 안 됩니다.', invalidGeometry: '세그먼트에 유효하지 않은 기하학이 있습니다:', updateMapDisplayFinished: '업데이트 완료.', shortCutDialogNotFound: '키보드 단축키 대화 상자를 찾을 수 없습니다. 다시 시도 중...', houseNumberCheckboxNotFound: '"집 번호" 체크박스를 찾을 수 없습니다. 다시 시도 중...', scriptsTabNotFound: '스크립트 탭을 찾을 수 없습니다. 다시 시도 중...', settingsTabAdded: '설정 탭이 추가되었습니다.', speedLayer: '속도 레이어', opacityUpdated: '아이콘 불투명도가 설정되었습니다:', updatingSettingsTab: '설정 탭을 업데이트 중...', languageDefined: '언어 정의됨.', checkingVersion: '플러그인 버전 확인 중.', insufficientGeometryAngleCalc: '각도 계산을 위한 기하학이 부족합니다.' } }; break; case 'lt': // Lithuanian this.spdTranslations = { name: 'Greitį rodymas', settingTabName: 'Greitį rodymo nustatymai', enabled: 'Įjungta', disabled: 'Išjungta', zoomOut: 'Toliau', zoomIn: 'Artimiau', changelog: 'Pakeitimų registras', changelogMessage: '<h6>Naujienos:</h6><ul style="margin-bottom: 10px"><li>Greičio piktograma dabar rodomas teisinga kryptimi kiekvienam eismo juostui ir atitinka kiekvieno segmento vidurio taško statmeną kampą.</li></ul><h6>Klaidų taisymai:</h6><ul><li>Smulkūs klaidų taisymai ir kodo patobulinimai.</li></ul>', close: 'Uždaryti', viewScript: 'Peržiūrėti scenarijų', showDialog: 'Rodyti modalą', title: { general: 'Bendrieji', showOnRoadType: 'Rodyti šiuose kelio segmentuose:' }, label: { displaySpeeds: 'Rodyti greičius', showNoSpeed: 'Rodyti segmentuose be greičio', showOnRoundabout: 'Rodyti žiede', showOnUnpaved: 'Rodyti nepaviršiniuose keliuose', maxZoom: 'Rodymas iki priartinimo lygio:', toggleLayerShortcut: 'Perjungti greičio sluoksnį' }, btn: { updateSettingsTab: 'Atnaujinti meniu', }, log: { wmeReadyStartScript: 'WME įkeltas ir paruoštas. Paleidžiamas scenarijus...', waitingWme: 'Laukiama, kol WME bus paruoštas...', wmeReadyStartingPlugin: 'WME paruoštas. Nustatoma pasirinktinių sluoksnių...', shortSleep: 'Laukiama kelias sekundes, kad viskas užsikrautų...', updateMapDisplay: 'Atnaujinama žemėlapio rodymas...', maxZoomExceeded: 'Peržengtas didžiausias priartinimo lygis. Greitis nerodomas.', noneSegment: 'Nepavyko rasti segmento.', numSegmentsLoaded: 'Iš viso įkeltų segmentų:', attributesNotFound: 'Nepavyko rasti atributų arba jie yra trūkstami šiame segmente', disallowedSegment: 'Šio tipo segmentas neturėtų būti įkeltas.', invalidGeometry: 'Netinkama geometrija segmente:', updateMapDisplayFinished: 'Atnaujinimas baigtas.', shortCutDialogNotFound: 'Nepavyko rasti spartaus klavišo modalą. Bandome dar kartą...', houseNumberCheckboxNotFound: 'Nepavyko rasti "Namų numeriai" žymės. Bandome dar kartą...', scriptsTabNotFound: 'Nepavyko rasti scenarijų skirtuko. Bandome dar kartą...', settingsTabAdded: 'Nustatymų skirtukas pridėtas.', speedLayer: 'Greičio sluoksnis', opacityUpdated: 'Piktogramų skaidrumas nustatytas į', updatingSettingsTab: 'Atnaujinami nustatymų skirtukai...', languageDefined: 'Kalbos nustatytos.', checkingVersion: 'Tikrinama versija.', insufficientGeometryAngleCalc: 'Nepakanka geometrijos kampo skaičiavimui.' } }; break; case 'lv': // Latvian this.spdTranslations = { name: 'Ātruma attēlojums', settingTabName: 'Ātruma attēlojuma iestatījumi', enabled: 'Ieslēgts', disabled: 'Izslēgts', zoomOut: 'Tālāk', zoomIn: 'Tuvāk', changelog: 'Izmaiņu žurnāls', changelogMessage: '<h6>Jaunumi:</h6><ul style="margin-bottom: 10px"><li>Ātruma ikona tagad tiek attēlota pareizajā virzienā katram joslai, un tā seko katra segmenta viduspunkta perpendikulārā leņķa.</li></ul><h6>Kļūdu labojumi:</h6><ul><li>Nelieli labojumi un koda uzlabošana.</li></ul>', close: 'Aizvērt', viewScript: 'Skatīt skriptu', showDialog: 'Parādīt modāli', title: { general: 'Vispārīgi', showOnRoadType: 'Parādīt šajos ceļa segmentos:' }, label: { displaySpeeds: 'Parādīt ātrumus', showNoSpeed: 'Parādīt segmentos bez ātruma', showOnRoundabout: 'Parādīt apļveida krustojumā', showOnUnpaved: 'Parādīt nepavedinātos ceļos', maxZoom: 'Renderēt līdz pieejamajam tālummaiņas līmenim:', toggleLayerShortcut: 'Pārslēgt ātruma slāni' }, btn: { updateSettingsTab: 'Atjaunināt izvēlni', }, log: { wmeReadyStartScript: 'WME ielādēts un gatavs. Sākam skriptu...', waitingWme: 'Gaida, kamēr WME būs gatavs...', wmeReadyStartingPlugin: 'WME gatavs. Iestatām pielāgotos slāņus...', shortSleep: 'Gaida dažas sekundes, lai viss ielādētos...', updateMapDisplay: 'Atjauninām kartes attēlojumu...', maxZoomExceeded: 'Pārsniegts maksimālais tālummaiņas līmenis. Ātrums netiks attēlots.', noneSegment: 'Nav atrasts segments.', numSegmentsLoaded: 'Kopā ielādēto segmentu:', attributesNotFound: 'Neizdevās atrast atribūtus vai tie nav pieejami segmentā', disallowedSegment: 'Šī veida segments nedrīkst būt ielādēts.', invalidGeometry: 'Nederīga ģeometrija segmentā:', updateMapDisplayFinished: 'Atjauninājums pabeigts.', shortCutDialogNotFound: 'Neizdevās atrast īsinājumtaustiņu modāli. Mēģinām vēlreiz...', houseNumberCheckboxNotFound: 'Neizdevās atrast "Māju numuru" ķeksi. Mēģinām vēlreiz...', scriptsTabNotFound: 'Neizdevās atrast skriptu cilni. Mēģinām vēlreiz...', settingsTabAdded: 'Pievienots iestatījumu cilne.', speedLayer: 'Ātruma slānis', opacityUpdated: 'Ikonu caurspīdīgums ir iestatīts uz', updatingSettingsTab: 'Atjauninām iestatījumu cilnes...', languageDefined: 'Valodas definētas.', checkingVersion: 'Pārbauda spraudņa versiju.', insufficientGeometryAngleCalc: 'Nepietiekama ģeometrija leņķa aprēķinam.' } }; break; case 'ms': // Malay this.spdTranslations = { name: 'Paparan Kelajuan', settingTabName: 'Tetapan Paparan Kelajuan', enabled: 'didayakan', disabled: 'dinonaktifkan', zoomOut: 'Zum Keluar', zoomIn: 'Zum Masuk', changelog: 'Log Perubahan', changelogMessage: '<h6>Ciri Baru:</h6><ul style="margin-bottom: 10px"><li>Ikon kelajuan kini dipaparkan dalam arah yang betul untuk setiap lorong, dan mengikuti sudut tegak lurus dari titik tengah setiap segmen.</li></ul><h6>Pembaikan:</h6><ul><li>Pembaikan kecil dan peningkatan kod.</li></ul>', close: 'Tutup', viewScript: 'Lihat Skrip', showDialog: 'Tunjukkan modal', title: { general: 'Am', showOnRoadType: 'Tunjukkan pada jenis jalan:' }, label: { displaySpeeds: 'Paparkan kelajuan', showNoSpeed: 'Paparkan pada segmen tanpa kelajuan', showOnRoundabout: 'Paparkan pada bulatan jalan', showOnUnpaved: 'Rodyti neasfaltuotame kelyje', maxZoom: 'Render sehingga zum maksima:', toggleLayerShortcut: 'Togol suis lapisan untuk paparan kelajuan' }, btn: { updateSettingsTab: 'Kemas kini menu', }, log: { wmeReadyStartScript: 'WME dimuatkan dan sedia. Memulakan skrip...', waitingWme: 'Menunggu WME untuk bersedia...', wmeReadyStartingPlugin: 'WME telah sedia. Menetapkan lapisan khas...', shortSleep: 'Menunggu lebih kurang 1 saat untuk semua dimuatkan...', updateMapDisplay: 'Mengemas kini paparan peta...', maxZoomExceeded: 'Zum maksimum melebihi had. Kelajuan tidak akan dipaparkan.', noneSegment: 'Tiada segmen dijumpai.', numSegmentsLoaded: 'Jumlah segmen yang dimuatkan:', attributesNotFound: 'Atribut tidak dijumpai atau hilang pada segmen', disallowedSegment: 'Segmen jenis ini tidak dibenarkan dimuatkan.', invalidGeometry: 'Geometri tidak sah pada segmen:', updateMapDisplayFinished: 'Kemaskini selesai.', shortCutDialogNotFound: 'Tidak dapat mencari dialog pintasan papan kekunci. Mencuba semula...', houseNumberCheckboxNotFound: 'Checkbox "Nombor Rumah" tidak dijumpai. Mencuba semula...', scriptsTabNotFound: 'Tab skrip tidak dijumpai. Mencuba semula...', settingsTabAdded: 'Tab tetapan ditambah.', speedLayer: 'Lapisan kelajuan', opacityUpdated: 'Keburaman ikon disetkan ke', updatingSettingsTab: 'Mengemas kini tab tetapan...', languageDefined: 'Bahasa ditentukan.', checkingVersion: 'Memeriksa versi plugin.', insufficientGeometryAngleCalc: 'Geometrie is onjuist, om te berekenen hoeveel kilometers per uur (km/h) de snelheid is.' } }; break; case 'nl': // Dutch this.spdTranslations = { name: 'Snelheidsweergave', settingTabName: 'Instellingen voor snelheidsweergave', enabled: 'ingeschakeld', disabled: 'uitgeschakeld', zoomOut: 'Uitzoomen', zoomIn: 'Inzoomen', changelog: 'Wijzigingslog', changelogMessage: '<h6>Nieuwe functies:</h6><ul style="margin-bottom: 10px"><li>Het snelheidsicoon wordt nu in de juiste richting voor elke rijstrook weergegeven en volgt de perpendiculaire hoek van het middelpunt van elk segment.</li></ul><h6>Fixes:</h6><ul><li>Kleine codecorrecties en verbeteringen.</li></ul>', close: 'Sluiten', viewScript: 'Script bekijken', showDialog: 'Modaal venster tonen', title: { general: 'Algemeen', showOnRoadType: 'Weergeven op wegtype:' }, label: { displaySpeeds: 'Toon snelheden', showNoSpeed: 'Toon op segmenten zonder snelheid', showOnRoundabout: 'Toon op rotondes', showOnUnpaved: 'Toon op onbeschikte wegen', maxZoom: 'Renderen tot zoomniveau:', toggleLayerShortcut: 'Schakel laagwisselaar snelheidsoverzicht in' }, btn: { updateSettingsTab: 'Menu bijwerken', }, log: { wmeReadyStartScript: 'WME geladen en klaar. Starten van script...', waitingWme: 'Wachten totdat WME klaar is...', wmeReadyStartingPlugin: 'WME is klaar. Aanpassen van aangepaste laag...', shortSleep: 'Wachten ongeveer 1 seconde totdat alles geladen is...', updateMapDisplay: 'Bijwerken van de kaartweergave...', maxZoomExceeded: 'Maximale zoom overschreden. Snelheid wordt niet weergegeven.', noneSegment: 'Geen segmenten gevonden.', numSegmentsLoaded: 'Totaal geladen segmenten:', attributesNotFound: 'Kan attributen niet vinden of ze ontbreken in het segment', disallowedSegment: 'Dit segmenttype mag niet worden geladen.', invalidGeometry: 'Ongeldige geometrie op segment:', updateMapDisplayFinished: 'Bijwerken voltooid.', shortCutDialogNotFound: 'Kan het dialoogvenster voor sneltoetsen niet vinden. Opnieuw proberen...', houseNumberCheckboxNotFound: 'De checkbox "Huisnummers" werd niet gevonden. Probeer opnieuw...', scriptsTabNotFound: 'Het scripts-tabblad werd niet gevonden. Probeer opnieuw...', settingsTabAdded: 'Instellingen tabblad toegevoegd.', speedLayer: 'Snelheidslaag', opacityUpdated: 'Doorzichtigheid van iconen ingesteld op', updatingSettingsTab: 'Instellingen tabblad wordt bijgewerkt...', languageDefined: 'Talen gedefinieerd.', checkingVersion: 'Versie van de plugin controleren.', insufficientGeometryAngleCalc: 'Onvoldoende geometrie voor hoekenberekening.' } }; break; case 'no': // Norwegian this.spdTranslations = { name: 'Hastighetsvisning', settingTabName: 'Innstillinger for hastighetsvisning', enabled: 'aktivert', disabled: 'deaktivert', zoomOut: 'Zoom ut', zoomIn: 'Zoom inn', changelog: 'Endringslogg', changelogMessage: '<h6>Nyheter:</h6><ul style="margin-bottom: 10px"><li>Hastighetsikonet vises nå i riktig retning for hver fil, og følger den perpendikulære vinkelen til midtpunktet av hvert segment.</li></ul><h6>Feilrettinger:</h6><ul><li>Små feilrettinger og forbedringer i koden.</li></ul>', close: 'Lukk', viewScript: 'Vis skript', showDialog: 'Vis modalvindu', title: { general: 'Generelt', showOnRoadType: 'Vis på segmenter av typen:' }, label: { displaySpeeds: 'Vis hastigheter', showNoSpeed: 'Vis på segmenter uten hastighet', showOnRoundabout: 'Vis på rundkjøring', showOnUnpaved: 'Vis på ubelagt vei', maxZoom: 'Render til maks zoom nivå:', toggleLayerShortcut: 'Bytt lagbryter hastighetsvisning' }, btn: { updateSettingsTab: 'Oppdater menyen', }, log: { wmeReadyStartScript: 'WME lastet og klar. Starter skript...', waitingWme: 'Venter på at WME skal bli klart...', wmeReadyStartingPlugin: 'WME er klart. Setter opp tilpasset lag...', shortSleep: 'Venter i ca. 1 sekund for at alt skal lastes...', updateMapDisplay: 'Oppdaterer kartvisning...', maxZoomExceeded: 'Maks zoomnivå overskredet. Ingen hastighet vil bli vist.', noneSegment: 'Fant ingen segmenter.', numSegmentsLoaded: 'Totalt antall lastede segmenter:', attributesNotFound: 'Fant ikke attributtene eller de mangler på segmentet', disallowedSegment: 'Denne typen segment bør ikke lastes.', invalidGeometry: 'Ugyldig geometri på segmentet:', updateMapDisplayFinished: 'Oppdatering fullført.', shortCutDialogNotFound: 'Kunne ikke finne dialogboksen for tastatursnarveier. Prøver igjen...', houseNumberCheckboxNotFound: 'Finnes ikke avmerkingsboksen "Husnummer". Prøver igjen...', scriptsTabNotFound: 'Fant ikke skriptfanen. Prøver igjen...', settingsTabAdded: 'Innstillingsfanen er lagt til.', speedLayer: 'Hastighetslag', opacityUpdated: 'Ikonens opasitet er oppdatert til', updatingSettingsTab: 'Oppdaterer innstillingsfanen...', languageDefined: 'Språk definert.', checkingVersion: 'Sjekker plugin-versjon.', insufficientGeometryAngleCalc: 'Utilstrekkelig geometri for beregning av vinkel.' } }; break; case 'pl': // Polish this.spdTranslations = { name: 'Wyświetlanie prędkości', settingTabName: 'Ustawienia wyświetlania prędkości', enabled: 'włączona', disabled: 'wyłączona', zoomOut: 'Oddal', zoomIn: 'Przybliż', changelog: 'Dziennik zmian', changelogMessage: '<h6>Nowości:</h6><ul style="margin-bottom: 10px"><li>Ikona prędkości jest teraz wyświetlana w odpowiednim kierunku dla każdego pasa i śledzi prostopadły kąt punktu środkowego każdego segmentu.</li></ul><h6>Poprawki:</h6><ul><li>Małe poprawki i ulepszenia kodu.</li></ul>', close: 'Zamknij', viewScript: 'Pokaż skrypt', showDialog: 'Pokaż okno modalne', title: { general: 'Ogólne', showOnRoadType: 'Wyświetl na segmentach typu:' }, label: { displaySpeeds: 'Wyświetlaj prędkości', showNoSpeed: 'Pokaż na segmencie bez prędkości', showOnRoundabout: 'Pokaż na rondzie', showOnUnpaved: 'Pokaż na nieodkrytych drogach', maxZoom: 'Renderuj do poziomu zoomu:', toggleLayerShortcut: 'Przełącz przełącznik warstwy wyświetlania prędkości' }, btn: { updateSettingsTab: 'Zaktualizuj menu', }, log: { wmeReadyStartScript: 'WME załadowane i gotowe. Uruchamiam skrypt...', waitingWme: 'Czekam, aż WME będzie gotowe...', wmeReadyStartingPlugin: 'WME jest gotowe. Konfigurowanie warstwy niestandardowej...', shortSleep: 'Czekam około 1 sekundy, aż wszystko się załaduje...', updateMapDisplay: 'Aktualizuję wyświetlanie na mapie...', maxZoomExceeded: 'Przekroczono maksymalny poziom zoomu. Prędkość nie będzie wyświetlana.', noneSegment: 'Nie znaleziono segmentów.', numSegmentsLoaded: 'Łączna liczba załadowanych segmentów:', attributesNotFound: 'Nie można znaleźć atrybutów lub są one brakujące w segmencie', disallowedSegment: 'Tego typu segment nie powinien być ładowany.', invalidGeometry: 'Nieprawidłowa geometria w segmencie:', updateMapDisplayFinished: 'Aktualizacja zakończona.', shortCutDialogNotFound: 'Nie można znaleźć okna dialogowego skrótów klawiaturowych. Ponowna próba...', houseNumberCheckboxNotFound: 'Nie znaleziono pola wyboru „Numery domów”. Próbuję ponownie...', scriptsTabNotFound: 'Nie znaleziono zakładki skryptów. Próbuję ponownie...', settingsTabAdded: 'Dodano kartę ustawień.', speedLayer: 'Warstwa prędkości', opacityUpdated: 'Przezroczystość ikon została ustawiona na', updatingSettingsTab: 'Aktualizowanie zakładki ustawień...', languageDefined: 'Języki zdefiniowane.', checkingVersion: 'Sprawdzanie wersji wtyczki.', insufficientGeometryAngleCalc: 'Niewystarczająca geometria do obliczenia kąta.' } }; break; case 'pt-BR': // Portuguese (Brazil) this.spdTranslations = { name: 'Exibição de Velocidade', settingTabName: 'Configurações de Exibição de Velocidade', enabled: 'atiavada', disabled: 'desativada', zoomOut: 'Mais afastado', zoomIn: 'Mais aproximado', changelog: 'Registro de alterações', changelogMessage: '<h6>Novidades:</h6><ul style="margin-bottom: 10px"><li>Agora o ícone de velocidade é exibido na direção correta de cada sentido e acompanhando em perpendicular a angulação do ponto médio de cada seguimento.</li></ul><h6>Correções:</h6><ul><li>Pequenas correções e melhorias de código.</li></ul>', close: 'Fechar', viewScript: 'Ver script', showDialog: 'Exibir modal', title: { general: 'Geral', showOnRoadType: 'Exibir nos seguimentos do tipo:' }, label: { displaySpeeds: 'Exibir velocidades', showNoSpeed: 'Exibir em seguimento 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' }, btn: { updateSettingsTab: 'Atualizar menu', }, log: { wmeReadyStartScript: 'WME carregado e pronto. Iniciando script...', waitingWme: 'Aguardando o WME estar pronto...', wmeReadyStartingPlugin: 'WME está pronto. Configurando camada personalizada...', shortSleep: 'Aguardando uns 1 segundo para tudo carregar...', updateMapDisplay: 'Atualizando display no mapa...', maxZoomExceeded: 'Zoom máximo excedido. Nenhuma velocidade será exibida.', noneSegment: 'Nenhum segmento encontrado.', numSegmentsLoaded: 'Total de segmentos carregados:', attributesNotFound: 'Não foi possível encontrar os atributos ou estão ausentes no segmento', disallowedSegment: 'Este tipo de seguimento não deve ser carregado.', invalidGeometry: 'Geometria inválida no seguimento:', updateMapDisplayFinished: 'Atualização concluída.', shortCutDialogNotFound: 'Não foi possível encontrar o modal de atalhos do teclado. Tentando novamente...', houseNumberCheckboxNotFound: 'O checkbox "Números das Casas" não foi encontrado. Tentando novamente...', scriptsTabNotFound: 'Painel de scripts não encontrado. Tentando novamente...', settingsTabAdded: 'Aba de configurações adicionada.', speedLayer: 'Camada de velocidade', opacityUpdated: 'Opacidade dos ícones ajustada para', updatingSettingsTab: 'Atualizando aba de configurações...', languageDefined: 'Idiomas definidos.', checkingVersion: 'Verificando a versão do plugin.', insufficientGeometryAngleCalc: 'Geometria insuficiente para cálculo de ângulo.' } }; break; case 'pt-PT': // Portuguese (Portugal) this.spdTranslations = { name: 'Exibição de Velocidade', settingTabName: 'Configurações de Exibição de Velocidade', enabled: 'ativado', disabled: 'desativado', zoomOut: 'Mais afastado', zoomIn: 'Mais próximo', changelog: 'Registro de alterações', changelogMessage: '<h6>Novidades:</h6><ul style="margin-bottom: 10px"><li>Agora o ícone de velocidade é exibido na direção correta de cada sentido e acompanha em perpendicular a angulação do ponto médio de cada segmento.</li></ul><h6>Correções:</h6><ul><li>Pequenas correções e melhorias de código.</li></ul>', close: 'Fechar', viewScript: 'Ver script', showDialog: 'Exibir modal', title: { general: 'Geral', showOnRoadType: 'Exibir nos segmentos do tipo:' }, label: { displaySpeeds: 'Exibir velocidades', showNoSpeed: 'Exibir em segmentos sem velocidade', showOnRoundabout: 'Exibir em rotatórias', showOnUnpaved: 'Exibir em via não pavimentada', maxZoom: 'Renderizar até o nível de zoom máximo:', toggleLayerShortcut: 'Alternar o interruptor de camada para mostrar a velocidade' }, btn: { updateSettingsTab: 'Atualizar menu', }, log: { wmeReadyStartScript: 'WME carregado e pronto. Iniciando script...', waitingWme: 'Aguardando o WME estar pronto...', wmeReadyStartingPlugin: 'WME está pronto. Configurando camada personalizada...', shortSleep: 'Aguardando cerca de 1 segundo para tudo carregar...', updateMapDisplay: 'Atualizando a exibição no mapa...', maxZoomExceeded: 'Zoom máximo excedido. Nenhuma velocidade será exibida.', noneSegment: 'Nenhum segmento encontrado.', numSegmentsLoaded: 'Total de segmentos carregados:', attributesNotFound: 'Não foi possível encontrar os atributos ou estão ausentes no segmento', disallowedSegment: 'Este tipo de segmento não deve ser carregado.', invalidGeometry: 'Geometria inválida no segmento:', updateMapDisplayFinished: 'Atualização concluída.', shortCutDialogNotFound: 'Não foi possível encontrar a janela de atalhos do teclado. A tentar novamente...', houseNumberCheckboxNotFound: 'A caixa de seleção "Números das Casas" não foi encontrada. Tentando novamente...', scriptsTabNotFound: 'Painel de scripts não encontrado. Tentando novamente...', settingsTabAdded: 'Aba de configurações adicionada.', speedLayer: 'Camada de velocidade', opacityUpdated: 'Opacidade dos ícones ajustada para', updatingSettingsTab: 'Atualizando aba de configurações...', languageDefined: 'Idioma definido.', checkingVersion: 'Verificando a versão do plugin.', insufficientGeometryAngleCalc: 'Geometria insuficiente para cálculo de ângulo.' } }; break; case 'ro': // Romanian this.spdTranslations = { name: 'Afisare viteza', settingTabName: 'Setări Afisare Viteza', enabled: 'activat', disabled: 'dezactivat', zoomOut: 'Zoom iesire', zoomIn: 'Zoom intrare', changelog: 'Jurnal modificari', changelogMessage: '<h6>Funcții noi:</h6><ul style="margin-bottom: 10px"><li>Iconița de viteză este acum afișată în direcția corectă pentru fiecare bandă și urmează unghiul perpendicular al punctului median al fiecărui segment.</li></ul><h6>Corecturi:</h6><ul><li>Corecturi minore și îmbunătățiri ale codului.</li></ul>', close: 'Închide', viewScript: 'Vezi script', showDialog: 'Afișează fereastra modală', title: { general: 'General', showOnRoadType: 'Afișează pe tipuri de drum:' }, label: { displaySpeeds: 'Afișează viteze', showNoSpeed: 'Afișează pe segmente fără viteză', showOnRoundabout: 'Afișează pe sensuri giratorii', showOnUnpaved: 'Afișează pe drum nepavat', maxZoom: 'Renderizează până la zoom maxim:', toggleLayerShortcut: 'Comuta comutatorul de strat pentru a afișa viteza' }, btn: { updateSettingsTab: 'Actualizează meniul', }, log: { wmeReadyStartScript: 'WME încărcat și gata. Pornesc scriptul...', waitingWme: 'Aștept ca WME să fie gata...', wmeReadyStartingPlugin: 'WME este gata. Setez stratul personalizat...', shortSleep: 'Aștept aproximativ 1 secundă pentru ca totul să se încarce...', updateMapDisplay: 'Actualizez afișarea pe hartă...', maxZoomExceeded: 'Zoom maxim depășit. Viteza nu va fi afișată.', noneSegment: 'Nu au fost găsite segmente.', numSegmentsLoaded: 'Număr total de segmente încărcate:', attributesNotFound: 'Atributele nu au fost găsite sau lipsesc în segment', disallowedSegment: 'Acest tip de segment nu ar trebui să fie încărcat.', invalidGeometry: 'Geometrie invalidă pe segment:', updateMapDisplayFinished: 'Actualizarea a fost finalizată.', shortCutDialogNotFound: 'Nu s-a putut găsi caseta de dialog a comenzilor rapide de la tastatură. Încerc din nou...', houseNumberCheckboxNotFound: 'Checkbox-ul "Numerele caselor" nu a fost găsit. Încerc din nou...', scriptsTabNotFound: 'Tab-ul de scripturi nu a fost găsit. Încerc din nou...', settingsTabAdded: 'Tab-ul de setări a fost adăugat.', speedLayer: 'Strat de viteză', opacityUpdated: 'Opacitatea iconițelor a fost setată la', updatingSettingsTab: 'Actualizare tab de setări...', languageDefined: 'Limbi definite.', checkingVersion: 'Verificare versiune plugin.', insufficientGeometryAngleCalc: 'Geometrie insuficientă pentru calculul unghiului.' } }; break; case 'ru': // Russian this.spdTranslations = { name: 'Отображение скорости', settingTabName: 'Настройки отображения скорости', enabled: 'включено', disabled: 'выключено', zoomOut: 'Отдалить', zoomIn: 'Приблизить', changelog: 'Журнал изменений', changelogMessage: '<h6>Новые возможности:</h6><ul style="margin-bottom: 10px"><li>Иконка скорости теперь отображается в правильном направлении для каждой полосы и соответствует перпендикулярному углу средней точки каждого сегмента.</li></ul><h6>Исправления:</h6><ul><li>Мелкие исправления и улучшения кода.</li></ul>', close: 'Закрыть', viewScript: 'Просмотреть скрипт', showDialog: 'Показать модальное окно', title: { general: 'Общие', showOnRoadType: 'Отображать на сегментах типа:' }, label: { displaySpeeds: 'Отображать скорости', showNoSpeed: 'Показывать на сегменте без скорости', showOnRoundabout: 'Показывать на круговом движении', showOnUnpaved: 'Показать на грунтовой дороге', maxZoom: 'Отображать до уровня зума:', toggleLayerShortcut: 'Переключить переключатель слоя для отображения скорости' }, btn: { updateSettingsTab: 'Обновить меню', }, log: { wmeReadyStartScript: 'WME загружен и готов. Запуск скрипта...', waitingWme: 'Ожидание готовности WME...', wmeReadyStartingPlugin: 'WME готово. Настройка пользовательского слоя...', shortSleep: 'Ожидание около 1 секунды, пока все загрузится...', updateMapDisplay: 'Обновление отображения на карте...', maxZoomExceeded: 'Превышен максимальный уровень зума. Скорость отображаться не будет.', noneSegment: 'Сегменты не найдены.', numSegmentsLoaded: 'Общее количество загруженных сегментов:', attributesNotFound: 'Не удалось найти атрибуты или они отсутствуют в сегменте', disallowedSegment: 'Этот тип сегмента не должен загружаться.', invalidGeometry: 'Неверная геометрия в сегменте:', updateMapDisplayFinished: 'Обновление завершено.', shortCutDialogNotFound: 'Не удалось найти диалоговое окно клавиш быстрого доступа. Повторная попытка...', houseNumberCheckboxNotFound: 'Не найден флажок "Номера домов". Попробую снова...', scriptsTabNotFound: 'Вкладка скриптов не найдена. Попробую снова...', settingsTabAdded: 'Вкладка настроек добавлена.', speedLayer: 'Слой скорости', opacityUpdated: 'Прозрачность значков обновлена до', updatingSettingsTab: 'Обновление вкладки настроек...', languageDefined: 'Языки определены.', checkingVersion: 'Проверка версии плагина.', insufficientGeometryAngleCalc: 'Недостаточная геометрия для расчета угла.' } }; break; case 'sk': // Slovak this.spdTranslations = { name: 'Zobrazenie rýchlosti', settingTabName: 'Nastavenia zobrazenia rýchlosti', enabled: 'povolené', disabled: 'zakázané', zoomOut: 'Oddialiť', zoomIn: 'Priblížiť', changelog: 'Záznam zmien', changelogMessage: '<h6>Novinky:</h6><ul style="margin-bottom: 10px"><li>Ikona rýchlosti sa teraz zobrazuje v správnom smere pre každý pruh a sleduje kolmé uhly stredového bodu každého segmentu.</li></ul><h6>Opravy:</h6><ul><li>Malé opravy a vylepšenia kódu.</li></ul>', close: 'Zavrieť', viewScript: 'Prezrieť skript', showDialog: 'Zobraziť modálne okno', title: { general: 'Všeobecné', showOnRoadType: 'Zobraziť na type cesty:' }, label: { displaySpeeds: 'Zobraziť rýchlosti', showNoSpeed: 'Zobraziť na segmentoch bez rýchlosti', showOnRoundabout: 'Zobraziť na okružnej križovatke', showOnUnpaved: 'Zobraziť na nespevnenej ceste', maxZoom: 'Zobraziť až po maximálne priblíženie:', toggleLayerShortcut: 'Prepínač vrstvy pre zobrazenie rýchlosti' }, btn: { updateSettingsTab: 'Aktualizovať menu', }, log: { wmeReadyStartScript: 'WME načítané a pripravené. Spúšťam skript...', waitingWme: 'Čakám, kým bude WME pripravené...', wmeReadyStartingPlugin: 'WME je pripravené. Nastavujem vlastnú vrstvu...', shortSleep: 'Čakám približne 1 sekundu, kým sa všetko načíta...', updateMapDisplay: 'Aktualizujem zobrazenie mapy...', maxZoomExceeded: 'Maximálne priblíženie bolo prekročené. Rýchlosť sa nebude zobrazovať.', noneSegment: 'Neboli nájdené žiadne segmenty.', numSegmentsLoaded: 'Celkový počet načítaných segmentov:', attributesNotFound: 'Atribúty neboli nájdené alebo chýbajú v segmente', disallowedSegment: 'Tento typ segmentu by nemal byť načítaný.', invalidGeometry: 'Neplatná geometria v segmente:', updateMapDisplayFinished: 'Aktualizácia dokončená.', shortCutDialogNotFound: 'Dialóg klávesových skratiek sa nepodarilo nájsť. Skúšam znova...', houseNumberCheckboxNotFound: 'Zaškrtávacie políčko "Čísla domov" nebolo nájdené. Pokúšam sa znova...', scriptsTabNotFound: 'Záložka skriptov nebola nájdená. Pokúšam sa znova...', settingsTabAdded: 'Pridaná záložka nastavení.', speedLayer: 'Vrstva rýchlosti', opacityUpdated: 'Priehľadnosť ikon nastavená na', updatingSettingsTab: 'Aktualizujem záložku nastavení...', languageDefined: 'Jazyky definované.', checkingVersion: 'Kontrola verzie pluginu.', insufficientGeometryAngleCalc: 'Nedostatočná geometria na výpočet uhla.' } }; break; case 'sl': // Slovenian this.spdTranslations = { name: 'Prikaz hitrosti', settingTabName: 'Nastavitve prikaza hitrosti', enabled: 'omogočeno', disabled: 'onemogočeno', zoomOut: 'Oddaljiti', zoomIn: 'Povečati', changelog: 'Zapis sprememb', changelogMessage: '<h6>Novosti:</h6><ul style="margin-bottom: 10px"><li>Ikona hitrosti se zdaj prikazuje v pravilnem smeru za vsak pas in sledi pravokotni kot sredinske točke vsakega segmenta.</li></ul><h6>Popravki:</h6><ul><li>Manjše popravke in izboljšave kode.</li></ul>', close: 'Zapri', viewScript: 'Ogledaj skript', showDialog: 'Prikaži modalno okno', title: { general: 'Splošno', showOnRoadType: 'Prikaz na segmentih tipa:' }, label: { displaySpeeds: 'Prikaz hitrosti', showNoSpeed: 'Prikaz na segmentih brez hitrosti', showOnRoundabout: 'Prikaz na krožišču', showOnUnpaved: 'Prikaži na neutrjeni cesti', maxZoom: 'Upodabljanje do največje stopnje povečave:', toggleLayerShortcut: 'Preklopite preklopnik plasti za prikaz hitrosti' }, btn: { updateSettingsTab: 'Posodobi meni', }, log: { wmeReadyStartScript: 'WME je naložen in pripravljen. Začenjam skripto...', waitingWme: 'Čakam, da se WME pripravi...', wmeReadyStartingPlugin: 'WME je pripravljen. Nastavljam prilagojen sloj...', shortSleep: 'Čakam približno 1 sekundo, da se vse naloži...', updateMapDisplay: 'Posodabljam prikaz na zemljevidu...', maxZoomExceeded: 'Maksimalna stopnja povečave je bila presežena. Hitrost ne bo prikazana.', noneSegment: 'Noben segment ni bil najden.', numSegmentsLoaded: 'Skupno število naloženih segmentov:', attributesNotFound: 'Atributi niso bili najdeni ali manjkajo na segmentu', disallowedSegment: 'Ta vrsta segmenta ne sme biti naložena.', invalidGeometry: 'Neveljavna geometrija na segmentu:', updateMapDisplayFinished: 'Posodobitev zaključena.', shortCutDialogNotFound: 'Ni bilo mogoče najti pogovornega okna bližnjic na tipkovnici. Poskušam znova...', houseNumberCheckboxNotFound: 'Polje za označevanje "Hišne številke" ni bilo najdeno. Poskušam znova...', scriptsTabNotFound: 'Zavihek skriptov ni bil najden. Poskušam znova...', settingsTabAdded: 'Zavihek nastavitev je bil dodan.', speedLayer: 'Sloj hitrosti', opacityUpdated: 'Opacnost ikon je bila posodobljena na', updatingSettingsTab: 'Posodabljam zavihek nastavitev...', languageDefined: 'Jezik je bil določen.', checkingVersion: 'Preverjam različico vtičnika.', insufficientGeometryAngleCalc: 'Nezadostna geometrija za izračun kota.' } }; break; case 'sv': // Swedish this.spdTranslations = { name: 'Hastighetsvisning', settingTabName: 'Inställningar för hastighetsvisning', enabled: 'aktiverad', disabled: 'inaktiverad', zoomOut: 'Zooma ut', zoomIn: 'Zooma in', changelog: 'Ändringslogg', changelogMessage: '<h6>Nyheter:</h6><ul style="margin-bottom: 10px"><li>Hastighetsikonen visas nu i rätt riktning för varje körfält och följer den vinkelräta vinkeln på mittpunkten för varje segment.</li></ul><h6>Fixar:</h6><ul><li>Små buggfixar och kodförbättringar.</li></ul>', close: 'Stäng', viewScript: 'Visa skript', showDialog: 'Visa modal', title: { general: 'Allmänt', showOnRoadType: 'Visa på segment av typen:' }, label: { displaySpeeds: 'Visa hastigheter', showNoSpeed: 'Visa på segment utan hastighet', showOnRoundabout: 'Visa på rondell', showOnUnpaved: 'Visa på oändliga väggen', maxZoom: 'Rendera upp till zoom-nivå:', toggleLayerShortcut: 'Växla lageromkopplare för att visa hastighet' }, btn: { updateSettingsTab: 'Uppdatera meny', }, log: { wmeReadyStartScript: 'WME laddad och redo. Startar skriptet...', waitingWme: 'Väntar på att WME ska bli redo...', wmeReadyStartingPlugin: 'WME är redo. Konfigurerar anpassad lager...', shortSleep: 'Väntar cirka 1 sekund innan allt laddas...', updateMapDisplay: 'Uppdaterar visningen på kartan...', maxZoomExceeded: 'Maximal zoomnivå överskriden. Hastighet visas inte.', noneSegment: 'Inga segment hittades.', numSegmentsLoaded: 'Totalt antal laddade segment:', attributesNotFound: 'Kunde inte hitta attribut eller de saknas i segmentet', disallowedSegment: 'Den här typen av segment ska inte laddas.', invalidGeometry: 'Ogiltig geometri i segmentet:', updateMapDisplayFinished: 'Uppdatering slutförd.', shortCutDialogNotFound: 'Nije moguće pronaći dijalog prečica na tastaturi. Pokušavam ponovo...', houseNumberCheckboxNotFound: 'Checkboxen "Husnummer" hittades inte. Försöker igen...', scriptsTabNotFound: 'Fliken för skript hittades inte. Försöker igen...', settingsTabAdded: 'Inställningsflik tillagd.', speedLayer: 'Hastighetslager', opacityUpdated: 'Opaciteten för ikoner har uppdaterats till', updatingSettingsTab: 'Uppdaterar inställningsfliken...', languageDefined: 'Språk definierade.', checkingVersion: 'Kontrollerar plugin-version.', insufficientGeometryAngleCalc: 'Nezadostna geometrija za izračun kota.' } }; break; case 'th': // Thai this.spdTranslations = { name: 'แสดงความเร็ว', settingTabName: 'การตั้งค่าแสดงความเร็ว', enabled: 'เปิดใช้งาน', disabled: 'ปิดการใช้งาน', zoomOut: 'ย่อออก', zoomIn: 'ขยายเข้า', changelog: 'บันทึกการเปลี่ยนแปลง', changelogMessage: '<h6>คุณสมบัติใหม่:</h6><ul style="margin-bottom: 10px"><li>ไอคอนความเร็วแสดงในทิศทางที่ถูกต้องสำหรับแต่ละเลนและตามมุมตั้งฉากของจุดกึ่งกลางของแต่ละส่วน</li></ul><h6>การแก้ไข:</h6><ul><li>การแก้ไขข้อผิดพลาดเล็กน้อยและการปรับปรุงโค้ด</li></ul>', close: 'ปิด', viewScript: 'ดูสคริปต์', showDialog: 'แสดงโมดอล', title: { general: 'ทั่วไป', showOnRoadType: 'แสดงบนประเภทถนน:' }, label: { displaySpeeds: 'แสดงความเร็ว', showNoSpeed: 'แสดงในช่วงที่ไม่มีความเร็ว', showOnRoundabout: 'แสดงในวงเวียน', showOnUnpaved: 'แสดงบนถนนที่ไม่ได้ลาดยาง', maxZoom: 'แสดงจนถึงระดับซูมสูงสุด:', toggleLayerShortcut: 'สลับตัวเลือกเลเยอร์เพื่อแสดงความเร็ว' }, btn: { updateSettingsTab: 'อัปเดตเมนู', }, log: { wmeReadyStartScript: 'WME โหลดเสร็จแล้วและพร้อมใช้งาน กำลังเริ่มสคริปต์...', waitingWme: 'รอให้ WME พร้อมใช้งาน...', wmeReadyStartingPlugin: 'WME พร้อมแล้ว กำลังตั้งค่าชั้นข้อมูลที่กำหนดเอง...', shortSleep: 'รอประมาณ 1 วินาทีให้ทุกอย่างโหลด...', updateMapDisplay: 'กำลังอัปเดตการแสดงผลแผนที่...', maxZoomExceeded: 'ระดับการซูมสูงสุดเกินขีดจำกัด ความเร็วจะไม่แสดง', noneSegment: 'ไม่พบช่วงข้อมูลใด ๆ', numSegmentsLoaded: 'จำนวนช่วงข้อมูลที่โหลดทั้งหมด:', attributesNotFound: 'ไม่พบหรือขาดคุณสมบัติในช่วงข้อมูล', disallowedSegment: 'ไม่ควรโหลดประเภทช่วงข้อมูลนี้', invalidGeometry: 'รูปทรงไม่ถูกต้องในช่วงข้อมูล:', updateMapDisplayFinished: 'การอัปเดตเสร็จสิ้น', shortCutDialogNotFound: 'ไม่พบกล่องโต้ตอบทางลัดของแป้นพิมพ์ กำลังลองอีกครั้ง...', houseNumberCheckboxNotFound: 'ไม่พบช่องทำเครื่องหมาย "หมายเลขบ้าน" กำลังพยายามอีกครั้ง...', scriptsTabNotFound: 'ไม่พบแท็บสคริปต์ กำลังพยายามอีกครั้ง...', settingsTabAdded: 'เพิ่มแท็บการตั้งค่าแล้ว', speedLayer: 'ชั้นข้อมูลความเร็ว', opacityUpdated: 'อัปเดตความโปร่งใสของไอคอนแล้ว:', updatingSettingsTab: 'กำลังอัปเดตแท็บการตั้งค่า...', languageDefined: 'กำหนดภาษาแล้ว', checkingVersion: 'กำลังตรวจสอบเวอร์ชันของปลั๊กอิน', insufficientGeometryAngleCalc: 'เรขาคณิตไม่เพียงพอสำหรับการคำนวณมุม.' } }; break; case 'tr': // Turkish this.spdTranslations = { name: 'Hız Görüntüleme', settingTabName: 'Hız Görüntüleme Ayarları', enabled: 'etkin', disabled: 'devre dışı', zoomOut: 'Daha uzak', zoomIn: 'Daha yakın', changelog: 'Değişiklik Kaydı', changelogMessage: '<h6>Yeni Özellikler:</h6><ul style="margin-bottom: 10px"><li>Hız ikonu artık her şerit için doğru yönde görüntüleniyor ve her segmentin orta noktasının dik açıyla olan yönünü takip ediyor.</li></ul><h6>Düzeltmeler:</h6><ul><li>Küçük kod düzeltmeleri ve iyileştirmeler.</li></ul>', close: 'Kapat', viewScript: 'Kodu gör', showDialog: 'Modalı Göster', title: { general: 'Genel', showOnRoadType: 'Şu yol türlerinde göster:' }, label: { displaySpeeds: 'Hızları göster', showNoSpeed: 'Hızsız segmentlerde göster', showOnRoundabout: 'Dönel kavşaklarda göster', showOnUnpaved: 'Asfaltsız yolda göster', maxZoom: 'Maksimum yakınlaştırma seviyesine kadar renderle:', toggleLayerShortcut: 'Katman anahtarı hız görüntüsünü değiştirme' }, btn: { updateSettingsTab: 'Menüyü güncelle', }, log: { wmeReadyStartScript: 'WME yüklendi ve hazır. Script başlatılıyor...', waitingWme: 'WME\'nin hazır olmasını bekliyorum...', wmeReadyStartingPlugin: 'WME hazır. Özel katman kuruluyor...', shortSleep: 'Her şeyin yüklenmesi için yaklaşık 1 saniye bekliyorum...', updateMapDisplay: 'Harita görüntüsünü güncelliyorum...', maxZoomExceeded: 'Maksimum yakınlaştırma aşılabilir. Hız gösterilmeyecek.', noneSegment: 'Hiçbir segment bulunamadı.', numSegmentsLoaded: 'Yüklenen segmentlerin toplam sayısı:', attributesNotFound: 'Atributlar bulunamadı veya segmentte eksik', disallowedSegment: 'Bu tür segmentler yüklenmemelidir.', invalidGeometry: 'Segmentte geçersiz geometri:', updateMapDisplayFinished: 'Güncelleme tamamlandı.', shortCutDialogNotFound: 'Klavye kısayolları iletişim kutusu bulunamadı. Tekrar deneniyor...', houseNumberCheckboxNotFound: '"Ev Numaraları" onay kutusu bulunamadı. Yeniden deneniyor...', scriptsTabNotFound: 'Script sekmesi bulunamadı. Yeniden deneniyor...', settingsTabAdded: 'Ayarlar sekmesi eklendi.', speedLayer: 'Hız Katmanı', opacityUpdated: 'Simge opaklığı şu şekilde ayarlandı:', updatingSettingsTab: 'Ayarlar sekmesi güncelleniyor...', languageDefined: 'Diller tanımlandı.', checkingVersion: 'Plugin sürümü kontrol ediliyor.', insufficientGeometryAngleCalc: 'Açı hesaplaması için yetersiz geometri.' } }; break; case 'uk': // Ukrainian this.spdTranslations = { name: 'Відображення швидкості', settingTabName: 'Налаштування відображення швидкості', enabled: 'увімкнено', disabled: 'вимкнено', zoomOut: 'Віддалити', zoomIn: 'Приблизити', changelog: 'Журнал змін', changelogMessage: '<h6>Новинки:</h6><ul style="margin-bottom: 10px"><li>Іконка швидкості тепер відображається в правильному напрямку для кожної смуги і слідує перпендикулярному куту центральної точки кожного сегмента.</li></ul><h6>Виправлення:</h6><ul><li>Невеликі виправлення та поліпшення коду.</li></ul>', close: 'Закрити', viewScript: 'Переглянути скрипт', showDialog: 'Показати модальне вікно', title: { general: 'Загальні', showOnRoadType: 'Відображати на сегментах типу:' }, label: { displaySpeeds: 'Відображати швидкості', showNoSpeed: 'Показувати на сегменті без швидкості', showOnRoundabout: 'Показувати на круговому русі', showOnUnpaved: 'Показати на ґрунтовій дорозі', maxZoom: 'Рендерити до рівня масштабування:', toggleLayerShortcut: 'Перемикач шару для відображення швидкості' }, btn: { updateSettingsTab: 'Оновити меню', }, log: { wmeReadyStartScript: 'WME завантажено та готове. Запуск скрипта...', waitingWme: 'Очікуємо, поки WME стане готовим...', wmeReadyStartingPlugin: 'WME готове. Налаштування кастомного шару...', shortSleep: 'Чекаємо близько 1 секунди, поки все завантажиться...', updateMapDisplay: 'Оновлення відображення на карті...', maxZoomExceeded: 'Максимальний рівень масштабування перевищено. Швидкість не буде відображена.', noneSegment: 'Сегменти не знайдено.', numSegmentsLoaded: 'Загальна кількість завантажених сегментів:', attributesNotFound: 'Не вдалося знайти атрибути або вони відсутні в сегменті', disallowedSegment: 'Цей тип сегмента не повинен завантажуватися.', invalidGeometry: 'Невірна геометрія в сегменті:', updateMapDisplayFinished: 'Оновлення завершено.', shortCutDialogNotFound: 'Не вдалося знайти діалогове вікно комбінацій клавіш. Спроба знову...', houseNumberCheckboxNotFound: 'Не знайдено чекбокс "Номери будинків". Спробую ще раз...', scriptsTabNotFound: 'Не знайдена вкладка скриптів. Спробую ще раз...', settingsTabAdded: 'Вкладку налаштувань додано.', speedLayer: 'Шар швидкості', opacityUpdated: 'Прозорість значків оновлено до', updatingSettingsTab: 'Оновлення вкладки налаштувань...', languageDefined: 'Мови визначено.', checkingVersion: 'Перевірка версії плагіна.', insufficientGeometryAngleCalc: 'Недостатньо геометрії для обчислення кута.' } }; break; case 'vi': // Vietnamese this.spdTranslations = { name: 'Hiển thị Tốc độ', settingTabName: 'Cài đặt Hiển thị Tốc độ', enabled: 'đã bật', disabled: 'đã tắt', zoomOut: 'Thu nhỏ', zoomIn: 'Phóng to', changelog: 'Lịch sử thay đổi', changelogMessage: '<h6>Tính năng mới:</h6><ul style="margin-bottom: 10px"><li>Biểu tượng tốc độ hiện hiển thị đúng hướng cho mỗi làn đường và theo góc vuông của điểm giữa mỗi đoạn đường.</li></ul><h6>Khắc phục lỗi:</h6><ul><li>Các sửa lỗi nhỏ và cải tiến mã nguồn.</li></ul>', close: 'Đóng', viewScript: 'Xem Script', showDialog: 'Hiển thị hộp thoại', title: { general: 'Chung', showOnRoadType: 'Hiển thị trên các đoạn đường loạ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 chưa lát', maxZoom: 'Render tới mức thu phóng tối đa:', toggleLayerShortcut: 'Chuyển đổi công tắc lớp hiển thị tốc độ' }, btn: { updateSettingsTab: 'Cập nhật menu', }, log: { wmeReadyStartScript: 'WME đã tải xong và sẵn sàng. Bắt đầu chạy script...', waitingWme: 'Đang chờ WME sẵn sàng...', wmeReadyStartingPlugin: 'WME đã sẵn sàng. Đang cấu hình lớp tùy chỉnh...', shortSleep: 'Đang chờ khoảng 1 giây để mọi thứ tải xong...', updateMapDisplay: 'Đang cập nhật hiển thị trên bản đồ...', maxZoomExceeded: 'Vượt quá mức thu phóng tối đa. Không có tốc độ nào sẽ được hiển thị.', noneSegment: 'Không tìm thấy đoạn đường nào.', numSegmentsLoaded: 'Tổng số đoạn đường đã tải:', attributesNotFound: 'Không thể tìm thấy các thuộc tính hoặc chúng đang thiếu trên đoạn đường', disallowedSegment: 'Đoạn đường loại này không nên được tải.', invalidGeometry: 'Hình học không hợp lệ trên đoạn đường:', updateMapDisplayFinished: 'Cập nhật hoàn tất.', shortCutDialogNotFound: 'Không tìm thấy hộp thoại phím tắt. Đang thử lại...', houseNumberCheckboxNotFound: 'Không tìm thấy checkbox "Số nhà". Đang thử lại...', scriptsTabNotFound: 'Không tìm thấy tab scripts. Đang thử lại...', settingsTabAdded: 'Đã thêm tab cài đặt.', speedLayer: 'Lớp tốc độ', opacityUpdated: 'Độ mờ của các biểu tượng đã được cập nhật thành', updatingSettingsTab: 'Đang cập nhật tab cài đặt...', languageDefined: 'Ngôn ngữ đã được xác định.', checkingVersion: 'Đang kiểm tra phiên bản plugin.', insufficientGeometryAngleCalc: 'Hình học không đủ để tính toán góc.' } }; break; case 'zh': // Chinese this.spdTranslations = { name: '速度显示', settingTabName: '速度显示设置', enabled: '启用', disabled: '禁用', zoomOut: '缩小', zoomIn: '放大', changelog: '更新日志', changelogMessage: '<h6>新功能:</h6><ul style="margin-bottom: 10px"><li>速度图标现在在每个车道的正确方向上显示,并跟随每个路段中点的垂直角度。</li></ul><h6>修复:</h6><ul><li>小的代码修正和改进。</li></ul>', close: '关闭', viewScript: '查看脚本', showDialog: '显示模态框', title: { general: '一般', showOnRoadType: '显示在以下道路类型:' }, label: { displaySpeeds: '显示速度', showNoSpeed: '在无速度的段落中显示', showOnRoundabout: '在环形交叉口显示', showOnUnpaved: '在未铺砌道路上显示', maxZoom: '渲染直到最大缩放级别:', toggleLayerShortcut: '切换图层切换器速度显示' }, btn: { updateSettingsTab: '更新菜单', }, log: { wmeReadyStartScript: 'WME已加载并准备就绪,开始脚本...', waitingWme: '等待WME准备好...', wmeReadyStartingPlugin: 'WME已准备好,开始设置自定义层...', shortSleep: '等待大约1秒钟,等待所有内容加载...', updateMapDisplay: '更新地图显示...', maxZoomExceeded: '已超出最大缩放级别,无法显示速度。', noneSegment: '没有找到任何段落。', numSegmentsLoaded: '已加载的段落总数:', attributesNotFound: '无法找到属性或该段落缺失', disallowedSegment: '不应加载此类型的段落。', invalidGeometry: '段落中有无效的几何形状:', updateMapDisplayFinished: '更新完成。', shortCutDialogNotFound: '无法找到键盘快捷键对话框。正在重试...', houseNumberCheckboxNotFound: '未找到“房屋号码”复选框,正在重试...', scriptsTabNotFound: '未找到脚本标签,正在重试...', settingsTabAdded: '已添加设置标签。', speedLayer: '速度层', opacityUpdated: '图标透明度已设置为', updatingSettingsTab: '正在更新设置标签...', languageDefined: '已定义语言。', checkingVersion: '正在检查插件版本。', insufficientGeometryAngleCalc: '几何图形不足以计算角度。' } }; break; case 'zh-TW': // Traditional Chinese this.spdTranslations = { name: '速度顯示', settingTabName: '速度顯示設定', enabled: '啟用', disabled: '停用', zoomOut: '縮小', zoomIn: '放大', changelog: '更新記錄', changelogMessage: '<h6>新功能:</h6><ul style="margin-bottom: 10px"><li>速度圖示現在會顯示在每個車道的正確方向,並跟隨每個路段中點的垂直角度。</li></ul><h6>修正:</h6><ul><li>一些小的修正和代碼改進。</li></ul>', close: '關閉', viewScript: '查看腳本', showDialog: '顯示模態窗口', title: { general: '一般', showOnRoadType: '顯示在以下路段類型:' }, label: { displaySpeeds: '顯示速度', showNoSpeed: '顯示在無速度的路段', showOnRoundabout: '顯示在環形交叉路口', showOnUnpaved: '在未鋪設道路上顯示', maxZoom: '渲染至最大縮放層級:', toggleLayerShortcut: '切換圖層切換器速度顯示' }, btn: { updateSettingsTab: '更新選單', }, log: { wmeReadyStartScript: 'WME 已加載並準備好。開始執行腳本...', waitingWme: '等待 WME 準備好...', wmeReadyStartingPlugin: 'WME 已準備好。設定自訂圖層...', shortSleep: '等待約 1 秒讓所有內容加載...', updateMapDisplay: '更新地圖顯示...', maxZoomExceeded: '已超過最大縮放層級。將不顯示速度。', noneSegment: '未找到任何路段。', numSegmentsLoaded: '已加載的路段總數:', attributesNotFound: '未能找到屬性或屬性在該路段中缺失', disallowedSegment: '此類型路段不應加載。', invalidGeometry: '該路段的幾何圖形無效:', updateMapDisplayFinished: '更新完成。', shortCutDialogNotFound: '找不到鍵盤快捷鍵對話框。正在重試...', houseNumberCheckboxNotFound: '未找到「門牌號碼」選項框。正在重新嘗試...', scriptsTabNotFound: '未找到腳本選項卡。正在重新嘗試...', settingsTabAdded: '已添加設定選項卡。', speedLayer: '速度層', opacityUpdated: '圖示不透明度已更新為', updatingSettingsTab: '正在更新設定選項卡...', languageDefined: '語言已設定。', checkingVersion: '正在檢查插件版本。', insufficientGeometryAngleCalc: '幾何圖形不足以計算角度。' } }; break; default: // Default language (english) this.spdTranslations = { name: 'Speed Display', settingTabName: 'Speed Display Settings', enabled: 'enabled', disabled: 'disabled', zoomOut: 'Zoom out', zoomIn: 'Zoom in', changelog: 'Changelog', changelogMessage: '<h6>New features:</h6><ul style="margin-bottom: 10px"><li>The speed icon is now displayed in the correct direction for each lane, and follows the perpendicular angle of the midpoint of each segment.</li></ul><h6>Fixes:</h6><ul><li>Minor code fixes and improvements.</li></ul>', close: 'Close', viewScript: 'View script', showDialog: 'Show dialog', title: { general: 'General', showOnRoadType: 'Display on segments of type:' }, label: { displaySpeeds: 'Display speeds', showNoSpeed: 'Show on segment with no speed', showOnRoundabout: 'Show on roundabout', showOnUnpaved: 'Show on unpaved road', maxZoom: 'Render up to zoom level:', toggleLayerShortcut: 'Toggle layer switcher speed display' }, btn: { updateSettingsTab: 'Update menu', }, log: { wmeReadyStartScript: 'WME loaded and ready. Starting script...', waitingWme: 'Waiting for WME to be ready...', wmeReadyStartingPlugin: 'WME is ready. Setting up custom layer...', shortSleep: 'Waiting about 1 second for everything to load...', updateMapDisplay: 'Updating display on the map...', maxZoomExceeded: 'Maximum zoom exceeded. No speed will be displayed.', noneSegment: 'No segments found.', numSegmentsLoaded: 'Total segments loaded:', attributesNotFound: 'Could not find attributes or they are missing in the segment', disallowedSegment: 'This type of segment should not be loaded.', invalidGeometry: 'Invalid geometry in segment:', updateMapDisplayFinished: 'Update completed.', shortCutDialogNotFound: 'Could not find the keyboard shortcuts dialog. Trying again...', houseNumberCheckboxNotFound: 'The "House Numbers" checkbox was not found. Trying again...', settingsTabAdded: 'Settings tab added.', settingsTabAdded: 'Aba de configurações adicionada.', speedLayer: 'Speed layer', opacityUpdated: 'Icon opacity adjusted to', updatingSettingsTab: 'Updating settings tab...', languageDefined: 'Languages defined.', checkingVersion: 'Checking plugin version.', insufficientGeometryAngleCalc: 'Insufficient geometry for angle calculation.' } }; break; }; this.logDebug(this.spdTranslations.log.languageDefined); } } new WmeSpeedDisplay();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址