// ==UserScript==
// @name WME Speed Display
// @name:pt-BR WME Exibição de Velocidade
// @namespace https://greasyfork.org/scripts/526702-wme-speed-display/
// @version 2.1.1
// @description Displays road speed directly in the center of the segment (taking curves into account) in Waze Map Editor
// @description:pt-BR Exibe a velocidade da via diretamente no centro do segmento (levando em consideração as curvas) no Waze Map Editor
// @author Luan Tavares
// @icon data:image/png;base64,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vLDwG/eE8/s3BCkeAAAACXBIWXMAAC4jAAAuIwF4pT92AAADbGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjxkYzpjcmVhdG9yPjxyZGY6U2VxIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpsaT5MdWFuIFRhdmFyZXM8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+PGV4aWY6RGF0ZVRpbWVPcmlnaW5hbD4yMDI1LTAzLTA1VDEzOjEyOjQ0LjUxMDwvZXhpZjpEYXRlVGltZU9yaWdpbmFsPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj48eG1wOkNyZWF0ZURhdGU+MjAyNS0wMy0wNVQxMzoxMjo0NC41MTA8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/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
// @license GPLv3
// @include https://www.waze.com/editor*
// @include https://www.waze.com/*/editor*
// @include https://beta.waze.com/*
// @exclude https://www.waze.com/user/editor*
// @grant none
// ==/UserScript==
/*
* @todo:
* Check a way to get all road types and groups automatically
* Script layer switch is not loading based on the saved setting, it is always false in the new SDK
* When I change the layer switch it does not toggle the layer on and off in the new SDK
* Change "Hide in segments smaller than" so that it applies transparency instead of ignoring the icon
* There is a snackbar that makes my wrapper go up and not go down anymore. Identify what it is and fix it
*/
/* global I18n */
/* global getWmeSdk */
// TODO: Remove this when SDK migration is complete
/* global W */
class WmeSpeedDisplay {
constructor() {
this.version = '2.1.1';
this.debugMode = false;
this.needResetSettings = false;
this.settings = {};
this.zIndex = {
min: 2065,
max: 6500,
warn: 3000,
warnDisplayed: false
};
this.segmentsCategories = {
highways: [
{
id: 3,
name: 'freeway'
},
{
id: 4,
name: 'ramp'
},
{
id: 6,
name: 'major_highway'
},
{
id: 7,
name: 'minor_highway'
}
],
non_drivable: [
{
id: 18,
name: 'railroad'
},
{
id: 19,
name: 'runway_taxiway'
}
],
other_drivable: [
{
id: 8,
name: 'off_road_not_maintained'
},
{
id: 20,
name: 'parking_lot_road'
},
{
id: 17,
name: 'private_road'
},
{
id: 15,
name: 'ferry'
}
],
streets: [
{
id: 2,
name: 'primary_street'
},
{
id: 1,
name: 'street'
},
{
id: 22,
name: 'narrow_street'
}
]
};
this.theme = [
'default',
'altViennaConv',
'japan',
'northAmerica',
'sacu',
'uk',
];
this.wmeTranslations = I18n.translations[I18n.locale];
this.spdTranslations = this.wmeTranslations.wmeSpd = {};
this.debounce = {
updateMapDisplay: this.debounce(this.updateMapDisplay.bind(this), 800),
saveSettings: this.debounce(this.saveSettings.bind(this)),
onZindexFieldChanged: this.debounce(this.onZindexFieldChanged.bind(this), 1000),
onSpeedFilterChanged: this.debounce(this.onSpeedFilterChanged.bind(this), 500),
onSettingsChange: this.debounce(this.onSettingsChange.bind(this), 500)
};
this.channel = new BroadcastChannel('wmeSpeedDisplay');
this.layerName = 'wme-speed-display-layer';
// TODO: Remove this when SDK migration is complete
this.layerCheckbox = {
roadGroup: null,
speedDisplay: null
};
this.snackbarWrapper;
this.displaySpeedsSwitch;
this.wmeSdk;
this.layer;
// TODO: SDK migration
// this.layerSwitcherElement;
this.prepareAndInitialize();
}
/**
* Checks if WME is ready to initializes the plugin.
*/
prepareAndInitialize() {
this.defineSettings();
this.defineTranslations();
this.wmeSdk = getWmeSdk({
scriptId: 'wme-speed-display',
scriptName: this.getTranslation('name')
});
this.wmeSdk.Events.once({
eventName: 'wme-ready'
}).then(this.initializePlugin.bind(this));
}
/**
* Initializes the plugin.
*/
async initializePlugin() {
this.logDebug('WME loaded and ready. Starting script...', true);
// TODO: Remove this when SDK migration is complete
this.layer = new OpenLayers.Layer.Vector(this.layerName, {
displayInLayerSwitcher: false,
rendererOptions: {zIndexing: true}
});
// TODO: SDK migration
// this.layer = this.wmeSdk.Map.addLayer({
// layerName: this.layerName,
// displayName: this.getTranslation('name'),
// shouldDisplayInLayerSwitcher: true,
// // styleRules: [
// // {
// // predicate: featureProperties => featureProperties.isHighlighted,
// // style: {
// // strokeColor: 'yellow',
// // strokeWidth: 10,
// // },
// // },
// // {
// // style: { // Default style
// // strokeColor: 'lightgray',
// // strokeWidth: 5,
// // },
// // }
// // ]
// });
// this.wmeSdk.LayerSwitcher.addLayerCheckbox({name: this.getTranslation('name')});
// this.getLayerSwitcher();
// TODO: SDK migration - end
this.setZIndex();
// TODO: Remove this when SDK migration is complete
W.map.addLayer(this.layer);
this.addLayerCheckbox();
// TODO: Remove this when SDK migration is complete - end
this.createSnackbarWrapper();
this.observeAllOriginalSnackbars();
await this.addSettingsTab();
this.updateSettingsElementsStates();
this.addShortcut();
this.addStyle();
this.checkVersionAndShowChangelog();
this.listen();
this.logDebug('Waiting about 1 second for everything to load...');
await this.sleep(1000);
this.preUpdateMapDisplay();
}
/**
* Method that listens to this script events.
*/
listen() {
this.channel.addEventListener('message', this.onChannelMessage.bind(this));
this.wmeSdk.Events.on({
eventName: 'wme-map-move-end',
eventHandler: this.preUpdateMapDisplay.bind(this),
});
this.wmeSdk.Events.on({
eventName: 'wme-map-zoom-changed',
eventHandler: this.preUpdateMapDisplay.bind(this),
});
// TODO: Remove this when SDK migration is complete
W.model.segments.on('objectschanged', this.preUpdateMapDisplay.bind(this));
// TODO: SDK migration
// this.wmeSdk.Events.trackDataModelEvents({dataModelName: 'segments'});
// this.wmeSdk.Events.on({
// eventName: 'wme-data-model-objects-changed',
// eventHandler: this.preUpdateMapDisplay.bind(this),
// });
// TODO: SDK migration - end
this.wmeSdk.Events.on({
eventName: 'wme-user-settings-changed',
eventHandler: this.onUserSettingsChanged.bind(this),
});
this.wmeSdk.Events.on({
eventName: 'wme-map-data-loaded',
eventHandler: this.preUpdateMapDisplay.bind(this),
});
// TODO: SDK migration
// this.wmeSdk.Events.on({
// eventName: 'wme-layer-checkbox-toggled',
// eventHandler: this.onLayerSwitcherToggled.bind(this),
// });
}
/**
* Saves the settings and updates the map display.
*/
async onSettingsChange() {
await this.debounce.saveSettings();
this.preUpdateMapDisplay();
}
/**
* Updates the max zoom value display and triggers map update if the zoom level reaches the max.
* @param {Event} event
*/
async onSettingZoomChanged(event) {
let zoomLevel = this.wmeSdk.Map.getZoomLevel();
let newMaxZoom = parseInt(event.target.value, 10);
let prevMaxZoom = this.settings.general.spdMaxZoom;
document.getElementById('spd-max-zoom-value').innerText = newMaxZoom;
await this.debounce.saveSettings();
let wasVisible = prevMaxZoom > zoomLevel;
let shouldBeVisible = newMaxZoom > zoomLevel;
if (wasVisible != shouldBeVisible)
this.preUpdateMapDisplay();
}
/**
* Updates the filter opacity value and triggers map update when opacity changes.
* @param {Event} event
*/
async onSettingOpacityChanged(event) {
document.getElementById('spd-filter-opacity-value').innerText = parseFloat(event.target.value);
await this.debounce.saveSettings();
this.preUpdateMapDisplay();
}
/**
* Handles user settings change.
*/
onUserSettingsChanged() {
let speedUnitTexts = document.querySelectorAll('.spd-filter-speed-unit');
let isImperial = this.wmeSdk.Settings.getUserSettings().isImperial;
document.querySelector('.spd-filter-distance-unit').innerHTML = isImperial ? this.wmeTranslations.units_short.feet : this.wmeTranslations.units_short.meters;
speedUnitTexts.forEach(text => {
text.innerText = isImperial ? I18n.translate('measurements.speed.mi', {speed: ''}) : I18n.translate('measurements.speed.km', {speed: ''});
});
this.preUpdateMapDisplay();
}
/**
* Changes layer's z-index.
* @param {Event} event
*/
increaseOrDecreaseZindex(event) {
let zIndexInput = document.getElementById('spd-layer-zindex');
let decrease = event.target.id == 'spd-btn-zindex-decrease';
let min = this.zIndex.min;
let max = this.zIndex.max;
let currentZindex = parseInt(zIndexInput.value);
if ((decrease && currentZindex > min) || (!decrease && currentZindex < max)) {
zIndexInput.value = decrease ? currentZindex - 100 : currentZindex + 100;
if (!this.zIndex.warnDisplayed)
this.displayZIndexWarning();
this.debounce.saveSettings();
this.setZIndex();
}
}
/**
* Updates z-index input value within allowed range and saves settings with debounce.
*/
onZindexFieldChanged() {
let zIndexInput = document.getElementById('spd-layer-zindex');
let min = this.zIndex.min;
let max = this.zIndex.max;
let value = parseInt(zIndexInput.value, 10) || max;
value = Math.min(Math.max(value, min), max);
zIndexInput.value = value;
this.settings.general.spdLayerZindex = value;
if (!this.zIndex.warnDisplayed)
this.displayZIndexWarning();
this.debounce.saveSettings();
this.setZIndex();
}
/**
* Displays a warning alert if the z-index value exceeds the allowed threshold.
*/
displayZIndexWarning() {
if (parseInt(document.getElementById('spd-layer-zindex')?.value, 10) >= this.zIndex.warn && !this.settings.alertDismissed.infoZindex) {
this.addAlert('info-zindex', this.getTranslation('alertMessage.zIndex'), 'warning');
this.zIndex.warnDisplayed = true;
}
}
/**
* Sets the z-index of the layer.
*/
setZIndex() {
// TODO: Remove this when SDK migration is complete
this.layer.setZIndex(this.settings.general.spdLayerZindex);
// TODO: SDK migration
// this.wmeSdk.Map.setLayerZIndex({
// layerName: this.layerName,
// zIndex: this.settings.general.spdLayerZindex
// });
}
/**
* Resets the z-index of the layer.
*/
resetZindex() {
let zIndexInput = document.getElementById('spd-layer-zindex');
this.settings.general.spdLayerZindex = this.zIndex.min;
zIndexInput.value = this.settings.general.spdLayerZindex;
this.onZindexFieldChanged();
}
/**
* Save alert dismissed.
* @param {Event} event
*/
async onDismissAlert(event) {
let currentDismissedAlertId = this.convertStringCaseStyle('kebab', 'camel', event.target.parentNode.id);
this.settings.alertDismissed[currentDismissedAlertId] = true;
await this.debounce.saveSettings();
let warningGroup = document.getElementById('spd-alert-group');
let allAlertsDismissed = warningGroup.querySelectorAll('wz-alert:not([dismissed]), wz-alert[dismissed="false"]');
if (allAlertsDismissed.length <= 1)
warningGroup.classList.add('d-none');
}
/**
* Validates the speed filter input's and save settings.
* @param {Event} event
*/
onSpeedFilterChanged(event) {
let minSpeed = parseInt(document.getElementById('spd-min-speed').value) || 0;
let maxSpeed = parseInt(document.getElementById('spd-max-speed').value) || 0;
if (maxSpeed > 0 && minSpeed > maxSpeed) {
this.logDebug('Min speed filter can\'t be bigger than the max speed filter.', false, 'error');
this.removeAllSnackbars();
this.addSnackbar('spd-snackbar-error-filtering', `<i class="w-icon w-icon-alert-danger-outline"></i><span><strong>${this.getTranslation('name')}:</strong><br>${this.getTranslation('snackbar.errorFiltering')}</span>`, `<wz-button color="text">${this.wmeTranslations.zoom_in_message.ok}</wz-button>`);
event.target.value = '';
return;
}
this.onSettingsChange();
}
// TODO: SDK migration
/**
* Updates the plugin's enabled state in settings when the corresponding checkbox is toggled and changes the plugin's layer visibility.
* @param {Object} checkboxToggled - The object representing the toggled checkbox.
* @param {boolean} checkboxToggled.checked - Whether the checkbox is checked or not.
* @param {String} checkboxToggled.name - The name of the checkbox (used to identify the plugin's settings).
*/
// async onLayerSwitcherToggled(checkboxToggled) {
// if (checkboxToggled.name == this.getTranslation('name')) {
// await this.debounce.saveSettings();
// this.preUpdateMapDisplay();
// this.toggleLayerVisibility();
// }
// }
/**
* Select the speed display theme.
* @param {Event} event
*/
async onThemeCardClicked(event) {
this.selectThemeCard(event.target);
await this.debounce.saveSettings();
this.preUpdateMapDisplay();
}
/**
* Simulate a click on the speed display layer switcher.
*/
simulateLayerSwitchClick() {
// TODO: Remove this when SDK migration is complete
this.layerCheckbox.speedDisplay.click();
// TODO: SDK migration
// this.layerSwitcherElement.click();
}
/**
* Handles channel messages and sincronizing settings on the others open WME tabs.
* @param {Event} event
*/
onChannelMessage(event) {
switch (event.data) {
case 'saved':
this.defineSettings();
this.updateSettingsElementsStates();
this.preUpdateMapDisplay();
break;
}
// TODO: Remove this when SDK migration is complete (just the function param)
this.toggleLayerVisibility(this.layerCheckbox.roadGroup.checked && this.settings.spdEnabled);
}
// TODO: Remove this when SDK migration is complete
/**
* Saves and updates the map display when WME SPD checkbox change.
* @param {Event} event
*/
onSpeedDisplayCheckboxChange(event) {
this.debounce.saveSettings();
this.preUpdateMapDisplay();
this.toggleLayerVisibility(event.target.checked);
this.displaySpeedsSwitch.checked = event.target.checked;
}
/**
* Updates the layer visibility based on the layer switcher road group state.
*/
onLayerSwithcerGroupRoadChange() {
let roadGroupActived = this.layerCheckbox.roadGroup.checked;
this.toggleLayerVisibility(roadGroupActived && this.settings.spdEnabled);
this.layerCheckbox.speedDisplay.disabled = !roadGroupActived;
this.displaySpeedsSwitch.disabled = !roadGroupActived;
}
// TODO: Remove this when SDK migration is complete - end
/**
* Observes all 'wz-snackbar' elements for changes in children, attributes, or subtree.
*/
observeAllOriginalSnackbars() {
let snackbars = document.querySelectorAll('wz-snackbar');
if (snackbars.length === 0) {
this.logDebug('No "wz-snackbar" found.', false, 'warn');
return;
}
snackbars.forEach(snackbar => {
let observer = new MutationObserver(this.handleMutations.bind(this));
observer.observe(snackbar, {
childList: true,
attributes: true,
subtree: true
});
this.logDebug(`Observing changes in 'wz-snackbar' with class: ${snackbar.classList.value || 'without class'}`);
});
}
/**
* Handles mutations by adjusting 'translate' on 'snackbarWrapper' based on shadowRoot content.
* @param {MutationRecord[]} mutationsList List of observed mutations.
*/
handleMutations(mutationsList) {
mutationsList.forEach((mutation) => {
if (mutation.target.shadowRoot.children.length < 1) {
this.snackbarWrapper.style.translate = '0px -95px';
} else {
this.snackbarWrapper.style.removeProperty('translate');
}
});
}
/**
* Attaches event listeners to the settings elements to track user interactions and changes.
*/
attachSettingsListeners() {
this.displaySpeedsSwitch.addEventListener('change', this.simulateLayerSwitchClick.bind(this));
// Change event -> onSettingsChange
['spd-show-no-speed', 'spd-show-roundabout', 'spd-show-unpaved', 'spd-hide-segment-smaller-than'].forEach(id => {
document.getElementById(id).addEventListener('change', this.onSettingsChange.bind(this));
});
document.getElementById('spd-max-zoom').addEventListener('input', this.onSettingZoomChanged.bind(this));
document.getElementById('spd-filter-opacity').addEventListener('input', this.onSettingOpacityChanged.bind(this));
['spd-btn-zindex-decrease', 'spd-btn-zindex-increase'].forEach(id => {
document.getElementById(id).addEventListener('click', this.increaseOrDecreaseZindex.bind(this));
});
document.getElementById('spd-btn-reset-z-index').addEventListener('click', this.resetZindex.bind(this));
document.getElementById('spd-layer-zindex').addEventListener('input', this.debounce.onZindexFieldChanged.bind(this));
document.getElementById('spd-hide-segment-smaller-than').addEventListener('input', this.onSettingsChange.bind(this));
document.getElementById('spd-min-speed').addEventListener('input', this.debounce.onSpeedFilterChanged.bind(this));
document.getElementById('spd-max-speed').addEventListener('input', this.debounce.onSpeedFilterChanged.bind(this));
document.querySelectorAll('[id^="spd-show-speed-in-"]').forEach(input => {
input.addEventListener('change', this.onSettingsChange.bind(this));
});
document.querySelectorAll('[id^="spd-theme-"]').forEach(card => {
card.addEventListener('click', this.onThemeCardClicked.bind(this));
});
document.getElementById('spd-reset-default-settings').addEventListener('click', this.resetSettings.bind(this));
if (this.debugMode) {
document.getElementById('btn-spd-update-settings-tab').addEventListener('click', this.updateSettingsTab.bind(this));
document.getElementById('btn-spd-test').addEventListener('click', this.addSnackbar.bind(this));
}
document.getElementById('btn-spd-open-changelog-dialog').addEventListener('click', this.openChangelogDialog.bind(this));
}
/**
* Detaches event listeners from the settings elements to stop tracking user interactions.
*/
detachSettingsListeners() {
this.displaySpeedsSwitch.removeEventListener('change', this.simulateLayerSwitchClick.bind(this));
// Change event -> onSettingsChange
['spd-show-no-speed', 'spd-show-roundabout', 'spd-show-unpaved', 'spd-hide-segment-smaller-than'].forEach(id => {
document.getElementById(id).removeEventListener('change', this.onSettingsChange.bind(this));
});
document.getElementById('spd-max-zoom').removeEventListener('input', this.onSettingZoomChanged.bind(this));
document.getElementById('spd-filter-opacity').removeEventListener('input', this.onSettingOpacityChanged.bind(this));
['spd-btn-zindex-decrease', 'spd-btn-zindex-increase'].forEach(id => {
document.getElementById(id).removeEventListener('click', this.increaseOrDecreaseZindex.bind(this));
});
document.getElementById('spd-btn-reset-z-index').removeEventListener('click', this.resetZindex.bind(this));
document.getElementById('spd-layer-zindex').removeEventListener('input', this.debounce.onZindexFieldChanged.bind(this));
document.getElementById('spd-hide-segment-smaller-than').removeEventListener('input', this.onSettingsChange.bind(this));
document.getElementById('spd-min-speed').removeEventListener('input', this.debounce.onSpeedFilterChanged.bind(this));
document.getElementById('spd-max-speed').removeEventListener('input', this.debounce.onSpeedFilterChanged.bind(this));
document.querySelectorAll('[id^="spd-show-speed-in-"]').forEach(input => {
input.removeEventListener('change', this.onSettingsChange.bind(this));
});
document.querySelectorAll('[id^="spd-theme-"]').forEach(card => {
card.removeEventListener('click', this.onThemeCardClicked.bind(this));
});
document.getElementById('spd-reset-default-settings').removeEventListener('click', this.resetSettings.bind(this));
if (this.debugMode) {
document.getElementById('btn-spd-update-settings-tab').removeEventListener('click', this.updateSettingsTab.bind(this));
document.getElementById('btn-spd-test').removeEventListener('click', this.showSpeedDisplayDialog.bind(this));
}
document.getElementById('btn-spd-open-changelog-dialog').removeEventListener('click', this.openChangelogDialog.bind(this));
}
/**
* Attaches listeners to close the dialog.
*/
attachDialogListeners() {
document.addEventListener('keydown', this.simulateBtnHideDialogClick.bind(this));
document.querySelector('#spd-dialog-container .dark-overlay').addEventListener('click', this.simulateBtnHideDialogClick.bind(this), {once: true});
document.getElementById('btn-spd-hide-dialog').addEventListener('click', this.hideSpeedDisplayDialog.bind(this), {once: true});
}
/**
* Updates the map display if the road group checkbox is checked and speed display is enabled, showing a snackbar during the process.
*/
async preUpdateMapDisplay() {
if (!this.layerCheckbox.roadGroup.checked || !this.settings.spdEnabled) {
this.logDebug('Can\'t update the map display.', false, 'warn');
return;
}
let snackbarId = 'spd-snackbar-updating-map';
if (W.map.getZoom() >= this.settings.general.spdMaxZoom)
this.addSnackbar(snackbarId, `<i class="w-icon w-icon-clock"></i><span><strong>${this.getTranslation('name')}:</strong><br>${this.getTranslation('snackbar.updatingMapDisplay')}</span>`);
await this.debounce.updateMapDisplay();
this.removeSnackbar(document.getElementById(snackbarId));
}
/**
* Updates the map display by removing old features and adding new speed icons based on the settings.
*/
// TODO: Remove this when SDK migration is complete
updateMapDisplay() {
return new Promise((resolve, reject) => {
try {
this.logDebug('Updating map display...');
this.layer.removeAllFeatures();
if (W.map.getZoom() < this.settings.general.spdMaxZoom) {
this.logDebug('Maximum zoom exceeded. No speeds will be displayed.', false, 'warn');
resolve();
return;
}
let segments = W.model.segments.objects || {};
let segmentKeys = Object.keys(segments);
if (segmentKeys.length == 0) {
this.logDebug('No segments found.', false, 'error');
reject();
return;
}
this.logDebug(`Total segments loaded: ${segmentKeys.length}`);
segmentKeys.forEach(segmentId => {
let segment = segments[segmentId];
if (!segment || !segment.attributes) {
this.logDebug(`Could not find attributes or they are missing on the segment ${segmentId}.`, false, 'error');
return;
}
let attributes = segment.attributes;
let roadSettingId = this.convertStringCaseStyle('snake', 'camel', `spd_show_speed_in_${this.getRoadSettingNameById(attributes.roadType)}`);
let isLeftHandTraffic = this.wmeSdk.DataModel.Countries.getTopCountry().isLeftHandTraffic;
let isFwd = attributes.fwdDirection;
let isRev = attributes.revDirection;
let speedFwd = this.getSpeed(isLeftHandTraffic ? attributes.revMaxSpeed : attributes.fwdMaxSpeed);
let speedRev = this.getSpeed(isLeftHandTraffic ? attributes.fwdMaxSpeed : attributes.revMaxSpeed);
let hideNoSpeed = !this.settings.general.spdShowNoSpeed && ((speedFwd == 'N/A' && speedRev == 'N/A') || (isFwd && !isRev && speedFwd == 'N/A') || (!isFwd && isRev && speedRev == 'N/A') || (!isFwd && !isRev));
let ignoreOnRoundabout = attributes.junctionID && !this.settings.general.spdShowRoundabout;
let ignoreOnUnpaved = attributes.flags == 16 && !this.settings.general.spdShowUnpaved;
if (hideNoSpeed || !this.settings.roads[roadSettingId] || ignoreOnRoundabout || ignoreOnUnpaved) {
this.logDebug('This type of segment should not be loaded.', false, 'warn');
return;
}
let geometry = segment.getOLGeometry();
if (!geometry || geometry.components.length < 2) {
this.logDebug(`Invalid geometry on segment: ${segmentId}.`, false, 'error');
return;
}
let minLength = this.settings.filter.spdHideSegmentSmallerThan;
let segmentLength = attributes.length;
if (minLength != null && segmentLength < minLength) {
this.logDebug('Segment length is smaller than filter. Ignoring...');
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});
let rightFeature = new OpenLayers.Feature.Vector(rightPoint, {speed: speedFwd});
leftFeature.style = {
graphic: true,
externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedRev)),
graphicHeight: 30,
graphicWidth: 30,
graphicYOffset: -15,
graphicXOffset: -15,
graphicOpacity: this.calculateOpacity(speedRev)
};
rightFeature.style = {
graphic: true,
externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedFwd)),
graphicHeight: 30,
graphicWidth: 30,
graphicYOffset: -15,
graphicXOffset: -15,
graphicOpacity: this.calculateOpacity(speedFwd)
};
this.layer.addFeatures([leftFeature, rightFeature]);
} else {
let speed = isLeftHandTraffic ? (isFwd ? speedRev : speedFwd) : (isFwd ? speedFwd : speedRev);
let centerFeature = new OpenLayers.Feature.Vector(midpoint, {speed});
centerFeature.style = {
graphic: true,
externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speed, isFwd && isRev)),
graphicHeight: 30,
graphicWidth: 30,
graphicYOffset: -15,
graphicXOffset: -15,
graphicOpacity: this.calculateOpacity(speed)
};
this.layer.addFeatures([centerFeature]);
}
});
this.logDebug('Update finished.');
resolve();
} catch (error) {
this.logDebug(error, false, 'error');
reject(error);
}
});
}
// TODO: SDK migration
// updateMapDisplay() {
// return new Promise(async (resolve, reject) => {
// try {
// this.logDebug('Updating map display...');
// this.wmeSdk.Map.removeAllFeaturesFromLayer({layerName: this.layerName});
// if (this.wmeSdk.Map.getZoomLevel() < this.settings.general.spdMaxZoom) {
// this.logDebug('Maximum zoom exceeded. No speeds will be displayed.', false, 'warn');
// resolve();
// return;
// }
// let segments = await this.wmeSdk.DataModel.Segments.getAll();
// if (segments.length == 0) {
// this.logDebug('No segments found.', false, 'error');
// reject();
// return;
// }
// this.logDebug('Total segments loaded: ' + segments.length);
// segments.forEach(segment => {
// let roadSettingId = this.convertStringCaseStyle('snake', 'camel', `spd_show_speed_in_${this.getRoadSettingNameById(segment.roadType)}`);
// let isLeftHandTraffic = this.wmeSdk.DataModel.Countries.getTopCountry().isLeftHandTraffic;
// let isFwd = segment.isAtoB;
// let isRev = segment.isBtoA;
// let isTwoWay = segment.isTwoWay;
// let speedFwd = this.getSpeed(isFwd ? (isLeftHandTraffic ? segment.revSpeedLimit : segment.fwdSpeedLimit) : null);
// let speedRev = this.getSpeed(isRev ? (isLeftHandTraffic ? segment.fwdSpeedLimit : segment.revSpeedLimit) : null);
// let hideNoSpeed = !this.settings.general.spdShowNoSpeed && ((speedFwd == 'N/A' && speedRev == 'N/A') || (isFwd && !isRev && speedFwd == 'N/A') || (!isFwd && isRev && speedRev == 'N/A') || (!isFwd && !isRev && !isTwoWay));
// let ignoreOnRoundabout = segment.junctionId && !this.settings.general.spdShowRoundabout;
// let ignoreOnUnpaved = segment.flagAttributes.unpaved && !this.settings.general.spdShowUnpaved;
// if (hideNoSpeed || !this.settings.roads[roadSettingId] || ignoreOnRoundabout || ignoreOnUnpaved) {
// this.logDebug('This type of segment should not be loaded.', false, 'warn');
// return;
// }
// let geometry = segment.geometry;
// if (!geometry || geometry.coordinates.length < 2) {
// this.logDebug(`${this.getTranslation('log.invalidGeometry')} ${segment.id}.`, false, 'error');
// return;
// }
// let minLength = this.settings.filter.spdHideSegmentSmallerThan;
// let segmentLength = this.getLength(geometry.coordinates);
// if (minLength != null && segmentLength < minLength) {
// this.logDebug('Segment length is smaller than filter. Ignoring...');
// return;
// }
// let midpoint = this.calculateMidpoint(geometry.coordinates, segmentLength);
// let angle = this.calculateAngleAtMidpoint(geometry.coordinates);
// let {leftPoint, rightPoint} = this.getPerpendicularPoints(midpoint, angle, 5);
// if (isFwd && isRev && speedFwd != speedRev) {
// this.wmeSdk.Map.addFeaturesToLayer({
// layerName: this.layerName,
// features: [
// {
// type: 'Feature',
// id: `speed-${segment.id}-rev`,
// geometry: {
// type: 'Point',
// coordinates: [leftPoint[0], leftPoint[1]]
// },
// properties: {
// speed: speedRev
// },
// style: {
// icon: {
// type: 'image',
// url: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedRev)),
// size: {
// width: 30,
// height: 30
// },
// anchor: {
// x: 15,
// y: 15
// },
// opacity: this.calculateOpacity(speedRev)
// }
// }
// },
// {
// type: 'Feature',
// id: `speed-${segment.id}-fwd`,
// geometry: {
// type: 'Point',
// coordinates: [rightPoint[0], rightPoint[1]]
// },
// properties: {
// speed: speedFwd
// },
// style: {
// icon: {
// type: 'image',
// url: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedFwd)),
// size: {
// width: 30,
// height: 30
// },
// anchor: {
// x: 15,
// y: 15
// },
// opacity: this.calculateOpacity(speedFwd)
// }
// }
// }
// ]
// });
// // let leftFeature = new OpenLayers.Feature.Vector(leftPoint, {speed: speedRev});
// // leftFeature.style = {
// // graphic: true,
// // externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedRev)),
// // graphicHeight: 30,
// // graphicWidth: 30,
// // graphicYOffset: -15,
// // graphicXOffset: -15,
// // graphicOpacity: this.calculateOpacity(speedRev)
// // };
// // let rightFeature = new OpenLayers.Feature.Vector(rightPoint, {speed: speedFwd});
// // rightFeature.style = {
// // graphic: true,
// // externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedFwd)),
// // graphicHeight: 30,
// // graphicWidth: 30,
// // graphicYOffset: -15,
// // graphicXOffset: -15,
// // graphicOpacity: this.calculateOpacity(speedFwd)
// // };
// // this.layer.addFeatures([leftFeature, rightFeature]);
// // this.layer.addFeatures([leftFeature, rightFeature]);
// } else {
// let speed;
// if (isFwd && speedFwd != null) {
// speed = speedFwd;
// } else if (isRev && speedRev != null) {
// speed = speedRev;
// }
// speed = isFwd ? speedFwd : speedRev;
// this.wmeSdk.Map.addFeatureToLayer({
// layerName: this.layerName,
// feature: {
// type: 'Feature',
// id: `speed-${segment.id}`,
// geometry: {
// type: 'Point',
// coordinates: [midpoint[0], midpoint[1]]
// },
// properties: {
// speed,
// },
// style: {
// icon: {
// type: 'image',
// url: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speed, isTwoWay)),
// size: {
// width: 30,
// height: 30
// },
// anchor: {
// x: 15,
// y: 15
// },
// opacity: this.calculateOpacity(speed)
// }
// }
// }
// });
// // let centerFeature = new OpenLayers.Feature.Vector(midpoint, {speed});
// // centerFeature.style = {
// // graphic: true,
// // externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speed)),
// // graphicHeight: 30,
// // graphicWidth: 30,
// // graphicYOffset: -15,
// // graphicXOffset: -15,
// // graphicOpacity: this.calculateOpacity(speed)
// // };
// // this.layer.addFeatures([centerFeature]);
// }
// });
// this.logDebug('Update finished.');
// resolve();
// } catch (error) {
// this.logDebug(error, false, 'error');
// reject(error);
// }
// });
// }
// TODO: Remove this when SDK migration is complete
/**
* Toggle visibility of the display of the speed layer.
* @param {Boolean} enabled
*/
toggleLayerVisibility(enabled) {
if (this.layer) {
this.layer.setVisibility(enabled);
this.logDebug(`Speed layer ${enabled ? 'enabled' : 'disabled'}.`);
}
}
// TODO: SDK migration
/**
* Toggle visibility of the display of the speed layer.
*/
// toggleLayerVisibility() {
// if (this.layer) {
// let enabled = this.settings.spdEnabled;
// this.wmeSdk.Map.setLayerVisibility({layerName: this.layerName, visibility: this.settings.spdEnabled});
// this.logDebug(`Speed layer ${enabled ? 'enabled' : 'disabled'}.`);
// }
// }
/**
* Saves the current settings to localStorage.
*/
saveSettings() {
return new Promise((resolve, reject) => {
try {
let selectedTheme = this.getSelectedTheme();
// TODO: Remove this when SDK migration is complete
this.settings.spdEnabled = this.layerCheckbox.speedDisplay.checked;
// TODO: SDK migration
// this.settings.spdEnabled = this.layerSwitcherElement.checked;
['general', 'filter', 'roads'].forEach(group => this.updateSettingsGroup(group));
this.settings.theme = selectedTheme?.id ? this.convertStringCaseStyle('kebab', 'camel', selectedTheme.id.replace('spd-theme-', '')) : 'default';
localStorage.setItem('wmeSpeedDisplaySettings', JSON.stringify(this.settings));
resolve();
this.channel.postMessage('saved');
} catch (error) {
this.logDebug(error, false, 'error');
reject(error);
}
});
}
/**
* Loads the settings from localStorage or uses the provided settings to initialize the configuration.
* @param {Object} [savedSettings] - The saved settings object to load; if not provided, it will load from localStorage.
*/
loadSettings(savedSettings) {
savedSettings = savedSettings ?? JSON.parse(localStorage.getItem('wmeSpeedDisplaySettings'));
if (!savedSettings)
return;
// To ensure that if it enters a new settings, it doesn't discard them when loading the old settings
Object.entries(savedSettings).forEach(([setting, value]) => {
if (typeof value == 'object' && value != null) {
if (!this.settings[setting])
this.settings[setting] = {};
Object.entries(value).forEach(([subSetting, subValue]) => {
this.settings[setting][subSetting] = subValue ?? true;
});
} else {
// If the saved theme no longer exists, select the default
if (setting == 'theme' && !this.theme.includes(value))
value = 'default';
this.settings[setting] = value ?? true;
}
});
}
/**
* Resets the speed display settings to default.
*/
async resetSettings() {
localStorage.removeItem('wmeSpeedDisplaySettings');
this.zIndex.warnDisplayed = false;
this.defineSettings();
this.updateSettingsElementsStates();
this.resetZindex();
this.displayZIndexWarning();
await this.debounce.saveSettings();
this.preUpdateMapDisplay();
}
/**
* Updates the specified settings group by retrieving values from the corresponding HTML elements.
* @param {string} group - The settings group to update (e.g., 'general', 'filter', 'roads').
*/
updateSettingsGroup(group) {
Object.entries(this.settings[group]).forEach(([setting, _]) => {
let id = this.convertStringCaseStyle('camel', 'kebab', setting);
let element = document.getElementById(id);
if (!element) {
this.logDebug(`Setting field not found: ${id}`, false, 'warn');
return;
}
let value;
if (['range', 'number'].includes(element.type)) {
value = element.value != null ? parseFloat(element.value) : element.value;
} else {
value = element.checked != undefined ? element.checked : element.value;
}
this.settings[group][setting] = value;
});
}
/**
* Adds a settings tab to the user interface with options to configure the speed display settings.
*/
addSettingsTab() {
return new Promise(async (resolve, reject) => {
try {
let {tabLabel, tabPane} = await this.wmeSdk.Sidebar.registerScriptTab();
let speedUnit = this.wmeSdk.Settings.getUserSettings().isImperial ? I18n.translate('measurements.speed.mi', {speed: ''}) : I18n.translate('measurements.speed.km', {speed: ''});
tabLabel.innerHTML = this.getTranslation('name');
let tabPaneHtml = `
<div class="segment sidebar-column" style="margin: -15px;">
<wz-section-header headline="${this.getTranslation('name')}" size="section-header2" back-button="false">
<svg slot="icon" xmlns="http://www.w3.org/2000/svg" width="22px" height="22px" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 1.08 1.08" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xodm="http://www.corel.com/coreldraw/odm/2003">
<path fill="var(--leading_icon, #90959c)" d="M0.54 0c0.3,0 0.54,0.24 0.54,0.54 0,0.3 -0.24,0.54 -0.54,0.54 -0.3,0 -0.54,-0.24 -0.54,-0.54 0,-0.3 0.24,-0.54 0.54,-0.54zm-0.18 0.74c0.09,0 0.13,-0.05 0.13,-0.14 0,-0.08 -0.04,-0.13 -0.12,-0.13 -0.01,0 -0.03,0 -0.05,0.01l0.01 -0.06 0.14 0 0 -0.07 -0.2 0 -0.02 0.19 0.07 0.03c0.01,-0.02 0.02,-0.03 0.05,-0.03 0.03,0 0.06,0.02 0.06,0.06 0,0.05 -0.03,0.07 -0.07,0.07 -0.02,0 -0.05,-0.01 -0.08,-0.03l-0.03 0.07c0.03,0.02 0.07,0.03 0.11,0.03zm0.33 -0.33c0.06,0 0.08,0.04 0.08,0.13 0,0.09 -0.03,0.13 -0.08,0.13 -0.05,0 -0.07,-0.04 -0.07,-0.13 0,-0.09 0.02,-0.13 0.07,-0.13zm0 0.33c0.1,0 0.14,-0.07 0.14,-0.2 0,-0.13 -0.04,-0.2 -0.14,-0.2 -0.09,0 -0.14,0.07 -0.14,0.2 0,0.13 0.05,0.2 0.14,0.2zm-0.15 -0.64c0.24,0 0.44,0.2 0.44,0.44 0,0.24 -0.2,0.44 -0.44,0.44 -0.24,0 -0.44,-0.2 -0.44,-0.44 0,-0.24 0.2,-0.44 0.44,-0.44z"/>
</svg>
</wz-section-header>
<div class="segment-edit-section">
<wz-alerts-group multiline="true" id="spd-alert-group" class="alertsGroup--cx2Lh ${Object.values(this.settings.alertDismissed).every(value => value == true) ? 'd-none' : ''}" style="padding: 0; margin: 15px 15px 15px 15px;"></wz-alerts-group>
<wz-tabs>
<wz-tab is-active="true" label="${this.getTranslation('title.general')}" tooltip="${this.getTranslation('title.general')}">
<div style="display: flex; flex-direction: column; gap: 15px;">
<div>
<wz-label html-for="">${this.getTranslation('label.displaySpeeds')}</wz-label>
<wz-toggle-switch name="spd-display-speeds" checked="${this.settings.spdEnabled}" id="spd-display-speeds" tabindex="0" value="true" disabled="${!this.layerCheckbox.roadGroup.checked}">
<input type="checkbox" name="spd-display-speeds" value="true" style="display: none; visibility: hidden;">
</wz-toggle-switch>
</div>
<div>
<wz-checkbox checked="${this.settings.general.spdShowNoSpeed}" indeterminate="false" disabled="false" id="spd-show-no-speed" value="true">${this.getTranslation('label.showNoSpeed')}<input type="checkbox" value="true" style="display: none; visibility: hidden;"></wz-checkbox>
<wz-checkbox checked="${this.settings.general.spdShowRoundabout}" indeterminate="false" disabled="false" id="spd-show-roundabout" value="true">${this.getTranslation('label.showOnRoundabout')}<input type="checkbox" value="true" style="display: none; visibility: hidden;"></wz-checkbox>
<wz-checkbox checked="${this.settings.general.spdShowUnpaved}" indeterminate="false" disabled="false" id="spd-show-unpaved" value="true">${this.getTranslation('label.showOnUnpaved')}<input type="checkbox" value="true" style="display: none; visibility: hidden;"></wz-checkbox>
</div>
<div>
<wz-label html-for="">
${this.getTranslation('label.maxZoom')} <span id="spd-max-zoom-value">${this.settings.general.spdMaxZoom}</span>
</wz-label>
<input type="range" id="spd-max-zoom" min="12" max="22" step="1" value="${this.settings.general.spdMaxZoom}">
<div class="spd-info-message" style="display: flex; justify-content: space-between; width: 100%;">
<span>${this.getTranslation('zoomOut')}</span><span>${this.getTranslation('zoomIn')}</span>
</div>
</div>
<div>
<wz-label html-for="">
${this.getTranslation('label.opacity')} <span id="spd-filter-opacity-value">${this.settings.general.spdFilterOpacity}</span>
</wz-label>
<input type="range" id="spd-filter-opacity" min="0" max="1" step="0.1" value="${this.settings.general.spdFilterOpacity}">
<div class="spd-info-message" style="display: flex; justify-content: space-between; width: 100%;">
<span>${this.getTranslation('label.min')} 0</span><span>${this.getTranslation('label.max')} 1</span>
</div>
</div>
<div class="segment-level-select">
<div class="label-container">
<wz-label html-for="">${this.getTranslation('label.zIndex')}</wz-label>
<wz-button color="text" size="sm" disabled="false" id="spd-btn-reset-z-index">${this.getTranslation('reset')}</wz-button>
</div>
<div class="select-container">
<wz-button color="clear-icon" disabled="false" id="spd-btn-zindex-decrease">
<i class="w-icon w-icon-minus"></i>
</wz-button>
<wz-text-input size="sm" type="number" id="spd-layer-zindex" min="${this.zIndex.min}" max="${this.zIndex.max}" value="${this.settings.general.spdLayerZindex}" disabled="false" style="width: 100%;">
<input style="display: none; visibility: hidden;">
</wz-text-input>
<wz-button color="clear-icon" disabled="false" id="spd-btn-zindex-increase">
<i class="w-icon w-icon-plus"></i>
</wz-button>
</div>
</div>
</div>
</wz-tab>
<wz-tab is-active="false" label="${this.getTranslation('title.roadTypes')}" tooltip="${this.getTranslation('title.roadTypes')}">
<div>
<wz-label html-for="" style="margin:0">${this.getTranslation('title.showOnRoadType')}</wz-label>`;
Object.entries(this.segmentsCategories).forEach(segmentCategory => {
tabPaneHtml += `<wz-menu-title style="padding:0;">${this.wmeTranslations.segment.categories[segmentCategory[0]]}</wz-menu-title>`;
Object.values(segmentCategory[1]).forEach(roadType => {
let id = this.convertStringCaseStyle('snake', 'kebab', `spd_show_speed_in_${roadType.name}`);
let settingId = this.convertStringCaseStyle('kebab', 'camel', id);
let checked = this.settings.roads[settingId];
tabPaneHtml += `<wz-checkbox checked="${checked}" indeterminate="false" disabled="false" id="${id}" value="true">${this.wmeTranslations.segment.road_types[roadType.id]}<input type="checkbox" value="true" style="display: none; visibility: hidden;"></wz-checkbox>`;
});
});
tabPaneHtml += `
</div>
</wz-tab>
<wz-tab is-active="false" label="${this.getTranslation('title.filter')}" tooltip="${this.getTranslation('title.filter')}">
<div style="display: flex; flex-direction: column; gap: 15px;">
<div>
<wz-label html-for="">${this.getTranslation('label.hideShorterSegments')}</wz-label>
<div class="speedLimit--ZIWbK" style="margin-bottom: 0">
<wz-text-input size="sm" type="number" id="spd-hide-segment-smaller-than" min="0" max="9999" value="${this.settings.filter.spdHideSegmentSmallerThan}" disabled="false" class="speedLimitInput--aWKs1">
<input style="display: none; visibility: hidden;">
</wz-text-input>
<span class="spd-filter-distance-unit">${this.wmeSdk.Settings.getUserSettings().isImperial ? this.wmeTranslations.units_short.feet : this.wmeTranslations.units_short.meters}</span>
</div>
</div>
<div>
<wz-label html-for="">${this.getTranslation('label.speedFilter')}</wz-label>
<div class="speedLimit--ZIWbK">
<div class="directionLabel--U8iep">${this.getTranslation('label.min')}</div>
<wz-text-input size="sm" type="number" id="spd-min-speed" min="0" max="999" value="${this.settings.filter.spdMinSpeed}" disabled="false" class="speedLimitInput--aWKs1">
<input style="display: none; visibility: hidden;">
</wz-text-input>
<span class="spd-filter-speed-unit">${speedUnit}</span>
</div>
<div class="speedLimit--ZIWbK" style="margin-bottom: 0">
<div class="directionLabel--U8iep">${this.getTranslation('label.max')}</div>
<wz-text-input size="sm" type="number" id="spd-max-speed" min="0" max="999" value="${this.settings.filter.spdMaxSpeed}" disabled="false" class="speedLimitInput--aWKs1">
<input style="display: none; visibility: hidden;">
</wz-text-input>
<span class="spd-filter-speed-unit">${speedUnit}</span>
</div>
</div>
</div>
</wz-tab>
<wz-tab is-active="false" label="${this.getTranslation('title.appearence')}" tooltip="${this.getTranslation('title.appearence')}">
<div style="display: flex; flex-direction: column; gap: 15px;">
<div class="drives-container">
<div class="drive-list">`;
this.theme.forEach(theme => {
tabPaneHtml += `
<wz-card id="spd-theme-${this.convertStringCaseStyle('camel', 'kebab', theme)}" selected="${this.settings.theme == theme}" elevation-on-hover="4" class="list-item-card drive-list-item">
<div class="list-item-card-layout">
${this.getSpeedIcon(60, theme == 'uk', theme)}
<div class="list-item-card-info">
<div class="list-item-card-title">${this.getTranslation('theme.' + theme)}</div>
</div>
</div>
</wz-card>`;
});
tabPaneHtml += `
</div>
</div>
</div>
</wz-tab>
</wz-tabs>
<div class="form-group">
<div style="display: flex; flex-direction: column; gap: 15px; padding: 0 15px;">
<wz-button color="secondary" id="spd-reset-default-settings">${this.getTranslation('btn.resetSettings')}</wz-button>`;
if (this.debugMode) {
tabPaneHtml += `
<wz-button color="primary" id="btn-spd-update-settings-tab">${this.getTranslation('btn.updateSettingsTab')}</wz-button>
<wz-button color="secondary" id="btn-spd-test">Test something</wz-button>`;
}
tabPaneHtml += `
<wz-button color="text" size="sm" id="btn-spd-open-changelog-dialog" title="${this.getTranslation('viewChangelog')}"><b>${this.getTranslation('name')}</b> v${this.version}</wz-button>
<a href="https://www.waze.com/discuss/t/script-wme-speed-display/373172" target="_blank" style="width: 100%">
<wz-button color="text" size="sm" title="${this.getTranslation('title.seeOnDiscuss')}" style="width: 100%">${this.getTranslation('btn.seeOnDiscuss')}</wz-button>
</a>
<a href="https://discord.gg/T6cDTGZj" target="_blank" style="width: 100%">
<wz-button color="text" size="sm" title="${this.getTranslation('title.seeOnDiscord')}" style="width: 100%">${this.getTranslation('btn.seeOnDiscord')}</wz-button>
</a>
<a href="https://www.waze.com/pt-BR/user/editor/luan_tavares_127" target="_blank" style="width: 100%">
<wz-button color="text" size="sm" title="${this.getTranslation('title.scriptDevBy')}" style="width: 100%">${this.getTranslation('btn.scriptDevBy')}</wz-button>
</a>
</div>
</div>
</div>
</div>`;
tabPane.innerHTML = tabPaneHtml;
if (!this.settings.alertDismissed.infoToggleVisibility)
this.addAlert('info-toggle-visibility', this.getTranslation('alertMessage.toggleVisibility'));
if (!this.zIndex.warnDisplayed)
this.displayZIndexWarning();
this.displaySpeedsSwitch = document.getElementById('spd-display-speeds');
this.attachSettingsListeners();
this.logDebug('Settings tab added.');
resolve();
} catch (error) {
this.logDebug(error, false, 'error');
reject(error);
}
});
}
/**
* Updates the settings tab by removing the old one and adding a new one with updated settings.
*/
async updateSettingsTab() {
this.logDebug('Updating settings tab...');
this.detachSettingsListeners();
this.defineTranslations();
this.wmeSdk.Sidebar.removeScriptTab();
await this.addSettingsTab();
this.updateSettingsElementsStates();
if (!this.zIndex.warnDisplayed)
this.displayZIndexWarning();
}
/**
* Updates the state of the settings elements (checkboxes, inputs) based on the current settings.
*/
updateSettingsElementsStates() {
// TODO: Remove this when SDK migration is complete
this.layerCheckbox.speedDisplay.checked = this.settings.spdEnabled;
// TODO: SDK migration
// this.layerSwitcherElement.checked = this.settings.spdEnabled;
if (this.displaySpeedsSwitch) {
this.displaySpeedsSwitch.checked = this.settings.spdEnabled;
this.displaySpeedsSwitch.disabled = !this.layerCheckbox.roadGroup.checked;
}
Object.entries(this.settings.general).forEach(([setting, value]) => {
let id = this.convertStringCaseStyle('camel', 'kebab', setting);
let element = document.getElementById(id);
if (!element)
return;
switch (element.type) {
case 'number':
element.value = (value == null || value == 0) ? '' : value;
break;
case 'range':
element.value = value;
document.getElementById(`${id}-value`).innerText = value;
break;
default:
element.checked = value;
}
});
document.querySelectorAll('[id^="spd-show-speed-in-"]').forEach(input => {
let settingId = this.convertStringCaseStyle('kebab', 'camel', input.id);
input.checked = this.settings.roads[settingId];
});
Object.entries(this.settings.filter).forEach(([setting, value]) => {
let id = this.convertStringCaseStyle('camel', 'kebab', setting);
let element = document.getElementById(id);
if (!element)
return;
element.value = (value == null || value == 0) ? '' : value;
});
this.selectThemeCard(document.querySelector(`wz-card#spd-theme-${this.convertStringCaseStyle('camel', 'kebab', this.settings.theme)}`));
}
/**
* Adds a global keyboard shortcut listener and add the script shortcut on shortcuts dialog.
*/
addShortcut() {
this.wmeSdk.Shortcuts.createShortcut({
callback: this.shortcutCallback.bind(this),
description: this.getTranslation('label.toggleLayerShortcut'),
shortcutId: 'ks-wme-speed-display',
shortcutKeys: 'AS+s',
});
}
/**
* Toggles the layer switcher speed display when shortcut is pressed.
*/
shortcutCallback() {
// TODO: Remove this when SDK migration is complete
this.layerCheckbox.speedDisplay.click();
this.displaySpeedsSwitch.checked = this.layerCheckbox.speedDisplay.checked;
// TODO: Remove this when SDK migration is complete - end
// TODO: SDK migration
// this.layerSwitcherElement.click();
// this.displaySpeedsSwitch.checked = this.layerSwitcherElement.checked;
// TODO: SDK migration - end
}
// TODO: Remove this when SDK migration is complete
/**
* Calculates the real midpoint of a segment, considering curves.
* @param {OpenLayers.Geometry.LineString} geometry Segment geometry.
*
* @returns {OpenLayers.Geometry.Point} Real midpoint.
*/
calculateMidpoint(geometry) {
let length = geometry.getLength();
let cumulativeLength = 0;
for (let i = 0; i < geometry.components.length - 1; i++) {
let start = geometry.components[i];
let end = geometry.components[i + 1];
let segmentLength = start.distanceTo(end);
if (cumulativeLength + segmentLength >= length / 2) {
let ratio = (length / 2 - cumulativeLength) / segmentLength;
return new OpenLayers.Geometry.Point(
start.x + ratio * (end.x - start.x),
start.y + ratio * (end.y - start.y)
);
}
cumulativeLength += segmentLength;
}
return geometry.getCentroid();
}
// TODO: SDK migration
/**
* Calculates the real midpoint of a segment, considering curves.
* @param {Array} coordinates - Array of [longitude, latitude] pairs representing the segment geometry.
*
* @returns {Array} The midpoint as an array [longitude, latitude].
*/
// calculateMidpoint(coordinates) {
// let totalLength = this.getLength(coordinates);
// let cumulativeLength = 0;
// for (let i = 0; i < coordinates.length - 1; i++) {
// let start = coordinates[i];
// let end = coordinates[i + 1];
// let segmentLength = this.getDistance(start, end);
// if (cumulativeLength + segmentLength >= totalLength / 2) {
// let ratio = (totalLength / 2 - cumulativeLength) / segmentLength;
// return [
// start[0] + ratio * (end[0] - start[0]),
// start[1] + ratio * (end[1] - start[1])
// ];
// }
// cumulativeLength += segmentLength;
// }
// // If something goes wrong, return a simple midpoint as a fallback
// let firstPoint = coordinates[0];
// let lastPoint = coordinates[coordinates.length - 1];
// return [
// (firstPoint[0] + lastPoint[0]) / 2,
// (firstPoint[1] + lastPoint[1]) / 2
// ];
// }
/**
* Generates an SVG icon with the speeds.
* @param {String} speed The speed.
* @param {Boolean} [sameSpeedBothWays] It is the segment two ways with same speed? (default: false)
* @param {String} [theme] Force a theme. (default: this.settings.theme)
*
* @returns {String} SVG in string format.
*/
getSpeedIcon(speed, sameSpeedBothWays = false, theme) {
let icon;
theme = theme ?? this.settings.theme;
switch (theme) {
case 'altViennaConv':
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="#FBE353" stroke="#FF5251" stroke-width="5"/>
<text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
</svg>`;
break;
case 'japan':
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="white" stroke="#FF5251" stroke-width="5"/>
<text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#0074E3" text-anchor="middle">${speed}</text>
</svg>`;
break;
case 'northAmerica':
icon = `
<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<rect x="2.5" y="2.5" width="45" height="45" fill="white" stroke="#1F2125" stroke-width="3" rx="5"/>
<text x="25" y="12" font-size="9" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">SPEED</text>
<text x="25" y="22" font-size="9" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">LIMIT</text>
<text x="25" y="42" font-size="22" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
</svg>`;
break;
case 'sacu':
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="#235AA9" stroke="#FF5251" stroke-width="5"/>
<text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="white" text-anchor="middle">${speed}</text>
</svg>`;
break;
case 'uk':
if (sameSpeedBothWays && [60, 70].includes(speed)) {
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="white" stroke="#1F2125" stroke-width="2"/>
<line x1="10" y1="40" x2="40" y2="10" stroke="#1F2125" stroke-width="9"/>
</svg>`;
} else {
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="white" stroke="#FF5251" stroke-width="5"/>
<text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
</svg>`;
}
break;
default:
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="white" stroke="#FF5251" stroke-width="5"/>
<text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
</svg>`;
}
return icon;
}
/**
* Calculates the opacity of a speed icon based on speed filter settings.
* @param {number} speed - The speed value to evaluate.
*
* @returns {number} Opacity value (1 for visible, this.settings.general.spdFilterOpcaity for dimmed) depending on whether the speed falls within the defined min and max speed range.
*/
calculateOpacity(speed) {
let minSpeed = parseInt(this.settings.filter.spdMinSpeed, 10);
let maxSpeed = parseInt(this.settings.filter.spdMaxSpeed, 10);
let validMin = isNaN(minSpeed) || minSpeed <= 0 || speed >= minSpeed;
let validMax = isNaN(maxSpeed) || maxSpeed <= 0 || speed <= maxSpeed;
let opacity = this.settings.general.spdFilterOpacity < 0.1 ? 0.01 : this.settings.general.spdFilterOpacity;
return validMin && validMax ? 1 : opacity;
}
// TODO: Remove this when SDK migration is complete
/**
* Calculates the angle at the midpoint of a geometry based on its components.
* @param {Object} geometry - The geometry with points.
*
* @returns {number} The angle in radians at the midpoint.
*/
calculateAngleAtMidpoint(geometry) {
let totalLength = geometry.getLength();
let cumulativeLength = 0;
for (let i = 0; i < geometry.components.length - 1; i++) {
let start = geometry.components[i];
let end = geometry.components[i + 1];
if (!start || !end) continue;
let segmentLength = start.distanceTo(end);
if (cumulativeLength + segmentLength >= totalLength / 2)
return Math.atan2(end.y - start.y, end.x - start.x);
cumulativeLength += segmentLength;
}
if (geometry.components.length >= 2) {
let firstPoint = geometry.components[0];
let lastPoint = geometry.components[geometry.components.length - 1];
return Math.atan2(lastPoint.y - firstPoint.y, lastPoint.x - firstPoint.x);
}
this.logDebug(this.spdTranslations.log.insufficientGeometryAngleCalc, false, 'error');
return 0;
}
// TODO: SDK migration
/**
* Calculates the angle at the midpoint of a geometry based on its components.
* @param {Array} coordinates - The geometry coordinates.
*
* @returns {Number} The angle in radians at the midpoint.
*/
// calculateAngleAtMidpoint(coordinates) {
// let totalLength = this.getLength(coordinates);
// let cumulativeLength = 0;
// for (let i = 0; i < coordinates.length - 1; i++) {
// let start = coordinates[i];
// let end = coordinates[i + 1];
// if (!start || !end) continue;
// let segmentLength = this.getDistance(start, end);
// if (cumulativeLength + segmentLength >= totalLength / 2)
// return Math.atan2(end.y - start.y, end.x - start.x);
// cumulativeLength += segmentLength;
// }
// if (coordinates.length >= 2) {
// let firstPoint = coordinates[0];
// let lastPoint = coordinates[coordinates.length - 1];
// return Math.atan2(lastPoint.y - firstPoint.y, lastPoint.x - firstPoint.x);
// }
// this.logDebug('Insufficient geometry for angle calculation.', false, 'error');
// return 0;
// }
/**
* Calculates the distance in meters between two geographic coordinates using the Haversine formula.
* @param {Array} startPoint - The starting point [longitude, latitude].
* @param {Array} endPoint - The ending point [longitude, latitude].
*
* @returns {Number} The distance in meters between the two points.
*/
getDistance(startPoint, endPoint) {
let earthRadius = 6371000;
let latitude1 = this.toRadians(startPoint[1]);
let latitude2 = this.toRadians(endPoint[1]);
let deltaLatitude = this.toRadians(endPoint[1] - startPoint[1]);
let deltaLongitude = this.toRadians(endPoint[0] - startPoint[0]);
let haversineFormula = Math.sin(deltaLatitude / 2) * Math.sin(deltaLatitude / 2) + Math.cos(latitude1) * Math.cos(latitude2) * Math.sin(deltaLongitude / 2) * Math.sin(deltaLongitude / 2);
let centralAngle = 2 * Math.atan2(Math.sqrt(haversineFormula), Math.sqrt(1 - haversineFormula));
return earthRadius * centralAngle;
}
/**
* Converts an angle from degrees to radians.
* @param {Number} angle - The angle in degrees.
*
* @returns {Number} The angle in radians.
*/
toRadians(angle) {
return angle * (Math.PI / 180);
}
/**
* Returns two perpendicular points (left and right) from a midpoint at a given angle and distance, adjusted by map zoom.
* @param {Object} midpoint - Central point with `x` and `y` coordinates.
* @param {Number} angle - Angle in radians from the reference direction.
* @param {Number} baseDistance - Base distance from the midpoint before zoom adjustment.
*
* @returns {Object} {leftPoint, rightPoint} - Perpendicular points to the left and right.
*/
getPerpendicularPoints(midpoint, angle, baseDistance) {
let currentZoom = this.wmeSdk.Map.getZoomLevel();
let referenceZoom = 19;
let scaleFactor = Math.pow(2, referenceZoom - currentZoom);
let adjustedDistance = baseDistance * scaleFactor;
let angleLeft = angle + Math.PI / 2;
let angleRight = angle - Math.PI / 2;
// TODO: Remove this when SDK migration is complete
let leftPoint = new OpenLayers.Geometry.Point(
midpoint.x + adjustedDistance * Math.cos(angleLeft),
midpoint.y + adjustedDistance * Math.sin(angleLeft)
);
let rightPoint = new OpenLayers.Geometry.Point(
midpoint.x + adjustedDistance * Math.cos(angleRight),
midpoint.y + adjustedDistance * Math.sin(angleRight)
);
// TODO: Remove this when SDK migration is complete - end
// TODO: SDK migration
// let leftPoint = [
// midpoint.x + adjustedDistance * Math.cos(angleLeft),
// midpoint.y + adjustedDistance * Math.sin(angleLeft)
// ];
// let rightPoint = [
// midpoint.x + adjustedDistance * Math.cos(angleRight),
// midpoint.y + adjustedDistance * Math.sin(angleRight)
// ];
// TODO: SDK migration -end
return {
leftPoint,
rightPoint
};
}
/**
* Returns speed in mph/kmh or 'N/A'.
* @param {Number} speed The speed value in kilometers per hour (km/h) to be formatted.
*
* @returns {(Number|String)} The speed.
*/
getSpeed(speed) {
if (!speed)
return 'N/A';
return this.wmeSdk.Settings.getUserSettings().isImperial ? Math.round(speed * 0.621371) : speed;
}
/**
* Returns length in feet (rounded) if imperial units are preferred; otherwise, returns meters.
* @param {Array} coordinates - The length value in meters to be converted.
* @param {Boolean} [forceMeters] - If needs to force results in meters.
*
* @returns {Number} The converted length in feet or the original length in meters.
*/
getLength(coordinates, forceMeters = false) {
let totalDistance = 0;
// Iterate over the coordinates and add the distance between consecutive points
for (let i = 0; i < coordinates.length - 1; i++) {
let pointA = {
lat: coordinates[i][1],
lng: coordinates[i][0]
};
let pointB = {
lat: coordinates[i + 1][1],
lng: coordinates[i + 1][0]
};
totalDistance += this.calculateDistance(pointA, pointB);
}
return this.wmeSdk.Settings.getUserSettings().isImperial && !forceMeters ? Math.round(totalDistance * 3.28084) : totalDistance;
}
/**
* Calculates the distance between two points using the Haversine formula.
* @param {Array} pointA The first point, containing latitude (lat) and longitude (lng).
* @param {Array} pointB The second point, containing latitude (lat) and longitude (lng).
* @returns
*/
calculateDistance(pointA, pointB) {
let earthRadius = 6371e3;
let latitudeA = pointA.lat * Math.PI / 180;
let latitudeB = pointB.lat * Math.PI / 180;
// Calculate the differences in coordinates
let deltaLatitude = (pointB.lat - pointA.lat) * Math.PI / 180;
let deltaLongitude = (pointB.lng - pointA.lng) * Math.PI / 180;
// Haversine formula
let haversineComponent = Math.sin(deltaLatitude / 2) * Math.sin(deltaLatitude / 2) + Math.cos(latitudeA) * Math.cos(latitudeB) * Math.sin(deltaLongitude / 2) * Math.sin(deltaLongitude / 2);
let angularDistance = 2 * Math.atan2(Math.sqrt(haversineComponent), Math.sqrt(1 - haversineComponent));
// Calculate the distance in meters
let distance = earthRadius * angularDistance;
return distance;
}
/**
* Makes a "dramatic" pause in the code.
* @param {Number} ms Pause time in milliseconds.
*/
async sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
/**
* Returns a function with delay.
* @param {Object} func Function that will be called with delay.
* @param {Number} [timeout] Delay time in milliseconds. (default: 300)
*
* @returns {Function} Function
*/
debounce(func, timeout = 300) {
let promise = null;
let timer;
return (...args) => {
clearTimeout(timer);
return new Promise((resolve, reject) => {
timer = setTimeout(async () => {
try {
promise = func.apply(this, args);
let result = await promise;
resolve(result);
} catch (error) {
reject(error);
}
}, timeout);
});
};
}
/**
* Converts a string from one case style to another (camel, snake, kebab).
* @param {String} fromType - The original string case ('camel', 'snake', or 'kebab').
* @param {String} toType - The target string case ('camel', 'snake', or 'kebab').
* @param {String} string - The string to be converted.
*
* @returns {String} The converted string.
*/
convertStringCaseStyle(fromType, toType, string) {
if (fromType == toType)
return string;
let conversionMap = {
camel: {
kebab: str => str.match(/[A-Z]?[a-z]+|[0-9]+/g).join('-').toLowerCase(),
snake: str => str.match(/[A-Z]?[a-z]+|[0-9]+/g).join('_').toLowerCase()
},
snake: {
kebab: str => str.replace(/_/g, '-'),
camel: str => str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())
},
kebab: {
camel: str => str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()),
snake: str => str.replace(/-/g, '_')
}
};
return conversionMap[fromType]?.[toType]?.(string) || string;
}
/**
* Retrieves the road setting name by its ID from the segments categories.
* @param {String} id - The ID of the road setting.
*
* @returns {(String|null)} The name of the road setting if found, otherwise null.
*/
getRoadSettingNameById(id) {
for (let category of Object.values(this.segmentsCategories)) {
let segment = category.find(item => item.id == id);
if (segment)
return segment.name;
}
// Returns null if ID is not found
return null;
}
/**
* Logs a debug message to the console if debug mode is enabled or forceMessage is true.
* @param {String} message - The message to log.
* @param {boolean} [forceMessage] - Whether to log the message regardless of the debug mode setting.
* @param {String} [type] - The type of message ('warn', or 'error'). Default is 'log'.
*/
logDebug(message, forceMessage = false, type) {
if (this.debugMode || forceMessage)
(console[type] || console.log)(`[WME Speed Display v${this.version}]: ${message}`);
}
// TODO: Remove this when SDK migration is complete
/**
* Adds a checkbox to the layer switcher to toggle the speed display layer visibility.
*/
addLayerCheckbox() {
let houseNumbersCheckbox = document.getElementById('layer-switcher-item_house_numbers');
this.layerCheckbox.roadGroup = document.getElementById('layer-switcher-group_road');
if (!houseNumbersCheckbox) {
this.logDebug('The "House Numbers" checkbox was not found. Trying again...', false, 'warn');
setTimeout(() => this.addLayerCheckbox(), 1000);
return;
}
let layerItem = document.createElement('li');
layerItem.innerHTML = `
<div class="layer-selector">
<wz-checkbox id="layer-switcher-item_speed_display" checked="${this.settings.spdEnabled}" disabled="${!this.layerCheckbox.roadGroup.checked}">
<div class="layer-selector-container" title="WME ${this.getTranslation('name')}">${this.getTranslation('label.displaySpeeds')}</div>
</wz-checkbox>
</div>`;
houseNumbersCheckbox.closest('li').insertAdjacentElement('afterend', layerItem);
this.layerCheckbox.speedDisplay = document.getElementById('layer-switcher-item_speed_display');
if (!this.layerCheckbox.speedDisplay)
return;
this.layerCheckbox.speedDisplay.addEventListener('change', this.onSpeedDisplayCheckboxChange.bind(this));
this.layerCheckbox.roadGroup.addEventListener('change', this.onLayerSwithcerGroupRoadChange.bind(this));
this.toggleLayerVisibility(this.layerCheckbox.roadGroup.checked && this.settings.spdEnabled);
}
/**
* Initializes settings from localStorage or sets default values.
*/
defineSettings() {
let localSettings = localStorage.getItem('wmeSpeedDisplaySettings');
localSettings = localSettings ? JSON.parse(localSettings) : null;
this.settings = {
spdEnabled: true,
alertDismissed: {
infoToggleVisibility: false,
infoZindex: false
},
theme: 'default',
general: {
spdShowNoSpeed: true,
spdShowRoundabout: true,
spdShowUnpaved: true,
spdMaxZoom: 18,
spdLayerZindex: this.zIndex.min,
spdFilterOpacity: 0.2
},
roads: {},
filter: {
spdHideSegmentSmallerThan: 0,
spdMinSpeed: 0,
spdMaxSpeed: 0
}
};
Object.values(this.segmentsCategories).forEach(category => {
Object.values(category).forEach(roadType => {
let settingId = this.convertStringCaseStyle('snake', 'camel', `spd_show_speed_in_${roadType.name}`);
this.settings.roads[settingId] = true;
});
});
if (localSettings)
this.loadSettings(localSettings);
}
/**
* Checks if the plugin version changed and displays the changelog if necessary.
*/
checkVersionAndShowChangelog() {
this.logDebug('Checking plugin version.');
let localSpdVersion = JSON.parse(localStorage.getItem('wmeSpeedDisplayVersion'));
if (localSpdVersion == null || localSpdVersion != this.version) {
if (this.needResetSettings && !this.debugMode)
this.resetSettings();
this.hideSpeedDisplayDialog();
this.openChangelogDialog();
localStorage.setItem('wmeSpeedDisplayVersion', JSON.stringify(this.version));
}
}
/**
* Opens changelog dialog.
*/
openChangelogDialog() {
this.showSpeedDisplayDialog(`${this.getTranslation('changelog')} ${this.getTranslation('name')} v${this.version}`, this.getTranslation('changelogMessage'), null, `<a href="https://greasyfork.org/scripts/526702-wme-speed-display" target="_blank"><wz-button color="primary">${this.getTranslation('viewScript')}</wz-button></a>`);
}
/**
* Displays a modal dialog with customizable title, body content, and button text.
* @param {String} title - The title of the modal (default: 'Without title').
* @param {String} body - The HTML content or string inside the modal (default: '<span>Without body message</span>').
* @param {String} [closeButtonText] - The text for the close button (default: 'Close').
* @param {String} [customHtmlButtons] - Custom HTML button(s).
*/
showSpeedDisplayDialog(title, body = '<span>Without body message</span>', closeButtonText, customHtmlButtons) {
title = title && typeof title == 'string' ? title : 'Without title';
closeButtonText = closeButtonText ?? this.getTranslation('close');
let wzDialogContainer = document.getElementById('wz-dialog-container');
let divDialog = document.createElement('div');
divDialog.id = 'spd-dialog-container';
Object.assign(divDialog.style, {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
position: 'absolute',
width: '100vw',
height: '100vh',
top: 0,
left: 0
});
let divDialogHtml = `
<div class="dark-overlay" style="background-color: var(--background_modal, rgba(32, 33, 36, 0.6)); width: 100vw; height: 100vh; position: absolute; top: 0px; left: 0px; z-index: 9999;"></div>
<div style="display: flex; flex-direction: column; background-color: var(--background_default, #ffffff); border-radius: var(--wz-dialog-border-radius, 10px); box-shadow: rgba(0, 0, 0, 0.26) 0px 4px 8px 3px; width: var(--wz-dialog-width, 720px); height: var(--wz-dialog-height); padding: var(--wz-dialog-padding, var(--space-l, 24px)); position: fixed; z-index: 99999;">
<h3 style="margin-bottom: 10px;">${title}</h3>
<div style="max-height: 70vh; overflow: auto;">
${body}
</div>
<div style="display: flex; justify-content: end; gap: 10px; margin-top: 10px;">
<wz-button color="secondary" id="btn-spd-hide-dialog">${closeButtonText}</wz-button>`;
if (customHtmlButtons)
divDialogHtml += `${customHtmlButtons}`;
divDialogHtml += `
</div>
</div>`;
divDialog.innerHTML = divDialogHtml;
wzDialogContainer.appendChild(divDialog);
this.attachDialogListeners();
}
/**
* Closes the dialog and removes associated event listeners.
*/
hideSpeedDisplayDialog() {
let spdDialog = document.getElementById('spd-dialog-container');
document.removeEventListener('keydown', this.simulateBtnHideDialogClick.bind(this));
spdDialog?.remove();
}
/**
* Simulates a click on the close dialog button.
* @param {Event} event
*/
simulateBtnHideDialogClick(event) {
if (event.key && !['Escape', 'Enter'].includes(event.key))
return;
document.getElementById('btn-spd-hide-dialog')?.click();
}
/**
* Adds an alert to the warning group.
*
* @param {String} id - The unique identifier for the alert.
* @param {(String|Element)} body - The content of the alert, either as a string or an HTML element.
* @param {String} [variant] - The alert variant ('info', 'warning', 'danger' and 'success'). (default: 'info')
* @param {Boolean} [truncable] - Whether the alert content should be truncated. (default: true)
*/
addAlert(id, body, variant = 'info', truncable = true) {
let warningGroup = document.getElementById('spd-alert-group');
let alertHtml = `
<wz-alert id="${id}" role="alert" level="page" variant="${variant}" multiline="true" class="sidebar-alert inconsistent-direction-alert">
<div class="alertContent--O8sZl">`;
if (truncable) {
alertHtml +=`
<wz-truncate is-expanded="false" limit="50">
<wz-body2>${body}</wz-body2>
<span slot="ellipsis">${this.wmeTranslations.common.show_more}</span>
</wz-truncate>`;
} else {
alertHtml +=`<wz-body2>${body}</wz-body2>`;
}
alertHtml += `
</div>
<wz-button size="sm" color="text" slot="dismiss" class="spd-btn-dismiss-alert">${this.wmeTranslations.zoom_in_message.ok}</wz-button>
</wz-alert>`;
warningGroup.classList.remove('d-none');
warningGroup.insertAdjacentHTML('beforeend', alertHtml);
document.querySelector(`#${id} .spd-btn-dismiss-alert`).addEventListener('click', this.onDismissAlert.bind(this), {once: true});
}
/**
* Adds an snackbar on message container.
* @param {String} id
* @param {(String|Element)} body
* @param {String} [btnMsg]
*/
addSnackbar(id, body, btnMsg) {
if (id instanceof Event) {
id = 'snackbar-id-' + Math.floor(Math.random() * 100000);
btnMsg = `<wz-button color="text">${this.wmeTranslations.zoom_in_message.ok}</wz-button>`;
}
if (document.getElementById(id))
return;
let snackbarHtml = `
<div class="spd-snackbar" id="${id}">
<span class="text-wrapper">
${body}
</span>`;
if (btnMsg) {
snackbarHtml += btnMsg;
}
snackbarHtml += `
</div>`;
this.snackbarWrapper.insertAdjacentHTML('beforeend', snackbarHtml);
if (btnMsg)
document.querySelector(`.spd-snackbar#${id} wz-button`).addEventListener('click', this.removeSnackbar.bind(this), {once: true});
}
/**
* Remove current snackbar.
* @param {(Element|Event)} element - The element or event triggering the removal.
*/
removeSnackbar(element) {
if (element instanceof Event)
element = element.currentTarget;
element?.closest('.spd-snackbar')?.remove();
}
/**
* Remove all snackbars.
*/
removeAllSnackbars() {
let allSnackbars = document.querySelectorAll('.spd-snackbar');
allSnackbars.forEach(snackbar => snackbar.remove());
}
/**
* Create a custom manual snackbar.
*/
createSnackbarWrapper() {
let msgContainer = document.getElementById('map-message-container');
this.snackbarWrapper = document.querySelector('.spd-snackbar-wrapper');
if (!this.snackbarWrapper) {
this.snackbarWrapper = document.createElement('div');
this.snackbarWrapper.classList.add('spd-snackbar-wrapper');
msgContainer.appendChild(this.snackbarWrapper);
}
}
/**
* Adds script custom stylesheet.
*/
addStyle() {
let style = document.createElement('style');
style.innerHTML = `
/* General */
.d-none {
display: none;
}
.spd-info-message {
color: #777;
font-size: 11px;
line-height: 15px;
}
wz-card[id^="spd-theme-"] * {
pointer-events: none;
}
/* Snackbar */
#map-message-container {
display: flex;
flex-direction: column-reverse;
gap: 15px;
}
.spd-snackbar-wrapper {
display: flex;
flex-direction: column-reverse;
gap: 15px;
align-items: flex-start;
justify-content: flex-start;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
translate: 0 -15px;
z-index: 10001;
pointer-events: none;
}
.spd-snackbar {
display: flex;
align-items: center;
gap: 15px;
position: relative;
padding: var(--space-m, 16px) var(--space-always-m, 16px);
bottom: var(--wz-snackbar-bottom, initial);
left: 50%;
translate: -50%;
min-width: var(--wz-snackbar-min-width, 195px);
background-color: rgba(0, 0, 0, 0.8);
border: none;
border-radius: 6px;
box-shadow: 0 1px 2px 0 rgba(60, 64, 67, 0.3), 0 2px 6px 2px rgba(60, 64, 67, 0.15);
box-sizing: border-box;
color: var(--wz-snackbar-color, var(--always_white, #ffffff));
font-family: "Rubik", sans-serif;
font-size: 14px;
font-weight: 400;
justify-content: space-between;
pointer-events: all;
letter-spacing: 0.2px;
white-space: normal;
}
.spd-snackbar-wrapper .text-wrapper {
display: flex;
align-items: center;
gap: 15px;
}
.spd-snackbar-wrapper i.w-icon {
font-size: 20px;
}
.spd-snackbar-wrapper wz-button {
pointer-events: all;
}`;
document.head.appendChild(style);
}
/**
* Get the layer switcher element.
*/
getLayerSwitcher() {
let userScriptLayerSwitchers = document.querySelectorAll('.layer-selector-sdk-checkbox');
if (userScriptLayerSwitchers.length < 1) {
this.logDebug('Userscripts layer switches not found. Trying again...', false, 'warn');
setTimeout(() => this.getLayerSwitcher(), 1000);
return;
}
this.layerSwitcherElement = [...userScriptLayerSwitchers].find(checkbox => {
return checkbox.querySelector('.layer-selector-container').textContent.trim() == this.getTranslation('name');
});
this.layerSwitcherElement.checked = this.settings.spdEnabled;
}
/**
* Select a card theme.
* @param {Element} card
*/
selectThemeCard(card) {
let selectedTheme = this.getSelectedTheme();
selectedTheme?.removeAttribute('selected');
card.setAttribute('selected', 'true');
}
/**
* Get card element of the selected theme.
* @returns {Element} Returns the element of the selected theme.
*/
getSelectedTheme() {
return document.querySelector('wz-card[id^="spd-theme-"][selected=true]');
}
/**
* Gets the translation of the word or displays the key if no translation is found (to make it easier to find missing translations).
* @param {String} key Key in string format, separating subcategories by periods ".".
* @param {Object} [replaceStrings={}] An object containing placeholder values for dynamic translations.
*
* @returns {String} Translated string.
*/
getTranslation(key, replaceStrings = {}) {
return I18n.translate(`wmeSpd.${key}`, replaceStrings);
}
/**
* Sets translations for the current locale.
*/
defineTranslations() {
let translations;
switch (I18n.locale) {
case 'af':
// Afrikaans
translations = {
name: 'Spoedweergawes',
zoomOut: 'Verder',
zoomIn: 'Naby',
changelog: 'Veranderingsregister',
changelogMessage: `<h6>Wat is nuut:</h6><ul style="margin-bottom: 10px"><li>Noord-Amerikaanse spoedbordtema bygevoeg.</li></ul><h6>Regstellings:</h6><ul><li>Fout reggestel met eenrigting-spoedvertoning in lande met linksverkeer.</li></ul>`,
close: 'Sluit',
viewScript: 'Besoek Skrip',
viewChangelog: 'Besoek veranderingsregister',
reset: 'Herstel',
snackbar: {
updatingMapDisplay: 'Werk kaart ikone op. (Met opsetlike vertraging)',
errorFiltering: 'Fout met toepassing van filter. Minimum spoed kan nie groter as maksimum wees nie.',
},
title: {
general: 'Algemeen',
roadTypes: 'Padsoorte',
filter: 'Filtreer',
appearence: 'Vorm',
showOnRoadType: 'Wys op die volgende padsoorte:',
seeOnDiscuss: 'Kyk na die skrip se draad op die Discuss',
seeOnDiscord: 'Kyk na die skrip se kanaal op die Waze Script se Discord-bediener',
scriptDevBy: 'Bekyk my redakteur gebruikersprofiel',
},
label: {
displaySpeeds: 'Toon spoed',
showNoSpeed: 'Toon op segmente sonder spoed',
showOnRoundabout: 'Toon op rotondes',
showOnUnpaved: 'Toon op nie-geplaveide paaie',
maxZoom: 'Render tot die zoom:',
toggleLayerShortcut: 'Wissel laag sigbaarheid',
zIndex: 'Laagdiepte',
hideShorterSegments: 'Versteek segmente kleiner as',
speedFilter: 'Filter volgens snelheid',
min: 'Min:',
max: 'Max:',
opacity: 'Filter deursigtigheidsvlak:',
},
alertMessage: {
zIndex: `As jy \'n laagdiepte groter as <b>${this.zIndex.warn}</b> gebruik, sal die spoedlaag ander lae oorskadu en jy sal nie enige element op die skerm kan kies totdat jy die laagdiepte weer laer as <b>${this.zIndex.warn}</b> maak.`,
toggleVisibility: `Om die laag sigbaarheid van spoed aan/af te skakel, gaan eenvoudig na <b>Kaartlae > Paaie > Wys spoed</b> of gebruik die kortpad <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Standaard',
altViennaConv: 'Alternatiewe Wene Konvensie',
japan: 'Japan',
northAmerica: 'Noord-Amerika',
sacu: 'Suidelike Afrikaanse Douane-unie',
uk: 'Verenigde Koninkryk',
},
btn: {
updateSettingsTab: 'Werk menu op',
resetSettings: 'Herstel instellings',
seeOnDiscuss: 'Sien op die Bespreking',
seeOnDiscord: 'Sien op die Discord',
scriptDevBy: 'Skrip ontwikkel deur Luan Tavares',
}
};
break;
case 'ar':
// Arabic
translations = {
name: 'عرض السرعة',
zoomOut: 'أبعد',
zoomIn: 'أقرب',
changelog: 'سجل التغييرات',
changelogMessage: `<h6>ما الجديد:</h6><ul style="margin-bottom: 10px"><li>تمت إضافة نمط لافتة السرعة لأمريكا الشمالية.</li></ul><h6>الإصلاحات:</h6><ul><li>تم إصلاح مشكلة عرض السرعة للاتجاه الواحد في البلدان ذات حركة المرور اليسرى.</li></ul>`,
close: 'إغلاق',
viewScript: 'عرض السكربت',
viewChangelog: 'عرض سجل التغييرات',
reset: 'إعادة تعيين',
snackbar: {
updatingMapDisplay: 'تحديث رموز الخريطة. (بتأخير مقصود)',
errorFiltering: 'خطأ في تطبيق الفلتر. لا يمكن أن تكون السرعة الدنيا أكبر من القصوى.',
},
title: {
general: 'عام',
roadTypes: 'أنواع الطرق',
filter: 'تصفية',
appearence: 'المظهر',
showOnRoadType: 'عرض على أنواع الطرق التالية:',
seeOnDiscuss: 'شاهد موضوع السكربت على Discuss',
seeOnDiscord: 'شاهد قناة السكربت على خادم Discord الخاص بـ Waze Script',
scriptDevBy: 'عرض ملف تعريف مستخدم المحرر الخاص بي',
},
label: {
displaySpeeds: 'عرض السرعات',
showNoSpeed: 'عرض على القطاعات التي لا تحتوي على سرعة',
showOnRoundabout: 'عرض على الدوار',
showOnUnpaved: 'عرض على الطريق غير المعبدة',
maxZoom: 'عرض حتى التكبير:',
toggleLayerShortcut: 'تبديل طبقة عرض السرعة',
zIndex: 'عمق الطبقة',
hideShorterSegments: 'إخفاء في القطاعات الأصغر من',
speedFilter: 'تصفية حسب السرعة',
min: 'أدنى:',
max: 'أقصى:',
opacity: 'مستوى تعتيم الفلتر:',
},
alertMessage: {
zIndex: `عند استخدام عمق طبقة أكبر من <b>${this.zIndex.warn}</b>، ستتداخل طبقة السرعة مع الطبقات الأخرى ولن يمكنك تحديد أي عنصر على الشاشة حتى تعيد عمق الطبقة إلى أقل من <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `لتفعيل/إلغاء تفعيل طبقة عرض السرعات، يمكنك الذهاب إلى <b>الطبقات > الطرق > عرض السرعات</b> أو استخدام الاختصار <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'افتراضي',
altViennaConv: 'اتفاقية فيينا البديلة',
japan: 'اليابان',
northAmerica: 'أمريكا الشمالية',
sacu: 'اتحاد الجمارك في جنوب أفريقيا',
uk: 'المملكة المتحدة',
},
btn: {
updateSettingsTab: 'تحديث القائمة',
resetSettings: 'إعادة تعيين الإعدادات',
seeOnDiscuss: 'انظر في المناقشة',
seeOnDiscord: 'انظر في الديسكورد',
scriptDevBy: 'البرنامج النصي تم تطويره بواسطة لوان تافاريس',
}
};
break;
case 'bg':
// Bulgarian
translations = {
name: 'Показване на скоростта',
zoomOut: 'Отдалечи',
zoomIn: 'Приближи',
changelog: 'Журнал с промени',
changelogMessage: `<h6>Какво ново:</h6><ul style="margin-bottom: 10px"><li>Добавена тема със знаци за скорост за Северна Америка.</li></ul><h6>Поправки:</h6><ul><li>Поправен проблем с показването на скоростта при еднопосочно движение в страни с ляво движение.</li></ul>`,
close: 'Затвори',
viewScript: 'Преглед на скрипта',
viewChangelog: 'Преглед на журнала с промени',
reset: 'Нулиране',
snackbar: {
updatingMapDisplay: 'Актуализиране на иконите на картата. (С умишлено забавяне)',
errorFiltering: 'Грешка при прилагане на филтъра. Минималната скорост не може да бъде по-голяма от максималната.',
},
title: {
general: 'Общо',
roadTypes: 'Типове пътища',
filter: 'Филтър',
appearence: 'Изглед',
showOnRoadType: 'Покажи на следните типове пътища:',
seeOnDiscuss: 'Вижте нишката на скрипта в Discuss',
seeOnDiscord: 'Вижте канала на скрипта в Discord сървъра на Waze Script',
scriptDevBy: 'Вижте потребителския профил на моя редактор',
},
label: {
displaySpeeds: 'Показване на скорости',
showNoSpeed: 'Показване на сегменти без скорост',
showOnRoundabout: 'Показване на кръгови кръстовища',
showOnUnpaved: 'Показване на непавирани пътища',
maxZoom: 'Изобразяване до ниво на мащаб:',
toggleLayerShortcut: 'Превключване на слоя за показване на скоростта',
zIndex: 'Дълбочина на слоя',
hideShorterSegments: 'Скриване на сегменти по-малки от',
speedFilter: 'Филтриране по скорост',
min: 'Мин.:',
max: 'Макс.:',
opacity: 'Ниво на непрозрачност на филтъра:',
},
alertMessage: {
zIndex: `Ако използвате дълбочина на слоя, по-голяма от <b>${this.zIndex.warn}</b>, слойът за скорост ще се припокрие с други и няма да можете да изберете елемент на екрана, докато не го намалите под <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `За да активирате/деактивирате слоя за показване на скорости, можете да отидете в <b>Картови слоеве > Пътища > Показване на скорости</b> или да използвате клавишната комбинация <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'По подразбиране',
altViennaConv: 'Алтернативна Виенска конвенция',
japan: 'Япония',
northAmerica: 'Северна Америка',
sacu: 'Южноафрикански съюз за митници',
uk: 'Обединено кралство',
},
btn: {
updateSettingsTab: 'Актуализиране на менюто',
resetSettings: 'Нулиране на настройките',
seeOnDiscuss: 'Вижте в обсъждането',
seeOnDiscord: 'Вижте в Discord',
scriptDevBy: 'Скриптът е разработен от Луaн Таварес',
}
};
break;
case 'ca':
// Catalan
translations = {
name: 'Visualització de la Velocitat',
zoomOut: 'Més allunyat',
zoomIn: 'Més a prop',
changelog: 'Registre de canvis',
changelogMessage: `<h6>Novetats:</h6><ul style="margin-bottom: 10px"><li>S'ha afegit el tema de senyals de velocitat de Nord-amèrica.</li></ul><h6>Correccions:</h6><ul><li>S'ha solucionat un problema amb la visualització de la velocitat en sentit únic en països amb circulació per l'esquerra.</li></ul>`,
close: 'Tancar',
viewScript: 'Veure el script',
viewChangelog: 'Veure el registre de canvis',
reset: 'Restablir',
snackbar: {
updatingMapDisplay: 'Actualitzant les icones del mapa. (Amb retard intencionat)',
errorFiltering: 'Error en aplicar el filtre. La velocitat mínima no pot ser superior a la màxima.',
},
title: {
general: 'General',
roadTypes: 'Tipus de carreteres',
filter: 'Filtre',
appearence: 'Aparença',
showOnRoadType: 'Mostrar en els següents tipus de carreteres:',
seeOnDiscuss: 'Veure el fil del script a Discuss',
seeOnDiscord: 'Veure el canal del script al servidor de Discord de Waze Script',
scriptDevBy: 'Veure el meu perfil d\'usuari de l\'editor',
},
label: {
displaySpeeds: 'Mostrar velocitats',
showNoSpeed: 'Mostrar en segments sense velocitat',
showOnRoundabout: 'Mostrar en rotondes',
showOnUnpaved: 'Mostrar en vies no pavimentades',
maxZoom: 'Renderitzar fins al zoom:',
toggleLayerShortcut: 'Alternar la capa de visualització de la velocitat',
zIndex: 'Profunditat de la capa',
hideShorterSegments: 'Amagar en segments més petits que',
speedFilter: 'Filtrar per velocitat',
min: 'Min.:',
max: 'Max.:',
opacity: 'Nivell d’opacitat del filtre:',
},
alertMessage: {
zIndex: `Si utilitzeu una profunditat de capa superior a <b>${this.zIndex.warn}</b>, la capa de velocitat es superposarà a altres i no podreu seleccionar cap element a la pantalla fins que la rebaixeu per sota de <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Per activar/desactivar la capa de visualització de velocitats, podeu anar a <b>Capes del mapa > Vies > Mostrar velocitats</b> o utilitzar la drecera <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Per defecte',
altViennaConv: 'Convenció alternativa de Viena',
japan: 'Japó',
northAmerica: 'Amèrica del Nord',
sacu: 'Unió duanera de l\'Àfrica Austral',
uk: 'Regne Unit',
},
btn: {
updateSettingsTab: 'Actualitzar el menú',
resetSettings: 'Restablir la configuració',
seeOnDiscuss: 'Veure a la discussió',
seeOnDiscord: 'Veure a Discord',
scriptDevBy: 'Script desenvolupat per Luan Tavares',
}
};
break;
case 'cs':
// Czech
translations = {
name: 'Zobrazení Rychlosti',
zoomOut: 'Více vzdálené',
zoomIn: 'Více přiblížené',
changelog: 'Seznam změn',
changelogMessage: `<h6>Novinky:</h6><ul style="margin-bottom: 10px"><li>Přidáno téma rychlostních značek pro Severní Ameriku.</li></ul><h6>Opravy:</h6><ul><li>Opraven problém se zobrazením rychlosti v jednosměrných ulicích v zemích s levostranným provozem.</li></ul>`,
close: 'Zavřít',
viewScript: 'Zobrazit skript',
viewChangelog: 'Zobrazit seznam změn',
reset: 'Obnovit',
snackbar: {
updatingMapDisplay: 'Aktualizace ikon mapy. (S úmyslným zpožděním)',
errorFiltering: 'Chyba při aplikaci filtru. Minimální rychlost nemůže být větší než maximální.',
},
title: {
general: 'Obecné',
roadTypes: 'Typy silnic',
filter: 'Filtr',
appearence: 'Vzhled',
showOnRoadType: 'Zobrazit na následujících typech silnic:',
seeOnDiscuss: 'Podívejte se na vlákno skriptu na Discuss',
seeOnDiscord: 'Podívejte se na kanál skriptu na Discord serveru Waze Script',
scriptDevBy: 'Zobrazit můj uživatelský profil editoru',
},
label: {
displaySpeeds: 'Zobrazit rychlosti',
showNoSpeed: 'Zobrazit na segmentu bez rychlosti',
showOnRoundabout: 'Zobrazit na kruhovém objezdu',
showOnUnpaved: 'Zobrazit na nezpevněné cestě',
maxZoom: 'Renderovat až na zoom:',
toggleLayerShortcut: 'Přepnout vrstvu zobrazení rychlosti',
zIndex: 'Hloubka vrstvy',
hideShorterSegments: 'Skrýt na segmentech menších než',
speedFilter: 'Filtrovat podle rychlosti',
min: 'Min.:',
max: 'Max.:',
opacity: 'Úroveň neprůhlednosti filtru:',
},
alertMessage: {
zIndex: `Pokud použijete hloubku vrstvy vyšší než <b>${this.zIndex.warn}</b>, vrstva rychlosti se překryje s ostatními a nebude možné vybrat žádný prvek na obrazovce, dokud ji opět nezmenšíte pod <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Pro aktivaci/deaktivaci vrstvy zobrazení rychlostí stačí přejít do <b>Mapové vrstvy > Cesty > Zobrazit rychlosti</b> nebo použít klávesovou zkratku <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Výchozí',
altViennaConv: 'Alternativní Vídeňská úmluva',
japan: 'Japonsko',
northAmerica: 'Severní Amerika',
sacu: 'Jižní africká celní unie',
uk: 'Spojené království',
},
btn: {
updateSettingsTab: 'Aktualizovat nabídku',
resetSettings: 'Obnovit nastavení',
seeOnDiscuss: 'Zobrazit v diskusi',
seeOnDiscord: 'Zobrazit na Discordu',
scriptDevBy: 'Skript vyvinutý Luanem Tavaresem',
}
};
break;
case 'da':
// Danish
translations = {
name: 'Hastighedsvisning',
zoomOut: 'Mere afstand',
zoomIn: 'Mere tæt på',
changelog: 'Ændringslog',
changelogMessage: `<h6>Hvad er nyt:</h6><ul style="margin-bottom: 10px"><li>Tilføjet nordamerikansk fartskilt-tema.</li></ul><h6>Rettelser:</h6><ul><li>Rettet problem med visning af hastighed i ensrettede veje i lande med venstrekørsel.</li></ul>`,
close: 'Luk',
viewScript: 'Se script',
viewChangelog: 'Se ændringslog',
reset: 'Nulstil',
snackbar: {
updatingMapDisplay: 'Opdaterer kortikoner. (Med forsætlig forsinkelse)',
errorFiltering: 'Fejl ved anvendelse af filter. Minimumshastighed kan ikke være større end maksimum.',
},
title: {
general: 'Generelt',
roadTypes: 'Straßentypen',
filter: 'Filter',
appearence: 'Erscheinungsbild',
showOnRoadType: 'An den folgenden Straßentypen anzeigen:',
seeOnDiscuss: 'Siehe den Thread des Skripts auf Discuss',
seeOnDiscord: 'Siehe den Kanal des Skripts auf dem Waze Script Discord-Server',
scriptDevBy: 'Se min redaktørbrugerprofil',
},
label: {
displaySpeeds: 'Vis hastigheder',
showNoSpeed: 'Vis på segmenter uden hastighed',
showOnRoundabout: 'Vis på rundkørsler',
showOnUnpaved: 'Vis på ubelagte veje',
maxZoom: 'Render op til zoom:',
toggleLayerShortcut: 'Skift synlighed af hastighedslaget',
zIndex: 'Lagdybde',
hideShorterSegments: 'Skjul på segmenter mindre end',
speedFilter: 'Filtrer efter hastighed',
min: 'Min.:',
max: 'Max.:',
opacity: 'Filterets opacitetsniveau:',
},
alertMessage: {
zIndex: `Når du bruger en lagdybde større end <b>${this.zIndex.warn}</b>, vil hastighedslaget dække de andre, og det vil ikke være muligt at vælge et element på skærmen, før du sænker dybden igen under <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `For at aktivere/deaktivere hastighedslaget, skal du gå til <b>Kortlag > Veje > Vis hastigheder</b> eller bruge genvejstasten <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Standard',
altViennaConv: 'Alternativ Wienerkonvention',
japan: 'Japan',
northAmerica: 'Nordamerika',
sacu: 'Southern African Customs Union',
uk: 'Storbritannien',
},
btn: {
updateSettingsTab: 'Opdater menu',
resetSettings: 'Nulstil indstillinger',
seeOnDiscuss: 'Se i diskussionen',
seeOnDiscord: 'Se på Discord',
scriptDevBy: 'Script udviklet af Luan Tavares',
}
};
break;
case 'de':
// German
translations = {
name: 'Geschwindigkeitsanzeige',
zoomOut: 'Weiter entfernt',
zoomIn: 'Mehr heran',
changelog: 'Änderungsprotokoll',
changelogMessage: `<h6>Was ist neu:</h6><ul style="margin-bottom: 10px"><li>Nordamerikanisches Tempolimit-Schild-Design hinzugefügt.</li></ul><h6>Fehlerbehebungen:</h6><ul><li>Problem mit der Einbahnstraßenanzeige in Ländern mit Linksverkehr behoben.</li></ul>`,
close: 'Schließen',
viewScript: 'Skript anzeigen',
viewChangelog: 'Änderungsprotokoll anzeigen',
reset: 'Zurücksetzen',
snackbar: {
updatingMapDisplay: 'Aktualisierung der Kartensymbole. (Mit absichtlicher Verzögerung)',
errorFiltering: 'Fehler beim Anwenden des Filters. Die Mindestgeschwindigkeit darf nicht größer als die Höchstgeschwindigkeit sein.',
},
title: {
general: 'Allgemein',
roadTypes: 'Straßentypen',
filter: 'Filter',
appearence: 'Erscheinungsbild',
showOnRoadType: 'Auf den folgenden Straßentypen anzeigen:',
seeOnDiscuss: 'Siehe den Thread des Skripts auf Discuss',
seeOnDiscord: 'Siehe den Kanal des Skripts auf dem Waze Script Discord-Server',
scriptDevBy: 'Mein Editor-Benutzerprofil anzeigen',
},
label: {
displaySpeeds: 'Geschwindigkeiten anzeigen',
showNoSpeed: 'Auf Segmenten ohne Geschwindigkeit anzeigen',
showOnRoundabout: 'Auf Kreisverkehr anzeigen',
showOnUnpaved: 'Auf unbefestigten Straßen anzeigen',
maxZoom: 'Rendern bis Zoom:',
toggleLayerShortcut: 'Schicht für Geschwindigkeitsanzeige umschalten',
zIndex: 'Schichttiefe',
hideShorterSegments: 'Verstecken bei Segmenten kürzer als',
speedFilter: 'Nach Geschwindigkeit filtern',
min: 'Min.:',
max: 'Max.:',
opacity: 'Filterdeckkraftstufe:',
},
alertMessage: {
zIndex: `Wenn Sie eine Schichttiefe von mehr als <b>${this.zIndex.warn}</b> verwenden, wird die Geschwindigkeits-Schicht andere überlagern, und es wird nicht möglich sein, ein Element auf dem Bildschirm auszuwählen, bis Sie die Schichttiefe wieder unter <b>${this.zIndex.warn}</b> verringern.`,
toggleVisibility: `Um die Sichtbarkeit der Geschwindigkeits-Schicht zu aktivieren/deaktivieren, gehen Sie zu <b>Kartenebenen > Straßen > Geschwindigkeiten anzeigen</b> oder verwenden Sie die Verknüpfung <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Standard',
altViennaConv: 'Alternative Wien-Konvention',
japan: 'Japan',
northAmerica: 'Nordamerika',
sacu: 'Südafrikanische Zollunion',
uk: 'Vereinigtes Königreich',
},
btn: {
updateSettingsTab: 'Menü aktualisieren',
resetSettings: 'Einstellungen zurücksetzen',
seeOnDiscuss: 'Im Diskussionsthread ansehen',
seeOnDiscord: 'Auf Discord ansehen',
scriptDevBy: 'Skript entwickelt von Luan Tavares',
}
};
break;
case 'el':
// Greek
translations = {
name: 'Εμφάνιση Ταχύτητας',
zoomOut: 'Περισσότερη απόσταση',
zoomIn: 'Πιο κοντά',
changelog: 'Αρχείο αλλαγών',
changelogMessage: `<h6>Τι νέο υπάρχει:</h6><ul style="margin-bottom: 10px"><li>Προστέθηκε θέμα πινακίδων ταχύτητας Βόρειας Αμερικής.</li></ul><h6>Διορθώσεις:</h6><ul><li>Διορθώθηκε το πρόβλημα εμφάνισης ταχύτητας μονής κατεύθυνσης σε χώρες με κυκλοφορία στα αριστερά.</li></ul>`,
close: 'Κλείσιμο',
viewScript: 'Δείτε το script',
viewChangelog: 'Δείτε το αρχείο αλλαγών',
reset: 'Επαναφορά',
snackbar: {
updatingMapDisplay: 'Ενημέρωση εικονιδίων χάρτη. (Με σκόπιμη καθυστέρηση)',
errorFiltering: 'Σφάλμα στην εφαρμογή του φίλτρου. Η ελάχιστη ταχύτητα δεν μπορεί να είναι μεγαλύτερη από τη μέγιστη.',
},
title: {
general: 'Γενικά',
roadTypes: 'Τύποι Δρόμων',
filter: 'Φίλτρο',
appearence: 'Εμφάνιση',
showOnRoadType: 'Εμφάνιση στους εξής τύπους δρόμων:',
seeOnDiscuss: 'Δείτε το νήμα του script στο Discuss',
seeOnDiscord: 'Δείτε το κανάλι του script στον server Discord του Waze Script',
scriptDevBy: 'Δείτε το προφίλ χρήστη του επεξεργαστή μου',
},
label: {
displaySpeeds: 'Εμφάνιση ταχυτήτων',
showNoSpeed: 'Εμφάνιση σε τμήματα χωρίς ταχύτητα',
showOnRoundabout: 'Εμφάνιση σε κυκλικούς κόμβους',
showOnUnpaved: 'Εμφάνιση σε α paved δρόμους',
maxZoom: 'Απεικόνιση μέχρι το ζουμ:',
toggleLayerShortcut: 'Αλλαγή ορατότητας του επιπέδου ταχύτητας',
zIndex: 'Βάθος επιπέδου',
hideShorterSegments: 'Απόκρυψη σε τμήματα μικρότερα από',
speedFilter: 'Φίλτρο κατά ταχύτητα',
min: 'Ελάχιστο:',
max: 'Μέγιστο:',
opacity: 'Επίπεδο αδιαφάνειας φίλτρου:',
},
alertMessage: {
zIndex: `Όταν χρησιμοποιείτε βάθος επιπέδου μεγαλύτερο από <b>${this.zIndex.warn}</b>, το επίπεδο ταχύτητας θα επικαλύψει τα άλλα και δεν θα μπορείτε να επιλέξετε κανένα στοιχείο στην οθόνη μέχρι να το χαμηλώσετε ξανά κάτω από <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Για να ενεργοποιήσετε/απενεργοποιήσετε το επίπεδο ταχύτητας, πηγαίνετε στο <b>Επίπεδα Χάρτη > Οδοί > Εμφάνιση ταχυτήτων</b> ή χρησιμοποιήστε την συντόμευση <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Προεπιλογή',
altViennaConv: 'Εναλλακτική Σύμβαση της Βιέννης',
japan: 'Ιαπωνία',
northAmerica: 'Βόρεια Αμερική',
sacu: 'Νότια Αφρικανική Τελωνειακή Ένωση',
uk: 'Ηνωμένο Βασίλειο',
},
btn: {
updateSettingsTab: 'Ενημέρωση μενού',
resetSettings: 'Επαναφορά ρυθμίσεων',
seeOnDiscuss: 'Δείτε στη Συζήτηση',
seeOnDiscord: 'Δείτε στο Discord',
scriptDevBy: 'Το σενάριο αναπτύχθηκε από τον Luan Tavares',
}
};
break;
case 'en-AU':
// English (Australia)
translations = {
name: 'Speed Display',
zoomOut: 'Zoom Out',
zoomIn: 'Zoom In',
changelog: 'Changelog',
changelogMessage: `<h6>What’s New:</h6><ul style="margin-bottom: 10px"><li>Added North American speed sign theme.</li></ul><h6>Fixes:</h6><ul><li>Fixed one-way speed display issue in left-hand traffic countries.</li></ul>`,
close: 'Close',
viewScript: 'View Script',
viewChangelog: 'View Changelog',
reset: 'Reset',
snackbar: {
updatingMapDisplay: 'Updating map icons. (With intentional delay)',
errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
},
title: {
general: 'General',
roadTypes: 'Road Types',
filter: 'Filter',
appearence: 'Appearance',
showOnRoadType: 'Show on the following road types:',
seeOnDiscuss: 'See the script\'s thread on Discuss',
seeOnDiscord: 'See the script\'s channel on the Waze Script Discord server',
scriptDevBy: 'View my editor user profile',
},
label: {
displaySpeeds: 'Display Speeds',
showNoSpeed: 'Show on segments without speed',
showOnRoundabout: 'Show on roundabouts',
showOnUnpaved: 'Show on unpaved roads',
maxZoom: 'Render up to zoom level:',
toggleLayerShortcut: 'Toggle speed display layer',
zIndex: 'Layer Depth',
hideShorterSegments: 'Hide segments shorter than',
speedFilter: 'Filter by speed',
min: 'Min:',
max: 'Max:',
opacity: 'Filter opacity level:',
},
alertMessage: {
zIndex: `When using a layer depth greater than <b>${this.zIndex.warn}</b>, the speed layer will overlap other layers, and no element can be selected until you lower it back below <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `To toggle the speed display layer, go to <b>Map Layers > Roads > Display Speeds</b> or use the shortcut <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Default',
altViennaConv: 'Alternative Vienna Convention',
japan: 'Japan',
northAmerica: 'North America',
sacu: 'Southern African Customs Union',
uk: 'United Kingdom',
},
btn: {
updateSettingsTab: 'Update Menu',
resetSettings: 'Reset Settings',
seeOnDiscuss: 'See on the Discuss',
seeOnDiscord: 'See on Discord',
scriptDevBy: 'Script developed by Luan Tavares',
}
};
break;
case 'en-GB':
// English (UK)
translations = {
name: 'Speed Display',
zoomOut: 'Zoom Out',
zoomIn: 'Zoom In',
changelog: 'Changelog',
changelogMessage: `<h6>What’s New:</h6><ul style="margin-bottom: 10px"><li>Added North American speed sign theme.</li></ul><h6>Fixes:</h6><ul><li>Fixed one-way speed display issue in left-hand traffic countries.</li></ul>`,
close: 'Close',
viewScript: 'View Script',
viewChangelog: 'View Changelog',
reset: 'Reset',
snackbar: {
updatingMapDisplay: 'Updating map icons. (With intentional delay)',
errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
},
title: {
general: 'General',
roadTypes: 'Road Types',
filter: 'Filter',
appearence: 'Appearance',
showOnRoadType: 'Show on the following road types:',
seeOnDiscuss: 'See the script\'s thread on Discuss',
seeOnDiscord: 'See the script\'s channel on the Waze Script Discord server',
scriptDevBy: 'View my editor user profile',
},
label: {
displaySpeeds: 'Display Speeds',
showNoSpeed: 'Show on segments without speed',
showOnRoundabout: 'Show on roundabouts',
showOnUnpaved: 'Show on unpaved roads',
maxZoom: 'Render up to zoom level:',
toggleLayerShortcut: 'Toggle speed display layer',
zIndex: 'Layer Depth',
hideShorterSegments: 'Hide segments shorter than',
speedFilter: 'Filter by speed',
min: 'Min:',
max: 'Max:',
opacity: 'Filter opacity level:',
},
alertMessage: {
zIndex: `When using a layer depth greater than <b>${this.zIndex.warn}</b>, the speed layer will overlap other layers, and no element can be selected until you lower it back below <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `To toggle the speed display layer, go to <b>Map Layers > Roads > Display Speeds</b> or use the shortcut <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Default',
altViennaConv: 'Alternative Vienna Convention',
japan: 'Japan',
northAmerica: 'North America',
sacu: 'Southern African Customs Union',
uk: 'United Kingdom',
},
btn: {
updateSettingsTab: 'Update Menu',
resetSettings: 'Reset Settings',
seeOnDiscuss: 'See on the Discuss',
seeOnDiscord: 'See on Discord',
scriptDevBy: 'Script developed by Luan Tavares',
}
};
break;
case 'en-US':
// US English
translations = {
name: 'Speed Display',
zoomOut: 'Zoom Out',
zoomIn: 'Zoom In',
changelog: 'Changelog',
changelogMessage: `<h6>What’s New:</h6><ul style="margin-bottom: 10px"><li>Added North American speed sign theme.</li></ul><h6>Fixes:</h6><ul><li>Fixed one-way speed display issue in left-hand traffic countries.</li></ul>`,
close: 'Close',
viewScript: 'View Script',
viewChangelog: 'View Changelog',
reset: 'Reset',
snackbar: {
updatingMapDisplay: 'Updating map icons. (With intentional delay)',
errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
},
title: {
general: 'General',
roadTypes: 'Road Types',
filter: 'Filter',
appearence: 'Appearance',
showOnRoadType: 'Show on the following road types:',
seeOnDiscuss: 'See the script\'s thread on Discuss',
seeOnDiscord: 'See the script\'s channel on the Waze Script Discord server',
scriptDevBy: 'View my editor user profile',
},
label: {
displaySpeeds: 'Display Speeds',
showNoSpeed: 'Show on segments without speed',
showOnRoundabout: 'Show on roundabouts',
showOnUnpaved: 'Show on unpaved roads',
maxZoom: 'Render up to zoom level:',
toggleLayerShortcut: 'Toggle speed display layer',
zIndex: 'Layer Depth',
hideShorterSegments: 'Hide segments shorter than',
speedFilter: 'Filter by speed',
min: 'Min:',
max: 'Max:',
opacity: 'Filter opacity level:',
},
alertMessage: {
zIndex: `When using a layer depth greater than <b>${this.zIndex.warn}</b>, the speed layer will overlap other layers, and no element can be selected until you lower it back below <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `To toggle the speed display layer, go to <b>Map Layers > Roads > Display Speeds</b> or use the shortcut <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Default',
altViennaConv: 'Alternative Vienna Convention',
japan: 'Japan',
northAmerica: 'North America',
sacu: 'Southern African Customs Union',
uk: 'United Kingdom',
},
btn: {
updateSettingsTab: 'Update Menu',
resetSettings: 'Reset Settings',
seeOnDiscuss: 'See on the Discuss',
seeOnDiscord: 'See on Discord',
scriptDevBy: 'Script developed by Luan Tavares',
}
};
break;
case 'es':
// Spanish
translations = {
name: 'Exhibición de Velocidad',
zoomOut: 'Alejar',
zoomIn: 'Acercar',
changelog: 'Registro de cambios',
changelogMessage: `<h6>Novedades:</h6><ul style="margin-bottom: 10px"><li>Se añadió el tema de señales de velocidad de América del Norte.</li></ul><h6>Correcciones:</h6><ul><li>Se corrigió el problema de visualización de velocidad en sentido único en países con tráfico por la izquierda.</li></ul>`,
close: 'Cerrar',
viewScript: 'Ver script',
viewChangelog: 'Ver registro de cambios',
reset: 'Restablecer',
snackbar: {
updatingMapDisplay: 'Actualizando iconos del mapa. (Con retraso intencionado)',
errorFiltering: 'Error al aplicar el filtro. La velocidad mínima no puede ser mayor que la máxima.',
},
title: {
general: 'General',
roadTypes: 'Tipos de carretera',
filter: 'Filtro',
appearence: 'Apariencia',
showOnRoadType: 'Mostrar en los siguientes tipos de carretera:',
seeOnDiscuss: 'Ver el hilo del script en Discuss',
seeOnDiscord: 'Ver el canal del script en el servidor de Discord de Waze Script',
scriptDevBy: 'Ver mi perfil de usuario del editor',
},
label: {
displaySpeeds: 'Mostrar velocidades',
showNoSpeed: 'Mostrar en segmentos sin velocidad',
showOnRoundabout: 'Mostrar en rotondas',
showOnUnpaved: 'Mostrar en caminos no pavimentados',
maxZoom: 'Renderizar hasta el nivel de zoom:',
toggleLayerShortcut: 'Alternar capa de exhibición de velocidad',
zIndex: 'Profundidad de la capa',
hideShorterSegments: 'Ocultar segmentos más pequeños que',
speedFilter: 'Filtrar por velocidad',
min: 'Mín.:',
max: 'Máx.:',
opacity: 'Nivel de opacidad del filtro:',
},
alertMessage: {
zIndex: `Al utilizar una profundidad de capa mayor a <b>${this.zIndex.warn}</b>, la capa de velocidad se superpondrá a las demás y no se podrá seleccionar ningún elemento hasta que la bajes de nuevo por debajo de <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Para activar/desactivar la capa de exhibición de velocidades, dirígete a <b>Capas del Mapa > Vías > Mostrar velocidades</b> o usa el acceso directo <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Predeterminado',
altViennaConv: 'Convención de Viena Alternativa',
japan: 'Japón',
northAmerica: 'América del Norte',
sacu: 'Unión Aduanera de África Austral',
uk: 'Reino Unido',
},
btn: {
updateSettingsTab: 'Actualizar menú',
resetSettings: 'Restablecer configuración',
seeOnDiscuss: 'Ver en la Discusión',
seeOnDiscord: 'Ver en Discord',
scriptDevBy: 'Script desarrollado por Luan Tavares',
}
};
break;
case 'es-419':
// Latin-american spanish
translations = {
name: 'Exhibición de Velocidad',
zoomOut: 'Alejar',
zoomIn: 'Acercar',
changelog: 'Registro de cambios',
changelogMessage: `<h6>Novedades:</h6><ul style="margin-bottom: 10px"><li>Se añadió el tema de señales de velocidad de América del Norte.</li></ul><h6>Correcciones:</h6><ul><li>Se corrigió el problema de visualización de velocidad en sentido único en países con tráfico por la izquierda.</li></ul>`,
close: 'Cerrar',
viewScript: 'Ver script',
viewChangelog: 'Ver registro de cambios',
reset: 'Restablecer',
snackbar: {
updatingMapDisplay: 'Actualizando íconos del mapa. (Con retraso intencionado)',
errorFiltering: 'Error al aplicar el filtro. La velocidad mínima no puede ser mayor que la máxima.',
},
title: {
general: 'General',
roadTypes: 'Tipos de carretera',
filter: 'Filtro',
appearence: 'Apariencia',
showOnRoadType: 'Mostrar en los siguientes tipos de carretera:',
seeOnDiscuss: 'Ver el hilo del script en Discuss',
seeOnDiscord: 'Ver el canal del script en el servidor de Discord de Waze Script',
scriptDevBy: 'Ver mi perfil de usuario del editor',
},
label: {
displaySpeeds: 'Mostrar velocidades',
showNoSpeed: 'Mostrar en segmentos sin velocidad',
showOnRoundabout: 'Mostrar en rotondas',
showOnUnpaved: 'Mostrar en caminos no pavimentados',
maxZoom: 'Renderizar hasta el nivel de zoom:',
toggleLayerShortcut: 'Alternar capa de exhibición de velocidad',
zIndex: 'Profundidad de la capa',
hideShorterSegments: 'Ocultar segmentos más pequeños que',
speedFilter: 'Filtrar por velocidad',
min: 'Mín.:',
max: 'Máx.:',
opacity: 'Nivel de opacidad del filtro:',
},
alertMessage: {
zIndex: `Al utilizar una profundidad de capa mayor a <b>${this.zIndex.warn}</b>, la capa de velocidad se superpondrá a las demás y no se podrá seleccionar ningún elemento hasta que la bajes de nuevo por debajo de <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Para activar/desactivar la capa de exhibición de velocidades, dirígete a <b>Capas del Mapa > Vías > Mostrar velocidades</b> o usa el acceso directo <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Predeterminado',
altViennaConv: 'Convención de Viena Alternativa',
japan: 'Japón',
northAmerica: 'América del Norte',
sacu: 'Unión Aduanera de África Austral',
uk: 'Reino Unido',
},
btn: {
updateSettingsTab: 'Actualizar menú',
resetSettings: 'Restablecer configuración',
seeOnDiscuss: 'Ver en el Debate',
seeOnDiscord: 'Ver en Discord',
scriptDevBy: 'Script desarrollado por Luan Tavares',
}
};
break;
case 'et':
// Estonian
translations = {
name: 'Kiiruskuva',
zoomOut: 'Kaugemal',
zoomIn: 'Lähemal',
changelog: 'Muudatuste ajalugu',
changelogMessage: `<h6>Mis on uut:</h6><ul style="margin-bottom: 10px"><li>Lisatud Põhja-Ameerika kiirusmärkide teema.</li></ul><h6>Parandused:</h6><ul><li>Parandatud ühesuunalise kiiruse kuvamise probleem vasakpoolse liiklusega riikides.</li></ul>`,
close: 'Sulge',
viewScript: 'Vaata skripti',
viewChangelog: 'Vaata muudatuste ajalugu',
reset: 'Lähtesta',
snackbar: {
updatingMapDisplay: 'Kaardi ikoonide värskendamine. (Tahtliku viivitusega)',
errorFiltering: 'Viga filtri rakendamisel. Minimaalne kiirus ei saa olla suurem kui maksimaalne.',
},
title: {
general: 'Üldine',
roadTypes: 'Teetüübid',
filter: 'Filtrid',
appearence: 'Välimus',
showOnRoadType: 'Kuva järgmistes teetüüpides:',
seeOnDiscuss: 'Vaata skripti teemat Discussis',
seeOnDiscord: 'Vaata skripti kanalit Waze Scripti Discord serveris',
scriptDevBy: 'Vaadake minu redaktori kasutajaprofiili',
},
label: {
displaySpeeds: 'Kuva kiirus',
showNoSpeed: 'Kuva ilma kiiruseta segmentidel',
showOnRoundabout: 'Kuva ringteel',
showOnUnpaved: 'Kuva kõvaketšimata teedel',
maxZoom: 'Kuva kuni suumi tasemeni:',
toggleLayerShortcut: 'Kiiruskuva kihi vahetamise otsetee',
zIndex: 'Kihi sügavus',
hideShorterSegments: 'Peida lühemad segmendid',
speedFilter: 'Filtreeri kiiruse järgi',
min: 'Miinimum:',
max: 'Maksimum:',
opacity: 'Filtri opakuse tasand:',
},
alertMessage: {
zIndex: `Kui kasutad kihi sügavust üle <b>${this.zIndex.warn}</b>, kattub kiiruskiht teiste kihtidega ja te ei saa valida ühtegi elementi ekraanil enne, kui vähendate kihi sügavust alla <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Kiiruskihtide nähtavuse vahetamiseks mine <b>Kaardi kihid > Teed > Kuvada kiirus</b> või kasuta kiirklahvi <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Vaikimisi',
altViennaConv: 'Alternatiivne Viini konventsioon',
japan: 'Jaapan',
northAmerica: 'Põhja-Ameerika',
sacu: 'Lõuna-Aafrika Tolliliit',
uk: 'Ühendkuningriik',
},
btn: {
updateSettingsTab: 'Uuenda menüü',
resetSettings: 'Lähtesta seaded',
seeOnDiscuss: 'Vaata arutelus',
seeOnDiscord: 'Vaata Discordis',
scriptDevBy: 'Skripti arendas Luan Tavares',
}
};
break;
case 'eu':
// Basque
translations = {
name: 'Abiadura Erakustea',
zoomOut: 'Hurbilago',
zoomIn: 'Aldez aurretik',
changelog: 'Aldaketa erregistroa',
changelogMessage: `<h6>Zer berria:</h6><ul style="margin-bottom: 10px"><li>Gehitu da Ipar Amerikako abiadura-seinaleen gaia.</li></ul><h6>Konponketak:</h6><ul><li>Norabide bakarreko abiadura erakusteko arazoa konpondu da ezkerreko zirkulazioa duten herrialdeetan.</li></ul>`,
close: 'Itxi',
viewScript: 'Ikusi script-a',
viewChangelog: 'Ikusi aldaketak',
reset: 'Berrezarri',
snackbar: {
updatingMapDisplay: 'Mapa-ikonoak eguneratzen. (Atzerapen intzentzionalarekin)',
errorFiltering: 'Errorea iragazkia aplikatzean. Gutxieneko abiadura ezin da handiagoa izan gehienekoa baino.',
},
title: {
general: 'Orokorra',
roadTypes: 'Errepide motak',
filter: 'Filtratu',
appearence: 'Itxura',
showOnRoadType: 'Erakutsi hurrengo errepide motetan:',
seeOnDiscuss: 'Ikusi skriptaren haria Discuss-en',
seeOnDiscord: 'Ikusi skriptaren kanala Waze Script-en Discord zerbitzuan',
scriptDevBy: 'Ikusi nire editorearen erabiltzaile-profila',
},
label: {
displaySpeeds: 'Erakutsi abiadurak',
showNoSpeed: 'Erakutsi abiadurarik gabeko segmentuetan',
showOnRoundabout: 'Erakutsi biribilguneetan',
showOnUnpaved: 'Erakutsi asfaltatu gabeko bideetan',
maxZoom: 'Erakutsi zoom maila honetara arte:',
toggleLayerShortcut: 'Abiadura geruza aldatu laburdura',
zIndex: 'Geruzaren sakonera',
hideShorterSegments: 'Ezkutatu segmentu txikiagoak',
speedFilter: 'Iragazi abiaduraren arabera',
min: 'Gutxiengoa:',
max: 'Maximoa:',
opacity: 'Filtroko opazitatea maila:',
},
alertMessage: {
zIndex: `Geruza sakonera <b>${this.zIndex.warn}</b> baino handiagoa bada, abiadura geruzak beste geruzak estaliko ditu eta ezin izango duzu elementurik aukeratu pantailan, <b>${this.zIndex.warn}</b> baino baxuagoa den geruzarekin berriro jaitsi arte.`,
toggleVisibility: `Abiadura geruza bistaratzea aktibatu/itzaltzeko, joan <b>Mapa geruzak > Bideak > Abiadura erakutsi</b> eta erabili laburdura <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Definitibo',
altViennaConv: 'Alternatibo Vienna Konbentzioa',
japan: 'Japonia',
northAmerica: 'Ipar Amerika',
sacu: 'Hegoaldeko Afrikako Aduana Batasuna',
uk: 'Erresuma Batua',
},
btn: {
updateSettingsTab: 'Eguneratu menu',
resetSettings: 'Berrezarri ezarpenak',
seeOnDiscuss: 'Ikusi eztabaidan',
seeOnDiscord: 'Ikusi Discord-en',
scriptDevBy: 'Script-a Luan Tavares-ek garatu du',
}
};
break;
case 'fa-IR':
// Persian (Iran)
translations = {
name: 'نمایش سرعت',
zoomOut: 'بیشتر دور',
zoomIn: 'بیشتر نزدیک',
changelog: 'تغییرات ثبت شده',
changelogMessage: `<h6>جدید چه خبر:</h6><ul style="margin-bottom: 10px"><li>قالب تابلوهای سرعت آمریکای شمالی اضافه شد.</li></ul><h6>اصلاحات:</h6><ul><li>مشکل نمایش سرعت در خیابانهای یکطرفه در کشورهای با رانندگی در سمت چپ رفع شد.</li></ul>`,
close: 'بستن',
viewScript: 'مشاهده اسکریپت',
viewChangelog: 'مشاهده تغییرات ثبت شده',
reset: 'بازنشانی',
snackbar: {
updatingMapDisplay: 'بهروزرسانی نمادهای نقشه. (با تأخیر عمدی)',
errorFiltering: 'خطا در اعمال فیلتر. حداقل سرعت نمیتواند بیشتر از حداکثر باشد.',
},
title: {
general: 'عمومی',
roadTypes: 'انواع جادهها',
filter: 'فیلتر',
appearence: 'ظاهر',
showOnRoadType: 'نمایش در انواع جادههای زیر:',
seeOnDiscuss: 'مطالعه موضوع اسکریپت در Discuss',
seeOnDiscord: 'مشاهده کانال اسکریپت در سرور Discord اسکریپتهای Waze',
scriptDevBy: 'مشاهده نمایه کاربری ویرایشگر من',
},
label: {
displaySpeeds: 'نمایش سرعت ها',
showNoSpeed: 'نمایش در بخش هایی بدون سرعت',
showOnRoundabout: 'نمایش در چرخشگاه ها',
showOnUnpaved: 'نمایش در جاده های خاکی',
maxZoom: 'نمایش تا زوم:',
toggleLayerShortcut: 'تغییر لایه نمایش سرعت',
zIndex: 'عمق لایه',
hideShorterSegments: 'مخفی کردن بخش های کوتاه تر از',
speedFilter: 'فیلتر بر اساس سرعت',
min: 'حداقل:',
max: 'حداکثر:',
opacity: 'سطح شفافیت فیلتر:',
},
alertMessage: {
zIndex: `اگر از عمق لایه بیشتر از <b>${this.zIndex.warn}</b> استفاده کنید، لایه سرعت بر روی لایه های دیگر قرار می گیرد و شما نمی توانید هیچ عنصری را در صفحه انتخاب کنید تا زمانی که عمق لایه را به کمتر از <b>${this.zIndex.warn}</b> کاهش دهید.`,
toggleVisibility: `برای فعال/غیرفعال کردن لایه نمایش سرعت، به <b>لایه های نقشه > جاده ها > نمایش سرعت</b> بروید یا از میانبر <b>ALT</b> + <b>SHIFT</b> + <b>S</b> استفاده کنید`
},
theme: {
default: 'پیشفرض',
altViennaConv: 'کنوانسیون وین جایگزین',
japan: 'ژاپن',
northAmerica: 'آمریکای شمالی',
sacu: 'اتحادیه گمرکی جنوب آفریقا',
uk: 'پادشاهی متحد',
},
btn: {
updateSettingsTab: 'به روز رسانی منو',
resetSettings: 'بازنشانی تنظیمات',
seeOnDiscuss: 'مشاهده در بحث',
seeOnDiscord: 'مشاهده در دیسکورد',
scriptDevBy: 'اسکریپت توسط لوان تاوارس توسعه داده شده است',
}
};
break;
case 'fi':
// Finnish
translations = {
name: 'Nopeusnäyttö',
zoomOut: 'Laajenna',
zoomIn: 'Lähennä',
changelog: 'Muutokset',
changelogMessage: `<h6>Uutta:</h6><ul style="margin-bottom: 10px"><li>Pohjois-Amerikan nopeusmerkkiteema lisätty.</li></ul><h6>Korjaukset:</h6><ul><li>Yksisuuntaisen nopeuden näyttöongelma korjattu vasemmanpuoleisessa liikenteessä.</li></ul>`,
close: 'Sulje',
viewScript: 'Näytä skripti',
viewChangelog: 'Näytä muutokset',
reset: 'Palauta',
snackbar: {
updatingMapDisplay: 'Päivitetään karttakuvakkeita. (Tarkoituksellisella viiveellä)',
errorFiltering: 'Virhe suodatinta sovellettaessa. Vähimmäisnopeus ei voi olla suurempi kuin enimmäisnopeus.',
},
title: {
general: 'Yleiset',
roadTypes: 'Tiestötyypit',
filter: 'Suodatin',
appearence: 'Ulkoasu',
showOnRoadType: 'Näytä seuraavilla tietyyppien alueilla:',
seeOnDiscuss: 'Katso skriptin ketju Discussissa',
seeOnDiscord: 'Katso skriptin kanava Waze Scriptin Discord-palvelimella',
scriptDevBy: 'Näytä editorini käyttäjäprofiili',
},
label: {
displaySpeeds: 'Näytä nopeudet',
showNoSpeed: 'Näytä segmentissä, jossa ei ole nopeutta',
showOnRoundabout: 'Näytä liikenneympyrässä',
showOnUnpaved: 'Näytä päällystämättömällä tiellä',
maxZoom: 'Renderöi zoom-tasoon asti:',
toggleLayerShortcut: 'Vaihda nopeuskerroksen näkyvyyttä',
zIndex: 'Kerrosjärjestys',
hideShorterSegments: 'Piilota lyhyemmät segmentit kuin',
speedFilter: 'Suodata nopeuden mukaan',
min: 'Min.:',
max: 'Max.:',
opacity: 'Suodattimen läpinäkyvyysaste:',
},
alertMessage: {
zIndex: `Kun käytät suurempaa kerrosjärjestystä kuin <b>${this.zIndex.warn}</b>, nopeuskerros peittää muut ja et voi valita mitään elementtiä näytöltä, ennen kuin lasket sen takaisin alle <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Voit aktivoida/poistaa käytöstä nopeuskerroksen menemällä kohtaan <b>Karttatasot > Tiet > Näytä nopeudet</b> tai käyttämällä pikanäppäintä <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Oletus',
altViennaConv: 'Vaihtoehtoinen Wienin sopimus',
japan: 'Japani',
northAmerica: 'Pohjois-Amerikka',
sacu: 'Etelä-Afrikan tulliliitto',
uk: 'Yhdistynyt kuningaskunta',
},
btn: {
updateSettingsTab: 'Päivitä valikko',
resetSettings: 'Palauta asetukset',
seeOnDiscuss: 'Katso keskustelussa',
seeOnDiscord: 'Katso Discordissa',
scriptDevBy: 'Skriptin on kehittänyt Luan Tavares',
}
};
break;
case 'fr':
// French
translations = {
name: 'Affichage de la vitesse',
zoomOut: 'Zoom arrière',
zoomIn: 'Zoom avant',
changelog: 'Journal des modifications',
changelogMessage: `<h6>Nouveautés :</h6><ul style="margin-bottom: 10px"><li>Ajout du thème des panneaux de vitesse nord-américains.</li></ul><h6>Corrections :</h6><ul><li>Correction de l'affichage de la vitesse en sens unique dans les pays avec conduite à gauche.</li></ul>`,
close: 'Fermer',
viewScript: 'Voir le script',
viewChangelog: 'Voir le journal des modifications',
reset: 'Réinitialiser',
snackbar: {
updatingMapDisplay: 'Mise à jour des icônes de la carte. (Avec un délai intentionnel)',
errorFiltering: 'Erreur lors de l’application du filtre. La vitesse minimale ne peut pas être supérieure à la maximale.',
},
title: {
general: 'Général',
roadTypes: 'Types de route',
filter: 'Filtrer',
appearence: 'Apparence',
showOnRoadType: 'Afficher sur les types de route suivants :',
seeOnDiscuss: 'Voir le fil du script sur Discuss',
seeOnDiscord: 'Voir le canal du script sur le serveur Discord de Waze Script',
scriptDevBy: 'Voir mon profil utilisateur de l’éditeur',
},
label: {
displaySpeeds: 'Afficher les vitesses',
showNoSpeed: 'Afficher sur les segments sans vitesse',
showOnRoundabout: 'Afficher sur le rond-point',
showOnUnpaved: 'Afficher sur la voie non pavée',
maxZoom: 'Rendre jusqu\'au zoom :',
toggleLayerShortcut: 'Alterner la visibilité de la couche de vitesse',
zIndex: 'Profondeur de la couche',
hideShorterSegments: 'Masquer sur les segments plus petits que',
speedFilter: 'Filtrer par vitesse',
min: 'Min. :',
max: 'Max. :',
opacity: 'Niveau de transparence du filtre:',
},
alertMessage: {
zIndex: `Lorsque vous utilisez une profondeur de couche supérieure à <b>${this.zIndex.warn}</b>, la couche de vitesse va se superposer aux autres et vous ne pourrez sélectionner aucun élément sur l\'écran jusqu\'à ce que vous la fassiez descendre sous <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Pour activer/désactiver la couche de vitesse, allez dans <b>Couches de la carte > Routes > Afficher les vitesses</b> ou utilisez le raccourci <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Par défaut',
altViennaConv: 'Convention de Vienne alternative',
japan: 'Japon',
northAmerica: 'Amérique du Nord',
sacu: 'Union douanière d\'Afrique australe',
uk: 'Royaume-Uni',
},
btn: {
updateSettingsTab: 'Mettre à jour le menu',
resetSettings: 'Réinitialiser les paramètres',
seeOnDiscuss: 'Voir sur la discussion',
seeOnDiscord: 'Voir sur Discord',
scriptDevBy: 'Script développé par Luan Tavares',
}
};
break;
case 'gl':
// Galician
translations = {
name: 'Exhibición de velocidade',
zoomOut: 'Máis afastado',
zoomIn: 'Máis achegado',
changelog: 'Rexistro de cambios',
changelogMessage: `<h6>Novedades:</h6><ul style="margin-bottom: 10px"><li>Engadido o tema de sinais de velocidade de América do Norte.</li></ul><h6>Correccións:</h6><ul><li>Corrixido o problema co indicador de velocidade en rúas de sentido único en países con condución pola esquerda.</li></ul>`,
close: 'Pechar',
viewScript: 'Ver script',
viewChangelog: 'Ver rexistro de cambios',
reset: 'Restablecer',
snackbar: {
updatingMapDisplay: 'Actualizando iconas do mapa. (Con atraso intencionado)',
errorFiltering: 'Erro ao aplicar o filtro. A velocidade mínima non pode ser maior que a máxima.',
},
title: {
general: 'Xeral',
roadTypes: 'Tipos de estrada',
filter: 'Filtro',
appearence: 'Aparencia',
showOnRoadType: 'Amosar nos seguintes tipos de estrada:',
seeOnDiscuss: 'Ver o fío do script en Discuss',
seeOnDiscord: 'Ver o canal do script no servidor Discord de Waze Script',
scriptDevBy: 'Ver o meu perfil de usuario do editor',
},
label: {
displaySpeeds: 'Exhibir velocidades',
showNoSpeed: 'Exhibir en segmentos sen velocidade',
showOnRoundabout: 'Exhibir en rotondas',
showOnUnpaved: 'Exhibir en vías non pavimentadas',
maxZoom: 'Renderizar ata o zoom:',
toggleLayerShortcut: 'Alternar capa de exhibición de velocidade',
zIndex: 'Profundidade da capa',
hideShorterSegments: 'Ocultar en segmentos máis pequenos que',
speedFilter: 'Filtrar por velocidade',
min: 'Mín.:',
max: 'Máx.:',
opacity: 'Nivel de opacidade do filtro:',
},
alertMessage: {
zIndex: `Ao usar unha profundidade de capa maior que <b>${this.zIndex.warn}</b>, a capa de velocidade cubrirá outras capas e non poderá seleccionar ningún elemento na pantalla ata que a baixe por debaixo de <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Para activar/desactivar a capa de exhibición de velocidades, vai a <b>Capas do mapa > Vías > Exhibir velocidades</b> ou utiliza o atallo <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Por defecto',
altViennaConv: 'Convención de Viena alternativa',
japan: 'Japón',
northAmerica: 'América do Norte',
sacu: 'Unión Aduanera de África Austral',
uk: 'Reino Unido',
},
btn: {
updateSettingsTab: 'Actualizar menú',
resetSettings: 'Restablecer configuracións',
seeOnDiscuss: 'Ver na discusión',
seeOnDiscord: 'Ver en Discord',
scriptDevBy: 'Script desenvolvido por Luan Tavares',
}
};
break;
case 'he':
// Hebrew
translations = {
name: 'הצגת מהירות',
zoomOut: 'מרחוק יותר',
zoomIn: 'מקרוב יותר',
changelog: 'יומן שינויים',
changelogMessage: `<h6>מה חדש:</h6><ul style="margin-bottom: 10px"><li>נוסף ערכת תמרורי מהירות של צפון אמריקה.</li></ul><h6>תיקונים:</h6><ul><li>תוקן בעיית תצוגת מהירות חד-סטרית במדינות עם נהיגה בצד שמאל.</li></ul>`,
close: 'סגור',
viewScript: 'צפה בסקריפט',
viewChangelog: 'צפה ביומן השינויים',
reset: 'אפס',
snackbar: {
updatingMapDisplay: 'מעדכן סמלי מפה. (בעיכוב מכוון)',
errorFiltering: 'שגיאה ביישום המסנן. המהירות המינימלית לא יכולה להיות גבוהה מהמהירות המרבית.',
},
title: {
general: 'כללי',
roadTypes: 'סוגי דרכים',
filter: 'סנן',
appearence: 'מראה',
showOnRoadType: 'הצג על סוגי הדרכים הבאים:',
seeOnDiscuss: 'ראה את השרשור של הסקריפט ב-Discuss',
seeOnDiscord: 'ראה את הערוץ של הסקריפט בשרת Discord של Waze Script',
scriptDevBy: 'הצג את פרופיל המשתמש של העורך שלי',
},
label: {
displaySpeeds: 'הצג מהירויות',
showNoSpeed: 'הצג בקטעים ללא מהירות',
showOnRoundabout: 'הצג בכיכרות',
showOnUnpaved: 'הצג בדרכים לא סלוליות',
maxZoom: 'הצג עד לזום:',
toggleLayerShortcut: 'החלף שכבת הצגת מהירות',
zIndex: 'עומק השכבה',
hideShorterSegments: 'הסתר בקטעים קצרים מ-',
speedFilter: 'סנן לפי מהירות',
min: 'מינימום:',
max: 'מקסימום:',
opacity: 'רמת שקיפות המסנן:',
},
alertMessage: {
zIndex: `כאשר משתמשים בעומק שכבה גבוה יותר מ- <b>${this.zIndex.warn}</b>, שכבת המהירות תכסה שכבות אחרות ולא ניתן יהיה לבחור אף פריט על המסך עד שתרד את עומק השכבה מתחת ל- <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `כדי להפעיל/לכבות את שכבת הצגת המהירויות, פשוט לכו ל- <b>שכבות המפה > דרכים > הצג מהירויות</b> או השתמשו בקיצור הדרך <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'ברירת מחדל',
altViennaConv: 'אמנת וינה חלופין',
japan: 'יפן',
northAmerica: 'צפון אמריקה',
sacu: 'איחוד המכס של דרום אפריקה',
uk: 'הממלכה המאוחדת',
},
btn: {
updateSettingsTab: 'עדכן תפריט',
resetSettings: 'אפס הגדרות',
seeOnDiscuss: 'ראה בדיון',
seeOnDiscord: 'ראה ב-Discord',
scriptDevBy: 'הסקריפט פותח על ידי לואן טאווארס',
}
};
break;
case 'hi':
// Hindi
translations = {
name: 'स्पीड डिस्प्ले',
zoomOut: 'और दूर',
zoomIn: 'और पास',
changelog: 'चेंजलॉग',
changelogMessage: `<h6>नया क्या है:</h6><ul style="margin-bottom: 10px"><li>उत्तर अमेरिकी गति संकेत विषय जोड़ा गया।</li></ul><h6>सुधार:</h6><ul><li>बाएं हाथ की ड्राइविंग वाले देशों में एकतरफा गति प्रदर्शन समस्या को ठीक किया गया।</li></ul>`,
close: 'बंद करें',
viewScript: 'स्क्रिप्ट देखें',
viewChangelog: 'चेंजलॉग देखें',
reset: 'रीसेट',
snackbar: {
updatingMapDisplay: 'मानचित्र चिह्न अपडेट किए जा रहे हैं। (जानबूझकर देरी के साथ)',
errorFiltering: 'फ़िल्टर लागू करने में त्रुटि। न्यूनतम गति अधिकतम से अधिक नहीं हो सकती।',
},
title: {
general: 'सामान्य',
roadTypes: 'सड़क प्रकार',
filter: 'फ़िल्टर',
appearence: 'रूप',
showOnRoadType: 'निम्नलिखित सड़क प्रकारों पर दिखाएं:',
seeOnDiscuss: 'Discuss पर स्क्रिप्ट का थ्रेड देखें',
seeOnDiscord: 'Waze Script के Discord सर्वर पर स्क्रिप्ट चैनल देखें',
scriptDevBy: 'मेरा संपादक उपयोगकर्ता प्रोफ़ाइल देखें',
},
label: {
displaySpeeds: 'गति दिखाएं',
showNoSpeed: 'गति के बिना सेगमेंट में दिखाएं',
showOnRoundabout: 'राउंडअबाउट में दिखाएं',
showOnUnpaved: 'अस्फल्टेड सड़कों पर दिखाएं',
maxZoom: 'जूम स्तर तक रेंडर करें:',
toggleLayerShortcut: 'स्पीड डिस्प्ले लेयर बदलें',
zIndex: 'लेयर की गहराई',
hideShorterSegments: 'छोटे सेगमेंट को छुपाएं',
speedFilter: 'गति के अनुसार फ़िल्टर करें',
min: 'न्यूनतम:',
max: 'अधिकतम:',
opacity: 'फ़िल्टर अपारदर्शिता स्तर:',
},
alertMessage: {
zIndex: `यदि आप <b>${this.zIndex.warn}</b> से बड़ी लेयर गहराई का उपयोग करते हैं, तो स्पीड डिस्प्ले अन्य लेयर्स के ऊपर आ जाएगा और स्क्रीन पर कोई भी तत्व चयनित नहीं किया जा सकेगा, जब तक कि आप इसे <b>${this.zIndex.warn}</b> से नीचे नहीं कर देते।`,
toggleVisibility: `स्पीड डिस्प्ले लेयर को सक्रिय/निष्क्रिय करने के लिए, बस <b>मैप लेयर्स > सड़कें > स्पीड डिस्प्ले</b> पर जाएं या शॉर्टकट का उपयोग करें <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'डिफ़ॉल्ट',
altViennaConv: 'वैकल्पिक वियना सम्मेलन',
japan: 'जापान',
northAmerica: 'उत्तरी अमेरिका',
sacu: 'दक्षिण अफ़्रीकी सीमा शुल्क संघ',
uk: 'संयुक्त राज्य',
},
btn: {
updateSettingsTab: 'मेन्यू अपडेट करें',
resetSettings: 'सेटिंग्स रीसेट करें',
seeOnDiscuss: 'चर्चा में देखें',
seeOnDiscord: 'Discord पर देखें',
scriptDevBy: 'स्क्रिप्ट लुआन तावरेस द्वारा विकसित की गई है',
}
};
break;
case 'hr':
// Croatian
translations = {
name: 'Prikaz brzine',
zoomOut: 'Više udaljeno',
zoomIn: 'Više približeno',
changelog: 'Povijest izmjena',
changelogMessage: `<h6>Što je novo:</h6><ul style="margin-bottom: 10px"><li>Dodana je tema znakova ograničenja brzine za Sjevernu Ameriku.</li></ul><h6>Popravci:</h6><ul><li>Ispravljena greška prikaza brzine u jednosmjernim ulicama u zemljama s vožnjom lijevom stranom.</li></ul>`,
close: 'Zatvori',
viewScript: 'Pogledaj skriptu',
viewChangelog: 'Pogledaj povijest izmjena',
reset: 'Poništi',
snackbar: {
updatingMapDisplay: 'Ažuriranje ikona na karti. (S namjernim kašnjenjem)',
errorFiltering: 'Pogreška pri primjeni filtra. Minimalna brzina ne može biti veća od maksimalne.',
},
title: {
general: 'Općenito',
roadTypes: 'Vrste cesta',
filter: 'Filtriraj',
appearence: 'Izgled',
showOnRoadType: 'Prikaži na sljedećim vrstama cesta:',
seeOnDiscuss: 'Pogledajte temu skripte na Discussu',
seeOnDiscord: 'Pogledajte kanal skripte na Waze Script Discord poslužitelju',
scriptDevBy: 'Pogledajte moj korisnički profil uređivača',
},
label: {
displaySpeeds: 'Prikazuj brzine',
showNoSpeed: 'Prikazuj na segmentima bez brzine',
showOnRoundabout: 'Prikazuj na kružnim tokovima',
showOnUnpaved: 'Prikazuj na neasfaltiranim cestama',
maxZoom: 'Prikazuj do razine zooma:',
toggleLayerShortcut: 'Prekidač sloja za prikaz brzine',
zIndex: 'Dubina sloja',
hideShorterSegments: 'Sakrij segmente kraće od',
speedFilter: 'Filtriraj prema brzini',
min: 'Min.:',
max: 'Max.:',
opacity: 'Razina neprozirnosti filtra:',
},
alertMessage: {
zIndex: `Ako koristite dubinu sloja veću od <b>${this.zIndex.warn}</b>, sloj brzine će se preklapati s drugim slojevima i neće biti moguće odabrati bilo koji element na ekranu dok ga ne spustite ispod <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Za aktiviranje/deaktiviranje sloja prikaza brzine, jednostavno idite na <b>Slabe mape > Ceste > Prikaz brzina</b> ili koristite prečac <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Zadano',
altViennaConv: 'Alternativna Bečka konvencija',
japan: 'Japan',
northAmerica: 'Sjeverna Amerika',
sacu: 'Južnoafrička unija carina',
uk: 'Ujedinjeno Kraljevstvo',
},
btn: {
updateSettingsTab: 'Ažuriraj izbornik',
resetSettings: 'Vrati postavke na zadane',
seeOnDiscuss: 'Pogledajte u raspravi',
seeOnDiscord: 'Pogledajte na Discordu',
scriptDevBy: 'Skript je razvio Luan Tavares',
}
};
break;
case 'hu':
// Hungarian
translations = {
name: 'Sebesség megjelenítése',
zoomOut: 'Távolabb',
zoomIn: 'Közelebb',
changelog: 'Változási napló',
changelogMessage: `<h6>Újdonságok:</h6><ul style="margin-bottom: 10px"><li>Hozzáadva az észak-amerikai sebességtábla téma.</li></ul><h6>Javítások:</h6><ul><li>Javítva az egyirányú sebességmegjelenítési hiba bal oldali közlekedésű országokban.</li></ul>`,
close: 'Bezárás',
viewScript: 'Szkript megtekintése',
viewChangelog: 'Változási napló megtekintése',
reset: 'Visszaállítás',
snackbar: {
updatingMapDisplay: 'Térképi ikonok frissítése. (Szándékos késleltetéssel)',
errorFiltering: 'Hiba a szűrő alkalmazásakor. A minimális sebesség nem lehet nagyobb, mint a maximális.',
},
title: {
general: 'Általános',
roadTypes: 'Úttípusok',
filter: 'Szűrő',
appearence: 'Megjelenés',
showOnRoadType: 'Megjelenítés a következő úttípusokon:',
seeOnDiscuss: 'Nézd meg a script témáját a Discuss-on',
seeOnDiscord: 'Nézd meg a script csatornát a Waze Script Discord szerverén',
scriptDevBy: 'Tekintse meg a szerkesztői felhasználói profilomat',
},
label: {
displaySpeeds: 'Sebességek megjelenítése',
showNoSpeed: 'Megjelenítés sebesség nélküli szegmenseken',
showOnRoundabout: 'Megjelenítés körforgalomban',
showOnUnpaved: 'Megjelenítés burkolatlan úton',
maxZoom: 'Renderelés legnagyobb zoom szinten:',
toggleLayerShortcut: 'Sebesség réteg átváltása',
zIndex: 'Réteg mélysége',
hideShorterSegments: 'Rejtsd el a rövidebb szegmenseket, mint',
speedFilter: 'Szűrés sebesség szerint',
min: 'Min.:',
max: 'Max.:',
opacity: 'Szűrő átlátszóság szintje:',
},
alertMessage: {
zIndex: `Ha a réteg mélysége nagyobb, mint <b>${this.zIndex.warn}</b>, a sebesség réteg átfedheti a többi réteget, és nem lesz lehetőség semmilyen elem kiválasztására a képernyőn, amíg le nem csökkenti <b>${this.zIndex.warn}</b> alá.`,
toggleVisibility: `A sebesség réteg láthatóságának aktiválásához/deaktiválásához egyszerűen menjen ide: <b>Térképrétegek > Út > Sebesség megjelenítése</b>, vagy használja a gyorsbillentyűt <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Alapértelmezett',
altViennaConv: 'Alternatív Bécsi Egyezmény',
japan: 'Japán',
northAmerica: 'Észak-Amerika',
sacu: 'Dél-afrikai Vámunió',
uk: 'Egyesült Királyság',
},
btn: {
updateSettingsTab: 'Menü frissítése',
resetSettings: 'Beállítások visszaállítása',
seeOnDiscuss: 'Nézd meg a vitában',
seeOnDiscord: 'Nézd meg Discordon',
scriptDevBy: 'A scriptet Luan Tavares fejlesztette',
}
};
break;
case 'id':
// Indonesian
translations = {
name: 'Tampilan Kecepatan',
zoomOut: 'Lebih jauh',
zoomIn: 'Lebih dekat',
changelog: 'Catatan perubahan',
changelogMessage: `<h6>Apa yang Baru:</h6><ul style="margin-bottom: 10px"><li>Menambahkan tema rambu kecepatan Amerika Utara.</li></ul><h6>Perbaikan:</h6><ul><li>Memperbaiki masalah tampilan kecepatan satu arah di negara dengan lalu lintas sisi kiri.</li></ul>`,
close: 'Tutup',
viewScript: 'Lihat skrip',
viewChangelog: 'Lihat catatan perubahan',
reset: 'Atur ulang',
snackbar: {
updatingMapDisplay: 'Memperbarui ikon peta. (Dengan penundaan yang disengaja)',
errorFiltering: 'Kesalahan dalam menerapkan filter. Kecepatan minimum tidak boleh lebih besar dari maksimum.',
},
title: {
general: 'Umum',
roadTypes: 'Tipe Jalan',
filter: 'Filter',
appearence: 'Tampilan',
showOnRoadType: 'Tampilkan pada tipe jalan berikut:',
seeOnDiscuss: 'Lihat thread skrip di Discuss',
seeOnDiscord: 'Lihat saluran skrip di server Discord Waze Script',
scriptDevBy: 'Lihat profil pengguna editor saya',
},
label: {
displaySpeeds: 'Tampilkan kecepatan',
showNoSpeed: 'Tampilkan pada segmen tanpa kecepatan',
showOnRoundabout: 'Tampilkan di bundaran',
showOnUnpaved: 'Tampilkan di jalan tidak beraspal',
maxZoom: 'Render hingga zoom:',
toggleLayerShortcut: 'Toggling lapisan tampilan kecepatan',
zIndex: 'Kedalaman lapisan',
hideShorterSegments: 'Sembunyikan pada segmen yang lebih pendek dari',
speedFilter: 'Filter berdasarkan kecepatan',
min: 'Min.:',
max: 'Max.:',
opacity: 'Tingkat opasitas filter:',
},
alertMessage: {
zIndex: `Jika kedalaman lapisan lebih besar dari <b>${this.zIndex.warn}</b>, lapisan kecepatan akan menutupi lapisan lain dan Anda tidak akan dapat memilih elemen di layar sampai Anda menurunkan kedalaman lapisan kembali di bawah <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Untuk mengaktifkan/mematikan lapisan tampilan kecepatan, cukup pergi ke <b>Lapisan Peta > Jalan > Tampilkan kecepatan</b> atau gunakan pintasan <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Default',
altViennaConv: 'Konvensi Wina Alternatif',
japan: 'Jepang',
northAmerica: 'Amerika Utara',
sacu: 'Uni Bea Cukai Afrika Selatan',
uk: 'Inggris Raya',
},
btn: {
updateSettingsTab: 'Perbarui menu',
resetSettings: 'Atur ulang pengaturan',
seeOnDiscuss: 'Lihat di diskusi',
seeOnDiscord: 'Lihat di Discord',
scriptDevBy: 'Script dikembangkan oleh Luan Tavares',
}
};
break;
case 'it':
// Italian
translations = {
name: 'Visualizzazione Velocità',
zoomOut: 'Zoom indietro',
zoomIn: 'Zoom avanti',
changelog: 'Registro modifiche',
changelogMessage: `<h6>Novità:</h6><ul style="margin-bottom: 10px"><li>Aggiunto il tema dei segnali di velocità del Nord America.</li></ul><h6>Correzioni:</h6><ul><li>Corretto il problema della visualizzazione della velocità a senso unico nei paesi con guida a sinistra.</li></ul>`,
close: 'Chiudi',
viewScript: 'Vedi script',
viewChangelog: 'Visualizza registro modifiche',
reset: 'Ripristina',
snackbar: {
updatingMapDisplay: 'Aggiornamento delle icone della mappa. (Con ritardo intenzionale)',
errorFiltering: 'Errore nell’applicazione del filtro. La velocità minima non può essere maggiore della massima.',
},
title: {
general: 'Generale',
roadTypes: 'Tipi di strada',
filter: 'Filtro',
appearence: 'Aspetto',
showOnRoadType: 'Mostra sui seguenti tipi di strada:',
seeOnDiscuss: 'Vedi il thread dello script su Discuss',
seeOnDiscord: 'Vedi il canale dello script sul server Discord di Waze Script',
scriptDevBy: 'Visualizza il profilo utente del mio editor',
},
label: {
displaySpeeds: 'Visualizza velocità',
showNoSpeed: 'Visualizza su segmento senza velocità',
showOnRoundabout: 'Visualizza su rotatoria',
showOnUnpaved: 'Visualizza su strada non asfaltata',
maxZoom: 'Renderizza fino allo zoom:',
toggleLayerShortcut: 'Alterna il layer di visualizzazione velocità',
zIndex: 'Profondità del layer',
hideShorterSegments: 'Nascondi nei segmenti più corti di',
speedFilter: 'Filtra per velocità',
min: 'Min.:',
max: 'Max.:',
opacity: 'Livello opacità filtro:',
},
alertMessage: {
zIndex: `Se utilizzi una profondità del layer maggiore di <b>${this.zIndex.warn}</b>, il layer della velocità coprirà gli altri e non sarà possibile selezionare alcun elemento sulla mappa finché non riduci nuovamente la profondità sotto <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Per attivare/disattivare il layer di visualizzazione delle velocità, vai su <b>Layer Mappa > Strade > Visualizza velocità</b> o usa la scorciatoia <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Predefinito',
altViennaConv: 'Convenzione di Vienna Alternativa',
japan: 'Giappone',
northAmerica: 'Nord America',
sacu: 'Unione Doganale dell’Africa Australe',
uk: 'Regno Unito',
},
btn: {
updateSettingsTab: 'Aggiorna menu',
resetSettings: 'Ripristina impostazioni',
seeOnDiscuss: 'Vedi nella discussione',
seeOnDiscord: 'Vedi su Discord',
scriptDevBy: 'Script sviluppato da Luan Tavares',
}
};
break;
case 'ja':
// Japanese
translations = {
name: '速度表示',
zoomOut: 'ズームアウト',
zoomIn: 'ズームイン',
changelog: '変更履歴',
changelogMessage: `<h6>新機能:</h6><ul style="margin-bottom: 10px"><li>北米の速度標識テーマを追加しました。</li></ul><h6>修正:</h6><ul><li>左側通行の国での一方通行速度表示の問題を修正しました。</li></ul>`,
close: '閉じる',
viewScript: 'スクリプトを見る',
viewChangelog: '変更履歴を見る',
reset: 'リセット',
snackbar: {
updatingMapDisplay: 'マップアイコンを更新しています。(意図的な遅延あり)',
errorFiltering: 'フィルター適用エラー。最小速度が最大速度を超えることはできません。',
},
title: {
general: '一般',
roadTypes: '道路タイプ',
filter: 'フィルター',
appearence: '外観',
showOnRoadType: '次の道路タイプに表示:',
seeOnDiscuss: 'Discussでスクリプトのスレッドを見る',
seeOnDiscord: 'Waze ScriptのDiscordサーバーでスクリプトのチャンネルを見る',
scriptDevBy: 'エディターのユーザープロフィールを表示',
},
label: {
displaySpeeds: '速度を表示',
showNoSpeed: '速度なしのセグメントに表示',
showOnRoundabout: 'ラウンドアバウトに表示',
showOnUnpaved: '未舗装道路に表示',
maxZoom: 'ズーム最大:',
toggleLayerShortcut: '速度表示レイヤーを切り替える',
zIndex: 'レイヤーの深度',
hideShorterSegments: '次の長さ未満のセグメントを非表示:',
speedFilter: '速度でフィルタリング',
min: '最小:',
max: '最大:',
opacity: 'フィルターの不透明度レベル:',
},
alertMessage: {
zIndex: `レイヤーの深度を <b>${this.zIndex.warn}</b> より大きく設定すると、速度レイヤーが他のレイヤーを覆い、再び <b>${this.zIndex.warn}</b> 以下に戻すまでマップ上の要素を選択できなくなります。`,
toggleVisibility: `速度表示レイヤーをオン/オフにするには、<b>マップレイヤー > 道路 > 速度表示</b>に移動するか、ショートカット <b>ALT</b> + <b>SHIFT</b> + <b>S</b> を使用してください。`
},
theme: {
default: 'デフォルト',
altViennaConv: '代替ウィーン条約',
japan: '日本',
northAmerica: '北アメリカ',
sacu: '南部アフリカ関税同盟',
uk: 'イギリス',
},
btn: {
updateSettingsTab: 'メニューを更新',
resetSettings: '設定をリセット',
seeOnDiscuss: 'ディスカッションで見る',
seeOnDiscord: 'Discordで見る',
scriptDevBy: 'スクリプトはLuan Tavaresによって開発されました',
}
};
break;
case 'ka':
// Georgian
translations = {
name: 'სისწრაფის ჩვენება',
zoomOut: 'გამორთვა',
zoomIn: 'ზუმი',
changelog: 'შეცდომების ჩანაწერი',
changelogMessage: `<h6>რა новია:</h6><ul style="margin-bottom: 10px"><li>დამატებულია ჩრდილოეთ ამერიკული სიჩქარის ნიშნის თემა.</li></ul><h6>შესწორებები:</h6><ul><li>მარცხენა მხარეს მოძრაობის მქონე ქვეყნებში ერთმიმართულებიანი სიჩქარის ჩვენების პრობლემა გამოსწორდა.</li></ul>`,
close: 'დახურვა',
viewScript: 'იხილეთ სქრიპტი',
viewChangelog: 'შეცდომების ჩანაწერის ნახვა',
reset: 'გადატვირთვა',
snackbar: {
updatingMapDisplay: 'რუკის ხატულების განახლება. (განზრახ შეფერხებით)',
errorFiltering: 'შეცდომა ფილტრის გამოყენებისას. მინიმალური სიჩქარე არ შეიძლება იყოს მაქსიმალურ სიჩქარეზე მეტი.',
},
title: {
general: 'ზოგადი',
roadTypes: 'გზების ტიპები',
filter: 'ფილტრი',
appearence: 'გამოცხადება',
showOnRoadType: 'აჩვენე შემდეგი გზის ტიპებზე:',
seeOnDiscuss: 'იხილეთ სკრიპტის თემა Discuss-ზე',
seeOnDiscord: 'იხილეთ სკრიპტის არხი Waze Script-ის Discord სერვერზე',
scriptDevBy: 'ნახეთ ჩემი რედაქტორის მომხმარებლის პროფილი',
},
label: {
displaySpeeds: 'სისწრაფის ჩვენება',
showNoSpeed: 'სიჩქარის გარეშე სეგმენტებზე ჩვენება',
showOnRoundabout: 'საკვანძო გზებზე ჩვენება',
showOnUnpaved: 'აუცილებელი გზების გამოფენა',
maxZoom: 'ზუმის მაქსიმალური დონე:',
toggleLayerShortcut: 'სისწრაფის ფენის გადართვის ცხელი კლავიშები',
zIndex: 'ფენის სიღრმე',
hideShorterSegments: 'დამალვა, თუ სეგმენტი არის ამცირებელი:',
speedFilter: 'ფილტრი სიჩქარის მიხედვით',
min: 'მინიმუმ:',
max: 'მაქსიმუმ:',
opacity: 'ფილტრის გამჭვირვალობის დონე:',
},
alertMessage: {
zIndex: `თუ გამოიყენეთ ფენის სიღრმე <b>${this.zIndex.warn}</b> მეტი, სისწრაფის ფენა დახურავს ყველა სხვა ფენებს და ვერ შეარჩიეთ ელემენტები ეკრანზე სანამ არ დააბრუნებთ სიღრმე <b>${this.zIndex.warn}</b> ქვემოთ.`,
toggleVisibility: `სიჩქარის ფენის ჩართვის/გამორთვისთვის, გთხოვთ გადადით <b>მოგზაურობა > გზები > სიჩქარის ნახვა</b> ან გამოიყენეთ ცხელი კლავიშები <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'ნაგულისხმები',
altViennaConv: 'ძველი ვენის კონვენცია',
japan: 'იაპონია',
northAmerica: 'ჩრდილოეთ ამერიკა',
sacu: 'სამხრეთ აფრიკის საბაჟო კავშირი',
uk: 'დიდი ბრიტანეთი',
},
btn: {
updateSettingsTab: 'მენიუს განახლება',
resetSettings: 'პარამეტრების გადატვირთვა',
seeOnDiscuss: 'იხილეთ განხილვაში',
seeOnDiscord: 'იხილეთ Discord-ზე',
scriptDevBy: 'სკრიპტი გამოიმუშავა ლუან ტავარესმა',
}
};
break;
case 'ko':
// Korean
translations = {
name: '속도 표시',
zoomOut: '줌 아웃',
zoomIn: '줌 인',
changelog: '변경 기록',
changelogMessage: `<h6>새로운 기능:</h6><ul style="margin-bottom: 10px"><li>북미 속도 표지판 테마가 추가되었습니다.</li></ul><h6>수정 사항:</h6><ul><li>좌측통행 국가에서 일방통행 속도 표시 문제가 수정되었습니다.</li></ul>`,
close: '닫기',
viewScript: '스크립트 보기',
viewChangelog: '변경 기록 보기',
reset: '초기화',
snackbar: {
updatingMapDisplay: '지도 아이콘을 업데이트하는 중입니다. (일부러 지연됨)',
errorFiltering: '필터 적용 오류. 최소 속도가 최대 속도보다 클 수 없습니다.',
},
title: {
general: '일반',
roadTypes: '도로 유형',
filter: '필터',
appearence: '모양',
showOnRoadType: '다음 도로 유형에서 표시:',
seeOnDiscuss: 'Discuss에서 스크립트 스레드 보기',
seeOnDiscord: 'Waze Script Discord 서버에서 스크립트 채널 보기',
scriptDevBy: '내 편집기 사용자 프로필 보기',
},
label: {
displaySpeeds: '속도 표시',
showNoSpeed: '속도 없는 세그먼트에 표시',
showOnRoundabout: '로터리에서 표시',
showOnUnpaved: '비포장 도로에서 표시',
maxZoom: '최대 줌:',
toggleLayerShortcut: '속도 레이어 전환 단축키',
zIndex: '레이어 깊이',
hideShorterSegments: '이보다 짧은 세그먼트 숨기기',
speedFilter: '속도 필터',
min: '최소:',
max: '최대:',
opacity: '필터 불투명도 수준:',
},
alertMessage: {
zIndex: `레이어 깊이가 <b>${this.zIndex.warn}</b>를 초과하면 속도 레이어가 다른 레이어 위에 표시되어 화면에서 다른 요소를 선택할 수 없게 됩니다. 다시 <b>${this.zIndex.warn}</b> 이하로 낮추기 전까지 선택할 수 없습니다.`,
toggleVisibility: `속도 레이어의 가시성을 활성화/비활성화하려면 <b>맵 레이어 > 도로 > 속도 표시</b>로 이동하거나 단축키 <b>ALT</b> + <b>SHIFT</b> + <b>S</b>를 사용하세요.`
},
theme: {
default: '기본',
altViennaConv: '대체 비엔나 협약',
japan: '일본',
northAmerica: '북아메리카',
sacu: '남부 아프리카 세관 동맹',
uk: '영국',
},
btn: {
updateSettingsTab: '메뉴 업데이트',
resetSettings: '설정 초기화',
seeOnDiscuss: '토론에서 보기',
seeOnDiscord: 'Discord에서 보기',
scriptDevBy: '스크립트는 Luan Tavares에 의해 개발되었습니다',
}
};
break;
case 'lt':
// Lithuanian
translations = {
name: 'Greitis Rodymas',
zoomOut: 'Toliau',
zoomIn: 'Arčiau',
changelog: 'Pakeitimų Žurnalas',
changelogMessage: `<h6>Nauja:</h6><ul style="margin-bottom: 10px"><li>Pridėta Šiaurės Amerikos greičio ženklų tema.</li></ul><h6>Taisymai:</h6><ul><li>Išspręsta vienpusio greičio rodymo problema šalyse su eismu kairėje pusėje.</li></ul>`,
close: 'Uždaryti',
viewScript: 'Peržiūrėti scenarijų',
viewChangelog: 'Peržiūrėti pakeitimų žurnalą',
reset: 'Atstatyti',
snackbar: {
updatingMapDisplay: 'Atnaujinamos žemėlapio piktogramos. (Su tyčiniu vėlavimu)',
errorFiltering: 'Klaida taikant filtrą. Mažiausias greitis negali būti didesnis nei didžiausias.',
},
title: {
general: 'Bendrieji',
roadTypes: 'Kelio tipai',
filter: 'Filtras',
appearence: 'Išvaizda',
showOnRoadType: 'Rodyti šiuose kelio tipuose:',
seeOnDiscuss: 'Žiūrėkite scenarijaus temą Discuss',
seeOnDiscord: 'Žiūrėkite scenarijaus kanalą Waze Script Discord serveryje',
scriptDevBy: 'Peržiūrėkite mano redaktoriaus naudotojo profilį',
},
label: {
displaySpeeds: 'Rodyti greičius',
showNoSpeed: 'Rodyti segmentuose be greičio',
showOnRoundabout: 'Rodyti žiedinėse sankryžose',
showOnUnpaved: 'Rodyti neasfaltuotose keliose',
maxZoom: 'Rodyti iki židinio lygio:',
toggleLayerShortcut: 'Perjungti greičio sluoksnį',
zIndex: 'Sluoksnio gylis',
hideShorterSegments: 'Slėpti trumpesnius nei',
speedFilter: 'Filtruoti pagal greitį',
min: 'Min.:',
max: 'Max.:',
opacity: 'Filtravimo nepralaidumo lygis:',
},
alertMessage: {
zIndex: `Naudojant sluoksnio gylį, kuris yra didesnis nei <b>${this.zIndex.warn}</b>, greičio sluoksnis uždengs kitus sluoksnius ir negalėsite pasirinkti jokio elemento ekrane, kol vėl nepasieksite gylio žemiau <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Norėdami įjungti/išjungti greičio sluoksnio matomumą, eikite į <b>Žemėlapių sluoksniai > Keliai > Rodyti greičius</b> arba naudokite klaviatūros kombinaciją <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Numatytas',
altViennaConv: 'Alternatyvi Vienos konvencija',
japan: 'Japonija',
northAmerica: 'Šiaurės Amerika',
sacu: 'Pietų Afrikos muitų sąjunga',
uk: 'Jungtinė Karalystė',
},
btn: {
updateSettingsTab: 'Atnaujinti meniu',
resetSettings: 'Atstatyti nustatymus',
seeOnDiscuss: 'Žiūrėti diskusijoje',
seeOnDiscord: 'Žiūrėti Discorde',
scriptDevBy: 'Skriptą sukūrė Luan Tavares',
}
};
break;
case 'lv':
// Latvian
translations = {
name: 'Ātruma Rādīšana',
zoomOut: 'Tālāk',
zoomIn: 'Tuvāk',
changelog: 'Izmaiņu Žurnāls',
changelogMessage: `<h6>Jaunumi:</h6><ul style="margin-bottom: 10px"><li>Pievienota Ziemeļamerikas ātruma zīmju tēma.</li></ul><h6>Labojumi:</h6><ul><li>Izlabota vienvirziena ātruma attēlošanas problēma valstīs ar satiksmi kreisajā pusē.</li></ul>`,
close: 'Aizvērt',
viewScript: 'Skatīt Skriptu',
viewChangelog: 'Skatīt Izmaiņu Žurnālu',
reset: 'Atiestatīt',
snackbar: {
updatingMapDisplay: 'Atjaunina kartes ikonas. (Ar apzinātu kavēšanos)',
errorFiltering: 'Kļūda, lietojot filtru. Minimālais ātrums nevar būt lielāks par maksimālo.',
},
title: {
general: 'Vispārējie',
roadTypes: 'Ceļa tipi',
filter: 'Filtrs',
appearence: 'Izskats',
showOnRoadType: 'Rādīt šādos ceļa tipos:',
seeOnDiscuss: 'Skatīt skripta pavedienu Discuss',
seeOnDiscord: 'Skatīt skripta kanālu Waze Script Discord serverī',
scriptDevBy: 'Skatīt manu redaktora lietotāja profilu',
},
label: {
displaySpeeds: 'Rādīt ātrumus',
showNoSpeed: 'Rādīt segmentos bez ātruma',
showOnRoundabout: 'Rādīt aplī',
showOnUnpaved: 'Rādīt neasfaltētajos ceļos',
maxZoom: 'Rādīt līdz palielināšanas līmenim:',
toggleLayerShortcut: 'Pārslēgt ātruma slāni',
zIndex: 'Slāņa dziļums',
hideShorterSegments: 'Paslēpt īsākus nekā',
speedFilter: 'Filtrēt pēc ātruma',
min: 'Min.:',
max: 'Max.:',
opacity: 'Filtra līmeņa caurspīdīgums:',
},
alertMessage: {
zIndex: `Izmantojot slāņa dziļumu, kas pārsniedz <b>${this.zIndex.warn}</b>, ātruma slānis pārklās citus slāņus, un nebūs iespējams izvēlēties nevienu elementu ekrānā līdz tā atkārtotai pazemināšanai zem <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Lai aktivizētu/deaktivizētu ātruma slāņa redzamību, vienkārši dodieties uz <b>Kartes Slāņi > Ceļi > Rādīt ātrumus</b> vai izmantojiet īsinājumtaustiņu <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Noklus',
altViennaConv: 'Alternatīvā Vīnes konvencija',
japan: 'Japāna',
northAmerica: 'Ziemeļamerika',
sacu: 'Dienvidu Āfrikas muitas savienība',
uk: 'Apvienotā Karaliste',
},
btn: {
updateSettingsTab: 'Atjaunināt Meni',
resetSettings: 'Atiestatīt Iestatījumus',
seeOnDiscuss: 'Skatīt diskusijā',
seeOnDiscord: 'Skatīt Discordā',
scriptDevBy: 'Skriptu izstrādājis Luan Tavares',
}
};
break;
case 'ms':
// Malay
translations = {
name: 'Papar Kelajuan',
zoomOut: 'Jauhkan',
zoomIn: 'Dekatkan',
changelog: 'Log Perubahan',
changelogMessage: `<h6>Apa yang Baharu:</h6><ul style="margin-bottom: 10px"><li>Ditambahkan tema papan tanda had laju Amerika Utara.</li></ul><h6>Pembaikan:</h6><ul><li>Isu paparan halaju sehala di negara yang menggunakan pemanduan sebelah kiri telah diperbaiki.</li></ul>`,
close: 'Tutup',
viewScript: 'Lihat Skrip',
viewChangelog: 'Lihat Log Perubahan',
reset: 'Tetapkan Semula',
snackbar: {
updatingMapDisplay: 'Mengemas kini ikon peta. (Dengan kelewatan yang disengajakan)',
errorFiltering: 'Ralat semasa menggunakan penapis. Kelajuan minimum tidak boleh melebihi maksimum.',
},
title: {
general: 'Umum',
roadTypes: 'Jenis Jalan',
filter: 'Penapis',
appearence: 'Penampilan',
showOnRoadType: 'Tunjukkan pada jenis jalan berikut:',
seeOnDiscuss: 'Lihat thread skrip di Discuss',
seeOnDiscord: 'Lihat saluran skrip di pelayan Discord Waze Script',
scriptDevBy: 'Lihat profil pengguna editor saya',
},
label: {
displaySpeeds: 'Papar kelajuan',
showNoSpeed: 'Papar pada segmen tiada kelajuan',
showOnRoundabout: 'Papar pada bulatan',
showOnUnpaved: 'Papar pada jalan tidak berturap',
maxZoom: 'Paparkan sehingga tahap zum:',
toggleLayerShortcut: 'Tukar lapisan paparan kelajuan',
zIndex: 'Kedalaman lapisan',
hideShorterSegments: 'Sembunyikan pada segmen lebih pendek daripada',
speedFilter: 'Tapis mengikut kelajuan',
min: 'Min.:',
max: 'Maks.:',
opacity: 'Tahap kelegapan penapis:',
},
alertMessage: {
zIndex: `Apabila menggunakan kedalaman lapisan lebih besar daripada <b>${this.zIndex.warn}</b>, lapisan kelajuan akan menutupi lapisan lain dan tiada elemen boleh dipilih pada skrin sehingga ia diturunkan di bawah <b>${this.zIndex.warn}</b> semula.`,
toggleVisibility: `Untuk menghidupkan/mematikan kebolehtampilan lapisan kelajuan, pergi ke <b>Lapisan Peta > Jalan > Papar kelajuan</b> atau gunakan pintasan <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Lalai',
altViennaConv: 'Konvensi Vienna Alternatif',
japan: 'Jepun',
northAmerica: 'Amerika Utara',
sacu: 'Kesatuan Kastam Afrika Selatan',
uk: 'United Kingdom',
},
btn: {
updateSettingsTab: 'Kemas kini Menu',
resetSettings: 'Tetapkan Semula Tetapan',
seeOnDiscuss: 'Lihat dalam perbincangan',
seeOnDiscord: 'Lihat di Discord',
scriptDevBy: 'Skrip dibangunkan oleh Luan Tavares',
}
};
break;
case 'nl':
// Dutch
translations = {
name: 'Snelheidsweergave',
zoomOut: 'Uitzoomen',
zoomIn: 'Inzoomen',
changelog: 'Wijzigingslog',
changelogMessage: `<h6>Wat is nieuw:</h6><ul style="margin-bottom: 10px"><li>Nieuw thema toegevoegd voor Noord-Amerikaanse snelheidsborden.</li></ul><h6>Oplossingen:</h6><ul><li>Probleem met eenrichtingsweergave van snelheid in landen met links verkeer opgelost.</li></ul>`,
close: 'Sluiten',
viewScript: 'Bekijk script',
viewChangelog: 'Bekijk wijzigingslog',
reset: 'Reset',
snackbar: {
updatingMapDisplay: 'Kaartpictogrammen bijwerken. (Met opzettelijke vertraging)',
errorFiltering: 'Fout bij het toepassen van het filter. De minimale snelheid kan niet groter zijn dan de maximale.',
},
title: {
general: 'Algemeen',
roadTypes: 'Wegtypen',
filter: 'Filter',
appearence: 'Uiterlijk',
showOnRoadType: 'Weergeven op de volgende wegtypen:',
seeOnDiscuss: 'Bekijk de thread van het script op Discuss',
seeOnDiscord: 'Bekijk het kanaal van het script op de Waze Script Discord-server',
scriptDevBy: 'Bekijk mijn editor gebruikersprofiel',
},
label: {
displaySpeeds: 'Toon snelheden',
showNoSpeed: 'Weergeven op segmenten zonder snelheid',
showOnRoundabout: 'Weergeven op rotonde',
showOnUnpaved: 'Weergeven op onverharde wegen',
maxZoom: 'Weergeven tot zoomniveau:',
toggleLayerShortcut: 'Wissel snel de snelheidsweergavelayer',
zIndex: 'Laagdiepte',
hideShorterSegments: 'Verberg segmenten korter dan',
speedFilter: 'Filter op snelheid',
min: 'Min.:',
max: 'Max.:',
opacity: 'Filterdekking niveau:',
},
alertMessage: {
zIndex: `Wanneer je een laagdiepte groter dan <b>${this.zIndex.warn}</b> gebruikt, zal de snelheidslaag de andere lagen bedekken en kun je geen elementen meer selecteren op het scherm totdat je de laagdiepte weer onder <b>${this.zIndex.warn}</b> brengt.`,
toggleVisibility: `Om de snelheidsweergavelayer in of uit te schakelen, ga naar <b>Kaartlagen > Wegen > Weergave van snelheden</b> of gebruik de sneltoets <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Standaard',
altViennaConv: 'Alternatieve Wenen Conventie',
japan: 'Japan',
northAmerica: 'Noord-Amerika',
sacu: 'Zuidelijke Afrikaanse Douane Unie',
uk: 'Verenigd Koninkrijk',
},
btn: {
updateSettingsTab: 'Werk menu bij',
resetSettings: 'Herstel instellingen',
seeOnDiscuss: 'Zie op Discussie',
seeOnDiscord: 'Zie op Discord',
scriptDevBy: 'Script ontwikkeld door Luan Tavares',
}
};
break;
case 'no':
// Norwegian
translations = {
name: 'Hastighetsvisning',
zoomOut: 'Zoom ut',
zoomIn: 'Zoom inn',
changelog: 'Endringslogg',
changelogMessage: `<h6>Hva er nytt:</h6><ul style="margin-bottom: 10px"><li>Lagt til nordamerikansk fartsgrensetema.</li></ul><h6>Fikser:</h6><ul><li>Fikset visning av enveiskjøringens hastighet i land med venstrekjøring.</li></ul>`,
close: 'Lukk',
viewScript: 'Se skript',
viewChangelog: 'Vis endringslogg',
reset: 'Tilbakestill',
snackbar: {
updatingMapDisplay: 'Oppdaterer kartikoner. (Med villet forsinkelse)',
errorFiltering: 'Feil ved bruk av filter. Minimumshastighet kan ikke være større enn maksimum.',
},
title: {
general: 'Generelt',
roadTypes: 'Vei typer',
filter: 'Filter',
appearence: 'Utseende',
showOnRoadType: 'Vis på følgende veit typer:',
seeOnDiscuss: 'Se tråden for skriptet på Discuss',
seeOnDiscord: 'Se skriptets kanal på Waze Script Discord-serveren',
scriptDevBy: 'Se min editor brukerprofil',
},
label: {
displaySpeeds: 'Vis hastigheter',
showNoSpeed: 'Vis på segmenter uten hastighet',
showOnRoundabout: 'Vis på rundkjøring',
showOnUnpaved: 'Vis på uasfalterte veier',
maxZoom: 'Vis til zoomnivå:',
toggleLayerShortcut: 'Bytt visningslag for hastighet',
zIndex: 'Lagdybde',
hideShorterSegments: 'Skjul segmenter kortere enn',
speedFilter: 'Filtrer etter hastighet',
min: 'Min.:',
max: 'Maks.:',
opacity: 'Filter gjennomsiktighetsnivå:',
},
alertMessage: {
zIndex: `Når du bruker en lagdybde større enn <b>${this.zIndex.warn}</b>, vil hastighetslaget overlappe de andre, og du vil ikke kunne velge noen elementer på skjermen før du senker lagdybden til under <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `For å aktivere/deaktivere visningslaget for hastigheter, kan du gå til <b>Kartlag > Veier > Vis hastigheter</b> eller bruke snarveien <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Standard',
altViennaConv: 'Alternativ Wien-konvensjon',
japan: 'Japan',
northAmerica: 'Nord-Amerika',
sacu: 'Sydlige afrikanske tollunionen',
uk: 'Storbritannia',
},
btn: {
updateSettingsTab: 'Oppdater meny',
resetSettings: 'Tilbakestill innstillinger',
seeOnDiscuss: 'Se på diskusjonen',
seeOnDiscord: 'Se på Discord',
scriptDevBy: 'Script utviklet av Luan Tavares',
}
};
break;
case 'pl':
// Polish
translations = {
name: 'Wyświetlanie prędkości',
zoomOut: 'Oddal',
zoomIn: 'Przybliż',
changelog: 'Dziennik zmian',
changelogMessage: `<h6>Co nowego:</h6><ul style="margin-bottom: 10px"><li>Dodano motyw znaków ograniczenia prędkości w Ameryce Północnej.</li></ul><h6>Poprawki:</h6><ul><li>Naprawiono problem z wyświetlaniem prędkości jednokierunkowej w krajach z ruchem lewostronnym.</li></ul>`,
close: 'Zamknij',
viewScript: 'Zobacz skrypt',
viewChangelog: 'Zobacz dziennik zmian',
reset: 'Resetuj',
snackbar: {
updatingMapDisplay: 'Aktualizowanie ikon mapy. (Z celowym opóźnieniem)',
errorFiltering: 'Błąd podczas stosowania filtra. Minimalna prędkość nie może być większa niż maksymalna.',
},
title: {
general: 'Ogólne',
roadTypes: 'Rodzaje dróg',
filter: 'Filtr',
appearence: 'Wygląd',
showOnRoadType: 'Pokaż na następujących rodzajach dróg:',
seeOnDiscuss: 'Zobacz wątek skryptu na Discuss',
seeOnDiscord: 'Zobacz kanał skryptu na serwerze Discord Waze Script',
scriptDevBy: 'Zobacz mój profil użytkownika edytora',
},
label: {
displaySpeeds: 'Pokaż prędkości',
showNoSpeed: 'Pokaż na segmentach bez prędkości',
showOnRoundabout: 'Pokaż na rondzie',
showOnUnpaved: 'Pokaż na drodze nieutwardzonej',
maxZoom: 'Renderuj do zoomu:',
toggleLayerShortcut: 'Przełącz warstwę wyświetlania prędkości',
zIndex: 'Głębokość warstwy',
hideShorterSegments: 'Ukryj na segmentach krótszych niż',
speedFilter: 'Filtruj według prędkości',
min: 'Min.:',
max: 'Max.:',
opacity: 'Poziom przezroczystości filtra:',
},
alertMessage: {
zIndex: `Używając głębokości warstwy większej niż <b>${this.zIndex.warn}</b>, warstwa prędkości będzie nakładać się na inne, uniemożliwiając wybór jakichkolwiek elementów na ekranie, dopóki nie zmniejszysz jej poniżej <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Aby włączyć/wyłączyć warstwę wyświetlania prędkości, przejdź do <b>Warstwy mapy > Drogi > Wyświetl prędkości</b> lub użyj skrótu <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Domyślny',
altViennaConv: 'Alternatywna konwencja wiedeńska',
japan: 'Japonia',
northAmerica: 'Ameryka Północna',
sacu: 'Południowoafrykańska Unia Celna',
uk: 'Wielka Brytania',
},
btn: {
updateSettingsTab: 'Aktualizuj menu',
resetSettings: 'Resetuj ustawienia',
seeOnDiscuss: 'Zobacz na Dyskusji',
seeOnDiscord: 'Zobacz na Discordzie',
scriptDevBy: 'Skrypt opracowany przez Luana Tavaresa',
}
};
break;
case 'pt-BR':
// Portuguese (Brazil)
translations = {
name: 'Exibição de Velocidade',
zoomOut: 'Mais afastado',
zoomIn: 'Mais aproximado',
changelog: 'Registro de alterações',
changelogMessage: `<h6>Novidades:</h6><ul style="margin-bottom: 10px"><li>Adicionado tema de placas de velocidade da América do Norte.</li></ul><h6>Correções:</h6><ul><li>Corrigido problema na exibição da velocidade em vias de mão única em países com direção à esquerda.</li></ul>`,
close: 'Fechar',
viewScript: 'Ver script',
viewChangelog: 'Visualizar o registro de alterações',
reset: 'Redefinir',
snackbar: {
updatingMapDisplay: 'Atualizando ícones do mapa. (Com atraso intencional)',
errorFiltering: 'Erro ao aplicar o filtro. A velocidade mínima não pode ser maior que a máxima.',
},
title: {
general: 'Geral',
roadTypes: 'Tipos de via',
filter: 'Filtro',
appearence: 'Aparência',
showOnRoadType: 'Exibir nos seguintes tipos de via:',
seeOnDiscuss: 'Veja o tópico do script no Discuss',
seeOnDiscord: 'Veja o canal do script no servidor Discord do Waze Script',
scriptDevBy: 'Veja o meu perfil de usuário do editor',
},
label: {
displaySpeeds: 'Exibir velocidades',
showNoSpeed: 'Exibir em segmento sem velocidade',
showOnRoundabout: 'Exibir em rotatória',
showOnUnpaved: 'Exibir em via não pavimentada',
maxZoom: 'Renderizar até o zoom:',
toggleLayerShortcut: 'Alternar a camada de exibição da velocidade',
zIndex: 'Profundidade da camada',
hideShorterSegments: 'Ocultar em segmentos menores que',
speedFilter: 'Filtrar por velocidade',
min: 'Mín.:',
max: 'Máx.:',
opacity: 'Nível de opacidade do filtro:',
},
alertMessage: {
zIndex: `Ao utilizar uma profundidade de camada maior que <b>${this.zIndex.warn}</b>, a camada de velocidade se sobreponhará as outras e não será possível selecionar nenhum elemento na tela até baixa-la novamente abaixo de <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Para ativar/desativar a camada de exibição de velocidades, basta ir até <b>Camadas do Mapa > Vias > Exibir velocidades</b> ou utilizar o atalho <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Padrão',
altViennaConv: 'Convenção de Viena Alternativa',
japan: 'Japão',
northAmerica: 'América do Norte',
sacu: 'União Aduaneira da África Austral',
uk: 'Reino Unido',
},
btn: {
updateSettingsTab: 'Atualizar menu',
resetSettings: 'Redefinir configurações',
seeOnDiscuss: 'Ver no Discuss',
seeOnDiscord: 'Ver no Discord',
scriptDevBy: 'Script desenvolvido por Luan Tavares',
}
};
break;
case 'pt-PT':
// Portuguese (Portugal)
translations = {
name: 'Exibição de Velocidade',
zoomOut: 'Mais afastado',
zoomIn: 'Mais aproximado',
changelog: 'Registo de alterações',
changelogMessage: `<h6>Novo:</h6><ul style="margin-bottom: 10px"><li>Adicionado o tema de sinais de velocidade da América do Norte.</li></ul><h6>Correções:</h6><ul><li>Corrigido problema na visualização da velocidade em vias de sentido único em países com condução pela esquerda.</li></ul>`,
close: 'Fechar',
viewScript: 'Ver script',
viewChangelog: 'Visualizar o registo de alterações',
reset: 'Redefinir',
snackbar: {
updatingMapDisplay: 'A atualizar ícones do mapa. (Com atraso intencional)',
errorFiltering: 'Erro ao aplicar o filtro. A velocidade mínima não pode ser superior à máxima.',
},
title: {
general: 'Geral',
roadTypes: 'Tipos de estrada',
filter: 'Filtro',
appearence: 'Aparência',
showOnRoadType: 'Mostrar nos seguintes tipos de estrada:',
seeOnDiscuss: 'Veja o tópico do script no Discuss',
seeOnDiscord: 'Veja o canal do script no servidor Discord do Waze Script',
scriptDevBy: 'Veja o meu perfil de utilizador do editor',
},
label: {
displaySpeeds: 'Exibir velocidades',
showNoSpeed: 'Exibir em segmento sem velocidade',
showOnRoundabout: 'Exibir em rotunda',
showOnUnpaved: 'Exibir em via não pavimentada',
maxZoom: 'Renderizar até o zoom:',
toggleLayerShortcut: 'Alternar a camada de exibição da velocidade',
zIndex: 'Profundidade da camada',
hideShorterSegments: 'Ocultar em segmentos menores que',
speedFilter: 'Filtrar por velocidade',
min: 'Mín.:',
max: 'Máx.:',
opacity: 'Nível de opacidade do filtro:',
},
alertMessage: {
zIndex: `Ao utilizar uma profundidade de camada maior que <b>${this.zIndex.warn}</b>, a camada de velocidade se sobreporá a outras e não será possível selecionar nenhum elemento na tela até que a profundidade seja reduzida abaixo de <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Para ativar/desativar a camada de exibição de velocidades, basta ir a <b>Camadas do Mapa > Vias > Exibir velocidades</b> ou utilizar o atalho <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Padrão',
altViennaConv: 'Convenção de Viena Alternativa',
japan: 'Japão',
northAmerica: 'América do Norte',
sacu: 'União Aduaneira da África Austral',
uk: 'Reino Unido',
},
btn: {
updateSettingsTab: 'Atualizar menu',
resetSettings: 'Redefinir configurações',
seeOnDiscuss: 'Ver no Discuss',
seeOnDiscord: 'Ver no Discord',
scriptDevBy: 'Script desenvolvido por Luan Tavares',
}
};
break;
case 'ro':
// Romanian
translations = {
name: 'Afișarea vitezei',
zoomOut: 'Mai departe',
zoomIn: 'Mai aproape',
changelog: 'Jurnalul modificărilor',
changelogMessage: `<h6>Ce este nou:</h6><ul style="margin-bottom: 10px"><li>A fost adăugat tema semnelor de viteză din America de Nord.</li></ul><h6>Remedieri:</h6><ul><li>Problema afișării vitezei pentru sens unic în țările cu circulație pe partea stângă a fost remediată.</li></ul>`,
close: 'Închide',
viewScript: 'Vezi scriptul',
viewChangelog: 'Vizualizează jurnalul modificărilor',
reset: 'Resetează',
snackbar: {
updatingMapDisplay: 'Actualizare pictograme hartă. (Cu întârziere intenționată)',
errorFiltering: 'Eroare la aplicarea filtrului. Viteza minimă nu poate fi mai mare decât viteza maximă.',
},
title: {
general: 'General',
roadTypes: 'Tipuri de drumuri',
filter: 'Filtru',
appearence: 'Aparență',
showOnRoadType: 'Afișați pe următoarele tipuri de drumuri:',
seeOnDiscuss: 'Vezi firul scriptului pe Discuss',
seeOnDiscord: 'Vezi canalul scriptului pe serverul Discord Waze Script',
scriptDevBy: 'Vizualizează profilul meu de utilizator editor',
},
label: {
displaySpeeds: 'Afișează vitezele',
showNoSpeed: 'Afișează pe segmente fără viteză',
showOnRoundabout: 'Afișează pe sens giratoriu',
showOnUnpaved: 'Afișează pe drumuri neasfaltate',
maxZoom: 'Renderizează până la zoom:',
toggleLayerShortcut: 'Comută stratul de afișare a vitezei',
zIndex: 'Adâncimea stratului',
hideShorterSegments: 'Ascunde segmentele mai mici de',
speedFilter: 'Filtrează după viteză',
min: 'Min.:',
max: 'Max.:',
opacity: 'Nivelul de opacitate al filtrului:',
},
alertMessage: {
zIndex: `Atunci când folosești o adâncime a stratului mai mare de <b>${this.zIndex.warn}</b>, stratul de viteză se va suprapune altor straturi și nu vei putea selecta niciun element pe ecran până când nu scazi adâncimea sub <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Pentru a activa/dezactiva stratul de afișare a vitezelor, mergi la <b>Straturi Mapa > Drumuri > Afișează viteze</b> sau folosește scurtătura <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Implicit',
altViennaConv: 'Alternativă Convenția de la Viena',
japan: 'Japonia',
northAmerica: 'America de Nord',
sacu: 'Uniunea Vamală a Africii de Sud',
uk: 'Regatul Unit',
},
btn: {
updateSettingsTab: 'Actualizează meniul',
resetSettings: 'Resetare setări',
seeOnDiscuss: 'Vezi în discuție',
seeOnDiscord: 'Vezi pe Discord',
scriptDevBy: 'Script dezvoltat de Luan Tavares',
}
};
break;
case 'ru':
// Russian
translations = {
name: 'Отображение скорости',
zoomOut: 'Удалить',
zoomIn: 'Приблизить',
changelog: 'Журнал изменений',
changelogMessage: `<h6>Что нового:</h6><ul style="margin-bottom: 10px"><li>Добавлена тема знаков ограничения скорости для Северной Америки.</li></ul><h6>Исправления:</h6><ul><li>Исправлена проблема отображения скорости на односторонних дорогах в странах с левосторонним движением.</li></ul>`,
close: 'Закрыть',
viewScript: 'Посмотреть скрипт',
viewChangelog: 'Просмотреть журнал изменений',
reset: 'Сбросить',
snackbar: {
updatingMapDisplay: 'Обновление значков карты. (С намеренной задержкой)',
errorFiltering: 'Ошибка применения фильтра. Минимальная скорость не может быть больше максимальной.',
},
title: {
general: 'Общее',
roadTypes: 'Типы дорог',
filter: 'Фильтр',
appearence: 'Внешний вид',
showOnRoadType: 'Показать на следующих типах дорог:',
seeOnDiscuss: 'Посмотреть тему скрипта на Discuss',
seeOnDiscord: 'Посмотреть канал скрипта на сервере Discord Waze Script',
scriptDevBy: 'Посмотреть мой профиль пользователя редактора',
},
label: {
displaySpeeds: 'Отображать скорости',
showNoSpeed: 'Отображать на сегментах без скорости',
showOnRoundabout: 'Отображать на круговых развязках',
showOnUnpaved: 'Отображать на неасфальтированных дорогах',
maxZoom: 'Отображать до уровня зума:',
toggleLayerShortcut: 'Переключить слой отображения скорости',
zIndex: 'Глубина слоя',
hideShorterSegments: 'Скрывать на сегментах короче чем',
speedFilter: 'Фильтровать по скорости',
min: 'Мин.:',
max: 'Макс.:',
opacity: 'Уровень непрозрачности фильтра:',
},
alertMessage: {
zIndex: `При использовании глубины слоя больше <b>${this.zIndex.warn}</b> слой скорости будет перекрывать другие и вы не сможете выбрать элементы на экране, пока не уменьшите глубину слоя ниже <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Для активации/деактивации слоя отображения скорости перейдите в <b>Слои карты > Дороги > Отображать скорости</b> или используйте комбинацию клавиш <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'По умолчанию',
altViennaConv: 'Альтернативная Венская конвенция',
japan: 'Япония',
northAmerica: 'Северная Америка',
sacu: 'Южноафриканский таможенный союз',
uk: 'Соединенное Королевство',
},
btn: {
updateSettingsTab: 'Обновить меню',
resetSettings: 'Сбросить настройки',
seeOnDiscuss: 'Смотреть на обсуждении',
seeOnDiscord: 'Смотреть в Discord',
scriptDevBy: 'Скрипт разработан Луаном Таваресом',
}
};
break;
case 'sk':
// Slovak
translations = {
name: 'Zobrazenie rýchlosti',
zoomOut: 'Ďalej',
zoomIn: 'Priblížiť',
changelog: 'Záznam zmien',
changelogMessage: `<h6>Čo je nové:</h6><ul style="margin-bottom: 10px"><li>Pridaná téma značiek rýchlosti pre Severnú Ameriku.</li></ul><h6>Opravy:</h6><ul><li>Opravené zobrazovanie rýchlosti v jednosmerke v krajinách s ľavostrannou premávkou.</li></ul>`,
close: 'Zatvoriť',
viewScript: 'Zobraziť skript',
viewChangelog: 'Zobraziť záznam zmien',
reset: 'Obnoviť',
snackbar: {
updatingMapDisplay: 'Aktualizácia ikon na mape. (So zámerným oneskorením)',
errorFiltering: 'Chyba pri použití filtra. Minimálna rýchlosť nemôže byť väčšia ako maximálna.',
},
title: {
general: 'Všeobecné',
roadTypes: 'Typy ciest',
filter: 'Filtrovať',
appearence: 'Vzhľad',
showOnRoadType: 'Zobraziť na nasledujúcich typoch ciest:',
seeOnDiscuss: 'Pozrite si vlákno skriptu na Discuss',
seeOnDiscord: 'Pozrite si kanál skriptu na Waze Script Discord serveri',
scriptDevBy: 'Zobraziť môj profil používateľa editora',
},
label: {
displaySpeeds: 'Zobraziť rýchlosti',
showNoSpeed: 'Zobraziť na segmentoch bez rýchlosti',
showOnRoundabout: 'Zobraziť na okruhu',
showOnUnpaved: 'Zobraziť na nezpevnených cestách',
maxZoom: 'Zobraziť do úrovne priblíženia:',
toggleLayerShortcut: 'Prepínať vrstvu zobrazenia rýchlosti',
zIndex: 'Hĺbka vrstvy',
hideShorterSegments: 'Skryť na segmentoch kratších ako',
speedFilter: 'Filtrovať podľa rýchlosti',
min: 'Min.:',
max: 'Max.:',
opacity: 'Úroveň priezračnosti filtra:',
},
alertMessage: {
zIndex: `Pri použití hĺbky vrstvy väčšej ako <b>${this.zIndex.warn}</b> bude vrstva rýchlosti prekryť ostatné a nebude možné vybrať žiadny prvok na obrazovke, kým ju neznížite pod <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Ak chcete zapnúť/vypnúť vrstvu zobrazenia rýchlosti, prejdite na <b>Mapové vrstvy > Cesty > Zobraziť rýchlosti</b> alebo použite skratku <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Predvolený',
altViennaConv: 'Alternatívna Viedenská konvencia',
japan: 'Japonsko',
northAmerica: 'Severná Amerika',
sacu: 'Juhoafrická colná únia',
uk: 'Spojené kráľovstvo',
},
btn: {
updateSettingsTab: 'Aktualizovať menu',
resetSettings: 'Obnoviť nastavenia',
seeOnDiscuss: 'Pozrieť na diskusii',
seeOnDiscord: 'Pozrieť na Discord',
scriptDevBy: 'Skript vyvinul Luan Tavares',
}
};
break;
case 'sl':
// Slovenian
translations = {
name: 'Prikaz hitrosti',
zoomOut: 'Povečaj',
zoomIn: 'Pomanjšaj',
changelog: 'Zgodovina sprememb',
changelogMessage: `<h6>Novosti:</h6><ul style="margin-bottom: 10px"><li>Dodan je tema prometnih znakov za Severno Ameriko.</li></ul><h6>Popravki:</h6><ul><li>Odpravljen problem prikaza hitrosti v enosmernih ulicah v državah z vožnjo po levi.</li></ul>`,
close: 'Zapri',
viewScript: 'Poglej skript',
viewChangelog: 'Poglej zgodovino sprememb',
reset: 'Ponastavi',
snackbar: {
updatingMapDisplay: 'Posodabljanje ikon zemljevida. (Z namerno zamudo)',
errorFiltering: 'Napaka pri uporabi filtra. Najmanjša hitrost ne more biti večja od največje.',
},
title: {
general: 'Splošno',
roadTypes: 'Vrste cest',
filter: 'Filtriraj',
appearence: 'Izgled',
showOnRoadType: 'Prikaži na naslednjih vrstah cest:',
seeOnDiscuss: 'Oglejte si temo skripte na Discuss',
seeOnDiscord: 'Oglejte si kanal skripte na Waze Script Discord strežniku',
scriptDevBy: 'Ogled mojega uporabniškega profila urejevalnika',
},
label: {
displaySpeeds: 'Prikaz hitrosti',
showNoSpeed: 'Prikaz na segmentih brez hitrosti',
showOnRoundabout: 'Prikaz na krožišču',
showOnUnpaved: 'Prikaz na nepovoznih cestah',
maxZoom: 'Prikaz do stopnje povečave:',
toggleLayerShortcut: 'Preklopi plast prikaza hitrosti',
zIndex: 'Globina plasti',
hideShorterSegments: 'Skrij na segmentih krajši od',
speedFilter: 'Filtriraj po hitrosti',
min: 'Min.:',
max: 'Max.:',
opacity: 'Raven filtriranja prosojnosti:',
},
alertMessage: {
zIndex: `Pri uporabi globine plasti večje od <b>${this.zIndex.warn}</b> se bo plast hitrosti prekrila z drugimi in ne bo mogoče izbrati nobenega elementa na zaslonu, dokler je ne zmanjšate pod <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Za aktiviranje/izklop plasti prikaza hitrosti, pojdite na <b>Plasti zemljevida > Ceste > Prikaz hitrosti</b> ali uporabite bližnjico <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Privzeto',
altViennaConv: 'Alternativna Dunajska konvencija',
japan: 'Japonska',
northAmerica: 'Severna Amerika',
sacu: 'Južnoafriška carinska unija',
uk: 'Združeno kraljestvo',
},
btn: {
updateSettingsTab: 'Posodobi meni',
resetSettings: 'Ponastavi nastavitve',
seeOnDiscuss: 'Oglej si na razpravi',
seeOnDiscord: 'Oglej si na Discordu',
scriptDevBy: 'Skript je razvijal Luan Tavares',
}
};
break;
case 'sv':
// Swedish
translations = {
name: 'Hastighetsvisning',
zoomOut: 'Zooma ut',
zoomIn: 'Zooma in',
changelog: 'Ändringslogg',
changelogMessage: `<h6>Vad är nytt:</h6><ul style="margin-bottom: 10px"><li>Lagt till ett tema med hastighetsskyltar från Nordamerika.</li></ul><h6>Fixar:</h6><ul><li>Fixat visningen av enkelriktad hastighet i länder med vänstertrafik.</li></ul>`,
close: 'Stäng',
viewScript: 'Visa skript',
viewChangelog: 'Visa ändringslogg',
reset: 'Återställ',
snackbar: {
updatingMapDisplay: 'Uppdaterar kartikoner. (Med avsiktlig fördröjning)',
errorFiltering: 'Fel vid tillämpning av filtret. Minsta hastighet kan inte vara större än den maximala.',
},
title: {
general: 'Allmänt',
roadTypes: 'Väglagstyper',
filter: 'Filter',
appearence: 'Utseende',
showOnRoadType: 'Visa på följande vägtyper:',
seeOnDiscuss: 'Se skriptets tråd på Discuss',
seeOnDiscord: 'Se skriptets kanal på Waze Script Discord-servern',
scriptDevBy: 'Visa min redigerarprofil',
},
label: {
displaySpeeds: 'Visa hastigheter',
showNoSpeed: 'Visa på segment utan hastighet',
showOnRoundabout: 'Visa på rondell',
showOnUnpaved: 'Visa på oasfalterad väg',
maxZoom: 'Rendera upp till zoomnivå:',
toggleLayerShortcut: 'Växla hastighetslagrets synlighet',
zIndex: 'Lagerdjup',
hideShorterSegments: 'Dölj på segment som är kortare än',
speedFilter: 'Filtrera efter hastighet',
min: 'Min.:',
max: 'Max.:',
opacity: 'Filter opacitetsnivå:',
},
alertMessage: {
zIndex: `När du använder ett lagerdjup större än <b>${this.zIndex.warn}</b> kommer hastighetslagret att täcka andra lager och du kommer inte att kunna välja några objekt på skärmen förrän du sänker det under <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `För att aktivera/inaktivera hastighetsvisningslagret, gå till <b>Map Layers > Roads > Visa hastigheter</b> eller använd genvägen <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Standard',
altViennaConv: 'Alternativ Wienkonvention',
japan: 'Japan',
northAmerica: 'Nordamerika',
sacu: 'Sydafrikanska tullunionen',
uk: 'Storbritannien',
},
btn: {
updateSettingsTab: 'Uppdatera meny',
resetSettings: 'Återställ inställningar',
seeOnDiscuss: 'Se på diskussionen',
seeOnDiscord: 'Se på Discord',
scriptDevBy: 'Script utvecklat av Luan Tavares',
}
};
break;
case 'th':
// Thai
translations = {
name: 'การแสดงความเร็ว',
zoomOut: 'ซูมออก',
zoomIn: 'ซูมเข้า',
changelog: 'บันทึกการเปลี่ยนแปลง',
changelogMessage: `<h6>มีอะไรใหม่:</h6><ul style="margin-bottom: 10px"><li>เพิ่มธีมป้ายจำกัดความเร็วของอเมริกาเหนือแล้ว</li></ul><h6>การแก้ไข:</h6><ul><li>แก้ไขปัญหาการแสดงความเร็วแบบทางเดียวในประเทศที่ใช้การขับรถทางซ้าย</li></ul>`,
close: 'ปิด',
viewScript: 'ดูสคริปต์',
viewChangelog: 'ดูบันทึกการเปลี่ยนแปลง',
reset: 'คืนค่า',
snackbar: {
updatingMapDisplay: 'กำลังอัปเดตไอคอนแผนที่ (มีความล่าช้าโดยเจตนา)',
errorFiltering: 'ข้อผิดพลาดในการใช้ตัวกรอง ความเร็วขั้นต่ำต้องไม่มากกว่าค่าสูงสุด.',
},
title: {
general: 'ทั่วไป',
roadTypes: 'ประเภทถนน',
filter: 'ตัวกรอง',
appearence: 'ลักษณะ',
showOnRoadType: 'แสดงในประเภทถนนต่อไปนี้:',
seeOnDiscuss: 'ดูเธรดของสคริปต์ใน Discuss',
seeOnDiscord: 'ดูช่องของสคริปต์ในเซิร์ฟเวอร์ Discord ของ Waze Script',
scriptDevBy: 'ดูโปรไฟล์ผู้ใช้ของฉันในตัวแก้ไข',
},
label: {
displaySpeeds: 'แสดงความเร็ว',
showNoSpeed: 'แสดงในเซกเมนต์ที่ไม่มีความเร็ว',
showOnRoundabout: 'แสดงในทางแยกรอบ',
showOnUnpaved: 'แสดงในถนนที่ไม่ได้ปู',
maxZoom: 'แสดงได้จนถึงการซูมระดับ:',
toggleLayerShortcut: 'สลับการแสดงผลเลเยอร์ความเร็ว',
zIndex: 'ความลึกของเลเยอร์',
hideShorterSegments: 'ซ่อนในเซกเมนต์ที่สั้นกว่า',
speedFilter: 'กรองตามความเร็ว',
min: 'ขั้นต่ำ:',
max: 'สูงสุด:',
opacity: 'ระดับความทึบของฟิลเตอร์:',
},
alertMessage: {
zIndex: `เมื่อใช้ความลึกของเลเยอร์ที่มากกว่า <b>${this.zIndex.warn}</b> เลเยอร์ความเร็วจะทับซ้อนกับเลเยอร์อื่นและคุณจะไม่สามารถเลือกองค์ประกอบใดๆ บนหน้าจอจนกว่าจะลดความลึกลงต่ำกว่า <b>${this.zIndex.warn}</b> อีกครั้ง.`,
toggleVisibility: `เพื่อเปิด/ปิดการแสดงผลของเลเยอร์ความเร็ว ให้ไปที่ <b>แผนที่ > ถนน > แสดงความเร็ว</b> หรือใช้ทางลัด <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'ค่าเริ่มต้น',
altViennaConv: 'อนุสัญญาวีนนาทางเลือก',
japan: 'ญี่ปุ่น',
northAmerica: 'อเมริกาเหนือ',
sacu: 'สหภาพศุลกากรแอฟริกาตอนใต้',
uk: 'สหราชอาณาจักร',
},
btn: {
updateSettingsTab: 'อัปเดตเมนู',
resetSettings: 'ตั้งค่าคืนค่า',
seeOnDiscuss: 'ดูในกระทู้สนทนา',
seeOnDiscord: 'ดูใน Discord',
scriptDevBy: 'สคริปต์พัฒนาโดย Luan Tavares',
}
};
break;
case 'tr':
// Turkish
translations = {
name: 'Hız Gösterimi',
zoomOut: 'Daha uzak',
zoomIn: 'Daha yakın',
changelog: 'Değişiklikler',
changelogMessage: `<h6>Yenilikler:</h6><ul style="margin-bottom: 10px"><li>Kuzey Amerika hız tabelası teması eklendi.</li></ul><h6>Düzeltmeler:</h6><ul><li>Sol şerit trafiği olan ülkelerde tek yönlü hız görüntüleme sorunu düzeltildi.</li></ul>`,
close: 'Kapat',
viewScript: 'Scripti Görüntüle',
viewChangelog: 'Değişiklikler Kaydını Görüntüle',
reset: 'Sıfırla',
snackbar: {
updatingMapDisplay: 'Harita simgeleri güncelleniyor. (Kasıtlı gecikmeyle)',
errorFiltering: 'Filtre uygulanırken hata oluştu. Minimum hız, maksimum hızdan büyük olamaz.',
},
title: {
general: 'Genel',
roadTypes: 'Yol Tipleri',
filter: 'Filtre',
appearence: 'Görünüm',
showOnRoadType: 'Aşağıdaki yol tiplerinde göster:',
seeOnDiscuss: 'Script\'in thread\'ini Discuss\'ta görün',
seeOnDiscord: 'Waze Script Discord sunucusunda script kanalını görün',
scriptDevBy: 'Editör kullanıcı profilimi görüntüle',
},
label: {
displaySpeeds: 'Hızları Göster',
showNoSpeed: 'Hızsız segmentlerde göster',
showOnRoundabout: 'Dönel kavşakta göster',
showOnUnpaved: 'Asfaltlanmamış yolda göster',
maxZoom: 'Zoom seviyesine kadar render yap:',
toggleLayerShortcut: 'Hız katmanını açıp kapatma kısayolu',
zIndex: 'Katman derinliği',
hideShorterSegments: 'Daha kısa segmentlerde gizle',
speedFilter: 'Hız filtresi',
min: 'Min:',
max: 'Maks:',
opacity: 'Filtre opaklık seviyesi:',
},
alertMessage: {
zIndex: `Katman derinliğini <b>${this.zIndex.warn}</b> değerinden daha yüksek kullanırsanız, hız katmanı diğerlerinin üst üste binmesine neden olur ve herhangi bir öğe seçilemez. Bu durumu düzeltmek için katman derinliğini <b>${this.zIndex.warn}</b> değerinin altına indirin.`,
toggleVisibility: `Hız katmanını açıp kapatmak için <b>Harita Katmanları > Yollar > Hızları Göster</b> yolunu izleyebilir veya <b>ALT</b> + <b>SHIFT</b> + <b>S</b> kısayolunu kullanabilirsiniz.`
},
theme: {
default: 'Varsayılan',
altViennaConv: 'Alternatif Viyana Sözleşmesi',
japan: 'Japonya',
northAmerica: 'Kuzey Amerika',
sacu: 'Güney Afrika Gümrük Birliği',
uk: 'Birleşik Krallık',
},
btn: {
updateSettingsTab: 'Menüyü Güncelle',
resetSettings: 'Ayarları Sıfırla',
seeOnDiscuss: 'Tartışmada gör',
seeOnDiscord: 'Discord’da gör',
scriptDevBy: 'Script, Luan Tavares tarafından geliştirilmiştir',
}
};
break;
case 'uk':
// Ukrainian
translations = {
name: 'Відображення швидкості',
zoomOut: 'Далі',
zoomIn: 'Ближче',
changelog: 'Журнал змін',
changelogMessage: `<h6>Що нового:</h6><ul style="margin-bottom: 10px"><li>Додано тему знаків обмеження швидкості для Північної Америки.</li></ul><h6>Виправлення:</h6><ul><li>Виправлено відображення швидкості в односторонньому русі в країнах з лівостороннім рухом.</li></ul>`,
close: 'Закрити',
viewScript: 'Переглянути сценарій',
viewChangelog: 'Переглянути журнал змін',
reset: 'Скинути',
snackbar: {
updatingMapDisplay: 'Оновлення значків карти. (З навмисною затримкою)',
errorFiltering: 'Помилка застосування фільтра. Мінімальна швидкість не може бути більшою за максимальну.',
},
title: {
general: 'Загальні',
roadTypes: 'Типи доріг',
filter: 'Фільтр',
appearence: 'Зовнішній вигляд',
showOnRoadType: 'Показати на наступних типах доріг:',
seeOnDiscuss: 'Переглянути тему скрипта на Discuss',
seeOnDiscord: 'Переглянути канал скрипта на сервері Discord Waze Script',
scriptDevBy: 'Переглянути мій профіль користувача редактора',
},
label: {
displaySpeeds: 'Показувати швидкості',
showNoSpeed: 'Показувати на сегментах без швидкості',
showOnRoundabout: 'Показувати на кільцевих перехрестях',
showOnUnpaved: 'Показувати на непокритих дорогах',
maxZoom: 'Рендерити до рівня zoom:',
toggleLayerShortcut: 'Перемикання шару відображення швидкості',
zIndex: 'Глибина шару',
hideShorterSegments: 'Приховувати на сегментах менше ніж',
speedFilter: 'Фільтрувати за швидкістю',
min: 'Мін.:',
max: 'Макс.:',
opacity: 'Рівень прозорості фільтра:',
},
alertMessage: {
zIndex: `Якщо використовувати глибину шару більше за <b>${this.zIndex.warn}</b>, шар швидкості накладатиметься на інші, і ви не зможете вибрати жоден елемент на екрані, поки не зменшите глибину до <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Щоб увімкнути/вимкнути шар швидкості, просто перейдіть до <b>Шари карти > Дороги > Відображати швидкості</b> або використовуйте гарячу клавішу <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'За замовчуванням',
altViennaConv: 'Альтернативна Віденська конвенція',
japan: 'Японія',
northAmerica: 'Північна Америка',
sacu: 'Південноафриканський митний союз',
uk: 'Сполучене Королівство',
},
btn: {
updateSettingsTab: 'Оновити меню',
resetSettings: 'Скинути налаштування',
seeOnDiscuss: 'Дивитися в обговоренні',
seeOnDiscord: 'Дивитися в Discord',
scriptDevBy: 'Сценарій розроблений Луаном Таваресом',
}
};
break;
case 'vi':
// Vietnamese
translations = {
name: 'Hiển thị tốc độ',
zoomOut: 'Zoom ra',
zoomIn: 'Zoom vào',
changelog: 'Lịch sử thay đổi',
changelogMessage: `<h6>Có gì mới:</h6><ul style="margin-bottom: 10px"><li>Đã thêm chủ đề biển báo tốc độ Bắc Mỹ.</li></ul><h6>Sửa lỗi:</h6><ul><li>Đã sửa lỗi hiển thị tốc độ một chiều ở các quốc gia lái xe bên trái.</li></ul>`,
close: 'Đóng',
viewScript: 'Xem kịch bản',
viewChangelog: 'Xem lịch sử thay đổi',
reset: 'Đặt lại',
snackbar: {
updatingMapDisplay: 'Đang cập nhật biểu tượng bản đồ. (Có độ trễ cố ý)',
errorFiltering: 'Lỗi áp dụng bộ lọc. Tốc độ tối thiểu không thể lớn hơn tốc độ tối đa.',
},
title: {
general: 'Chung',
roadTypes: 'Loại đường',
filter: 'Lọc',
appearence: 'Ngoại hình',
showOnRoadType: 'Hiển thị trên các loại đường sau:',
seeOnDiscuss: 'Xem chủ đề của script trên Discuss',
seeOnDiscord: 'Xem kênh của script trên máy chủ Discord của Waze Script',
scriptDevBy: 'Xem hồ sơ người dùng biên tập viên của tôi',
},
label: {
displaySpeeds: 'Hiển thị tốc độ',
showNoSpeed: 'Hiển thị trên đoạn đường không có tốc độ',
showOnRoundabout: 'Hiển thị trên vòng xuyến',
showOnUnpaved: 'Hiển thị trên đường không trải nhựa',
maxZoom: 'Hiển thị đến mức zoom:',
toggleLayerShortcut: 'Chuyển đổi lớp hiển thị tốc độ',
zIndex: 'Độ sâu lớp',
hideShorterSegments: 'Ẩn trên các đoạn đường ngắn hơn',
speedFilter: 'Lọc theo tốc độ',
min: 'Tối thiểu:',
max: 'Tối đa:',
opacity: 'Mức độ trong suốt bộ lọc:',
},
alertMessage: {
zIndex: `Khi sử dụng độ sâu lớp lớn hơn <b>${this.zIndex.warn}</b>, lớp tốc độ sẽ chồng lên các lớp khác và bạn sẽ không thể chọn bất kỳ đối tượng nào trên màn hình cho đến khi giảm độ sâu lớp xuống dưới <b>${this.zIndex.warn}</b>.`,
toggleVisibility: `Để bật/tắt lớp hiển thị tốc độ, chỉ cần vào <b>Lớp bản đồ > Đoạn đường > Hiển thị tốc độ</b> hoặc sử dụng phím tắt <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Mặc định',
altViennaConv: 'Hiệp định Vienna thay thế',
japan: 'Nhật Bản',
northAmerica: 'Bắc Mỹ',
sacu: 'Liên minh Hải quan Nam Phi',
uk: 'Vương quốc Anh',
},
btn: {
updateSettingsTab: 'Cập nhật menu',
resetSettings: 'Đặt lại cài đặt',
seeOnDiscuss: 'Xem trên thảo luận',
seeOnDiscord: 'Xem trên Discord',
scriptDevBy: 'Script được phát triển bởi Luan Tavares',
}
};
break;
case 'zh':
// Chinese
translations = {
name: '速度显示',
zoomOut: '缩小',
zoomIn: '放大',
changelog: '更新日志',
changelogMessage: `<h6>新功能:</h6><ul style="margin-bottom: 10px"><li>新增北美速度標誌主題。</li></ul><h6>修復:</h6><ul><li>修正了在靠左行駛國家中單行道速度顯示的問題。</li></ul>`,
close: '关闭',
viewScript: '查看脚本',
viewChangelog: '查看更新日志',
reset: '重置',
snackbar: {
updatingMapDisplay: '正在更新地图图标。(有意延迟)',
errorFiltering: '应用过滤器时出错。最低速度不能大于最高速度。',
},
title: {
general: '常规',
roadTypes: '道路类型',
filter: '过滤器',
appearence: '外观',
showOnRoadType: '在以下道路类型上显示:',
seeOnDiscuss: '查看脚本的主题讨论',
seeOnDiscord: '查看Waze Script Discord服务器上的脚本频道',
scriptDevBy: '查看我的编辑器用户档案',
},
label: {
displaySpeeds: '显示速度',
showNoSpeed: '显示无速度段落',
showOnRoundabout: '显示在环形交叉口',
showOnUnpaved: '显示在未铺砌的道路上',
maxZoom: '最大缩放:',
toggleLayerShortcut: '切换速度显示图层',
zIndex: '图层深度',
hideShorterSegments: '隐藏小于以下长度的段落',
speedFilter: '按速度过滤',
min: '最小:',
max: '最大:',
opacity: '过滤器透明度级别:',
},
alertMessage: {
zIndex: `当使用大于 <b>${this.zIndex.warn}</b> 的图层深度时,速度图层将覆盖其他图层,您将无法选择任何屏幕上的元素,直到将其深度降低到 <b>${this.zIndex.warn}</b> 以下。`,
toggleVisibility: `要启用/禁用速度显示图层,只需转到 <b>地图图层 > 道路 > 显示速度</b> 或使用快捷键 <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: '默认',
altViennaConv: '替代维也纳公约',
japan: '日本',
northAmerica: '北美洲',
sacu: '南部非洲关税联盟',
uk: '英国',
},
btn: {
updateSettingsTab: '更新菜单',
resetSettings: '重置设置',
seeOnDiscuss: '在讨论中查看',
seeOnDiscord: '在 Discord 上查看',
scriptDevBy: '脚本由Luan Tavares开发',
}
};
break;
case 'zh-TW':
// Traditional Chinese
translations = {
name: '速度顯示',
zoomOut: '縮小',
zoomIn: '放大',
changelog: '更新日誌',
changelogMessage: `<h6>新功能:</h6><ul style="margin-bottom: 10px"><li>新增北美速度標誌主題。</li></ul><h6>修正:</h6><ul><li>修正了在靠左行駛國家中單行道速度顯示的問題。</li></ul>`,
close: '關閉',
viewScript: '查看腳本',
viewChangelog: '查看更新日誌',
reset: '重設',
snackbar: {
updatingMapDisplay: '正在更新地圖圖標。(有意延遲)',
errorFiltering: '應用篩選器時出錯。最低速度不能大於最高速度。',
},
title: {
general: '常規',
roadTypes: '道路類型',
filter: '過濾器',
appearence: '外觀',
showOnRoadType: '在以下道路類型上顯示:',
seeOnDiscuss: '查看腳本的主題討論',
seeOnDiscord: '查看Waze Script Discord伺服器上的腳本頻道',
scriptDevBy: '查看我的編輯器用戶檔案',
},
label: {
displaySpeeds: '顯示速度',
showNoSpeed: '顯示無速度段落',
showOnRoundabout: '顯示在環形交叉口',
showOnUnpaved: '顯示在未鋪設的道路上',
maxZoom: '最大縮放:',
toggleLayerShortcut: '切換速度顯示圖層',
zIndex: '圖層深度',
hideShorterSegments: '隱藏小於以下長度的段落',
speedFilter: '按速度過濾',
min: '最小:',
max: '最大:',
opacity: '濾鏡透明度級別:',
},
alertMessage: {
zIndex: `當使用大於 <b>${this.zIndex.warn}</b> 的圖層深度時,速度圖層將覆蓋其他圖層,您將無法選擇任何螢幕上的元素,直到將其深度降低到 <b>${this.zIndex.warn}</b> 以下。`,
toggleVisibility: `要啟用/禁用速度顯示圖層,只需前往 <b>地圖圖層 > 道路 > 顯示速度</b> 或使用快捷鍵 <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: '預設',
altViennaConv: '替代維也納公約',
japan: '日本',
northAmerica: '北美洲',
sacu: '南部非洲關稅聯盟',
uk: '英國',
},
btn: {
updateSettingsTab: '更新菜單',
resetSettings: '重設設定',
seeOnDiscuss: '在討論中查看',
seeOnDiscord: '在 Discord 上查看',
scriptDevBy: '腳本由Luan Tavares開發',
}
};
break;
default:
// Default language (english)
translations = {
name: 'Speed Display',
zoomOut: 'Zoom Out',
zoomIn: 'Zoom In',
changelog: 'Changelog',
changelogMessage: `<h6>What’s New:</h6><ul style="margin-bottom: 10px"><li>Added North American speed sign theme.</li></ul><h6>Fixes:</h6><ul><li>Fixed one-way speed display issue in left-hand traffic countries.</li></ul>`,
close: 'Close',
viewScript: 'View Script',
viewChangelog: 'View Changelog',
reset: 'Reset',
snackbar: {
updatingMapDisplay: 'Updating map icons. (With intentional delay)',
errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
},
title: {
general: 'General',
roadTypes: 'Road Types',
filter: 'Filter',
appearence: 'Appearence',
showOnRoadType: 'Show on the following road types:',
seeOnDiscuss: 'See the script\'s thread on the Discuss',
seeOnDiscord: 'See the script\'s channel on the Waze Script\'s Discord server',
scriptDevBy: 'View my editor user profile',
},
label: {
displaySpeeds: 'Display speeds',
showNoSpeed: 'Show on segments with no speed',
showOnRoundabout: 'Show on roundabout',
showOnUnpaved: 'Show on unpaved road',
maxZoom: 'Render until zoom:',
toggleLayerShortcut: 'Toggle speed display layer',
zIndex: 'Layer depth',
hideShorterSegments: 'Hide segments shorter than',
speedFilter: 'Filter by speed',
min: 'Min:',
max: 'Max:',
opacity: 'Filter opacity level:',
},
alertMessage: {
zIndex: `When using a layer depth greater than <b>${this.zIndex.warn}</b>, the speed layer will overlap others, and you will not be able to select any element on the screen until you lower the depth below <b>${this.zIndex.warn}</b>.`,
// TODO: Adjust translation of the toggleVisibility when finishing SDK migration
toggleVisibility: `To toggle the visibility of the speed display layer, just go to <b>Map Layers > Roads > Show speeds</b> or use the shortcut <b>ALT</b> + <b>SHIFT</b> + <b>S</b>`
},
theme: {
default: 'Default',
altViennaConv: 'Alternative Vienna Convention',
japan: 'Japan',
northAmerica: 'North America',
sacu: 'Southern African Customs Union',
uk: 'United Kingdom',
},
btn: {
updateSettingsTab: 'Update Menu',
resetSettings: 'Reset Settings',
seeOnDiscuss: 'See on the Discuss',
seeOnDiscord: 'See on the Discord',
scriptDevBy: 'Script developed by Luan Tavares',
}
};
break;
};
Object.assign(this.spdTranslations, translations);
this.logDebug('Languages defined.');
}
}
window.SDK_INITIALIZED.then(() => new WmeSpeedDisplay());