// ==UserScript==
// @name WME Speed Display
// @name:pt-BR WME Exibição de Velocidade
// @namespace https://greasyfork.org/scripts/526702-wme-speed-display/
// @version 2.3.6
// @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
* There is a snackbar that makes my wrapper go up and not go down anymore. Identify what it is and fix it
* Remove the checkbox to enable/disable the script layer in the layers tab. Now the only button is in the script tab itself.
*/
/* global I18n */
/* global getWmeSdk */
// TODO: Remove this when SDK migration is complete
/* global W */
class WmeSpeedDisplay {
constructor() {
this.version = '2.3.6';
this.debugMode = false;
this.needResetSettings = true;
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),
onSegmentLengthFilterChanged: this.debounce(this.onSegmentLengthFilterChanged.bind(this), 500),
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.tries = {
filterTab: 0,
userscripts: 0,
houseNumberCheckbox: 0,
max: 10
};
this.activedFilters = 0;
this.filterCounter;
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();
}
/**
* Updates the checkables chip and triggers map update when opacity changes.
* @param {Event} event
*/
async onChipClicked(event) {
let clickedChip = event.target;
if (clickedChip.getAttribute('checked') != null)
return;
let checkedChip = clickedChip.parentNode.querySelector('wz-checkable-chip[checked]');
checkedChip?.removeAttribute('checked');
checkedChip?.removeAttribute('read-only');
clickedChip.setAttribute('checked', '');
clickedChip.setAttribute('read-only', '');
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');
}
/**
* Updates the segment length filter and settings.
*/
async onSegmentLengthFilterChanged() {
this.updateFilterCounter();
await this.debounce.saveSettings();
this.preUpdateMapDisplay();
}
/**
* 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.updateFilterCounter();
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));
['spd-show-no-speed', 'spd-show-unpaved'].forEach(id => {
document.getElementById(id).addEventListener('click', this.onChipClicked.bind(this));
});
// Change event -> onSettingsChange
['spd-show-roundabout', 'spd-hide-segment-smaller-than', 'spd-min-speed', 'spd-max-speed'].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.debounce.onSegmentLengthFilterChanged.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.testSomething.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));
['spd-show-no-speed', 'spd-show-unpaved'].forEach(id => {
document.getElementById(id).removeEventListener('click', this.onChipClicked.bind(this));
});
// Change event -> onSettingsChange
['spd-show-roundabout', 'spd-hide-segment-smaller-than', 'spd-min-speed', 'spd-max-speed'].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.debounce.onSegmentLengthFilterChanged.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.testSomething.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});
}
/**
* Used only to test some action.
*/
testSomething() {
this.logDebug('testing....');
}
/**
* Updates the map display if the road group checkbox is checked and speed display is enabled, showing a snackbar during the process.
*/
async preUpdateMapDisplay() {
if (!this.layerCheckbox.roadGroup.checked || !this.settings.spdEnabled) {
this.logDebug('Can\'t update the map display.', false, 'warn');
return;
}
let snackbarId = 'spd-snackbar-updating-map';
if (W.map.getZoom() >= this.settings.general.spdMaxZoom)
this.addSnackbar(snackbarId, '<div class="loader"></div>', null, true);
await this.debounce.updateMapDisplay();
this.removeSnackbar(document.getElementById(snackbarId));
}
/**
* Updates the map display by removing old features and adding new speed icons based on the settings.
*/
// TODO: Remove this when SDK migration is complete
updateMapDisplay() {
return new Promise((resolve, reject) => {
try {
this.logDebug('Updating map display...');
this.layer.removeAllFeatures();
if (W.map.getZoom() < this.settings.general.spdMaxZoom) {
this.logDebug('Maximum zoom exceeded. No speeds will be displayed.', false, 'warn');
resolve();
return;
}
let segments = W.model.segments.objects || {};
let segmentKeys = Object.keys(segments);
if (segmentKeys.length == 0) {
this.logDebug('No segments found.', false, 'error');
reject();
return;
}
this.logDebug(`Total segments loaded: ${segmentKeys.length}`);
segmentKeys.forEach(segmentId => {
let segment = segments[segmentId];
if (!segment || !segment.attributes) {
this.logDebug(`Could not find attributes or they are missing on the segment ${segmentId}.`, false, 'error');
return;
}
let attributes = segment.attributes;
let roadSettingId = this.convertStringCaseStyle('snake', 'camel', `spd_show_speed_in_${this.getRoadSettingNameById(attributes.roadType)}`);
let isLeftHandTraffic = this.wmeSdk.DataModel.Countries.getTopCountry()?.isLeftHandTraffic;
let isFwd = attributes.fwdDirection;
let isRev = attributes.revDirection;
let speedFwd = this.getSpeed(isLeftHandTraffic ? attributes.revMaxSpeed : attributes.fwdMaxSpeed);
let speedRev = this.getSpeed(isLeftHandTraffic ? attributes.fwdMaxSpeed : attributes.revMaxSpeed);
let noSpeed = (speedFwd == 'N/A' && speedRev == 'N/A') || (isFwd && !isRev && speedFwd == 'N/A') || (!isFwd && isRev && speedRev == 'N/A') || (!isFwd && !isRev);
let isUnpaved = attributes.flags == 16;
let ignoreNoSpeed = this.settings.general.spdShowNoSpeed == 'ignore' && noSpeed;
let ignoreOnUnpaved = this.settings.general.spdShowUnpaved == 'ignore' && isUnpaved;
let ignoreOnRoundabout = !this.settings.general.spdShowRoundabout && attributes.junctionID;
let outOfFocusSegments = (this.settings.general.spdShowNoSpeed == 'focus' && !noSpeed) || (this.settings.general.spdShowUnpaved == 'focus' && !isUnpaved);
if (outOfFocusSegments || ignoreNoSpeed || ignoreOnUnpaved || ignoreOnRoundabout || !this.settings.roads[roadSettingId]) {
this.logDebug('This type of segment should not be loaded.', false, 'warn');
return;
}
let geometry = segment.getOLGeometry();
if (!geometry || geometry.components.length < 2) {
this.logDebug(`Invalid geometry on segment: ${segmentId}.`, false, 'error');
return;
}
let minLength = this.settings.filter.spdHideSegmentSmallerThan;
let segmentLength = attributes.length;
let opacity = minLength != null && segmentLength < minLength ? this.getSettingOpacity() : null;
let midpoint = this.calculateMidpoint(geometry);
let angle = this.calculateAngleAtMidpoint(geometry);
let {leftPoint, rightPoint} = this.getPerpendicularPoints(midpoint, angle, 5);
if (isFwd && isRev && speedFwd != speedRev) {
let leftFeature = new OpenLayers.Feature.Vector(leftPoint, {speed: speedRev});
let rightFeature = new OpenLayers.Feature.Vector(rightPoint, {speed: speedFwd});
leftFeature.style = {
graphic: true,
externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedRev)),
graphicHeight: 30,
graphicWidth: 30,
graphicYOffset: -15,
graphicXOffset: -15,
graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedRev)
};
rightFeature.style = {
graphic: true,
externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedFwd)),
graphicHeight: 30,
graphicWidth: 30,
graphicYOffset: -15,
graphicXOffset: -15,
graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedFwd)
};
this.layer.addFeatures([leftFeature, rightFeature]);
} else {
let speed = isLeftHandTraffic ? (isFwd ? speedRev : speedFwd) : (isFwd ? speedFwd : speedRev);
let centerFeature = new OpenLayers.Feature.Vector(midpoint, {speed});
centerFeature.style = {
graphic: true,
externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speed, isFwd && isRev)),
graphicHeight: 30,
graphicWidth: 30,
graphicYOffset: -15,
graphicXOffset: -15,
graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speed)
};
this.layer.addFeatures([centerFeature]);
}
});
this.logDebug('Update finished.');
resolve();
} catch (error) {
this.logDebug(error, false, 'error');
reject(error);
}
});
}
// TODO: SDK migration
// updateMapDisplay() {
// return new Promise(async (resolve, reject) => {
// try {
// this.logDebug('Updating map display...');
// this.wmeSdk.Map.removeAllFeaturesFromLayer({layerName: this.layerName});
// if (this.wmeSdk.Map.getZoomLevel() < this.settings.general.spdMaxZoom) {
// this.logDebug('Maximum zoom exceeded. No speeds will be displayed.', false, 'warn');
// resolve();
// return;
// }
// let segments = await this.wmeSdk.DataModel.Segments.getAll();
// if (segments.length == 0) {
// this.logDebug('No segments found.', false, 'error');
// reject();
// return;
// }
// this.logDebug('Total segments loaded: ' + segments.length);
// segments.forEach(segment => {
// let roadSettingId = this.convertStringCaseStyle('snake', 'camel', `spd_show_speed_in_${this.getRoadSettingNameById(segment.roadType)}`);
// let isLeftHandTraffic = this.wmeSdk.DataModel.Countries.getTopCountry()?.isLeftHandTraffic;
// let isFwd = segment.isAtoB;
// let isRev = segment.isBtoA;
// let isTwoWay = segment.isTwoWay;
// let speedFwd = this.getSpeed(isFwd ? (isLeftHandTraffic ? segment.revSpeedLimit : segment.fwdSpeedLimit) : null);
// let speedRev = this.getSpeed(isRev ? (isLeftHandTraffic ? segment.fwdSpeedLimit : segment.revSpeedLimit) : null);
// let noSpeed = (speedFwd == 'N/A' && speedRev == 'N/A') || (isFwd && !isRev && speedFwd == 'N/A') || (!isFwd && isRev && speedRev == 'N/A') || (!isFwd && !isRev && !isTwoWay);
// let isUnpaved = segment.flagAttributes.unpaved;
// let ignoreNoSpeed = this.settings.general.spdShowNoSpeed == 'ignore' && noSpeed;
// let ignoreOnUnpaved = this.settings.general.spdShowUnpaved == 'ignore' && isUnpaved;
// let ignoreOnRoundabout = !this.settings.general.spdShowRoundabout && segment.junctionId;
// let outOfFocusSegments = (this.settings.general.spdShowNoSpeed == 'focus' && !noSpeed) || (this.settings.general.spdShowUnpaved == 'focus' && !isUnpaved);
// if (outOfFocusSegments || ignoreNoSpeed || ignoreOnUnpaved || ignoreOnRoundabout || !this.settings.roads[roadSettingId]) {
// this.logDebug('This type of segment should not be loaded.', false, 'warn');
// return;
// }
// let geometry = segment.geometry;
// if (!geometry || geometry.coordinates.length < 2) {
// this.logDebug(`${this.getTranslation('log.invalidGeometry')} ${segment.id}.`, false, 'error');
// return;
// }
// let minLength = this.settings.filter.spdHideSegmentSmallerThan;
// let segmentLength = this.getLength(geometry.coordinates);
// let opacity = minLength != null && segmentLength < minLength ? this.getSettingOpacity() : null;
// let midpoint = this.calculateMidpoint(geometry.coordinates, segmentLength);
// let angle = this.calculateAngleAtMidpoint(geometry.coordinates);
// let {leftPoint, rightPoint} = this.getPerpendicularPoints(midpoint, angle, 5);
// if (isFwd && isRev && speedFwd != speedRev) {
// this.wmeSdk.Map.addFeaturesToLayer({
// layerName: this.layerName,
// features: [
// {
// type: 'Feature',
// id: `speed-${segment.id}-rev`,
// geometry: {
// type: 'Point',
// coordinates: [leftPoint[0], leftPoint[1]]
// },
// properties: {
// speed: speedRev
// },
// style: {
// icon: {
// type: 'image',
// url: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedRev)),
// size: {
// width: 30,
// height: 30
// },
// anchor: {
// x: 15,
// y: 15
// },
// opacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedRev)
// }
// }
// },
// {
// type: 'Feature',
// id: `speed-${segment.id}-fwd`,
// geometry: {
// type: 'Point',
// coordinates: [rightPoint[0], rightPoint[1]]
// },
// properties: {
// speed: speedFwd
// },
// style: {
// icon: {
// type: 'image',
// url: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedFwd)),
// size: {
// width: 30,
// height: 30
// },
// anchor: {
// x: 15,
// y: 15
// },
// opacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedFwd)
// }
// }
// }
// ]
// });
// // let leftFeature = new OpenLayers.Feature.Vector(leftPoint, {speed: speedRev});
// // leftFeature.style = {
// // graphic: true,
// // externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedRev)),
// // graphicHeight: 30,
// // graphicWidth: 30,
// // graphicYOffset: -15,
// // graphicXOffset: -15,
// // graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedRev)
// // };
// // let rightFeature = new OpenLayers.Feature.Vector(rightPoint, {speed: speedFwd});
// // rightFeature.style = {
// // graphic: true,
// // externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speedFwd)),
// // graphicHeight: 30,
// // graphicWidth: 30,
// // graphicYOffset: -15,
// // graphicXOffset: -15,
// // graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speedFwd)
// // };
// // this.layer.addFeatures([leftFeature, rightFeature]);
// // this.layer.addFeatures([leftFeature, rightFeature]);
// } else {
// let speed;
// if (isFwd && speedFwd != null) {
// speed = speedFwd;
// } else if (isRev && speedRev != null) {
// speed = speedRev;
// }
// speed = isFwd ? speedFwd : speedRev;
// this.wmeSdk.Map.addFeatureToLayer({
// layerName: this.layerName,
// feature: {
// type: 'Feature',
// id: `speed-${segment.id}`,
// geometry: {
// type: 'Point',
// coordinates: [midpoint[0], midpoint[1]]
// },
// properties: {
// speed,
// },
// style: {
// icon: {
// type: 'image',
// url: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speed, isTwoWay)),
// size: {
// width: 30,
// height: 30
// },
// anchor: {
// x: 15,
// y: 15
// },
// opacity: opacity ?? this.calculateOpacityBasedOnSpeed(speed)
// }
// }
// }
// });
// // let centerFeature = new OpenLayers.Feature.Vector(midpoint, {speed});
// // centerFeature.style = {
// // graphic: true,
// // externalGraphic: 'data:image/svg+xml;base64,' + btoa(this.getSpeedIcon(speed)),
// // graphicHeight: 30,
// // graphicWidth: 30,
// // graphicYOffset: -15,
// // graphicXOffset: -15,
// // graphicOpacity: opacity ?? this.calculateOpacityBasedOnSpeed(speed)
// // };
// // this.layer.addFeatures([centerFeature]);
// }
// });
// this.logDebug('Update finished.');
// resolve();
// } catch (error) {
// this.logDebug(error, false, 'error');
// reject(error);
// }
// });
// }
// TODO: Remove this when SDK migration is complete
/**
* Toggle visibility of the display of the speed layer.
* @param {Boolean} enabled
*/
toggleLayerVisibility(enabled) {
if (this.layer) {
this.layer.setVisibility(enabled);
this.logDebug(`Speed layer ${enabled ? 'enabled' : 'disabled'}.`);
}
}
// TODO: SDK migration
/**
* Toggle visibility of the display of the speed layer.
*/
// toggleLayerVisibility() {
// if (this.layer) {
// let enabled = this.settings.spdEnabled;
// this.wmeSdk.Map.setLayerVisibility({layerName: this.layerName, visibility: this.settings.spdEnabled});
// this.logDebug(`Speed layer ${enabled ? 'enabled' : 'disabled'}.`);
// }
// }
/**
* Saves the current settings to localStorage.
*/
saveSettings() {
return new Promise((resolve, reject) => {
try {
let selectedTheme = this.getSelectedTheme();
// TODO: Remove this when SDK migration is complete
this.settings.spdEnabled = this.layerCheckbox.speedDisplay.checked;
// TODO: SDK migration
// this.settings.spdEnabled = this.layerSwitcherElement.checked;
['general', 'filter', 'roads'].forEach(group => this.updateSettingsGroup(group));
this.settings.theme = selectedTheme?.id ? this.convertStringCaseStyle('kebab', 'camel', selectedTheme.id.replace('spd-theme-', '')) : 'default';
localStorage.setItem('wmeSpeedDisplaySettings', JSON.stringify(this.settings));
resolve();
this.channel.postMessage('saved');
} catch (error) {
this.logDebug(error, false, 'error');
reject(error);
}
});
}
/**
* Loads the settings from localStorage or uses the provided settings to initialize the configuration.
* @param {Object} [savedSettings] - The saved settings object to load; if not provided, it will load from localStorage.
*/
loadSettings(savedSettings) {
savedSettings = savedSettings ?? JSON.parse(localStorage.getItem('wmeSpeedDisplaySettings'));
if (!savedSettings)
return;
// To ensure that if it enters a new settings, it doesn't discard them when loading the old settings
Object.entries(savedSettings).forEach(([setting, value]) => {
if (typeof value == 'object' && value != null) {
if (!this.settings[setting])
this.settings[setting] = {};
Object.entries(value).forEach(([subSetting, subValue]) => {
this.settings[setting][subSetting] = subValue ?? true;
});
} else {
// If the saved theme no longer exists, select the default
if (setting == 'theme' && !this.theme.includes(value))
value = 'default';
this.settings[setting] = value ?? true;
}
});
}
/**
* Resets the speed display settings to default.
*/
async resetSettings() {
localStorage.removeItem('wmeSpeedDisplaySettings');
this.zIndex.warnDisplayed = false;
this.defineSettings();
this.updateSettingsElementsStates();
this.resetZindex();
this.displayZIndexWarning();
await this.debounce.saveSettings();
this.preUpdateMapDisplay();
}
/**
* Updates the specified settings group by retrieving values from the corresponding HTML elements.
* @param {string} group - The settings group to update (e.g., 'general', 'filter', 'roads').
*/
updateSettingsGroup(group) {
Object.entries(this.settings[group]).forEach(([setting, _]) => {
let id = this.convertStringCaseStyle('camel', 'kebab', setting);
let element = document.getElementById(id);
if (!element) {
this.logDebug(`Setting field not found: ${id}`, false, 'warn');
return;
}
let value;
if (['range', 'number'].includes(element.type)) {
value = element.value != null ? parseFloat(element.value) : element.value;
} else if (element.getAttribute('type') == 'checkable-chip') {
value = element.querySelector('wz-checkable-chip[checked]')?.getAttribute('value') ?? 'show';
} 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 id="spd-tab-pane" class="segment sidebar-column" style="margin: -15px;">
<wz-section-header headline="${this.getTranslation('name')}" size="section-header2" back-button="false">
<svg slot="icon" xmlns="http://www.w3.org/2000/svg" width="22px" height="22px" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 1.08 1.08" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xodm="http://www.corel.com/coreldraw/odm/2003">
<path fill="var(--leading_icon, #90959c)" d="M0.54 0c0.3,0 0.54,0.24 0.54,0.54 0,0.3 -0.24,0.54 -0.54,0.54 -0.3,0 -0.54,-0.24 -0.54,-0.54 0,-0.3 0.24,-0.54 0.54,-0.54zm-0.18 0.74c0.09,0 0.13,-0.05 0.13,-0.14 0,-0.08 -0.04,-0.13 -0.12,-0.13 -0.01,0 -0.03,0 -0.05,0.01l0.01 -0.06 0.14 0 0 -0.07 -0.2 0 -0.02 0.19 0.07 0.03c0.01,-0.02 0.02,-0.03 0.05,-0.03 0.03,0 0.06,0.02 0.06,0.06 0,0.05 -0.03,0.07 -0.07,0.07 -0.02,0 -0.05,-0.01 -0.08,-0.03l-0.03 0.07c0.03,0.02 0.07,0.03 0.11,0.03zm0.33 -0.33c0.06,0 0.08,0.04 0.08,0.13 0,0.09 -0.03,0.13 -0.08,0.13 -0.05,0 -0.07,-0.04 -0.07,-0.13 0,-0.09 0.02,-0.13 0.07,-0.13zm0 0.33c0.1,0 0.14,-0.07 0.14,-0.2 0,-0.13 -0.04,-0.2 -0.14,-0.2 -0.09,0 -0.14,0.07 -0.14,0.2 0,0.13 0.05,0.2 0.14,0.2zm-0.15 -0.64c0.24,0 0.44,0.2 0.44,0.44 0,0.24 -0.2,0.44 -0.44,0.44 -0.24,0 -0.44,-0.2 -0.44,-0.44 0,-0.24 0.2,-0.44 0.44,-0.44z"/>
</svg>
</wz-section-header>
<div class="segment-edit-section">
<wz-alerts-group multiline="true" id="spd-alert-group" class="alertsGroup--cx2Lh ${Object.values(this.settings.alertDismissed).every(value => value == true) ? 'd-none' : ''}" style="padding: 0; margin: 15px 15px 15px 15px;"></wz-alerts-group>
<wz-tabs>
<wz-tab is-active="true" label="${this.getTranslation('title.settings')}" tooltip="${this.getTranslation('title.settings')}">
<div style="display: flex; flex-direction: column; gap: 15px;">
<div>
<wz-label html-for="">${this.getTranslation('label.displaySpeeds')}</wz-label>
<wz-toggle-switch name="spd-display-speeds" checked="${this.settings.spdEnabled}" id="spd-display-speeds" tabindex="0" value="true" disabled="${!this.layerCheckbox.roadGroup.checked}">
<input type="checkbox" name="spd-display-speeds" value="true" style="display: none; visibility: hidden;">
</wz-toggle-switch>
</div>
<div>
<wz-label html-for="">
<div>
${this.getTranslation('label.noSpeed')}
<wz-basic-tooltip class="tooltip-component icon-tooltip sc-wz-basic-tooltip-h sc-wz-basic-tooltip-s">
<wz-tooltip class="sc-wz-basic-tooltip sc-wz-basic-tooltip-s">
<wz-tooltip-source class="sc-wz-tooltip-source-h sc-wz-tooltip-source-s">
<wz-tooltip-target class="sc-wz-tooltip-target-h sc-wz-tooltip-target-s">
<i class="w-icon w-icon-info"></i>
</wz-tooltip-target>
<!-- TODO: Find out why it are getting an error when generating the tooltip -->
<wz-tooltip-content>${this.getTranslation('tooltip.showNoSpeed')}</wz-tooltip-content>
</wz-tooltip-source>
</wz-tooltip>
</wz-basic-tooltip>
</div>
</wz-label>
<wz-chip-select id="spd-show-no-speed" type="checkable-chip">
<wz-checkable-chip ${this.settings.general.spdShowNoSpeed == 'ignore' ? 'read-only="" checked=""' : ''} value="ignore" show-check-icon-when-checked="false" class="spd-chip" style="margin-bottom: 0px">${this.getTranslation('label.ignore')}</wz-checkable-chip>
<wz-checkable-chip ${this.settings.general.spdShowNoSpeed == 'show' ? 'read-only="" checked=""' : ''} value="show" show-check-icon-when-checked="false" class="spd-chip" style="margin-bottom: 0px">${this.getTranslation('label.show')}</wz-checkable-chip>
<wz-checkable-chip ${this.settings.general.spdShowNoSpeed == 'focus' ? 'read-only="" checked=""' : ''} value="focus" show-check-icon-when-checked="false" class="spd-chip" style="margin-bottom: 0px">${this.getTranslation('label.focus')}</wz-checkable-chip>
</wz-chip-select>
</div>
<div>
<wz-label html-for="">
<div>
${this.getTranslation('label.unpaved')}
<wz-basic-tooltip class="tooltip-component icon-tooltip sc-wz-basic-tooltip-h sc-wz-basic-tooltip-s">
<wz-tooltip class="sc-wz-basic-tooltip sc-wz-basic-tooltip-s">
<wz-tooltip-source class="sc-wz-tooltip-source-h sc-wz-tooltip-source-s">
<wz-tooltip-target class="sc-wz-tooltip-target-h sc-wz-tooltip-target-s">
<i class="w-icon w-icon-info"></i>
</wz-tooltip-target>
<!-- TODO: Find out why it are getting an error when generating the tooltip -->
<wz-tooltip-content>${this.getTranslation('tooltip.showOnUnpaved')}</wz-tooltip-content>
</wz-tooltip-source>
</wz-tooltip>
</wz-basic-tooltip>
</div>
</wz-label>
<wz-chip-select id="spd-show-unpaved" type="checkable-chip">
<wz-checkable-chip ${this.settings.general.spdShowUnpaved == 'ignore' ? 'read-only="" checked=""' : ''} value="ignore" show-check-icon-when-checked="false" class="spd-chip" style="margin-bottom: 0px">${this.getTranslation('label.ignore')}</wz-checkable-chip>
<wz-checkable-chip ${this.settings.general.spdShowUnpaved == 'show' ? 'read-only="" checked=""' : ''} value="show" show-check-icon-when-checked="false" class="spd-chip" style="margin-bottom: 0px">${this.getTranslation('label.show')}</wz-checkable-chip>
<wz-checkable-chip ${this.settings.general.spdShowUnpaved == 'focus' ? 'read-only="" checked=""' : ''} value="focus" show-check-icon-when-checked="false" class="spd-chip" style="margin-bottom: 0px">${this.getTranslation('label.focus')}</wz-checkable-chip>
</wz-chip-select>
</div>
<div>
<wz-label html-for="">${this.getTranslation('label.showOnRoundabout')}</wz-label>
<wz-toggle-switch name="spd-show-roundabout" checked="${this.settings.general.spdShowRoundabout}" id="spd-show-roundabout" tabindex="0" value="true">
<input type="checkbox" name="spd-show-roundabout" value="true" style="display: none; visibility: hidden;">
</wz-toggle-switch>
</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">Atualizar menu</wz-button>
<wz-button color="secondary" id="btn-spd-test">Testar alguma coisa</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;
if (element.type == 'number') {
element.value = (value == null || value == 0) ? '' : value;
} else if (element.type == 'range') {
element.value = value;
document.getElementById(`${id}-value`).innerText = value;
} else if (element.getAttribute('type') == 'checkable-chip') {
element.querySelectorAll('wz-checkable-chip').forEach(chip => {
if (chip.getAttribute('value') == value) {
chip.setAttribute('checked', '');
chip.setAttribute('read-only', '');
} else {
chip.removeAttribute('checked');
chip.removeAttribute('read-only');
}
});
} else {
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)}`));
this.filterCounter = null;
this.updateFilterCounter();
}
/**
* Adds a global keyboard shortcut listener and add the script shortcut on shortcuts dialog.
*/
addShortcut() {
this.wmeSdk.Shortcuts.createShortcut({
callback: this.shortcutCallback.bind(this),
description: this.getTranslation('label.toggleLayerShortcut'),
shortcutId: 'ks-wme-speed-display',
shortcutKeys: 'AS+s',
});
}
/**
* Toggles the layer switcher speed display when shortcut is pressed.
*/
shortcutCallback() {
// TODO: Remove this when SDK migration is complete
this.layerCheckbox.speedDisplay.click();
this.displaySpeedsSwitch.checked = this.layerCheckbox.speedDisplay.checked;
// TODO: Remove this when SDK migration is complete - end
// TODO: SDK migration
// this.layerSwitcherElement.click();
// this.displaySpeedsSwitch.checked = this.layerSwitcherElement.checked;
// TODO: SDK migration - end
}
// TODO: Remove this when SDK migration is complete
/**
* Calculates the real midpoint of a segment, considering curves.
* @param {OpenLayers.Geometry.LineString} geometry Segment geometry.
*
* @returns {OpenLayers.Geometry.Point} Real midpoint.
*/
calculateMidpoint(geometry) {
let length = geometry.getLength();
let cumulativeLength = 0;
for (let i = 0; i < geometry.components.length - 1; i++) {
let start = geometry.components[i];
let end = geometry.components[i + 1];
let segmentLength = start.distanceTo(end);
if (cumulativeLength + segmentLength >= length / 2) {
let ratio = (length / 2 - cumulativeLength) / segmentLength;
return new OpenLayers.Geometry.Point(
start.x + ratio * (end.x - start.x),
start.y + ratio * (end.y - start.y)
);
}
cumulativeLength += segmentLength;
}
return geometry.getCentroid();
}
// TODO: SDK migration
/**
* Calculates the real midpoint of a segment, considering curves.
* @param {Array} coordinates - Array of [longitude, latitude] pairs representing the segment geometry.
*
* @returns {Array} The midpoint as an array [longitude, latitude].
*/
// calculateMidpoint(coordinates) {
// let totalLength = this.getLength(coordinates);
// let cumulativeLength = 0;
// for (let i = 0; i < coordinates.length - 1; i++) {
// let start = coordinates[i];
// let end = coordinates[i + 1];
// let segmentLength = this.getDistance(start, end);
// if (cumulativeLength + segmentLength >= totalLength / 2) {
// let ratio = (totalLength / 2 - cumulativeLength) / segmentLength;
// return [
// start[0] + ratio * (end[0] - start[0]),
// start[1] + ratio * (end[1] - start[1])
// ];
// }
// cumulativeLength += segmentLength;
// }
// // If something goes wrong, return a simple midpoint as a fallback
// let firstPoint = coordinates[0];
// let lastPoint = coordinates[coordinates.length - 1];
// return [
// (firstPoint[0] + lastPoint[0]) / 2,
// (firstPoint[1] + lastPoint[1]) / 2
// ];
// }
/**
* Generates an SVG icon with the speeds.
* @param {String} speed The speed.
* @param {Boolean} [sameSpeedBothWays] It is the segment two ways with same speed? (default: false)
* @param {String} [theme] Force a theme. (default: this.settings.theme)
*
* @returns {String} SVG in string format.
*/
getSpeedIcon(speed, sameSpeedBothWays = false, theme) {
let icon;
theme = theme ?? this.settings.theme;
switch (theme) {
case 'altViennaConv':
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="#FBE353" stroke="#FF5251" stroke-width="5"/>
<text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
</svg>`;
break;
case 'japan':
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="white" stroke="#FF5251" stroke-width="5"/>
<text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#0074E3" text-anchor="middle">${speed}</text>
</svg>`;
break;
case 'northAmerica':
icon = `
<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<rect x="2.5" y="2.5" width="45" height="45" fill="white" stroke="#1F2125" stroke-width="3" rx="5"/>
<text x="25" y="12" font-size="9" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">SPEED</text>
<text x="25" y="22" font-size="9" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">LIMIT</text>
<text x="25" y="42" font-size="22" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
</svg>`;
break;
case 'sacu':
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="#235AA9" stroke="#FF5251" stroke-width="5"/>
<text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="white" text-anchor="middle">${speed}</text>
</svg>`;
break;
case 'uk':
if (sameSpeedBothWays && [60, 70].includes(speed)) {
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="white" stroke="#1F2125" stroke-width="2"/>
<line x1="10" y1="40" x2="40" y2="10" stroke="#1F2125" stroke-width="9"/>
</svg>`;
} else {
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="white" stroke="#FF5251" stroke-width="5"/>
<text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
</svg>`;
}
break;
default:
icon = `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 50 50">
<circle cx="25" cy="25" r="21" fill="white" stroke="#FF5251" stroke-width="5"/>
<text x="25" y="31" font-size="20" font-family="Arial" font-weight="bold" fill="#1F2125" text-anchor="middle">${speed}</text>
</svg>`;
}
return icon;
}
/**
* Calculates the opacity of a speed icon based on speed filter settings.
* @param {number} speed - The speed value to evaluate.
*
* @returns {number} Opacity value (1 for visible, this.settings.general.spdFilterOpcaity for dimmed) depending on whether the speed falls within the defined min and max speed range.
*/
calculateOpacityBasedOnSpeed(speed) {
let minSpeed = parseInt(this.settings.filter.spdMinSpeed, 10);
let maxSpeed = parseInt(this.settings.filter.spdMaxSpeed, 10);
let validMin = isNaN(minSpeed) || minSpeed <= 0 || speed >= minSpeed;
let validMax = isNaN(maxSpeed) || maxSpeed <= 0 || speed <= maxSpeed;
let opacity = this.getSettingOpacity();
return validMin && validMax ? 1 : opacity;
}
/**
* Get the opacity value defined in the settings.
* @returns {number} Opacity value.
*/
getSettingOpacity() {
return this.settings.general.spdFilterOpacity < 0.1 ? 0.01 : this.settings.general.spdFilterOpacity;
}
// TODO: Remove this when SDK migration is complete
/**
* Calculates the angle at the midpoint of a geometry based on its components.
* @param {Object} geometry - The geometry with points.
*
* @returns {number} The angle in radians at the midpoint.
*/
calculateAngleAtMidpoint(geometry) {
let totalLength = geometry.getLength();
let cumulativeLength = 0;
for (let i = 0; i < geometry.components.length - 1; i++) {
let start = geometry.components[i];
let end = geometry.components[i + 1];
if (!start || !end) continue;
let segmentLength = start.distanceTo(end);
if (cumulativeLength + segmentLength >= totalLength / 2)
return Math.atan2(end.y - start.y, end.x - start.x);
cumulativeLength += segmentLength;
}
if (geometry.components.length >= 2) {
let firstPoint = geometry.components[0];
let lastPoint = geometry.components[geometry.components.length - 1];
return Math.atan2(lastPoint.y - firstPoint.y, lastPoint.x - firstPoint.x);
}
this.logDebug(this.spdTranslations.log.insufficientGeometryAngleCalc, false, 'error');
return 0;
}
// TODO: SDK migration
/**
* Calculates the angle at the midpoint of a geometry based on its components.
* @param {Array} coordinates - The geometry coordinates.
*
* @returns {Number} The angle in radians at the midpoint.
*/
// calculateAngleAtMidpoint(coordinates) {
// let totalLength = this.getLength(coordinates);
// let cumulativeLength = 0;
// for (let i = 0; i < coordinates.length - 1; i++) {
// let start = coordinates[i];
// let end = coordinates[i + 1];
// if (!start || !end) continue;
// let segmentLength = this.getDistance(start, end);
// if (cumulativeLength + segmentLength >= totalLength / 2)
// return Math.atan2(end.y - start.y, end.x - start.x);
// cumulativeLength += segmentLength;
// }
// if (coordinates.length >= 2) {
// let firstPoint = coordinates[0];
// let lastPoint = coordinates[coordinates.length - 1];
// return Math.atan2(lastPoint.y - firstPoint.y, lastPoint.x - firstPoint.x);
// }
// this.logDebug('Insufficient geometry for angle calculation.', false, 'error');
// return 0;
// }
/**
* Calculates the distance in meters between two geographic coordinates using the Haversine formula.
* @param {Array} startPoint - The starting point [longitude, latitude].
* @param {Array} endPoint - The ending point [longitude, latitude].
*
* @returns {Number} The distance in meters between the two points.
*/
getDistance(startPoint, endPoint) {
let earthRadius = 6371000;
let latitude1 = this.toRadians(startPoint[1]);
let latitude2 = this.toRadians(endPoint[1]);
let deltaLatitude = this.toRadians(endPoint[1] - startPoint[1]);
let deltaLongitude = this.toRadians(endPoint[0] - startPoint[0]);
let haversineFormula = Math.sin(deltaLatitude / 2) * Math.sin(deltaLatitude / 2) + Math.cos(latitude1) * Math.cos(latitude2) * Math.sin(deltaLongitude / 2) * Math.sin(deltaLongitude / 2);
let centralAngle = 2 * Math.atan2(Math.sqrt(haversineFormula), Math.sqrt(1 - haversineFormula));
return earthRadius * centralAngle;
}
/**
* Converts an angle from degrees to radians.
* @param {Number} angle - The angle in degrees.
*
* @returns {Number} The angle in radians.
*/
toRadians(angle) {
return angle * (Math.PI / 180);
}
/**
* Returns two perpendicular points (left and right) from a midpoint at a given angle and distance, adjusted by map zoom.
* @param {Object} midpoint - Central point with `x` and `y` coordinates.
* @param {Number} angle - Angle in radians from the reference direction.
* @param {Number} baseDistance - Base distance from the midpoint before zoom adjustment.
*
* @returns {Object} {leftPoint, rightPoint} - Perpendicular points to the left and right.
*/
getPerpendicularPoints(midpoint, angle, baseDistance) {
let currentZoom = this.wmeSdk.Map.getZoomLevel();
let referenceZoom = 19;
let scaleFactor = Math.pow(2, referenceZoom - currentZoom);
let adjustedDistance = baseDistance * scaleFactor;
let angleLeft = angle + Math.PI / 2;
let angleRight = angle - Math.PI / 2;
// TODO: Remove this when SDK migration is complete
let leftPoint = new OpenLayers.Geometry.Point(
midpoint.x + adjustedDistance * Math.cos(angleLeft),
midpoint.y + adjustedDistance * Math.sin(angleLeft)
);
let rightPoint = new OpenLayers.Geometry.Point(
midpoint.x + adjustedDistance * Math.cos(angleRight),
midpoint.y + adjustedDistance * Math.sin(angleRight)
);
// TODO: Remove this when SDK migration is complete - end
// TODO: SDK migration
// let leftPoint = [
// midpoint.x + adjustedDistance * Math.cos(angleLeft),
// midpoint.y + adjustedDistance * Math.sin(angleLeft)
// ];
// let rightPoint = [
// midpoint.x + adjustedDistance * Math.cos(angleRight),
// midpoint.y + adjustedDistance * Math.sin(angleRight)
// ];
// TODO: SDK migration -end
return {
leftPoint,
rightPoint
};
}
/**
* Returns speed in mph/kmh or 'N/A'.
* @param {Number} speed The speed value in kilometers per hour (km/h) to be formatted.
*
* @returns {(Number|String)} The speed.
*/
getSpeed(speed) {
if (!speed)
return 'N/A';
return this.wmeSdk.Settings.getUserSettings().isImperial ? Math.round(speed * 0.621371) : speed;
}
/**
* Returns length in feet (rounded) if imperial units are preferred; otherwise, returns meters.
* @param {Array} coordinates - The length value in meters to be converted.
* @param {Boolean} [forceMeters] - If needs to force results in meters.
*
* @returns {Number} The converted length in feet or the original length in meters.
*/
getLength(coordinates, forceMeters = false) {
let totalDistance = 0;
// Iterate over the coordinates and add the distance between consecutive points
for (let i = 0; i < coordinates.length - 1; i++) {
let pointA = {
lat: coordinates[i][1],
lng: coordinates[i][0]
};
let pointB = {
lat: coordinates[i + 1][1],
lng: coordinates[i + 1][0]
};
totalDistance += this.calculateDistance(pointA, pointB);
}
return this.wmeSdk.Settings.getUserSettings().isImperial && !forceMeters ? Math.round(totalDistance * 3.28084) : totalDistance;
}
/**
* Calculates the distance between two points using the Haversine formula.
* @param {Array} pointA The first point, containing latitude (lat) and longitude (lng).
* @param {Array} pointB The second point, containing latitude (lat) and longitude (lng).
* @returns
*/
calculateDistance(pointA, pointB) {
let earthRadius = 6371e3;
let latitudeA = pointA.lat * Math.PI / 180;
let latitudeB = pointB.lat * Math.PI / 180;
// Calculate the differences in coordinates
let deltaLatitude = (pointB.lat - pointA.lat) * Math.PI / 180;
let deltaLongitude = (pointB.lng - pointA.lng) * Math.PI / 180;
// Haversine formula
let haversineComponent = Math.sin(deltaLatitude / 2) * Math.sin(deltaLatitude / 2) + Math.cos(latitudeA) * Math.cos(latitudeB) * Math.sin(deltaLongitude / 2) * Math.sin(deltaLongitude / 2);
let angularDistance = 2 * Math.atan2(Math.sqrt(haversineComponent), Math.sqrt(1 - haversineComponent));
// Calculate the distance in meters
let distance = earthRadius * angularDistance;
return distance;
}
/**
* Makes a "dramatic" pause in the code.
* @param {Number} ms Pause time in milliseconds.
*/
async sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
/**
* Returns a function with delay.
* @param {Object} func Function that will be called with delay.
* @param {Number} [timeout] Delay time in milliseconds. (default: 300)
*
* @returns {Function} Function
*/
debounce(func, timeout = 300) {
let promise = null;
let timer;
return (...args) => {
clearTimeout(timer);
return new Promise((resolve, reject) => {
timer = setTimeout(async () => {
try {
promise = func.apply(this, args);
let result = await promise;
resolve(result);
} catch (error) {
reject(error);
}
}, timeout);
});
};
}
/**
* Converts a string from one case style to another (camel, snake, kebab).
* @param {String} fromType - The original string case ('camel', 'snake', or 'kebab').
* @param {String} toType - The target string case ('camel', 'snake', or 'kebab').
* @param {String} string - The string to be converted.
*
* @returns {String} The converted string.
*/
convertStringCaseStyle(fromType, toType, string) {
if (fromType == toType)
return string;
let conversionMap = {
camel: {
kebab: str => str.match(/[A-Z]?[a-z]+|[0-9]+/g).join('-').toLowerCase(),
snake: str => str.match(/[A-Z]?[a-z]+|[0-9]+/g).join('_').toLowerCase()
},
snake: {
kebab: str => str.replace(/_/g, '-'),
camel: str => str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())
},
kebab: {
camel: str => str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()),
snake: str => str.replace(/-/g, '_')
}
};
return conversionMap[fromType]?.[toType]?.(string) || string;
}
/**
* Retrieves the road setting name by its ID from the segments categories.
* @param {String} id - The ID of the road setting.
*
* @returns {(String|null)} The name of the road setting if found, otherwise null.
*/
getRoadSettingNameById(id) {
for (let category of Object.values(this.segmentsCategories)) {
let segment = category.find(item => item.id == id);
if (segment)
return segment.name;
}
// Returns null if ID is not found
return null;
}
/**
* Logs a debug message to the console if debug mode is enabled or forceMessage is true.
* @param {String} message - The message to log.
* @param {boolean} [forceMessage] - Whether to log the message regardless of the debug mode setting.
* @param {String} [type] - The type of message ('warn', or 'error'). Default is 'log'.
*/
logDebug(message, forceMessage = false, type) {
if (this.debugMode || forceMessage)
(console[type] || console.log)(`[WME Speed Display v${this.version}]: ${message}`);
}
// TODO: Remove this when SDK migration is complete
/**
* Adds a checkbox to the layer switcher to toggle the speed display layer visibility.
*/
addLayerCheckbox() {
let houseNumbersCheckbox = document.getElementById('layer-switcher-item_house_numbers');
this.layerCheckbox.roadGroup = document.getElementById('layer-switcher-group_road');
if (!houseNumbersCheckbox && this.tries.houseNumberCheckbox < this.tries.max) {
this.logDebug('House numbers checkbox not found. Trying again...', false, 'warn');
this.tries.houseNumberCheckbox++;
setTimeout(() => this.addLayerCheckbox(), 1000);
return;
} else if (this.tries.houseNumberCheckbox == this.tries.max) {
this.logDebug('House numbers checkbox not found and maximum attempts reached.', false, 'error');
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: 'show',
spdShowRoundabout: true,
spdShowUnpaved: 'show',
spdMaxZoom: 18,
spdLayerZindex: this.zIndex.min,
spdFilterOpacity: 0.2
},
roads: {},
filter: {
spdHideSegmentSmallerThan: 0,
spdMinSpeed: 0,
spdMaxSpeed: 0
}
};
Object.values(this.segmentsCategories).forEach(category => {
Object.values(category).forEach(roadType => {
let settingId = this.convertStringCaseStyle('snake', 'camel', `spd_show_speed_in_${roadType.name}`);
this.settings.roads[settingId] = true;
});
});
if (localSettings)
this.loadSettings(localSettings);
}
/**
* Checks if the plugin version changed and displays the changelog if necessary.
*/
checkVersionAndShowChangelog() {
this.logDebug('Checking plugin version.');
let localSpdVersion = JSON.parse(localStorage.getItem('wmeSpeedDisplayVersion'));
if (localSpdVersion == null || localSpdVersion != this.version) {
if (this.needResetSettings && !this.debugMode)
this.resetSettings();
this.hideSpeedDisplayDialog();
this.openChangelogDialog();
localStorage.setItem('wmeSpeedDisplayVersion', JSON.stringify(this.version));
}
}
/**
* Opens changelog dialog.
*/
openChangelogDialog() {
this.showSpeedDisplayDialog(`${this.getTranslation('changelog')} ${this.getTranslation('name')} v${this.version}`, this.getTranslation('changelogMessage'), null, `<a href="https://greasyfork.org/scripts/526702-wme-speed-display" target="_blank"><wz-button color="primary">${this.getTranslation('viewScript')}</wz-button></a>`);
}
/**
* Displays a modal dialog with customizable title, body content, and button text.
* @param {String} title - The title of the modal (default: 'Without title').
* @param {String} body - The HTML content or string inside the modal (default: '<span>Without body message</span>').
* @param {String} [closeButtonText] - The text for the close button (default: 'Close').
* @param {String} [customHtmlButtons] - Custom HTML button(s).
*/
showSpeedDisplayDialog(title, body = '<span>Without body message</span>', closeButtonText, customHtmlButtons) {
title = title && typeof title == 'string' ? title : 'Without title';
closeButtonText = closeButtonText ?? this.getTranslation('close');
let wzDialogContainer = document.getElementById('wz-dialog-container');
let divDialog = document.createElement('div');
divDialog.id = 'spd-dialog-container';
Object.assign(divDialog.style, {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
position: 'absolute',
width: '100vw',
height: '100vh',
top: 0,
left: 0
});
let divDialogHtml = `
<div class="dark-overlay" style="background-color: var(--background_modal, rgba(32, 33, 36, 0.6)); width: 100vw; height: 100vh; position: absolute; top: 0px; left: 0px; z-index: 9999;"></div>
<div style="display: flex; flex-direction: column; background-color: var(--background_default, #ffffff); border-radius: var(--wz-dialog-border-radius, 10px); box-shadow: rgba(0, 0, 0, 0.26) 0px 4px 8px 3px; width: var(--wz-dialog-width, 720px); height: var(--wz-dialog-height); padding: var(--wz-dialog-padding, var(--space-l, 24px)); position: fixed; z-index: 99999;">
<h3 style="margin-bottom: 10px;">${title}</h3>
<div style="max-height: 70vh; overflow: auto;">
${body}
</div>
<div style="display: flex; justify-content: end; gap: 10px; margin-top: 10px;">
<wz-button color="secondary" id="btn-spd-hide-dialog">${closeButtonText}</wz-button>`;
if (customHtmlButtons)
divDialogHtml += `${customHtmlButtons}`;
divDialogHtml += `
</div>
</div>`;
divDialog.innerHTML = divDialogHtml;
wzDialogContainer.appendChild(divDialog);
this.attachDialogListeners();
}
/**
* Closes the dialog and removes associated event listeners.
*/
hideSpeedDisplayDialog() {
let spdDialog = document.getElementById('spd-dialog-container');
document.removeEventListener('keydown', this.simulateBtnHideDialogClick.bind(this));
spdDialog?.remove();
}
/**
* Simulates a click on the close dialog button.
* @param {Event} event
*/
simulateBtnHideDialogClick(event) {
if (event.key && !['Escape', 'Enter'].includes(event.key))
return;
document.getElementById('btn-spd-hide-dialog')?.click();
}
/**
* Adds an alert to the warning group.
*
* @param {String} id - The unique identifier for the alert.
* @param {(String|Element)} body - The content of the alert, either as a string or an HTML element.
* @param {String} [variant] - The alert variant ('info', 'warning', 'danger' and 'success'). (default: 'info')
* @param {Boolean} [truncable] - Whether the alert content should be truncated. (default: true)
*/
addAlert(id, body, variant = 'info', truncable = true) {
let warningGroup = document.getElementById('spd-alert-group');
let alertHtml = `
<wz-alert id="${id}" role="alert" level="page" variant="${variant}" multiline="true" class="sidebar-alert inconsistent-direction-alert">
<div class="alertContent--O8sZl">`;
if (truncable) {
alertHtml +=`
<wz-truncate is-expanded="false" limit="50">
<wz-body2>${body}</wz-body2>
<span slot="ellipsis">${this.wmeTranslations.common.show_more}</span>
</wz-truncate>`;
} else {
alertHtml +=`<wz-body2>${body}</wz-body2>`;
}
alertHtml += `
</div>
<wz-button size="sm" color="text" slot="dismiss" class="spd-btn-dismiss-alert">${this.wmeTranslations.zoom_in_message.ok}</wz-button>
</wz-alert>`;
warningGroup.classList.remove('d-none');
warningGroup.insertAdjacentHTML('beforeend', alertHtml);
document.querySelector(`#${id} .spd-btn-dismiss-alert`).addEventListener('click', this.onDismissAlert.bind(this), {once: true});
}
/**
* Adds an snackbar on message container.
* @param {String} id Snackbar ID
* @param {(String|Element)} body Snackbar message
* @param {String} [btnMsg] Snackbar button text (default: no button)
* @param {Boolean} [loadingSnackbar] Is loading snackbar? (default: false)
*/
addSnackbar(id, body, btnMsg, loadingSnackbar = false) {
let snackbarClass = loadingSnackbar ? 'spd-snackbar spd-snackbar-loading' : 'spd-snackbar';
if (id instanceof Event) {
id = 'snackbar-id-' + Math.floor(Math.random() * 100000);
btnMsg = `<wz-button color="text">${this.wmeTranslations.zoom_in_message.ok}</wz-button>`;
}
if (document.getElementById(id))
return;
let snackbarHtml = `
<div class="${snackbarClass}" id="${id}">
<span class="text-wrapper">
${body}
</span>`;
if (btnMsg)
snackbarHtml += btnMsg;
snackbarHtml += `
</div>`;
this.snackbarWrapper.insertAdjacentHTML('beforeend', snackbarHtml);
if (btnMsg)
document.querySelector(`.spd-snackbar#${id} wz-button`).addEventListener('click', this.removeSnackbar.bind(this), {once: true});
}
/**
* Remove current snackbar.
* @param {(Element|Event)} element - The element or event triggering the removal.
*/
removeSnackbar(element) {
if (element instanceof Event)
element = element.currentTarget;
element?.closest('.spd-snackbar')?.remove();
}
/**
* Remove all snackbars.
*/
removeAllSnackbars() {
let allSnackbars = document.querySelectorAll('.spd-snackbar');
allSnackbars.forEach(snackbar => snackbar.remove());
}
/**
* Create a custom manual snackbar.
*/
createSnackbarWrapper() {
let msgContainer = document.getElementById('map-message-container');
this.snackbarWrapper = document.querySelector('.spd-snackbar-wrapper');
if (!this.snackbarWrapper) {
this.snackbarWrapper = document.createElement('div');
this.snackbarWrapper.classList.add('spd-snackbar-wrapper');
msgContainer.appendChild(this.snackbarWrapper);
}
}
/**
* Adds script custom stylesheet.
*/
addStyle() {
let style = document.createElement('style');
style.innerHTML = `
/* General */
.d-none {
display: none;
}
.spd-info-message {
color: #777;
font-size: 11px;
line-height: 15px;
}
wz-card[id^="spd-theme-"] * {
pointer-events: none;
}
/* Snackbar */
#map-message-container {
display: flex;
flex-direction: column-reverse;
gap: 15px;
}
.spd-snackbar-wrapper {
display: flex;
flex-direction: column-reverse;
gap: 15px;
align-items: flex-start;
justify-content: flex-start;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
translate: 0 -15px;
z-index: 10001;
pointer-events: none;
}
.spd-snackbar {
display: flex;
align-items: center;
gap: 15px;
position: relative;
padding: var(--space-m, 16px) var(--space-always-m, 16px);
bottom: var(--wz-snackbar-bottom, initial);
left: 50%;
translate: -50%;
min-width: var(--wz-snackbar-min-width, 195px);
background-color: rgba(0, 0, 0, 0.8);
border: none;
border-radius: 6px;
box-shadow: 0 1px 2px 0 rgba(60, 64, 67, 0.3), 0 2px 6px 2px rgba(60, 64, 67, 0.15);
box-sizing: border-box;
color: var(--wz-snackbar-color, var(--always_white, #ffffff));
font-family: "Rubik", sans-serif;
font-size: 14px;
font-weight: 400;
justify-content: space-between;
pointer-events: all;
letter-spacing: 0.2px;
white-space: normal;
}
.spd-snackbar.spd-snackbar-loading {
justify-content: center;
background-color: transparent;
box-shadow: none;
min-width: auto;
}
.spd-snackbar-wrapper .text-wrapper {
display: flex;
align-items: center;
gap: 15px;
}
.spd-snackbar-wrapper i.w-icon {
font-size: 20px;
}
.spd-snackbar-wrapper wz-button {
pointer-events: all;
}
.loader {
width: 40px;
aspect-ratio: 1;
display: flex;
}
.loader::before,
.loader::after {
content: "";
flex: 1;
animation: l14 1.5s -.25s infinite linear alternate both;
}
.loader::after {
--s: -1, -1;
animation-delay: .5s;
}
@keyframes l14 {
0%,
30% {
transform: scale(var(--s, 1)) translate(0px) perspective(150px) rotateY(0deg);
clip-path: polygon(50% 0, 100% 0, 100% 100%, 50% 100%, 0 75%, 0 25%);
background: #FF5251;
border: 7px solid #FF5251;
border-right: none;
}
37.5% {
transform: scale(var(--s, 1)) translate(-10px) perspective(150px) rotateX(0deg);
clip-path: polygon(50% 0, 100% 0, 100% 100%, 50% 100%, 0 75%, 0 25%);
background: #FF5251;
border: 7px solid #FF5251;
border-right: none;
}
50% {
transform: scale(var(--s, 1)) translate(-10px) perspective(150px) rotateX(-90deg);
clip-path: polygon(50% 0, 100% 0, 100% 100%, 50% 100%, 0 75%, 0 25%);
background: #FF5251;
border: 7px solid #FF5251;
border-right: none;
border-radius: 0;
}
50.01% {
transform: scale(var(--s, 1)) translate(-10px) perspective(150px) rotateX(-90.1deg);
clip-path: polygon(0 0, 100% 0, 100% 100%, 50% 100%, 0 100%, 0 25%);
background: #fff;
border: 7px solid #FF5251;
border-right: none;
border-radius: 100px 0 0 100px;
}
62.5% {
transform: scale(var(--s, 1)) translate(-10px) perspective(150px) rotateX(-180deg);
clip-path: polygon(0 0, 100% 0, 100% 100%, 50% 100%, 0 100%, 0 25%);
background: #fff;
border: 7px solid #FF5251;
border-right: none;
border-radius: 100px 0 0 100px;
}
70%,
100% {
transform: scale(var(--s, 1)) translate(0px) perspective(150px) rotateX(-180deg);
clip-path: polygon(0 0, 100% 0, 100% 100%, 50% 100%, 0 100%, 0 25%);
background: #fff;
border: 7px solid #FF5251;
border-right: none;
border-radius: 100px 0 0 100px;
}
}`;
document.head.appendChild(style);
}
/**
* Get the layer switcher element.
*/
getLayerSwitcher() {
let userScriptLayerSwitchers = document.querySelectorAll('.layer-selector-sdk-checkbox');
if (userScriptLayerSwitchers.length < 1 && this.tries.userscripts < this.tries.max) {
this.logDebug('Userscripts layer switches not found. Trying again...', false, 'warn');
this.tries.userscripts++;
setTimeout(() => this.getLayerSwitcher(), 1000);
return;
} else if (this.tries.userscripts == this.tries.max) {
this.logDebug('Userscripts layer switches not found and maximum attempts reached.', false, 'error');
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);
}
/**
* Updates the filter counter element.
*/
updateFilterCounter() {
this.activedFilters = Object.values(this.settings.filter).filter(value => typeof value == 'number' && value > 0).length;
if (!this.filterCounter && this.activedFilters > 0) {
let tabsShadowRoot = document.querySelector('#spd-tab-pane wz-tabs').shadowRoot;
let filterTab = tabsShadowRoot.querySelectorAll('.wz-tab-label')[2];
if (!filterTab && this.tries.filterTab < this.tries.max) {
this.logDebug('Filter tab not found. Trying again...', false, 'warn');
this.tries.filterTab++;
setTimeout(() => this.updateFilterCounter(), 1000);
return;
} else if (this.tries.filterTab == this.tries.max) {
this.logDebug('Filter tab not found and maximum attempts reached.', false, 'error');
return;
}
let filterCounter = document.createElement('wz-notification-indicator');
filterCounter.setAttribute('style', 'position: absolute; right: 2%; top: 2%');
filterCounter.setAttribute('value', this.activedFilters);
filterTab.appendChild(filterCounter);
this.filterCounter = tabsShadowRoot.querySelector('wz-notification-indicator');
} else if (this.activedFilters > 0) {
this.filterCounter.setAttribute('value', this.activedFilters);
} else {
this.filterCounter?.remove();
this.filterCounter = null;
}
}
/**
* 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>Nuwe funksie vir segmente sonder spoed en nie-geteer! Nou kan jy ignoreer, wys of fokus op sulke segmente:<li>- As jy ignoreer, sal geen ikone gegenereer word nie;<br>- As jy wys, sal ikone normaal vertoon word;<br>- As jy fokus, sal slegs ikone wat aan die voorwaarde voldoen, vertoon word.<br></li></li><li>'n Telling van aktiewe filters is ook by die "filters"-oortjie gevoeg om te help om aktiewe filters vinnig te identifiseer.</li></ul><h6>Regstellings en verbeterings:</h6><ul style="margin-bottom: 10px"><li>Die ou "Vertoon spoed in rotonde"-blokkie is vervang deur 'n skakelaar;</li><li>Limiet van pogings by bestaande lusse gevoeg;</li><li>Klein fout met kontrole vir links-ryverkeer reggestel;</li><li>Ander klein regstellings en verbeterings.</li></ul><h6>Bekende probleme:</h6><ul><li>'n ".then"-fout verskyn wanneer die script begin na die WME-opdatering. Oorsaak is nog onbekend, maar die script werk steeds normaal;</li><li>Daar is foute met tooltips tydens inisialiseer. Weens die gebrek aan dokumentasie oor WME se raamwerk, gee die bygevoegde tooltips 'n fout. Tog werk die script normaal.</li></ul>`,
close: 'Sluit',
viewScript: 'Besoek Skrip',
viewChangelog: 'Besoek veranderingsregister',
reset: 'Herstel',
snackbar: {
errorFiltering: 'Fout met toepassing van filter. Minimum spoed kan nie groter as maksimum wees nie.',
},
title: {
settings: 'Instellings',
roadTypes: 'Padsoorte',
filter: 'Filtreer',
appearence: 'Vorm',
showOnRoadType: 'Wys op die volgende padsoorte:',
seeOnDiscuss: 'Kyk na die skrip se draad op die Discuss',
seeOnDiscord: 'Kyk na die skrip se kanaal op die Waze Script se Discord-bediener',
scriptDevBy: 'Bekyk my redakteur gebruikersprofiel',
},
label: {
displaySpeeds: 'Toon spoed',
noSpeed: 'Segment sonder spoed',
unpaved: 'Onverharde segment',
showOnRoundabout: 'Toon op rotondes',
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:',
ignore: 'Ignoreer',
show: 'Vertoon',
focus: 'Fokus',
},
tooltip: {
showNoSpeed: `<u>Ignoreer</u> - Geen ikoon weergee op segmente sonder spoed nie;<br><u>Vertoon</u> - Wys ikoon op segmente sonder spoed;<br><u>Fokus</u> - Fokus slegs op segmente sonder vasgestelde spoed.`,
showOnUnpaved: `<u>Ignoreer</u> - Geen ikoon weergee op ongeplaveide segmente nie;<br><u>Vertoon</u> - Wys ikoon op ongeplaveide segmente;<br><u>Fokus</u> - Fokus slegs op ongeplaveide segmente.`
},
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: {
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>- عند التجاهل، لن يتم توليد أيقونات لهذه القطاعات؛<br>- عند العرض، سيتم عرض الأيقونات بشكل طبيعي؛<br>- عند التركيز، سيتم عرض الأيقونات التي تطابق الشرط فقط.<br></li></li><li>تمت إضافة عداد للفلاتر النشطة في عنوان تبويب "الفلاتر" لتسهيل معرفة الفلاتر المفعلة.</li></ul><h6>التصحيحات والتحسينات:</h6><ul style="margin-bottom: 10px"><li>تم استبدال خانة التحديد القديمة "عرض السرعة في الدوارات" بزر تبديل؛</li><li>إضافة حد للمحاولات في الحلقات الموجودة في السكريبت؛</li><li>إصلاح خطأ صغير في التحقق من حركة المرور لليد اليسرى؛</li><li>إصلاحات وتحسينات صغيرة أخرى.</li></ul><h6>المشكلات المعروفة:</h6><ul><li>هناك خطأ ".then" عند بدء السكريبت ظهر بعد تحديث WME. السبب غير معروف حالياً لكن السكريبت يعمل بشكل طبيعي؛</li><li>هناك أخطاء في التولتيب عند بدء تشغيلها. بسبب نقص الوثائق لاستخدام عناصر الإطار الأصلي لـ WME، تتسبب التولتيبات المضافة بخطأ، ومع ذلك يعمل السكريبت بشكل طبيعي.</li></ul>`,
close: 'إغلاق',
viewScript: 'عرض السكربت',
viewChangelog: 'عرض سجل التغييرات',
reset: 'إعادة تعيين',
snackbar: {
errorFiltering: 'خطأ في تطبيق الفلتر. لا يمكن أن تكون السرعة الدنيا أكبر من القصوى.',
},
title: {
settings: 'الإعدادات',
roadTypes: 'أنواع الطرق',
filter: 'تصفية',
appearence: 'المظهر',
showOnRoadType: 'عرض على أنواع الطرق التالية:',
seeOnDiscuss: 'شاهد موضوع السكربت على Discuss',
seeOnDiscord: 'شاهد قناة السكربت على خادم Discord الخاص بـ Waze Script',
scriptDevBy: 'عرض ملف تعريف مستخدم المحرر الخاص بي',
},
label: {
displaySpeeds: 'عرض السرعات',
noSpeed: 'مقطع بدون سرعة',
unpaved: 'مقطع غير معبد',
showOnRoundabout: 'عرض على الدوار',
maxZoom: 'عرض حتى التكبير:',
toggleLayerShortcut: 'تبديل طبقة عرض السرعة',
zIndex: 'عمق الطبقة',
hideShorterSegments: 'إخفاء في القطاعات الأصغر من',
speedFilter: 'تصفية حسب السرعة',
min: 'أدنى:',
max: 'أقصى:',
opacity: 'مستوى تعتيم الفلتر:',
ignore: 'تجاهل',
show: 'عرض',
focus: 'تركيز',
},
tooltip: {
showNoSpeed: `<u>تجاهل</u> - لا يتم عرض الأيقونة على المقاطع بدون سرعة؛<br><u>عرض</u> - عرض الأيقونة على المقاطع بدون سرعة؛<br><u>تركيز</u> - التركيز فقط على المقاطع التي ليس لها سرعة محددة.`,
showOnUnpaved: `<u>تجاهل</u> - لا يتم عرض الأيقونة على المقاطع غير المعبدة؛<br><u>عرض</u> - عرض الأيقونة على المقاطع غير المعبدة؛<br><u>تركيز</u> - التركيز فقط على المقاطع غير المعبدة.`
},
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: {
resetSettings: 'إعادة تعيين الإعدادات',
seeOnDiscuss: 'انظر في المناقشة',
seeOnDiscord: 'انظر في الديسكورد',
scriptDevBy: 'البرنامج النصي تم تطويره بواسطة لوان تافاريس',
}
};
break;
case 'bg':
// Bulgarian
translations = {
name: 'Показване на скоростта',
zoomOut: 'Отдалечи',
zoomIn: 'Приближи',
changelog: 'Журнал с промени',
changelogMessage: `<h6>Какво е новото:</h6><ul style="margin-bottom: 10px"><li>Нова функция за сегменти без скорост и неасфалтирани! Вече можете да игнорирате, показвате или фокусирате върху такива сегменти:<li>- Ако игнорирате, няма да се генерират икони;<br>- Ако показвате, иконите ще се генерират нормално;<br>- Ако фокусирате, ще се показват само икони, които отговарят на условието.<br></li></li><li>Добавен е брояч за активни филтри в заглавието на таба „филтри“, за да се улесни разпознаването на активни филтри.</li></ul><h6>Поправки и подобрения:</h6><ul style="margin-bottom: 10px"><li>Старият чекбокс „Показвай скорост в кръгово“ е заменен с превключвател;</li><li>Добавен е лимит на опитите в съществуващите цикли в скрипта;</li><li>Поправена е малка грешка при проверка за ляво движение;</li><li>Други дребни поправки и подобрения.</li></ul><h6>Известни проблеми:</h6><ul><li>Появява се грешка „.then“ при стартиране на скрипта след обновяването на WME. Причината все още е неизвестна, но скриптът работи нормално;</li><li>Има грешки с tooltips при стартиране. Поради липса на документация за използването на нативни елементи на WME рамката, добавените tooltips генерират грешка. Въпреки това скриптът работи нормално.</li></ul>`,
close: 'Затвори',
viewScript: 'Преглед на скрипта',
viewChangelog: 'Преглед на журнала с промени',
reset: 'Нулиране',
snackbar: {
errorFiltering: 'Грешка при прилагане на филтъра. Минималната скорост не може да бъде по-голяма от максималната.',
},
title: {
settings: 'Настройки',
roadTypes: 'Типове пътища',
filter: 'Филтър',
appearence: 'Изглед',
showOnRoadType: 'Покажи на следните типове пътища:',
seeOnDiscuss: 'Вижте нишката на скрипта в Discuss',
seeOnDiscord: 'Вижте канала на скрипта в Discord сървъра на Waze Script',
scriptDevBy: 'Вижте потребителския профил на моя редактор',
},
label: {
displaySpeeds: 'Показване на скорости',
noSpeed: 'Сегмент без скорост',
unpaved: 'Неасфалтиран сегмент',
showOnRoundabout: 'Показване на кръгови кръстовища',
maxZoom: 'Изобразяване до ниво на мащаб:',
toggleLayerShortcut: 'Превключване на слоя за показване на скоростта',
zIndex: 'Дълбочина на слоя',
hideShorterSegments: 'Скриване на сегменти по-малки от',
speedFilter: 'Филтриране по скорост',
min: 'Мин.:',
max: 'Макс.:',
opacity: 'Ниво на непрозрачност на филтъра:',
ignore: 'Игнорирай',
show: 'Покажи',
focus: 'Фокусирай',
},
tooltip: {
showNoSpeed: `<u>Игнорирай</u> - Не се рендерира икона за сегменти без скорост;<br><u>Покажи</u> - Рендерира икона за сегменти без скорост;<br><u>Фокус</u> - Фокусира рендерирането само върху сегменти без зададена скорост.`,
showOnUnpaved: `<u>Игнорирай</u> - Не се рендерира икона за неасфалтирани сегменти;<br><u>Покажи</u> - Рендерира икона за неасфалтирани сегменти;<br><u>Фокус</u> - Фокусира рендерирането само върху неасфалтирани сегменти.`
},
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: {
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>Nova funció per a segments sense velocitat i no asfaltats! Ara pots ignorar, mostrar o centrar-te en aquests segments:<li>- Si ignores, no es generaran icones;<br>- Si mostres, es generaran icones amb normalitat;<br>- Si centres, només es mostraran icones que compleixin la condició.<br></li></li><li>S’ha afegit un comptador de filtres actius al títol de la pestanya "filtres" per facilitar la detecció de filtres actius.</li></ul><h6>Correccions i millores:</h6><ul style="margin-bottom: 10px"><li>L’antiga casella de selecció "Mostrar velocitat a rotonda" ha estat substituïda per un interruptor;</li><li>S’ha afegit un límit d’intents als bucles existents del script;</li><li>S’ha corregit un petit error de verificació per al trànsit per l’esquerra;</li><li>Altres correccions i millores menors.</li></ul><h6>Problemes coneguts:</h6><ul><li>Hi ha un error ".then" en iniciar el script que va sorgir després de l’actualització del WME. La causa encara és desconeguda però el script funciona normalment;</li><li>Hi ha errors als tooltips en iniciar-los. A causa de la falta de documentació per utilitzar elements nadius del framework del WME, els tooltips afegits generen un error. Tot i així, el script funciona amb normalitat.</li></ul>`,
close: 'Tancar',
viewScript: 'Veure el script',
viewChangelog: 'Veure el registre de canvis',
reset: 'Restablir',
snackbar: {
errorFiltering: 'Error en aplicar el filtre. La velocitat mínima no pot ser superior a la màxima.',
},
title: {
settings: 'Configuració',
roadTypes: 'Tipus de carreteres',
filter: 'Filtre',
appearence: 'Aparença',
showOnRoadType: 'Mostrar en els següents tipus de carreteres:',
seeOnDiscuss: 'Veure el fil del script a Discuss',
seeOnDiscord: 'Veure el canal del script al servidor de Discord de Waze Script',
scriptDevBy: 'Veure el meu perfil d\'usuari de l\'editor',
},
label: {
displaySpeeds: 'Mostrar velocitats',
noSpeed: 'Segment sense velocitat',
unpaved: 'Segment no pavimentat',
showOnRoundabout: 'Mostrar en rotondes',
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:',
ignore: 'Ignora',
show: 'Mostra',
focus: 'Enfoca',
},
tooltip: {
showNoSpeed: `<u>Ignora</u> - No renderitza icona als segments sense velocitat;<br><u>Mostra</u> - Renderitza icona als segments sense velocitat;<br><u>Enfoca</u> - Enfoca la renderització només en els segments sense velocitat definida.`,
showOnUnpaved: `<u>Ignora</u> - No renderitza icona als segments no pavimentats;<br><u>Mostra</u> - Renderitza icona als segments no pavimentats;<br><u>Enfoca</u> - Enfoca la renderització només en els segments no pavimentats.`
},
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: {
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>Co je nového:</h6><ul style="margin-bottom: 10px"><li>Nová funkce pro segmenty bez rychlosti a neasfaltované! Nyní můžete ignorovat, zobrazit nebo zaměřit se na takové segmenty:<li>- Pokud ignorujete, ikony nebudou generovány;<br>- Pokud zobrazíte, ikony se zobrazí normálně;<br>- Pokud se zaměříte, zobrazí se pouze ikony, které splňují podmínku.<br></li></li><li>Do názvu záložky „filtry“ byl přidán čítač aktivních filtrů pro snadnou identifikaci aktivních filtrů.</li></ul><h6>Opravy a vylepšení:</h6><ul style="margin-bottom: 10px"><li>Starý checkbox „Zobrazit rychlost na kruhovém objezdu“ byl nahrazen přepínačem;</li><li>Přidán limit pokusů u existujících smyček ve skriptu;</li><li>Opravená drobná chyba kontroly pro levostranný provoz;</li><li>Další drobné opravy a vylepšení.</li></ul><h6>Známé problémy:</h6><ul><li>Při spuštění skriptu se objeví chyba „.then“, která vznikla po aktualizaci WME. Příčina zatím není známa, ale skript funguje normálně;</li><li>Existují chyby u tooltipů při spuštění. Kvůli nedostatečné dokumentaci pro použití nativních prvků frameworku WME generují přidané tooltipy chybu. Přesto skript funguje normálně.</li></ul>`,
close: 'Zavřít',
viewScript: 'Zobrazit skript',
viewChangelog: 'Zobrazit seznam změn',
reset: 'Obnovit',
snackbar: {
errorFiltering: 'Chyba při aplikaci filtru. Minimální rychlost nemůže být větší než maximální.',
},
title: {
settings: 'Nastavení',
roadTypes: 'Typy silnic',
filter: 'Filtr',
appearence: 'Vzhled',
showOnRoadType: 'Zobrazit na následujících typech silnic:',
seeOnDiscuss: 'Podívejte se na vlákno skriptu na Discuss',
seeOnDiscord: 'Podívejte se na kanál skriptu na Discord serveru Waze Script',
scriptDevBy: 'Zobrazit můj uživatelský profil editoru',
},
label: {
displaySpeeds: 'Zobrazit rychlosti',
noSpeed: 'Segment bez rychlosti',
unpaved: 'Nezpevněný segment',
showOnRoundabout: 'Zobrazit na kruhovém objezdu',
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:',
ignore: 'Ignorovat',
show: 'Zobrazit',
focus: 'Zaměřit',
},
tooltip: {
showNoSpeed: `<u>Ignorovat</u> - Nerenderuje ikonu na úsecích bez rychlosti;<br><u>Zobrazit</u> - Renderuje ikonu na úsecích bez rychlosti;<br><u>Zaměřit</u> - Zaměří renderování ikon jen na úseky bez definované rychlosti.`,
showOnUnpaved: `<u>Ignorovat</u> - Nerenderuje ikonu na nezpevněných úsecích;<br><u>Zobrazit</u> - Renderuje ikonu na nezpevněných úsecích;<br><u>Zaměřit</u> - Zaměří renderování ikon jen na nezpevněné úseky.`
},
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: {
resetSettings: 'Obnovit nastavení',
seeOnDiscuss: 'Zobrazit v diskusi',
seeOnDiscord: 'Zobrazit na Discordu',
scriptDevBy: 'Skript vyvinutý Luanem Tavaresem',
}
};
break;
case 'da':
// Danish
translations = {
name: 'Hastighedsvisning',
zoomOut: 'Mere afstand',
zoomIn: 'Mere tæt på',
changelog: 'Ændringslog',
changelogMessage: `<h6>Nyheder:</h6><ul style="margin-bottom: 10px"><li>Ny funktion til segmenter uden hastighed og ikke-asfalterede! Nu kan du ignorere, vise eller fokusere på sådanne segmenter:<li>- Når du ignorerer, bliver ikoner ikke genereret;<br>- Når du viser, genereres ikoner normalt;<br>- Når du fokuserer, vises kun ikoner, der matcher betingelsen.<br></li></li><li>Der er også tilføjet en tæller for aktive filtre i titlen på fanen "filtre" for nemmere at identificere aktive filtre.</li></ul><h6>Rettelser og forbedringer:</h6><ul style="margin-bottom: 10px"><li>Den gamle afkrydsningsboks "Vis hastighed i rundkørsel" er blevet udskiftet med en kontakt;</li><li>Der er tilføjet et forsøgslimit i eksisterende loops i scriptet;</li><li>En lille kontrolfejl ved venstrekørsel er rettet;</li><li>Andre små rettelser og forbedringer.</li></ul><h6>Kendte problemer:</h6><ul><li>Der opstår en ".then"-fejl, når scriptet starter efter WME-opdateringen. Årsagen er stadig ukendt, men scriptet fungerer normalt;</li><li>Der er fejl i tooltips ved initialisering. På grund af manglende dokumentation til brug af WME's native framework-elementer genererer de tilføjede tooltips en fejl. Alligevel fungerer scriptet som normalt.</li></ul>`,
close: 'Luk',
viewScript: 'Se script',
viewChangelog: 'Se ændringslog',
reset: 'Nulstil',
snackbar: {
errorFiltering: 'Fejl ved anvendelse af filter. Minimumshastighed kan ikke være større end maksimum.',
},
title: {
settings: 'Indstillinger',
roadTypes: 'Straßentypen',
filter: 'Filter',
appearence: 'Erscheinungsbild',
showOnRoadType: 'An den folgenden Straßentypen anzeigen:',
seeOnDiscuss: 'Siehe den Thread des Skripts auf Discuss',
seeOnDiscord: 'Siehe den Kanal des Skripts auf dem Waze Script Discord-Server',
scriptDevBy: 'Se min redaktørbrugerprofil',
},
label: {
displaySpeeds: 'Vis hastigheder',
noSpeed: 'Segment uden hastighed',
unpaved: 'Ikke-befæstet segment',
showOnRoundabout: 'Vis på rundkørsler',
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:',
ignore: 'Ignorér',
show: 'Vis',
focus: 'Fokusér',
},
tooltip: {
showNoSpeed: `<u>Ignorer</u> - Viser ikke ikon på segmenter uden hastighed;<br><u>Vis</u> - Viser ikon på segmenter uden hastighed;<br><u>Fokusér</u> - Fokuserer kun på segmenter uden defineret hastighed.`,
showOnUnpaved: `<u>Ignorer</u> - Viser ikke ikon på ikke-belagte segmenter;<br><u>Vis</u> - Viser ikon på ikke-belagte segmenter;<br><u>Fokusér</u> - Fokuserer kun på ikke-belagte segmenter.`
},
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: {
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>Neuigkeiten:</h6><ul style="margin-bottom: 10px"><li>Neue Funktion für Segmente ohne Geschwindigkeit und unbefestigte Straßen! Jetzt können Sie solche Segmente ignorieren, anzeigen oder gezielt hervorheben:<li>- Beim Ignorieren werden keine Symbole angezeigt;<br>- Beim Anzeigen werden die Symbole wie gewohnt gerendert;<br>- Beim Fokussieren werden nur Symbole angezeigt, die der Bedingung entsprechen.<br></li></li><li>Ein Zähler für aktive Filter wurde im Titel des Tabs „Filter“ hinzugefügt, um aktive Filter leichter zu erkennen.</li></ul><h6>Fehlerbehebungen und Verbesserungen:</h6><ul style="margin-bottom: 10px"><li>Die alte Checkbox „Geschwindigkeit im Kreisverkehr anzeigen“ wurde durch einen Schalter ersetzt.</li><li>Eine Begrenzung der Versuche in bestehenden Schleifen des Skripts wurde hinzugefügt.</li><li>Ein kleiner Prüfungsfehler bei Linksverkehr wurde behoben.</li><li>Weitere kleine Korrekturen und Verbesserungen.</li></ul><h6>Bekannte Probleme:</h6><ul><li>Nach dem WME-Update tritt beim Start des Skripts ein „.then“-Fehler auf. Die Ursache ist noch unbekannt, das Skript funktioniert jedoch normal.</li><li>Beim Laden der Tooltips treten Fehler auf. Aufgrund fehlender Dokumentation zur Verwendung von nativen WME-Framework-Elementen erzeugen die hinzugefügten Tooltips einen Fehler. Das Skript funktioniert dennoch normal weiter.</li></ul>`,
close: 'Schließen',
viewScript: 'Skript anzeigen',
viewChangelog: 'Änderungsprotokoll anzeigen',
reset: 'Zurücksetzen',
snackbar: {
errorFiltering: 'Fehler beim Anwenden des Filters. Die Mindestgeschwindigkeit darf nicht größer als die Höchstgeschwindigkeit sein.',
},
title: {
settings: 'Einstellungen',
roadTypes: 'Straßentypen',
filter: 'Filter',
appearence: 'Erscheinungsbild',
showOnRoadType: 'Auf den folgenden Straßentypen anzeigen:',
seeOnDiscuss: 'Siehe den Thread des Skripts auf Discuss',
seeOnDiscord: 'Siehe den Kanal des Skripts auf dem Waze Script Discord-Server',
scriptDevBy: 'Mein Editor-Benutzerprofil anzeigen',
},
label: {
displaySpeeds: 'Geschwindigkeiten anzeigen',
noSpeed: 'Segment ohne Geschwindigkeit',
unpaved: 'Unbefestigter Abschnitt',
showOnRoundabout: 'Auf Kreisverkehr 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:',
ignore: 'Ignorieren',
show: 'Anzeigen',
focus: 'Fokussieren',
},
tooltip: {
showNoSpeed: `<u>Ignorieren</u> - Kein Symbol auf Segmenten ohne Geschwindigkeit rendern;<br><u>Anzeigen</u> - Symbol auf Segmenten ohne Geschwindigkeit rendern;<br><u>Fokussieren</u> - Nur Symbole auf Segmenten ohne definierte Geschwindigkeit rendern.`,
showOnUnpaved: `<u>Ignorieren</u> - Kein Symbol auf unbefestigten Segmenten rendern;<br><u>Anzeigen</u> - Symbol auf unbefestigten Segmenten rendern;<br><u>Fokussieren</u> - Nur Symbole auf unbefestigten Segmenten rendern.`
},
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: {
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>- Αν αγνοηθούν, δεν θα εμφανίζονται εικονίδια.<br>- Αν εμφανιστούν, τα εικονίδια θα προβάλλονται κανονικά.<br>- Αν εστιάσετε, θα εμφανίζονται μόνο εικονίδια που πληρούν την προϋπόθεση.<br></li></li><li>Προστέθηκε μετρητής ενεργών φίλτρων στον τίτλο της καρτέλας "φίλτρα" για ευκολότερη αναγνώριση ενεργών φίλτρων.</li></ul><h6>Διορθώσεις και βελτιώσεις:</h6><ul style="margin-bottom: 10px"><li>Το παλιό checkbox "Εμφάνιση ταχύτητας σε κυκλικό κόμβο" αντικαταστάθηκε με διακόπτη.</li><li>Προστέθηκε όριο προσπαθειών στους υπάρχοντες βρόχους του script.</li><li>Διορθώθηκε μικρό σφάλμα ελέγχου για χώρες με αριστερή κυκλοφορία.</li><li>Άλλες μικρές διορθώσεις και βελτιώσεις.</li></ul><h6>Γνωστά προβλήματα:</h6><ul><li>Εμφανίζεται σφάλμα ".then" κατά την εκκίνηση του script μετά την ενημέρωση του WME. Η αιτία είναι άγνωστη, αλλά το script λειτουργεί κανονικά.</li><li>Υπάρχουν σφάλματα στα tooltips κατά την εκκίνηση. Λόγω έλλειψης τεκμηρίωσης για στοιχεία του WME, τα tooltips προκαλούν σφάλμα, αλλά το script συνεχίζει να λειτουργεί.</li></ul>`,
close: 'Κλείσιμο',
viewScript: 'Δείτε το script',
viewChangelog: 'Δείτε το αρχείο αλλαγών',
reset: 'Επαναφορά',
snackbar: {
errorFiltering: 'Σφάλμα στην εφαρμογή του φίλτρου. Η ελάχιστη ταχύτητα δεν μπορεί να είναι μεγαλύτερη από τη μέγιστη.',
},
title: {
settings: 'Ρυθμίσεις',
roadTypes: 'Τύποι Δρόμων',
filter: 'Φίλτρο',
appearence: 'Εμφάνιση',
showOnRoadType: 'Εμφάνιση στους εξής τύπους δρόμων:',
seeOnDiscuss: 'Δείτε το νήμα του script στο Discuss',
seeOnDiscord: 'Δείτε το κανάλι του script στον server Discord του Waze Script',
scriptDevBy: 'Δείτε το προφίλ χρήστη του επεξεργαστή μου',
},
label: {
displaySpeeds: 'Εμφάνιση ταχυτήτων',
noSpeed: 'Τμήμα χωρίς ταχύτητα',
unpaved: 'Μη ασφαλτοστρωμένο τμήμα',
showOnRoundabout: 'Εμφάνιση σε κυκλικούς κόμβους',
maxZoom: 'Απεικόνιση μέχρι το ζουμ:',
toggleLayerShortcut: 'Αλλαγή ορατότητας του επιπέδου ταχύτητας',
zIndex: 'Βάθος επιπέδου',
hideShorterSegments: 'Απόκρυψη σε τμήματα μικρότερα από',
speedFilter: 'Φίλτρο κατά ταχύτητα',
min: 'Ελάχιστο:',
max: 'Μέγιστο:',
opacity: 'Επίπεδο αδιαφάνειας φίλτρου:',
ignore: 'Αγνόησε',
show: 'Εμφάνιση',
focus: 'Εστίαση',
},
tooltip: {
showNoSpeed: `<u>Αγνόησε</u> - Δεν εμφανίζει εικονίδιο σε τμήματα χωρίς όριο ταχύτητας·<br><u>Εμφάνιση</u> - Εμφανίζει εικονίδιο σε τμήματα χωρίς όριο ταχύτητας·<br><u>Εστίαση</u> - Εστιάζει μόνο σε τμήματα χωρίς καθορισμένη ταχύτητα.`,
showOnUnpaved: `<u>Αγνόησε</u> - Δεν εμφανίζει εικονίδιο σε χωμάτινα τμήματα·<br><u>Εμφάνιση</u> - Εμφανίζει εικονίδιο σε χωμάτινα τμήματα·<br><u>Εστίαση</u> - Εστιάζει μόνο σε χωμάτινα τμήματα.`
},
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: {
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>New feature for segments without speed and unpaved! Now you can ignore, show or focus on such segments:<li>- When ignored, no icons will be generated;<br>- When shown, icons will display normally;<br>- When focused, only matching icons will appear.<br></li></li><li>A counter for active filters was added to the "filters" tab title for easier identification of active filters.</li></ul><h6>Fixes and Improvements:</h6><ul style="margin-bottom: 10px"><li>The old checkbox "Show speed on roundabout" was replaced with a switch.</li><li>Added attempt limit to existing script loops.</li><li>Fixed a small check error for left-hand traffic.</li><li>Other small fixes and improvements.</li></ul><h6>Known Issues:</h6><ul><li>A ".then" error occurs when starting the script after the WME update. The cause is still unknown but the script works fine.</li><li>There are tooltip errors when initializing. Due to lack of documentation for native WME framework elements, the tooltips cause an error, but the script still works normally.</li></ul>`,
close: 'Close',
viewScript: 'View Script',
viewChangelog: 'View Changelog',
reset: 'Reset',
snackbar: {
errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
},
title: {
settings: 'Settings',
roadTypes: 'Road Types',
filter: 'Filter',
appearence: 'Appearance',
showOnRoadType: 'Show on the following road types:',
seeOnDiscuss: 'See the script\'s thread on Discuss',
seeOnDiscord: 'See the script\'s channel on the Waze Script Discord server',
scriptDevBy: 'View my editor user profile',
},
label: {
displaySpeeds: 'Display Speeds',
noSpeed: 'Segment with no speed',
unpaved: 'Unpaved segment',
showOnRoundabout: 'Show on roundabouts',
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:',
ignore: 'Ignore',
show: 'Show',
focus: 'Focus',
},
tooltip: {
showNoSpeed: `<u>Ignore</u> - Don’t render icon on segments without speed;<br><u>Show</u> - Render icon on segments without speed;<br><u>Focus</u> - Only render icons on segments with no defined speed.`,
showOnUnpaved: `<u>Ignore</u> - Don’t render icon on unpaved segments;<br><u>Show</u> - Render icon on unpaved segments;<br><u>Focus</u> - Only render icons on unpaved segments.`
},
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: {
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>New feature for segments without speed and unpaved! Now you can ignore, show or focus on such segments:<li>- When ignored, no icons will be generated;<br>- When shown, icons will display normally;<br>- When focused, only matching icons will appear.<br></li></li><li>A counter for active filters was added to the "filters" tab title for easier identification of active filters.</li></ul><h6>Fixes and Improvements:</h6><ul style="margin-bottom: 10px"><li>The old checkbox "Show speed on roundabout" was replaced with a switch.</li><li>Added attempt limit to existing script loops.</li><li>Fixed a small check error for left-hand traffic.</li><li>Other small fixes and improvements.</li></ul><h6>Known Issues:</h6><ul><li>A ".then" error occurs when starting the script after the WME update. The cause is still unknown but the script works fine.</li><li>There are tooltip errors when initializing. Due to lack of documentation for native WME framework elements, the tooltips cause an error, but the script still works normally.</li></ul>`,
close: 'Close',
viewScript: 'View Script',
viewChangelog: 'View Changelog',
reset: 'Reset',
snackbar: {
errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
},
title: {
settings: 'Settings',
roadTypes: 'Road Types',
filter: 'Filter',
appearence: 'Appearance',
showOnRoadType: 'Show on the following road types:',
seeOnDiscuss: 'See the script\'s thread on Discuss',
seeOnDiscord: 'See the script\'s channel on the Waze Script Discord server',
scriptDevBy: 'View my editor user profile',
},
label: {
displaySpeeds: 'Display Speeds',
noSpeed: 'Segment with no speed',
unpaved: 'Unpaved segment',
showOnRoundabout: 'Show on roundabouts',
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:',
ignore: 'Ignore',
show: 'Show',
focus: 'Focus',
},
tooltip: {
showNoSpeed: `<u>Ignore</u> - Do not render icon on segments without speed;<br><u>Show</u> - Render icon on segments without speed;<br><u>Focus</u> - Focus rendering only on segments without defined speed.`,
showOnUnpaved: `<u>Ignore</u> - Do not render icon on unpaved segments;<br><u>Show</u> - Render icon on unpaved segments;<br><u>Focus</u> - Focus rendering only on unpaved segments.`
},
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: {
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>New feature for segments without speed and unpaved! Now you can ignore, show or focus on such segments:<li>- When ignored, no icons will be generated;<br>- When shown, icons will display normally;<br>- When focused, only matching icons will appear.<br></li></li><li>A counter for active filters was added to the "filters" tab title for easier identification of active filters.</li></ul><h6>Fixes and Improvements:</h6><ul style="margin-bottom: 10px"><li>The old checkbox "Show speed on roundabout" was replaced with a switch.</li><li>Added attempt limit to existing script loops.</li><li>Fixed a small check error for left-hand traffic.</li><li>Other small fixes and improvements.</li></ul><h6>Known Issues:</h6><ul><li>A ".then" error occurs when starting the script after the WME update. The cause is still unknown but the script works fine.</li><li>There are tooltip errors when initializing. Due to lack of documentation for native WME framework elements, the tooltips cause an error, but the script still works normally.</li></ul>`,
close: 'Close',
viewScript: 'View Script',
viewChangelog: 'View Changelog',
reset: 'Reset',
snackbar: {
errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
},
title: {
settings: 'Settings',
roadTypes: 'Road Types',
filter: 'Filter',
appearence: 'Appearance',
showOnRoadType: 'Show on the following road types:',
seeOnDiscuss: 'See the script\'s thread on Discuss',
seeOnDiscord: 'See the script\'s channel on the Waze Script Discord server',
scriptDevBy: 'View my editor user profile',
},
label: {
displaySpeeds: 'Display Speeds',
noSpeed: 'Segment with no speed',
unpaved: 'Unpaved segment',
showOnRoundabout: 'Show on roundabouts',
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:',
ignore: 'Ignore',
show: 'Show',
focus: 'Focus',
},
tooltip: {
showNoSpeed: `<u>Ignore</u> - Do not render icon on segments without speed;<br><u>Show</u> - Render icon on segments without speed;<br><u>Focus</u> - Focus rendering only on segments without defined speed.`,
showOnUnpaved: `<u>Ignore</u> - Do not render icon on unpaved segments;<br><u>Show</u> - Render icon on unpaved segments;<br><u>Focus</u> - Focus rendering only on unpaved segments.`
},
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: {
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>¡Nueva función para segmentos sin velocidad y sin pavimentar! Ahora puedes ignorarlos, mostrarlos o enfocarte en ellos:<li>- Si ignoras, no se generarán iconos.<br>- Si los muestras, los iconos aparecerán normalmente.<br>- Si enfocas, solo se mostrarán iconos que cumplan la condición.<br></li></li><li>Se agregó un contador de filtros activos en el título de la pestaña "filtros" para facilitar su identificación.</li></ul><h6>Correcciones y mejoras:</h6><ul style="margin-bottom: 10px"><li>La casilla antigua de "Mostrar velocidad en rotonda" se reemplazó por un interruptor.</li><li>Se añadió un límite de intentos en bucles existentes del script.</li><li>Se corrigió un pequeño fallo de verificación en tránsito por la izquierda.</li><li>Otras pequeñas correcciones y mejoras.</li></ul><h6>Problemas conocidos:</h6><ul><li>Existe un error ".then" al iniciar el script tras la actualización de WME. La causa aún es desconocida, pero el script funciona con normalidad.</li><li>Hay errores en los tooltips al iniciarlos. Debido a la falta de documentación para usar elementos nativos del framework WME, los tooltips agregados generan un error. Aun así, el script funciona con normalidad.</li></ul>`,
close: 'Cerrar',
viewScript: 'Ver script',
viewChangelog: 'Ver registro de cambios',
reset: 'Restablecer',
snackbar: {
errorFiltering: 'Error al aplicar el filtro. La velocidad mínima no puede ser mayor que la máxima.',
},
title: {
settings: 'Configuración',
roadTypes: 'Tipos de carretera',
filter: 'Filtro',
appearence: 'Apariencia',
showOnRoadType: 'Mostrar en los siguientes tipos de carretera:',
seeOnDiscuss: 'Ver el hilo del script en Discuss',
seeOnDiscord: 'Ver el canal del script en el servidor de Discord de Waze Script',
scriptDevBy: 'Ver mi perfil de usuario del editor',
},
label: {
displaySpeeds: 'Mostrar velocidades',
noSpeed: 'Segmento sin velocidad',
unpaved: 'Segmento sin pavimentar',
showOnRoundabout: 'Mostrar en rotondas',
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:',
ignore: 'Ignorar',
show: 'Mostrar',
focus: 'Enfocar',
},
tooltip: {
showNoSpeed: `<u>Ignorar</u> - No muestra ícono en segmentos sin velocidad;<br><u>Mostrar</u> - Muestra ícono en segmentos sin velocidad;<br><u>Enfocar</u> - Enfoca solo segmentos sin velocidad definida.`,
showOnUnpaved: `<u>Ignorar</u> - No muestra ícono en segmentos sin pavimentar;<br><u>Mostrar</u> - Muestra ícono en segmentos sin pavimentar;<br><u>Enfocar</u> - Enfoca solo segmentos sin pavimentar.`
},
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: {
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>¡Nueva función para segmentos sin velocidad y sin pavimentar! Ahora puedes ignorarlos, mostrarlos o enfocarte en ellos:<li>- Si ignoras, no se generarán íconos.<br>- Si los muestras, los íconos aparecerán normalmente.<br>- Si enfocas, solo se mostrarán íconos que cumplan la condición.<br></li></li><li>Se agregó un contador de filtros activos en el título de la pestaña "filtros" para facilitar su identificación.</li></ul><h6>Correcciones y mejoras:</h6><ul style="margin-bottom: 10px"><li>La casilla antigua de "Mostrar velocidad en rotonda" se reemplazó por un interruptor.</li><li>Se añadió un límite de intentos en bucles existentes del script.</li><li>Se corrigió un pequeño fallo de verificación en tránsito por la izquierda.</li><li>Otras pequeñas correcciones y mejoras.</li></ul><h6>Problemas conocidos:</h6><ul><li>Existe un error ".then" al iniciar el script tras la actualización de WME. La causa aún es desconocida, pero el script funciona con normalidad.</li><li>Hay errores en los tooltips al iniciarlos. Debido a la falta de documentación para usar elementos nativos del framework WME, los tooltips agregados generan un error. Aun así, el script funciona con normalidad.</li></ul>`,
close: 'Cerrar',
viewScript: 'Ver script',
viewChangelog: 'Ver registro de cambios',
reset: 'Restablecer',
snackbar: {
errorFiltering: 'Error al aplicar el filtro. La velocidad mínima no puede ser mayor que la máxima.',
},
title: {
settings: 'Configuración',
roadTypes: 'Tipos de carretera',
filter: 'Filtro',
appearence: 'Apariencia',
showOnRoadType: 'Mostrar en los siguientes tipos de carretera:',
seeOnDiscuss: 'Ver el hilo del script en Discuss',
seeOnDiscord: 'Ver el canal del script en el servidor de Discord de Waze Script',
scriptDevBy: 'Ver mi perfil de usuario del editor',
},
label: {
displaySpeeds: 'Mostrar velocidades',
noSpeed: 'Segmento sin velocidad',
unpaved: 'Segmento sin pavimentar',
showOnRoundabout: 'Mostrar en rotondas',
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:',
ignore: 'Ignorar',
show: 'Mostrar',
focus: 'Enfocar',
},
tooltip: {
showNoSpeed: `<u>Eira</u> - Ei renderda ikooni kiiruseta lõikudel;<br><u>Kuva</u> - Renderda ikoon kiiruseta lõikudel;<br><u>Fookus</u> - Fokuseerib ainult kiiruseta lõikudele.`,
showOnUnpaved: `<u>Eira</u> - Ei renderda ikooni katmata lõikudel;<br><u>Kuva</u> - Renderda ikoon katmata lõikudel;<br><u>Fookus</u> - Fokuseerib ainult katmata lõikudele.`
},
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: {
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>Uus funktsioon segmentidele ilma kiiruseta ja katmata! Nüüd saate need ignoreerida, kuvada või keskenduda ainult neile:<li>- Kui ignoreerite, ikoone ei genereerita;<br>- Kui kuvate, kuvatakse ikoonid tavapäraselt;<br>- Kui keskendute, kuvatakse ainult vastavad ikoonid.<br></li></li><li>Lisatud on aktiivsete filtrite loendur "filtrite" vahekaardi pealkirjas, et neid oleks lihtsam tuvastada.</li></ul><h6>Parandused ja täiendused:</h6><ul style="margin-bottom: 10px"><li>Vana linnukene „Kuva kiirus ringristmikul” asendati lülitiga.</li><li>Lisatud katsete piirang olemasolevatesse tsüklitesse skriptis.</li><li>Parandatud väike kontrolliviga vasakpoolse liikluse puhul.</li><li>Muud väikesed parandused ja täiendused.</li></ul><h6>Tuntud probleemid:</h6><ul><li>Pärast WME uuendust ilmneb skripti käivitamisel ".then" viga. Põhjus on endiselt teadmata, kuid skript töötab normaalselt.</li><li>Tooltippide käivitamisel esineb vigu. Kuna puudub dokumentatsioon WME natiivsete elementide kohta, tekitavad lisatud tooltippid vea. Siiski töötab skript tavapäraselt.</li></ul>`,
close: 'Sulge',
viewScript: 'Vaata skripti',
viewChangelog: 'Vaata muudatuste ajalugu',
reset: 'Lähtesta',
snackbar: {
errorFiltering: 'Viga filtri rakendamisel. Minimaalne kiirus ei saa olla suurem kui maksimaalne.',
},
title: {
settings: 'Seaded',
roadTypes: 'Teetüübid',
filter: 'Filtrid',
appearence: 'Välimus',
showOnRoadType: 'Kuva järgmistes teetüüpides:',
seeOnDiscuss: 'Vaata skripti teemat Discussis',
seeOnDiscord: 'Vaata skripti kanalit Waze Scripti Discord serveris',
scriptDevBy: 'Vaadake minu redaktori kasutajaprofiili',
},
label: {
displaySpeeds: 'Kuva kiirus',
noSpeed: 'Segment ilma kiirusteta',
unpaved: 'Kattega katmata lõik',
showOnRoundabout: 'Kuva ringteel',
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:',
ignore: 'Eira',
show: 'Näita',
focus: 'Fokuseeri',
},
tooltip: {
showNoSpeed: `<u>Ez utzi</u> - Ez du ikonoa erakusten abiadurarik gabeko segmentuetan;<br><u>Erakutsi</u> - Erakutsi ikonoa abiadurarik gabeko segmentuetan;<br><u>Fokatu</u> - Fokatu bakarrik abiadurarik ez duten segmentuak.`,
showOnUnpaved: `<u>Ez utzi</u> - Ez du ikonoa erakusten asfaltatu gabeko segmentuetan;<br><u>Erakutsi</u> - Erakutsi ikonoa asfaltatu gabeko segmentuetan;<br><u>Fokatu</u> - Fokatu bakarrik asfaltatu gabeko segmentuak.`
},
tooltip: {
showNoSpeed: `<u>Eira</u> - Ei renderda ikooni kiiruseta lõikudel;<br><u>Kuva</u> - Renderda ikoon kiiruseta lõikudel;<br><u>Fookus</u> - Fokuseerib ainult kiiruseta lõikudele.`,
showOnUnpaved: `<u>Eira</u> - Ei renderda ikooni katmata lõikudel;<br><u>Kuva</u> - Renderda ikoon katmata lõikudel;<br><u>Fookus</u> - Fokuseerib ainult katmata lõikudele.`
},
theme: {
default: 'Vaikimisi',
altViennaConv: 'Alternatiivne Viini konventsioon',
japan: 'Jaapan',
northAmerica: 'Põhja-Ameerika',
sacu: 'Lõuna-Aafrika Tolliliit',
uk: 'Ühendkuningriik',
},
btn: {
resetSettings: 'Lähtesta seaded',
seeOnDiscuss: 'Vaata arutelus',
seeOnDiscord: 'Vaata Discordis',
scriptDevBy: 'Skripti arendas Luan Tavares',
}
};
break;
case 'eu':
// Basque
translations = {
name: 'Abiadura Erakustea',
zoomOut: 'Hurbilago',
zoomIn: 'Aldez aurretik',
changelog: 'Aldaketa erregistroa',
changelogMessage: `<h6>Berrikuntzak:</h6><ul style="margin-bottom: 10px"><li>Abiadurarik gabe eta asfaltatu gabe dauden segmentuetarako funtzio berria! Orain segmentu horiek ezikusi, erakutsi edo fokuratu ditzakezu:<li>- Ezikusten baduzu, ikonoak ez dira sortuko;<br>- Erakusten baduzu, ikonoak normaltasunez agertuko dira;<br>- Fokuratzen baduzu, baldintza betetzen duten ikonoak soilik agertuko dira.<br></li></li><li>"Iragazkiak" fitxaren tituluan iragazki aktiboen zenbaketa gehitu da, aktiboak identifikatzea errazteko.</li></ul><h6>Konponketak eta hobekuntzak:</h6><ul style="margin-bottom: 10px"><li>"Erakutsi abiadura biribilguneetan" aukerako laukia botoi batekin ordezkatu da.</li><li>Skriptaren zikloetan saiakera muga gehitu da.</li><li>Ezkerraldeko trafikoaren egiaztapenean akats txiki bat konpondu da.</li><li>Beste konponketa eta hobekuntza txiki batzuk.</li></ul><h6>Ezagutzen diren arazoak:</h6><ul><li>".then" errorea gertatzen da skripta abiatzean WME eguneratu ondoren. Arrazoia oraindik ez da ezaguna, baina skripta normaltasunez funtzionatzen du.</li><li>Tooltips-ak abiatzean erroreak sortzen dira. WME framework-aren elementu natiboak erabiltzeko dokumentazioa falta delako, gehitutako tooltips-ak errorea sortzen dute. Hala ere, skripta normaltasunez funtzionatzen du.</li></ul>`,
close: 'Itxi',
viewScript: 'Ikusi script-a',
viewChangelog: 'Ikusi aldaketak',
reset: 'Berrezarri',
snackbar: {
errorFiltering: 'Errorea iragazkia aplikatzean. Gutxieneko abiadura ezin da handiagoa izan gehienekoa baino.',
},
title: {
settings: 'Ezarpenak',
roadTypes: 'Errepide motak',
filter: 'Filtratu',
appearence: 'Itxura',
showOnRoadType: 'Erakutsi hurrengo errepide motetan:',
seeOnDiscuss: 'Ikusi skriptaren haria Discuss-en',
seeOnDiscord: 'Ikusi skriptaren kanala Waze Script-en Discord zerbitzuan',
scriptDevBy: 'Ikusi nire editorearen erabiltzaile-profila',
},
label: {
displaySpeeds: 'Erakutsi abiadurak',
noSpeed: 'Abiadura gabeko segmentua',
unpaved: 'Pavimentatu gabeko segmentua',
showOnRoundabout: 'Erakutsi biribilguneetan',
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:',
ignore: 'Baztertu',
show: 'Erakutsi',
focus: 'Fokatu',
},
tooltip: {
showNoSpeed: `<u>Ez utzi</u> - Ez du ikonoa erakusten abiadurarik gabeko segmentuetan;<br><u>Erakutsi</u> - Erakutsi ikonoa abiadurarik gabeko segmentuetan;<br><u>Fokatu</u> - Fokatu bakarrik abiadurarik ez duten segmentuak.`,
showOnUnpaved: `<u>Ez utzi</u> - Ez du ikonoa erakusten asfaltatu gabeko segmentuetan;<br><u>Erakutsi</u> - Erakutsi ikonoa asfaltatu gabeko segmentuetan;<br><u>Fokatu</u> - Fokatu bakarrik asfaltatu gabeko segmentuak.`
},
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: {
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>- با نادیده گرفتن، آیکونها نمایش داده نمیشوند؛<br>- با نمایش، آیکونها به طور معمول رندر میشوند؛<br>- با تمرکز، فقط آیکونهایی که این شرط را دارند نمایش داده میشوند.<br></li></li><li>شمارنده فیلترهای فعال به عنوان تب «فیلترها» اضافه شده است تا شناسایی فیلترهای فعال آسانتر باشد.</li></ul><h6>اصلاحات و بهبودها:</h6><ul style="margin-bottom: 10px"><li>چکباکس قدیمی «نمایش سرعت در میدان» با سوئیچ جایگزین شد.</li><li>محدودیت تلاش برای حلقههای موجود اضافه شد.</li><li>یک مشکل کوچک بررسی در ترافیک دستچپ اصلاح شد.</li><li>اصلاحات و بهبودهای کوچک دیگر.</li></ul><h6>مشکلات شناختهشده:</h6><ul><li>پس از بروزرسانی WME، هنگام شروع اسکریپت یک خطای «.then» ظاهر میشود. علت هنوز مشخص نیست اما اسکریپت به درستی اجرا میشود.</li><li>در هنگام بارگذاری تولتیپها خطاهایی وجود دارد. به دلیل کمبود مستندات برای عناصر بومی WME، تولتیپهای اضافهشده خطا ایجاد میکنند، اما اسکریپت همچنان کار میکند.</li></ul>`,
close: 'بستن',
viewScript: 'مشاهده اسکریپت',
viewChangelog: 'مشاهده تغییرات ثبت شده',
reset: 'بازنشانی',
snackbar: {
errorFiltering: 'خطا در اعمال فیلتر. حداقل سرعت نمیتواند بیشتر از حداکثر باشد.',
},
title: {
settings: 'تنظیمات',
roadTypes: 'انواع جادهها',
filter: 'فیلتر',
appearence: 'ظاهر',
showOnRoadType: 'نمایش در انواع جادههای زیر:',
seeOnDiscuss: 'مطالعه موضوع اسکریپت در Discuss',
seeOnDiscord: 'مشاهده کانال اسکریپت در سرور Discord اسکریپتهای Waze',
scriptDevBy: 'مشاهده نمایه کاربری ویرایشگر من',
},
label: {
displaySpeeds: 'نمایش سرعت ها',
noSpeed: 'بخش بدون سرعت',
unpaved: 'بخش بدون آسفالت',
showOnRoundabout: 'نمایش در چرخشگاه ها',
maxZoom: 'نمایش تا زوم:',
toggleLayerShortcut: 'تغییر لایه نمایش سرعت',
zIndex: 'عمق لایه',
hideShorterSegments: 'مخفی کردن بخش های کوتاه تر از',
speedFilter: 'فیلتر بر اساس سرعت',
min: 'حداقل:',
max: 'حداکثر:',
opacity: 'سطح شفافیت فیلتر:',
ignore: 'نادیده گرفتن',
show: 'نمایش',
focus: 'تمرکز',
},
tooltip: {
showNoSpeed: `<u>نادیده بگیر</u> - آیکن در بخشهای بدون سرعت نمایش داده نمیشود؛<br><u>نمایش</u> - آیکن در بخشهای بدون سرعت نمایش داده میشود؛<br><u>تمرکز</u> - فقط روی بخشهایی که سرعت مشخصی ندارند تمرکز میکند.`,
showOnUnpaved: `<u>نادیده بگیر</u> - آیکن در بخشهای خاکی نمایش داده نمیشود؛<br><u>نمایش</u> - آیکن در بخشهای خاکی نمایش داده میشود؛<br><u>تمرکز</u> - فقط روی بخشهای خاکی تمرکز میکند.`
},
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: {
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>Uusi toiminto nopeudettomille ja päällystämättömille segmenteille! Nyt voit ohittaa, näyttää tai kohdistaa vain näihin segmentteihin:<li>- Jos ohitat, kuvakkeita ei näytetä;<br>- Jos näytät, kuvakkeet renderöidään normaalisti;<br>- Jos kohdistat, vain ehdon täyttävät kuvakkeet näytetään.<br></li></li><li>Lisätty aktiivisten suodattimien laskuri ”Suodattimet”-välilehden otsikkoon, jotta näet helposti, milloin suodattimia on käytössä.</li></ul><h6>Korjaukset ja parannukset:</h6><ul style="margin-bottom: 10px"><li>Vanha valintaruutu ”Näytä nopeus kiertoliittymissä” on korvattu kytkimellä.</li><li>Lisätty rajoitus yritysmäärille skriptin silmukoissa.</li><li>Korjattu pieni virhe vasemmanpuoleisen liikenteen tarkistuksessa.</li><li>Muita pieniä korjauksia ja parannuksia.</li></ul><h6>Tunnetut ongelmat:</h6><ul><li>WME-päivityksen jälkeen skriptin käynnistyksessä tulee ”.then”-virhe. Syytä ei vielä tiedetä, mutta skripti toimii silti normaalisti.</li><li>Työkaluvihjeiden latauksessa esiintyy virheitä. Koska WME:n natiivi-elementeille ei ole dokumentaatiota, työkaluvihjeet aiheuttavat virheitä, mutta skripti toimii silti normaalisti.</li></ul>`,
close: 'Sulje',
viewScript: 'Näytä skripti',
viewChangelog: 'Näytä muutokset',
reset: 'Palauta',
snackbar: {
errorFiltering: 'Virhe suodatinta sovellettaessa. Vähimmäisnopeus ei voi olla suurempi kuin enimmäisnopeus.',
},
title: {
settings: 'Asetukset',
roadTypes: 'Tiestötyypit',
filter: 'Suodatin',
appearence: 'Ulkoasu',
showOnRoadType: 'Näytä seuraavilla tietyyppien alueilla:',
seeOnDiscuss: 'Katso skriptin ketju Discussissa',
seeOnDiscord: 'Katso skriptin kanava Waze Scriptin Discord-palvelimella',
scriptDevBy: 'Näytä editorini käyttäjäprofiili',
},
label: {
displaySpeeds: 'Näytä nopeudet',
noSpeed: 'Segmentti ilman nopeutta',
unpaved: 'Päällystämätön segmentti',
showOnRoundabout: 'Näytä liikenneympyrässä',
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:',
ignore: 'Ohita',
show: 'Näytä',
focus: 'Keskity',
},
tooltip: {
showNoSpeed: `<u>Ohita</u> - Ei näytä kuvaketta segmenteissä ilman nopeutta;<br><u>Näytä</u> - Näyttää kuvakkeen segmenteissä ilman nopeutta;<br><u>Kohdista</u> - Kohdistaa vain segmenteille, joilla ei ole määriteltyä nopeutta.`,
showOnUnpaved: `<u>Ohita</u> - Ei näytä kuvaketta päällystämättömillä segmenteillä;<br><u>Näytä</u> - Näyttää kuvakkeen päällystämättömillä segmenteillä;<br><u>Kohdista</u> - Kohdistaa vain päällystämättömille segmenteille.`
},
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: {
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>Nouvelle fonction pour les segments sans vitesse et non goudronnés ! Vous pouvez maintenant ignorer, afficher ou cibler ces segments :<li>- Ignorer : aucun icône ne sera affiché ;<br>- Afficher : les icônes seront affichés normalement ;<br>- Cibler : seuls les icônes répondant à la condition seront affichés.<br></li></li><li>Un compteur de filtres actifs a été ajouté au titre de l’onglet « Filtres » pour savoir facilement quand des filtres sont actifs.</li></ul><h6>Corrections et améliorations :</h6><ul style="margin-bottom: 10px"><li>La case à cocher « Afficher la vitesse dans le rond-point » a été remplacée par un interrupteur.</li><li>Limite d’essais ajoutée pour les boucles existantes du script.</li><li>Correction d’une petite erreur de vérification en circulation à gauche.</li><li>Autres petites corrections et améliorations.</li></ul><h6>Problèmes connus :</h6><ul><li>Un message d’erreur « .then » apparaît au lancement du script après la mise à jour WME. La cause est encore inconnue, mais le script fonctionne normalement.</li><li>Des erreurs apparaissent au chargement des info-bulles. Faute de documentation sur les éléments natifs du framework WME, les info-bulles ajoutées génèrent une erreur, mais le script fonctionne normalement.</li></ul>`,
close: 'Fermer',
viewScript: 'Voir le script',
viewChangelog: 'Voir le journal des modifications',
reset: 'Réinitialiser',
snackbar: {
errorFiltering: 'Erreur lors de l’application du filtre. La vitesse minimale ne peut pas être supérieure à la maximale.',
},
title: {
settings: 'Paramètres',
roadTypes: 'Types de route',
filter: 'Filtrer',
appearence: 'Apparence',
showOnRoadType: 'Afficher sur les types de route suivants :',
seeOnDiscuss: 'Voir le fil du script sur Discuss',
seeOnDiscord: 'Voir le canal du script sur le serveur Discord de Waze Script',
scriptDevBy: 'Voir mon profil utilisateur de l’éditeur',
},
label: {
displaySpeeds: 'Afficher les vitesses',
noSpeed: 'Segment sans vitesse',
unpaved: 'Segment non pavé',
showOnRoundabout: 'Afficher sur le rond-point',
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:',
ignore: 'Ignorer',
show: 'Afficher',
focus: 'Centrer',
},
tooltip: {
showNoSpeed: `<u>Ignorer</u> - N'affiche pas d'icône sur les segments sans vitesse ;<br><u>Afficher</u> - Affiche une icône sur les segments sans vitesse ;<br><u>Concentrer</u> - Ne concentre l'affichage que sur les segments sans vitesse définie.`,
showOnUnpaved: `<u>Ignorer</u> - N'affiche pas d'icône sur les segments non pavés ;<br><u>Afficher</u> - Affiche une icône sur les segments non pavés ;<br><u>Concentrer</u> - Ne concentre l'affichage que sur les segments non pavés.`
},
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: {
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>Nova función para segmentos sen velocidade e non asfaltados! Agora podes ignorar, mostrar ou centrarte nestes segmentos:<li>- Ao ignorar, non se xerarán iconas;<br>- Ao mostrar, as iconas renderízanse normalmente;<br>- Ao centrarte, só se amosan as iconas que cumpren a condición.<br></li></li><li>Engadiuse un contador de filtros activos no título da pestana «Filtros» para facilitar a identificación de filtros activos.</li></ul><h6>Correccións e melloras:</h6><ul style="margin-bottom: 10px"><li>O antigo checkbox de «Mostrar velocidade en rotonda» foi substituído por un interruptor.</li><li>Engadiuse un límite de intentos en bucles existentes do script.</li><li>Corrixiuse un pequeno fallo de verificación en tráfico pola esquerda.</li><li>Outras pequenas correccións e melloras.</li></ul><h6>Problemas coñecidos:</h6><ul><li>Existe un erro «.then» ao iniciar o script despois da actualización do WME. A causa aínda é descoñecida, pero o script funciona normalmente.</li><li>Existen erros nos tooltips ao inicialos. Pola falta de documentación para usar elementos nativos do framework de WME, os tooltips engadidos xeran un erro. Porén, o script funciona normalmente.</li></ul>`,
close: 'Pechar',
viewScript: 'Ver script',
viewChangelog: 'Ver rexistro de cambios',
reset: 'Restablecer',
snackbar: {
errorFiltering: 'Erro ao aplicar o filtro. A velocidade mínima non pode ser maior que a máxima.',
},
title: {
settings: 'Configuracións',
roadTypes: 'Tipos de estrada',
filter: 'Filtro',
appearence: 'Aparencia',
showOnRoadType: 'Amosar nos seguintes tipos de estrada:',
seeOnDiscuss: 'Ver o fío do script en Discuss',
seeOnDiscord: 'Ver o canal do script no servidor Discord de Waze Script',
scriptDevBy: 'Ver o meu perfil de usuario do editor',
},
label: {
displaySpeeds: 'Exhibir velocidades',
noSpeed: 'Segmento sen velocidade',
unpaved: 'Segmento sen pavimentar',
showOnRoundabout: 'Exhibir en rotondas',
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:',
ignore: 'Ignorar',
show: 'Amosar',
focus: 'Enfocar',
},
tooltip: {
showNoSpeed: `<u>Ignorar</u> - Non amosa icona nos segmentos sen velocidade;<br><u>Amosar</u> - Amosa icona nos segmentos sen velocidade;<br><u>Focalizar</u> - Focaliza só os segmentos sen velocidade definida.`,
showOnUnpaved: `<u>Ignorar</u> - Non amosa icona nos segmentos non pavimentados;<br><u>Amosar</u> - Amosa icona nos segmentos non pavimentados;<br><u>Focalizar</u> - Focaliza só os segmentos non pavimentados.`
},
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: {
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>- בהתעלמות, לא יוצגו סמלים;<br>- בהצגה, הסמלים יופיעו כרגיל;<br>- בהתמקדות, יוצגו רק סמלים שעונים על התנאי.<br></li></li><li>נוסף מונה של מסננים פעילים בכותרת הלשונית "מסננים" לזיהוי קל יותר של מסננים פעילים.</li></ul><h6>תיקונים ושיפורים:</h6><ul style="margin-bottom: 10px"><li>תיבת הסימון הישנה "הצגת מהירות בכיכר" הוחלפה במתג.</li><li>נוסף גבול ניסיונות בלולאות קיימות בסקריפט.</li><li>תוקנה בדיקה קטנה בתעבורה שמאלית.</li><li>תיקונים ושיפורים קטנים נוספים.</li></ul><h6>בעיות ידועות:</h6><ul><li>קיימת שגיאת ".then" בעת הפעלת הסקריפט לאחר עדכון ה-WME. הסיבה אינה ידועה אך הסקריפט פועל כרגיל.</li><li>יש שגיאות בכלים בעת הטענתם. עקב חוסר תיעוד של אלמנטים מקוריים של WME, הכלים גורמים לשגיאה אך הסקריפט פועל כרגיל.</li></ul>`,
close: 'סגור',
viewScript: 'צפה בסקריפט',
viewChangelog: 'צפה ביומן השינויים',
reset: 'אפס',
snackbar: {
errorFiltering: 'שגיאה ביישום המסנן. המהירות המינימלית לא יכולה להיות גבוהה מהמהירות המרבית.',
},
title: {
settings: 'הגדרות',
roadTypes: 'סוגי דרכים',
filter: 'סנן',
appearence: 'מראה',
showOnRoadType: 'הצג על סוגי הדרכים הבאים:',
seeOnDiscuss: 'ראה את השרשור של הסקריפט ב-Discuss',
seeOnDiscord: 'ראה את הערוץ של הסקריפט בשרת Discord של Waze Script',
scriptDevBy: 'הצג את פרופיל המשתמש של העורך שלי',
},
label: {
displaySpeeds: 'הצג מהירויות',
noSpeed: 'קטע ללא מהירות',
unpaved: 'קטע לא סלול',
showOnRoundabout: 'הצג בכיכרות',
maxZoom: 'הצג עד לזום:',
toggleLayerShortcut: 'החלף שכבת הצגת מהירות',
zIndex: 'עומק השכבה',
hideShorterSegments: 'הסתר בקטעים קצרים מ-',
speedFilter: 'סנן לפי מהירות',
min: 'מינימום:',
max: 'מקסימום:',
opacity: 'רמת שקיפות המסנן:',
ignore: 'התעלם',
show: 'הצג',
focus: 'מקד',
},
tooltip: {
showNoSpeed: `<u>התעלם</u> - לא מציג אייקון במקטעים ללא מהירות;<br><u>הצג</u> - מציג אייקון במקטעים ללא מהירות;<br><u>מיקוד</u> - ממקד הצגת אייקונים רק במקטעים ללא מהירות מוגדרת.`,
showOnUnpaved: `<u>התעלם</u> - לא מציג אייקון במקטעים לא סלולים;<br><u>הצג</u> - מציג אייקון במקטעים לא סלולים;<br><u>מיקוד</u> - ממקד הצגת אייקונים רק במקטעים לא סלולים.`
},
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: {
resetSettings: 'אפס הגדרות',
seeOnDiscuss: 'ראה בדיון',
seeOnDiscord: 'ראה ב-Discord',
scriptDevBy: 'הסקריפט פותח על ידי לואן טאווארס',
}
};
break;
case 'hi':
// Hindi
translations = {
name: 'स्पीड डिस्प्ले',
zoomOut: 'और दूर',
zoomIn: 'और पास',
changelog: 'चेंजलॉग',
changelogMessage: `<h6>नई सुविधाएँ:</h6><ul style="margin-bottom: 10px"><li>ऐसे खंडों के लिए नई सुविधा जिनमें गति नहीं है या जो पक्के नहीं हैं! अब आप इन्हें अनदेखा कर सकते हैं, दिखा सकते हैं या केवल इन्हीं पर ध्यान केंद्रित कर सकते हैं:<li>- अनदेखा करने पर आइकन नहीं दिखेंगे;<br>- दिखाने पर आइकन सामान्य रूप से प्रदर्शित होंगे;<br>- ध्यान केंद्रित करने पर केवल शर्त के अनुसार आइकन दिखेंगे।<br></li></li><li>फिल्टर टैब के शीर्षक में सक्रिय फिल्टर की गिनती जोड़ी गई है ताकि आपको पता चल सके कि कौन से फिल्टर सक्रिय हैं।</li></ul><h6>सुधार और सुधार:</h6><ul style="margin-bottom: 10px"><li>पुराना "रोटरी में गति दिखाएँ" चेकबॉक्स अब एक स्विच से बदल दिया गया है।</li><li>स्क्रिप्ट में मौजूदा लूप्स में प्रयासों की सीमा जोड़ी गई है।</li><li>लेफ्ट-हैंड ट्रैफिक की जाँच में एक छोटी सी गलती को सुधारा गया है।</li><li>अन्य छोटे सुधार और सुधार।</li></ul><h6>ज्ञात समस्याएँ:</h6><ul><li>WME अपडेट के बाद स्क्रिप्ट शुरू करते समय ".then" त्रुटि आती है। कारण अज्ञात है लेकिन स्क्रिप्ट सामान्य रूप से चलता है।</li><li>टूलटिप्स शुरू करते समय त्रुटियाँ आती हैं। WME फ्रेमवर्क के नेटिव एलिमेंट्स की दस्तावेज़ीकरण की कमी के कारण टूलटिप्स त्रुटि देते हैं लेकिन स्क्रिप्ट सामान्य रूप से चलता है।</li></ul>`,
close: 'बंद करें',
viewScript: 'स्क्रिप्ट देखें',
viewChangelog: 'चेंजलॉग देखें',
reset: 'रीसेट',
snackbar: {
errorFiltering: 'फ़िल्टर लागू करने में त्रुटि। न्यूनतम गति अधिकतम से अधिक नहीं हो सकती।',
},
title: {
settings: 'सेटिंग्स',
roadTypes: 'सड़क प्रकार',
filter: 'फ़िल्टर',
appearence: 'रूप',
showOnRoadType: 'निम्नलिखित सड़क प्रकारों पर दिखाएं:',
seeOnDiscuss: 'Discuss पर स्क्रिप्ट का थ्रेड देखें',
seeOnDiscord: 'Waze Script के Discord सर्वर पर स्क्रिप्ट चैनल देखें',
scriptDevBy: 'मेरा संपादक उपयोगकर्ता प्रोफ़ाइल देखें',
},
label: {
displaySpeeds: 'गति दिखाएं',
noSpeed: 'गति के बिना खंड',
unpaved: 'असपाट खंड',
showOnRoundabout: 'राउंडअबाउट में दिखाएं',
maxZoom: 'जूम स्तर तक रेंडर करें:',
toggleLayerShortcut: 'स्पीड डिस्प्ले लेयर बदलें',
zIndex: 'लेयर की गहराई',
hideShorterSegments: 'छोटे सेगमेंट को छुपाएं',
speedFilter: 'गति के अनुसार फ़िल्टर करें',
min: 'न्यूनतम:',
max: 'अधिकतम:',
opacity: 'फ़िल्टर अपारदर्शिता स्तर:',
ignore: 'अनदेखा करें',
show: 'दिखाएँ',
focus: 'केंद्रित करें',
},
tooltip: {
showNoSpeed: `<u>अनदेखा करें</u> - बिना गति वाले खंडों पर आइकन नहीं दिखाता;<br><u>दिखाएँ</u> - बिना गति वाले खंडों पर आइकन दिखाता है;<br><u>फोकस करें</u> - केवल उन खंडों पर फोकस करता है जिनकी गति निर्धारित नहीं है।`,
showOnUnpaved: `<u>अनदेखा करें</u> - बिना पक्की सड़क वाले खंडों पर आइकन नहीं दिखाता;<br><u>दिखाएँ</u> - बिना पक्की सड़क वाले खंडों पर आइकन दिखाता है;<br><u>फोकस करें</u> - केवल बिना पक्की सड़क वाले खंडों पर फोकस करता है।`
},
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: {
resetSettings: 'सेटिंग्स रीसेट करें',
seeOnDiscuss: 'चर्चा में देखें',
seeOnDiscord: 'Discord पर देखें',
scriptDevBy: 'स्क्रिप्ट लुआन तावरेस द्वारा विकसित की गई है',
}
};
break;
case 'hr':
// Croatian
translations = {
name: 'Prikaz brzine',
zoomOut: 'Više udaljeno',
zoomIn: 'Više približeno',
changelog: 'Povijest izmjena',
changelogMessage: `<h6>Novosti:</h6><ul style="margin-bottom: 10px"><li>Nova funkcija za segmente bez ograničenja brzine i neasfaltirane segmente! Sada možete ignorirati, prikazati ili fokusirati samo na takve segmente:<li>- Ako ignorirate, ikone se neće prikazivati;<br>- Ako prikažete, ikone se normalno renderiraju;<br>- Ako fokusirate, prikazuju se samo ikone koje ispunjavaju uvjet.<br></li></li><li>Dodano je brojilo aktivnih filtera u naslov kartice „Filteri“ radi lakšeg praćenja aktivnih filtera.</li></ul><h6>Ispravke i poboljšanja:</h6><ul style="margin-bottom: 10px"><li>Stari checkbox „Prikaz brzine u kružnom toku“ zamijenjen je prekidačem.</li><li>Dodan je limit pokušaja u postojećim petljama skripte.</li><li>Ispravljena je mala greška provjere za lijevi promet.</li><li>Druge manje ispravke i poboljšanja.</li></ul><h6>Poznati problemi:</h6><ul><li>Pojavljuje se „.then“ greška pri pokretanju skripte nakon WME ažuriranja. Uzrok još nije poznat, ali skripta normalno radi.</li><li>Postoje greške pri pokretanju tooltipova. Zbog nedostatka dokumentacije za korištenje WME elemenata, dodani tooltipovi uzrokuju greške, ali skripta svejedno normalno radi.</li></ul>`,
close: 'Zatvori',
viewScript: 'Pogledaj skriptu',
viewChangelog: 'Pogledaj povijest izmjena',
reset: 'Poništi',
snackbar: {
errorFiltering: 'Pogreška pri primjeni filtra. Minimalna brzina ne može biti veća od maksimalne.',
},
title: {
settings: 'Postavke',
roadTypes: 'Vrste cesta',
filter: 'Filtriraj',
appearence: 'Izgled',
showOnRoadType: 'Prikaži na sljedećim vrstama cesta:',
seeOnDiscuss: 'Pogledajte temu skripte na Discussu',
seeOnDiscord: 'Pogledajte kanal skripte na Waze Script Discord poslužitelju',
scriptDevBy: 'Pogledajte moj korisnički profil uređivača',
},
label: {
displaySpeeds: 'Prikazuj brzine',
noSpeed: 'Segment bez brzine',
unpaved: 'Neasfaltirani segment',
showOnRoundabout: 'Prikazuj na kružnim tokovima',
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:',
ignore: 'Zanemari',
show: 'Prikaži',
focus: 'Fokusiraj',
},
tooltip: {
showNoSpeed: `<u>Zanemari</u> - Ne prikazuje ikonu na segmentima bez ograničenja brzine;<br><u>Prikaži</u> - Prikazuje ikonu na segmentima bez ograničenja brzine;<br><u>Fokusiraj</u> - Fokusira se samo na segmente bez definirane brzine.`,
showOnUnpaved: `<u>Zanemari</u> - Ne prikazuje ikonu na neasfaltiranim segmentima;<br><u>Prikaži</u> - Prikazuje ikonu na neasfaltiranim segmentima;<br><u>Fokusiraj</u> - Fokusira se samo na neasfaltirane segmente.`
},
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: {
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>Új funkció a sebesség nélküli és burkolatlan szakaszokhoz! Mostantól figyelmen kívül hagyhatod, megjelenítheted vagy csak ezekre összpontosíthatsz:<li>- Figyelmen kívül hagyás esetén nem jelennek meg ikonok;<br>- Megjelenítés esetén az ikonok normálisan jelennek meg;<br>- Összpontosítás esetén csak a feltételnek megfelelő ikonok jelennek meg.<br></li></li><li>Aktív szűrők számlálója került a „Szűrők” fül címébe a könnyebb nyomon követés érdekében.</li></ul><h6>Javítások és fejlesztések:</h6><ul style="margin-bottom: 10px"><li>A régi „Sebesség megjelenítése körforgalomban” jelölőnégyzetet kapcsoló váltotta fel.</li><li>Korlátozás került a meglévő ciklusokra a szkriptben.</li><li>Kijavították a bal oldali közlekedés ellenőrzésének egy kis hibáját.</li><li>Egyéb kisebb javítások és fejlesztések.</li></ul><h6>Ismert problémák:</h6><ul><li>„.then” hiba jelentkezik a szkript indításakor a WME frissítése után. Az ok egyelőre ismeretlen, de a szkript rendben működik.</li><li>A tooltip indításakor hibák lépnek fel. A WME natív elemeinek dokumentációjának hiánya miatt a tooltip hibát okoz, de a szkript ettől függetlenül működik.</li></ul>`,
close: 'Bezárás',
viewScript: 'Szkript megtekintése',
viewChangelog: 'Változási napló megtekintése',
reset: 'Visszaállítás',
snackbar: {
errorFiltering: 'Hiba a szűrő alkalmazásakor. A minimális sebesség nem lehet nagyobb, mint a maximális.',
},
title: {
settings: 'Beállítások',
roadTypes: 'Úttípusok',
filter: 'Szűrő',
appearence: 'Megjelenés',
showOnRoadType: 'Megjelenítés a következő úttípusokon:',
seeOnDiscuss: 'Nézd meg a script témáját a Discuss-on',
seeOnDiscord: 'Nézd meg a script csatornát a Waze Script Discord szerverén',
scriptDevBy: 'Tekintse meg a szerkesztői felhasználói profilomat',
},
label: {
displaySpeeds: 'Sebességek megjelenítése',
noSpeed: 'Sebesség nélküli szakasz',
unpaved: 'Burkolatlan szakasz',
showOnRoundabout: 'Megjelenítés körforgalomban',
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:',
ignore: 'Figyelmen kívül hagy',
show: 'Megjelenít',
focus: 'Fókuszál',
},
tooltip: {
showNoSpeed: `<u>Kihagyás</u> - Nem jelenít meg ikont sebesség nélküli szakaszokon;<br><u>Mutatás</u> - Ikont jelenít meg sebesség nélküli szakaszokon;<br><u>Fókusz</u> - Csak a sebesség nélküli szakaszokra fókuszál.`,
showOnUnpaved: `<u>Kihagyás</u> - Nem jelenít meg ikont burkolatlan szakaszokon;<br><u>Mutatás</u> - Ikont jelenít meg burkolatlan szakaszokon;<br><u>Fókusz</u> - Csak a burkolatlan szakaszokra fókuszál.`
},
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: {
resetSettings: 'Beállítások visszaállítása',
seeOnDiscuss: 'Nézd meg a vitában',
seeOnDiscord: 'Nézd meg Discordon',
scriptDevBy: 'A scriptet Luan Tavares fejlesztette',
}
};
break;
case 'id':
// Indonesian
translations = {
name: 'Tampilan Kecepatan',
zoomOut: 'Lebih jauh',
zoomIn: 'Lebih dekat',
changelog: 'Catatan perubahan',
changelogMessage: `<h6>Baru:</h6><ul style="margin-bottom: 10px"><li>Fitur baru untuk segmen tanpa kecepatan dan jalan tidak beraspal! Sekarang Anda bisa abaikan, tampilkan, atau fokus hanya pada segmen tersebut:<li>- Jika diabaikan, ikon tidak akan ditampilkan;<br>- Jika ditampilkan, ikon akan muncul seperti biasa;<br>- Jika difokuskan, hanya ikon yang sesuai kondisi yang akan muncul.<br></li></li><li>Penghitung filter aktif ditambahkan di judul tab "Filter" agar lebih mudah melihat filter mana yang aktif.</li></ul><h6>Perbaikan dan peningkatan:</h6><ul style="margin-bottom: 10px"><li>Checkbox lama "Tampilkan kecepatan di bundaran" diganti dengan sakelar.</li><li>Dibatasi jumlah percobaan pada loop yang ada di skrip.</li><li>Diperbaiki bug kecil pengecekan untuk lalu lintas kiri.</li><li>Perbaikan dan peningkatan kecil lainnya.</li></ul><h6>Masalah yang diketahui:</h6><ul><li>Kesalahan ".then" muncul saat skrip dijalankan setelah pembaruan WME. Penyebabnya belum diketahui, tetapi skrip tetap berjalan normal.</li><li>Kesalahan muncul saat tooltip dimuat. Karena kurangnya dokumentasi elemen native WME, tooltip menghasilkan error tetapi skrip tetap berjalan normal.</li></ul>`,
close: 'Tutup',
viewScript: 'Lihat skrip',
viewChangelog: 'Lihat catatan perubahan',
reset: 'Atur ulang',
snackbar: {
errorFiltering: 'Kesalahan dalam menerapkan filter. Kecepatan minimum tidak boleh lebih besar dari maksimum.',
},
title: {
settings: 'Pengaturan',
roadTypes: 'Tipe Jalan',
filter: 'Filter',
appearence: 'Tampilan',
showOnRoadType: 'Tampilkan pada tipe jalan berikut:',
seeOnDiscuss: 'Lihat thread skrip di Discuss',
seeOnDiscord: 'Lihat saluran skrip di server Discord Waze Script',
scriptDevBy: 'Lihat profil pengguna editor saya',
},
label: {
displaySpeeds: 'Tampilkan kecepatan',
noSpeed: 'Segmen tanpa kecepatan',
unpaved: 'Segmen tidak beraspal',
showOnRoundabout: 'Tampilkan di bundaran',
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:',
ignore: 'Abaikan',
show: 'Tampilkan',
focus: 'Fokus',
},
tooltip: {
showNoSpeed: `<u>Abaikan</u> - Tidak menampilkan ikon di segmen tanpa kecepatan;<br><u>Tampilkan</u> - Menampilkan ikon di segmen tanpa kecepatan;<br><u>Fokus</u> - Hanya menampilkan ikon di segmen tanpa kecepatan yang ditetapkan.`,
showOnUnpaved: `<u>Abaikan</u> - Tidak menampilkan ikon di segmen tidak beraspal;<br><u>Tampilkan</u> - Menampilkan ikon di segmen tidak beraspal;<br><u>Fokus</u> - Hanya menampilkan ikon di segmen tidak beraspal.`
},
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: {
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>Nuova funzione per segmenti senza velocità e non asfaltati! Ora puoi ignorarli, mostrarli o concentrarti solo su questi segmenti:<li>- Se ignori, non verranno generati icone;<br>- Se mostri, le icone verranno visualizzate normalmente;<br>- Se ti concentri, verranno visualizzate solo le icone che corrispondono alla condizione.<br></li></li><li>Aggiunto un contatore dei filtri attivi nel titolo della scheda "Filtri" per facilitare l'identificazione dei filtri attivi.</li></ul><h6>Correzioni e miglioramenti:</h6><ul style="margin-bottom: 10px"><li>La vecchia casella di controllo "Mostra velocità nelle rotatorie" è stata sostituita con un interruttore.</li><li>Aggiunto un limite di tentativi nei loop esistenti nello script.</li><li>Corretto un piccolo errore di verifica nei transiti a guida a sinistra.</li><li>Altre piccole correzioni e miglioramenti.</li></ul><h6>Problemi noti:</h6><ul><li>Si verifica un errore ".then" all'avvio dello script dopo l'aggiornamento del WME. La causa è ancora sconosciuta, ma lo script funziona normalmente.</li><li>Ci sono errori nei tooltip all'avvio. A causa della mancanza di documentazione per gli elementi nativi del framework WME, i tooltip generano un errore, ma lo script continua a funzionare normalmente.</li></ul>`,
close: 'Chiudi',
viewScript: 'Vedi script',
viewChangelog: 'Visualizza registro modifiche',
reset: 'Ripristina',
snackbar: {
errorFiltering: 'Errore nell’applicazione del filtro. La velocità minima non può essere maggiore della massima.',
},
title: {
settings: 'Impostazioni',
roadTypes: 'Tipi di strada',
filter: 'Filtro',
appearence: 'Aspetto',
showOnRoadType: 'Mostra sui seguenti tipi di strada:',
seeOnDiscuss: 'Vedi il thread dello script su Discuss',
seeOnDiscord: 'Vedi il canale dello script sul server Discord di Waze Script',
scriptDevBy: 'Visualizza il profilo utente del mio editor',
},
label: {
displaySpeeds: 'Visualizza velocità',
noSpeed: 'Segmento senza velocità',
unpaved: 'Segmento non asfaltato',
showOnRoundabout: 'Visualizza su rotatoria',
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:',
ignore: 'Ignora',
show: 'Mostra',
focus: 'Metti a fuoco',
},
tooltip: {
showNoSpeed: `<u>Ignora</u> - Non mostra l'icona sui segmenti senza velocità;<br><u>Mostra</u> - Mostra l'icona sui segmenti senza velocità;<br><u>Focalizza</u> - Mostra solo i segmenti senza velocità definita.`,
showOnUnpaved: `<u>Ignora</u> - Non mostra l'icona sui segmenti non asfaltati;<br><u>Mostra</u> - Mostra l'icona sui segmenti non asfaltati;<br><u>Focalizza</u> - Mostra solo i segmenti non asfaltati.`
},
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: {
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>- 無視する場合、アイコンは表示されません;<br>- 表示する場合、アイコンは通常通り表示されます;<br>- フォーカスする場合、条件に一致するアイコンのみが表示されます。<br></li></li><li>「フィルター」タブのタイトルにアクティブなフィルターのカウンターが追加され、どのフィルターが有効かがわかりやすくなりました。</li></ul><h6>修正と改善:</h6><ul style="margin-bottom: 10px"><li>以前の「ラウンドアバウトで速度を表示」チェックボックスがスイッチに置き換えられました。</li><li>スクリプト内の既存ループに試行回数の制限が追加されました。</li><li>左側通行の確認に関する小さなバグを修正しました。</li><li>その他の小さな修正と改善。</li></ul><h6>既知の問題:</h6><ul><li>WMEの更新後、スクリプト起動時に ".then" エラーが発生します。原因は不明ですが、スクリプトは通常通り動作します。</li><li>ツールチップ起動時にエラーが発生します。WMEのネイティブ要素のドキュメント不足により、ツールチップがエラーを生成しますが、スクリプトは正常に動作します。</li></ul>`,
close: '閉じる',
viewScript: 'スクリプトを見る',
viewChangelog: '変更履歴を見る',
reset: 'リセット',
snackbar: {
errorFiltering: 'フィルター適用エラー。最小速度が最大速度を超えることはできません。',
},
title: {
settings: '設定',
roadTypes: '道路タイプ',
filter: 'フィルター',
appearence: '外観',
showOnRoadType: '次の道路タイプに表示:',
seeOnDiscuss: 'Discussでスクリプトのスレッドを見る',
seeOnDiscord: 'Waze ScriptのDiscordサーバーでスクリプトのチャンネルを見る',
scriptDevBy: 'エディターのユーザープロフィールを表示',
},
label: {
displaySpeeds: '速度を表示',
noSpeed: '速度なしのセグメント',
unpaved: '未舗装のセグメント',
showOnRoundabout: 'ラウンドアバウトに表示',
maxZoom: 'ズーム最大:',
toggleLayerShortcut: '速度表示レイヤーを切り替える',
zIndex: 'レイヤーの深度',
hideShorterSegments: '次の長さ未満のセグメントを非表示:',
speedFilter: '速度でフィルタリング',
min: '最小:',
max: '最大:',
opacity: 'フィルターの不透明度レベル:',
ignore: '無視',
show: '表示',
focus: 'フォーカス',
},
tooltip: {
showNoSpeed: `<u>無視</u> - 速度がないセグメントにアイコンを表示しない;<br><u>表示</u> - 速度がないセグメントにアイコンを表示する;<br><u>フォーカス</u> - 速度が設定されていないセグメントのみにフォーカスする。`,
showOnUnpaved: `<u>無視</u> - 未舗装のセグメントにアイコンを表示しない;<br><u>表示</u> - 未舗装のセグメントにアイコンを表示する;<br><u>フォーカス</u> - 未舗装のセグメントのみにフォーカスする。`
},
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: {
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>- იგნორირებისას აიქონები არ გამოჩნდება;<br>- ჩვენებისას აიქონები ჩვეულებრივ გამოჩნდება;<br>- ფოკუსირებისას გამოჩნდება მხოლოდ პირობის შესაბამისი აიქონები.<br></li></li><li>დამატებულია აქტიური ფილტრების მრიცხველი „ფილტრები“ ჩანართის სათაურში, რათა მარტივად ნახოთ აქტიური ფილტრების რაოდენობა.</li></ul><h6>შესწორებები და გაუმჯობესებები:</h6><ul style="margin-bottom: 10px"><li>ძველი „სიჩქარის ჩვენება მრგვალabout-ში“ ჩეკბოქსი შეცვალა გადამრთველმა.</li><li>დამატებულია მცდელობების ლიმიტი არსებული ლუპებისთვის სკრიპტში.</li><li>გამოსწორდა მცირე შეცდომა მარცხენა მოძრაობის შემოწმებაში.</li><li>სხვა მცირე შესწორებები და გაუმჯობესებები.</li></ul><h6>ცნობილი პრობლემები:</h6><ul><li>არსებობს ".then" შეცდომა სკრიპტის გაშვებისას WME განახლების შემდეგ. მიზეზი უცნობია, მაგრამ სკრიპტი ნორმალურად მუშაობს.</li><li>არსებობს შეცდომები tooltip-ების ჩატვირთვისას. WME-ის ნატიური ელემენტების დოკუმენტაციის არარსებობის გამო, tooltip-ები წარმოქმნიან შეცდომას, მაგრამ სკრიპტი მაინც ნორმალურად მუშაობს.</li></ul>`,
close: 'დახურვა',
viewScript: 'იხილეთ სქრიპტი',
viewChangelog: 'შეცდომების ჩანაწერის ნახვა',
reset: 'გადატვირთვა',
snackbar: {
errorFiltering: 'შეცდომა ფილტრის გამოყენებისას. მინიმალური სიჩქარე არ შეიძლება იყოს მაქსიმალურ სიჩქარეზე მეტი.',
},
title: {
settings: 'პარამეტრები',
roadTypes: 'გზების ტიპები',
filter: 'ფილტრი',
appearence: 'გამოცხადება',
showOnRoadType: 'აჩვენე შემდეგი გზის ტიპებზე:',
seeOnDiscuss: 'იხილეთ სკრიპტის თემა Discuss-ზე',
seeOnDiscord: 'იხილეთ სკრიპტის არხი Waze Script-ის Discord სერვერზე',
scriptDevBy: 'ნახეთ ჩემი რედაქტორის მომხმარებლის პროფილი',
},
label: {
displaySpeeds: 'სისწრაფის ჩვენება',
noSpeed: 'სegmenti უსიჩქაროდ',
unpaved: 'უპირიპირკაპებული სეგმენტი',
showOnRoundabout: 'საკვანძო გზებზე ჩვენება',
maxZoom: 'ზუმის მაქსიმალური დონე:',
toggleLayerShortcut: 'სისწრაფის ფენის გადართვის ცხელი კლავიშები',
zIndex: 'ფენის სიღრმე',
hideShorterSegments: 'დამალვა, თუ სეგმენტი არის ამცირებელი:',
speedFilter: 'ფილტრი სიჩქარის მიხედვით',
min: 'მინიმუმ:',
max: 'მაქსიმუმ:',
opacity: 'ფილტრის გამჭვირვალობის დონე:',
ignore: 'Გაუფრთხილდი',
show: 'Ჩვენება',
focus: 'ფოკუსირება',
},
tooltip: {
showNoSpeed: `<u>იგნორი</u> - არ აჩვენებს ხატულას სიჩქარის გარეშე სეგმენტებზე;<br><u>ჩვენება</u> - აჩვენებს ხატულას სიჩქარის გარეშე სეგმენტებზე;<br><u>ფოკუსი</u> - ფოკუსირდება მხოლოდ სეგმენტებზე, რომლებსაც არ აქვთ განსაზღვრული სიჩქარე.`,
showOnUnpaved: `<u>იგნორი</u> - არ აჩვენებს ხატულას დაუკ paved სეგმენტებზე;<br><u>ჩვენება</u> - აჩვენებს ხატულას დაუკ paved სეგმენტებზე;<br><u>ფოკუსი</u> - ფოკუსირდება მხოლოდ დაუკ paved სეგმენტებზე.`
},
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: {
resetSettings: 'პარამეტრების გადატვირთვა',
seeOnDiscuss: 'იხილეთ განხილვაში',
seeOnDiscord: 'იხილეთ Discord-ზე',
scriptDevBy: 'სკრიპტი გამოიმუშავა ლუან ტავარესმა',
}
};
break;
case 'ko':
// Korean
translations = {
name: '속도 표시',
zoomOut: '줌 아웃',
zoomIn: '줌 인',
changelog: '변경 기록',
changelogMessage: `<h6>새로운 기능:</h6><ul style="margin-bottom: 10px"><li>속도가 없거나 포장되지 않은 구간을 위한 새로운 기능! 이제 무시, 표시 또는 해당 구간만 집중해서 볼 수 있습니다:<li>- 무시하면 아이콘이 표시되지 않습니다;<br>- 표시하면 아이콘이 정상적으로 표시됩니다;<br>- 집중하면 조건에 맞는 아이콘만 표시됩니다.<br></li></li><li>필터 탭 제목에 활성 필터 수가 표시되어 활성 필터를 쉽게 식별할 수 있습니다.</li></ul><h6>수정 및 개선:</h6><ul style="margin-bottom: 10px"><li>기존의 "회전 교차로에서 속도 표시" 체크박스가 스위치로 대체되었습니다.</li><li>스크립트의 기존 루프에 시도 횟수 제한이 추가되었습니다.</li><li>좌측통행 확인 시의 작은 오류가 수정되었습니다.</li><li>기타 작은 수정 및 개선 사항.</li></ul><h6>알려진 문제:</h6><ul><li>WME 업데이트 이후 스크립트 실행 시 ".then" 오류가 발생합니다. 원인은 아직 알려지지 않았지만 스크립트는 정상 작동합니다.</li><li>툴팁 로드 시 오류가 발생합니다. WME의 기본 요소에 대한 문서가 부족하여 툴팁이 오류를 발생시키지만 스크립트는 정상 작동합니다.</li></ul>`,
close: '닫기',
viewScript: '스크립트 보기',
viewChangelog: '변경 기록 보기',
reset: '초기화',
snackbar: {
errorFiltering: '필터 적용 오류. 최소 속도가 최대 속도보다 클 수 없습니다.',
},
title: {
settings: '설정',
roadTypes: '도로 유형',
filter: '필터',
appearence: '모양',
showOnRoadType: '다음 도로 유형에서 표시:',
seeOnDiscuss: 'Discuss에서 스크립트 스레드 보기',
seeOnDiscord: 'Waze Script Discord 서버에서 스크립트 채널 보기',
scriptDevBy: '내 편집기 사용자 프로필 보기',
},
label: {
displaySpeeds: '속도 표시',
noSpeed: '속도가 없는 구간',
unpaved: '비포장 구간',
showOnRoundabout: '로터리에서 표시',
maxZoom: '최대 줌:',
toggleLayerShortcut: '속도 레이어 전환 단축키',
zIndex: '레이어 깊이',
hideShorterSegments: '이보다 짧은 세그먼트 숨기기',
speedFilter: '속도 필터',
min: '최소:',
max: '최대:',
opacity: '필터 불투명도 수준:',
ignore: '무시',
show: '표시',
focus: '포커스',
},
tooltip: {
showNoSpeed: `<u>무시</u> - 속도가 없는 구간에 아이콘을 표시하지 않음;<br><u>표시</u> - 속도가 없는 구간에 아이콘을 표시함;<br><u>포커스</u> - 속도가 설정되지 않은 구간에만 집중 표시.`,
showOnUnpaved: `<u>무시</u> - 비포장 구간에 아이콘을 표시하지 않음;<br><u>표시</u> - 비포장 구간에 아이콘을 표시함;<br><u>포커스</u> - 비포장 구간에만 집중 표시.`
},
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: {
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>Naujienos:</h6><ul style="margin-bottom: 10px"><li>Nauja funkcija segmentams be greičio ir neasfaltuotiems keliams! Dabar galite ignoruoti, rodyti arba sutelkti dėmesį tik į tokius segmentus:<li>- Ignoruojant, piktogramos nebus rodomos;<br>- Rodymo atveju piktogramos bus rodomos kaip įprasta;<br>- Sutelkiant dėmesį, bus rodomos tik sąlygą atitinkančios piktogramos.<br></li></li><li>Pridėtas aktyvių filtrų skaitiklis prie skirtuko „Filtrai“ pavadinimo, kad būtų lengviau atpažinti aktyvius filtrus.</li></ul><h6>Taisymas ir patobulinimai:</h6><ul style="margin-bottom: 10px"><li>Senas „Rodyti greitį žiede“ žymimasis laukelis buvo pakeistas jungikliu.</li><li>Pridėtas bandymų limitas esamose kilpose skripte.</li><li>Ištaisyta nedidelė kairiojo eismo patikros klaida.</li><li>Kiti smulkūs taisymai ir patobulinimai.</li></ul><h6>Žinomos problemos:</h6><ul><li>Po WME atnaujinimo skripto paleidimo metu rodomas „.then“ klaidos pranešimas. Priežastis nežinoma, bet skriptas veikia įprastai.</li><li>Įkeliant patarimus atsiranda klaidų. Dėl WME pagrindinių elementų dokumentacijos trūkumo patarimai sukelia klaidą, bet skriptas vis tiek veikia normaliai.</li></ul>`,
close: 'Uždaryti',
viewScript: 'Peržiūrėti scenarijų',
viewChangelog: 'Peržiūrėti pakeitimų žurnalą',
reset: 'Atstatyti',
snackbar: {
errorFiltering: 'Klaida taikant filtrą. Mažiausias greitis negali būti didesnis nei didžiausias.',
},
title: {
settings: 'Nustatymai',
roadTypes: 'Kelio tipai',
filter: 'Filtras',
appearence: 'Išvaizda',
showOnRoadType: 'Rodyti šiuose kelio tipuose:',
seeOnDiscuss: 'Žiūrėkite scenarijaus temą Discuss',
seeOnDiscord: 'Žiūrėkite scenarijaus kanalą Waze Script Discord serveryje',
scriptDevBy: 'Peržiūrėkite mano redaktoriaus naudotojo profilį',
},
label: {
displaySpeeds: 'Rodyti greičius',
noSpeed: 'Segmentas be greičio',
unpaved: 'Neasfaltuotas segmentas',
showOnRoundabout: 'Rodyti žiedinėse sankryžose',
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:',
ignore: 'Nepaisyti',
show: 'Rodyti',
focus: 'Fokusuoti',
},
tooltip: {
showNoSpeed: `<u>Nepaisyti</u> - Nerodo piktogramos be greičio segmentuose;<br><u>Rodyti</u> - Rodo piktogramą be greičio segmentuose;<br><u>Sufokusuoti</u> - Fokusuoja tik segmentus be nustatyto greičio.`,
showOnUnpaved: `<u>Nepaisyti</u> - Nerodo piktogramos neasfaltuotuose segmentuose;<br><u>Rodyti</u> - Rodo piktogramą neasfaltuotuose segmentuose;<br><u>Sufokusuoti</u> - Fokusuoja tik neasfaltuotus segmentus.`
},
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: {
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>Jauna funkcija segmentiem bez ātruma un neasfaltētiem segmentiem! Tagad var ignorēt, rādīt vai fokusēt tikai uz šiem segmentiem:<li>- Ignorējot, ikonas netiks parādītas;<br>- Rādot, ikonas tiks parādītas kā parasti;<br>- Fokusējot, tiks parādītas tikai ikonas, kas atbilst nosacījumam.<br></li></li><li>Pievienots aktīvo filtru skaitītājs cilnes „Filtri” nosaukumā, lai viegli redzētu aktīvos filtrus.</li></ul><h6>Labošana un uzlabojumi:</h6><ul style="margin-bottom: 10px"><li>Vecā izvēles rūtiņa „Rādīt ātrumu rotācijas aplī” aizstāta ar slēdzi.</li><li>Pievienots mēģinājumu ierobežojums skripta esošajām cilpām.</li><li>Labots neliels kreisās satiksmes pārbaudes kļūdas.</li><li>Citi nelieli labojumi un uzlabojumi.</li></ul><h6>Zināmās problēmas:</h6><ul><li>Pēc WME atjaunināšanas skripta palaišanas laikā parādās „.then” kļūda. Iemesls nav zināms, bet skripts darbojas normāli.</li><li>Padomdevēju ielādēšanas laikā rodas kļūdas. Dokumentācijas trūkuma dēļ par WME vietējiem elementiem padomdevēji rada kļūdu, bet skripts darbojas kā parasti.</li></ul>`,
close: 'Aizvērt',
viewScript: 'Skatīt Skriptu',
viewChangelog: 'Skatīt Izmaiņu Žurnālu',
reset: 'Atiestatīt',
snackbar: {
errorFiltering: 'Kļūda, lietojot filtru. Minimālais ātrums nevar būt lielāks par maksimālo.',
},
title: {
settings: 'Iestatījumi',
roadTypes: 'Ceļa tipi',
filter: 'Filtrs',
appearence: 'Izskats',
showOnRoadType: 'Rādīt šādos ceļa tipos:',
seeOnDiscuss: 'Skatīt skripta pavedienu Discuss',
seeOnDiscord: 'Skatīt skripta kanālu Waze Script Discord serverī',
scriptDevBy: 'Skatīt manu redaktora lietotāja profilu',
},
label: {
displaySpeeds: 'Rādīt ātrumus',
noSpeed: 'Segmens bez ātruma',
unpaved: 'Neasfaltēts segmens',
showOnRoundabout: 'Rādīt aplī',
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:',
ignore: 'Ignorēt',
show: 'Rādīt',
focus: 'Fokusēt',
},
tooltip: {
showNoSpeed: `<u>Ignorēt</u> - Nerādīt ikonu segmentos bez ātruma;<br><u>Rādīt</u> - Rādīt ikonu segmentos bez ātruma;<br><u>Fokusēt</u> - Fokusēt tikai segmentus bez noteikta ātruma.`,
showOnUnpaved: `<u>Ignorēt</u> - Nerādīt ikonu neasfaltētos segmentos;<br><u>Rādīt</u> - Rādīt ikonu neasfaltētos segmentos;<br><u>Fokusēt</u> - Fokusēt tikai neasfaltētus segmentus.`
},
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: {
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>Baru:</h6><ul style="margin-bottom: 10px"><li>Fungsi baru untuk segmen tanpa kelajuan dan jalan tidak berturap! Kini anda boleh abaikan, paparkan atau fokus hanya pada segmen tersebut:<li>- Jika abaikan, ikon tidak akan dipaparkan;<br>- Jika paparkan, ikon akan muncul seperti biasa;<br>- Jika fokus, hanya ikon yang memenuhi syarat akan dipaparkan.<br></li></li><li>Kiraan penapis aktif telah ditambah pada tajuk tab "Penapis" untuk memudahkan mengenalpasti penapis yang aktif.</li></ul><h6>Pembaikan dan penambahbaikan:</h6><ul style="margin-bottom: 10px"><li>Kotak semak lama "Papar kelajuan dalam bulatan" telah digantikan dengan suis.</li><li>Had cubaan telah ditambah dalam gelung sedia ada dalam skrip.</li><li>Pembaikan kecil untuk semakan lalu lintas kiri.</li><li>Pembaikan dan penambahbaikan kecil lain.</li></ul><h6>Isu diketahui:</h6><ul><li>Ralat ".then" muncul semasa memulakan skrip selepas kemas kini WME. Puncanya masih tidak diketahui, tetapi skrip berfungsi seperti biasa.</li><li>Ralat timbul semasa memuatkan tooltip. Disebabkan kekurangan dokumentasi elemen native WME, tooltip menghasilkan ralat tetapi skrip masih berjalan seperti biasa.</li></ul>`,
close: 'Tutup',
viewScript: 'Lihat Skrip',
viewChangelog: 'Lihat Log Perubahan',
reset: 'Tetapkan Semula',
snackbar: {
errorFiltering: 'Ralat semasa menggunakan penapis. Kelajuan minimum tidak boleh melebihi maksimum.',
},
title: {
settings: 'Tetapan',
roadTypes: 'Jenis Jalan',
filter: 'Penapis',
appearence: 'Penampilan',
showOnRoadType: 'Tunjukkan pada jenis jalan berikut:',
seeOnDiscuss: 'Lihat thread skrip di Discuss',
seeOnDiscord: 'Lihat saluran skrip di pelayan Discord Waze Script',
scriptDevBy: 'Lihat profil pengguna editor saya',
},
label: {
displaySpeeds: 'Papar kelajuan',
noSpeed: 'Segmen tanpa kelajuan',
unpaved: 'Segmen tidak berturap',
showOnRoundabout: 'Papar pada bulatan',
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:',
ignore: 'Abaikan',
show: 'Tunjukkan',
focus: 'Fokus',
},
tooltip: {
showNoSpeed: `<u>Abaikan</u> - Tidak memaparkan ikon pada segmen tanpa kelajuan;<br><u>Papar</u> - Memaparkan ikon pada segmen tanpa kelajuan;<br><u>Fokus</u> - Hanya memaparkan ikon pada segmen tanpa kelajuan ditetapkan.`,
showOnUnpaved: `<u>Abaikan</u> - Tidak memaparkan ikon pada segmen tidak berturap;<br><u>Papar</u> - Memaparkan ikon pada segmen tidak berturap;<br><u>Fokus</u> - Hanya memaparkan ikon pada segmen tidak berturap.`
},
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: {
resetSettings: 'Tetapkan Semula Tetapan',
seeOnDiscuss: 'Lihat dalam perbincangan',
seeOnDiscord: 'Lihat di Discord',
scriptDevBy: 'Skrip dibangunkan oleh Luan Tavares',
}
};
break;
case 'nl':
// Dutch
translations = {
name: 'Snelheidsweergave',
zoomOut: 'Uitzoomen',
zoomIn: 'Inzoomen',
changelog: 'Wijzigingslog',
changelogMessage: `<h6>Nieuw:</h6><ul style="margin-bottom: 10px"><li>Nieuwe functie voor segmenten zonder snelheid en onverharde wegen! Nu kun je negeren, tonen of alleen op deze segmenten focussen:<li>- Bij negeren worden er geen iconen weergegeven;<br>- Bij tonen worden iconen normaal getoond;<br>- Bij focussen worden alleen iconen getoond die aan de voorwaarde voldoen.<br></li></li><li>Een teller voor actieve filters is toegevoegd aan de titel van het tabblad "Filters" om gemakkelijker actieve filters te herkennen.</li></ul><h6>Fixes en verbeteringen:</h6><ul style="margin-bottom: 10px"><li>De oude checkbox "Snelheid tonen in rotonde" is vervangen door een schakelaar.</li><li>Er is een limiet toegevoegd aan het aantal pogingen in bestaande lussen in het script.</li><li>Een kleine fout in de controle van links verkeer is opgelost.</li><li>Andere kleine fixes en verbeteringen.</li></ul><h6>Bekende problemen:</h6><ul><li>Er verschijnt een ".then"-fout bij het starten van het script na een WME-update. De oorzaak is onbekend, maar het script werkt normaal.</li><li>Er treden fouten op bij het initialiseren van tooltips. Door gebrek aan documentatie over native WME-elementen veroorzaken de tooltips een fout, maar het script werkt verder normaal.</li></ul>`,
close: 'Sluiten',
viewScript: 'Bekijk script',
viewChangelog: 'Bekijk wijzigingslog',
reset: 'Reset',
snackbar: {
errorFiltering: 'Fout bij het toepassen van het filter. De minimale snelheid kan niet groter zijn dan de maximale.',
},
title: {
settings: 'Instellingen',
roadTypes: 'Wegtypen',
filter: 'Filter',
appearence: 'Uiterlijk',
showOnRoadType: 'Weergeven op de volgende wegtypen:',
seeOnDiscuss: 'Bekijk de thread van het script op Discuss',
seeOnDiscord: 'Bekijk het kanaal van het script op de Waze Script Discord-server',
scriptDevBy: 'Bekijk mijn editor gebruikersprofiel',
},
label: {
displaySpeeds: 'Toon snelheden',
noSpeed: 'Segment zonder snelheid',
unpaved: 'Onverhard segment',
showOnRoundabout: 'Weergeven op rotonde',
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:',
ignore: 'Negeren',
show: 'Tonen',
focus: 'Focussen',
},
tooltip: {
showNoSpeed: `<u>Negeren</u> - Geen pictogram tonen op segmenten zonder snelheid;<br><u>Tonen</u> - Pictogram tonen op segmenten zonder snelheid;<br><u>Focussen</u> - Alleen pictogrammen tonen op segmenten zonder ingestelde snelheid.`,
showOnUnpaved: `<u>Negeren</u> - Geen pictogram tonen op onverharde segmenten;<br><u>Tonen</u> - Pictogram tonen op onverharde segmenten;<br><u>Focussen</u> - Alleen pictogrammen tonen op onverharde segmenten.`
},
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: {
resetSettings: 'Herstel instellingen',
seeOnDiscuss: 'Zie op Discussie',
seeOnDiscord: 'Zie op Discord',
scriptDevBy: 'Script ontwikkeld door Luan Tavares',
}
};
break;
case 'no':
// Norwegian
translations = {
name: 'Hastighetsvisning',
zoomOut: 'Zoom ut',
zoomIn: 'Zoom inn',
changelog: 'Endringslogg',
changelogMessage: `<h6>Nytt:</h6><ul style="margin-bottom: 10px"><li>Ny funksjon for segmenter uten hastighet og ubelagte segmenter! Nå kan du ignorere, vise eller fokusere kun på disse segmentene:<li>- Hvis du ignorerer, vil ingen ikoner vises;<br>- Hvis du viser, vil ikonene vises som vanlig;<br>- Hvis du fokuserer, vises kun ikoner som oppfyller betingelsen.<br></li></li><li>En teller for aktive filtre er lagt til i tittelen på "Filtre"-fanen for å gjøre det lettere å se når filtre er aktive.</li></ul><h6>Fikser og forbedringer:</h6><ul style="margin-bottom: 10px"><li>Den gamle avkrysningsboksen "Vis hastighet i rundkjøring" er erstattet med en bryter.</li><li>Det er lagt til et forsøkstak i eksisterende løkker i skriptet.</li><li>En liten feil i kontrollen for venstrekjøring er rettet.</li><li>Andre små fikser og forbedringer.</li></ul><h6>Kjente problemer:</h6><ul><li>Det oppstår en ".then"-feil når skriptet starter etter en WME-oppdatering. Årsaken er ukjent, men skriptet fungerer som normalt.</li><li>Det oppstår feil i verktøytipsene ved oppstart. Manglende dokumentasjon for WME-native elementer gjør at verktøytipsene gir feil, men skriptet fungerer som normalt.</li></ul>`,
close: 'Lukk',
viewScript: 'Se skript',
viewChangelog: 'Vis endringslogg',
reset: 'Tilbakestill',
snackbar: {
errorFiltering: 'Feil ved bruk av filter. Minimumshastighet kan ikke være større enn maksimum.',
},
title: {
settings: 'Innstillinger',
roadTypes: 'Vei typer',
filter: 'Filter',
appearence: 'Utseende',
showOnRoadType: 'Vis på følgende veit typer:',
seeOnDiscuss: 'Se tråden for skriptet på Discuss',
seeOnDiscord: 'Se skriptets kanal på Waze Script Discord-serveren',
scriptDevBy: 'Se min editor brukerprofil',
},
label: {
displaySpeeds: 'Vis hastigheter',
noSpeed: 'Segment uten hastighet',
unpaved: 'Uasfaltert segment',
showOnRoundabout: 'Vis på rundkjøring',
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å:',
ignore: 'Ignorer',
show: 'Vis',
focus: 'Fokus',
},
tooltip: {
showNoSpeed: `<u>Ignorer</u> - Viser ikke ikon på segmenter uten fartsgrense;<br><u>Vis</u> - Viser ikon på segmenter uten fartsgrense;<br><u>Fokuser</u> - Fokuserer bare på segmenter uten angitt fartsgrense.`,
showOnUnpaved: `<u>Ignorer</u> - Viser ikke ikon på grusveier;<br><u>Vis</u> - Viser ikon på grusveier;<br><u>Fokuser</u> - Fokuserer bare på grusveier.`
},
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: {
resetSettings: 'Tilbakestill innstillinger',
seeOnDiscuss: 'Se på diskusjonen',
seeOnDiscord: 'Se på Discord',
scriptDevBy: 'Script utviklet av Luan Tavares',
}
};
break;
case 'pl':
// Polish
translations = {
name: 'Wyświetlanie prędkości',
zoomOut: 'Oddal',
zoomIn: 'Przybliż',
changelog: 'Dziennik zmian',
changelogMessage: `<h6>Nowości:</h6><ul style="margin-bottom: 10px"><li>Nowa funkcja dla segmentów bez prędkości i nieutwardzonych! Teraz możesz je ignorować, wyświetlać lub skupić się tylko na tych segmentach:<li>- Jeśli zignorujesz, ikony nie będą wyświetlane;<br>- Jeśli wyświetlisz, ikony będą widoczne jak zwykle;<br>- Jeśli skupisz się, wyświetlane będą tylko ikony spełniające warunek.<br></li></li><li>Dodano licznik aktywnych filtrów w tytule zakładki „Filtry”, aby łatwiej rozpoznać, kiedy filtry są aktywne.</li></ul><h6>Poprawki i ulepszenia:</h6><ul style="margin-bottom: 10px"><li>Stary checkbox „Pokaż prędkość na rondzie” został zastąpiony przełącznikiem.</li><li>Dodano limit prób w istniejących pętlach w skrypcie.</li><li>Naprawiono drobny błąd w sprawdzaniu ruchu lewostronnego.</li><li>Inne drobne poprawki i usprawnienia.</li></ul><h6>Znane problemy:</h6><ul><li>Pojawia się błąd „.then” podczas uruchamiania skryptu po aktualizacji WME. Przyczyna jest nieznana, ale skrypt działa normalnie.</li><li>Przy uruchamianiu pojawiają się błędy w dymkach narzędziowych. Brak dokumentacji natywnych elementów WME powoduje ten błąd, ale skrypt działa normalnie.</li></ul>`,
close: 'Zamknij',
viewScript: 'Zobacz skrypt',
viewChangelog: 'Zobacz dziennik zmian',
reset: 'Resetuj',
snackbar: {
errorFiltering: 'Błąd podczas stosowania filtra. Minimalna prędkość nie może być większa niż maksymalna.',
},
title: {
settings: 'Ustawienia',
roadTypes: 'Rodzaje dróg',
filter: 'Filtr',
appearence: 'Wygląd',
showOnRoadType: 'Pokaż na następujących rodzajach dróg:',
seeOnDiscuss: 'Zobacz wątek skryptu na Discuss',
seeOnDiscord: 'Zobacz kanał skryptu na serwerze Discord Waze Script',
scriptDevBy: 'Zobacz mój profil użytkownika edytora',
},
label: {
displaySpeeds: 'Pokaż prędkości',
noSpeed: 'Odcinek bez prędkości',
unpaved: 'Odcinek nieutwardzony',
showOnRoundabout: 'Pokaż na rondzie',
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:',
ignore: 'Ignoruj',
show: 'Pokaż',
focus: 'Skup',
},
tooltip: {
showNoSpeed: `<u>Ignoruj</u> - Nie wyświetla ikony na odcinkach bez prędkości;<br><u>Pokaż</u> - Wyświetla ikonę na odcinkach bez prędkości;<br><u>Skup się</u> - Skupia się tylko na odcinkach bez ustawionej prędkości.`,
showOnUnpaved: `<u>Ignoruj</u> - Nie wyświetla ikony na nieutwardzonych odcinkach;<br><u>Pokaż</u> - Wyświetla ikonę na nieutwardzonych odcinkach;<br><u>Skup się</u> - Skupia się tylko na nieutwardzonych odcinkach.`
},
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: {
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>Nova função para segmentos sem velocidade e não pavimentado! Agora é possível ignorar, exibir ou focar em segmentos sem velocidade e/ou não pavimentados:<li>- Ao ignorar, ícones não serão gerados nos respectivos segmentos;<br>- Ao exibir, ícones serão gerados normalmente;<br>- Ao focar, somente ícones que se encaixam na condição serão exibidos.<br></li></li><li>Foi adicionado também um contador de filtros ativos no título da aba "filtros", assim facilitando a identificação de quando existirem filtros ativos.</li></ul><h6>Correções e melhorias:</h6><ul style="margin-bottom: 10px"><li>O antigo checkbox de "Exibir velocidade em rotatória" foi substituído por um switch;</li><li>Adicionado limite de tentativas em loops existentes pelo script;</li><li>Corrigido uma pequena falha de verificação em trânsitos de mão-esquerda;</li><li>Outras pequenas correções e melhorias.</li></ul><h6>Problemas conhecidos:</h6><ul><li>Existe um erro ".then" ao iniciar o script que surgiu após a atualização do WME. A causa ainda é desconhecida, porém o script flui normalmente;</li><li>Existem erros dos tooltips ao iniciá-los. Devido a falta de documentação para utilização de elementos nativos do framework do WME, os tooltips adicionados estão gerando um erro. Porém, assim como o outro erro, o script flui normalmente.</li></ul>`,
close: 'Fechar',
viewScript: 'Ver script',
viewChangelog: 'Visualizar o registro de alterações',
reset: 'Redefinir',
snackbar: {
errorFiltering: 'Erro ao aplicar o filtro. A velocidade mínima não pode ser maior que a máxima.',
},
title: {
settings: 'Ajustes',
roadTypes: 'Tipos de via',
filter: 'Filtro',
appearence: 'Aparência',
showOnRoadType: 'Exibir nos seguintes tipos de via:',
seeOnDiscuss: 'Veja o tópico do script no Discuss',
seeOnDiscord: 'Veja o canal do script no servidor Discord do Waze Script',
scriptDevBy: 'Veja o meu perfil de usuário do editor',
},
label: {
displaySpeeds: 'Exibir velocidades',
noSpeed: 'Segmento sem velocidade',
unpaved: 'Segmento não pavimentado',
showOnRoundabout: 'Exibir em rotatória',
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:',
ignore: 'Ignorar',
show: 'Exibir',
focus: 'Focar',
},
tooltip: {
showNoSpeed: `<u>Ignorar</u> - Não renderiza ícone nos segmentos sem velocidade;<br><u>Exibir</u> - Renderiza ícone nos segmentos sem velocidade;<br><u>Focar</u> - Foca a renderização de ícones apenas nos segmentos que não tem velocidade definida.`,
showOnUnpaved: `<u>Ignorar</u> - Não renderiza ícone nos segmentos não pavimentados;<br><u>Exibir</u> - Renderiza ícone nos segmentos não pavimentados;<br><u>Focar</u> - Foca a renderização de ícones apenas nos segmentos não pavimentados.`,
},
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: {
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>Nova função para segmentos sem velocidade e não pavimentados! Agora é possível ignorar, exibir ou focar apenas nesses segmentos:<li>- Ignorar: ícones não são gerados;<br>- Exibir: ícones são exibidos normalmente;<br>- Focar: apenas ícones que correspondem à condição são exibidos.<br></li></li><li>Adicionado contador de filtros ativos no título do separador "Filtros" para identificar mais facilmente quando há filtros ativos.</li></ul><h6>Correcções e melhorias:</h6><ul style="margin-bottom: 10px"><li>A antiga caixa de verificação "Exibir velocidade em rotunda" foi substituída por um interruptor.</li><li>Adicionado limite de tentativas em ciclos existentes no script.</li><li>Corrigido pequeno erro na verificação de trânsito de mão esquerda.</li><li>Outras pequenas correcções e melhorias.</li></ul><h6>Problemas conhecidos:</h6><ul><li>Erro ".then" ao iniciar o script após a atualização do WME. A causa é desconhecida, mas o script funciona normalmente.</li><li>Erros nos tooltips ao iniciar. Devido à falta de documentação para elementos nativos do WME, os tooltips geram erro mas o script funciona normalmente.</li></ul>`,
close: 'Fechar',
viewScript: 'Ver script',
viewChangelog: 'Visualizar o registo de alterações',
reset: 'Redefinir',
snackbar: {
errorFiltering: 'Erro ao aplicar o filtro. A velocidade mínima não pode ser superior à máxima.',
},
title: {
settings: 'Ajustes',
roadTypes: 'Tipos de estrada',
filter: 'Filtro',
appearence: 'Aparência',
showOnRoadType: 'Mostrar nos seguintes tipos de estrada:',
seeOnDiscuss: 'Veja o tópico do script no Discuss',
seeOnDiscord: 'Veja o canal do script no servidor Discord do Waze Script',
scriptDevBy: 'Veja o meu perfil de utilizador do editor',
},
label: {
displaySpeeds: 'Exibir velocidades',
noSpeed: 'Segmento sem velocidade',
unpaved: 'Segmento não pavimentado',
showOnRoundabout: 'Exibir em rotunda',
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:',
ignore: 'Ignorar',
show: 'Exibir',
focus: 'Focar',
},
tooltip: {
showNoSpeed: `<u>Ignorar</u> - Não mostra ícone em segmentos sem velocidade;<br><u>Mostrar</u> - Mostra ícone em segmentos sem velocidade;<br><u>Focar</u> - Foca só nos segmentos sem velocidade definida.`,
showOnUnpaved: `<u>Ignorar</u> - Não mostra ícone em segmentos não pavimentados;<br><u>Mostrar</u> - Mostra ícone em segmentos não pavimentados;<br><u>Focar</u> - Foca só nos segmentos não pavimentados.`
},
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: {
resetSettings: 'Redefinir configurações',
seeOnDiscuss: 'Ver no Discuss',
seeOnDiscord: 'Ver no Discord',
scriptDevBy: 'Script desenvolvido por Luan Tavares',
}
};
break;
case 'ro':
// Romanian
translations = {
name: 'Afișarea vitezei',
zoomOut: 'Mai departe',
zoomIn: 'Mai aproape',
changelog: 'Jurnalul modificărilor',
changelogMessage: `<h6>Noutăți:</h6><ul style="margin-bottom: 10px"><li>Funcție nouă pentru segmente fără viteză și drumuri nepavate! Acum poți ignora, afișa sau focaliza doar aceste segmente:<li>- Ignorând, nu vor fi generate pictograme;<br>- Afișând, pictogramele vor fi vizibile normal;<br>- Focalizând, doar pictogramele care îndeplinesc condiția vor fi afișate.<br></li></li><li>Contorul de filtre active a fost adăugat în titlul filei „Filtre” pentru o identificare mai ușoară a filtrelor active.</li></ul><h6>Corecturi și îmbunătățiri:</h6><ul style="margin-bottom: 10px"><li>Vechea bifă „Afișează viteza în sens giratoriu” a fost înlocuită cu un comutator.</li><li>A fost adăugată o limită de încercări în buclele existente din script.</li><li>A fost corectată o eroare minoră în verificarea traficului pe partea stângă.</li><li>Alte corecturi și îmbunătățiri minore.</li></ul><h6>Probleme cunoscute:</h6><ul><li>Se produce o eroare „.then” la pornirea scriptului după actualizarea WME. Cauza este necunoscută, dar scriptul funcționează normal.</li><li>Erori la încărcarea tooltip-urilor. Din cauza lipsei de documentație pentru elementele native WME, tooltip-urile generează eroare, dar scriptul continuă să funcționeze normal.</li></ul>`,
close: 'Închide',
viewScript: 'Vezi scriptul',
viewChangelog: 'Vizualizează jurnalul modificărilor',
reset: 'Resetează',
snackbar: {
errorFiltering: 'Eroare la aplicarea filtrului. Viteza minimă nu poate fi mai mare decât viteza maximă.',
},
title: {
settings: 'Setări',
roadTypes: 'Tipuri de drumuri',
filter: 'Filtru',
appearence: 'Aparență',
showOnRoadType: 'Afișați pe următoarele tipuri de drumuri:',
seeOnDiscuss: 'Vezi firul scriptului pe Discuss',
seeOnDiscord: 'Vezi canalul scriptului pe serverul Discord Waze Script',
scriptDevBy: 'Vizualizează profilul meu de utilizator editor',
},
label: {
displaySpeeds: 'Afișează vitezele',
noSpeed: 'Segment fără viteză',
unpaved: 'Segment nepavat',
showOnRoundabout: 'Afișează pe sens giratoriu',
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:',
ignore: 'Ignoră',
show: 'Afișează',
focus: 'Focalizează',
},
tooltip: {
showNoSpeed: `<u>Ignoră</u> - Nu afișează pictograma pe segmente fără viteză;<br><u>Afișează</u> - Afișează pictograma pe segmente fără viteză;<br><u>Focalizează</u> - Focalizează doar segmentele fără viteză definită.`,
showOnUnpaved: `<u>Ignoră</u> - Nu afișează pictograma pe segmente neasfaltate;<br><u>Afișează</u> - Afișează pictograma pe segmente neasfaltate;<br><u>Focalizează</u> - Focalizează doar segmentele neasfaltate.`
},
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: {
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>- При игнорировании иконки не будут отображаться;<br>- При отображении иконки будут показаны как обычно;<br>- При фокусировании будут отображаться только иконки, которые соответствуют условию.<br></li></li><li>Добавлен счетчик активных фильтров в заголовок вкладки «Фильтры» для удобного контроля.</li></ul><h6>Исправления и улучшения:</h6><ul style="margin-bottom: 10px"><li>Старый флажок «Показывать скорость на круговом движении» заменен на переключатель.</li><li>Добавлено ограничение количества попыток в циклах скрипта.</li><li>Исправлена небольшая ошибка проверки для стран с левосторонним движением.</li><li>Другие мелкие исправления и улучшения.</li></ul><h6>Известные проблемы:</h6><ul><li>Возникает ошибка «.then» при запуске скрипта после обновления WME. Причина неизвестна, но скрипт работает нормально.</li><li>Возникают ошибки при инициализации подсказок. Из-за отсутствия документации по элементам WME возникают ошибки, но скрипт продолжает работать нормально.</li></ul>`,
close: 'Закрыть',
viewScript: 'Посмотреть скрипт',
viewChangelog: 'Просмотреть журнал изменений',
reset: 'Сбросить',
snackbar: {
errorFiltering: 'Ошибка применения фильтра. Минимальная скорость не может быть больше максимальной.',
},
title: {
settings: 'Настройки',
roadTypes: 'Типы дорог',
filter: 'Фильтр',
appearence: 'Внешний вид',
showOnRoadType: 'Показать на следующих типах дорог:',
seeOnDiscuss: 'Посмотреть тему скрипта на Discuss',
seeOnDiscord: 'Посмотреть канал скрипта на сервере Discord Waze Script',
scriptDevBy: 'Посмотреть мой профиль пользователя редактора',
},
label: {
displaySpeeds: 'Отображать скорости',
noSpeed: 'Сегмент без скорости',
unpaved: 'Неасфальтированный сегмент',
showOnRoundabout: 'Отображать на круговых развязках',
maxZoom: 'Отображать до уровня зума:',
toggleLayerShortcut: 'Переключить слой отображения скорости',
zIndex: 'Глубина слоя',
hideShorterSegments: 'Скрывать на сегментах короче чем',
speedFilter: 'Фильтровать по скорости',
min: 'Мин.:',
max: 'Макс.:',
opacity: 'Уровень непрозрачности фильтра:',
ignore: 'Игнорировать',
show: 'Показать',
focus: 'Сфокусировать',
},
tooltip: {
showNoSpeed: `<u>Игнорировать</u> - Не отображает иконку на сегментах без скорости;<br><u>Показать</u> - Отображает иконку на сегментах без скорости;<br><u>Фокус</u> - Показывает только сегменты без установленной скорости.`,
showOnUnpaved: `<u>Игнорировать</u> - Не отображает иконку на грунтовых дорогах;<br><u>Показать</u> - Отображает иконку на грунтовых дорогах;<br><u>Фокус</u> - Показывает только грунтовые дороги.`
},
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: {
resetSettings: 'Сбросить настройки',
seeOnDiscuss: 'Смотреть на обсуждении',
seeOnDiscord: 'Смотреть в Discord',
scriptDevBy: 'Скрипт разработан Луаном Таваресом',
}
};
break;
case 'sk':
// Slovak
translations = {
name: 'Zobrazenie rýchlosti',
zoomOut: 'Ďalej',
zoomIn: 'Priblížiť',
changelog: 'Záznam zmien',
changelogMessage: `<h6>Novinky:</h6><ul style="margin-bottom: 10px"><li>Nová funkcia pre segmenty bez rýchlosti a nespevnené cesty! Teraz môžeš ignorovať, zobrazovať alebo sa zamerať len na tieto segmenty:<li>- Pri ignorovaní sa ikony nezobrazia;<br>- Pri zobrazení sa ikony zobrazia normálne;<br>- Pri zameraní sa zobrazia len ikony, ktoré spĺňajú podmienku.<br></li></li><li>Do názvu karty „Filtre“ bol pridaný čítač aktívnych filtrov pre jednoduchšiu identifikáciu.</li></ul><h6>Opravy a vylepšenia:</h6><ul style="margin-bottom: 10px"><li>Staré zaškrtávacie políčko „Zobraziť rýchlosť na kruhovom objazde“ bolo nahradené prepínačom.</li><li>Pridaný limit pokusov v existujúcich cykloch skriptu.</li><li>Opravená drobná chyba pri kontrole ľavostranného premávky.</li><li>Ďalšie drobné opravy a vylepšenia.</li></ul><h6>Známé problémy:</h6><ul><li>Pri spustení skriptu sa objavuje chyba „.then“ po aktualizácii WME. Príčina je neznáma, skript funguje normálne.</li><li>Pri spustení sa vyskytujú chyby tooltipov. Kvôli nedostatku dokumentácie pre natívne prvky WME tieto tooltipy generujú chybu, ale skript beží ďalej.</li></ul>`,
close: 'Zatvoriť',
viewScript: 'Zobraziť skript',
viewChangelog: 'Zobraziť záznam zmien',
reset: 'Obnoviť',
snackbar: {
errorFiltering: 'Chyba pri použití filtra. Minimálna rýchlosť nemôže byť väčšia ako maximálna.',
},
title: {
settings: 'Nastavenia',
roadTypes: 'Typy ciest',
filter: 'Filtrovať',
appearence: 'Vzhľad',
showOnRoadType: 'Zobraziť na nasledujúcich typoch ciest:',
seeOnDiscuss: 'Pozrite si vlákno skriptu na Discuss',
seeOnDiscord: 'Pozrite si kanál skriptu na Waze Script Discord serveri',
scriptDevBy: 'Zobraziť môj profil používateľa editora',
},
label: {
displaySpeeds: 'Zobraziť rýchlosti',
noSpeed: 'Úsek bez rýchlosti',
unpaved: 'Neasfaltovaný úsek',
showOnRoundabout: 'Zobraziť na okruhu',
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:',
ignore: 'Ignorovať',
show: 'Zobraziť',
focus: 'Zamerať',
},
tooltip: {
showNoSpeed: `<u>Ignorovať</u> - Nezobrazuje ikonu na segmentoch bez rýchlosti;<br><u>Zobraziť</u> - Zobrazuje ikonu na segmentoch bez rýchlosti;<br><u>Zamerať</u> - Zameriava sa len na segmenty bez nastavenej rýchlosti.`,
showOnUnpaved: `<u>Ignorovať</u> - Nezobrazuje ikonu na nespevnených segmentoch;<br><u>Zobraziť</u> - Zobrazuje ikonu na nespevnených segmentoch;<br><u>Zamerať</u> - Zameriava sa len na nespevnené segmenty.`
},
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: {
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>Nova funkcija za odseke brez hitrosti in neutrjenih cest! Zdaj jih lahko ignoriraš, prikažeš ali se osredotočiš samo nanje:<li>- Če ignoriraš, ikone ne bodo prikazane;<br>- Če prikažeš, bodo ikone prikazane kot običajno;<br>- Če se osredotočiš, bodo prikazane samo ikone, ki ustrezajo pogoju.<br></li></li><li>Dodano je štetje aktivnih filtrov v naslov zavihka »Filtri« za lažjo identifikacijo.</li></ul><h6>Popravki in izboljšave:</h6><ul style="margin-bottom: 10px"><li>Staro potrditveno polje »Prikaži hitrost v krožišču« je nadomestil stikalo.</li><li>Dodana je omejitev poskusov v obstoječih zankah skripta.</li><li>Odpravljena manjša napaka pri preverjanju levo- in desnostranske vožnje.</li><li>Drugi manjši popravki in izboljšave.</li></ul><h6>Znane težave:</h6><ul><li>Pri zagonu skripta se pojavi napaka ».then« po posodobitvi WME. Vzrok je neznan, skript pa deluje normalno.</li><li>Napake se pojavijo pri inicializaciji namigov. Zaradi pomanjkanja dokumentacije za WME-elemente se pojavijo napake, vendar skript deluje normalno.</li></ul>`,
close: 'Zapri',
viewScript: 'Poglej skript',
viewChangelog: 'Poglej zgodovino sprememb',
reset: 'Ponastavi',
snackbar: {
errorFiltering: 'Napaka pri uporabi filtra. Najmanjša hitrost ne more biti večja od največje.',
},
title: {
settings: 'Nastavitve',
roadTypes: 'Vrste cest',
filter: 'Filtriraj',
appearence: 'Izgled',
showOnRoadType: 'Prikaži na naslednjih vrstah cest:',
seeOnDiscuss: 'Oglejte si temo skripte na Discuss',
seeOnDiscord: 'Oglejte si kanal skripte na Waze Script Discord strežniku',
scriptDevBy: 'Ogled mojega uporabniškega profila urejevalnika',
},
label: {
displaySpeeds: 'Prikaz hitrosti',
noSpeed: 'Odsek brez hitrosti',
unpaved: 'Neasfaltiran odsek',
showOnRoundabout: 'Prikaz na krožišču',
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:',
ignore: 'Prezri',
show: 'Pokaži',
focus: 'Osredotoči',
},
tooltip: {
showNoSpeed: `<u>Prezri</u> - Ne prikazuje ikono na segmentih brez hitrosti;<br><u>Prikaži</u> - Prikazuje ikono na segmentih brez hitrosti;<br><u>Osredotoči</u> - Osredotoča se le na segmente brez določene hitrosti.`,
showOnUnpaved: `<u>Prezri</u> - Ne prikazuje ikono na neasfaltiranih segmentih;<br><u>Prikaži</u> - Prikazuje ikono na neasfaltiranih segmentih;<br><u>Osredotoči</u> - Osredotoča se le na neasfaltirane segmente.`
},
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: {
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>Nyheter:</h6><ul style="margin-bottom: 10px"><li>Ny funktion för segment utan hastighet och för grusvägar! Nu kan du ignorera, visa eller fokusera enbart på dessa segment:<li>- Om du ignorerar kommer inga ikoner visas;<br>- Om du visar kommer ikoner visas som vanligt;<br>- Om du fokuserar visas endast ikoner som uppfyller villkoret.<br></li></li><li>En räknare för aktiva filter har lagts till i flikens titel för "Filter" för att lättare se när filter är aktiva.</li></ul><h6>Korrigeringar och förbättringar:</h6><ul style="margin-bottom: 10px"><li>Den gamla kryssrutan ”Visa hastighet i rondell” har ersatts med en strömbrytare.</li><li>Gräns för antalet försök har lagts till i befintliga loopar i skriptet.</li><li>Ett litet fel i kontrollen av vänstertrafik har rättats.</li><li>Andra mindre korrigeringar och förbättringar.</li></ul><h6>Kända problem:</h6><ul><li>En ”.then”-fel uppstår vid start av skriptet efter WME-uppdatering. Orsaken är okänd men skriptet fungerar normalt.</li><li>Fel uppstår vid tooltip-laddning. Brist på dokumentation för WME-native-element orsakar felet, men skriptet fortsätter att fungera.</li></ul>`,
close: 'Stäng',
viewScript: 'Visa skript',
viewChangelog: 'Visa ändringslogg',
reset: 'Återställ',
snackbar: {
errorFiltering: 'Fel vid tillämpning av filtret. Minsta hastighet kan inte vara större än den maximala.',
},
title: {
settings: 'Inställningar',
roadTypes: 'Väglagstyper',
filter: 'Filter',
appearence: 'Utseende',
showOnRoadType: 'Visa på följande vägtyper:',
seeOnDiscuss: 'Se skriptets tråd på Discuss',
seeOnDiscord: 'Se skriptets kanal på Waze Script Discord-servern',
scriptDevBy: 'Visa min redigerarprofil',
},
label: {
displaySpeeds: 'Visa hastigheter',
noSpeed: 'Segment utan hastighet',
unpaved: 'Oasfalterad segment',
showOnRoundabout: 'Visa på rondell',
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å:',
ignore: 'Ignorera',
show: 'Visa',
focus: 'Fokusera',
},
tooltip: {
showNoSpeed: `<u>Ignorera</u> - Visar inte ikon på segment utan hastighet;<br><u>Visa</u> - Visar ikon på segment utan hastighet;<br><u>Fokusera</u> - Fokuserar bara på segment utan angiven hastighet.`,
showOnUnpaved: `<u>Ignorera</u> - Visar inte ikon på grusvägar;<br><u>Visa</u> - Visar ikon på grusvägar;<br><u>Fokusera</u> - Fokuserar bara på grusvägar.`
},
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: {
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>- ถ้าละเว้น จะไม่มีการแสดงไอคอน;<br>- ถ้าแสดง ไอคอนจะปรากฏตามปกติ;<br>- ถ้าโฟกัส จะมีเฉพาะไอคอนที่ตรงตามเงื่อนไขเท่านั้นที่จะแสดง.<br></li></li><li>เพิ่มตัวนับตัวกรองที่ใช้งานอยู่ในชื่อแท็บ "ฟิลเตอร์" เพื่อให้ระบุได้ง่ายขึ้นเมื่อมีตัวกรองที่เปิดใช้งานอยู่</li></ul><h6>การแก้ไขและปรับปรุง:</h6><ul style="margin-bottom: 10px"><li>กล่องกาเครื่องหมาย "แสดงความเร็วในวงเวียน" แบบเก่า ถูกแทนที่ด้วยสวิตช์</li><li>เพิ่มขีดจำกัดจำนวนครั้งในการวนลูปของสคริปต์</li><li>แก้ไขข้อผิดพลาดเล็กน้อยในการตรวจสอบทิศทางการจราจรด้านซ้าย</li><li>การแก้ไขและปรับปรุงอื่นๆ เล็กน้อย</li></ul><h6>ปัญหาที่ทราบ:</h6><ul><li>เกิดข้อผิดพลาด ".then" เมื่อเริ่มสคริปต์หลังจากอัปเดต WME สาเหตุยังไม่ทราบ แต่สคริปต์ยังคงทำงานได้ตามปกติ</li><li>เกิดข้อผิดพลาดใน tooltip เมื่อเริ่มต้น เนื่องจากไม่มีเอกสารประกอบสำหรับองค์ประกอบของ WME tooltip จึงทำให้เกิดข้อผิดพลาด แต่สคริปต์ยังคงทำงานได้ตามปกติ</li></ul>`,
close: 'ปิด',
viewScript: 'ดูสคริปต์',
viewChangelog: 'ดูบันทึกการเปลี่ยนแปลง',
reset: 'คืนค่า',
snackbar: {
errorFiltering: 'ข้อผิดพลาดในการใช้ตัวกรอง ความเร็วขั้นต่ำต้องไม่มากกว่าค่าสูงสุด.',
},
title: {
settings: 'การตั้งค่า',
roadTypes: 'ประเภทถนน',
filter: 'ตัวกรอง',
appearence: 'ลักษณะ',
showOnRoadType: 'แสดงในประเภทถนนต่อไปนี้:',
seeOnDiscuss: 'ดูเธรดของสคริปต์ใน Discuss',
seeOnDiscord: 'ดูช่องของสคริปต์ในเซิร์ฟเวอร์ Discord ของ Waze Script',
scriptDevBy: 'ดูโปรไฟล์ผู้ใช้ของฉันในตัวแก้ไข',
},
label: {
displaySpeeds: 'แสดงความเร็ว',
noSpeed: 'ส่วนถนนไม่มีความเร็ว',
unpaved: 'ส่วนถนนที่ไม่ได้ลาดยาง',
showOnRoundabout: 'แสดงในทางแยกรอบ',
maxZoom: 'แสดงได้จนถึงการซูมระดับ:',
toggleLayerShortcut: 'สลับการแสดงผลเลเยอร์ความเร็ว',
zIndex: 'ความลึกของเลเยอร์',
hideShorterSegments: 'ซ่อนในเซกเมนต์ที่สั้นกว่า',
speedFilter: 'กรองตามความเร็ว',
min: 'ขั้นต่ำ:',
max: 'สูงสุด:',
opacity: 'ระดับความทึบของฟิลเตอร์:',
ignore: 'ละเว้น',
show: 'แสดง',
focus: 'โฟกัส',
},
tooltip: {
showNoSpeed: `<u>ละเว้น</u> - ไม่แสดงไอคอนบนส่วนถนนที่ไม่มีความเร็ว;<br><u>แสดง</u> - แสดงไอคอนบนส่วนถนนที่ไม่มีความเร็ว;<br><u>โฟกัส</u> - โฟกัสเฉพาะส่วนถนนที่ไม่มีการกำหนดความเร็ว.`,
showOnUnpaved: `<u>ละเว้น</u> - ไม่แสดงไอคอนบนถนนลูกรัง;<br><u>แสดง</u> - แสดงไอคอนบนถนนลูกรัง;<br><u>โฟกัส</u> - โฟกัสเฉพาะถนนลูกรัง.`
},
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: {
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>Hızsız ve asfaltlanmamış segmentler için yeni özellik! Artık bu segmentleri yok sayabilir, gösterebilir veya yalnızca bunlara odaklanabilirsiniz:<li>- Yok say seçeneğinde ilgili segmentlerde simgeler oluşturulmaz;<br>- Göster seçeneğinde simgeler normal şekilde görüntülenir;<br>- Odaklan seçeneğinde sadece koşula uyan simgeler görüntülenir.<br></li></li><li>“Filtreler” sekmesi başlığına aktif filtre sayacı eklendi, böylece aktif filtreleri kolayca görebilirsiniz.</li></ul><h6>Düzeltmeler ve iyileştirmeler:</h6><ul style="margin-bottom: 10px"><li>“Dönel kavşakta hızı göster” eski onay kutusu bir anahtarla değiştirildi.</li><li>Mevcut döngülerde deneme sınırı eklendi.</li><li>Sollamalı trafik ülkelerinde küçük bir doğrulama hatası düzeltildi.</li><li>Diğer küçük düzeltmeler ve iyileştirmeler yapıldı.</li></ul><h6>Bilinen sorunlar:</h6><ul><li>WME güncellemesinden sonra script başlatıldığında “.then” hatası oluşur. Sebebi bilinmiyor, ancak script sorunsuz çalışır.</li><li>Tooltip başlatılırken hatalar oluşur. WME’nin yerel framework elemanlarıyla ilgili belgeler eksik olduğu için tooltip ekleme hatası verir, ancak script yine de çalışmaya devam eder.</li></ul>`,
close: 'Kapat',
viewScript: 'Scripti Görüntüle',
viewChangelog: 'Değişiklikler Kaydını Görüntüle',
reset: 'Sıfırla',
snackbar: {
errorFiltering: 'Filtre uygulanırken hata oluştu. Minimum hız, maksimum hızdan büyük olamaz.',
},
title: {
settings: 'Ayarlar',
roadTypes: 'Yol Tipleri',
filter: 'Filtre',
appearence: 'Görünüm',
showOnRoadType: 'Aşağıdaki yol tiplerinde göster:',
seeOnDiscuss: 'Script\'in thread\'ini Discuss\'ta görün',
seeOnDiscord: 'Waze Script Discord sunucusunda script kanalını görün',
scriptDevBy: 'Editör kullanıcı profilimi görüntüle',
},
label: {
displaySpeeds: 'Hızları Göster',
noSpeed: 'Hızsız segment',
unpaved: 'Asfaltsız segment',
showOnRoundabout: 'Dönel kavşakta 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:',
ignore: 'Yoksay',
show: 'Göster',
focus: 'Odakla',
},
tooltip: {
showNoSpeed: `<u>Yoksay</u> - Hız sınırı olmayan segmentlerde simgeyi gösterme;<br><u>Göster</u> - Hız sınırı olmayan segmentlerde simgeyi göster;<br><u>Odaklan</u> - Sadece hız tanımlanmamış segmentlere odaklan.`,
showOnUnpaved: `<u>Yoksay</u> - Asfalt olmayan segmentlerde simgeyi gösterme;<br><u>Göster</u> - Asfalt olmayan segmentlerde simgeyi göster;<br><u>Odaklan</u> - Sadece asfalt olmayan segmentlere odaklan.`
},
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: {
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>- Якщо ігнорувати, іконки не відображатимуться;<br>- Якщо показувати — іконки з’являться як зазвичай;<br>- Якщо зосереджуватися — будуть показані лише іконки, які відповідають умові.<br></li></li><li>Додано лічильник активних фільтрів у заголовок вкладки «Фільтри» для кращого контролю.</li></ul><h6>Виправлення та покращення:</h6><ul style="margin-bottom: 10px"><li>Старий прапорець «Показувати швидкість на кільцевій» замінено на перемикач.</li><li>Додано обмеження спроб у циклах скрипта.</li><li>Виправлено невелику помилку перевірки для країн з лівостороннім рухом.</li><li>Інші дрібні виправлення та покращення.</li></ul><h6>Відомі проблеми:</h6><ul><li>Після оновлення WME при запуску скрипта виникає помилка «.then». Причина невідома, але скрипт працює коректно.</li><li>Виникають помилки під час ініціалізації підказок. Через відсутність документації щодо елементів WME ці підказки можуть викликати помилки, але скрипт продовжує працювати.</li></ul>`,
close: 'Закрити',
viewScript: 'Переглянути сценарій',
viewChangelog: 'Переглянути журнал змін',
reset: 'Скинути',
snackbar: {
errorFiltering: 'Помилка застосування фільтра. Мінімальна швидкість не може бути більшою за максимальну.',
},
title: {
settings: 'Налаштування',
roadTypes: 'Типи доріг',
filter: 'Фільтр',
appearence: 'Зовнішній вигляд',
showOnRoadType: 'Показати на наступних типах доріг:',
seeOnDiscuss: 'Переглянути тему скрипта на Discuss',
seeOnDiscord: 'Переглянути канал скрипта на сервері Discord Waze Script',
scriptDevBy: 'Переглянути мій профіль користувача редактора',
},
label: {
displaySpeeds: 'Показувати швидкості',
noSpeed: 'Сегмент без швидкості',
unpaved: 'Непокритий сегмент',
showOnRoundabout: 'Показувати на кільцевих перехрестях',
maxZoom: 'Рендерити до рівня zoom:',
toggleLayerShortcut: 'Перемикання шару відображення швидкості',
zIndex: 'Глибина шару',
hideShorterSegments: 'Приховувати на сегментах менше ніж',
speedFilter: 'Фільтрувати за швидкістю',
min: 'Мін.:',
max: 'Макс.:',
opacity: 'Рівень прозорості фільтра:',
ignore: 'Ігнорувати',
show: 'Показати',
focus: 'Фокусувати',
},
tooltip: {
showNoSpeed: `<u>Ігнорувати</u> - Не показує іконку на сегментах без швидкості;<br><u>Показати</u> - Показує іконку на сегментах без швидкості;<br><u>Фокус</u> - Фокусується лише на сегментах без заданої швидкості.`,
showOnUnpaved: `<u>Ігнорувати</u> - Не показує іконку на ґрунтових дорогах;<br><u>Показати</u> - Показує іконку на ґрунтових дорогах;<br><u>Фокус</u> - Фокусується лише на ґрунтових дорогах.`
},
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: {
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>Những điểm mới:</h6><ul style="margin-bottom: 10px"><li>Chức năng mới cho đoạn đường không có tốc độ và đường chưa trải nhựa! Giờ bạn có thể bỏ qua, hiển thị hoặc chỉ tập trung vào các đoạn này:<li>- Bỏ qua: Không hiển thị biểu tượng trên các đoạn này;<br>- Hiển thị: Biểu tượng hiển thị như bình thường;<br>- Tập trung: Chỉ hiển thị biểu tượng phù hợp với điều kiện.<br></li></li><li>Đã thêm bộ đếm bộ lọc đang hoạt động trên tiêu đề tab "Bộ lọc" để dễ dàng biết khi nào bộ lọc đang bật.</li></ul><h6>Sửa lỗi & cải tiến:</h6><ul style="margin-bottom: 10px"><li>Hộp kiểm “Hiển thị tốc độ trong vòng xuyến” cũ đã được thay thế bằng nút gạt.</li><li>Thêm giới hạn số lần thử trong các vòng lặp hiện có.</li><li>Đã sửa lỗi nhỏ kiểm tra cho các quốc gia lái xe bên trái.</li><li>Những cải tiến và sửa lỗi nhỏ khác.</li></ul><h6>Sự cố đã biết:</h6><ul><li>Lỗi “.then” xảy ra khi khởi động script sau khi cập nhật WME. Chưa rõ nguyên nhân, nhưng script vẫn hoạt động bình thường.</li><li>Các lỗi xảy ra khi khởi tạo tooltip. Do thiếu tài liệu về các phần tử gốc của WME, các tooltip sẽ gây lỗi, nhưng script vẫn chạy bình thường.</li></ul>`,
close: 'Đóng',
viewScript: 'Xem kịch bản',
viewChangelog: 'Xem lịch sử thay đổi',
reset: 'Đặt lại',
snackbar: {
errorFiltering: 'Lỗi áp dụng bộ lọc. Tốc độ tối thiểu không thể lớn hơn tốc độ tối đa.',
},
title: {
settings: 'Cài đặt',
roadTypes: 'Loại đường',
filter: 'Lọc',
appearence: 'Ngoại hình',
showOnRoadType: 'Hiển thị trên các loại đường sau:',
seeOnDiscuss: 'Xem chủ đề của script trên Discuss',
seeOnDiscord: 'Xem kênh của script trên máy chủ Discord của Waze Script',
scriptDevBy: 'Xem hồ sơ người dùng biên tập viên của tôi',
},
label: {
displaySpeeds: 'Hiển thị tốc độ',
noSpeed: 'Phân đoạn không có tốc độ',
unpaved: 'Phân đoạn không trải nhựa',
showOnRoundabout: 'Hiển thị trên vòng xuyến',
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:',
ignore: 'Bỏ qua',
show: 'Hiển thị',
focus: 'Tập trung',
},
tooltip: {
showNoSpeed: `<u>Bỏ qua</u> - Không hiển thị biểu tượng ở đoạn đường không có tốc độ;<br><u>Hiển thị</u> - Hiển thị biểu tượng ở đoạn đường không có tốc độ;<br><u>Tập trung</u> - Chỉ hiển thị biểu tượng ở đoạn đường chưa có tốc độ được đặt.`,
showOnUnpaved: `<u>Bỏ qua</u> - Không hiển thị biểu tượng ở đoạn đường chưa trải nhựa;<br><u>Hiển thị</u> - Hiển thị biểu tượng ở đoạn đường chưa trải nhựa;<br><u>Tập trung</u> - Chỉ hiển thị biểu tượng ở đoạn đường chưa trải nhựa.`
},
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: {
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>- 忽略時,不會在相關路段生成圖標;<br>- 顯示時,圖標正常渲染;<br>- 聚焦時,只渲染符合條件的圖標。<br></li></li><li>「篩選器」標籤新增啟用篩選器計數器,方便確認當前啟用的篩選器。</li></ul><h6>修復與改進:</h6><ul style="margin-bottom: 10px"><li>舊的「顯示環形交叉口速度」核取方塊已替換為切換開關。</li><li>為現有迴圈新增重試次數限制。</li><li>修正了左側通行國家檢查的小錯誤。</li><li>其他小幅修正與優化。</li></ul><h6>已知問題:</h6><ul><li>更新 WME 後啟動腳本會出現 「.then」 錯誤,原因未明,但腳本仍可正常執行。</li><li>啟動提示時會出現錯誤,由於缺乏 WME 原生元件文件,提示可能導致錯誤,但腳本依舊能正常執行。</li></ul>`,
close: '关闭',
viewScript: '查看脚本',
viewChangelog: '查看更新日志',
reset: '重置',
snackbar: {
errorFiltering: '应用过滤器时出错。最低速度不能大于最高速度。',
},
title: {
settings: '设置',
roadTypes: '道路类型',
filter: '过滤器',
appearence: '外观',
showOnRoadType: '在以下道路类型上显示:',
seeOnDiscuss: '查看脚本的主题讨论',
seeOnDiscord: '查看Waze Script Discord服务器上的脚本频道',
scriptDevBy: '查看我的编辑器用户档案',
},
label: {
displaySpeeds: '显示速度',
noSpeed: '无速度路段',
unpaved: '未铺装路段',
showOnRoundabout: '显示在环形交叉口',
maxZoom: '最大缩放:',
toggleLayerShortcut: '切换速度显示图层',
zIndex: '图层深度',
hideShorterSegments: '隐藏小于以下长度的段落',
speedFilter: '按速度过滤',
min: '最小:',
max: '最大:',
opacity: '过滤器透明度级别:',
ignore: '忽略',
show: '显示',
focus: '聚焦',
},
tooltip: {
showNoSpeed: `<u>忽略</u> - 不在无速度的路段显示图标;<br><u>显示</u> - 在无速度的路段显示图标;<br><u>聚焦</u> - 仅在未设定速度的路段显示图标。`,
showOnUnpaved: `<u>忽略</u> - 不在未铺装路段显示图标;<br><u>显示</u> - 在未铺装路段显示图标;<br><u>聚焦</u> - 仅在未铺装路段显示图标。`
},
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: {
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>- 忽略時,不會於該段產生圖示;<br>- 顯示時,圖示會正常呈現;<br>- 聚焦時,只會顯示符合條件的圖示。<br></li></li><li>「篩選器」頁籤標題新增啟用篩選器計數器,方便辨識是否有啟用篩選。</li></ul><h6>修正與改進:</h6><ul style="margin-bottom: 10px"><li>原「顯示環島速度」核取方塊已更換為切換開關。</li><li>在現有迴圈中增加重試次數限制。</li><li>修正左駕國家檢查的小錯誤。</li><li>其他小幅修正及優化。</li></ul><h6>已知問題:</h6><ul><li>更新 WME 後啟動腳本會出現「.then」錯誤,目前原因不明,但腳本仍可正常執行。</li><li>啟用 tooltip 時會出現錯誤,因缺少 WME 原生元素文件,tooltip 會觸發錯誤,但腳本仍可順利執行。</li></ul>`,
close: '關閉',
viewScript: '查看腳本',
viewChangelog: '查看更新日誌',
reset: '重設',
snackbar: {
errorFiltering: '應用篩選器時出錯。最低速度不能大於最高速度。',
},
title: {
settings: '設定',
roadTypes: '道路類型',
filter: '過濾器',
appearence: '外觀',
showOnRoadType: '在以下道路類型上顯示:',
seeOnDiscuss: '查看腳本的主題討論',
seeOnDiscord: '查看Waze Script Discord伺服器上的腳本頻道',
scriptDevBy: '查看我的編輯器用戶檔案',
},
label: {
displaySpeeds: '顯示速度',
noSpeed: '無速道路段',
unpaved: '未鋪裝路段',
showOnRoundabout: '顯示在環形交叉口',
maxZoom: '最大縮放:',
toggleLayerShortcut: '切換速度顯示圖層',
zIndex: '圖層深度',
hideShorterSegments: '隱藏小於以下長度的段落',
speedFilter: '按速度過濾',
min: '最小:',
max: '最大:',
opacity: '濾鏡透明度級別:',
ignore: '忽略',
show: '顯示',
focus: '聚焦',
},
tooltip: {
showNoSpeed: `<u>忽略</u> - 不會在沒有速度的路段顯示圖示;<br><u>顯示</u> - 會在沒有速度的路段顯示圖示;<br><u>聚焦</u> - 只會在沒有設定速度的路段顯示圖示。`,
showOnUnpaved: `<u>忽略</u> - 不會在未鋪裝的路段顯示圖示;<br><u>顯示</u> - 會在未鋪裝的路段顯示圖示;<br><u>聚焦</u> - 只會在未鋪裝的路段顯示圖示。`
},
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: {
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>New feature for segments without speed and unpaved! Now you can ignore, show or focus on such segments:<li>- When ignored, no icons will be generated;<br>- When shown, icons will display normally;<br>- When focused, only matching icons will appear.<br></li></li><li>A counter for active filters was added to the "filters" tab title for easier identification of active filters.</li></ul><h6>Fixes and Improvements:</h6><ul style="margin-bottom: 10px"><li>The old checkbox "Show speed on roundabout" was replaced with a switch.</li><li>Added attempt limit to existing script loops.</li><li>Fixed a small check error for left-hand traffic.</li><li>Other small fixes and improvements.</li></ul><h6>Known Issues:</h6><ul><li>A ".then" error occurs when starting the script after the WME update. The cause is still unknown but the script works fine.</li><li>There are tooltip errors when initializing. Due to lack of documentation for native WME framework elements, the tooltips cause an error, but the script still works normally.</li></ul>`,
close: 'Close',
viewScript: 'View Script',
viewChangelog: 'View Changelog',
reset: 'Reset',
snackbar: {
errorFiltering: 'Error applying filter. Minimum speed cannot be greater than maximum.',
},
title: {
settings: 'General',
roadTypes: 'Road Types',
filter: 'Filter',
appearence: 'Appearence',
showOnRoadType: 'Show on the following road types:',
seeOnDiscuss: 'See the script\'s thread on the Discuss',
seeOnDiscord: 'See the script\'s channel on the Waze Script\'s Discord server',
scriptDevBy: 'View my editor user profile',
},
label: {
displaySpeeds: 'Display speeds',
noSpeed: 'Segment with no speed',
unpaved: 'Unpaved segment',
showOnRoundabout: 'Show on roundabout',
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:',
ignore: 'Ignore',
show: 'Show',
focus: 'Focus',
},
tooltip: {
showNoSpeed: `<u>Ignore</u> - Do not render icon on segments without speed;<br><u>Show</u> - Render icon on segments without speed;<br><u>Focus</u> - Focus rendering only on segments without defined speed.`,
showOnUnpaved: `<u>Ignore</u> - Do not render icon on unpaved segments;<br><u>Show</u> - Render icon on unpaved segments;<br><u>Focus</u> - Focus rendering only on unpaved segments.`
},
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: {
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());