From 682bc9db991ef5d550b6b0b780371f19359511ad Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 6 Sep 2021 11:59:42 -0700 Subject: # This is a combination of 30 commits. # This is the 1st commit message: Close socket on logout (fix #896) # This is the commit message #2: Fix lint # This is the commit message #3: Add calendar menu # This is the commit message #4: Add calendar file upload # This is the commit message #5: Disable icon tinting in Firefox # This is the commit message #6: Move ignition icon # This is the commit message #7: Specify icon sizes # This is the commit message #8: Fix lint issues # This is the commit message #9: Add accuracy button # This is the commit message #10: Merge shock and vibration alarms # This is the commit message #11: Add events alarm column # This is the commit message #12: Enable LocationIQ by default # This is the commit message #13: Update LocationIQ keys # This is the commit message #14: Fix selector style # This is the commit message #15: Support server change # This is the commit message #16: Update localization script # This is the commit message #17: Update localization # This is the commit message #18: Command to install dependency # This is the commit message #19: Update JavaScript libraries # This is the commit message #20: Fix modern app issues # This is the commit message #21: Fix image URL # This is the commit message #22: Fix user list (fix #898) # This is the commit message #23: Fix formatting issue # This is the commit message #24: Add option to disable reports # This is the commit message #25: Fix add button position # This is the commit message #26: Select device based on uniqueId # This is the commit message #27: Update devices list search # This is the commit message #28: Fix lint problems # This is the commit message #29: Changed devices list search # This is the commit message #30: Changed device list search --- modern/package.json | 2 +- modern/public/images/icon/animal.svg | 2 +- modern/public/images/icon/bicycle.svg | 2 +- modern/public/images/icon/boat.svg | 2 +- modern/public/images/icon/bus.svg | 2 +- modern/public/images/icon/car.svg | 2 +- modern/public/images/icon/crane.svg | 2 +- modern/public/images/icon/default.svg | 2 +- modern/public/images/icon/helicopter.svg | 2 +- modern/public/images/icon/ignition.svg | 3 - modern/public/images/icon/motorcycle.svg | 2 +- modern/public/images/icon/offroad.svg | 2 +- modern/public/images/icon/person.svg | 2 +- modern/public/images/icon/pickup.svg | 2 +- modern/public/images/icon/plane.svg | 2 +- modern/public/images/icon/scooter.svg | 2 +- modern/public/images/icon/ship.svg | 2 +- modern/public/images/icon/tractor.svg | 2 +- modern/public/images/icon/train.svg | 2 +- modern/public/images/icon/tram.svg | 2 +- modern/public/images/icon/trolleybus.svg | 2 +- modern/public/images/icon/truck.svg | 2 +- modern/public/images/icon/van.svg | 2 +- modern/public/images/ignition.svg | 3 + modern/src/App.js | 4 + modern/src/DevicesList.js | 23 +- modern/src/EditCollectionView.js | 6 +- modern/src/MainPage.js | 12 +- modern/src/SocketController.js | 25 +- modern/src/admin/UsersPage.js | 4 +- modern/src/attributes/useUserAttributes.js | 4 - modern/src/components/SideNav.js | 2 +- modern/src/map/Map.js | 6 +- modern/src/map/mapStyles.js | 2 + modern/src/map/mapUtil.js | 34 ++- modern/src/reactHelper.js | 9 +- modern/src/reports/ReportFilter.js | 4 +- modern/src/settings/CalendarPage.js | 82 +++++++ modern/src/settings/CalendarsPage.js | 63 +++++ modern/src/settings/OptionsLayout/useRoutes.js | 7 + modern/src/theme/index.js | 4 +- modern/src/theme/overrides.js | 11 +- package.json | 4 +- tools/translate.py | 41 ++-- web/app/controller/Root.js | 10 +- web/app/model/Server.js | 3 + web/app/model/User.js | 3 + web/app/store/CommonUserAttributes.js | 6 +- web/app/store/MapTypes.js | 9 + web/app/view/MainController.js | 4 +- web/app/view/ReportController.js | 6 + web/app/view/State.js | 15 +- web/app/view/StateController.js | 3 +- web/app/view/dialog/Login.js | 41 ++++ web/app/view/dialog/Server.js | 6 + web/app/view/dialog/User.js | 8 + web/app/view/dialog/UserController.js | 1 + web/app/view/map/BaseMap.js | 32 ++- web/app/view/map/Map.js | 16 +- web/app/view/map/MapController.js | 8 +- web/l10n/af.json | 6 +- web/l10n/ar.json | 6 +- web/l10n/az.json | 6 +- web/l10n/bg.json | 6 +- web/l10n/bn.json | 6 +- web/l10n/cs.json | 24 +- web/l10n/da.json | 6 +- web/l10n/de.json | 6 +- web/l10n/el.json | 6 +- web/l10n/en.json | 6 +- web/l10n/es.json | 198 ++++++++-------- web/l10n/fa.json | 6 +- web/l10n/fi.json | 6 +- web/l10n/fr.json | 6 +- web/l10n/he.json | 6 +- web/l10n/hi.json | 10 +- web/l10n/hr.json | 6 +- web/l10n/hu.json | 6 +- web/l10n/id.json | 6 +- web/l10n/it.json | 6 +- web/l10n/ja.json | 6 +- web/l10n/ka.json | 6 +- web/l10n/kk.json | 6 +- web/l10n/km.json | 6 +- web/l10n/ko.json | 6 +- web/l10n/lo.json | 6 +- web/l10n/lt.json | 6 +- web/l10n/lv.json | 6 +- web/l10n/ml.json | 6 +- web/l10n/mn.json | 6 +- web/l10n/ms.json | 6 +- web/l10n/nb.json | 6 +- web/l10n/ne.json | 6 +- web/l10n/nl.json | 6 +- web/l10n/nn.json | 6 +- web/l10n/pl.json | 20 +- web/l10n/pt.json | 6 +- web/l10n/pt_BR.json | 6 +- web/l10n/ro.json | 6 +- web/l10n/ru.json | 6 +- web/l10n/si.json | 306 +++++++++++++------------ web/l10n/sk.json | 6 +- web/l10n/sl.json | 24 +- web/l10n/sq.json | 6 +- web/l10n/sr.json | 6 +- web/l10n/sv.json | 6 +- web/l10n/ta.json | 6 +- web/l10n/th.json | 6 +- web/l10n/tr.json | 6 +- web/l10n/uk.json | 6 +- web/l10n/uz.json | 6 +- web/l10n/vi.json | 6 +- web/l10n/zh.json | 6 +- web/l10n/zh_TW.json | 6 +- 114 files changed, 992 insertions(+), 446 deletions(-) delete mode 100644 modern/public/images/icon/ignition.svg create mode 100644 modern/public/images/ignition.svg create mode 100644 modern/src/settings/CalendarPage.js create mode 100644 modern/src/settings/CalendarsPage.js diff --git a/modern/package.json b/modern/package.json index a9050fb5..4ac91845 100644 --- a/modern/package.json +++ b/modern/package.json @@ -13,9 +13,9 @@ "@tmcw/togeojson": "^4.5.0", "@turf/circle": "^6.5.0", "@turf/turf": "^6.4.0", - "canvas-tint-image": "^2.0.1", "mapbox-gl": "^1.13.1", "maplibre-gl": "^1.15.0", + "material-ui-dropzone": "^3.5.0", "moment": "^2.29.1", "react": "^17.0.2", "react-container-dimensions": "^1.4.1", diff --git a/modern/public/images/icon/animal.svg b/modern/public/images/icon/animal.svg index 87a914ca..5a239349 100644 --- a/modern/public/images/icon/animal.svg +++ b/modern/public/images/icon/animal.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/bicycle.svg b/modern/public/images/icon/bicycle.svg index 6cb40987..a473f4bc 100644 --- a/modern/public/images/icon/bicycle.svg +++ b/modern/public/images/icon/bicycle.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/boat.svg b/modern/public/images/icon/boat.svg index 592302a6..33bfe27d 100644 --- a/modern/public/images/icon/boat.svg +++ b/modern/public/images/icon/boat.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/bus.svg b/modern/public/images/icon/bus.svg index aa014fb8..5e881481 100644 --- a/modern/public/images/icon/bus.svg +++ b/modern/public/images/icon/bus.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/car.svg b/modern/public/images/icon/car.svg index 2d0cae40..f919e0be 100644 --- a/modern/public/images/icon/car.svg +++ b/modern/public/images/icon/car.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/crane.svg b/modern/public/images/icon/crane.svg index ff9dff4d..23db0916 100644 --- a/modern/public/images/icon/crane.svg +++ b/modern/public/images/icon/crane.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/default.svg b/modern/public/images/icon/default.svg index 886a6670..a4ba881f 100644 --- a/modern/public/images/icon/default.svg +++ b/modern/public/images/icon/default.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/helicopter.svg b/modern/public/images/icon/helicopter.svg index 19442684..2849ee8d 100644 --- a/modern/public/images/icon/helicopter.svg +++ b/modern/public/images/icon/helicopter.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/ignition.svg b/modern/public/images/icon/ignition.svg deleted file mode 100644 index d731c92e..00000000 --- a/modern/public/images/icon/ignition.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/modern/public/images/icon/motorcycle.svg b/modern/public/images/icon/motorcycle.svg index 55c47e56..0289a346 100644 --- a/modern/public/images/icon/motorcycle.svg +++ b/modern/public/images/icon/motorcycle.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/offroad.svg b/modern/public/images/icon/offroad.svg index 80c9507a..b0072b69 100644 --- a/modern/public/images/icon/offroad.svg +++ b/modern/public/images/icon/offroad.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/person.svg b/modern/public/images/icon/person.svg index f470355a..805ba442 100644 --- a/modern/public/images/icon/person.svg +++ b/modern/public/images/icon/person.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/pickup.svg b/modern/public/images/icon/pickup.svg index d14f6bb7..db4494b7 100644 --- a/modern/public/images/icon/pickup.svg +++ b/modern/public/images/icon/pickup.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/plane.svg b/modern/public/images/icon/plane.svg index 5f4890b7..5210e4c9 100644 --- a/modern/public/images/icon/plane.svg +++ b/modern/public/images/icon/plane.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/scooter.svg b/modern/public/images/icon/scooter.svg index e3b6df0d..ea23f9fa 100644 --- a/modern/public/images/icon/scooter.svg +++ b/modern/public/images/icon/scooter.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/ship.svg b/modern/public/images/icon/ship.svg index 58b21f4b..b8c563c8 100644 --- a/modern/public/images/icon/ship.svg +++ b/modern/public/images/icon/ship.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/tractor.svg b/modern/public/images/icon/tractor.svg index 03c577ef..3a9e9f25 100644 --- a/modern/public/images/icon/tractor.svg +++ b/modern/public/images/icon/tractor.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/train.svg b/modern/public/images/icon/train.svg index db3a1077..125b468e 100644 --- a/modern/public/images/icon/train.svg +++ b/modern/public/images/icon/train.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/tram.svg b/modern/public/images/icon/tram.svg index 549346eb..f54084f7 100644 --- a/modern/public/images/icon/tram.svg +++ b/modern/public/images/icon/tram.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/trolleybus.svg b/modern/public/images/icon/trolleybus.svg index 76f749c9..46ecc712 100644 --- a/modern/public/images/icon/trolleybus.svg +++ b/modern/public/images/icon/trolleybus.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/truck.svg b/modern/public/images/icon/truck.svg index 4dd910c8..df5c164c 100644 --- a/modern/public/images/icon/truck.svg +++ b/modern/public/images/icon/truck.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/icon/van.svg b/modern/public/images/icon/van.svg index 7ee3cc54..a3ee13c7 100644 --- a/modern/public/images/icon/van.svg +++ b/modern/public/images/icon/van.svg @@ -1,2 +1,2 @@ - + diff --git a/modern/public/images/ignition.svg b/modern/public/images/ignition.svg new file mode 100644 index 00000000..d731c92e --- /dev/null +++ b/modern/public/images/ignition.svg @@ -0,0 +1,3 @@ + + + diff --git a/modern/src/App.js b/modern/src/App.js index eb1a8818..a53ffc6c 100644 --- a/modern/src/App.js +++ b/modern/src/App.js @@ -24,6 +24,8 @@ import SummaryReportPage from './reports/SummaryReportPage'; import ChartReportPage from './reports/ChartReportPage'; import DriversPage from './settings/DriversPage'; import DriverPage from './settings/DriverPage'; +import CalendarsPage from './settings/CalendarsPage'; +import CalendarPage from './settings/CalendarPage'; import ComputedAttributesPage from './settings/ComputedAttributesPage'; import ComputedAttributePage from './settings/ComputedAttributePage'; import MaintenancesPage from './settings/MaintenancesPage'; @@ -69,6 +71,8 @@ const App = () => { + + diff --git a/modern/src/DevicesList.js b/modern/src/DevicesList.js index cea7c38c..10ac4fc7 100644 --- a/modern/src/DevicesList.js +++ b/modern/src/DevicesList.js @@ -1,4 +1,4 @@ -import React, { useRef } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { makeStyles } from '@material-ui/core/styles'; import Avatar from '@material-ui/core/Avatar'; @@ -12,7 +12,7 @@ import SvgIcon from '@material-ui/core/SvgIcon'; import { FixedSizeList } from 'react-window'; import AutoSizer from 'react-virtualized-auto-sizer'; import BatteryFullIcon from '@material-ui/icons/BatteryFull'; -import { ReactComponent as IgnitionIcon } from '../public/images/icon/ignition.svg'; +import { ReactComponent as IgnitionIcon } from '../public/images/ignition.svg'; import { devicesActions } from './store'; import EditCollectionView from './EditCollectionView'; @@ -126,12 +126,21 @@ const DeviceRow = ({ data, index, style }) => { ); }; -const DeviceView = ({ updateTimestamp, onMenuClick }) => { +const DeviceView = ({ updateTimestamp, onMenuClick, filter }) => { const classes = useStyles(); const dispatch = useDispatch(); const listInnerEl = useRef(null); const items = useSelector(getDevices); + const [filteredItems, setFilteredItems] = useState(null); + + useEffect(() => { + setFilteredItems( + filter.trim().length > 0 + ? items.filter((item) => `${item.name} ${item.uniqueId}`.toLowerCase().includes(filter?.toLowerCase())) + : items, + ); + }, [filter, items]); if (listInnerEl.current) { listInnerEl.current.className = classes.listInner; @@ -151,8 +160,8 @@ const DeviceView = ({ updateTimestamp, onMenuClick }) => { { ); }; -const DevicesList = () => ( - +const DevicesList = ({ filter }) => ( + ); export default DevicesList; diff --git a/modern/src/EditCollectionView.js b/modern/src/EditCollectionView.js index 0bfec615..2d011302 100644 --- a/modern/src/EditCollectionView.js +++ b/modern/src/EditCollectionView.js @@ -12,14 +12,14 @@ import { useTranslation } from './LocalizationProvider'; const useStyles = makeStyles((theme) => ({ fab: { - position: 'absolute', + position: 'fixed', bottom: theme.spacing(2), right: theme.spacing(2), }, })); const EditCollectionView = ({ - content, editPath, endpoint, disableAdd, + content, editPath, endpoint, disableAdd, filter, }) => { const classes = useStyles(); const history = useHistory(); @@ -64,7 +64,7 @@ const EditCollectionView = ({ return ( <> - + {adminEnabled && !disableAdd && ( diff --git a/modern/src/MainPage.js b/modern/src/MainPage.js index 7fd43154..0176c7f0 100644 --- a/modern/src/MainPage.js +++ b/modern/src/MainPage.js @@ -98,7 +98,7 @@ const MainPage = () => { const isTablet = useMediaQuery(theme.breakpoints.down('md')); const isPhone = useMediaQuery(theme.breakpoints.down('xs')); - const [deviceName, setDeviceName] = useState(''); + const [searchKeyword, setSearchKeyword] = useState(''); const [collapsed, setCollapsed] = useState(false); const handleClose = () => { @@ -139,11 +139,11 @@ const MainPage = () => { )} setDeviceName(event.target.value)} + onChange={(event) => setSearchKeyword(event.target.value)} placeholder="Search Devices" variant="filled" /> @@ -158,7 +158,7 @@ const MainPage = () => {
- +
diff --git a/modern/src/SocketController.js b/modern/src/SocketController.js index ae82d134..ac950190 100644 --- a/modern/src/SocketController.js +++ b/modern/src/SocketController.js @@ -1,3 +1,4 @@ +import { useRef } from 'react'; import { useDispatch, useSelector, connect } from 'react-redux'; import { useHistory } from 'react-router-dom'; @@ -24,13 +25,17 @@ const displayNotifications = (events) => { const SocketController = () => { const dispatch = useDispatch(); const history = useHistory(); + const authenticated = useSelector((state) => !!state.session.user); + const socketRef = useRef(); + const connectSocket = () => { const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; const socket = new WebSocket(`${protocol}//${window.location.host}/api/socket`); + socketRef.current = socket; - socket.onclose = () => { + socket.onerror = () => { setTimeout(() => connectSocket(), 60 * 1000); }; @@ -62,14 +67,20 @@ const SocketController = () => { dispatch(devicesActions.refresh(await response.json())); } connectSocket(); + return () => { + const socket = socketRef.current; + if (socket) { + socket.close(); + } + }; + } + const response = await fetch('/api/session'); + if (response.ok) { + dispatch(sessionActions.updateUser(await response.json())); } else { - const response = await fetch('/api/session'); - if (response.ok) { - dispatch(sessionActions.updateUser(await response.json())); - } else { - history.push('/login'); - } + history.push('/login'); } + return null; }, [authenticated]); return null; diff --git a/modern/src/admin/UsersPage.js b/modern/src/admin/UsersPage.js index bd2a0033..289598e7 100644 --- a/modern/src/admin/UsersPage.js +++ b/modern/src/admin/UsersPage.js @@ -51,8 +51,8 @@ const UsersView = ({ updateTimestamp, onMenuClick }) => { {item.name} {item.email} - {formatBoolean(item, 'administrator', t)} - {formatBoolean(item, 'disabled', t)} + {formatBoolean(item.administrator, t)} + {formatBoolean(item.disabled, t)} ))} diff --git a/modern/src/attributes/useUserAttributes.js b/modern/src/attributes/useUserAttributes.js index 61c61899..0101d2f5 100644 --- a/modern/src/attributes/useUserAttributes.js +++ b/modern/src/attributes/useUserAttributes.js @@ -17,10 +17,6 @@ export default (t) => useMemo(() => ({ name: t('attributeWebMaxZoom'), type: 'number', }, - 'ui.disableReport': { - name: t('attributeUiDisableReport'), - type: 'boolean', - }, 'ui.disableEvents': { name: t('attributeUiDisableEvents'), type: 'boolean', diff --git a/modern/src/components/SideNav.js b/modern/src/components/SideNav.js index bcf8ecd5..62c64fd2 100644 --- a/modern/src/components/SideNav.js +++ b/modern/src/components/SideNav.js @@ -21,7 +21,7 @@ const SideNav = ({ routes }) => { key={route.href || route.subheader} button to={route.href} - selected={location.pathname.match(route.match || route.href)} + selected={location.pathname.match(route.match || route.href) !== null} > {route.icon} diff --git a/modern/src/map/Map.js b/modern/src/map/Map.js index 5e182a44..b020423a 100644 --- a/modern/src/map/Map.js +++ b/modern/src/map/Map.js @@ -8,7 +8,7 @@ import { SwitcherControl } from './switcher/switcher'; import deviceCategories from '../common/deviceCategories'; import { prepareIcon, loadImage } from './mapUtil'; import { - styleCarto, styleMapbox, styleMapTiler, styleOsm, + styleCarto, styleLocationIq, styleMapbox, styleMapTiler, styleOsm, } from './mapStyles'; import { useAttributePreference } from '../common/preferences'; import palette from '../theme/palette'; @@ -89,6 +89,7 @@ const Map = ({ children }) => { const mapboxAccessToken = useAttributePreference('mapboxAccessToken'); const mapTilerKey = useAttributePreference('mapTilerKey'); + const locationIqKey = useAttributePreference('locationIqKey', 'pk.0f147952a41c555a5b70614039fd148b'); useEffect(() => { maplibregl.accessToken = mapboxAccessToken; @@ -96,6 +97,9 @@ const Map = ({ children }) => { useEffect(() => { switcher.updateStyles([ + { id: 'locationIqStreets', title: t('mapLocationIqStreets'), uri: styleLocationIq('streets', locationIqKey) }, + { id: 'locationIqEarth', title: t('mapLocationIqEarth'), uri: styleLocationIq('earth', locationIqKey) }, + { id: 'locationIqHybrid', title: t('mapLocationIqHybrid'), uri: styleLocationIq('hybrid', locationIqKey) }, { id: 'osm', title: t('mapOsm'), uri: styleOsm() }, { id: 'carto', title: t('mapCarto'), uri: styleCarto() }, { id: 'mapboxStreets', title: t('mapMapboxStreets'), uri: styleMapbox('streets-v11') }, diff --git a/modern/src/map/mapStyles.js b/modern/src/map/mapStyles.js index 9650ead5..86813a13 100644 --- a/modern/src/map/mapStyles.js +++ b/modern/src/map/mapStyles.js @@ -51,3 +51,5 @@ export const styleCarto = () => ({ export const styleMapbox = (style) => `mapbox://styles/mapbox/${style}`; export const styleMapTiler = (style, key) => `https://api.maptiler.com/maps/${style}/style.json?key=${key}`; + +export const styleLocationIq = (style, key) => `https://tiles.locationiq.com/v3/${style}/vector.json?key=${key}`; diff --git a/modern/src/map/mapUtil.js b/modern/src/map/mapUtil.js index e3c32f46..2aa86c68 100644 --- a/modern/src/map/mapUtil.js +++ b/modern/src/map/mapUtil.js @@ -1,5 +1,4 @@ import { parse, stringify } from 'wellknown'; -import canvasTintImage from 'canvas-tint-image'; import circle from '@turf/circle'; export const loadImage = (url) => new Promise((imageLoaded) => { @@ -8,12 +7,31 @@ export const loadImage = (url) => new Promise((imageLoaded) => { image.src = url; }); -export const prepareIcon = (background, icon, color) => { - const pixelRatio = window.devicePixelRatio; +const canvasTintImage = (image, color) => { + const canvas = document.createElement('canvas'); + canvas.width = image.width * devicePixelRatio; + canvas.height = image.height * devicePixelRatio; + canvas.style.width = `${image.width}px`; + canvas.style.height = `${image.height}px`; + + const context = canvas.getContext('2d'); + + context.save(); + context.fillStyle = color; + context.globalAlpha = 1; + context.fillRect(0, 0, canvas.width, canvas.height); + context.globalCompositeOperation = 'destination-atop'; + context.globalAlpha = 1; + context.drawImage(image, 0, 0, canvas.width, canvas.height); + context.restore(); + return canvas; +}; + +export const prepareIcon = (background, icon, color) => { const canvas = document.createElement('canvas'); - canvas.width = background.width * pixelRatio; - canvas.height = background.height * pixelRatio; + canvas.width = background.width * devicePixelRatio; + canvas.height = background.height * devicePixelRatio; canvas.style.width = `${background.width}px`; canvas.style.height = `${background.height}px`; @@ -24,7 +42,11 @@ export const prepareIcon = (background, icon, color) => { const iconRatio = 0.5; const imageWidth = canvas.width * iconRatio; const imageHeight = canvas.height * iconRatio; - context.drawImage(canvasTintImage(icon, color, 1), (canvas.width - imageWidth) / 2, (canvas.height - imageHeight) / 2, imageWidth, imageHeight); + if (navigator.userAgent.indexOf('Firefox') > 0) { + context.drawImage(icon, (canvas.width - imageWidth) / 2, (canvas.height - imageHeight) / 2, imageWidth, imageHeight); + } else { + context.drawImage(canvasTintImage(icon, color), (canvas.width - imageWidth) / 2, (canvas.height - imageHeight) / 2, imageWidth, imageHeight); + } } return context.getImageData(0, 0, canvas.width, canvas.height); diff --git a/modern/src/reactHelper.js b/modern/src/reactHelper.js index f3ef78dd..7503360a 100644 --- a/modern/src/reactHelper.js +++ b/modern/src/reactHelper.js @@ -9,7 +9,14 @@ export const usePrevious = (value) => { }; export const useEffectAsync = (effect, deps) => { + const ref = useRef(); useEffect(() => { - effect(); + effect().then((result) => ref.current = result); + return () => { + const result = ref.current; + if (result) { + result(); + } + }; }, deps); }; diff --git a/modern/src/reports/ReportFilter.js b/modern/src/reports/ReportFilter.js index 23c7fc00..bfd8a540 100644 --- a/modern/src/reports/ReportFilter.js +++ b/modern/src/reports/ReportFilter.js @@ -60,13 +60,13 @@ const ReportFilter = ({ children, handleSubmit, showOnly }) => { }; return ( - + {t('reportDevice')} diff --git a/modern/src/settings/CalendarPage.js b/modern/src/settings/CalendarPage.js new file mode 100644 index 00000000..60d4ef76 --- /dev/null +++ b/modern/src/settings/CalendarPage.js @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; +import TextField from '@material-ui/core/TextField'; +import { + Accordion, AccordionSummary, AccordionDetails, makeStyles, Typography, +} from '@material-ui/core'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import { DropzoneArea } from 'material-ui-dropzone'; +import EditItemView from '../EditItemView'; +import EditAttributesView from '../attributes/EditAttributesView'; +import { useTranslation } from '../LocalizationProvider'; + +const useStyles = makeStyles(() => ({ + details: { + flexDirection: 'column', + }, +})); + +const CalendarPage = () => { + const classes = useStyles(); + const t = useTranslation(); + + const [item, setItem] = useState(); + + const handleFiles = (files) => { + if (files.length > 0) { + const reader = new FileReader(); + reader.onload = (event) => { + const { result } = event.target; + setItem({ ...item, data: result.substr(result.indexOf(',') + 1) }); + }; + reader.readAsDataURL(files[0]); + } else { + setItem({ ...item, data: null }); + } + }; + + return ( + + {item + && ( + <> + + }> + + {t('sharedRequired')} + + + + setItem({ ...item, name: event.target.value })} + label={t('sharedName')} + variant="filled" + /> + + + + + }> + + {t('sharedAttributes')} + + + + setItem({ ...item, attributes })} + definitions={{}} + /> + + + + )} + + ); +}; + +export default CalendarPage; diff --git a/modern/src/settings/CalendarsPage.js b/modern/src/settings/CalendarsPage.js new file mode 100644 index 00000000..076f30ca --- /dev/null +++ b/modern/src/settings/CalendarsPage.js @@ -0,0 +1,63 @@ +import React, { useState } from 'react'; +import { + TableContainer, Table, TableRow, TableCell, TableHead, TableBody, makeStyles, IconButton, +} from '@material-ui/core'; +import MoreVertIcon from '@material-ui/icons/MoreVert'; +import { useEffectAsync } from '../reactHelper'; +import EditCollectionView from '../EditCollectionView'; +import OptionsLayout from './OptionsLayout'; +import { useTranslation } from '../LocalizationProvider'; + +const useStyles = makeStyles((theme) => ({ + columnAction: { + width: theme.spacing(1), + padding: theme.spacing(0, 1), + }, +})); + +const CalendarsView = ({ updateTimestamp, onMenuClick }) => { + const classes = useStyles(); + const t = useTranslation(); + + const [items, setItems] = useState([]); + + useEffectAsync(async () => { + const response = await fetch('/api/calendars'); + if (response.ok) { + setItems(await response.json()); + } + }, [updateTimestamp]); + + return ( + + + + + + {t('sharedName')} + + + + {items.map((item) => ( + + + onMenuClick(event.currentTarget, item.id)}> + + + + {item.name} + + ))} + +
+
+ ); +}; + +const CalendarsPage = () => ( + + + +); + +export default CalendarsPage; diff --git a/modern/src/settings/OptionsLayout/useRoutes.js b/modern/src/settings/OptionsLayout/useRoutes.js index 8be4ec30..efbd9eb2 100644 --- a/modern/src/settings/OptionsLayout/useRoutes.js +++ b/modern/src/settings/OptionsLayout/useRoutes.js @@ -8,6 +8,7 @@ import StorageIcon from '@material-ui/icons/Storage'; import BuildIcon from '@material-ui/icons/Build'; import PeopleIcon from '@material-ui/icons/People'; import BarChartIcon from '@material-ui/icons/BarChart'; +import TodayIcon from '@material-ui/icons/Today'; import { getIsAdmin, getUserId } from '../../common/selectors'; import { useTranslation } from '../../LocalizationProvider'; @@ -60,6 +61,12 @@ const useMainRoutes = (t, userId) => useMemo(() => [ href: '/settings/drivers', icon: , }, + { + match: 'calendar', + name: t('sharedCalendars'), + href: '/settings/calendars', + icon: , + }, { match: 'attribute', name: t('sharedComputedAttributes'), diff --git a/modern/src/theme/index.js b/modern/src/theme/index.js index dc0a35bf..02865c23 100644 --- a/modern/src/theme/index.js +++ b/modern/src/theme/index.js @@ -1,9 +1,9 @@ -import { createMuiTheme } from '@material-ui/core/styles'; +import { createTheme } from '@material-ui/core/styles'; import palette from './palette'; import overrides from './overrides'; import dimensions from './dimensions'; -const theme = createMuiTheme({ +const theme = createTheme({ palette, overrides, dimensions, diff --git a/modern/src/theme/overrides.js b/modern/src/theme/overrides.js index a6d08cf1..d1fe844c 100644 --- a/modern/src/theme/overrides.js +++ b/modern/src/theme/overrides.js @@ -24,7 +24,8 @@ export default { input: { height: dimensions.inputHeight, borderRadius: dimensions.borderRadius, - paddingTop: '10px', + paddingTop: '11.5px', + paddingBottom: '11.5px', boxSizing: 'border-box', '&:-webkit-autofill': { WebkitBoxShadow: '0 0 0 100px #eeeeee inset', @@ -42,6 +43,14 @@ export default { }, }, }, + MuiSelect: { + select: { + borderRadius: dimensions.borderRadius, + '&&:focus': { + borderRadius: dimensions.borderRadius, + }, + }, + }, MuiButton: { root: { height: dimensions.inputHeight, diff --git a/package.json b/package.json index eb87b1ac..d8c43c6b 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,9 @@ "name": "traccar-web", "dependencies": { "extjs-gpl": "^6.2.0", - "ol": "^6.6.1", + "ol": "^6.12.0", "ol-layerswitcher": "^3.8.3", - "openlayers-dist": "^6.6.1", + "openlayers-dist": "^6.12.0", "proj4": "^2.7.5" }, "devDependencies": { diff --git a/tools/translate.py b/tools/translate.py index e8324a61..43e90849 100755 --- a/tools/translate.py +++ b/tools/translate.py @@ -1,35 +1,32 @@ -#!/usr/bin/python +#!/usr/local/bin/python3 + +# pip3 install --upgrade transifex-python import os import optparse -import urllib2 -import json -import base64 +import requests +from transifex.api import transifex_api parser = optparse.OptionParser() -parser.add_option("-u", "--user", dest="username", help="transifex user login") -parser.add_option("-p", "--password", dest="password", help="transifex user password") +parser.add_option("-t", "--token", dest="token", help="transifex token") (options, args) = parser.parse_args() -if not options.username or not options.password: - parser.error('User name and password are required') +if not options.token: + parser.error('Token is required') os.chdir(os.path.dirname(os.path.abspath(__file__))) -path = "../web/l10n/" - -def request(url): - req = urllib2.Request(url) - auth = base64.encodestring("%s:%s" % (options.username, options.password)).replace("\n", "") - req.add_header("Authorization", "Basic %s" % auth) - return urllib2.urlopen(req) +transifex_api.setup(auth=options.token) -resource = json.load(request("https://www.transifex.com/api/2/project/traccar/resource/web/?details")) +organization = transifex_api.Organization.get(slug='traccar') +project = organization.fetch('projects').get(slug='traccar') +resource = project.fetch('resources').get(slug='web') +languages = project.fetch('languages') -for language in resource["available_languages"]: - code = language["code"] - data = request("https://www.transifex.com/api/2/project/traccar/resource/web/translation/" + code + "?file") - file = open(path + code + ".json", "wb") - file.write(data.read()) - file.close() +for language in languages: + print(language.code) + url = transifex_api.ResourceTranslationsAsyncDownload.download(resource=resource, language=language) + result = requests.get(url) + with open('../web/l10n/' + language.code + '.json', "w") as file: + file.write(result.text) diff --git a/web/app/controller/Root.js b/web/app/controller/Root.js index 65b56fa6..a37bc06f 100644 --- a/web/app/controller/Root.js +++ b/web/app/controller/Root.js @@ -1,5 +1,5 @@ /* - * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -308,7 +308,7 @@ Ext.define('Traccar.controller.Root', { }, updatePositions: function (array, first) { - var i, store, entity, deviceId, device; + var i, store, entity, uniqueId, device; store = Ext.getStore('LatestPositions'); for (i = 0; i < array.length; i++) { entity = store.findRecord('deviceId', array[i].deviceId, 0, false, false, true); @@ -322,9 +322,9 @@ Ext.define('Traccar.controller.Root', { } } if (first) { - deviceId = Ext.Object.fromQueryString(window.location.search).deviceId; - if (deviceId) { - device = Ext.getStore('VisibleDevices').findRecord('id', deviceId, 0, false, true, true); + uniqueId = Ext.Object.fromQueryString(window.location.search).deviceId; + if (uniqueId) { + device = Ext.getStore('VisibleDevices').findRecord('uniqueId', uniqueId, 0, false, true, true); if (device) { this.fireEvent('selectdevice', device, true); } diff --git a/web/app/model/Server.js b/web/app/model/Server.js index afafe908..177b4fc4 100644 --- a/web/app/model/Server.js +++ b/web/app/model/Server.js @@ -34,6 +34,9 @@ Ext.define('Traccar.model.Server', { }, { name: 'limitCommands', type: 'boolean' + }, { + name: 'disableReports', + type: 'boolean' }, { name: 'map', type: 'string' diff --git a/web/app/model/User.js b/web/app/model/User.js index 76f2a366..fcaff007 100644 --- a/web/app/model/User.js +++ b/web/app/model/User.js @@ -80,6 +80,9 @@ Ext.define('Traccar.model.User', { }, { name: 'limitCommands', type: 'boolean' + }, { + name: 'disableReports', + type: 'boolean' }, { name: 'poiLayer', type: 'string' diff --git a/web/app/store/CommonUserAttributes.js b/web/app/store/CommonUserAttributes.js index a8e92825..7d0ea969 100644 --- a/web/app/store/CommonUserAttributes.js +++ b/web/app/store/CommonUserAttributes.js @@ -1,5 +1,5 @@ /* - * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 - 2022 Anton Tananaev (anton@traccar.org) * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) * * This program is free software: you can redistribute it and/or modify @@ -38,10 +38,6 @@ Ext.define('Traccar.store.CommonUserAttributes', { allowDecimals: false, minValue: Traccar.Style.mapDefaultZoom, maxValue: Traccar.Style.mapMaxZoom - }, { - key: 'ui.disableReport', - name: Strings.attributeUiDisableReport, - valueType: 'boolean' }, { key: 'ui.disableEvents', name: Strings.attributeUiDisableEvents, diff --git a/web/app/store/MapTypes.js b/web/app/store/MapTypes.js index 9cca525e..01657565 100644 --- a/web/app/store/MapTypes.js +++ b/web/app/store/MapTypes.js @@ -20,6 +20,15 @@ Ext.define('Traccar.store.MapTypes', { fields: ['key', 'name'], data: [{ + key: 'locationIqStreets', + name: Strings.mapLocationIqStreets + }, { + key: 'locationIqEarth', + name: Strings.mapLocationIqEarth + }, { + key: 'locationIqHybrid', + name: Strings.mapLocationIqHybrid + }, { key: 'osm', name: Strings.mapOsm }, { diff --git a/web/app/view/MainController.js b/web/app/view/MainController.js index 7cd03050..8ed986af 100644 --- a/web/app/view/MainController.js +++ b/web/app/view/MainController.js @@ -1,5 +1,5 @@ /* - * Copyright 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2017 - 2022 Anton Tananaev (anton@traccar.org) * Copyright 2017 Andrey Kunitsyn (andrey@traccar.org) * * This program is free software: you can redistribute it and/or modify @@ -20,7 +20,7 @@ Ext.define('Traccar.view.MainController', { alias: 'controller.mainController', init: function () { - this.lookupReference('reportView').setHidden(Traccar.app.getBooleanAttributePreference('ui.disableReport')); + this.lookupReference('reportView').setHidden(Traccar.app.getPreference('disableReports', false)); this.lookupReference('eventsView').setHidden(Traccar.app.getBooleanAttributePreference('ui.disableEvents')); } }); diff --git a/web/app/view/ReportController.js b/web/app/view/ReportController.js index cc0fd4ac..4241df35 100644 --- a/web/app/view/ReportController.js +++ b/web/app/view/ReportController.js @@ -527,6 +527,12 @@ Ext.define('Traccar.view.ReportController', { renderer: function (value) { return Traccar.app.getEventString(value); } + }, { + text: Strings.positionAlarm, + dataIndex: 'attributes', + renderer: function (value) { + return value['alarm']; + } }, { text: Strings.sharedGeofence, dataIndex: 'geofenceId', diff --git a/web/app/view/State.js b/web/app/view/State.js index ed9951b5..c0a430d9 100644 --- a/web/app/view/State.js +++ b/web/app/view/State.js @@ -1,5 +1,5 @@ /* - * Copyright 2015 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -61,19 +61,20 @@ Ext.define('Traccar.view.State', { dataIndex: 'value', cellWrap: true, renderer: function (value, metaData, record) { - var position, device; - if (record.get('attribute') === 'alarm') { + var position, device, attribute; + attribute = record.get('attribute'); + if (attribute === 'alarm') { metaData.tdCls = 'view-color-red'; - } else if (record.get('name') === Strings.positionAddress && !value) { + } else if (attribute === 'address' && !value) { return '' + Strings.sharedShowAddress + ''; - } else if (record.get('name') === Strings.positionImage || record.get('name') === Strings.positionAudio) { + } else if (attribute === 'image' || attribute === 'video' || attribute === 'audio') { position = this.getController().position; if (position) { device = Ext.getStore('Devices').getById(position.get('deviceId')); if (device) { - return '' + - value + ''; + return '' + value + ''; } } } diff --git a/web/app/view/StateController.js b/web/app/view/StateController.js index 1ab1aa2f..f04d7185 100644 --- a/web/app/view/StateController.js +++ b/web/app/view/StateController.js @@ -1,5 +1,5 @@ /* - * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -128,6 +128,7 @@ Ext.define('Traccar.view.StateController', { store.add(Ext.create('Traccar.model.Attribute', { priority: this.keys[key].priority, name: this.keys[key].name, + attribute: key, value: Traccar.AttributeFormatter.getFormatter(key)(this.position.get(key)) })); } diff --git a/web/app/view/dialog/Login.js b/web/app/view/dialog/Login.js index 86917b94..d5658914 100644 --- a/web/app/view/dialog/Login.js +++ b/web/app/view/dialog/Login.js @@ -49,6 +49,47 @@ Ext.define('Traccar.view.dialog.Login', { display: 'block', margin: '10px auto 25px' } + }, { + xtype: 'pickerfield', + fieldLabel: Strings.settingsServer, + editable: false, + value: window.location.host, + hidden: !window.appInterface && !(window.webkit && window.webkit.messageHandlers.appInterface), + createPicker: function () { + var self = this, popup = Ext.create({ + xtype: 'window', + closeAction: 'hide', + referenceHolder: true, + minWidth: 204, + layout: 'form', + header: false, + resizable: true, + items: [{ + xtype: 'textfield', + anchor: '100%', + reference: 'serverAddress', + value: window.location.href + }], + fbar: [{ + text: Strings.sharedSet, + handler: function () { + var message = 'server|' + popup.lookupReference('serverAddress').getValue(); + if (window.webkit && window.webkit.messageHandlers.appInterface) { + window.webkit.messageHandlers.appInterface.postMessage(message); + } + if (window.appInterface) { + window.appInterface.postMessage(message); + } + } + }, { + text: Strings.sharedCancel, + handler: function () { + self.collapse(); + } + }] + }); + return popup; + } }, { xtype: 'combobox', name: 'language', diff --git a/web/app/view/dialog/Server.js b/web/app/view/dialog/Server.js index d9e225ec..6ee250b6 100644 --- a/web/app/view/dialog/Server.js +++ b/web/app/view/dialog/Server.js @@ -122,6 +122,12 @@ Ext.define('Traccar.view.dialog.Server', { uncheckedValue: false, name: 'limitCommands', fieldLabel: Strings.userLimitCommands + }, { + xtype: 'checkboxfield', + inputValue: true, + uncheckedValue: false, + name: 'disableReports', + fieldLabel: Strings.userDisableReports }] }] }, diff --git a/web/app/view/dialog/User.js b/web/app/view/dialog/User.js index 917f110c..7335ee79 100644 --- a/web/app/view/dialog/User.js +++ b/web/app/view/dialog/User.js @@ -144,6 +144,14 @@ Ext.define('Traccar.view.dialog.User', { fieldLabel: Strings.userLimitCommands, disabled: true, reference: 'limitCommandsField' + }, { + xtype: 'checkboxfield', + inputValue: true, + uncheckedValue: false, + name: 'disableReports', + fieldLabel: Strings.userDisableReports, + disabled: true, + reference: 'disableReportsField' }, { xtype: 'datefield', name: 'expirationTime', diff --git a/web/app/view/dialog/UserController.js b/web/app/view/dialog/UserController.js index 7383f9ee..4ba48563 100644 --- a/web/app/view/dialog/UserController.js +++ b/web/app/view/dialog/UserController.js @@ -31,6 +31,7 @@ Ext.define('Traccar.view.dialog.UserController', { this.lookupReference('expirationTimeField').setDisabled(false); this.lookupReference('deviceReadonlyField').setDisabled(false); this.lookupReference('limitCommandsField').setDisabled(false); + this.lookupReference('disableReportsField').setDisabled(false); } }, diff --git a/web/app/view/map/BaseMap.js b/web/app/view/map/BaseMap.js index efd05021..c27a8d79 100644 --- a/web/app/view/map/BaseMap.js +++ b/web/app/view/map/BaseMap.js @@ -30,12 +30,13 @@ Ext.define('Traccar.view.map.BaseMap', { }, initMap: function () { - var server, layer, type, bingKey, lat, lon, zoom, maxZoom, target, poiLayer, self = this; + var server, layer, type, bingKey, locationIqKey, lat, lon, zoom, maxZoom, target, poiLayer, self = this; server = Traccar.app.getServer(); type = Traccar.app.getPreference('map', null); bingKey = server.get('bingKey'); + locationIqKey = Traccar.app.getAttributePreference('locationIqKey', 'pk.0f147952a41c555a5b70614039fd148b'); layer = new ol.layer.Group({ title: Strings.mapLayer, @@ -125,8 +126,35 @@ Ext.define('Traccar.view.map.BaseMap', { new ol.layer.Tile({ title: Strings.mapOsm, type: 'base', - visible: type === 'osm' || type === 'wikimedia' || !type, + visible: type === 'osm', source: new ol.source.OSM({}) + }), + new ol.layer.Tile({ + title: Strings.mapLocationIqHybrid, + type: 'base', + visible: type === 'locationIqHybrid', + source: new ol.source.XYZ({ + url: 'https://{a-c}-tiles.locationiq.com/v3/hybrid/r/{z}/{x}/{y}.jpg?key=' + locationIqKey, + attributions: '© LocationIQ' + }) + }), + new ol.layer.Tile({ + title: Strings.mapLocationIqEarth, + type: 'base', + visible: type === 'locationIqEarth', + source: new ol.source.XYZ({ + url: 'https://{a-c}-tiles.locationiq.com/v3/earth/r/{z}/{x}/{y}.jpg?key=' + locationIqKey, + attributions: '© LocationIQ' + }) + }), + new ol.layer.Tile({ + title: Strings.mapLocationIqStreets, + type: 'base', + visible: type === 'locationIqStreets' || type === 'wikimedia' || !type, + source: new ol.source.XYZ({ + url: 'https://{a-c}-tiles.locationiq.com/v3/streets/r/{z}/{x}/{y}.png?key=' + locationIqKey, + attributions: '© LocationIQ' + }) }) ] }); diff --git a/web/app/view/map/Map.js b/web/app/view/map/Map.js index fbaa7587..36e81de7 100644 --- a/web/app/view/map/Map.js +++ b/web/app/view/map/Map.js @@ -65,6 +65,13 @@ Ext.define('Traccar.view.map.Map', { pressed: true, stateId: 'show-geofences-button', tooltip: Strings.sharedGeofences + }, { + handler: 'showAccuracy', + reference: 'showAccuracyButton', + glyph: 'xf140@FontAwesome', + pressed: true, + stateId: 'show-accuracy-button', + tooltip: Strings.positionAccuracy }, { handler: 'showCurrentLocation', glyph: 'xf124@FontAwesome', @@ -95,6 +102,10 @@ Ext.define('Traccar.view.map.Map', { return this.accuracySource; }, + getAccuracyLayer: function () { + return this.accuracyLayer; + }, + getRouteSource: function () { return this.routeSource; }, @@ -133,10 +144,11 @@ Ext.define('Traccar.view.map.Map', { })); this.accuracySource = new ol.source.Vector({}); - this.map.addLayer(new ol.layer.Vector({ + this.accuracyLayer = new ol.layer.Vector({ name: 'accuracyLayer', source: this.accuracySource - })); + }); + this.map.addLayer(this.accuracyLayer); this.markersSource = new ol.source.Vector({}); this.map.addLayer(new ol.layer.Vector({ diff --git a/web/app/view/map/MapController.js b/web/app/view/map/MapController.js index 7ba0ee3b..f6d88eed 100644 --- a/web/app/view/map/MapController.js +++ b/web/app/view/map/MapController.js @@ -1,5 +1,5 @@ /* - * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,7 +45,7 @@ Ext.define('Traccar.view.map.MapController', { init: function () { this.callParent(); this.lookupReference('showReportsButton').setVisible( - Traccar.app.isMobile() && !Traccar.app.getBooleanAttributePreference('ui.disableReport')); + Traccar.app.isMobile() && !Traccar.app.getPreference('disableReports', false)); this.lookupReference('showEventsButton').setVisible( Traccar.app.isMobile() && !Traccar.app.getBooleanAttributePreference('ui.disableEvents')); }, @@ -68,6 +68,10 @@ Ext.define('Traccar.view.map.MapController', { this.getView().getLiveRouteLayer().setVisible(button.pressed); }, + showAccuracy: function (button) { + this.getView().getAccuracyLayer().setVisible(button.pressed); + }, + getMapState: function () { var zoom, center, projection; projection = this.getView().getMapView().getProjection(); diff --git a/web/l10n/af.json b/web/l10n/af.json index 0042f7a0..a5456366 100644 --- a/web/l10n/af.json +++ b/web/l10n/af.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Veelhoek", "mapShapeCircle": "Sirkel", "mapShapePolyline": "Veelhoeklyn", @@ -373,7 +378,6 @@ "alarmJamming": "Seinverstoring", "alarmTemperature": "Temperatuur", "alarmParking": "Parkeer", - "alarmShock": "Skok", "alarmBonnet": "Enjinkap", "alarmFootBrake": "Voetrem", "alarmFuelLeak": "Brandstoflek", diff --git a/web/l10n/ar.json b/web/l10n/ar.json index 35a0654b..f69af6da 100644 --- a/web/l10n/ar.json +++ b/web/l10n/ar.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox للشوارع", "mapMapboxOutdoors": "Mapbox بالخارج", "mapMapboxSatellite": "Mapbox بالقمر الصناعي", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "مضلع", "mapShapeCircle": "دائرة", "mapShapePolyline": "متعدد الضلوع", @@ -373,7 +378,6 @@ "alarmJamming": "التشويش", "alarmTemperature": "الحرارة", "alarmParking": "اصطفاف", - "alarmShock": "صدمة", "alarmBonnet": "غطاء محرك السيارة", "alarmFootBrake": "فرامل القدم", "alarmFuelLeak": "تسرب وقود", diff --git a/web/l10n/az.json b/web/l10n/az.json index ccc33ae7..12d4f467 100644 --- a/web/l10n/az.json +++ b/web/l10n/az.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Çoxbucaq", "mapShapeCircle": "Dairə", "mapShapePolyline": "Xətt", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "düşərgə", - "alarmShock": "zərbə", "alarmBonnet": "Bonnet", "alarmFootBrake": "Ayaq əyləci", "alarmFuelLeak": "Yanacaq sızması", diff --git a/web/l10n/bg.json b/web/l10n/bg.json index b299d375..898e2000 100644 --- a/web/l10n/bg.json +++ b/web/l10n/bg.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Многоъгълник", "mapShapeCircle": "Кръг", "mapShapePolyline": "Линия", @@ -373,7 +378,6 @@ "alarmJamming": "Заглушаване", "alarmTemperature": "Температура", "alarmParking": "Паркиране", - "alarmShock": "Удар", "alarmBonnet": "Капак", "alarmFootBrake": "Спирачен педал", "alarmFuelLeak": "Теч на гориво", diff --git a/web/l10n/bn.json b/web/l10n/bn.json index 293f4425..b912a7cd 100644 --- a/web/l10n/bn.json +++ b/web/l10n/bn.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "বহুভুজ", "mapShapeCircle": "বৃত্ত / বৃত্তাকার", "mapShapePolyline": "পলিলাইন", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/cs.json b/web/l10n/cs.json index d88620da..edc40b33 100644 --- a/web/l10n/cs.json +++ b/web/l10n/cs.json @@ -127,18 +127,18 @@ "userExpirationTime": "Konec platnosti", "userDeviceLimit": "Limit zařízení", "userUserLimit": "Limit uživatele", - "userDeviceReadonly": "Zařízení je v módu pouze-čtení", + "userDeviceReadonly": "Zařízení pouze pro čtení", "userLimitCommands": "Limit příkazů", "userToken": "Token", "loginTitle": "Přihlášení", "loginLanguage": "Jazyk", - "loginReset": "Reset Password", + "loginReset": "Obnovit Heslo", "loginRegister": "Registrace", "loginLogin": "Přihlášení", "loginFailed": "Nesprávný email nebo heslo", "loginCreated": "Nový uživatel byl zaregistrován", - "loginResetSuccess": "Check your email", - "loginUpdateSuccess": "New password is set", + "loginResetSuccess": "Zkontroluj si email ", + "loginUpdateSuccess": "Nové heslo je nastaveno", "loginLogout": "Odhlášení", "loginLogo": "Logo", "devicesAndState": "Zařízení a stav", @@ -151,7 +151,7 @@ "deviceCommand": "Příkaz", "deviceFollow": "Sledovat", "deviceTotalDistance": "Celková vzdálenost", - "deviceStatus": "Status", + "deviceStatus": "Stav", "deviceStatusOnline": "Online", "deviceStatusOffline": "Offline", "deviceStatusUnknown": "Neznámý", @@ -261,11 +261,16 @@ "mapMapboxStreets": "Mapbox ulice", "mapMapboxOutdoors": "Mapbox venkovní", "mapMapboxSatellite": "Mapbox satelit", + "mapMapTilerBasic": "MapTiler Základní", + "mapMapTilerHybrid": "MapTiler Hybridní", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybridní", "mapShapePolygon": "Mnohoúhelník", "mapShapeCircle": "Kruh", "mapShapePolyline": "Křivka", "mapLiveRoutes": "Trasy živě", - "mapCurrentLocation": "Current Location", + "mapCurrentLocation": "Současná pozice", "mapPoiLayer": "Vrstva s POI", "stateTitle": "Stav", "stateName": "Atribut", @@ -373,7 +378,6 @@ "alarmJamming": "Zaseknutí", "alarmTemperature": "Teplota", "alarmParking": "Parkování", - "alarmShock": "Otřes", "alarmBonnet": "Kapota", "alarmFootBrake": "Nožní brzda", "alarmFuelLeak": "Únik paliva", @@ -398,7 +402,7 @@ "reportConfigure": "Nastavit", "reportEventTypes": "Typy událostí", "reportChartType": "Typ grafu", - "reportShowMarkers": "Zobrazit markery", + "reportShowMarkers": "Zobrazit značky", "reportExport": "Exportovat", "reportEmail": "Zaslat report mailem", "reportPeriod": "Období", @@ -412,7 +416,7 @@ "reportDeviceName": "Jméno zařízení", "reportAverageSpeed": "Průměrná rychlost", "reportMaximumSpeed": "Maximální rychlost", - "reportEngineHours": "Hodiny motoru", + "reportEngineHours": "Motohodiny", "reportDuration": "Trvání", "reportStartDate": "Počáteční datum", "reportStartTime": "Čas startu", @@ -440,7 +444,7 @@ "categoryCar": "Auto", "categoryCrane": "Jeřáb", "categoryHelicopter": "Helikoptéra", - "categoryMotorcycle": "Motorka", + "categoryMotorcycle": "Motocykl", "categoryOffroad": "Offroad", "categoryPerson": "Osoba", "categoryPickup": "Pickup", diff --git a/web/l10n/da.json b/web/l10n/da.json index 61ac5cd7..8b3f955d 100644 --- a/web/l10n/da.json +++ b/web/l10n/da.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox gader", "mapMapboxOutdoors": "Mapbox udendørs", "mapMapboxSatellite": "Mapbox satellit", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygon", "mapShapeCircle": "Cirkel", "mapShapePolyline": "Polyline", @@ -373,7 +378,6 @@ "alarmJamming": "Fastklemning", "alarmTemperature": "Temperatur", "alarmParking": "Parkering", - "alarmShock": "Stød", "alarmBonnet": "Motorhjelm", "alarmFootBrake": "Fodbremse", "alarmFuelLeak": "Brændstoflækage", diff --git a/web/l10n/de.json b/web/l10n/de.json index e20d8378..68a5ada8 100644 --- a/web/l10n/de.json +++ b/web/l10n/de.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygon", "mapShapeCircle": "Kreis", "mapShapePolyline": "Polylinie", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperatur", "alarmParking": "Parken", - "alarmShock": "Erschütterung", "alarmBonnet": "Haube", "alarmFootBrake": "Betriebsbremse", "alarmFuelLeak": "Treibstoffleck", diff --git a/web/l10n/el.json b/web/l10n/el.json index 6d6be3e2..c3a8c7dd 100644 --- a/web/l10n/el.json +++ b/web/l10n/el.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Πολύγωνο", "mapShapeCircle": "Κύκλος", "mapShapePolyline": "Polyline", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/en.json b/web/l10n/en.json index 97243a69..6f1cbc4c 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -106,7 +106,6 @@ "attributeMailSmtpAuth": "Mail: SMTP Auth Enable", "attributeMailSmtpUsername": "Mail: SMTP Username", "attributeMailSmtpPassword": "Mail: SMTP Password", - "attributeUiDisableReport": "UI: Disable Report", "attributeUiDisableEvents": "UI: Disable Events", "attributeUiDisableVehicleFetures": "UI: Disable Vehicle Fetures", "attributeUiDisableDrivers": "UI: Disable Drivers", @@ -129,6 +128,7 @@ "userUserLimit": "User Limit", "userDeviceReadonly": "Device Readonly", "userLimitCommands": "Limit Commands", + "userDisableReports": "Disable Reports", "userToken": "Token", "loginTitle": "Login", "loginLanguage": "Language", @@ -263,6 +263,9 @@ "mapMapboxSatellite": "Mapbox Satellite", "mapMapTilerBasic": "MapTiler Basic", "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygon", "mapShapeCircle": "Circle", "mapShapePolyline": "Polyline", @@ -375,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/es.json b/web/l10n/es.json index 5cdf7838..8863155b 100644 --- a/web/l10n/es.json +++ b/web/l10n/es.json @@ -1,10 +1,10 @@ { - "sharedLoading": "Cargando...", + "sharedLoading": "Cargando…", "sharedHide": "Ocultar", "sharedSave": "Guardar", "sharedSet": "Establecer", "sharedCancel": "Cancelar", - "sharedAdd": "Agregar", + "sharedAdd": "Añadir", "sharedEdit": "Editar", "sharedRemove": "Eliminar", "sharedRemoveConfirm": "¿Eliminar elemento?", @@ -19,8 +19,8 @@ "sharedHour": "Hora", "sharedMinute": "Minuto", "sharedSecond": "Segundo", - "sharedDays": "días", - "sharedHours": "horas", + "sharedDays": "Días", + "sharedHours": "Horas", "sharedMinutes": "minutos", "sharedDecimalDegrees": "Grados", "sharedDegreesDecimalMinutes": "Minutos", @@ -28,8 +28,8 @@ "sharedName": "Nombre", "sharedDescription": "Descripción", "sharedSearch": "Buscar", - "sharedGeofence": "Geocerca", - "sharedGeofences": "Geocercas", + "sharedGeofence": "Geo-Zona", + "sharedGeofences": "Geo-Zonas", "sharedNotifications": "Notificaciones", "sharedNotification": "Notificación", "sharedAttributes": "Atributos", @@ -47,9 +47,9 @@ "sharedLiterAbbreviation": "I", "sharedGallonAbbreviation": "Galón", "sharedLiter": "Litro", - "sharedImpGallon": "Imp. Galón", - "sharedUsGallon": "U.S. Galón", - "sharedLiterPerHourAbbreviation": "I/h", + "sharedImpGallon": "Galón Imp.", + "sharedUsGallon": "Galón U.S.", + "sharedLiterPerHourAbbreviation": "L/h", "sharedGetMapState": "Obtener Estado del Mapa", "sharedComputedAttribute": "Atributo calculado", "sharedComputedAttributes": "Atributos calculados", @@ -70,31 +70,31 @@ "sharedTypeString": "Cadena", "sharedTypeNumber": "Número", "sharedTypeBoolean": "Booleano", - "sharedTimezone": "Zona horaria", + "sharedTimezone": "Zona Horaria", "sharedInfoTitle": "Información", "sharedSavedCommand": "Comando guardado", "sharedSavedCommands": "Comandos guardados", - "sharedNew": "Nuevo...", - "sharedShowAddress": "Mostrar Dirección", + "sharedNew": "Nuevo…", + "sharedShowAddress": "Mostrar calle", "sharedShowDetails": "Más detalles", "sharedDisabled": "Deshabilitado", "sharedMaintenance": "Mantenimientos", "sharedDeviceAccumulators": "Acumulador", "sharedAlarms": "Alarmas", "sharedLocation": "Ubicación", - "sharedImport": "Import", + "sharedImport": "Importar", "attributeSpeedLimit": "Límite de velocidad", "attributePolylineDistance": "Distancia de polilínea", "attributeReportIgnoreOdometer": "Reporte: Ignorar el odómetro", "attributeWebReportColor": "Web: Color de reporte", "attributeDevicePassword": "Contraseña de dispositivo", - "attributeDeviceInactivityStart": "Device Inactivity Start", - "attributeDeviceInactivityPeriod": "Device Inactivity Period", + "attributeDeviceInactivityStart": "Inicio de inactividad del dispositivo", + "attributeDeviceInactivityPeriod": "Periodo de inactividad del dispositivo", "attributeProcessingCopyAttributes": "Procesando: Copia de atributos", "attributeColor": "Color", - "attributeWebLiveRouteLength": "Web: Longitud de la ruta en vivo", + "attributeWebLiveRouteLength": "Web: Longitud de la ruta en directo", "attributeWebSelectZoom": "Web: hacer zoom al seleccionar", - "attributeWebMaxZoom": "Web: Zoom Máximo", + "attributeWebMaxZoom": "Web: Zoom máximo", "attributeMailSmtpHost": "Correo: Servidor SMTP", "attributeMailSmtpPort": "Correo: Puerto SMTP", "attributeMailSmtpStarttlsEnable": "Correo: Habilitar SMTP STARTTLS", @@ -106,40 +106,40 @@ "attributeMailSmtpAuth": "Correo: Habilitar autenticación SMTP", "attributeMailSmtpUsername": "Correo: Nombre de usuario SMTP", "attributeMailSmtpPassword": "Correo: Contraseña SMTP", - "attributeUiDisableReport": "UI: Deshabilitar reporte", - "attributeUiDisableEvents": "UI: Deshabilitar Eventos", - "attributeUiDisableVehicleFetures": "UI: Deshabilitar Características del vehiculo", + "attributeUiDisableReport": "UI: Deshabilitar panel Reportes", + "attributeUiDisableEvents": "UI: Deshabilitar panel Eventos", + "attributeUiDisableVehicleFetures": "UI: Deshabilitar características del vehículo", "attributeUiDisableDrivers": "UI: Deshabilitar Conductores", - "attributeUiDisableComputedAttributes": "UI: Deshabilitar Atributos Calculados", + "attributeUiDisableComputedAttributes": "UI: Deshabilitar Atributos calculados", "attributeUiDisableCalendars": "UI: Deshabilitar Calendario", "attributeUiDisableMaintenance": "UI: Deshabilitar Mantenimiento", "attributeUiHidePositionAttributes": "UI: Ocultar Atributos de Posición", "attributeNotificationTokens": "Notification Tokens", "errorTitle": "Error", - "errorGeneral": "Parámetros inválidos o violación de restricciónes", - "errorConnection": "Error de Conexión", - "errorSocket": "Error de conexión web", + "errorGeneral": "Parámetros no válidos o fuera de los límites", + "errorConnection": "Error en la conexión", + "errorSocket": "Error del Web-Socket", "errorZero": "No puede ser cero", "userEmail": "Email", "userPassword": "Contraseña", "userAdmin": "Administrador", "userRemember": "Recordar", - "userExpirationTime": "Vencimiento", - "userDeviceLimit": "Límite del dispositivo", - "userUserLimit": "Límite de usuario", + "userExpirationTime": "Caducidad", + "userDeviceLimit": "Límite de dispositivos", + "userUserLimit": "Límite de usuarios", "userDeviceReadonly": "Dispositivo de sólo lectura", "userLimitCommands": "Limitar Comandos", - "userToken": "Símbolo", - "loginTitle": "Ingresar", + "userToken": "Token Acceso", + "loginTitle": "Iniciar sesión", "loginLanguage": "Idioma", - "loginReset": "Reset Password", - "loginRegister": "Registrar", - "loginLogin": "Ingresar", - "loginFailed": "Dirección de correo o contraseña incorrecta", + "loginReset": "Reiniciar contraseña", + "loginRegister": "Registrarse", + "loginLogin": "Iniciar sesión", + "loginFailed": "Email o contraseña incorrecta", "loginCreated": "Se ha registrado un nuevo usuario", - "loginResetSuccess": "Check your email", - "loginUpdateSuccess": "New password is set", - "loginLogout": "Salir", + "loginResetSuccess": "Comprueba tu email", + "loginUpdateSuccess": "Se ha creado la nueva contraseña", + "loginLogout": "Cerrar Sesión", "loginLogo": "Logotipo", "devicesAndState": "Dispositivos y Estado", "deviceTitle": "Dispositivos", @@ -150,7 +150,7 @@ "deviceLastUpdate": "Última Actualización", "deviceCommand": "Comando", "deviceFollow": "Seguir", - "deviceTotalDistance": "Distancia total", + "deviceTotalDistance": "Distancia Total", "deviceStatus": "Estado", "deviceStatusOnline": "En línea", "deviceStatusOffline": "Fuera de línea", @@ -166,8 +166,8 @@ "settingsDistanceUnit": "Unidad de Distancia", "settingsSpeedUnit": "Unidad de Velocidad", "settingsVolumeUnit": "Unidad de Volumen", - "settingsTwelveHourFormat": "Formato de 12 horas", - "settingsCoordinateFormat": "Formato de coordenadas", + "settingsTwelveHourFormat": "Formato de 12h.", + "settingsCoordinateFormat": "Formato de Coordenadas", "reportTitle": "Reportes", "reportDevice": "Dispositivos", "reportGroup": "Grupo", @@ -182,16 +182,16 @@ "positionLongitude": "Longitud", "positionAltitude": "Altitud", "positionSpeed": "Velocidad", - "positionCourse": "Curso", - "positionAddress": "Dirección", + "positionCourse": "Rumbo", + "positionAddress": "Dirección Calle", "positionProtocol": "Protocolo", "positionDistance": "Distancia", "positionRpm": "RPM", "positionFuel": "Combustible", - "positionPower": "Corriente", + "positionPower": "Energía", "positionBattery": "Batería", "positionRaw": "Crudo", - "positionIndex": "Indice", + "positionIndex": "Índice / Index", "positionHdop": "HDOP", "positionVdop": "VDOP", "positionPdop": "PDOP", @@ -211,7 +211,7 @@ "positionInput": "Entrada", "positionOutput": "Salida", "positionBatteryLevel": "Nivel de batería", - "positionFuelConsumption": "Consumo de gasolina", + "positionFuelConsumption": "Consumo de combustible", "positionRfid": "RFDI", "positionVersionFw": "Versión de firmware", "positionVersionHw": "Versión de hardware", @@ -233,39 +233,44 @@ "positionDtcs": "DTCs", "positionObdSpeed": "Velocidad OBD", "positionObdOdometer": "Odómetro OBD", - "positionDriverUniqueId": "ID Único de conductor", + "positionDriverUniqueId": "ID única del conductor", "positionImage": "Imagen", "positionAudio": "Audio", "serverTitle": "Ajustes del servidor", "serverZoom": "Zoom", "serverRegistration": "Registro", "serverReadonly": "Sólo lectura", - "serverForceSettings": "Forzar Valores", - "serverAnnouncement": "Announcement", + "serverForceSettings": "Forzar estos ajustes", + "serverAnnouncement": "Mostrar anuncio", "mapTitle": "Mapa", - "mapLayer": "Capa de Mapa", + "mapLayer": "Capas del Mapa", "mapCustom": "Personalizado (XYZ)", "mapCustomArcgis": "ArcGIS Personalizado", "mapCustomLabel": "Mapa Personalizado", - "mapCarto": "Mapas base Carto", + "mapCarto": "Carto", "mapOsm": "Open Street Map", "mapBingKey": "Bing Maps Key", "mapBingRoad": "Bing Maps - Carretera", "mapBingAerial": "Bing Maps - Aéreo", - "mapBingHybrid": "Bing Maps híbrido", + "mapBingHybrid": "Bing Maps - Híbrido", "mapBaidu": "Baidu", "mapAutoNavi": "AutoNavi", - "mapYandexMap": "Mapa Yandex", + "mapYandexMap": "Yandex", "mapYandexSat": "Yandex Satélite", "mapWikimedia": "Wikimedia", "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polígono", "mapShapeCircle": "Círculo", "mapShapePolyline": "Polilínea", - "mapLiveRoutes": "Rutas en vivo", - "mapCurrentLocation": "Current Location", + "mapLiveRoutes": "Rutas en Directo", + "mapCurrentLocation": "Ubicación Actual", "mapPoiLayer": "Capa POI", "stateTitle": "Estado", "stateName": "Parámetro", @@ -277,42 +282,42 @@ "commandUnit": "Unidad", "commandCustom": "Comando personalizado", "commandDeviceIdentification": "Identificación de Dispositivo", - "commandPositionSingle": "Reporte único", + "commandPositionSingle": "Reporte Único", "commandPositionPeriodic": "Reporte Periódico", "commandPositionStop": "Detener Reporte", "commandEngineStop": "Apagar motor", "commandEngineResume": "Desbloquear Encendido de Motor", "commandAlarmArm": "Armar Alarma", "commandAlarmDisarm": "Desarmar Alarma", - "commandAlarmDismiss": "Dismiss Alarm", - "commandSetTimezone": "Establecer zona horaria", + "commandAlarmDismiss": "Descartar Alarma", + "commandSetTimezone": "Establecer Zona Horaria", "commandRequestPhoto": "Solicitar Foto", - "commandPowerOff": "Dispositivo apagado", + "commandPowerOff": "Apagar dispositivo", "commandRebootDevice": "Reiniciar dispositivo", - "commandFactoryReset": "Factory Reset", + "commandFactoryReset": "Valores de fábrica", "commandSendSms": "Enviar SMS", "commandSendUssd": "Enviar USSD", "commandSosNumber": "Establecer el número SOS", - "commandSilenceTime": "Setear horario de silencio", + "commandSilenceTime": "Establecer horario de silencio", "commandSetPhonebook": "Establecer contacto", "commandVoiceMessage": "Mensaje de voz", "commandOutputControl": "Control de Salidas", "commandVoiceMonitoring": "Monitoreo de Voz", - "commandSetAgps": "Configurar AGPS", - "commandSetIndicator": "Ajustar indicador", + "commandSetAgps": "Establecer AGPS", + "commandSetIndicator": "Establecer indicador", "commandConfiguration": "Configuración", "commandGetVersion": "Obtener Versión", "commandFirmwareUpdate": "Actualizar Firmware", - "commandSetConnection": "Configurar Conexión", - "commandSetOdometer": "Configurar Odómetro", + "commandSetConnection": "Establecer Conexión", + "commandSetOdometer": "Establecer Odómetro", "commandGetModemStatus": "Obtener Estatus de Módem", "commandGetDeviceStatus": "Obtener Estatus de Dispositivo", - "commandSetSpeedLimit": "Set Speed Limit", + "commandSetSpeedLimit": "Establecer Límite de Velocidad", "commandModePowerSaving": "Modificar Ahorro de Energía", - "commandModeDeepSleep": "Modificar Ahorro Profundo", + "commandModeDeepSleep": "Modificar Ahorro de energía Profundo", "commandMovementAlarm": "Alarma de Movimiento", "commandFrequency": "Frequencia", - "commandTimezone": "Compensación horaria", + "commandTimezone": "Compensación de zona horaria", "commandMessage": "Mensaje", "commandRadius": "Radio", "commandEnable": "Activado", @@ -321,32 +326,32 @@ "commandPhone": "Número de Teléfono", "commandServer": "Servidor", "commandPort": "Puerto", - "eventAll": "Todos los Eventos", - "eventDeviceOnline": "El Dispositivo Esta en Línea", - "eventDeviceUnknown": "El Estado del Dispositivo es Desconocido ", - "eventDeviceOffline": "El Dispositivo esta Fuera de Línea", - "eventDeviceInactive": "Dispositivo inactivo", - "eventDeviceMoving": "El Dispositivo esta en Movimiento ", - "eventDeviceStopped": "El Dispositivo se ha Detenido ", - "eventDeviceOverspeed": "El Dispositivo ha Excedido el Limite de Velocidad ", + "eventAll": "Todos los eventos", + "eventDeviceOnline": "Dispositivo en Línea", + "eventDeviceUnknown": "Dispositivo en estado Desconocido", + "eventDeviceOffline": "Dispositivo Fuera de Línea", + "eventDeviceInactive": "Dispositivo Inactivo", + "eventDeviceMoving": "Dispositivo en Movimiento", + "eventDeviceStopped": "Dispositivo Detenido", + "eventDeviceOverspeed": "Excedido el límite de Velocidad", "eventDeviceFuelDrop": "Perdida de Combustible ", - "eventCommandResult": "Resultado de comando", - "eventGeofenceEnter": "El Dispositivo ha entrado en la Geocerca ", - "eventGeofenceExit": "El Dispositivo ha salido de la Geocerca ", + "eventCommandResult": "Resultado del comando", + "eventGeofenceEnter": "Entrada en la Geo-Zona", + "eventGeofenceExit": "Salida de la Geo-Zona", "eventAlarm": "Alarma ", - "eventIgnitionOn": "Encendido ON", - "eventIgnitionOff": "Encendido OFF", - "eventMaintenance": "Requiere mantenimiento", + "eventIgnitionOn": "Llave encendido ON", + "eventIgnitionOff": "Llave encendido OFF", + "eventMaintenance": "Se requiere mantenimiento", "eventTextMessage": "Mensaje de texto recibido", - "eventDriverChanged": "El Conductor ha Cambiado", + "eventDriverChanged": "El conductor ha cambiado", "eventsScrollToLast": "Desplazarse hasta el último", "alarmGeneral": "General", "alarmSos": "SOS", "alarmVibration": "Vibración", "alarmMovement": "Movimiento", - "alarmLowspeed": " Rápida Aceleración", + "alarmLowspeed": "Baja Velocidad", "alarmOverspeed": "Exceso de Velocidad ", - "alarmFallDown": "Alarma de caida", + "alarmFallDown": "Alarma de caída", "alarmLowPower": "Energía baja", "alarmLowBattery": "Batería Baja", "alarmFault": "Alarma de fallo", @@ -355,39 +360,38 @@ "alarmDoor": "Puerta", "alarmLock": "Bloqueado", "alarmUnlock": "Desbloquear", - "alarmGeofence": "Geocerca", - "alarmGeofenceEnter": "El Dispositivo ha entrado a la Geocerca", - "alarmGeofenceExit": "El Dispositivo ha salido de la Geocerca ", + "alarmGeofence": "Geo-Zona", + "alarmGeofenceEnter": "El Dispositivo ha entrado a la Geo-Zona", + "alarmGeofenceExit": "El Dispositivo ha salido de la Geo-Zona", "alarmGpsAntennaCut": "Antena del GPS Cortada ", "alarmAccident": "Accidente", - "alarmTow": "Remolque", + "alarmTow": "Grúa de arrastre", "alarmIdle": "Reposo", "alarmHighRpm": "Altas revoluciones", "alarmHardAcceleration": "Aceleración brusca", - "alarmHardBraking": "Frenado extremo", + "alarmHardBraking": "Frenada extrema", "alarmHardCornering": "Giro brusco", "alarmLaneChange": "Cambio de carril", "alarmFatigueDriving": "Conducción fatigosa", - "alarmPowerCut": "Fuente de poder desconectada", - "alarmPowerRestored": "Fuente de poder restaurada", + "alarmPowerCut": "Energía desconectada", + "alarmPowerRestored": "Energía restaurada", "alarmJamming": "Interferencia", - "alarmTemperature": "Alarma de temperatura", + "alarmTemperature": "Temperatura", "alarmParking": "Aparcamiento", - "alarmShock": "Choque", "alarmBonnet": "Capó", "alarmFootBrake": "Freno de pie", - "alarmFuelLeak": "Drenaje de combustible", + "alarmFuelLeak": "Fuga de combustible", "alarmTampering": "Manipulación", "alarmRemoving": "Eliminando", "notificationType": "Tipo de Notificación", - "notificationAlways": "Todos los Dispositivos", + "notificationAlways": "Todos los dispositivos", "notificationNotificators": "Canales", "notificatorWeb": "Web", "notificatorMail": "Correo", "notificatorSms": "SMS", "notificatorFirebase": "Firebase", "notificatorTraccar": "Traccar", - "reportReplay": "Replay", + "reportReplay": "Repetir", "reportRoute": "Ruta", "reportEvents": "Eventos", "reportTrips": "Viajes", @@ -409,7 +413,7 @@ "reportPreviousWeek": "Semana anterior", "reportThisMonth": "Mes Actual", "reportPreviousMonth": "Mes Anterior", - "reportDeviceName": "Nombre de Dispositivo", + "reportDeviceName": "Nombre", "reportAverageSpeed": "Velocidad promedio", "reportMaximumSpeed": "Velocidad Máxima", "reportEngineHours": "Horas Motor", @@ -423,7 +427,7 @@ "reportStartOdometer": "Odómetro inical", "reportEndOdometer": "Odómetro final", "statisticsTitle": "Estadísticas", - "statisticsCaptureTime": "Tiempo de captura", + "statisticsCaptureTime": "Fecha de captura", "statisticsActiveUsers": "Usuarios Activos", "statisticsActiveDevices": "Dispositivos Activos", "statisticsRequests": "Peticiones", diff --git a/web/l10n/fa.json b/web/l10n/fa.json index 1a77883f..87d0ed22 100644 --- a/web/l10n/fa.json +++ b/web/l10n/fa.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "چند ضلعی", "mapShapeCircle": "دایره ", "mapShapePolyline": "چند خطی", @@ -373,7 +378,6 @@ "alarmJamming": "مسدود", "alarmTemperature": "دما", "alarmParking": "پارکینگ", - "alarmShock": "شوک", "alarmBonnet": "صندوق", "alarmFootBrake": "پدال ترمز", "alarmFuelLeak": "نشت باک", diff --git a/web/l10n/fi.json b/web/l10n/fi.json index 2b37d75a..43cdf864 100644 --- a/web/l10n/fi.json +++ b/web/l10n/fi.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Monikulmio", "mapShapeCircle": "Ympyrä", "mapShapePolyline": "Murtoviiva", @@ -373,7 +378,6 @@ "alarmJamming": "Häirintä", "alarmTemperature": "Lämpötila", "alarmParking": "Pysäköinti", - "alarmShock": "Isku", "alarmBonnet": "Konepelti", "alarmFootBrake": "Jalkajarru", "alarmFuelLeak": "Polttoainevuoto", diff --git a/web/l10n/fr.json b/web/l10n/fr.json index 076981ac..48ca84d7 100644 --- a/web/l10n/fr.json +++ b/web/l10n/fr.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygone", "mapShapeCircle": "Cercle", "mapShapePolyline": "Polyligne", @@ -373,7 +378,6 @@ "alarmJamming": "Brouillage", "alarmTemperature": "Température", "alarmParking": "Parking", - "alarmShock": "Choc", "alarmBonnet": "Capot", "alarmFootBrake": "Frein à pied", "alarmFuelLeak": "Fuite de carburant", diff --git a/web/l10n/he.json b/web/l10n/he.json index 53985e7e..d27b37ad 100644 --- a/web/l10n/he.json +++ b/web/l10n/he.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "פוליגון", "mapShapeCircle": "מעגל", "mapShapePolyline": "צלע", @@ -373,7 +378,6 @@ "alarmJamming": "שיבוש", "alarmTemperature": "טמפרטורה", "alarmParking": "חניה", - "alarmShock": "בולם", "alarmBonnet": "מכסה מנוע", "alarmFootBrake": "בלם ", "alarmFuelLeak": "דליפת דלק", diff --git a/web/l10n/hi.json b/web/l10n/hi.json index 6e18ec5d..eb688833 100644 --- a/web/l10n/hi.json +++ b/web/l10n/hi.json @@ -8,8 +8,8 @@ "sharedEdit": "संपादित करें", "sharedRemove": "हटाएं", "sharedRemoveConfirm": "आइटम हटाएं ?", - "sharedYes": "Yes", - "sharedNo": "No", + "sharedYes": "हाँ", + "sharedNo": "नहीं", "sharedKm": "किमी / किलोमीटर", "sharedMi": "एम आई", "sharedNmi": "nmi", @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "बहुभुज", "mapShapeCircle": "वृत्त", "mapShapePolyline": "पाली लाइन", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/hr.json b/web/l10n/hr.json index 7f0c44bf..358c9224 100644 --- a/web/l10n/hr.json +++ b/web/l10n/hr.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox ulice", "mapMapboxOutdoors": "Mapbox izvana", "mapMapboxSatellite": "Mapbox satelit", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Mnogokut", "mapShapeCircle": "Krug", "mapShapePolyline": "Razlomljena linija", @@ -373,7 +378,6 @@ "alarmJamming": "Ometanje", "alarmTemperature": "Temperatura", "alarmParking": "Parking", - "alarmShock": "Udar", "alarmBonnet": "Hauba", "alarmFootBrake": "Kočnica", "alarmFuelLeak": "Curenje goriva", diff --git a/web/l10n/hu.json b/web/l10n/hu.json index 18b56b13..35fcdb48 100644 --- a/web/l10n/hu.json +++ b/web/l10n/hu.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Poligon", "mapShapeCircle": "Kör", "mapShapePolyline": "Vonallánc", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/id.json b/web/l10n/id.json index 657e23f6..da8ab394 100644 --- a/web/l10n/id.json +++ b/web/l10n/id.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Poligon", "mapShapeCircle": "Lingkaran", "mapShapePolyline": "Garis Poli", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/it.json b/web/l10n/it.json index d727a0fb..c6427ba2 100644 --- a/web/l10n/it.json +++ b/web/l10n/it.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Poligono", "mapShapeCircle": "Cerchio", "mapShapePolyline": "Polylinea", @@ -373,7 +378,6 @@ "alarmJamming": "Disturbatore Frequenze", "alarmTemperature": "Temperatura", "alarmParking": "Parcheggio", - "alarmShock": "Incidente", "alarmBonnet": "Cofano", "alarmFootBrake": "Freno a pedale", "alarmFuelLeak": "Perdita carburante", diff --git a/web/l10n/ja.json b/web/l10n/ja.json index 61df9977..74c56409 100644 --- a/web/l10n/ja.json +++ b/web/l10n/ja.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "多角形", "mapShapeCircle": "円形", "mapShapePolyline": "折れ線形", @@ -373,7 +378,6 @@ "alarmJamming": "ジャミング", "alarmTemperature": "温度", "alarmParking": "駐車", - "alarmShock": "衝撃", "alarmBonnet": "ボンネット", "alarmFootBrake": "フットブレーキ", "alarmFuelLeak": "燃料漏れ", diff --git a/web/l10n/ka.json b/web/l10n/ka.json index 0acc10a0..a052d66a 100644 --- a/web/l10n/ka.json +++ b/web/l10n/ka.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox ქუჩები", "mapMapboxOutdoors": "Mapbox ღია ცის ქვეშ", "mapMapboxSatellite": "Mapbox სატელიტი", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "მრავალკუთხედი", "mapShapeCircle": "წრე", "mapShapePolyline": "ტეხილი ხაზები", @@ -373,7 +378,6 @@ "alarmJamming": "ჭექითი ცვეთა", "alarmTemperature": "ტემპერატურა", "alarmParking": "პარკინგი", - "alarmShock": "შოკი", "alarmBonnet": "კაპოტი", "alarmFootBrake": "ფეხის მუხრუჭი", "alarmFuelLeak": "საწვავის გაჟონვა", diff --git a/web/l10n/kk.json b/web/l10n/kk.json index a6589312..d47098e7 100644 --- a/web/l10n/kk.json +++ b/web/l10n/kk.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Көпбұрыш", "mapShapeCircle": "Шеңбер", "mapShapePolyline": "Сызық", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/km.json b/web/l10n/km.json index 9b3e24fa..1423888e 100644 --- a/web/l10n/km.json +++ b/web/l10n/km.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "ពហុកោណ", "mapShapeCircle": "រង្វង់", "mapShapePolyline": "ពហុបន្ទាត់", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/ko.json b/web/l10n/ko.json index 3a2ebe20..b525fed1 100644 --- a/web/l10n/ko.json +++ b/web/l10n/ko.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "다각형", "mapShapeCircle": "원형", "mapShapePolyline": "폴리라인", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/lo.json b/web/l10n/lo.json index 12c8ddf0..8c660a90 100644 --- a/web/l10n/lo.json +++ b/web/l10n/lo.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "ໂພລີກອນ", "mapShapeCircle": "ວົງກົມ", "mapShapePolyline": "Polyline", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/lt.json b/web/l10n/lt.json index 228a26a5..10c658ff 100644 --- a/web/l10n/lt.json +++ b/web/l10n/lt.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox gatvės", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Palydovinis", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygonas", "mapShapeCircle": "Apskritimas", "mapShapePolyline": "Polilinija", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/lv.json b/web/l10n/lv.json index b387aa78..0190beab 100644 --- a/web/l10n/lv.json +++ b/web/l10n/lv.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Daudzstūris", "mapShapeCircle": "Aplis", "mapShapePolyline": "Lauzta līnija", @@ -373,7 +378,6 @@ "alarmJamming": "Sastrēgums", "alarmTemperature": "Temperatūra", "alarmParking": "Stāvvieta", - "alarmShock": "Trieciens", "alarmBonnet": "Motora pārsegs", "alarmFootBrake": "Kājas bremze", "alarmFuelLeak": "Degvielas noplūde", diff --git a/web/l10n/ml.json b/web/l10n/ml.json index 9ce6d1a0..be91b14e 100644 --- a/web/l10n/ml.json +++ b/web/l10n/ml.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygon", "mapShapeCircle": "Circle", "mapShapePolyline": "Polyline", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/mn.json b/web/l10n/mn.json index 7675707e..c2688f87 100644 --- a/web/l10n/mn.json +++ b/web/l10n/mn.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygon", "mapShapeCircle": "Circle", "mapShapePolyline": "Polyline", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/ms.json b/web/l10n/ms.json index f94b432d..ef1d1ba7 100644 --- a/web/l10n/ms.json +++ b/web/l10n/ms.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygon", "mapShapeCircle": "Circle", "mapShapePolyline": "Polyline", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/nb.json b/web/l10n/nb.json index dbf5785f..83e474a2 100644 --- a/web/l10n/nb.json +++ b/web/l10n/nb.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Mangekant", "mapShapeCircle": "Sirkel", "mapShapePolyline": "Polylinje", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Tempratur", "alarmParking": "Parkering", - "alarmShock": "Støt", "alarmBonnet": "Panser", "alarmFootBrake": "Bremsepedal", "alarmFuelLeak": "Drivstofflekasje", diff --git a/web/l10n/ne.json b/web/l10n/ne.json index c6b0db49..3314f971 100644 --- a/web/l10n/ne.json +++ b/web/l10n/ne.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "बहुभुज", "mapShapeCircle": "वृत्त", "mapShapePolyline": "बहुरेखा", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "तापक्रम", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/nl.json b/web/l10n/nl.json index 4447ed53..859fde4d 100644 --- a/web/l10n/nl.json +++ b/web/l10n/nl.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygoon", "mapShapeCircle": "Cirkel", "mapShapePolyline": "Polylijn", @@ -373,7 +378,6 @@ "alarmJamming": "Verstoring", "alarmTemperature": "Temperatuur", "alarmParking": "Parkeren", - "alarmShock": "Schok", "alarmBonnet": "Motorkap", "alarmFootBrake": "Voetrem", "alarmFuelLeak": "Brandstoflek", diff --git a/web/l10n/nn.json b/web/l10n/nn.json index d275369b..19922e00 100644 --- a/web/l10n/nn.json +++ b/web/l10n/nn.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Mangekant", "mapShapeCircle": "Sirkel", "mapShapePolyline": "Polylinje", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperatur", "alarmParking": "Parkering", - "alarmShock": "Sjokk", "alarmBonnet": "Motorpanser", "alarmFootBrake": "Bremsepedal", "alarmFuelLeak": "Drivstofflekkasje", diff --git a/web/l10n/pl.json b/web/l10n/pl.json index d67da1e8..0ff64b00 100644 --- a/web/l10n/pl.json +++ b/web/l10n/pl.json @@ -252,15 +252,20 @@ "mapBingKey": "Bing Maps Key", "mapBingRoad": "Bing Maps Road", "mapBingAerial": "Bing Maps Aerial", - "mapBingHybrid": "Mapa hybrydowa Bing", + "mapBingHybrid": "Bing Maps Hybrid", "mapBaidu": "Baidu", - "mapAutoNavi": "Auto nawigacja", - "mapYandexMap": "Mapa Yandex", - "mapYandexSat": "Satelita Yandex", + "mapAutoNavi": "AutoNavi", + "mapYandexMap": "Yandex Map", + "mapYandexSat": "Yandex Satellite", "mapWikimedia": "Wikimedia", - "mapMapboxStreets": "Mapbox ulice", - "mapMapboxOutdoors": "Mapbox na zewnątrz", - "mapMapboxSatellite": "Mapbox satelity", + "mapMapboxStreets": "Mapbox Streets", + "mapMapboxOutdoors": "Mapbox Outdoors", + "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Wielokąt", "mapShapeCircle": "Okrąg", "mapShapePolyline": "Krzywa", @@ -373,7 +378,6 @@ "alarmJamming": "Zakłócanie", "alarmTemperature": "Temperatura", "alarmParking": "Parkowanie", - "alarmShock": "Wstrząs", "alarmBonnet": "Maska", "alarmFootBrake": "Hamulec nożny", "alarmFuelLeak": "Wyciek paliwa", diff --git a/web/l10n/pt.json b/web/l10n/pt.json index 1f76ad7d..db612938 100644 --- a/web/l10n/pt.json +++ b/web/l10n/pt.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Ruas", "mapMapboxOutdoors": "Mapbox ao ar livre", "mapMapboxSatellite": "Mapbox Satélite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polígono", "mapShapeCircle": "Circulo", "mapShapePolyline": "Linha Polígono", @@ -373,7 +378,6 @@ "alarmJamming": "Alarme de Bloqueio", "alarmTemperature": "Temperatura", "alarmParking": "Estacionamento", - "alarmShock": "Choque", "alarmBonnet": "Alarme do Capô", "alarmFootBrake": "Alarme de Travão de Mão", "alarmFuelLeak": "Perda de Combustivel", diff --git a/web/l10n/pt_BR.json b/web/l10n/pt_BR.json index 8a22b3aa..b8f41975 100644 --- a/web/l10n/pt_BR.json +++ b/web/l10n/pt_BR.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Ruas", "mapMapboxOutdoors": "Mapbox ao ar livre", "mapMapboxSatellite": "Mapbox Satélite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polígono", "mapShapeCircle": "Círculo", "mapShapePolyline": "Polilinha", @@ -373,7 +378,6 @@ "alarmJamming": "Interferência", "alarmTemperature": "Temperatura", "alarmParking": "Estacionamento", - "alarmShock": "Choque", "alarmBonnet": "Capô", "alarmFootBrake": "Freio de mão", "alarmFuelLeak": "Vazamento de combustível", diff --git a/web/l10n/ro.json b/web/l10n/ro.json index 8a36f2d3..d4eaa197 100644 --- a/web/l10n/ro.json +++ b/web/l10n/ro.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Poligon", "mapShapeCircle": "Cerc", "mapShapePolyline": "Polilinie", @@ -373,7 +378,6 @@ "alarmJamming": "Bruiaj", "alarmTemperature": "Temperatura", "alarmParking": "Parcare", - "alarmShock": "Soc", "alarmBonnet": "Capota", "alarmFootBrake": "Frana de serviciu", "alarmFuelLeak": "Pierdere combustibil", diff --git a/web/l10n/ru.json b/web/l10n/ru.json index 526d9cda..608d934c 100644 --- a/web/l10n/ru.json +++ b/web/l10n/ru.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Улицы", "mapMapboxOutdoors": "Mapbox Топография", "mapMapboxSatellite": "Mapbox Спутник", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Многоугольник", "mapShapeCircle": "Круг", "mapShapePolyline": "Линия", @@ -373,7 +378,6 @@ "alarmJamming": "Заглушено", "alarmTemperature": "Температура", "alarmParking": "Парковка", - "alarmShock": "Шок", "alarmBonnet": "Капот", "alarmFootBrake": "Ножной тормоз", "alarmFuelLeak": "Утечка топлива", diff --git a/web/l10n/si.json b/web/l10n/si.json index 40fa1b2d..afa28f6d 100644 --- a/web/l10n/si.json +++ b/web/l10n/si.json @@ -1,37 +1,37 @@ { - "sharedLoading": "පූරණය කරමින් ...", + "sharedLoading": "පූරණය වෙමින්...", "sharedHide": "සඟවන්න", "sharedSave": "සුරකින්න", "sharedSet": "සකසන්න", "sharedCancel": "අවලංගු කරන්න", "sharedAdd": "එක් කරන්න", - "sharedEdit": "සංස්කරණය කරන්න", + "sharedEdit": "සංස්කරණය", "sharedRemove": "ඉවත් කරන්න", - "sharedRemoveConfirm": "අයිතමය ඉවත් කරන්න ද?", + "sharedRemoveConfirm": "Remove item?", "sharedYes": "Yes", "sharedNo": "No", "sharedKm": "කි.මී.", "sharedMi": "සැතපුම්", "sharedNmi": "nmi", "sharedKn": "kn", - "sharedKmh": "කි.මී / පැ ", + "sharedKmh": "කි.මී/පැ ", "sharedMph": "mph", "sharedHour": "පැය", - "sharedMinute": "මිනිත්තු", + "sharedMinute": "විනාඩි", "sharedSecond": "තත්පර", - "sharedDays": "දින", + "sharedDays": "දවස්", "sharedHours": "පැය", - "sharedMinutes": "මිනිත්තු", + "sharedMinutes": "විනාඩි", "sharedDecimalDegrees": "දශම අංශක", - "sharedDegreesDecimalMinutes": "දශම අංශක මිනිත්තු", + "sharedDegreesDecimalMinutes": "Degrees Decimal Minutes", "sharedDegreesMinutesSeconds": "දශම අංශක තප්පර ", "sharedName": "නම", - "sharedDescription": "විස්තරය", + "sharedDescription": "සවිස්තරය", "sharedSearch": "සොයන්න", "sharedGeofence": "භූ වැටිය", "sharedGeofences": "භූ වැටි", - "sharedNotifications": "නිවේදන", - "sharedNotification": "දැනුම්දීම්", + "sharedNotifications": "දැනුම්දීම්", + "sharedNotification": "දැනුම්දීම", "sharedAttributes": "උපලක්ෂණ", "sharedAttribute": "උපලක්ෂණය", "sharedDrivers": "රියදුරන්", @@ -42,8 +42,8 @@ "sharedDistance": "දුර", "sharedHourAbbreviation": "පැ.", "sharedMinuteAbbreviation": "මි.", - "sharedSecondAbbreviation": "තත්පර", - "sharedVoltAbbreviation": "වෝල්ට්", + "sharedSecondAbbreviation": "තත්.", + "sharedVoltAbbreviation": "V", "sharedLiterAbbreviation": "l", "sharedGallonAbbreviation": "ගැලුම්", "sharedLiter": "ලීටර", @@ -56,9 +56,9 @@ "sharedCheckComputedAttribute": "ගණනය කළ ගුණාංගය පරීක්ෂා කරන්න", "sharedExpression": "ප්‍රකාශනය", "sharedDevice": "උපාංගය", - "sharedTestNotification": "ටෙස්ට් දැනුම්දීම් යවන්න", + "sharedTestNotification": "අත්හදාබැලීමේ දැනුම්දීම යවන්න", "sharedCalendar": "දින දසුන", - "sharedCalendars": "දින දර්ශන", + "sharedCalendars": "දින දසුන්", "sharedFile": "ගොනුව", "sharedSelectFile": "ගොනුව තෝරන්න", "sharedPhone": "දුරකථනය", @@ -77,7 +77,7 @@ "sharedNew": "අලුත්…", "sharedShowAddress": "ලිපිනය පෙන්වන්න", "sharedShowDetails": "More Details", - "sharedDisabled": "අබාධිතයි", + "sharedDisabled": "අබල කර ඇත", "sharedMaintenance": "නඩත්තුව", "sharedDeviceAccumulators": "Accumulators", "sharedAlarms": "Alarms", @@ -85,42 +85,42 @@ "sharedImport": "Import", "attributeSpeedLimit": "වේග සීමාව", "attributePolylineDistance": "Polyline Distance", - "attributeReportIgnoreOdometer": "වාර්තාව: නොසලකා හරිනවා ප්රතිමාවේ", - "attributeWebReportColor": "වෙබ්: වාර්තාවේ වර්ණ", - "attributeDevicePassword": "උපාංග මුරපදය", + "attributeReportIgnoreOdometer": "වාර්තාව: සැතපුම්මානය නොසලකන්න", + "attributeWebReportColor": "වියමන: පාට වාර්තාකරන්න", + "attributeDevicePassword": "උපාංගයේ මුරපදය", "attributeDeviceInactivityStart": "Device Inactivity Start", "attributeDeviceInactivityPeriod": "Device Inactivity Period", - "attributeProcessingCopyAttributes": "සැකසුම: පිටපත් ලක්ෂණ", + "attributeProcessingCopyAttributes": "Processing: Copy Attributes", "attributeColor": "වර්ණ", - "attributeWebLiveRouteLength": "වෙබ්: සජීවී මාර්ග දිග", - "attributeWebSelectZoom": "වෙබ්: වැඩි කරන්න තෝරන්න", - "attributeWebMaxZoom": "වෙබ්: උපරිම විශාලනය", - "attributeMailSmtpHost": "විද්‍යුත් තැපැල් : SMTP සත්කාරකය", - "attributeMailSmtpPort": "විද්‍යුත් තැපැල් : SMTP පෝට්", - "attributeMailSmtpStarttlsEnable": "විද්‍යුත් තැපැල් : SMTP STARTTLS සක්‍රීයයි ", - "attributeMailSmtpStarttlsRequired": "විද්‍යුත් තැපැල් : SMTP STARTTLS අවශයි ", - "attributeMailSmtpSslEnable": "විද්‍යුත් තැපැල් : SMTP SSL සක්‍රීයයි", - "attributeMailSmtpSslTrust": "විද්‍යුත් තැපැල් : SSL විශ්වාසය", - "attributeMailSmtpSslProtocols": "විද්‍යුත් තැපැල් : SMTP SSL ප්‍රොටෝකෝලය ", - "attributeMailSmtpFrom": "විද්‍යුත් තැපැල් : SMTP පත්‍රිකාව ", - "attributeMailSmtpAuth": "විද්‍යුත් තැපැල් : SMTP Auth සක්‍රීයයි", - "attributeMailSmtpUsername": "විද්‍යුත් තැපැල් : SMTP  පරිශීලක නාමය", - "attributeMailSmtpPassword": "විද්‍යුත් තැපැල් : SMTP මුරපදය", - "attributeUiDisableReport": "UI: වාර්තාව අක්‍රිය කරන්න", - "attributeUiDisableEvents": "UI: සිදුවීම් අක්‍රිය කරන්න", - "attributeUiDisableVehicleFetures": "වාහනයේ විශේෂාංග අක්‍රිය කරන්න ", - "attributeUiDisableDrivers": "UI: ධාවකය අක්‍රිය කරන්න", - "attributeUiDisableComputedAttributes": "UI: පරිගණකගත ගුණාංග අක්‍රිය කරන්න", - "attributeUiDisableCalendars": "UI: දින දර්ශන අක්‍රිය කරන්න", + "attributeWebLiveRouteLength": "Web: Live Route Length", + "attributeWebSelectZoom": "Web: Zoom On Select", + "attributeWebMaxZoom": "වියමන: උපරිම විශාලනය", + "attributeMailSmtpHost": "තැපෑල: ස.තැ.මා.කෙ. සත්කාරකය", + "attributeMailSmtpPort": "තැපෑල: ස.තැ.මා.කෙ. කෙවෙනිය", + "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS Enable", + "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS Required", + "attributeMailSmtpSslEnable": "Mail: SMTP SSL Enable", + "attributeMailSmtpSslTrust": "Mail: SMTP SSL Trust", + "attributeMailSmtpSslProtocols": "Mail: SMTP SSL Protocols", + "attributeMailSmtpFrom": "Mail: SMTP From", + "attributeMailSmtpAuth": "Mail: SMTP Auth Enable", + "attributeMailSmtpUsername": "තැපෑල: ස.තැ.මා.කෙ. පරිශීලකනාමය", + "attributeMailSmtpPassword": "තැපෑල: ස.තැ.මා.කෙ. මුරපදය", + "attributeUiDisableReport": "අ.මු.: වාර්තාව අබල කරන්න", + "attributeUiDisableEvents": "අ.මු.: සිදුවීම් අබල කරන්න", + "attributeUiDisableVehicleFetures": "අ.මු.: වාහනයේ විශේෂාංග අබල කරන්න", + "attributeUiDisableDrivers": "UI: Disable Drivers", + "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes", + "attributeUiDisableCalendars": "අ.මු.: දින දසුන අබල කරන්න", "attributeUiDisableMaintenance": "UI: Disable Maintenance", "attributeUiHidePositionAttributes": "UI: Hide Position Attributes", "attributeNotificationTokens": "Notification Tokens", - "errorTitle": "දෝෂයක් ", - "errorGeneral": "අවලංගු පරාමිති හෝ බාධක උල්ලංඝනය කිරීම", - "errorConnection": "සම්බන්ධතා දෝෂයක් !", - "errorSocket": "වෙබ් සොකට් සම්බන්ධතා දෝෂය", - "errorZero": "ශුන්ය විය නොහැක", - "userEmail": "විද්‍යුත් තැපෑල", + "errorTitle": "දෝෂයකි", + "errorGeneral": "Invalid parameters or constraints violation", + "errorConnection": "සම්බන්ධතාවේ දෝෂයකි", + "errorSocket": "Web socket connection error", + "errorZero": "ශුන්ය විය නොහැකිය", + "userEmail": "වි-තැපෑල", "userPassword": "මුරපදය", "userAdmin": "පරිපාලක", "userRemember": "මතක තබාගන්න", @@ -130,51 +130,51 @@ "userDeviceReadonly": "උපාංගය කියවීම පමණි", "userLimitCommands": "සීමිත විධානයන්", "userToken": "Token", - "loginTitle": "පිවිසුම් ගිණුම", + "loginTitle": "ඇතුල් වන්න", "loginLanguage": "භාෂාව", "loginReset": "Reset Password", - "loginRegister": "ලියාපදිංචි කරන්න", - "loginLogin": "පිවිසුම", - "loginFailed": "ඊ-මේල් ලිපිනය හෝ මුරපදය වැරදිය !", - "loginCreated": "නව පරිශීලක ලියාපදිංචි කරන ලදි !", + "loginRegister": "ලියාපදිංචි වන්න", + "loginLogin": "ඇතුල් වන්න", + "loginFailed": "වි-තැපැල් ලිපිනය හෝ මුරපදය වැරදිය!", + "loginCreated": "New user has been registered", "loginResetSuccess": "Check your email", "loginUpdateSuccess": "New password is set", - "loginLogout": "ඉවත්වන්න", + "loginLogout": "නික්මෙන්න", "loginLogo": "ලාංඡනය", - "devicesAndState": "උපාංග සහ ස්වභාවය", + "devicesAndState": "උපාංග සහ තත්වය", "deviceTitle": "උපාංග", - "deviceIdentifier": "හඳුනාගැනීමේ කේතය", + "deviceIdentifier": "හඳුන්වනය", "deviceModel": "ආකෘතිය", - "deviceContact": "අමතන්න", - "deviceCategory": "වර්ගය", - "deviceLastUpdate": "අවසන් යාවත්කාලීනය", + "deviceContact": "Contact", + "deviceCategory": "ප්‍රවර්ගය", + "deviceLastUpdate": "අවසන් යාවත්කාලය", "deviceCommand": "විධානය", "deviceFollow": "ලුහුබඳින්න", - "deviceTotalDistance": "සම්පූර්ණ දුර ප්‍රමාණය ", + "deviceTotalDistance": "මුළු දුර", "deviceStatus": "තත්ත්වය", - "deviceStatusOnline": "සම්බන්ධිතය", - "deviceStatusOffline": "අසම්බන්ධිතය", + "deviceStatusOnline": "Online", + "deviceStatusOffline": "Offline", "deviceStatusUnknown": "නොදන්නා", "groupDialog": "සමූහය", "groupParent": "සමූහය", - "groupNoGroup": "සමූහ එපා", + "groupNoGroup": "සමූහ නැත", "settingsTitle": "සැකසුම්", "settingsUser": "ගිණුම", "settingsGroups": "සමූහ", "settingsServer": "සේවාදායකය", - "settingsUsers": "පරිශීලකයන්", - "settingsDistanceUnit": "දුරස්ථ අංශය", + "settingsUsers": "පරිශීලකයින්", + "settingsDistanceUnit": "Distance Unit", "settingsSpeedUnit": "වේග ඒකකයක්", "settingsVolumeUnit": "Volume Unit", "settingsTwelveHourFormat": "පැය 12 ආකෘතිය", - "settingsCoordinateFormat": "සම්බන්ධීකරණ ආකෘතිය", + "settingsCoordinateFormat": "Coordinates Format", "reportTitle": "වාර්තා", "reportDevice": "උපාංගය", "reportGroup": "සමුහය", "reportFrom": "සිට", "reportTo": "දක්වා", "reportShow": "පෙන්වන්න", - "reportClear": "ඉවත් කරන්න", + "reportClear": "හිස් කරන්න", "positionFixTime": "කාලය", "positionValid": "වලංගු", "positionAccuracy": "නිරවද්යතාව", @@ -184,13 +184,13 @@ "positionSpeed": "වේගය", "positionCourse": "දිගංශය", "positionAddress": "ලිපිනය", - "positionProtocol": "ප්රොටොකෝලය", + "positionProtocol": "කෙටුම්පත", "positionDistance": "දුර", "positionRpm": "RPM", "positionFuel": "ඉන්ධන", "positionPower": "බලය", - "positionBattery": "බැටරි", - "positionRaw": "අමු", + "positionBattery": "වියළිකෝෂය", + "positionRaw": "Raw", "positionIndex": "Index", "positionHdop": "HDOP", "positionVdop": "VDOP", @@ -201,46 +201,46 @@ "positionGps": "ගි.පි.එස් ", "positionRoaming": "Roaming", "positionEvent": "සිදුවීම", - "positionAlarm": "ශබ්දය", + "positionAlarm": "Alarm", "positionStatus": "තත්ත්වය", - "positionOdometer": "මීටරය ", - "positionServiceOdometer": "සේවා මීටරය ", - "positionTripOdometer": "සංචාර මීටරය ", + "positionOdometer": "සැතපුම්මානය", + "positionServiceOdometer": "සේවා සැතපුම්මානය", + "positionTripOdometer": "චාරිකා සැතපුම්මානය", "positionHours": "පැය", "positionSteps": "පියවර", - "positionInput": "ආදාන", - "positionOutput": "ප්‍රිතිදාන ", - "positionBatteryLevel": "බැටරි මට්ටම", + "positionInput": "ආදානය", + "positionOutput": "ප්‍රතිදානය", + "positionBatteryLevel": "විදුලිකෝෂයේ මට්ටම", "positionFuelConsumption": "ඉන්ධන පරිභෝජනය", "positionRfid": "RFID", - "positionVersionFw": "ෆර්ම්වෙයාර් සංස්කරණය", - "positionVersionHw": "දෘඩාංග සංස්කරණය", + "positionVersionFw": "ස්ථිරාංගයේ අනුවාදය", + "positionVersionHw": "දෘඩාංගයේ අනුවාදය", "positionIgnition": "තාපනය", - "positionFlags": "කොඩි", + "positionFlags": "Flags", "positionCharge": "ගාස්තුව", - "positionIp": "අයි.පි ", - "positionArchive": "ලේඛනාගාරය", + "positionIp": "අ.ජා.කෙ.", + "positionArchive": "සංරක්‍ෂිතය", "positionVin": "VIN", "positionApproximate": "දළ වශයෙන්", "positionThrottle": "Throttle", - "positionMotion": "යෝජනාව", + "positionMotion": "චලනය", "positionArmed": "ආයුධ", "positionAcceleration": "ත්වරණය", - "positionDeviceTemp": "උපකරණයේ උෂ්ණත්වය", + "positionDeviceTemp": "උපාංගයේ උෂ්ණත්වය", "positionOperator": "ක්‍රියාකරු ", "positionCommand": "විධානය", - "positionBlocked": "බ්ලොක් වී ඇත", + "positionBlocked": "අවහිර කර ඇත", "positionDtcs": "DTCs", - "positionObdSpeed": "OBD වේගය", - "positionObdOdometer": "OBD මීටරය ", + "positionObdSpeed": "OBD Speed", + "positionObdOdometer": "OBD Odometer", "positionDriverUniqueId": "Driver Unique Id", "positionImage": "රූප", - "positionAudio": "ශබ්දය ", + "positionAudio": "Audio", "serverTitle": "සේවාදායකයේ සැකසුම්", "serverZoom": "විශාලනය", "serverRegistration": "ලියාපදිංචි කිරීම", "serverReadonly": "කියවීමට පමණි", - "serverForceSettings": "බලය සැකසීම්", + "serverForceSettings": "Force Settings", "serverAnnouncement": "Announcement", "mapTitle": "සිතියම", "mapLayer": "සිතියම් ස්තරය", @@ -248,78 +248,83 @@ "mapCustomArcgis": "Custom (ArcGIS)", "mapCustomLabel": "Custom map", "mapCarto": "Carto Basemaps", - "mapOsm": "විවෘත වීදියේ සිතියම", - "mapBingKey": "Bing Maps Key", - "mapBingRoad": " සිතියම් පාර", + "mapOsm": "ඕපන් ස්ට්‍රීට් මැප්ස්", + "mapBingKey": "බින්ග් මැප්ස් යතුර", + "mapBingRoad": "බින්ග් මැප්ස් පාර", "mapBingAerial": "Bing Maps Aerial", "mapBingHybrid": "Bing Maps Hybrid", "mapBaidu": "Baidu", "mapAutoNavi": "AutoNavi", - "mapYandexMap": "සිතියම", - "mapYandexSat": "චන්ද්‍රිකාව ", + "mapYandexMap": "යාන්ඩෙක්ස් සිතියම", + "mapYandexSat": "යාන්ඩෙක්ස් චන්ද්‍රිකාව", "mapWikimedia": "Wikimedia", "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "බහුඅශ්‍රය", "mapShapeCircle": "වෘත්තය", - "mapShapePolyline": "රේකාව ", - "mapLiveRoutes": "සජීවී මාර්ග", + "mapShapePolyline": "Polyline", + "mapLiveRoutes": "Live Routes", "mapCurrentLocation": "Current Location", "mapPoiLayer": "POI ස්තරය", "stateTitle": "තත්වය", - "stateName": "පරාමිතිය", + "stateName": "Attribute", "stateValue": "අගය", "commandTitle": "විධානය", "commandSend": "යවන්න", "commandSent": "Command sent", "commandQueued": "Command queued", "commandUnit": "ඒකකය", - "commandCustom": "UI: පරිගණකගත ගුණාංග අක්‍රිය කරන්න", + "commandCustom": "Custom command", "commandDeviceIdentification": "උපාංග හඳුනා ගැනීම", "commandPositionSingle": "තනි වාර්තාව", "commandPositionPeriodic": "ආවර්තිතව වාර්තා කරන්න", "commandPositionStop": "වාර්තා කිරීම නවත්වන්න", - "commandEngineStop": "එන්ජිම නවත්වන්න", - "commandEngineResume": "එන්ජිම නැවත ආරම්භ කරන්න", + "commandEngineStop": "Engine Stop", + "commandEngineResume": "Engine Resume", "commandAlarmArm": "Arm Alarm", "commandAlarmDisarm": "Disarm Alarm", "commandAlarmDismiss": "Dismiss Alarm", "commandSetTimezone": "කලාපය සකසන්න", "commandRequestPhoto": "ඡායාරූප ඉල්ලීම", "commandPowerOff": "Power Off Device", - "commandRebootDevice": "උපකරණය නැවත ආරම්භ කරන්න", + "commandRebootDevice": "උපාංගය යළි අරඹන්න", "commandFactoryReset": "Factory Reset", "commandSendSms": "කෙටි පණිවිඩ යවන්න", "commandSendUssd": "USSD යවන්න", "commandSosNumber": "SOS අංකය සකසන්න", - "commandSilenceTime": "නිහඬ කාලයකි", - "commandSetPhonebook": "දුරකථන නාමාවලිය සැකසීම ", + "commandSilenceTime": "Set Silence Time", + "commandSetPhonebook": "දුරකථනපොත සකසන්න", "commandVoiceMessage": "හඬ පණිවුඩය", - "commandOutputControl": "නිමැවුම් පාලනය", - "commandVoiceMonitoring": "හඬ අධීක්ෂණය", + "commandOutputControl": "Output Control", + "commandVoiceMonitoring": "Voice Monitoring", "commandSetAgps": "Set AGPS", "commandSetIndicator": "දර්ශකය සකසන්න", - "commandConfiguration": "සැකසුම් ", - "commandGetVersion": "අනුවාදය ලබා ගන්න", - "commandFirmwareUpdate": "ෆර්ම්වෙයාර් යාවත්කාලීන කරන්න", + "commandConfiguration": "වින්‍යාසය", + "commandGetVersion": "අනුවාදය ගන්න", + "commandFirmwareUpdate": "ස්ථිරාංගය යාවත්කාල කරන්න", "commandSetConnection": "සම්බන්ධතාවය සකසන්න", - "commandSetOdometer": "මීටරය සකසන්න ", - "commandGetModemStatus": "මෝඩම් තත්ත්වය ලබා ගන්න", - "commandGetDeviceStatus": "උපකරණයේ තත්ත්වය ලබා ගන්න", + "commandSetOdometer": "සැතපුම්මානය සකසන්න ", + "commandGetModemStatus": "Get Modem Status", + "commandGetDeviceStatus": "උපාංගයේ තත්ත්වය ගන්න", "commandSetSpeedLimit": "Set Speed Limit", - "commandModePowerSaving": "බල සුරැකීම වෙනස් කරන්න", - "commandModeDeepSleep": "ගැඹුරු නින්ද වෙනස් කරන්න", - "commandMovementAlarm": "චලනය නිවේදන", + "commandModePowerSaving": "Modify Power Saving", + "commandModeDeepSleep": "Modify Deep Sleep", + "commandMovementAlarm": "Movement Alarm", "commandFrequency": "සංඛ්යාතය", - "commandTimezone": "වේලා කලාපය", + "commandTimezone": "Timezone Offset", "commandMessage": "පණිවිඩය", "commandRadius": "අරය ", - "commandEnable": "සක්‍රිය ", + "commandEnable": "සබල කරන්න", "commandData": "දත්ත", "commandIndex": "දර්ශකය", "commandPhone": "දුරකථන අංකය", - "commandServer": "සේවාදායකය පරිගණකය ", + "commandServer": "සේවාදායකය", "commandPort": "Port", "eventAll": "සියලු සිදුවීම්", "eventDeviceOnline": "Status online", @@ -330,16 +335,16 @@ "eventDeviceStopped": "Device stopped", "eventDeviceOverspeed": "Speed limit exceeded", "eventDeviceFuelDrop": "Fuel drop", - "eventCommandResult": "විධානය ප්‍රතිපල ", + "eventCommandResult": "විධානයේ ප්‍රතිඵල", "eventGeofenceEnter": "Geofence entered", "eventGeofenceExit": "Geofence exited", "eventAlarm": "Alarm", "eventIgnitionOn": "Ignition on", "eventIgnitionOff": "Ignition off", - "eventMaintenance": "නඩත්තු කිරීම අවශයි ", - "eventTextMessage": "කෙටි පණිවිඩය ලැබී ඇත", + "eventMaintenance": "නඩත්තු කිරීම අවශ්‍යයි", + "eventTextMessage": "Text message received", "eventDriverChanged": "Driver changed", - "eventsScrollToLast": "අන්තිමට චලනය කරන්න", + "eventsScrollToLast": "Scroll To Last", "alarmGeneral": "General", "alarmSos": "SOS", "alarmVibration": "Vibration", @@ -373,14 +378,13 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", "alarmTampering": "Tampering", "alarmRemoving": "Removing", - "notificationType": "නිවේදන ආකාරය", - "notificationAlways": "සියලු උපකරණ", + "notificationType": "දැනුම්දීම් වර්ග", + "notificationAlways": "සියළු උපාංග", "notificationNotificators": "Channels", "notificatorWeb": "Web", "notificatorMail": "Mail", @@ -390,32 +394,32 @@ "reportReplay": "Replay", "reportRoute": "ගමන් මඟ", "reportEvents": "සිදුවීම්", - "reportTrips": "ගමන්", - "reportStops": "නැවතීම ", + "reportTrips": "චාරිකා", + "reportStops": "නැවතීම්", "reportSummary": "සාරාංශය", "reportDaily": "Daily Summary", - "reportChart": "සටහන", - "reportConfigure": "හැඩගසනවා", + "reportChart": "Chart", + "reportConfigure": "වින්‍යාසගත කරන්න", "reportEventTypes": "සිදුවීම් වර්ග", - "reportChartType": "සටහන් වර්ග ", - "reportShowMarkers": "ලකුණු පෙන්නවන්න ", - "reportExport": "අපනයන", + "reportChartType": "Chart Type", + "reportShowMarkers": "Show Markers", + "reportExport": "නිර්යාත", "reportEmail": "Email Report", - "reportPeriod": "කාලය", - "reportCustom": "වෙනස්කම් ", + "reportPeriod": "Period", + "reportCustom": "Custom", "reportToday": "අද", "reportYesterday": "ඊයේ", "reportThisWeek": "මෙම සතිය", "reportPreviousWeek": "පසුගිය සතියේ", - "reportThisMonth": "මේ මාසයේ", + "reportThisMonth": "මෙම මාසය", "reportPreviousMonth": "පසුගිය මාසය", - "reportDeviceName": "උපකරණ නම", + "reportDeviceName": "උපාංගයේ නම", "reportAverageSpeed": "සාමාන්‍ය වේගය", "reportMaximumSpeed": "උපරිම වේගය", "reportEngineHours": "Engine Hours", "reportDuration": "කාලසීමාව", "reportStartDate": "Start Date", - "reportStartTime": "ආරම්භක වේලාව ", + "reportStartTime": "ආරම්භක වේලාව", "reportStartAddress": "ආරම්භ ලිපිනය", "reportEndTime": "අවසානය", "reportEndAddress": "අවසාන ලිපිනය", @@ -423,35 +427,35 @@ "reportStartOdometer": "Odometer Start", "reportEndOdometer": "Odometer End", "statisticsTitle": "සංඛ්යාලේඛන", - "statisticsCaptureTime": "ග්‍රහණය කර ගන්නා අවස්ථාව ", + "statisticsCaptureTime": "Capture Time", "statisticsActiveUsers": "ක්‍රියාකාරී පරිශීලකයින්", - "statisticsActiveDevices": "ක්‍රියාකාරී උපකරණ ", + "statisticsActiveDevices": "ක්‍රියාකාරී උපාංග", "statisticsRequests": "ඉල්ලීම්", - "statisticsMessagesReceived": "ලැබුණු පණිවිඩය", + "statisticsMessagesReceived": "ලැබුණු පණිවිඩ", "statisticsMessagesStored": "ගබඩා කර ඇති පණිවිඩ", - "statisticsGeocoder": "භූකකර් ඉල්ලීම්", + "statisticsGeocoder": "Geocoder Requests", "statisticsGeolocation": "භූගෝලීය ඉල්ලීම්", "categoryArrow": "ඊ තලය ", - "categoryDefault": "පෙර පැවති ", - "categoryAnimal": "සත්ව", - "categoryBicycle": "බයිසිකලයක්", - "categoryBoat": "බෝට්ටුව ", - "categoryBus": "බස්", - "categoryCar": "මෝටර් රථ", - "categoryCrane": "ක්රේන්", - "categoryHelicopter": "හෙලිකොප්ටරය", - "categoryMotorcycle": "යතුරුපැදි", + "categoryDefault": "පෙරනිමි", + "categoryAnimal": "සතුන්", + "categoryBicycle": "පාපැදිය", + "categoryBoat": "Boat", + "categoryBus": "Bus", + "categoryCar": "Car", + "categoryCrane": "දොඹකරය", + "categoryHelicopter": "Helicopter", + "categoryMotorcycle": "යතුරුපැදිය", "categoryOffroad": "පාරෙන් පිට", "categoryPerson": "පුද්ගලයා", - "categoryPickup": "එකතු කර ගන්නවා ", + "categoryPickup": "Pickup", "categoryPlane": "ගුවන්යානය", "categoryShip": "නැව", - "categoryTractor": "ට්‍රැක්ටර් ", + "categoryTractor": "Tractor", "categoryTrain": "Train", "categoryTram": "Tram", "categoryTrolleybus": "Trolleybus", - "categoryTruck": "ට්‍රක් රථය", - "categoryVan": "වැන් රථය ", + "categoryTruck": "Truck", + "categoryVan": "Van", "categoryScooter": "Scooter", "maintenanceStart": "ආරම්භය", "maintenancePeriod": "කාලය" diff --git a/web/l10n/sk.json b/web/l10n/sk.json index 44c5978e..fae4d7e4 100644 --- a/web/l10n/sk.json +++ b/web/l10n/sk.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygón", "mapShapeCircle": "Kruh", "mapShapePolyline": "Lomená čiara", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Teplota", "alarmParking": "Parkovanie", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/sl.json b/web/l10n/sl.json index d40081a0..60893226 100644 --- a/web/l10n/sl.json +++ b/web/l10n/sl.json @@ -81,7 +81,7 @@ "sharedMaintenance": "Vzdrževanje", "sharedDeviceAccumulators": "Accumulators", "sharedAlarms": "Alarmi", - "sharedLocation": "Location", + "sharedLocation": "Lokacija", "sharedImport": "Import", "attributeSpeedLimit": "Omejitev hitrosti", "attributePolylineDistance": "Polyline Distance", @@ -132,7 +132,7 @@ "userToken": "Žeton", "loginTitle": "Prijava", "loginLanguage": "Jezik", - "loginReset": "Reset Password", + "loginReset": "Ponastavi geslo", "loginRegister": "Registracija", "loginLogin": "Prijava", "loginFailed": "Nepravilna e-pošta ali geslo", @@ -261,11 +261,16 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Poligon", "mapShapeCircle": "Krog", "mapShapePolyline": "Polyline", - "mapLiveRoutes": "Live Routes", - "mapCurrentLocation": "Current Location", + "mapLiveRoutes": "Žive poti", + "mapCurrentLocation": "Trenutna lokacija", "mapPoiLayer": "POI Layer", "stateTitle": "Stanje", "stateName": "Parameter", @@ -373,7 +378,6 @@ "alarmJamming": "Motnja", "alarmTemperature": "Temperatura", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", @@ -393,14 +397,14 @@ "reportTrips": "Poti", "reportStops": "Postanki", "reportSummary": "Povzetek", - "reportDaily": "Daily Summary", + "reportDaily": "Dnevni povzetek", "reportChart": "Graf", "reportConfigure": "Nastavi", "reportEventTypes": "Tipi dogodkov", "reportChartType": "Tip grafa", "reportShowMarkers": "Prikaži oznake", "reportExport": "Izvozi", - "reportEmail": "Email Report", + "reportEmail": "Pošlji po E-Pošti", "reportPeriod": "Obdobje", "reportCustom": "Poljubno", "reportToday": "Danes", @@ -414,14 +418,14 @@ "reportMaximumSpeed": "Najvišja hitrost", "reportEngineHours": "Motorinh ur", "reportDuration": "Trajanje", - "reportStartDate": "Start Date", + "reportStartDate": "Datum začetka", "reportStartTime": "Začetni čas", "reportStartAddress": "Začetni naslov", "reportEndTime": "Končni čas", "reportEndAddress": "Končni naslov", "reportSpentFuel": "Porabljeno gorivo", - "reportStartOdometer": "Odometer Start", - "reportEndOdometer": "Odometer End", + "reportStartOdometer": "Začetno stanje števca", + "reportEndOdometer": "Končno stanje števca", "statisticsTitle": "Statistika", "statisticsCaptureTime": "Začetni čas", "statisticsActiveUsers": "Aktivni uporabniki", diff --git a/web/l10n/sq.json b/web/l10n/sq.json index cd3ae2d5..944bcbb5 100644 --- a/web/l10n/sq.json +++ b/web/l10n/sq.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygon", "mapShapeCircle": "Circle", "mapShapePolyline": "Polyline", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/sr.json b/web/l10n/sr.json index 603f5198..e2e7322c 100644 --- a/web/l10n/sr.json +++ b/web/l10n/sr.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Ulice", + "mapLocationIqEarth": "LocationIQ Zemlja", + "mapLocationIqHybrid": "LocationIQ Hibrid", "mapShapePolygon": "Višeugao", "mapShapeCircle": "Krug", "mapShapePolyline": "Višelinijski", @@ -373,7 +378,6 @@ "alarmJamming": "Ometanje signala", "alarmTemperature": "Temperatura", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Hauba", "alarmFootBrake": "Nožna kočnica", "alarmFuelLeak": "Curenje goriva", diff --git a/web/l10n/sv.json b/web/l10n/sv.json index 7194040d..11d09b33 100644 --- a/web/l10n/sv.json +++ b/web/l10n/sv.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Polygon", "mapShapeCircle": "Cirkel", "mapShapePolyline": "Polyline", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/ta.json b/web/l10n/ta.json index 06a2f853..46668b43 100644 --- a/web/l10n/ta.json +++ b/web/l10n/ta.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "பலகோணம்", "mapShapeCircle": "வட்டம்", "mapShapePolyline": "பாலிலைன்", @@ -373,7 +378,6 @@ "alarmJamming": "நெருக்குதல்", "alarmTemperature": "வெப்ப நிலை", "alarmParking": "பார்க்கிங்", - "alarmShock": "அதிர்ச்சி", "alarmBonnet": "கார் குட்நெட்", "alarmFootBrake": "கால் பிரேக்", "alarmFuelLeak": "எரிபொருள் கசிவு", diff --git a/web/l10n/th.json b/web/l10n/th.json index 1b8c7e46..860407e2 100644 --- a/web/l10n/th.json +++ b/web/l10n/th.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "รูปหลายมุม", "mapShapeCircle": "วงกลม", "mapShapePolyline": "โพลีไลน์", @@ -373,7 +378,6 @@ "alarmJamming": "สัญญาณรบกวน", "alarmTemperature": "อุณหภูมิ", "alarmParking": "จอด", - "alarmShock": "สะเทือน", "alarmBonnet": "ฝาสูบ", "alarmFootBrake": "เบรคเท้า", "alarmFuelLeak": "เชื้อเพลิงรั่ว", diff --git a/web/l10n/tr.json b/web/l10n/tr.json index b138eba8..e9031c78 100644 --- a/web/l10n/tr.json +++ b/web/l10n/tr.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Çokgen", "mapShapeCircle": "Çember", "mapShapePolyline": "Çizim", @@ -373,7 +378,6 @@ "alarmJamming": "Sıkışıklık", "alarmTemperature": "Hararet", "alarmParking": "Park halinde", - "alarmShock": "Şok", "alarmBonnet": "Kaput", "alarmFootBrake": "Ayak freni", "alarmFuelLeak": "Yakıt sızıntısı", diff --git a/web/l10n/uk.json b/web/l10n/uk.json index 09e207a6..8031b12e 100644 --- a/web/l10n/uk.json +++ b/web/l10n/uk.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Багатокутник", "mapShapeCircle": "Коло", "mapShapePolyline": "Лінія", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/uz.json b/web/l10n/uz.json index 20d632dd..a54e5be6 100644 --- a/web/l10n/uz.json +++ b/web/l10n/uz.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Кўпбурчак", "mapShapeCircle": "Айлана", "mapShapePolyline": "Чизиқ", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/vi.json b/web/l10n/vi.json index 24d2cfbb..349714c5 100644 --- a/web/l10n/vi.json +++ b/web/l10n/vi.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "Đa giác", "mapShapeCircle": "Vòng tròn", "mapShapePolyline": "Đường kẻ đa giác", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", diff --git a/web/l10n/zh.json b/web/l10n/zh.json index 97765216..8341faff 100644 --- a/web/l10n/zh.json +++ b/web/l10n/zh.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox街道", "mapMapboxOutdoors": "Mapbox外景", "mapMapboxSatellite": "Mapbox卫星", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "多边形", "mapShapeCircle": "圆形", "mapShapePolyline": "折线", @@ -373,7 +378,6 @@ "alarmJamming": "干扰", "alarmTemperature": "温度", "alarmParking": "停车中", - "alarmShock": "震动", "alarmBonnet": "阀盖", "alarmFootBrake": "脚踏制动器", "alarmFuelLeak": "燃料泄漏", diff --git a/web/l10n/zh_TW.json b/web/l10n/zh_TW.json index 67012bec..95ac25e1 100644 --- a/web/l10n/zh_TW.json +++ b/web/l10n/zh_TW.json @@ -261,6 +261,11 @@ "mapMapboxStreets": "Mapbox Streets", "mapMapboxOutdoors": "Mapbox Outdoors", "mapMapboxSatellite": "Mapbox Satellite", + "mapMapTilerBasic": "MapTiler Basic", + "mapMapTilerHybrid": "MapTiler Hybrid", + "mapLocationIqStreets": "LocationIQ Streets", + "mapLocationIqEarth": "LocationIQ Earth", + "mapLocationIqHybrid": "LocationIQ Hybrid", "mapShapePolygon": "多邊形", "mapShapeCircle": "圓形", "mapShapePolyline": "多邊形", @@ -373,7 +378,6 @@ "alarmJamming": "Jamming", "alarmTemperature": "Temperature", "alarmParking": "Parking", - "alarmShock": "Shock", "alarmBonnet": "Bonnet", "alarmFootBrake": "Foot Brake", "alarmFuelLeak": "Fuel Leak", -- cgit v1.2.3 From cbbec6f35a12bb1fb0bd149d2eef42f0be2cc598 Mon Sep 17 00:00:00 2001 From: Ashutosh Bishnoi Date: Tue, 15 Feb 2022 11:34:43 +0530 Subject: Rebase replay_screen pr Close socket on logout (fix #896) Fix lint Add calendar menu Add calendar file upload Disable icon tinting in Firefox Move ignition icon Specify icon sizes Fix lint issues Add accuracy button Merge shock and vibration alarms Add events alarm column Enable LocationIQ by default Update LocationIQ keys Fix selector style Support server change Update localization script Update localization Command to install dependency Update JavaScript libraries Fix modern app issues Fix image URL Fix user list (fix #898) Fix formatting issue Add option to disable reports Fix add button position Select device based on uniqueId Update devices list search Fix lint problems Changed devices list search Changed device list search Update translation for Search Devices Changed translation for Update Devices Changed translation for Update Devices Fix MainToolbar settings icon Resolves traccar/traccar-web#892 Fix multiple events issue Changed notification approach Changed notification approach Changed notification approach --- modern/src/MainToolbar.js | 4 +-- modern/src/SocketController.js | 57 ++++++++++++++++++++++++++---------------- web/l10n/en.json | 1 + 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/modern/src/MainToolbar.js b/modern/src/MainToolbar.js index 1e4dabe4..b98f2224 100644 --- a/modern/src/MainToolbar.js +++ b/modern/src/MainToolbar.js @@ -14,7 +14,7 @@ import ListItem from '@material-ui/core/ListItem'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; import MapIcon from '@material-ui/icons/Map'; -import PersonIcon from '@material-ui/icons/Person'; +import ShuffleIcon from '@material-ui/icons/Shuffle'; import DescriptionIcon from '@material-ui/icons/Description'; import ReplayIcon from '@material-ui/icons/Replay'; import { sessionActions } from './store'; @@ -108,7 +108,7 @@ const MainToolbar = () => { onClick={() => history.push('/settings/notifications')} > - + diff --git a/modern/src/SocketController.js b/modern/src/SocketController.js index ac950190..e178abb6 100644 --- a/modern/src/SocketController.js +++ b/modern/src/SocketController.js @@ -1,35 +1,26 @@ -import { useRef } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { useDispatch, useSelector, connect } from 'react-redux'; - +import { Snackbar } from '@material-ui/core'; import { useHistory } from 'react-router-dom'; + import { positionsActions, devicesActions, sessionActions } from './store'; import { useEffectAsync } from './reactHelper'; - -const displayNotifications = (events) => { - if ('Notification' in window) { - if (Notification.permission === 'granted') { - events.forEach((event) => { - const notification = new Notification(`Event: ${event.type}`); - setTimeout(notification.close.bind(notification), 4 * 1000); - }); - } else if (Notification.permission !== 'denied') { - Notification.requestPermission((permission) => { - if (permission === 'granted') { - displayNotifications(events); - } - }); - } - } -}; +import { useTranslation } from './LocalizationProvider'; +import { prefixString } from './common/stringUtils'; const SocketController = () => { const dispatch = useDispatch(); const history = useHistory(); + const t = useTranslation(); const authenticated = useSelector((state) => !!state.session.user); + const devices = useSelector((state) => state.devices.items); const socketRef = useRef(); + const [events, setEvents] = useState([]); + const [notifications, setNotifications] = useState([]); + const connectSocket = () => { const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; const socket = new WebSocket(`${protocol}//${window.location.host}/api/socket`); @@ -48,7 +39,7 @@ const SocketController = () => { dispatch(positionsActions.update(data.positions)); } if (data.events) { - displayNotifications(data.events); + setEvents(data.events); } }; }; @@ -83,7 +74,31 @@ const SocketController = () => { return null; }, [authenticated]); - return null; + useEffect(() => { + setNotifications(events.map((event) => ({ + id: event.id, + message: `${devices[event.deviceId]?.name}: ${t(prefixString('event', event.type))}`, + show: true, + }))); + }, [events, devices]); + + return ( + <> + {notifications.map((notification) => ( + setEvents(events.filter((e) => e.id !== notification.id))} + /> + ))} + + ); }; export default connect()(SocketController); diff --git a/web/l10n/en.json b/web/l10n/en.json index 6f1cbc4c..301751cd 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -60,6 +60,7 @@ "sharedCalendar": "Calendar", "sharedCalendars": "Calendars", "sharedFile": "File", + "sharedSearchDevices": "Search Devices", "sharedSelectFile": "Select File", "sharedPhone": "Phone", "sharedRequired": "Required", -- cgit v1.2.3 From cce4095ecacc265882317b71f505cdd36c3e4a7c Mon Sep 17 00:00:00 2001 From: Ashutosh Bishnoi Date: Tue, 15 Feb 2022 12:05:44 +0530 Subject: Final routeplayback screen --- modern/src/reports/ReplayPage.js | 217 ++++++++++++++++++++++++++++++--------- 1 file changed, 169 insertions(+), 48 deletions(-) diff --git a/modern/src/reports/ReplayPage.js b/modern/src/reports/ReplayPage.js index bb32daa5..d3839c5c 100644 --- a/modern/src/reports/ReplayPage.js +++ b/modern/src/reports/ReplayPage.js @@ -1,9 +1,15 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import { - Accordion, AccordionDetails, AccordionSummary, Container, makeStyles, Paper, Slider, Tooltip, Typography, + Grid, FormControlLabel, Switch, IconButton, TextField, makeStyles, Paper, Slider, Toolbar, Tooltip, Typography, } from '@material-ui/core'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import MainToolbar from '../MainToolbar'; +import ArrowBackIcon from '@material-ui/icons/ArrowBack'; +import SettingsIcon from '@material-ui/icons/Settings'; +import PlayArrowIcon from '@material-ui/icons/PlayArrow'; +import PauseIcon from '@material-ui/icons/Pause'; +import FastForwardIcon from '@material-ui/icons/FastForward'; +import FastRewindIcon from '@material-ui/icons/FastRewind'; +import { useHistory } from 'react-router-dom'; +import { useSelector } from 'react-redux'; import Map from '../map/Map'; import ReplayPathMap from '../map/ReplayPathMap'; import PositionsMap from '../map/PositionsMap'; @@ -13,23 +19,38 @@ import { useTranslation } from '../LocalizationProvider'; const useStyles = makeStyles((theme) => ({ root: { - height: '100%', - display: 'flex', - flexDirection: 'column', + height: '100vh', + }, + title: { + ...theme.typography.title, }, - controlPanel: { + sidebar: { position: 'absolute', - bottom: theme.spacing(5), - left: '50%', - transform: 'translateX(-50%)', + left: 0, + top: 0, + margin: theme.spacing(1.5), + width: theme.dimensions.drawerWidthDesktop, + [theme.breakpoints.down('md')]: { + width: '100%', + margin: 0, + }, + }, + formControlLabel: { + height: '100%', + width: '100%', + paddingRight: theme.spacing(1), + justifyContent: 'space-between', + alignItems: 'center', }, - controlContent: { + reportFilterContainer: { + flex: 1, padding: theme.spacing(2), - marginBottom: theme.spacing(2), + [theme.breakpoints.down('md')]: { + margin: theme.spacing(1), + }, }, - configForm: { - display: 'flex', - flexDirection: 'column', + sliderContainer: { + padding: theme.spacing(2), }, })); @@ -40,14 +61,42 @@ const TimeLabel = ({ children, open, value }) => ( ); const ReplayPage = () => { - const classes = useStyles(); const t = useTranslation(); + const classes = useStyles(); + const history = useHistory(); + const timerRef = useRef(); - const [expanded, setExpanded] = useState(true); const [positions, setPositions] = useState([]); const [index, setIndex] = useState(0); + const [selectedDeviceId, setSelectedDeviceId] = useState(); + const [playbackSpeed, setPlaybackSpeed] = useState(''); + const [expanded, setExpanded] = useState(true); + const [isPlaying, setIsPlaying] = useState(false); + + const deviceName = useSelector((state) => { + if (selectedDeviceId) { + const device = state.devices.items[selectedDeviceId]; + if (device) { + return device.name; + } + } + return null; + }); + + useEffect(() => { + if (isPlaying && positions.length > 0) { + timerRef.current = setInterval(() => { + setIndex((index) => index + 1); + }, 500); + } else { + clearInterval(timerRef.current); + } + + return () => clearInterval(timerRef.current); + }, [isPlaying, positions]); const handleSubmit = async (deviceId, from, to, _, headers) => { + setSelectedDeviceId(deviceId); const query = new URLSearchParams({ deviceId, from, to }); const response = await fetch(`/api/positions?${query.toString()}`, { headers }); if (response.ok) { @@ -59,41 +108,113 @@ const ReplayPage = () => { return (
- {index < positions.length && } - - {!!positions.length - && ( - - ({ value: index }))} - value={index} - onChange={(_, index) => setIndex(index)} - valueLabelDisplay="auto" - valueLabelFormat={(i) => (i < positions.length ? formatPosition(positions[i], 'fixTime', t) : '')} - ValueLabelComponent={TimeLabel} - /> - - )} -
- setExpanded(!expanded)}> - }> - - {t('reportConfigure')} - - - - - - -
-
+
+ + + + + + + history.push('/')}> + + + + + + {t('reportReplay')} + + + {!expanded && ( + + setExpanded(true)}> + + + + )} + + + + + + {!expanded ? ( + + + + {deviceName} + + + ({ value: index }))} + value={index} + onChange={(_, index) => setIndex(index)} + valueLabelDisplay="auto" + valueLabelFormat={(i) => (i < positions.length ? formatPosition(positions[i], 'fixTime') : '')} + ValueLabelComponent={TimeLabel} + /> + + + {`${index}/${positions.length}`} + + setIndex((index) => index - 1)} disabled={isPlaying}> + + + + + setIsPlaying(!isPlaying)}> + {isPlaying ? : } + + + + setIndex((index) => index + 1)} disabled={isPlaying}> + + + + {formatPosition(positions[index], 'fixTime')} + + + + ) : ( + + + + setPlaybackSpeed(e.target.value)} + variant="filled" + /> + + + setIsPlaying(e.target.checked)} + name="autoPlay" + color="primary" + edge="start" + /> + )} + label={t('reportAutoPlay')} + labelPlacement="start" + /> + + + + )} + + +
); }; -- cgit v1.2.3 From 6fb781e1b48e8c329cae56248fae0cef4f6167d8 Mon Sep 17 00:00:00 2001 From: Ashutosh Bishnoi Date: Wed, 16 Feb 2022 11:12:50 +0530 Subject: minor issues fixes in --- modern/src/reports/ReplayPage.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modern/src/reports/ReplayPage.js b/modern/src/reports/ReplayPage.js index d3839c5c..d79e19ce 100644 --- a/modern/src/reports/ReplayPage.js +++ b/modern/src/reports/ReplayPage.js @@ -86,6 +86,7 @@ const ReplayPage = () => { useEffect(() => { if (isPlaying && positions.length > 0) { timerRef.current = setInterval(() => { + console.log('in setInterval func'); setIndex((index) => index + 1); }, 500); } else { @@ -95,6 +96,12 @@ const ReplayPage = () => { return () => clearInterval(timerRef.current); }, [isPlaying, positions]); + useEffect(() => { + if (index >= positions.length) { + clearInterval(timerRef.current); + } + }, [index]); + const handleSubmit = async (deviceId, from, to, _, headers) => { setSelectedDeviceId(deviceId); const query = new URLSearchParams({ deviceId, from, to }); @@ -187,7 +194,6 @@ const ReplayPage = () => { setPlaybackSpeed(e.target.value)} variant="filled" @@ -200,7 +206,6 @@ const ReplayPage = () => { setIsPlaying(e.target.checked)} - name="autoPlay" color="primary" edge="start" /> -- cgit v1.2.3